diff options
author | Joakim Tjernlund <joakim.tjernlund@transmode.se> | 2009-11-29 11:08:38 +0000 |
---|---|---|
committer | David Lamparter <equinox@diac24.net> | 2010-02-04 02:10:13 +0100 |
commit | f65b8886cc94cce3afef3e199b538a4263947f09 (patch) | |
tree | 92ca5ac936c24f460150a6fcb5316ff06e0b3abe | |
parent | 84cc670c3764d1032730ffa5abe444264f39de33 (diff) | |
download | quagga-f65b8886cc94cce3afef3e199b538a4263947f09.tar.bz2 quagga-f65b8886cc94cce3afef3e199b538a4263947f09.tar.xz |
ospfd: replace route_nodes with a list
It is wasteful to use route nodes for something
as simple as a neighbor list.
Replace with a list.
-rw-r--r-- | ospfd/ospf_flood.c | 36 | ||||
-rw-r--r-- | ospfd/ospf_interface.c | 12 | ||||
-rw-r--r-- | ospfd/ospf_interface.h | 2 | ||||
-rw-r--r-- | ospfd/ospf_ism.c | 42 | ||||
-rw-r--r-- | ospfd/ospf_lsa.c | 62 | ||||
-rw-r--r-- | ospfd/ospf_neighbor.c | 216 | ||||
-rw-r--r-- | ospfd/ospf_neighbor.h | 5 | ||||
-rw-r--r-- | ospfd/ospf_packet.c | 78 | ||||
-rw-r--r-- | ospfd/ospf_vty.c | 103 | ||||
-rw-r--r-- | ospfd/ospfd.c | 19 |
10 files changed, 227 insertions, 348 deletions
diff --git a/ospfd/ospf_flood.c b/ospfd/ospf_flood.c index 41661da2..5ebf4f2f 100644 --- a/ospfd/ospf_flood.c +++ b/ospfd/ospf_flood.c @@ -346,7 +346,7 @@ ospf_flood_through_interface (struct ospf_interface *oi, struct ospf_lsa *lsa) { struct ospf_neighbor *onbr; - struct route_node *rn; + struct listnode *node; int retx_flag; if (IS_DEBUG_OSPF_EVENT) @@ -364,14 +364,10 @@ ospf_flood_through_interface (struct ospf_interface *oi, /* Each of the neighbors attached to this interface are examined, to determine whether they must receive the new LSA. The following steps are executed for each neighbor: */ - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, onbr)) { struct ospf_lsa *ls_req; - - if (rn->info == NULL) - continue; - onbr = rn->info; if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_flood_through_interface(): considering nbr %s (%s)", inet_ntoa (onbr->router_id), @@ -543,13 +539,12 @@ ospf_flood_through_interface (struct ospf_interface *oi, addresses. */ if (oi->type == OSPF_IFTYPE_NBMA) { - struct route_node *rn; + struct listnode *node; struct ospf_neighbor *nbr; - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info) != NULL) - if (nbr != oi->nbr_self && nbr->state >= NSM_Exchange) - ospf_ls_upd_send_lsa (nbr, lsa, OSPF_SEND_PACKET_DIRECT); + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) + if (nbr != oi->nbr_self && nbr->state >= NSM_Exchange) + ospf_ls_upd_send_lsa (nbr, lsa, OSPF_SEND_PACKET_DIRECT); } else ospf_ls_upd_send_lsa (oi->nbr_self, lsa, OSPF_SEND_PACKET_INDIRECT); @@ -934,21 +929,20 @@ static void ospf_ls_retransmit_delete_nbr_if (struct ospf_interface *oi, struct ospf_lsa *lsa) { - struct route_node *rn; + struct listnode *node; struct ospf_neighbor *nbr; struct ospf_lsa *lsr; if (ospf_if_is_enable (oi)) - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) /* If LSA find in LS-retransmit list, then remove it. */ - if ((nbr = rn->info) != NULL) - { - lsr = ospf_ls_retransmit_lookup (nbr, lsa); - - /* If LSA find in ls-retransmit list, remove it. */ - if (lsr != NULL && lsr->data->ls_seqnum == lsa->data->ls_seqnum) - ospf_ls_retransmit_delete (nbr, lsr); - } + { + lsr = ospf_ls_retransmit_lookup (nbr, lsa); + + /* If LSA find in ls-retransmit list, remove it. */ + if (lsr != NULL && lsr->data->ls_seqnum == lsa->data->ls_seqnum) + ospf_ls_retransmit_delete (nbr, lsr); + } } void diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index afe3acf1..5c64ba29 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -223,7 +223,7 @@ ospf_if_new (struct ospf *ospf, struct interface *ifp, struct prefix *p) oi->network_lsa_self = NULL; /* Initialize neighbor list. */ - oi->nbrs = route_table_init (); + oi->nbrs = list_new (); /* Initialize static neighbor list. */ oi->nbr_nbma = list_new (); @@ -258,7 +258,6 @@ ospf_if_new (struct ospf *ospf, struct interface *ifp, struct prefix *p) void ospf_if_cleanup (struct ospf_interface *oi) { - struct route_node *rn; struct listnode *node, *nnode; struct ospf_neighbor *nbr; struct ospf_nbr_nbma *nbr_nbma; @@ -282,10 +281,9 @@ ospf_if_cleanup (struct ospf_interface *oi) } /* send Neighbor event KillNbr to all associated neighbors. */ - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info) != NULL) - if (nbr != oi->nbr_self) - OSPF_NSM_EVENT_EXECUTE (nbr, NSM_KillNbr); + for (ALL_LIST_ELEMENTS (oi->nbrs, node, nnode, nbr)) + if (nbr != oi->nbr_self) + OSPF_NSM_EVENT_EXECUTE (nbr, NSM_KillNbr); /* Cleanup Link State Acknowlegdment list. */ for (ALL_LIST_ELEMENTS (oi->ls_ack, node, nnode, lsa)) @@ -321,7 +319,7 @@ ospf_if_free (struct ospf_interface *oi) /* Free Pseudo Neighbour */ ospf_nbr_delete (oi->nbr_self); - route_table_finish (oi->nbrs); + list_free (oi->nbrs); route_table_finish (oi->ls_upd_queue); /* Free any lists that should be freed */ diff --git a/ospfd/ospf_interface.h b/ospfd/ospf_interface.h index ab0b7580..18b98cd0 100644 --- a/ospfd/ospf_interface.h +++ b/ospfd/ospf_interface.h @@ -171,7 +171,7 @@ struct ospf_interface u_int32_t output_cost; /* Acutual Interface Output Cost */ /* Neighbor information. */ - struct route_table *nbrs; /* OSPF Neighbor List */ + struct list *nbrs; /* OSPF Neighbor List */ struct ospf_neighbor *nbr_self; /* Neighbor Self */ #define DR(I) ((I)->nbr_self->d_router) #define BDR(I) ((I)->nbr_self->bd_router) diff --git a/ospfd/ospf_ism.c b/ospfd/ospf_ism.c index 18402836..e7bdbf2c 100644 --- a/ospfd/ospf_ism.c +++ b/ospfd/ospf_ism.c @@ -163,38 +163,36 @@ ospf_ism_state (struct ospf_interface *oi) } static void -ospf_dr_eligible_routers (struct route_table *nbrs, struct list *el_list) +ospf_dr_eligible_routers (struct list *nbrs, struct list *el_list) { - struct route_node *rn; + struct listnode *node; struct ospf_neighbor *nbr; - for (rn = route_top (nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info) != NULL) - /* Ignore 0.0.0.0 node*/ - if (nbr->router_id.s_addr != 0) - /* Is neighbor eligible? */ - if (nbr->priority > 0) - /* Is neighbor upper 2-Way? */ - if (nbr->state >= NSM_TwoWay) - listnode_add (el_list, nbr); + for (ALL_LIST_ELEMENTS_RO (nbrs, node, nbr)) + /* Ignore 0.0.0.0 node*/ + if (nbr->router_id.s_addr != 0) + /* Is neighbor eligible? */ + if (nbr->priority > 0) + /* Is neighbor upper 2-Way? */ + if (nbr->state >= NSM_TwoWay) + listnode_add (el_list, nbr); } /* Generate AdjOK? NSM event. */ static void -ospf_dr_change (struct ospf *ospf, struct route_table *nbrs) +ospf_dr_change (struct ospf *ospf, struct list *nbrs) { - struct route_node *rn; + struct listnode *node; struct ospf_neighbor *nbr; - for (rn = route_top (nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info) != NULL) - /* Ignore 0.0.0.0 node*/ - if (nbr->router_id.s_addr != 0) - /* Is neighbor upper 2-Way? */ - if (nbr->state >= NSM_TwoWay) - /* Ignore myself. */ - if (!IPV4_ADDR_SAME (&nbr->router_id, &ospf->router_id)) - OSPF_NSM_EVENT_SCHEDULE (nbr, NSM_AdjOK); + for (ALL_LIST_ELEMENTS_RO (nbrs, node, nbr)) + /* Ignore 0.0.0.0 node*/ + if (nbr->router_id.s_addr != 0) + /* Is neighbor upper 2-Way? */ + if (nbr->state >= NSM_TwoWay) + /* Ignore myself. */ + if (!IPV4_ADDR_SAME (&nbr->router_id, &ospf->router_id)) + OSPF_NSM_EVENT_SCHEDULE (nbr, NSM_AdjOK); } static int diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c index e708d5e2..70504692 100644 --- a/ospfd/ospf_lsa.c +++ b/ospfd/ospf_lsa.c @@ -436,17 +436,13 @@ struct ospf_neighbor * ospf_nbr_lookup_ptop (struct ospf_interface *oi) { struct ospf_neighbor *nbr = NULL; - struct route_node *rn; + struct listnode *node; /* Search neighbor, there must be one of two nbrs. */ - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info)) - if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id)) - if (nbr->state == NSM_Full) - { - route_unlock_node (rn); - break; - } + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) + if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id)) + if (nbr->state == NSM_Full) + break; /* PtoP link must have only 1 neighbor. */ if (ospf_nbr_count (oi, 0) > 1) @@ -623,7 +619,7 @@ static int lsa_link_ptomp_set (struct stream *s, struct ospf_interface *oi) { int links = 0; - struct route_node *rn; + struct listnode *node; struct ospf_neighbor *nbr = NULL; struct in_addr id, mask; u_int16_t cost = ospf_link_cost (oi); @@ -636,20 +632,18 @@ lsa_link_ptomp_set (struct stream *s, struct ospf_interface *oi) zlog_debug ("PointToMultipoint: running ptomultip_set"); /* Search neighbor, */ - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info) != NULL) - /* Ignore myself. */ - if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id)) - if (nbr->state == NSM_Full) + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) + /* Ignore myself. */ + if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id)) + if (nbr->state == NSM_Full) + { + links += link_info_set (s, nbr->router_id, oi->address->u.prefix4, + LSA_LINK_TYPE_POINTOPOINT, 0, cost); + if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) + zlog_debug ("PointToMultipoint: set link to %s", + inet_ntoa(oi->address->u.prefix4)); + } - { - links += link_info_set (s, nbr->router_id, oi->address->u.prefix4, - LSA_LINK_TYPE_POINTOPOINT, 0, cost); - if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) - zlog_debug ("PointToMultipoint: set link to %s", - inet_ntoa(oi->address->u.prefix4)); - } - return links; } @@ -1025,7 +1019,7 @@ static void ospf_network_lsa_body_set (struct stream *s, struct ospf_interface *oi) { struct in_addr mask; - struct route_node *rn; + struct listnode *node; struct ospf_neighbor *nbr; masklen2ip (oi->address->prefixlen, &mask); @@ -1036,10 +1030,9 @@ ospf_network_lsa_body_set (struct stream *s, struct ospf_interface *oi) its OSPF Router ID. The Designated Router includes itself in this list. RFC2328, Section 12.4.2 */ - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info) != NULL) - if (nbr->state == NSM_Full || nbr == oi->nbr_self) - stream_put_ipv4 (s, nbr->router_id.s_addr); + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) + if (nbr->state == NSM_Full || nbr == oi->nbr_self) + stream_put_ipv4 (s, nbr->router_id.s_addr); } static struct ospf_lsa * @@ -2839,19 +2832,14 @@ ospf_check_nbr_status (struct ospf *ospf) struct listnode *node, *nnode; struct ospf_interface *oi; - for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi)) + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) { - struct route_node *rn; struct ospf_neighbor *nbr; if (ospf_if_is_enable (oi)) - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info) != NULL) - if (nbr->state == NSM_Exchange || nbr->state == NSM_Loading) - { - route_unlock_node (rn); - return 0; - } + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, nnode, nbr)) + if (nbr->state == NSM_Exchange || nbr->state == NSM_Loading) + return 0; } return 1; diff --git a/ospfd/ospf_neighbor.c b/ospfd/ospf_neighbor.c index 81b3fdcd..03efba57 100644 --- a/ospfd/ospf_neighbor.c +++ b/ospfd/ospf_neighbor.c @@ -43,26 +43,6 @@ #include "ospfd/ospf_flood.h" #include "ospfd/ospf_dump.h" -/* Fill in the the 'key' as appropriate to retrieve the entry for nbr - * from the ospf_interface's nbrs table. Indexed by interface address - * for all cases except Virtual-link interfaces, where neighbours are - * indexed by router-ID instead. - */ -static void -ospf_nbr_key (struct ospf_interface *oi, struct ospf_neighbor *nbr, - struct prefix *key) -{ - key->family = AF_INET; - key->prefixlen = IPV4_MAX_BITLEN; - - /* vlinks are indexed by router-id */ - if (oi->type == OSPF_IFTYPE_VIRTUALLINK) - key->u.prefix4 = nbr->router_id; - else - key->u.prefix4 = nbr->src; - return; -} - struct ospf_neighbor * ospf_nbr_new (struct ospf_interface *oi) { @@ -143,44 +123,43 @@ ospf_nbr_free (struct ospf_neighbor *nbr) XFREE (MTYPE_OSPF_NEIGHBOR, nbr); } +/* lookup nbr by address - use this only if you know you must + * otherwise use the ospf_nbr_lookup() wrapper, which deals + * with virtual link neighbours + */ +struct ospf_neighbor * +ospf_nbr_lookup_by_addr (struct list *nbrs, + struct in_addr *addr) +{ + struct listnode *node; + struct ospf_neighbor *nbr; -/* Delete specified OSPF neighbor from interface. */ -void -ospf_nbr_delete (struct ospf_neighbor *nbr) + for (ALL_LIST_ELEMENTS_RO (nbrs, node, nbr)) + if (IPV4_ADDR_SAME (&nbr->src, addr)) + return nbr; + + return NULL; +} + +struct ospf_neighbor * +ospf_nbr_lookup_by_routerid (struct list *nbrs, + struct in_addr *id) { - struct ospf_interface *oi; - struct route_node *rn; - struct prefix p; + struct listnode *node; + struct ospf_neighbor *nbr; - oi = nbr->oi; - - /* get appropriate prefix 'key' */ - ospf_nbr_key (oi, nbr, &p); + for (ALL_LIST_ELEMENTS_RO (nbrs, node, nbr)) + if (IPV4_ADDR_SAME (&nbr->router_id, id)) + return nbr; - rn = route_node_lookup (oi->nbrs, &p); - if (rn) - { - /* If lookup for a NBR succeeds, the leaf route_node could - * only exist because there is (or was) a nbr there. - * If the nbr was deleted, the leaf route_node should have - * lost its last refcount too, and be deleted. - * Therefore a looked-up leaf route_node in nbrs table - * should never have NULL info. - */ - assert (rn->info); - - if (rn->info) - { - rn->info = NULL; - route_unlock_node (rn); - } - else - zlog_info ("Can't find neighbor %s in the interface %s", - inet_ntoa (nbr->src), IF_NAME (oi)); - - route_unlock_node (rn); - } + return NULL; +} +/* Delete specified OSPF neighbor from interface. */ +void +ospf_nbr_delete (struct ospf_neighbor *nbr) +{ + listnode_delete(nbr->oi->nbrs, nbr); /* Free ospf_neighbor structure. */ ospf_nbr_free (nbr); } @@ -206,8 +185,7 @@ ospf_nbr_bidirectional (struct in_addr *router_id, void ospf_nbr_add_self (struct ospf_interface *oi) { - struct prefix p; - struct route_node *rn; + struct ospf_neighbor *nbr; /* Initial state */ oi->nbr_self->address = *oi->address; @@ -229,19 +207,22 @@ ospf_nbr_add_self (struct ospf_interface *oi) SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP); break; } - - /* Add nbr_self to nbrs table */ - ospf_nbr_key (oi, oi->nbr_self, &p); - - rn = route_node_get (oi->nbrs, &p); - if (rn->info) + + /* Sanity check, should not be needed */ + if (oi->type == OSPF_IFTYPE_VIRTUALLINK) + nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &oi->nbr_self->router_id); + else + nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &oi->nbr_self->src); + if (nbr) { - /* There is already pseudo neighbor. */ - assert (oi->nbr_self == rn->info); - route_unlock_node (rn); + assert (oi->nbr_self == nbr); + zlog_info("Self neighbor already added for ospf I/F:%s", + oi->ifp->name); + return; } - else - rn->info = oi->nbr_self; + + /* Add nbr_self to nbrs table */ + listnode_add(oi->nbrs, oi->nbr_self); } /* Get neighbor count by status. @@ -250,14 +231,13 @@ int ospf_nbr_count (struct ospf_interface *oi, int state) { struct ospf_neighbor *nbr; - struct route_node *rn; + struct listnode *node; int count = 0; - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info)) - if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id)) - if (state == 0 || nbr->state == state) - count++; + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) + if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id)) + if (state == 0 || nbr->state == state) + count++; return count; } @@ -267,67 +247,24 @@ int ospf_nbr_count_opaque_capable (struct ospf_interface *oi) { struct ospf_neighbor *nbr; - struct route_node *rn; + struct listnode *node; int count = 0; - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info)) - if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id)) - if (nbr->state == NSM_Full) - if (CHECK_FLAG (nbr->options, OSPF_OPTION_O)) - count++; + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) + if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id)) + if (nbr->state == NSM_Full) + if (CHECK_FLAG (nbr->options, OSPF_OPTION_O)) + count++; return count; } #endif /* HAVE_OPAQUE_LSA */ -/* lookup nbr by address - use this only if you know you must - * otherwise use the ospf_nbr_lookup() wrapper, which deals - * with virtual link neighbours - */ -struct ospf_neighbor * -ospf_nbr_lookup_by_addr (struct route_table *nbrs, - struct in_addr *addr) -{ - struct route_node *rn; - struct ospf_neighbor *nbr; - - for (rn = route_top (nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info) != NULL) - if (IPV4_ADDR_SAME (&nbr->src, addr)) - { - route_unlock_node(rn); - return nbr; - } - - return NULL; -} - -struct ospf_neighbor * -ospf_nbr_lookup_by_routerid (struct route_table *nbrs, - struct in_addr *id) -{ - struct route_node *rn; - struct ospf_neighbor *nbr; - - for (rn = route_top (nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info) != NULL) - if (IPV4_ADDR_SAME (&nbr->router_id, id)) - { - route_unlock_node(rn); - return nbr; - } - - return NULL; -} - void ospf_renegotiate_optional_capabilities (struct ospf *top) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_interface *oi; - struct route_table *nbrs; - struct route_node *rn; struct ospf_neighbor *nbr; /* At first, flush self-originated LSAs from routing domain. */ @@ -336,12 +273,9 @@ ospf_renegotiate_optional_capabilities (struct ospf *top) /* Revert all neighbor status to ExStart. */ for (ALL_LIST_ELEMENTS_RO (top->oiflist, node, oi)) { - if ((nbrs = oi->nbrs) == NULL) - continue; - - for (rn = route_top (nbrs); rn; rn = route_next (rn)) - { - if ((nbr = rn->info) == NULL || nbr == oi->nbr_self) + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, nnode, nbr)) + { + if (nbr == oi->nbr_self) continue; if (nbr->state < NSM_ExStart) @@ -363,9 +297,9 @@ ospf_nbr_lookup (struct ospf_interface *oi, struct ip *iph, struct ospf_header *ospfh) { if (oi->type == OSPF_IFTYPE_VIRTUALLINK) - return (ospf_nbr_lookup_by_routerid (oi->nbrs, &ospfh->router_id)); + return ospf_nbr_lookup_by_routerid (oi->nbrs, &ospfh->router_id); else - return (ospf_nbr_lookup_by_addr (oi->nbrs, &iph->ip_src)); + return ospf_nbr_lookup_by_addr (oi->nbrs, &iph->ip_src); } static struct ospf_neighbor * @@ -407,7 +341,8 @@ ospf_nbr_add (struct ospf_interface *oi, struct ospf_header *ospfh, if (IS_DEBUG_OSPF_EVENT) zlog_debug ("NSM[%s:%s]: start", IF_NAME (nbr->oi), inet_ntoa (nbr->router_id)); - + + listnode_add(oi->nbrs, nbr); return nbr; } @@ -415,24 +350,11 @@ struct ospf_neighbor * ospf_nbr_get (struct ospf_interface *oi, struct ospf_header *ospfh, struct ip *iph, struct prefix *p) { - struct route_node *rn; - struct prefix key; struct ospf_neighbor *nbr; - - key.family = AF_INET; - key.prefixlen = IPV4_MAX_BITLEN; - if (oi->type == OSPF_IFTYPE_VIRTUALLINK) - key.u.prefix4 = ospfh->router_id; /* index vlink nbrs by router-id */ - else - key.u.prefix4 = iph->ip_src; - - rn = route_node_get (oi->nbrs, &key); - if (rn->info) + nbr = ospf_nbr_lookup (oi, iph, ospfh); + if (nbr) { - route_unlock_node (rn); - nbr = rn->info; - if (oi->type == OSPF_IFTYPE_NBMA && nbr->state == NSM_Attempt) { nbr->src = iph->ip_src; @@ -441,7 +363,7 @@ ospf_nbr_get (struct ospf_interface *oi, struct ospf_header *ospfh, } else { - rn->info = nbr = ospf_nbr_add (oi, ospfh, p); + nbr = ospf_nbr_add (oi, ospfh, p); } nbr->router_id = ospfh->router_id; diff --git a/ospfd/ospf_neighbor.h b/ospfd/ospf_neighbor.h index 25f13524..af8fb2c2 100644 --- a/ospfd/ospf_neighbor.h +++ b/ospfd/ospf_neighbor.h @@ -110,10 +110,9 @@ extern struct ospf_neighbor *ospf_nbr_get (struct ospf_interface *, extern struct ospf_neighbor *ospf_nbr_lookup (struct ospf_interface *, struct ip *, struct ospf_header *); -extern struct ospf_neighbor *ospf_nbr_lookup_by_addr (struct route_table *, +extern struct ospf_neighbor *ospf_nbr_lookup_by_addr (struct list *, struct in_addr *); -extern struct ospf_neighbor *ospf_nbr_lookup_by_routerid (struct route_table - *, +extern struct ospf_neighbor *ospf_nbr_lookup_by_routerid (struct list *, struct in_addr *); extern void ospf_renegotiate_optional_capabilities (struct ospf *top); diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c index f0cba5c4..22cce7a3 100644 --- a/ospfd/ospf_packet.c +++ b/ospfd/ospf_packet.c @@ -2625,7 +2625,7 @@ static int ospf_make_hello (struct ospf_interface *oi, struct stream *s) { struct ospf_neighbor *nbr; - struct route_node *rn; + struct listnode *node; u_int16_t length = OSPF_HELLO_MIN_SIZE; struct in_addr mask; unsigned long p; @@ -2667,10 +2667,9 @@ ospf_make_hello (struct ospf_interface *oi, struct stream *s) stream_put_ipv4 (s, BDR (oi).s_addr); /* Add neighbor seen. */ - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info)) - if (nbr->router_id.s_addr != 0) /* Ignore 0.0.0.0 node. */ - if (nbr->state != NSM_Attempt) /* Ignore Down neighbor. */ + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) + if (nbr->router_id.s_addr != 0) /* Ignore 0.0.0.0 node. */ + if (nbr->state != NSM_Attempt) /* Ignore Down neighbor. */ if (nbr->state != NSM_Down) /* This is myself for DR election. */ if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id)) { @@ -3086,45 +3085,43 @@ ospf_hello_send (struct ospf_interface *oi) if (oi->type == OSPF_IFTYPE_NBMA) { struct ospf_neighbor *nbr; - struct route_node *rn; + struct listnode *node; - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info)) - if (nbr != oi->nbr_self) - if (nbr->state != NSM_Down) + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) + if (nbr != oi->nbr_self) + if (nbr->state != NSM_Down) + { + /* RFC 2328 Section 9.5.1 + If the router is not eligible to become Designated Router, + it must periodically send Hello Packets to both the + Designated Router and the Backup Designated Router (if they + exist). */ + if (PRIORITY(oi) == 0 && + IPV4_ADDR_CMP(&DR(oi), &nbr->address.u.prefix4) && + IPV4_ADDR_CMP(&BDR(oi), &nbr->address.u.prefix4)) + continue; + + /* If the router is eligible to become Designated Router, it + must periodically send Hello Packets to all neighbors that + are also eligible. In addition, if the router is itself the + Designated Router or Backup Designated Router, it must also + send periodic Hello Packets to all other neighbors. */ + + if (nbr->priority == 0 && oi->state == ISM_DROther) + continue; + /* if oi->state == Waiting, send hello to all neighbors */ { - /* RFC 2328 Section 9.5.1 - If the router is not eligible to become Designated Router, - it must periodically send Hello Packets to both the - Designated Router and the Backup Designated Router (if they - exist). */ - if (PRIORITY(oi) == 0 && - IPV4_ADDR_CMP(&DR(oi), &nbr->address.u.prefix4) && - IPV4_ADDR_CMP(&BDR(oi), &nbr->address.u.prefix4)) - continue; - - /* If the router is eligible to become Designated Router, it - must periodically send Hello Packets to all neighbors that - are also eligible. In addition, if the router is itself the - Designated Router or Backup Designated Router, it must also - send periodic Hello Packets to all other neighbors. */ - - if (nbr->priority == 0 && oi->state == ISM_DROther) - continue; - /* if oi->state == Waiting, send hello to all neighbors */ - { - struct ospf_packet *op_dup; + struct ospf_packet *op_dup; - op_dup = ospf_packet_dup(op); - op_dup->dst = nbr->address.u.prefix4; + op_dup = ospf_packet_dup(op); + op_dup->dst = nbr->address.u.prefix4; - /* Add packet to the interface output queue. */ - ospf_packet_add (oi, op_dup); - - OSPF_ISM_WRITE_ON (oi->ospf); - } + /* Add packet to the interface output queue. */ + ospf_packet_add (oi, op_dup); + OSPF_ISM_WRITE_ON (oi->ospf); } + } ospf_packet_free (op); } else @@ -3542,10 +3539,9 @@ ospf_ls_ack_send_delayed (struct ospf_interface *oi) if (oi->type == OSPF_IFTYPE_NBMA) { struct ospf_neighbor *nbr; - struct route_node *rn; + struct listnode *node; - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info) != NULL) + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) if (nbr != oi->nbr_self && nbr->state >= NSM_Exchange) while (listcount (oi->ls_ack)) ospf_ls_ack_send_list (oi, oi->ls_ack, nbr->address.u.prefix4); diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c index adc822a7..2c97488e 100644 --- a/ospfd/ospf_vty.c +++ b/ospfd/ospf_vty.c @@ -3024,39 +3024,37 @@ show_ip_ospf_neighbour_header (struct vty *vty) static void show_ip_ospf_neighbor_sub (struct vty *vty, struct ospf_interface *oi) { - struct route_node *rn; + struct listnode *node; struct ospf_neighbor *nbr; char msgbuf[16]; char timebuf[OSPF_TIME_DUMP_SIZE]; - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info)) - /* Do not show myself. */ - if (nbr != oi->nbr_self) - /* Down state is not shown. */ - if (nbr->state != NSM_Down) - { - ospf_nbr_state_message (nbr, msgbuf, 16); + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) + /* Do not show myself. */ + if (nbr != oi->nbr_self) + /* Down state is not shown. */ + if (nbr->state != NSM_Down) + { + ospf_nbr_state_message (nbr, msgbuf, 16); + if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0) + vty_out (vty, "%-15s %3d %-15s ", + "-", nbr->priority, + msgbuf); + else + vty_out (vty, "%-15s %3d %-15s ", + inet_ntoa (nbr->router_id), nbr->priority, + msgbuf); - if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0) - vty_out (vty, "%-15s %3d %-15s ", - "-", nbr->priority, - msgbuf); - else - vty_out (vty, "%-15s %3d %-15s ", - inet_ntoa (nbr->router_id), nbr->priority, - msgbuf); - - vty_out (vty, "%9s ", - ospf_timer_dump (nbr->t_inactivity, timebuf, + vty_out (vty, "%9s ", + ospf_timer_dump (nbr->t_inactivity, timebuf, sizeof(timebuf))); - - vty_out (vty, "%-15s ", inet_ntoa (nbr->src)); - vty_out (vty, "%-20s %5ld %5ld %5d%s", - IF_NAME (oi), ospf_ls_retransmit_count (nbr), - ospf_ls_request_count (nbr), ospf_db_summary_count (nbr), - VTY_NEWLINE); - } + + vty_out (vty, "%-15s ", inet_ntoa (nbr->src)); + vty_out (vty, "%-20s %5ld %5ld %5d%s", + IF_NAME (oi), ospf_ls_retransmit_count (nbr), + ospf_ls_request_count (nbr), ospf_db_summary_count (nbr), + VTY_NEWLINE); + } } DEFUN (show_ip_ospf_neighbor, @@ -3343,14 +3341,13 @@ DEFUN (show_ip_ospf_neighbor_detail, for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) { - struct route_node *rn; + struct listnode *nnode; struct ospf_neighbor *nbr; - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info)) - if (nbr != oi->nbr_self) - if (nbr->state != NSM_Down) - show_ip_ospf_neighbor_detail_sub (vty, oi, nbr); + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, nnode, nbr)) + if (nbr != oi->nbr_self) + if (nbr->state != NSM_Down) + show_ip_ospf_neighbor_detail_sub (vty, oi, nbr); } return CMD_SUCCESS; @@ -3379,15 +3376,14 @@ DEFUN (show_ip_ospf_neighbor_detail_all, for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) { - struct route_node *rn; + struct listnode *nnode; struct ospf_neighbor *nbr; struct ospf_nbr_nbma *nbr_nbma; - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info)) - if (nbr != oi->nbr_self) - if (oi->type == OSPF_IFTYPE_NBMA && nbr->state != NSM_Down) - show_ip_ospf_neighbor_detail_sub (vty, oi, rn->info); + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, nnode, nbr)) + if (nbr != oi->nbr_self) + if (oi->type == OSPF_IFTYPE_NBMA && nbr->state != NSM_Down) + show_ip_ospf_neighbor_detail_sub (vty, oi, nbr); if (oi->type == OSPF_IFTYPE_NBMA) { @@ -3416,8 +3412,9 @@ DEFUN (show_ip_ospf_neighbor_int_detail, struct ospf *ospf; struct ospf_interface *oi; struct interface *ifp; - struct route_node *rn, *nrn; + struct route_node *rn; struct ospf_neighbor *nbr; + struct listnode *node; ifp = if_lookup_by_name (argv[0]); if (!ifp) @@ -3436,11 +3433,10 @@ DEFUN (show_ip_ospf_neighbor_int_detail, for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn)) if ((oi = rn->info)) - for (nrn = route_top (oi->nbrs); nrn; nrn = route_next (nrn)) - if ((nbr = nrn->info)) - if (nbr != oi->nbr_self) - if (nbr->state != NSM_Down) - show_ip_ospf_neighbor_detail_sub (vty, oi, nbr); + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) + if (nbr != oi->nbr_self) + if (nbr->state != NSM_Down) + show_ip_ospf_neighbor_detail_sub (vty, oi, nbr); return CMD_SUCCESS; } @@ -4952,17 +4948,16 @@ ALIAS (no_ip_ospf_cost2, static void ospf_nbr_timer_update (struct ospf_interface *oi) { - struct route_node *rn; + struct listnode *node; struct ospf_neighbor *nbr; - for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info)) - { - nbr->v_inactivity = OSPF_IF_PARAM (oi, v_wait); - nbr->v_db_desc = OSPF_IF_PARAM (oi, retransmit_interval); - nbr->v_ls_req = OSPF_IF_PARAM (oi, retransmit_interval); - nbr->v_ls_upd = OSPF_IF_PARAM (oi, retransmit_interval); - } + for (ALL_LIST_ELEMENTS_RO (oi->nbrs, node, nbr)) + { + nbr->v_inactivity = OSPF_IF_PARAM (oi, v_wait); + nbr->v_db_desc = OSPF_IF_PARAM (oi, retransmit_interval); + nbr->v_ls_req = OSPF_IF_PARAM (oi, retransmit_interval); + nbr->v_ls_upd = OSPF_IF_PARAM (oi, retransmit_interval); + } } static int diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c index a7553e73..22db4498 100644 --- a/ospfd/ospfd.c +++ b/ospfd/ospfd.c @@ -1397,8 +1397,6 @@ ospf_nbr_nbma_add (struct ospf_nbr_nbma *nbr_nbma, struct ospf_interface *oi) { struct ospf_neighbor *nbr; - struct route_node *rn; - struct prefix p; if (oi->type != OSPF_IFTYPE_NBMA) return; @@ -1413,30 +1411,21 @@ ospf_nbr_nbma_add (struct ospf_nbr_nbma *nbr_nbma, listnode_add (oi->nbr_nbma, nbr_nbma); /* Get neighbor information from table. */ - p.family = AF_INET; - p.prefixlen = IPV4_MAX_BITLEN; - p.u.prefix4 = nbr_nbma->addr; - - rn = route_node_get (oi->nbrs, (struct prefix *)&p); - if (rn->info) + nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &nbr_nbma->addr); + if (nbr) { - nbr = rn->info; nbr->nbr_nbma = nbr_nbma; nbr_nbma->nbr = nbr; - - route_unlock_node (rn); } else { - nbr = rn->info = ospf_nbr_new (oi); + nbr = ospf_nbr_new (oi); nbr->state = NSM_Down; nbr->src = nbr_nbma->addr; nbr->nbr_nbma = nbr_nbma; nbr->priority = nbr_nbma->priority; - nbr->address = p; - + nbr->address.u.prefix4 = nbr_nbma->addr; nbr_nbma->nbr = nbr; - OSPF_NSM_EVENT_EXECUTE (nbr, NSM_Start); } } |