1/* 2 * OSPF routing table. 3 * Copyright (C) 1999, 2000 Toshiaki Takada 4 * 5 * This file is part of GNU Zebra. 6 * 7 * GNU Zebra is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the 9 * Free Software Foundation; either version 2, or (at your option) any 10 * later version. 11 * 12 * GNU Zebra is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with GNU Zebra; see the file COPYING. If not, write to the Free 19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 20 * 02111-1307, USA. 21 */ 22 23#ifndef _ZEBRA_OSPF_ROUTE_H 24#define _ZEBRA_OSPF_ROUTE_H 25 26#define OSPF_DESTINATION_ROUTER 1 27#define OSPF_DESTINATION_NETWORK 2 28#define OSPF_DESTINATION_DISCARD 3 29 30#define OSPF_PATH_MIN 0 31#define OSPF_PATH_INTRA_AREA 1 32#define OSPF_PATH_INTER_AREA 2 33#define OSPF_PATH_TYPE1_EXTERNAL 3 34#define OSPF_PATH_TYPE2_EXTERNAL 4 35#define OSPF_PATH_MAX 5 36 37/* OSPF Path. */ 38struct ospf_path 39{ 40 struct in_addr nexthop; 41 struct in_addr adv_router; 42 struct ospf_interface *oi; 43}; 44 45/* Below is the structure linked to every 46 route node. Note that for Network routing 47 entries a single ospf_route is kept, while 48 for ABRs and ASBRs (Router routing entries), 49 we link an instance of ospf_router_route 50 where a list of paths is maintained, so 51 52 nr->info is a (struct ospf_route *) for OSPF_DESTINATION_NETWORK 53 but 54 nr->info is a (struct ospf_router_route *) for OSPF_DESTINATION_ROUTER 55*/ 56 57struct route_standard 58{ 59 /* Link Sate Origin. */ 60 struct lsa_header *origin; 61 62 /* Associated Area. */ 63 struct in_addr area_id; /* The area the route belongs to */ 64 65#ifdef HAVE_NSSA 66 /* Area Type */ 67 int external_routing; 68#endif /* HAVE_NSSA */ 69 70 /* Optional Capability. */ 71 u_char options; /* Get from LSA header. */ 72 73 /* */ 74 u_char flags; /* From router-LSA */ 75}; 76 77struct route_external 78{ 79 /* Link State Origin. */ 80 struct ospf_lsa *origin; 81 82 /* Link State Cost Type2. */ 83 u_int32_t type2_cost; 84 85 /* Tag value. */ 86 u_int32_t tag; 87 88 /* ASBR route. */ 89 struct ospf_route *asbr; 90}; 91 92struct ospf_route 93{ 94 /* Create time. */ 95 time_t ctime; 96 97 /* Modified time. */ 98 time_t mtime; 99 100 /* Destination Type. */ 101 u_char type; 102 103 /* Destination ID. */ /* i.e. Link State ID. */ 104 struct in_addr id; 105 106 /* Address Mask. */ 107 struct in_addr mask; /* Only valid for networks. */ 108 109 /* Path Type. */ 110 u_char path_type; 111 112 /* List of Paths. */ 113 list path; 114 115 /* Link State Cost. */ 116 u_int32_t cost; /* i.e. metric. */ 117 118 /* Route specific info. */ 119 union 120 { 121 struct route_standard std; 122 struct route_external ext; 123 } u; 124}; 125 126struct ospf_path *ospf_path_new (); 127void ospf_path_free (struct ospf_path *op); 128struct ospf_path *ospf_path_lookup (list, struct ospf_path *); 129struct ospf_route *ospf_route_new (); 130void ospf_route_free (struct ospf_route *or); 131void ospf_route_delete (struct route_table *rt); 132void ospf_route_table_free (struct route_table *rt); 133 134void ospf_route_install (struct route_table *); 135void ospf_route_table_dump (struct route_table *); 136 137void ospf_intra_add_router (struct route_table *, struct vertex *, 138 struct ospf_area *); 139 140void ospf_intra_add_transit (struct route_table *, struct vertex *, 141 struct ospf_area *); 142 143void ospf_intra_add_stub (struct route_table *, struct router_lsa_link *, 144 struct vertex *, struct ospf_area *); 145 146int ospf_route_cmp (struct ospf_route *, struct ospf_route *); 147void ospf_route_copy_nexthops (struct ospf_route *, list); 148void ospf_route_copy_nexthops_from_vertex (struct ospf_route *, 149 struct vertex * ); 150 151void ospf_route_subst (struct route_node *, struct ospf_route *, 152 struct ospf_route *); 153void ospf_route_add (struct route_table *, struct prefix_ipv4 *, 154 struct ospf_route *, struct ospf_route *); 155 156void ospf_route_subst_nexthops (struct ospf_route *, list); 157void ospf_prune_unreachable_networks (struct route_table *); 158void ospf_prune_unreachable_routers (struct route_table *); 159int ospf_add_discard_route (struct route_table *, struct ospf_area *, 160 struct prefix_ipv4 *); 161void ospf_delete_discard_route (struct prefix_ipv4 *); 162int ospf_route_match_same (struct route_table *, struct prefix_ipv4 *, 163 struct ospf_route *); 164 165#endif /* _ZEBRA_OSPF_ROUTE_H */ 166