diff options
author | paul <paul> | 2005-04-07 07:30:20 +0000 |
---|---|---|
committer | paul <paul> | 2005-04-07 07:30:20 +0000 |
commit | 1eb8ef2584833f18fb674e127d59cb5a7f771482 (patch) | |
tree | f5b09d4781de9a9b08839fefb6530e64d2d2ec31 /ospfd | |
parent | 5920990fecba7e2430af3cfaa8bcbaed40d0ba1a (diff) |
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
Diffstat (limited to 'ospfd')
-rw-r--r-- | ospfd/ospf_abr.c | 93 | ||||
-rw-r--r-- | ospfd/ospf_apiserver.c | 121 | ||||
-rw-r--r-- | ospfd/ospf_ase.c | 84 | ||||
-rw-r--r-- | ospfd/ospf_flood.c | 77 | ||||
-rw-r--r-- | ospfd/ospf_ia.c | 53 | ||||
-rw-r--r-- | ospfd/ospf_interface.c | 112 | ||||
-rw-r--r-- | ospfd/ospf_ism.c | 12 | ||||
-rw-r--r-- | ospfd/ospf_lsa.c | 119 | ||||
-rw-r--r-- | ospfd/ospf_neighbor.c | 9 | ||||
-rw-r--r-- | ospfd/ospf_opaque.c | 147 | ||||
-rw-r--r-- | ospfd/ospf_packet.c | 63 | ||||
-rw-r--r-- | ospfd/ospf_route.c | 69 | ||||
-rw-r--r-- | ospfd/ospf_snmp.c | 48 | ||||
-rw-r--r-- | ospfd/ospf_spf.c | 105 | ||||
-rw-r--r-- | ospfd/ospf_te.c | 55 | ||||
-rw-r--r-- | ospfd/ospf_vty.c | 240 | ||||
-rw-r--r-- | ospfd/ospf_zebra.c | 76 | ||||
-rw-r--r-- | ospfd/ospfd.c | 177 |
18 files changed, 711 insertions, 949 deletions
diff --git a/ospfd/ospf_abr.c b/ospfd/ospf_abr.c index 416b3e79..90ed3920 100644 --- a/ospfd/ospf_abr.c +++ b/ospfd/ospf_abr.c @@ -174,10 +174,11 @@ struct ospf_area_range * ospf_area_range_match_any (struct ospf *ospf, struct prefix_ipv4 *p) { struct ospf_area_range *range; + struct ospf_area *area; struct listnode *node; - for (node = listhead (ospf->areas); node; nextnode (node)) - if ((range = ospf_area_range_match (node->data, p))) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) + if ((range = ospf_area_range_match (area, p))) return range; return NULL; @@ -407,9 +408,9 @@ void ospf_abr_nssa_check_status (struct ospf *ospf) { struct ospf_area *area; - struct listnode *lnode; + struct listnode *lnode, *nnode; - LIST_LOOP (ospf->areas, area, lnode) + for (ALL_LIST_ELEMENTS (ospf->areas, lnode, nnode, area)) { if (area->external_routing != OSPF_AREA_NSSA) @@ -477,7 +478,7 @@ void ospf_check_abr_status (struct ospf *ospf) { struct ospf_area *area; - struct listnode *node; + struct listnode *node, *nnode; int bb_configured = 0; int bb_act_attached = 0; int areas_configured = 0; @@ -487,10 +488,8 @@ ospf_check_abr_status (struct ospf *ospf) if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_check_abr_status(): Start"); - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) { - area = getdata (node); - if (listcount (area->oiflist)) { areas_configured++; @@ -774,10 +773,10 @@ int ospf_abr_nexthops_belong_to_area (struct ospf_route *or, struct ospf_area *area) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_path *path; - LIST_LOOP (or->paths, path, node) + for (ALL_LIST_ELEMENTS (or->paths, node, nnode, path)) { struct ospf_interface *oi = path->oi; @@ -851,10 +850,8 @@ ospf_abr_announce_network (struct ospf *ospf, or_area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id); assert (or_area); - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); - if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_announce_network(): looking at area %s", inet_ntoa (area->area_id)); @@ -958,10 +955,8 @@ ospf_abr_process_nssa_translates (struct ospf *ospf) if (IS_DEBUG_OSPF_NSSA) zlog_debug ("ospf_abr_process_nssa_translates(): Start"); - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); - if (! area->NSSATranslatorState) continue; /* skip if not translator */ @@ -1148,10 +1143,8 @@ ospf_abr_announce_rtr (struct ospf *ospf, if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_announce_rtr(): Start"); - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); - if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_announce_rtr(): looking at area %s", inet_ntoa (area->area_id)); @@ -1205,7 +1198,7 @@ ospf_abr_process_router_rt (struct ospf *ospf, struct route_table *rt) for (rn = route_top (rt); rn; rn = route_next (rn)) { - struct listnode *node; + struct listnode *node, *nnode; char flag = 0; struct ospf_route *best = NULL; @@ -1218,12 +1211,8 @@ ospf_abr_process_router_rt (struct ospf *ospf, struct route_table *rt) zlog_debug ("ospf_abr_process_router_rt(): this is a route to %s", inet_ntoa (rn->p.u.prefix4)); - for (node = listhead (l); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (l, node, nnode, or)) { - or = getdata (node); - if (or == NULL) - continue; - if (!ospf_area_lookup_by_area_id (ospf, or->u.std.area_id)) { if (IS_DEBUG_OSPF_EVENT) @@ -1334,9 +1323,8 @@ ospf_abr_unapprove_summaries (struct ospf *ospf) if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_unapprove_summaries(): Start"); - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_unapprove_summaries(): " "considering area %s", @@ -1372,14 +1360,13 @@ ospf_abr_prepare_aggregates (struct ospf *ospf) struct listnode *node; struct route_node *rn; struct ospf_area_range *range; + struct ospf_area *area; if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_prepare_aggregates(): Start"); - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - struct ospf_area *area = getdata (node); - for (rn = route_top (area->ranges); rn; rn = route_next (rn)) if ((range = rn->info) != NULL) { @@ -1404,10 +1391,8 @@ ospf_abr_announce_aggregates (struct ospf *ospf) if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_announce_aggregates(): Start"); - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); - if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_announce_aggregates(): looking at area %s", inet_ntoa (area->area_id)); @@ -1444,9 +1429,8 @@ ospf_abr_announce_aggregates (struct ospf *ospf) if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_announce_aggregates(): active range"); - for (n = listhead (ospf->areas); n; nextnode (n)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, n, ar)) { - ar = getdata (n); if (ar == area) continue; @@ -1488,10 +1472,8 @@ ospf_abr_send_nssa_aggregates (struct ospf *ospf) /* temporarily turned off */ if (IS_DEBUG_OSPF_NSSA) zlog_debug ("ospf_abr_send_nssa_aggregates(): Start"); - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); - if (! area->NSSATranslatorState) continue; @@ -1559,9 +1541,8 @@ ospf_abr_announce_nssa_defaults (struct ospf *ospf) /* By ABR-Translator */ if (IS_DEBUG_OSPF_NSSA) zlog_debug ("ospf_abr_announce_stub_defaults(): Start"); - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); if (IS_DEBUG_OSPF_NSSA) zlog_debug ("ospf_abr_announce_nssa_defaults(): looking at area %s", inet_ntoa (area->area_id)); @@ -1601,9 +1582,8 @@ ospf_abr_announce_stub_defaults (struct ospf *ospf) p.prefix.s_addr = OSPF_DEFAULT_DESTINATION; p.prefixlen = 0; - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_announce_stub_defaults(): looking at area %s", inet_ntoa (area->area_id)); @@ -1675,10 +1655,8 @@ ospf_abr_remove_unapproved_summaries (struct ospf *ospf) if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_remove_unapproved_summaries(): Start"); - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); - if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_abr_remove_unapproved_summaries(): " "looking at area %s", inet_ntoa (area->area_id)); @@ -1701,23 +1679,22 @@ ospf_abr_remove_unapproved_summaries (struct ospf *ospf) void ospf_abr_manage_discard_routes (struct ospf *ospf) { - struct listnode *node; + struct listnode *node, *nnode; struct route_node *rn; struct ospf_area *area; struct ospf_area_range *range; - for (node = listhead (ospf->areas); node; nextnode (node)) - if ((area = node->data) != NULL) - for (rn = route_top (area->ranges); rn; rn = route_next (rn)) - if ((range = rn->info) != NULL) - if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)) - { - if (range->specifics) - ospf_add_discard_route (ospf->new_table, area, - (struct prefix_ipv4 *) &rn->p); - else - ospf_delete_discard_route ((struct prefix_ipv4 *) &rn->p); - } + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) + for (rn = route_top (area->ranges); rn; rn = route_next (rn)) + if ((range = rn->info) != NULL) + if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)) + { + if (range->specifics) + ospf_add_discard_route (ospf->new_table, area, + (struct prefix_ipv4 *) &rn->p); + else + ospf_delete_discard_route ((struct prefix_ipv4 *) &rn->p); + } } /* This is the function taking care about ABR NSSA, i.e. NSSA diff --git a/ospfd/ospf_apiserver.c b/ospfd/ospf_apiserver.c index 89af2a36..59233c72 100644 --- a/ospfd/ospf_apiserver.c +++ b/ospfd/ospf_apiserver.c @@ -83,15 +83,14 @@ struct list *apiserver_list; struct ospf_interface * ospf_apiserver_if_lookup_by_addr (struct in_addr address) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_interface *oi; struct ospf *ospf; if (!(ospf = ospf_lookup ())) return NULL; - for (node = listhead (ospf->oiflist); node; nextnode (node)) - LIST_LOOP (ospf->oiflist, oi, node) + for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi)) if (oi->type != OSPF_IFTYPE_VIRTUALLINK) if (IPV4_ADDR_SAME (&address, &oi->address->u.prefix4)) return oi; @@ -102,14 +101,14 @@ ospf_apiserver_if_lookup_by_addr (struct in_addr address) struct ospf_interface * ospf_apiserver_if_lookup_by_ifp (struct interface *ifp) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_interface *oi; struct ospf *ospf; if (!(ospf = ospf_lookup ())); return NULL; - LIST_LOOP (ospf->oiflist, oi, node) + for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi)) if (oi->ifp == ifp) return oi; @@ -190,7 +189,7 @@ ospf_apiserver_term (void) * Free all client instances. ospf_apiserver_free removes the node * from the list, so we examine the head of the list anew each time. */ - while ( (apiserv = getdata (listhead (apiserver_list))) != NULL) + while ( (apiserv = listgetdata (listhead (apiserver_list))) != NULL) ospf_apiserver_free (apiserv); /* Free client list itself */ @@ -208,20 +207,14 @@ lookup_apiserver (u_char lsa_type, u_char opaque_type) struct ospf_apiserver *apiserv, *found = NULL; /* XXX: this approaches O(n**2) */ - for (n1 = listhead (apiserver_list); n1; nextnode (n1)) + for (ALL_LIST_ELEMENTS_RO (apiserver_list, n1, apiserv)) { - apiserv = (struct ospf_apiserver *) getdata (n1); - - for (n2 = listhead (apiserv->opaque_types); n2; nextnode (n2)) - { - r = (struct registered_opaque_type *) getdata (n2); - - if (r->lsa_type == lsa_type && r->opaque_type == opaque_type) - { - found = apiserv; - goto out; - } - } + for (ALL_LIST_ELEMENTS_RO (apiserv->opaque_types, n2, r)) + if (r->lsa_type == lsa_type && r->opaque_type == opaque_type) + { + found = apiserv; + goto out; + } } out: return found; @@ -373,8 +366,7 @@ ospf_apiserver_free (struct ospf_apiserver *apiserv) while ((node = listhead (apiserv->opaque_types)) != NULL) { - - struct registered_opaque_type *regtype = node->data; + struct registered_opaque_type *regtype = listgetdata(node); ospf_apiserver_unregister_opaque_type (apiserv, regtype->lsa_type, regtype->opaque_type); @@ -964,15 +956,11 @@ int ospf_apiserver_unregister_opaque_type (struct ospf_apiserver *apiserv, u_char lsa_type, u_char opaque_type) { - struct listnode *n1, *n1_next; + struct listnode *node, *nnode; struct registered_opaque_type *regtype; - for (n1 = listhead (apiserv->opaque_types); n1; n1 = n1_next) + for (ALL_LIST_ELEMENTS (apiserv->opaque_types, node, nnode, regtype)) { - n1_next = n1->next; - - regtype = (struct registered_opaque_type *) getdata(n1); - /* Check if we really registered this opaque type */ if (regtype->lsa_type == lsa_type && regtype->opaque_type == opaque_type) @@ -1008,11 +996,11 @@ int apiserver_is_opaque_type_registered (struct ospf_apiserver *apiserv, u_char lsa_type, u_char opaque_type) { - struct listnode *node; + struct listnode *node, *nnode; struct registered_opaque_type *regtype; /* XXX: how many types are there? if few, why not just a bitmap? */ - LIST_LOOP (apiserv->opaque_types, regtype, node) + for (ALL_LIST_ELEMENTS (apiserv->opaque_types, node, nnode, regtype)) { /* Check if we really registered this opaque type */ if (regtype->lsa_type == lsa_type && @@ -1070,15 +1058,15 @@ out: void ospf_apiserver_notify_ready_type9 (struct ospf_apiserver *apiserv) { - struct listnode *node; - struct listnode *n2; + struct listnode *node, *nnode; + struct listnode *node2, *nnode2; struct ospf *ospf; struct ospf_interface *oi; struct registered_opaque_type *r; ospf = ospf_lookup (); - LIST_LOOP (ospf->oiflist, oi, node) + for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi)) { /* Check if this interface is indeed ready for type 9 */ if (!ospf_apiserver_is_ready_type9 (oi)) @@ -1086,7 +1074,7 @@ ospf_apiserver_notify_ready_type9 (struct ospf_apiserver *apiserv) /* Check for registered opaque type 9 types */ /* XXX: loop-de-loop - optimise me */ - LIST_LOOP (apiserv->opaque_types, r, n2) + for (ALL_LIST_ELEMENTS (apiserv->opaque_types, node2, nnode2, r)) { struct msg *msg; @@ -1121,14 +1109,14 @@ out: void ospf_apiserver_notify_ready_type10 (struct ospf_apiserver *apiserv) { - struct listnode *node; - struct listnode *n2; + struct listnode *node, *nnode; + struct listnode *node2, *nnode2; struct ospf *ospf; struct ospf_area *area; ospf = ospf_lookup (); - LIST_LOOP (ospf->areas, area, node) + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) { struct registered_opaque_type *r; @@ -1139,7 +1127,7 @@ ospf_apiserver_notify_ready_type10 (struct ospf_apiserver *apiserv) /* Check for registered opaque type 10 types */ /* XXX: loop in loop - optimise me */ - LIST_LOOP (apiserv->opaque_types, r, n2) + for (ALL_LIST_ELEMENTS (apiserv->opaque_types, node2, nnode2, r)) { struct msg *msg; @@ -1172,7 +1160,7 @@ out: void ospf_apiserver_notify_ready_type11 (struct ospf_apiserver *apiserv) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf *ospf; struct registered_opaque_type *r; @@ -1183,7 +1171,7 @@ ospf_apiserver_notify_ready_type11 (struct ospf_apiserver *apiserv) goto out; /* Check for registered opaque type 11 types */ - LIST_LOOP (apiserv->opaque_types, r, node) + for (ALL_LIST_ELEMENTS (apiserv->opaque_types, node, nnode, r)) { struct msg *msg; struct in_addr noarea_id = { 0L }; @@ -1350,16 +1338,15 @@ int ospf_apiserver_handle_sync_lsdb (struct ospf_apiserver *apiserv, struct msg *msg) { - struct listnode *node; + struct listnode *node, *nnode; u_int32_t seqnum; int rc = 0; struct msg_sync_lsdb *smsg; - struct param_t + struct ospf_apiserver_param_t { struct ospf_apiserver *apiserv; struct lsa_filter_type *filter; - } - param; + } param; u_int16_t mask; struct route_node *rn; struct ospf_lsa *lsa; @@ -1381,7 +1368,7 @@ ospf_apiserver_handle_sync_lsdb (struct ospf_apiserver *apiserv, mask = ntohs (smsg->filter.typemask); /* Iterate over all areas. */ - LIST_LOOP (ospf->areas, area, node) + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) { int i; u_int32_t *area_id = NULL; @@ -1563,10 +1550,10 @@ ospf_apiserver_is_ready_type10 (struct ospf_area *area) /* Type 10 opaque LSA can be originated if there is at least one interface belonging to the area that has an active opaque-capable neighbor. */ - struct listnode *node; + struct listnode *node, *nnode; struct ospf_interface *oi; - LIST_LOOP (area->oiflist, oi, node) + for (ALL_LIST_ELEMENTS (area->oiflist, node, nnode, oi)) /* Is there an active neighbor attached to this interface? */ if (ospf_apiserver_is_ready_type9 (oi)) return 1; @@ -1580,10 +1567,10 @@ ospf_apiserver_is_ready_type11 (struct ospf *ospf) { /* Type 11 opaque LSA can be originated if there is at least one interface that has an active opaque-capable neighbor. */ - struct listnode *node; + struct listnode *node, *nnode; struct ospf_interface *oi; - LIST_LOOP (ospf->oiflist, oi, node) + for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi)) /* Is there an active neighbor attached to this interface? */ if (ospf_apiserver_is_ready_type9 (oi)) return 1; @@ -2050,7 +2037,7 @@ ospf_apiserver_flush_opaque_lsa (struct ospf_apiserver *apiserv, u_char lsa_type; u_char opaque_type; } param; - struct listnode *node; + struct listnode *node, *nnode; struct ospf * ospf; struct ospf_area *area; @@ -2068,12 +2055,12 @@ ospf_apiserver_flush_opaque_lsa (struct ospf_apiserver *apiserv, struct ospf_lsa *lsa; case OSPF_OPAQUE_LINK_LSA: - LIST_LOOP (ospf->areas, area, node) + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa) apiserver_flush_opaque_type_callback(lsa, (void *) ¶m, 0); break; case OSPF_OPAQUE_AREA_LSA: - LIST_LOOP (ospf->areas, area, node) + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa) apiserver_flush_opaque_type_callback(lsa, (void *) ¶m, 0); break; @@ -2253,11 +2240,11 @@ ospf_apiserver_show_info (struct vty *vty, struct ospf_lsa *lsa) void ospf_apiserver_clients_notify_all (struct msg *msg) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_apiserver *apiserv; /* Send message to all clients */ - LIST_LOOP (apiserver_list, apiserv, node) + for (ALL_LIST_ELEMENTS (apiserver_list, node, nnode, apiserv)) ospf_apiserver_send_msg (apiserv, msg); } @@ -2266,7 +2253,7 @@ ospf_apiserver_clients_notify_all (struct msg *msg) void ospf_apiserver_clients_notify_ready_type9 (struct ospf_interface *oi) { - struct listnode *node; + struct listnode *node, *nnode; struct msg *msg; struct ospf_apiserver *apiserv; @@ -2283,12 +2270,12 @@ ospf_apiserver_clients_notify_ready_type9 (struct ospf_interface *oi) return; } - LIST_LOOP (apiserver_list, apiserv, node) + for (ALL_LIST_ELEMENTS (apiserver_list, node, nnode, apiserv)) { - struct listnode *n2; + struct listnode *node2, *nnode2; struct registered_opaque_type *r; - LIST_LOOP (apiserv->opaque_types, r, n2) + for (ALL_LIST_ELEMENTS (apiserv->opaque_types, node2, nnode2, r)) { if (r->lsa_type == OSPF_OPAQUE_LINK_LSA) { @@ -2319,7 +2306,7 @@ out: void ospf_apiserver_clients_notify_ready_type10 (struct ospf_area *area) { - struct listnode *node; + struct listnode *node, *nnode; struct msg *msg; struct ospf_apiserver *apiserv; @@ -2331,12 +2318,12 @@ ospf_apiserver_clients_notify_ready_type10 (struct ospf_area *area) return; } - LIST_LOOP (apiserver_list, apiserv, node) + for (ALL_LIST_ELEMENTS (apiserver_list, node, nnode, apiserv)) { - struct listnode *n2; + struct listnode *node2, *nnode2; struct registered_opaque_type *r; - LIST_LOOP (apiserv->opaque_types, r, n2) + for (ALL_LIST_ELEMENTS (apiserv->opaque_types, node2, nnode2, r)) { if (r->lsa_type == OSPF_OPAQUE_AREA_LSA) { @@ -2367,7 +2354,7 @@ out: void ospf_apiserver_clients_notify_ready_type11 (struct ospf *top) { - struct listnode *node; + struct listnode *node, *nnode; struct msg *msg; struct in_addr id_null = { 0L }; struct ospf_apiserver *apiserv; @@ -2380,12 +2367,12 @@ ospf_apiserver_clients_notify_ready_type11 (struct ospf *top) return; } - LIST_LOOP (apiserver_list, apiserv, node) + for (ALL_LIST_ELEMENTS (apiserver_list, node, nnode, apiserv)) { - struct listnode *n2; + struct listnode *node2, *nnode2; struct registered_opaque_type *r; - LIST_LOOP (apiserv->opaque_types, r, n2) + for (ALL_LIST_ELEMENTS (apiserv->opaque_types, node2, nnode2, r)) { if (r->lsa_type == OSPF_OPAQUE_AS_LSA) { @@ -2499,7 +2486,7 @@ void apiserver_clients_lsa_change_notify (u_char msgtype, struct ospf_lsa *lsa) { struct msg *msg; - struct listnode *node; + struct listnode *node, *nnode; struct ospf_apiserver *apiserv; /* Default area for AS-External and Opaque11 LSAs */ @@ -2530,7 +2517,7 @@ apiserver_clients_lsa_change_notify (u_char msgtype, struct ospf_lsa *lsa) } /* Now send message to all clients with a matching filter */ - LIST_LOOP (apiserver_list, apiserv, node) + for (ALL_LIST_ELEMENTS (apiserver_list, node, nnode, apiserv)) { struct lsa_filter_type *filter; u_int16_t mask; diff --git a/ospfd/ospf_ase.c b/ospfd/ospf_ase.c index c4f4dd3d..f9f79e3c 100644 --- a/ospfd/ospf_ase.c +++ b/ospfd/ospf_ase.c @@ -71,12 +71,11 @@ ospf_find_asbr_route (struct ospf *ospf, /* First try to find intra-area non-bb paths. */ if (!CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE)) - for (node = listhead ((struct list *) rn->info); node; nextnode (node)) - if ((or = getdata (node)) != NULL) - if (or->cost < OSPF_LS_INFINITY) - if (!OSPF_IS_AREA_ID_BACKBONE (or->u.std.area_id) && - or->path_type == OSPF_PATH_INTRA_AREA) - listnode_add (chosen, or); + for (ALL_LIST_ELEMENTS_RO ((struct list *) rn->info, node, or)) + if (or->cost < OSPF_LS_INFINITY) + if (!OSPF_IS_AREA_ID_BACKBONE (or->u.std.area_id) && + or->path_type == OSPF_PATH_INTRA_AREA) + listnode_add (chosen, or); /* If none is found -- look through all. */ if (listcount (chosen) == 0) @@ -86,19 +85,18 @@ ospf_find_asbr_route (struct ospf *ospf, } /* Now find the route with least cost. */ - for (node = listhead (chosen); node; nextnode (node)) - if ((or = getdata (node)) != NULL) - if (or->cost < OSPF_LS_INFINITY) - { - if (best == NULL) - best = or; - else if (best->cost > or->cost) - best = or; - else if (best->cost == or->cost && - IPV4_ADDR_CMP (&best->u.std.area_id, - &or->u.std.area_id) < 0) - best = or; - } + for (ALL_LIST_ELEMENTS_RO (chosen, node, or)) + if (or->cost < OSPF_LS_INFINITY) + { + if (best == NULL) + best = or; + else if (best->cost > or->cost) + best = or; + else if (best->cost == or->cost && + IPV4_ADDR_CMP (&best->u.std.area_id, + &or->u.std.area_id) < 0) + best = or; + } if (chosen != rn->info) list_delete (chosen); @@ -126,10 +124,9 @@ ospf_find_asbr_route_through_area (struct route_table *rtrs, route_unlock_node (rn); - for (node = listhead ((struct list *) rn->info); node; nextnode (node)) - if ((or = getdata (node)) != NULL) - if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id)) - return or; + for (ALL_LIST_ELEMENTS_RO ((struct list *) rn->info, node, or)) + if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id)) + return or; } return NULL; @@ -141,10 +138,9 @@ ospf_ase_complete_direct_routes (struct ospf_route *ro, struct in_addr nexthop) struct listnode *node; struct ospf_path *op; - for (node = listhead (ro->paths); node; nextnode (node)) - if ((op = getdata (node)) != NULL) - if (op->nexthop.s_addr == 0) - op->nexthop.s_addr = nexthop.s_addr; + for (ALL_LIST_ELEMENTS_RO (ro->paths, node, op)) + if (op->nexthop.s_addr == 0) + op->nexthop.s_addr = nexthop.s_addr; } int @@ -153,12 +149,11 @@ ospf_ase_forward_address_check (struct ospf *ospf, struct in_addr fwd_addr) struct listnode *ifn; struct ospf_interface *oi; - for (ifn = listhead (ospf->oiflist); ifn; nextnode (ifn)) - if ((oi = getdata (ifn)) != NULL) - if (if_is_operative (oi->ifp)) - if (oi->type != OSPF_IFTYPE_VIRTUALLINK) - if (IPV4_ADDR_SAME (&oi->address->u.prefix4, &fwd_addr)) - return 0; + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, ifn, oi)) + if (if_is_operative (oi->ifp)) + if (oi->type != OSPF_IFTYPE_VIRTUALLINK) + if (IPV4_ADDR_SAME (&oi->address->u.prefix4, &fwd_addr)) + return 0; return 1; } @@ -590,10 +585,10 @@ ospf_ase_route_match_same (struct route_table *rt, struct prefix *prefix, /* Check each path. */ for (n1 = listhead (or->paths), n2 = listhead (newor->paths); - n1 && n2; nextnode (n1), nextnode (n2)) + n1 && n2; n1 = listnextnode (n1), n2 = listnextnode (n2)) { - op = getdata (n1); - newop = getdata (n2); + op = listgetdata (n1); + newop = listgetdata (n2); if (! IPV4_ADDR_SAME (&op->nexthop, &newop->nexthop)) return 0; @@ -650,9 +645,8 @@ ospf_ase_calculate_timer (struct thread *t) /* This version simple adds to the table all NSSA areas */ if (ospf->anyNSSA) - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); if (IS_DEBUG_OSPF_NSSA) zlog_debug ("ospf_ase_calculate_timer(): looking at area %s", inet_ntoa (area->area_id)); @@ -758,17 +752,16 @@ ospf_ase_external_lsas_finish (struct route_table *rt) struct route_node *rn; struct ospf_lsa *lsa; struct list *lst; - struct listnode *node; + struct listnode *node, *nnode; for (rn = route_top (rt); rn; rn = route_next (rn)) if ((lst = rn->info) != NULL) { - for (node = listhead (lst); node; node = nextnode (node)) - if ((lsa = getdata (node)) != NULL) - ospf_lsa_unlock (lsa); + for (ALL_LIST_ELEMENTS (lst, node, nnode, lsa)) + ospf_lsa_unlock (lsa); list_delete (lst); } - + route_table_finish (rt); } @@ -808,9 +801,8 @@ ospf_ase_incremental_update (struct ospf *ospf, struct ospf_lsa *lsa) assert (rn && rn->info); lsas = rn->info; - for (node = listhead (lsas); node; nextnode (node)) - if ((lsa = getdata (node)) != NULL) - ospf_ase_calculate_route (ospf, lsa); + for (ALL_LIST_ELEMENTS_RO (lsas, node, lsa)) + ospf_ase_calculate_route (ospf, lsa); /* prepare temporary old routing table for compare */ tmp_old = route_table_init (); diff --git a/ospfd/ospf_flood.c b/ospfd/ospf_flood.c index 586c25fb..06e0f1c7 100644 --- a/ospfd/ospf_flood.c +++ b/ospfd/ospf_flood.c @@ -150,34 +150,33 @@ ospf_process_self_originated_lsa (struct ospf *ospf, /* Look through all interfaces, not just area, since interface could be moved from one area to another. */ - for (node = listhead (ospf->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) /* These are sanity check. */ - if ((oi = getdata (node)) != NULL) - if (IPV4_ADDR_SAME (&oi->address->u.prefix4, &new->data->id)) - { - if (oi->area != area || - oi->type != OSPF_IFTYPE_BROADCAST || - !IPV4_ADDR_SAME (&oi->address->u.prefix4, &DR (oi))) - { - ospf_schedule_lsa_flush_area (area, new); - return; - } - + if (IPV4_ADDR_SAME (&oi->address->u.prefix4, &new->data->id)) + { + if (oi->area != area || + oi->type != OSPF_IFTYPE_BROADCAST || + !IPV4_ADDR_SAME (&oi->address->u.prefix4, &DR (oi))) + { + ospf_schedule_lsa_flush_area (area, new); + return; + } + #ifdef HAVE_OPAQUE_LSA - if (new->data->type == OSPF_OPAQUE_LINK_LSA) - { - ospf_opaque_lsa_refresh (new); - return; - } + if (new->data->type == OSPF_OPAQUE_LINK_LSA) + { + ospf_opaque_lsa_refresh (new); + return; + } #endif /* HAVE_OPAQUE_LSA */ - ospf_lsa_unlock (oi->network_lsa_self); - oi->network_lsa_self = ospf_lsa_lock (new); - - /* Schedule network-LSA origination. */ - ospf_network_lsa_timer_add (oi); - return; - } + ospf_lsa_unlock (oi->network_lsa_self); + oi->network_lsa_self = ospf_lsa_lock (new); + + /* Schedule network-LSA origination. */ + ospf_network_lsa_timer_add (oi); + return; + } break; case OSPF_SUMMARY_LSA: case OSPF_ASBR_SUMMARY_LSA: @@ -569,17 +568,16 @@ int ospf_flood_through_area (struct ospf_area *area, struct ospf_neighbor *inbr, struct ospf_lsa *lsa) { - struct listnode *node; + struct listnode *node, *nnode; + struct ospf_interface *oi; int lsa_ack_flag = 0; /* All other types are specific to a single area (Area A). The eligible interfaces are all those interfaces attaching to the Area A. If Area A is the backbone, this includes all the virtual links. */ - for (node = listhead (area->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (area->oiflist, node, nnode, oi)) { - struct ospf_interface *oi = getdata (node); - if (area->area_id.s_addr != OSPF_AREA_BACKBONE && oi->type == OSPF_IFTYPE_VIRTUALLINK) continue; @@ -609,6 +607,7 @@ ospf_flood_through_as (struct ospf *ospf, struct ospf_neighbor *inbr, struct ospf_lsa *lsa) { struct listnode *node; + struct ospf_area *area; int lsa_ack_flag; lsa_ack_flag = 0; @@ -628,11 +627,11 @@ ospf_flood_through_as (struct ospf *ospf, struct ospf_neighbor *inbr, if (IS_DEBUG_OSPF_NSSA) zlog_debug ("Flood/AS: NSSA TRANSLATED LSA"); - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { int continue_flag = 0; - struct ospf_area *area = getdata (node); struct listnode *if_node; + struct ospf_interface *oi; switch (area->external_routing) { @@ -671,10 +670,8 @@ ospf_flood_through_as (struct ospf *ospf, struct ospf_neighbor *inbr, /* send to every interface in this area */ - for (if_node = listhead (area->oiflist); if_node; nextnode (if_node)) + for (ALL_LIST_ELEMENTS_RO (area->oiflist, if_node, oi)) { - struct ospf_interface *oi = getdata (if_node); - /* Skip virtual links */ if (oi->type != OSPF_IFTYPE_VIRTUALLINK) if (ospf_flood_through_interface (oi, inbr, lsa)) /* lsa */ @@ -965,19 +962,21 @@ void ospf_ls_retransmit_delete_nbr_area (struct ospf_area *area, struct ospf_lsa *lsa) { - struct listnode *node; + struct listnode *node, *nnode; + struct ospf_interface *oi; - for (node = listhead (area->oiflist); node; nextnode (node)) - ospf_ls_retransmit_delete_nbr_if (getdata (node), lsa); + for (ALL_LIST_ELEMENTS (area->oiflist, node, nnode, oi)) + ospf_ls_retransmit_delete_nbr_if (oi, lsa); } void ospf_ls_retransmit_delete_nbr_as (struct ospf *ospf, struct ospf_lsa *lsa) { - struct listnode *node; + struct listnode *node, *nnode; + struct ospf_interface *oi; - for (node = listhead (ospf->oiflist); node; nextnode (node)) - ospf_ls_retransmit_delete_nbr_if (getdata (node), lsa); + for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi)) + ospf_ls_retransmit_delete_nbr_if (oi, lsa); } diff --git a/ospfd/ospf_ia.c b/ospfd/ospf_ia.c index 5bdcfba6..87613bf1 100644 --- a/ospfd/ospf_ia.c +++ b/ospfd/ospf_ia.c @@ -62,10 +62,10 @@ ospf_find_abr_route (struct route_table *rtrs, route_unlock_node (rn); - for (node = listhead ((struct list *) rn->info); node; nextnode (node)) - if ((or = getdata (node)) != NULL) - if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id) && (or->u.std.flags & ROUTER_LSA_BORDER)) - return or; + for (ALL_LIST_ELEMENTS_RO ((struct list *) rn->info, node, or)) + if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id) + && (or->u.std.flags & ROUTER_LSA_BORDER)) + return or; return NULL; } @@ -637,11 +637,10 @@ ospf_ia_routing (struct ospf *ospf, OSPF_EXAMINE_SUMMARIES_ALL (area, rt, rtrs); - for (node = listhead (ospf->areas); node; nextnode (node)) - if ((area = getdata (node)) != NULL) - if (area != ospf->backbone) - if (ospf_area_is_transit (area)) - OSPF_EXAMINE_TRANSIT_SUMMARIES_ALL (area, rt, rtrs); + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) + if (area != ospf->backbone) + if (ospf_area_is_transit (area)) + OSPF_EXAMINE_TRANSIT_SUMMARIES_ALL (area, rt, rtrs); } else if (IS_DEBUG_OSPF_EVENT) @@ -664,20 +663,18 @@ ospf_ia_routing (struct ospf *ospf, OSPF_EXAMINE_SUMMARIES_ALL (area, rt, rtrs); - for (node = listhead (ospf->areas); node; nextnode (node)) - if ((area = getdata (node)) != NULL) - if (area != ospf->backbone) - if (ospf_area_is_transit (area)) - OSPF_EXAMINE_TRANSIT_SUMMARIES_ALL (area, rt, rtrs); + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) + if (area != ospf->backbone) + if (ospf_area_is_transit (area)) + OSPF_EXAMINE_TRANSIT_SUMMARIES_ALL (area, rt, rtrs); } else { /* No active BB connection--consider all areas */ if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_ia_routing(): " "Active BB connection not found"); - for (node = listhead (ospf->areas); node; nextnode (node)) - if ((area = getdata (node)) != NULL) - OSPF_EXAMINE_SUMMARIES_ALL (area, rt, rtrs); + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) + OSPF_EXAMINE_SUMMARIES_ALL (area, rt, rtrs); } break; case OSPF_ABR_SHORTCUT: @@ -696,15 +693,14 @@ ospf_ia_routing (struct ospf *ospf, OSPF_EXAMINE_SUMMARIES_ALL (area, rt, rtrs); } - for (node = listhead (ospf->areas); node; nextnode (node)) - if ((area = getdata (node)) != NULL) - if (area != ospf->backbone) - if (ospf_area_is_transit (area) || - ((area->shortcut_configured != OSPF_SHORTCUT_DISABLE) && - ((ospf->backbone == NULL) || - ((area->shortcut_configured == OSPF_SHORTCUT_ENABLE) && - area->shortcut_capability)))) - OSPF_EXAMINE_TRANSIT_SUMMARIES_ALL (area, rt, rtrs); + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) + if (area != ospf->backbone) + if (ospf_area_is_transit (area) || + ((area->shortcut_configured != OSPF_SHORTCUT_DISABLE) && + ((ospf->backbone == NULL) || + ((area->shortcut_configured == OSPF_SHORTCUT_ENABLE) && + area->shortcut_capability)))) + OSPF_EXAMINE_TRANSIT_SUMMARIES_ALL (area, rt, rtrs); break; default: break; @@ -717,8 +713,7 @@ ospf_ia_routing (struct ospf *ospf, if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_ia_routing():not ABR, considering all areas"); - for (node = listhead (ospf->areas); node; nextnode (node)) - if ((area = getdata (node)) != NULL) - OSPF_EXAMINE_SUMMARIES_ALL (area, rt, rtrs); + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) + OSPF_EXAMINE_SUMMARIES_ALL (area, rt, rtrs); } } diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index 027dfb9d..f8490f5e 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -258,16 +258,15 @@ void ospf_if_cleanup (struct ospf_interface *oi) { struct route_node *rn; - struct listnode *node; + struct listnode *node, *nnode; struct ospf_neighbor *nbr; + struct ospf_nbr_nbma *nbr_nbma; + struct ospf_lsa *lsa; /* oi->nbrs and oi->nbr_nbma should be deletete on InterafceDown event */ /* delete all static neighbors attached to this interface */ - for (node = listhead (oi->nbr_nbma); node; ) + for (ALL_LIST_ELEMENTS (oi->nbr_nbma, node, nnode, nbr_nbma)) { - struct ospf_nbr_nbma *nbr_nbma = getdata (node); - nextnode (node); - OSPF_POLL_TIMER_OFF (nbr_nbma->t_poll); if (nbr_nbma->nbr) @@ -288,8 +287,8 @@ ospf_if_cleanup (struct ospf_interface *oi) OSPF_NSM_EVENT_EXECUTE (nbr, NSM_KillNbr); /* Cleanup Link State Acknowlegdment list. */ - for (node = listhead (oi->ls_ack); node; nextnode (node)) - ospf_lsa_unlock (node->data); + for (ALL_LIST_ELEMENTS (oi->ls_ack, node, nnode, lsa)) + ospf_lsa_unlock (lsa); list_delete_all_node (oi->ls_ack); oi->crypt_seqnum = 0; @@ -362,7 +361,7 @@ ospf_if_free (struct ospf_interface *oi) struct ospf_interface * ospf_if_is_configured (struct ospf *ospf, struct in_addr *address) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_interface *oi; struct prefix_ipv4 addr; @@ -370,8 +369,8 @@ ospf_if_is_configured (struct ospf *ospf, struct in_addr *address) addr.prefix = *address; addr.prefixlen = IPV4_MAX_PREFIXLEN; - for (node = listhead (ospf->oiflist); node; nextnode (node)) - if ((oi = getdata (node)) != NULL && oi->type != OSPF_IFTYPE_VIRTUALLINK) + for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi)) + if (oi->type != OSPF_IFTYPE_VIRTUALLINK) { if (oi->type == OSPF_IFTYPE_POINTOPOINT) { @@ -414,11 +413,10 @@ ospf_if_exists (struct ospf_interface *oic) ospf = ospf_lookup (); - for (node = listhead (ospf->oiflist); node; nextnode (node)) - { - if (((oi = getdata (node)) != NULL) && (oi == oic)) + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) + if (oi == oic) return oi; - } + return NULL; } @@ -429,8 +427,8 @@ ospf_if_lookup_by_local_addr (struct ospf *ospf, struct listnode *node; struct ospf_interface *oi; - for (node = listhead (ospf->oiflist); node; nextnode (node)) - if ((oi = getdata (node)) != NULL && oi->type != OSPF_IFTYPE_VIRTUALLINK) + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) + if (oi->type != OSPF_IFTYPE_VIRTUALLINK) { if (ifp && oi->ifp != ifp) continue; @@ -450,9 +448,9 @@ ospf_if_lookup_by_prefix (struct ospf *ospf, struct prefix_ipv4 *p) struct prefix ptmp; /* Check each Interface. */ - for (node = listhead (ospf->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) { - if ((oi = getdata (node)) != NULL && oi->type != OSPF_IFTYPE_VIRTUALLINK) + if (oi->type != OSPF_IFTYPE_VIRTUALLINK) { if ((oi->type == OSPF_IFTYPE_POINTOPOINT) && CONNECTED_DEST_HOST(oi->connected)) @@ -485,10 +483,8 @@ ospf_if_lookup_recv_if (struct ospf *ospf, struct in_addr src) match = NULL; - for (node = listhead (ospf->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) { - oi = getdata (node); - if (oi->type == OSPF_IFTYPE_VIRTUALLINK) continue; @@ -944,11 +940,10 @@ ospf_vl_lookup (struct ospf_area *area, struct in_addr vl_peer) struct ospf_vl_data *vl_data; struct listnode *node; - for (node = listhead (area->ospf->vlinks); node; nextnode (node)) - if ((vl_data = getdata (node)) != NULL) - if (vl_data->vl_peer.s_addr == vl_peer.s_addr && - IPV4_ADDR_SAME (&vl_data->vl_area_id, &area->area_id)) - return vl_data; + for (ALL_LIST_ELEMENTS_RO (area->ospf->vlinks, node, vl_data)) + if (vl_data->vl_peer.s_addr == vl_peer.s_addr && + IPV4_ADDR_SAME (&vl_data->vl_area_id, &area->area_id)) + return vl_data; return NULL; } @@ -1011,20 +1006,19 @@ ospf_vl_set_params (struct ospf_vl_data *vl_data, struct vertex *v) changed = 1; } - for (node = listhead (v->nexthop); node; nextnode (node)) - if ((nh = getdata (node)) != NULL) - { - vl_data->out_oi = (struct ospf_interface *) nh->oi; + for (ALL_LIST_ELEMENTS_RO (v->nexthop, node, nh)) + { + vl_data->out_oi = (struct ospf_interface *) nh->oi; + + if (!IPV4_ADDR_SAME(&voi->address->u.prefix4, + &vl_data->out_oi->address->u.prefix4)) + changed = 1; - if (!IPV4_ADDR_SAME(&voi->address->u.prefix4, - &vl_data->out_oi->address->u.prefix4)) - changed = 1; - - voi->address->u.prefix4 = vl_data->out_oi->address->u.prefix4; - voi->address->prefixlen = vl_data->out_oi->address->prefixlen; - - break; /* We take the first interface. */ - } + voi->address->u.prefix4 = vl_data->out_oi->address->u.prefix4; + voi->address->prefixlen = vl_data->out_oi->address->prefixlen; + + break; /* We take the first interface. */ + } rl = (struct router_lsa *)v->lsa; @@ -1093,11 +1087,8 @@ ospf_vl_up_check (struct ospf_area *area, struct in_addr rid, zlog_debug ("ospf_vl_up_check(): Area is %s", inet_ntoa (area->area_id)); } - for (node = listhead (ospf->vlinks); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data)) { - if ((vl_data = getdata (node)) == NULL) - continue; - if (IS_DEBUG_OSPF_EVENT) { zlog_debug ("ospf_vl_up_check(): considering VL, name: %s", @@ -1144,21 +1135,19 @@ ospf_vl_unapprove (struct ospf *ospf) struct listnode *node; struct ospf_vl_data *vl_data; - for (node = listhead (ospf->vlinks); node; nextnode (node)) - if ((vl_data = getdata (node)) != NULL) - UNSET_FLAG (vl_data->flags, OSPF_VL_FLAG_APPROVED); + for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data)) + UNSET_FLAG (vl_data->flags, OSPF_VL_FLAG_APPROVED); } void ospf_vl_shut_unapproved (struct ospf *ospf) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_vl_data *vl_data; - for (node = listhead (ospf->vlinks); node; nextnode (node)) - if ((vl_data = getdata (node)) != NULL) - if (!CHECK_FLAG (vl_data->flags, OSPF_VL_FLAG_APPROVED)) - ospf_vl_shutdown (vl_data); + for (ALL_LIST_ELEMENTS (ospf->vlinks, node, nnode, vl_data)) + if (!CHECK_FLAG (vl_data->flags, OSPF_VL_FLAG_APPROVED)) + ospf_vl_shutdown (vl_data); } int @@ -1181,10 +1170,9 @@ ospf_vls_in_area (struct ospf_area *area) struct ospf_vl_data *vl_data; int c = 0; - for (node = listhead (area->ospf->vlinks); node; nextnode (node)) - if ((vl_data = getdata (node)) != NULL) - if (IPV4_ADDR_SAME (&vl_data->vl_area_id, &area->area_id)) - c++; + for (ALL_LIST_ELEMENTS_RO (area->ospf->vlinks, node, vl_data)) + if (IPV4_ADDR_SAME (&vl_data->vl_area_id, &area->area_id)) + c++; return c; } @@ -1213,12 +1201,9 @@ ospf_crypt_key_lookup (struct list *auth_crypt, u_char key_id) struct listnode *node; struct crypt_key *ck; - for (node = listhead (auth_crypt); node; nextnode (node)) - { - ck = getdata (node); - if (ck->key_id == key_id) - return ck; - } + for (ALL_LIST_ELEMENTS_RO (auth_crypt, node, ck)) + if (ck->key_id == key_id) + return ck; return NULL; } @@ -1226,12 +1211,11 @@ ospf_crypt_key_lookup (struct list *auth_crypt, u_char key_id) int ospf_crypt_key_delete (struct list *auth_crypt, u_char key_id) { - struct listnode *node; + struct listnode *node, *nnode; struct crypt_key *ck; - for (node = listhead (auth_crypt); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (auth_crypt, node, nnode, ck)) { - ck = getdata (node); if (ck->key_id == key_id) { listnode_delete (auth_crypt, ck); diff --git a/ospfd/ospf_ism.c b/ospfd/ospf_ism.c index dd0f0669..5d498d7d 100644 --- a/ospfd/ospf_ism.c +++ b/ospfd/ospf_ism.c @@ -53,10 +53,8 @@ ospf_dr_election_sub (struct list *routers) /* Choose highest router priority. In case of tie, choose highest Router ID. */ - for (node = listhead (routers); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (routers, node, nbr)) { - nbr = getdata (node); - if (max == NULL) max = nbr; else @@ -82,10 +80,8 @@ ospf_elect_dr (struct ospf_interface *oi, struct list *el_list) dr_list = list_new (); /* Add neighbors to the list. */ - for (node = listhead (el_list); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (el_list, node, nbr)) { - nbr = getdata (node); - /* neighbor declared to be DR. */ if (NBR_IS_DR (nbr)) listnode_add (dr_list, nbr); @@ -126,10 +122,8 @@ ospf_elect_bdr (struct ospf_interface *oi, struct list *el_list) no_dr_list = list_new (); /* Add neighbors to the list. */ - for (node = listhead (el_list); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (el_list, node, nbr)) { - nbr = getdata (node); - /* neighbor declared to be DR. */ if (NBR_IS_DR (nbr)) continue; diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c index 203c4a5e..e02d457e 100644 --- a/ospfd/ospf_lsa.c +++ b/ospfd/ospf_lsa.c @@ -656,11 +656,11 @@ int router_lsa_link_set (struct stream *s, struct ospf_area *area) { struct listnode *node; + struct ospf_interface *oi; int links = 0; - for (node = listhead (area->oiflist); node; node = nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi)) { - struct ospf_interface *oi = node->data; struct interface *ifp = oi->ifp; /* Check interface is up, OSPF is enable. */ @@ -890,16 +890,16 @@ int ospf_router_lsa_update_timer (struct thread *thread) { struct ospf *ospf = THREAD_ARG (thread); - struct listnode *node; + struct listnode *node, *nnode; + struct ospf_area *area; if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) zlog_debug ("Timer[router-LSA Update]: (timer expire)"); ospf->t_router_lsa_update = NULL; - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) { - struct ospf_area *area = getdata (node); struct ospf_lsa *lsa = area->router_lsa_self; struct router_lsa *rl; const char *area_str; @@ -1396,7 +1396,8 @@ ospf_external_lsa_nexthop_get (struct ospf *ospf, struct in_addr nexthop) { struct in_addr fwd; struct prefix nh; - struct listnode *n1; + struct listnode *node; + struct ospf_interface *oi; fwd.s_addr = 0; @@ -1408,15 +1409,11 @@ ospf_external_lsa_nexthop_get (struct ospf *ospf, struct in_addr nexthop) nh.u.prefix4 = nexthop; nh.prefixlen = IPV4_MAX_BITLEN; - for (n1 = listhead (ospf->oiflist); n1; nextnode (n1)) - { - struct ospf_interface *oi = getdata (n1); - - if (if_is_operative (oi->ifp)) - if (oi->address->family == AF_INET) - if (prefix_match (oi->address, &nh)) - return nexthop; - } + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) + if (if_is_operative (oi->ifp)) + if (oi->address->family == AF_INET) + if (prefix_match (oi->address, &nh)) + return nexthop; return fwd; } @@ -1444,15 +1441,14 @@ ospf_get_nssa_ip (struct ospf_area *area) { struct in_addr fwd; struct in_addr best_default; - struct listnode *n1; + struct listnode *node; + struct ospf_interface *oi; fwd.s_addr = 0; best_default.s_addr = 0; - for (n1 = listhead (area->ospf->oiflist); n1; nextnode (n1)) + for (ALL_LIST_ELEMENTS_RO (area->ospf->oiflist, node, oi)) { - struct ospf_interface *oi = getdata (n1); - if (if_is_operative (oi->ifp)) if (oi->area->external_routing == OSPF_AREA_NSSA) if (oi->address && oi->address->family == AF_INET) @@ -1618,7 +1614,8 @@ ospf_install_flood_nssa (struct ospf *ospf, { struct ospf_lsa *new; struct as_external_lsa *extlsa; - struct listnode *node; + struct ospf_area *area; + struct listnode *node, *nnode; /* LSA may be a Type-5 originated via translation of a Type-7 LSA * which originated from an NSSA area. In which case it should not be @@ -1642,10 +1639,8 @@ ospf_install_flood_nssa (struct ospf *ospf, Later, ABR_TASK and P-bit will scan Type-7 LSDB and translate to Type-5's to non-NSSA Areas. (it will also attempt a re-install) */ - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) { - struct ospf_area *area = getdata (node); - /* Don't install Type-7 LSA's into nonNSSA area */ if (area->external_routing != OSPF_AREA_NSSA) continue; @@ -1863,12 +1858,12 @@ ospf_translated_nssa_refresh (struct ospf *ospf, struct ospf_lsa *type7, /* find the type-7 from which supplied type-5 was translated, * ie find first type-7 with same LSA Id. */ - struct listnode *ln; + struct listnode *ln, *lnn; struct route_node *rn; struct ospf_lsa *lsa; struct ospf_area *area; - LIST_LOOP (ospf->areas, area, ln) + for (ALL_LIST_ELEMENTS (ospf->areas, ln, lnn, area)) { if (area->external_routing != OSPF_AREA_NSSA && !type7) @@ -2112,14 +2107,13 @@ ospf_default_originate_timer (struct thread *thread) void ospf_nssa_lsa_flush (struct ospf *ospf, struct prefix_ipv4 *p) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_lsa *lsa; struct ospf_area *area; - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) { - if (((area = getdata (node)) != NULL) - && (area->external_routing == OSPF_AREA_NSSA)) + if (area->external_routing == OSPF_AREA_NSSA) { if (!(lsa = ospf_lsa_lookup (area, OSPF_AS_NSSA_LSA, p->prefix, ospf->router_id))) @@ -2749,11 +2743,11 @@ ospf_lsa_install (struct ospf *ospf, struct ospf_interface *oi, int ospf_check_nbr_status (struct ospf *ospf) { - struct listnode *node; - - for (node = listhead (ospf->oiflist); node; node = nextnode (node)) + struct listnode *node, *nnode; + struct ospf_interface *oi; + + for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi)) { - struct ospf_interface *oi = getdata (node); struct route_node *rn; struct ospf_neighbor *nbr; @@ -2805,8 +2799,8 @@ int ospf_maxage_lsa_remover (struct thread *thread) { struct ospf *ospf = THREAD_ARG (thread); - struct listnode *node; - struct listnode *next; + struct ospf_lsa *lsa; + struct listnode *node, *nnode; int reschedule = 0; ospf->t_maxage = NULL; @@ -2817,11 +2811,8 @@ ospf_maxage_lsa_remover (struct thread *thread) reschedule = !ospf_check_nbr_status (ospf); if (!reschedule) - for (node = listhead (ospf->maxage_lsa); node; node = next) + for (ALL_LIST_ELEMENTS (ospf->maxage_lsa, node, nnode, lsa)) { - struct ospf_lsa *lsa = getdata (node); - next = node->next; - if (lsa->retransmit_counter > 0) { reschedule = 1; @@ -2872,9 +2863,10 @@ int ospf_lsa_maxage_exist (struct ospf *ospf, struct ospf_lsa *new) { struct listnode *node; - - for (node = listhead (ospf->maxage_lsa); node; nextnode (node)) - if (((struct ospf_lsa *) node->data) == new) + struct ospf_lsa *lsa; + + for (ALL_LIST_ELEMENTS_RO (ospf->maxage_lsa, node, lsa)) + if (lsa == new) return 1; return 0; @@ -2965,14 +2957,13 @@ ospf_lsa_maxage_walker (struct thread *thread) struct ospf *ospf = THREAD_ARG (thread); struct route_node *rn; struct ospf_lsa *lsa; - struct listnode *node; + struct ospf_area *area; + struct listnode *node, *nnode; ospf->t_maxage_walker = NULL; - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) { - struct ospf_area *area = node->data; - LSDB_LOOP (ROUTER_LSDB (area), rn, lsa) ospf_lsa_maxage_walker_remover (ospf, lsa); LSDB_LOOP (NETWORK_LSDB (area), rn, lsa) @@ -3292,18 +3283,16 @@ ospf_lsa_flush_schedule (struct ospf *ospf, struct ospf_lsa *lsa) void ospf_flush_self_originated_lsas_now (struct ospf *ospf) { - struct listnode *n1, *n2; + struct listnode *node, *nnode; + struct listnode *node2, *nnode2; struct ospf_area *area; struct ospf_interface *oi; struct ospf_lsa *lsa; struct route_node *rn; int need_to_flush_ase = 0; - for (n1 = listhead (ospf->areas); n1; nextnode (n1)) + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) { - if ((area = getdata (n1)) == NULL) - continue; - if ((lsa = area->router_lsa_self) != NULL) { if (IS_DEBUG_OSPF_EVENT) @@ -3315,14 +3304,11 @@ ospf_flush_self_originated_lsas_now (struct ospf *ospf) OSPF_TIMER_OFF (area->t_router_lsa_self); } - for (n2 = listhead (area->oiflist); n2; nextnode (n2)) + for (ALL_LIST_ELEMENTS (area->oiflist, node2, nnode2, oi)) { - if ((oi = getdata (n2)) == NULL) - continue; - if ((lsa = oi->network_lsa_self) != NULL - && oi->state == ISM_DR - && oi->full_nbrs > 0) + && oi->state == ISM_DR + && oi->full_nbrs > 0) { if (IS_DEBUG_OSPF_EVENT) zlog_debug ("LSA[Type%d:%s]: Schedule self-originated LSA to FLUSH", lsa->data->type, inet_ntoa (lsa->data->id)); @@ -3380,6 +3366,7 @@ int ospf_lsa_is_self_originated (struct ospf *ospf, struct ospf_lsa *lsa) { struct listnode *node; + struct ospf_interface *oi; /* This LSA is already checked. */ if (CHECK_FLAG (lsa->flags, OSPF_LSA_SELF_CHECKED)) @@ -3399,10 +3386,8 @@ ospf_lsa_is_self_originated (struct ospf *ospf, struct ospf_lsa *lsa) /* LSA is network-LSA. Compare Link ID with all interfaces. */ else if (lsa->data->type == OSPF_NETWORK_LSA) - for (node = listhead (ospf->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) { - struct ospf_interface *oi = getdata (node); - /* Ignore virtual link. */ if (oi->type != OSPF_IFTYPE_VIRTUALLINK) if (oi->address->family == AF_INET) @@ -3662,8 +3647,9 @@ int ospf_lsa_refresh_walker (struct thread *t) { struct list *refresh_list; - struct listnode *node; + struct listnode *node, *nnode; struct ospf *ospf = THREAD_ARG (t); + struct ospf_lsa *lsa; int i; struct list *lsa_to_refresh = list_new (); @@ -3698,12 +3684,8 @@ ospf_lsa_refresh_walker (struct thread *t) if (refresh_list) { - for (node = listhead (refresh_list); node;) + for (ALL_LIST_ELEMENTS (refresh_list, node, nnode, lsa)) { - struct listnode *next; - struct ospf_lsa *lsa = getdata (node); - next = node->next; - if (IS_DEBUG_OSPF (lsa, LSA_REFRESH)) zlog_debug ("LSA[Refresh:%s]: ospf_lsa_refresh_walker(): " "refresh lsa %p (slot %d)", @@ -3713,7 +3695,6 @@ ospf_lsa_refresh_walker (struct thread *t) ospf_lsa_unlock (lsa); lsa->refresh_list = -1; listnode_add (lsa_to_refresh, lsa); - node = next; } list_free (refresh_list); } @@ -3723,8 +3704,8 @@ ospf_lsa_refresh_walker (struct thread *t) ospf, ospf->lsa_refresh_interval); ospf->lsa_refresher_started = time (NULL); - for (node = listhead (lsa_to_refresh); node; nextnode (node)) - ospf_lsa_refresh (ospf, getdata (node)); + for (ALL_LIST_ELEMENTS (lsa_to_refresh, node, nnode, lsa)) + ospf_lsa_refresh (ospf, lsa); list_delete (lsa_to_refresh); diff --git a/ospfd/ospf_neighbor.c b/ospfd/ospf_neighbor.c index 61366ed7..35906ec8 100644 --- a/ospfd/ospf_neighbor.c +++ b/ospfd/ospf_neighbor.c @@ -304,9 +304,9 @@ ospf_renegotiate_optional_capabilities (struct ospf *top) ospf_flush_self_originated_lsas_now (top); /* Revert all neighbor status to ExStart. */ - for (node = listhead (top->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (top->oiflist, node, oi)) { - if ((oi = getdata (node)) == NULL || (nbrs = oi->nbrs) == NULL) + if ((nbrs = oi->nbrs) == NULL) continue; for (rn = route_top (nbrs); rn; rn = route_next (rn)) @@ -355,11 +355,8 @@ ospf_nbr_add (struct ospf_interface *oi, struct ospf_header *ospfh, struct ospf_nbr_nbma *nbr_nbma; struct listnode *node; - for (node = listhead (oi->nbr_nbma); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, node, nbr_nbma)) { - nbr_nbma = getdata (node); - assert (nbr_nbma); - if (IPV4_ADDR_SAME(&nbr_nbma->addr, &nbr->src)) { nbr_nbma->nbr = nbr; diff --git a/ospfd/ospf_opaque.c b/ospfd/ospf_opaque.c index 01a8e1ce..d6b2f25b 100644 --- a/ospfd/ospf_opaque.c +++ b/ospfd/ospf_opaque.c @@ -371,10 +371,10 @@ ospf_register_opaque_functab ( } else { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) if (functab->opaque_type == opaque_type) { zlog_warn ("ospf_register_opaque_functab: Duplicated entry?:" @@ -418,14 +418,13 @@ void ospf_delete_opaque_functab (u_char lsa_type, u_char opaque_type) { struct list *funclist; - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; if ((funclist = ospf_get_opaque_funclist (lsa_type)) != NULL) - for (node = listhead (funclist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) { - if ((functab = getdata (node)) != NULL - && functab->opaque_type == opaque_type) + if (functab->opaque_type == opaque_type) { /* Cleanup internal control information, if it still remains. */ if (functab->oipt != NULL) @@ -455,7 +454,7 @@ ospf_opaque_functab_lookup (struct ospf_lsa *lsa) u_char key = GET_OPAQUE_TYPE (ntohl (lsa->data->id.s_addr)); if ((funclist = ospf_get_opaque_funclist (lsa->data->type)) != NULL) - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS_RO (funclist, node, functab)) if (functab->opaque_type == key) return functab; @@ -588,13 +587,11 @@ free_opaque_info_per_type (void *val) struct opaque_info_per_type *oipt = (struct opaque_info_per_type *) val; struct opaque_info_per_id *oipi; struct ospf_lsa *lsa; - struct listnode *node; + struct listnode *node, *nnode; /* Control information per opaque-id may still exist. */ - for (node = listhead (oipt->id_list); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (oipt->id_list, node, nnode, oipi)) { - if ((oipi = getdata (node)) == NULL) - continue; if ((lsa = oipi->lsa) == NULL) continue; if (IS_LSA_MAXAGE (lsa)) @@ -641,7 +638,7 @@ lookup_opaque_info_by_type (struct ospf_lsa *lsa) struct ospf_area *area; struct ospf_interface *oi; struct list *listtop = NULL; - struct listnode *node; + struct listnode *node, *nnode; struct opaque_info_per_type *oipt = NULL; u_char key = GET_OPAQUE_TYPE (ntohl (lsa->data->id.s_addr)); @@ -674,7 +671,7 @@ lookup_opaque_info_by_type (struct ospf_lsa *lsa) } if (listtop != NULL) - LIST_LOOP (listtop, oipt, node) + for (ALL_LIST_ELEMENTS (listtop, node, nnode, oipt)) if (oipt->opaque_type == key) return oipt; @@ -720,11 +717,11 @@ static struct opaque_info_per_id * lookup_opaque_info_by_id (struct opaque_info_per_type *oipt, struct ospf_lsa *lsa) { - struct listnode *node; + struct listnode *node, *nnode; struct opaque_info_per_id *oipi; u_int32_t key = GET_OPAQUE_ID (ntohl (lsa->data->id.s_addr)); - LIST_LOOP (oipt->id_list, oipi, node) + for (ALL_LIST_ELEMENTS (oipt->id_list, node, nnode, oipi)) if (oipi->opaque_id == key) return oipi; @@ -827,11 +824,11 @@ ospf_opaque_register_vty (void) static int opaque_lsa_new_if_callback (struct list *funclist, struct interface *ifp) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; int rc = -1; - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) if (functab->new_if_hook != NULL) if ((* functab->new_if_hook)(ifp) != 0) goto out; @@ -843,11 +840,11 @@ out: static int opaque_lsa_del_if_callback (struct list *funclist, struct interface *ifp) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; int rc = -1; - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) if (functab->del_if_hook != NULL) if ((* functab->del_if_hook)(ifp) != 0) goto out; @@ -860,10 +857,10 @@ static void opaque_lsa_ism_change_callback (struct list *funclist, struct ospf_interface *oi, int old_status) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) if (functab->ism_change_hook != NULL) (* functab->ism_change_hook)(oi, old_status); @@ -874,10 +871,10 @@ static void opaque_lsa_nsm_change_callback (struct list *funclist, struct ospf_neighbor *nbr, int old_status) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) if (functab->nsm_change_hook != NULL) (* functab->nsm_change_hook)(nbr, old_status); return; @@ -887,10 +884,10 @@ static void opaque_lsa_config_write_router_callback (struct list *funclist, struct vty *vty) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) if (functab->config_write_router != NULL) (* functab->config_write_router)(vty); return; @@ -900,10 +897,10 @@ static void opaque_lsa_config_write_if_callback (struct list *funclist, struct vty *vty, struct interface *ifp) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) if (functab->config_write_if != NULL) (* functab->config_write_if)(vty, ifp); return; @@ -912,10 +909,10 @@ opaque_lsa_config_write_if_callback (struct list *funclist, static void opaque_lsa_config_write_debug_callback (struct list *funclist, struct vty *vty) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) if (functab->config_write_debug != NULL) (* functab->config_write_debug)(vty); return; @@ -924,11 +921,11 @@ opaque_lsa_config_write_debug_callback (struct list *funclist, struct vty *vty) static int opaque_lsa_originate_callback (struct list *funclist, void *lsa_type_dependent) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; int rc = -1; - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) if (functab->lsa_originator != NULL) if ((* functab->lsa_originator)(lsa_type_dependent) != 0) goto out; @@ -940,12 +937,12 @@ out: static int new_lsa_callback (struct list *funclist, struct ospf_lsa *lsa) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; int rc = -1; /* This function handles ALL types of LSAs, not only opaque ones. */ - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) if (functab->new_lsa_hook != NULL) if ((* functab->new_lsa_hook)(lsa) != 0) goto out; @@ -957,12 +954,12 @@ out: static int del_lsa_callback (struct list *funclist, struct ospf_lsa *lsa) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_opaque_functab *functab; int rc = -1; /* This function handles ALL types of LSAs, not only opaque ones. */ - LIST_LOOP (funclist, functab, node) + for (ALL_LIST_ELEMENTS (funclist, node, nnode, functab)) if (functab->del_lsa_hook != NULL) if ((* functab->del_lsa_hook)(lsa) != 0) goto out; @@ -1291,7 +1288,7 @@ ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, int *delay0) { struct ospf *top; struct ospf_area *area; - struct listnode *node; + struct listnode *node, *nnode; struct opaque_info_per_type *oipt; int delay = 0; @@ -1381,7 +1378,7 @@ ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, int *delay0) if (! list_isempty (ospf_opaque_type9_funclist) && ! list_isempty (oi->opaque_lsa_self)) { - for (node = listhead (oi->opaque_lsa_self); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (oi->opaque_lsa_self, node, nnode, oipt)) { /* * removed the test for @@ -1389,9 +1386,8 @@ ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, int *delay0) * because opaque cababilities ON -> OFF -> ON result in list_isempty (oipt->id_list) * not being empty. */ - if ((oipt = getdata (node)) == NULL /* Something wrong? */ - || oipt->t_opaque_lsa_self != NULL /* Waiting for a thread call. */ - || oipt->status == PROC_SUSPEND) /* Cannot originate now. */ + if (oipt->t_opaque_lsa_self != NULL /* Waiting for a thread call. */ + || oipt->status == PROC_SUSPEND) /* Cannot originate now. */ continue; ospf_opaque_lsa_reoriginate_schedule ((void *) oi, @@ -1402,7 +1398,7 @@ ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, int *delay0) if (! list_isempty (ospf_opaque_type10_funclist) && ! list_isempty (area->opaque_lsa_self)) { - for (node = listhead (area->opaque_lsa_self); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (area->opaque_lsa_self, node, nnode, oipt)) { /* * removed the test for @@ -1410,9 +1406,8 @@ ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, int *delay0) * because opaque cababilities ON -> OFF -> ON result in list_isempty (oipt->id_list) * not being empty. */ - if ((oipt = getdata (node)) == NULL /* Something wrong? */ - || oipt->t_opaque_lsa_self != NULL /* Waiting for a thread call. */ - || oipt->status == PROC_SUSPEND) /* Cannot originate now. */ + if (oipt->t_opaque_lsa_self != NULL /* Waiting for a thread call. */ + || oipt->status == PROC_SUSPEND) /* Cannot originate now. */ continue; ospf_opaque_lsa_reoriginate_schedule ((void *) area, @@ -1423,7 +1418,7 @@ ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, int *delay0) if (! list_isempty (ospf_opaque_type11_funclist) && ! list_isempty (top->opaque_lsa_self)) { - for (node = listhead (top->opaque_lsa_self); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (top->opaque_lsa_self, node, nnode, oipt)) { /* * removed the test for @@ -1431,9 +1426,8 @@ ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, int *delay0) * because opaque cababilities ON -> OFF -> ON result in list_isempty (oipt->id_list) * not being empty. */ - if ((oipt = getdata (node)) == NULL /* Something wrong? */ - || oipt->t_opaque_lsa_self != NULL /* Waiting for a thread call. */ - || oipt->status == PROC_SUSPEND) /* Cannot originate now. */ + if (oipt->t_opaque_lsa_self != NULL /* Waiting for a thread call. */ + || oipt->status == PROC_SUSPEND) /* Cannot originate now. */ continue; ospf_opaque_lsa_reoriginate_schedule ((void *) top, @@ -1504,7 +1498,7 @@ ospf_opaque_type11_lsa_originate (struct thread *t) static void ospf_opaque_lsa_reoriginate_resume (struct list *listtop, void *arg) { - struct listnode *node; + struct listnode *node, *nnode; struct opaque_info_per_type *oipt; struct ospf_opaque_functab *functab; @@ -1515,7 +1509,7 @@ ospf_opaque_lsa_reoriginate_resume (struct list *listtop, void *arg) * Pickup oipt entries those which in SUSPEND status, and give * them a chance to start re-origination now. */ - LIST_LOOP (listtop, oipt, node) + for (ALL_LIST_ELEMENTS (listtop, node, nnode, oipt)) { if (oipt->status != PROC_SUSPEND) continue; @@ -1889,7 +1883,7 @@ ospf_opaque_type10_lsa_reoriginate_timer (struct thread *t) { struct opaque_info_per_type *oipt; struct ospf_opaque_functab *functab; - struct listnode *node; + struct listnode *node, *nnode; struct ospf *top; struct ospf_area *area; struct ospf_interface *oi; @@ -1914,7 +1908,7 @@ ospf_opaque_type10_lsa_reoriginate_timer (struct thread *t) /* There must be at least one "opaque-capable, full-state" neighbor. */ n = 0; - LIST_LOOP (area->oiflist, oi, node) + for (ALL_LIST_ELEMENTS (area->oiflist, node, nnode, oi)) { if ((n = ospf_nbr_count_opaque_capable (oi)) > 0) break; @@ -2144,7 +2138,8 @@ ospf_opaque_adjust_lsreq (struct ospf_neighbor *nbr, struct list *lsas) struct ospf *top; struct ospf_area *area; struct ospf_interface *oi; - struct listnode *node1, *node2; + struct listnode *node1, *nnode1; + struct listnode *node2, *nnode2; struct ospf_lsa *lsa; if ((top = oi_to_top (nbr->oi)) == NULL) @@ -2161,11 +2156,8 @@ ospf_opaque_adjust_lsreq (struct ospf_neighbor *nbr, struct list *lsas) * Obviously, the latter would trigger miserable situations that repeat * installation and removal of unwanted LSAs indefinitely. */ - for (node1 = listhead (lsas); node1; nextnode (node1)) + for (ALL_LIST_ELEMENTS (lsas, node1, nnode1, lsa)) { - if ((lsa = getdata (node1)) == NULL) - continue; - /* Filter out unwanted LSAs. */ if (! IS_OPAQUE_LSA (lsa->data->type)) continue; @@ -2198,20 +2190,12 @@ ospf_opaque_adjust_lsreq (struct ospf_neighbor *nbr, struct list *lsas) break; case OSPF_OPAQUE_AREA_LSA: area = nbr->oi->area; - for (node2 = listhead (area->oiflist); node2; nextnode (node2)) - { - if ((oi = getdata (node2)) == NULL) - continue; - ospf_opaque_exclude_lsa_from_lsreq (oi->nbrs, nbr, lsa); - } + for (ALL_LIST_ELEMENTS (area->oiflist, node2, nnode2, oi)) + ospf_opaque_exclude_lsa_from_lsreq (oi->nbrs, nbr, lsa); break; case OSPF_OPAQUE_AS_LSA: - for (node2 = listhead (top->oiflist); node2; nextnode (node2)) - { - if ((oi = getdata (node2)) == NULL) - continue; - ospf_opaque_exclude_lsa_from_lsreq (oi->nbrs, nbr, lsa); - } + for (ALL_LIST_ELEMENTS (top->oiflist, node2, nnode2, oi)) + ospf_opaque_exclude_lsa_from_lsreq (oi->nbrs, nbr, lsa); break; default: break; @@ -2264,13 +2248,8 @@ ospf_opaque_self_originated_lsa_received (struct ospf_neighbor *nbr, before = IS_OPAQUE_LSA_ORIGINATION_BLOCKED (top->opaque); - for (node = listhead (lsas); node; node = next) + for (ALL_LIST_ELEMENTS (lsas, node, next, lsa)) { - next = node->next; - - if ((lsa = getdata (node)) == NULL) - continue; - listnode_delete (lsas, lsa); /* @@ -2314,14 +2293,14 @@ void ospf_opaque_ls_ack_received (struct ospf_neighbor *nbr, struct list *acks) { struct ospf *top; - struct listnode *node; + struct listnode *node, *nnode; struct ospf_lsa *lsa; char type9_lsa_rcv = 0, type10_lsa_rcv = 0, type11_lsa_rcv = 0; if ((top = oi_to_top (nbr->oi)) == NULL) goto out; - LIST_LOOP (acks, lsa, node) + for (ALL_LIST_ELEMENTS (acks, node, nnode, lsa)) { switch (lsa->data->type) { @@ -2372,7 +2351,7 @@ ospf_opaque_ls_ack_received (struct ospf_neighbor *nbr, struct list *acks) /* Ok, let's start origination of Opaque-LSAs. */ delay = OSPF_MIN_LS_INTERVAL; - LIST_LOOP (top->oiflist, oi, node) + for (ALL_LIST_ELEMENTS (top->oiflist, node, nnode, oi)) { if (! ospf_if_is_enable (oi) || ospf_nbr_count_opaque_capable (oi) == 0) @@ -2409,13 +2388,10 @@ ospf_opaque_type10_lsa_rxmt_nbr_check (struct ospf_area *area) struct ospf_interface *oi; unsigned long n = 0; - for (node = listhead (area->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi)) { - if ((oi = getdata (node)) == NULL) - continue; - if (area->area_id.s_addr != OSPF_AREA_BACKBONE - && oi->type == OSPF_IFTYPE_VIRTUALLINK) + && oi->type == OSPF_IFTYPE_VIRTUALLINK) continue; n = ospf_opaque_nrxmt_self (oi->nbrs, OSPF_OPAQUE_AREA_LSA); @@ -2441,11 +2417,8 @@ ospf_opaque_type11_lsa_rxmt_nbr_check (struct ospf *top) struct ospf_interface *oi; unsigned long n = 0; - for (node = listhead (top->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (top->oiflist, node, oi)) { - if ((oi = getdata (node)) == NULL) - continue; - switch (oi->type) { case OSPF_IFTYPE_VIRTUALLINK: diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c index 4f18c04d..8892f0e5 100644 --- a/ospfd/ospf_packet.c +++ b/ospfd/ospf_packet.c @@ -350,7 +350,7 @@ ospf_make_md5_digest (struct ospf_interface *oi, struct ospf_packet *op) auth_key = (char *) ""; else { - ck = getdata (OSPF_IF_PARAM (oi, auth_crypt)->tail); + ck = listgetdata (listtail(OSPF_IF_PARAM (oi, auth_crypt))); auth_key = (char *) ck->auth_key; } @@ -588,7 +588,7 @@ ospf_write (struct thread *thread) node = listhead (ospf->oi_write_q); assert (node); - oi = getdata (node); + oi = listgetdata (node); assert (oi); #ifdef WANT_OSPF_WRITE_FRAGMENT @@ -1579,12 +1579,11 @@ ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struct stream *s, void ospf_upd_list_clean (struct list *lsas) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_lsa *lsa; - for (node = listhead (lsas); node; nextnode (node)) - if ((lsa = getdata (node)) != NULL) - ospf_lsa_discard (lsa); + for (ALL_LIST_ELEMENTS (lsas, node, nnode, lsa)) + ospf_lsa_discard (lsa); list_delete (lsas); } @@ -1599,7 +1598,7 @@ ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh, #ifdef HAVE_OPAQUE_LSA struct list *mylsa_acks, *mylsa_upds; #endif /* HAVE_OPAQUE_LSA */ - struct listnode *node, *next; + struct listnode *node, *nnode; struct ospf_lsa *lsa = NULL; /* unsigned long ls_req_found = 0; */ @@ -1659,15 +1658,11 @@ ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh, continue; } /* Process each LSA received in the one packet. */ - for (node = listhead (lsas); node; node = next) + for (ALL_LIST_ELEMENTS (lsas, node, nnode, lsa)) { struct ospf_lsa *ls_ret, *current; int ret = 1; - next = node->next; - - lsa = getdata (node); - if (IS_DEBUG_OSPF_NSSA) { char buf1[INET_ADDRSTRLEN]; @@ -1794,12 +1789,12 @@ ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh, if(lsa->data->type == OSPF_NETWORK_LSA) { - struct listnode *oi_node; + struct listnode *oinode, *oinnode; + struct ospf_interface *out_if; int Flag = 0; - for(oi_node = listhead(oi->ospf->oiflist); oi_node; oi_node = nextnode(oi_node)) + for (ALL_LIST_ELEMENTS (oi->ospf->oiflist, oinode, oinnode, out_if)) { - struct ospf_interface *out_if = getdata(oi_node); if(out_if == NULL) break; @@ -2126,11 +2121,8 @@ ospf_associate_packet_vl (struct ospf *ospf, struct interface *ifp, iph->ip_dst)) == NULL) return NULL; - for (node = listhead (ospf->vlinks); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data)) { - if ((vl_data = getdata (node)) == NULL) - continue; - vl_area = ospf_area_lookup_by_area_id (ospf, vl_data->vl_area_id); if (!vl_area) continue; @@ -2210,7 +2202,7 @@ ospf_check_auth (struct ospf_interface *oi, struct stream *ibuf, ret = 0; break; case OSPF_AUTH_CRYPTOGRAPHIC: - if ((ck = getdata (OSPF_IF_PARAM (oi,auth_crypt)->tail)) == NULL) + if ((ck = listgetdata (listtail(OSPF_IF_PARAM (oi,auth_crypt)))) == NULL) { ret = 0; break; @@ -2565,7 +2557,7 @@ ospf_make_auth (struct ospf_interface *oi, struct ospf_header *ospfh) } else { - ck = getdata (OSPF_IF_PARAM (oi, auth_crypt)->tail); + ck = listgetdata (listtail(OSPF_IF_PARAM (oi, auth_crypt))); ospfh->u.crypt.zero = 0; ospfh->u.crypt.key_id = ck->key_id; ospfh->u.crypt.auth_data_len = OSPF_AUTH_MD5_SIZE; @@ -2869,8 +2861,8 @@ ospf_make_ls_upd (struct ospf_interface *oi, struct list *update, struct stream if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_make_ls_upd: List Iteration"); - lsa = getdata (node); - assert (lsa); + lsa = listgetdata (node); + assert (lsa->data); /* Will it fit? */ @@ -2915,9 +2907,9 @@ ospf_make_ls_ack (struct ospf_interface *oi, struct list *ack, struct stream *s) rm_list = list_new (); - for (node = listhead (ack); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ack, node, lsa)) { - lsa = getdata (node); + lsa = listgetdata (node); assert (lsa); if (length + delta > ospf_packet_max (oi)) @@ -2930,10 +2922,11 @@ ospf_make_ls_ack (struct ospf_interface *oi, struct list *ack, struct stream *s) } /* Remove LSA from LS-Ack list. */ - for (node = listhead (rm_list); node; nextnode (node)) + /* XXX: this loop should be removed and the list move done in previous + * loop + */ + for (ALL_LIST_ELEMENTS_RO (rm_list, node, lsa)) { - lsa = (struct ospf_lsa *) getdata (node); - listnode_delete (ack, lsa); ospf_lsa_unlock (lsa); } @@ -3251,9 +3244,7 @@ ospf_ls_upd_packet_new (struct list *update, struct ospf_interface *oi) size_t size; static char warned = 0; - ln = listhead (update); - lsa = getdata (ln); - assert (lsa); + lsa = listgetdata((ln = listhead (update))); assert (lsa->data); if ((OSPF_LS_UPD_MIN_SIZE + ntohs (lsa->data->length)) @@ -3391,9 +3382,10 @@ void ospf_ls_upd_send (struct ospf_neighbor *nbr, struct list *update, int flag) { struct ospf_interface *oi; + struct ospf_lsa *lsa; struct prefix_ipv4 p; struct route_node *rn; - struct listnode *n; + struct listnode *node; oi = nbr->oi; @@ -3428,8 +3420,11 @@ ospf_ls_upd_send (struct ospf_neighbor *nbr, struct list *update, int flag) if (rn->info == NULL) rn->info = list_new (); - for (n = listhead (update); n; nextnode (n)) - listnode_add (rn->info, ospf_lsa_lock (getdata (n))); + for (ALL_LIST_ELEMENTS_RO (update, node, lsa)) + { + ospf_lsa_lock (lsa); + listnode_add (rn->info, lsa); + } if (oi->t_ls_upd_event == NULL) oi->t_ls_upd_event = diff --git a/ospfd/ospf_route.c b/ospfd/ospf_route.c index cf55bf0e..ca39d9b2 100644 --- a/ospfd/ospf_route.c +++ b/ospfd/ospf_route.c @@ -158,10 +158,10 @@ ospf_route_match_same (struct route_table *rt, struct prefix_ipv4 *prefix, /* Check each path. */ for (n1 = listhead (or->paths), n2 = listhead (newor->paths); - n1 && n2; nextnode (n1), nextnode (n2)) + n1 && n2; n1 = listnextnode (n1), n2 = listnextnode (n2)) { - op = getdata (n1); - newop = getdata (n2); + op = listgetdata (n1); + newop = listgetdata (n2); if (! IPV4_ADDR_SAME (&op->nexthop, &newop->nexthop)) return 0; @@ -279,7 +279,7 @@ ospf_intra_route_add (struct route_table *rt, struct vertex *v, struct prefix_ipv4 p; struct ospf_path *path; struct vertex_nexthop *nexthop; - struct listnode *nnode; + struct listnode *node, *nnode; p.family = AF_INET; p.prefix = v->id; @@ -306,9 +306,8 @@ ospf_intra_route_add (struct route_table *rt, struct vertex *v, { or->type = OSPF_DESTINATION_NETWORK; - LIST_LOOP (v->nexthop, nexthop, nnode) + for (ALL_LIST_ELEMENTS (v->nexthop, node, nnode, nexthop)) { - nexthop = getdata (nnode); path = ospf_path_new (); path->nexthop = nexthop->router; listnode_add (or->paths, path); @@ -677,11 +676,8 @@ ospf_route_table_dump (struct route_table *rt) BUFSIZ), ospf_path_type_str[or->path_type], or->cost); - for (pnode = listhead (or->paths); pnode; nextnode (pnode)) - { - path = getdata (pnode); - zlog_debug (" -> %s", inet_ntoa (path->nexthop)); - } + for (ALL_LIST_ELEMENTS_RO (or->paths, pnode, path)) + zlog_debug (" -> %s", inet_ntoa (path->nexthop)); } else zlog_debug ("R %s\t%s\t%s\t%d", @@ -698,9 +694,9 @@ void ospf_terminate () { struct ospf *ospf; - struct listnode *node; + struct listnode *node, *nnode; - LIST_LOOP (om->ospf, ospf, node) + for (ALL_LIST_ELEMENTS (om->ospf, node, nnode, ospf)) { if (ospf->new_table) ospf_route_delete (ospf->new_table); @@ -786,16 +782,13 @@ int ospf_path_exist (struct list *plist, struct in_addr nexthop, struct ospf_interface *oi) { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_path *path; - for (node = listhead (plist); node; nextnode (node)) - { - path = node->data; + for (ALL_LIST_ELEMENTS (plist, node, nnode, path)) + if (IPV4_ADDR_SAME (&path->nexthop, &nexthop) && path->oi == oi) + return 1; - if (IPV4_ADDR_SAME (&path->nexthop, &nexthop) && path->oi == oi) - return 1; - } return 0; } @@ -803,16 +796,14 @@ void ospf_route_copy_nexthops_from_vertex (struct ospf_route *to, struct vertex *v) { - struct listnode *nnode; + struct listnode *node; struct ospf_path *path; struct vertex_nexthop *nexthop; assert (to->paths); - for (nnode = listhead (v->nexthop); nnode; nextnode (nnode)) + for (ALL_LIST_ELEMENTS_RO (v->nexthop, node, nexthop)) { - nexthop = getdata (nnode); - if (nexthop->oi != NULL) { if (! ospf_path_exist (to->paths, nexthop->router, nexthop->oi)) @@ -830,15 +821,12 @@ struct ospf_path * ospf_path_lookup (struct list *plist, struct ospf_path *path) { struct listnode *node; + struct ospf_path *op; - for (node = listhead (plist); node; nextnode (node)) - { - struct ospf_path *op = node->data; - - if (IPV4_ADDR_SAME (&op->nexthop, &path->nexthop) && - IPV4_ADDR_SAME (&op->adv_router, &path->adv_router)) - return op; - } + for (ALL_LIST_ELEMENTS_RO (plist, node, op)) + if (IPV4_ADDR_SAME (&op->nexthop, &path->nexthop) && + IPV4_ADDR_SAME (&op->adv_router, &path->adv_router)) + return op; return NULL; } @@ -846,14 +834,15 @@ ospf_path_lookup (struct list *plist, struct ospf_path *path) void ospf_route_copy_nexthops (struct ospf_route *to, struct list *from) { - struct listnode *node; + struct listnode *node, *nnode; + struct ospf_path *path; assert (to->paths); - for (node = listhead (from); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (from, node, nnode, path)) /* The same routes are just discarded. */ - if (!ospf_path_lookup (to->paths, node->data)) - listnode_add (to->paths, ospf_path_dup (node->data)); + if (!ospf_path_lookup (to->paths, path)) + listnode_add (to->paths, ospf_path_dup (path)); } void @@ -931,7 +920,7 @@ ospf_prune_unreachable_routers (struct route_table *rtrs) { struct route_node *rn, *next; struct ospf_route *or; - struct listnode *node, *nnext; + struct listnode *node, *nnode; struct list *paths; if (IS_DEBUG_OSPF_EVENT) @@ -943,12 +932,8 @@ ospf_prune_unreachable_routers (struct route_table *rtrs) if ((paths = rn->info) == NULL) continue; - for (node = listhead (paths); node; node = nnext) + for (ALL_LIST_ELEMENTS (paths, node, nnode, or)) { - nnext = node->next; - - or = getdata (node); - if (listcount (or->paths) == 0) { if (IS_DEBUG_OSPF_EVENT) diff --git a/ospfd/ospf_snmp.c b/ospfd/ospf_snmp.c index c1994ab4..4ed1fab8 100644 --- a/ospfd/ospf_snmp.c +++ b/ospfd/ospf_snmp.c @@ -499,13 +499,10 @@ ospf_admin_stat (struct ospf *ospf) if (ospf == NULL) return 0; - for (node = listhead (ospf->oiflist); node; nextnode (node)) - { - oi = getdata (node); + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) + if (oi && oi->address) + return 1; - if (oi && oi->address) - return 1; - } return 0; } @@ -624,16 +621,14 @@ ospf_area_lookup_next (struct ospf *ospf, struct in_addr *area_id, int first) node = listhead (ospf->areas); if (node) { - area = getdata (node); + area = listgetdata (node); *area_id = area->area_id; return area; } return NULL; } - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); - if (ntohl (area->area_id.s_addr) > ntohl (area_id->s_addr)) { *area_id = area->area_id; @@ -757,10 +752,8 @@ ospf_stub_area_lookup_next (struct in_addr *area_id, int first) if (ospf == NULL) return NULL; - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - area = getdata (node); - if (area->external_routing == OSPF_AREA_STUB) { if (first) @@ -1401,14 +1394,14 @@ ospf_snmp_if_free (struct ospf_snmp_if *osif) void ospf_snmp_if_delete (struct interface *ifp) { - struct listnode *nn; + struct listnode *node, *nnode; struct ospf_snmp_if *osif; - LIST_LOOP (ospf_snmp_iflist, osif, nn) + for (ALL_LIST_ELEMENTS (ospf_snmp_iflist, node, nnode, osif)) { if (osif->ifp == ifp) { - list_delete_node (ospf_snmp_iflist, nn); + list_delete_node (ospf_snmp_iflist, node); ospf_snmp_if_free (osif); return; } @@ -1418,7 +1411,7 @@ ospf_snmp_if_delete (struct interface *ifp) void ospf_snmp_if_update (struct interface *ifp) { - struct listnode *nn; + struct listnode *node; struct listnode *pn; struct connected *ifc; struct prefix *p; @@ -1433,7 +1426,7 @@ ospf_snmp_if_update (struct interface *ifp) ifindex = 0; /* Lookup first IPv4 address entry. */ - LIST_LOOP (ifp->connected, ifc, nn) + for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, ifc)) { if (CONNECTED_POINTOPOINT_HOST(ifc)) p = ifc->destination; @@ -1451,7 +1444,7 @@ ospf_snmp_if_update (struct interface *ifp) /* Add interface to the list. */ pn = NULL; - LIST_LOOP (ospf_snmp_iflist, osif, nn) + for (ALL_LIST_ELEMENTS_RO (ospf_snmp_iflist, node, osif)) { if (addr) { @@ -1464,7 +1457,7 @@ ospf_snmp_if_update (struct interface *ifp) if (osif->addr.s_addr != 0 || osif->ifindex > ifindex) break; } - pn = nn; + pn = node; } osif = ospf_snmp_if_new (); @@ -1480,10 +1473,10 @@ ospf_snmp_if_update (struct interface *ifp) struct interface * ospf_snmp_if_lookup (struct in_addr *ifaddr, unsigned int *ifindex) { - struct listnode *nn; + struct listnode *node; struct ospf_snmp_if *osif; - LIST_LOOP (ospf_snmp_iflist, osif, nn) + for (ALL_LIST_ELEMENTS_RO (ospf_snmp_iflist, node, osif)) { if (ifaddr->s_addr) { @@ -1511,7 +1504,7 @@ ospf_snmp_if_lookup_next (struct in_addr *ifaddr, unsigned int *ifindex, nn = listhead (ospf_snmp_iflist); if (nn) { - osif = getdata (nn); + osif = listgetdata (nn); *ifaddr = osif->addr; *ifindex = osif->ifindex; return osif->ifp; @@ -1519,7 +1512,7 @@ ospf_snmp_if_lookup_next (struct in_addr *ifaddr, unsigned int *ifindex, return NULL; } - LIST_LOOP (ospf_snmp_iflist, osif, nn) + for (ALL_LIST_ELEMENTS_RO (ospf_snmp_iflist, nn, osif)) { if (ifaddr->s_addr) { @@ -2051,12 +2044,12 @@ struct ospf_neighbor * ospf_snmp_nbr_lookup (struct ospf *ospf, struct in_addr *nbr_addr, unsigned int *ifindex) { - struct listnode *nn; + struct listnode *node, *nnode; struct ospf_interface *oi; struct ospf_neighbor *nbr; struct route_node *rn; - LIST_LOOP (ospf->oiflist, oi, nn) + for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi)) { for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) if ((nbr = rn->info) != NULL @@ -2086,7 +2079,8 @@ ospf_snmp_nbr_lookup_next (struct in_addr *nbr_addr, unsigned int *ifindex, struct ospf *ospf = ospf; ospf = ospf_lookup (); - LIST_LOOP (ospf->oiflist, oi, nn) + + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, nn, oi)) { for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) if ((nbr = rn->info) != NULL diff --git a/ospfd/ospf_spf.c b/ospfd/ospf_spf.c index 9a4e8ffa..c69fc7f1 100644 --- a/ospfd/ospf_spf.c +++ b/ospfd/ospf_spf.c @@ -125,13 +125,14 @@ ospf_vertex_new (struct ospf_lsa *lsa) void ospf_vertex_free (struct vertex *v) { - struct listnode *node; + struct listnode *node, *nnode; + struct vertex_nexthop *nh; list_delete (v->child); if (listcount (v->nexthop) > 0) - for (node = listhead (v->nexthop); node; nextnode (node)) - vertex_nexthop_free (node->data); + for (ALL_LIST_ELEMENTS (v->nexthop, node, nnode, nh)) + vertex_nexthop_free (nh); list_delete (v->nexthop); @@ -155,14 +156,14 @@ ospf_vertex_dump(const char *msg, struct vertex *v, if (print_nexthops) { - struct listnode *nnode; - for (nnode = listhead (v->nexthop); nnode; nextnode (nnode)) + struct listnode *node; + struct vertex_nexthop *nexthop; + + for (ALL_LIST_ELEMENTS_RO (v->nexthop, node, nexthop)) { char buf1[BUFSIZ]; char buf2[BUFSIZ]; - struct vertex_nexthop *nexthop; - nexthop = getdata (nnode); if (nexthop) { zlog_debug (" nexthop %s interface %s parent %s", @@ -179,12 +180,10 @@ ospf_vertex_dump(const char *msg, struct vertex *v, if (print_children) { struct listnode *cnode; - for (cnode = listhead (v->child); cnode; nextnode (cnode)) - { - struct vertex *cv = getdata (cnode); - if (cv) - ospf_vertex_dump(" child:", cv, 0, 0); - } + struct vertex *cv; + + for (ALL_LIST_ELEMENTS_RO (v->child, cnode, cv)) + ospf_vertex_dump(" child:", cv, 0, 0); } } @@ -196,10 +195,8 @@ ospf_vertex_add_parent (struct vertex *v) struct vertex_nexthop *nh; struct listnode *node; - for (node = listhead (v->nexthop); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (v->nexthop, node, nh)) { - nh = (struct vertex_nexthop *) getdata (node); - /* No need to add two links from the same parent. */ if (listnode_lookup (nh->parent->child, v) == NULL) listnode_add (nh->parent->child, v); @@ -296,10 +293,9 @@ ospf_nexthop_add_unique (struct vertex_nexthop *new, struct list *nexthop) int match; match = 0; - for (node = listhead (nexthop); node; nextnode (node)) - { - nh = node->data; + for (ALL_LIST_ELEMENTS_RO (nexthop, node, nh)) + { /* Compare the two entries. */ /* XXX * Comparing the parent preserves the shortest path tree @@ -324,12 +320,11 @@ ospf_nexthop_add_unique (struct vertex_nexthop *new, struct list *nexthop) void ospf_nexthop_merge (struct list *a, struct list *b) { - struct listnode *n; + struct listnode *node, *nnode; + struct vertex_nexthop *nh; - for (n = listhead (b); n; nextnode (n)) - { - ospf_nexthop_add_unique (n->data, a); - } + for (ALL_LIST_ELEMENTS (b, node, nnode, nh)) + ospf_nexthop_add_unique (nh, a); } #define ROUTER_LSA_MIN_SIZE 12 @@ -407,17 +402,14 @@ ospf_spf_consider_nexthop (struct list *nexthops, */ if (nexthops->head != NULL) { - hop = getdata (nexthops->head); + hop = listgetdata (nexthops->head); /* weed out hops with higher cost than the newhop */ if (hop->oi->output_cost > newhop->oi->output_cost) { /* delete the existing nexthops */ - for (ln = nexthops->head; ln; ln = nn) + for (ALL_LIST_ELEMENTS (nexthops, ln, nn, hop)) { - nn = ln->next; - hop = getdata (ln); - listnode_delete (nexthops, hop); vertex_nexthop_free (hop); } @@ -439,7 +431,7 @@ void ospf_nexthop_calculation (struct ospf_area *area, struct vertex *v, struct vertex *w) { - struct listnode *node; + struct listnode *node, *nnode; struct vertex_nexthop *nh, *x; struct ospf_interface *oi = NULL; struct router_lsa_link *l = NULL; @@ -473,11 +465,13 @@ ospf_nexthop_calculation (struct ospf_area *area, if (IS_DEBUG_OSPF_EVENT) { char buf1[BUFSIZ]; + char buf2[BUFSIZ]; + zlog_debug("ospf_nexthop_calculation(): considering link " "type %d link_id %s link_data %s", l->m[0].type, inet_ntop (AF_INET, &l->link_id, buf1, BUFSIZ), - inet_ntop (AF_INET, &l->link_data, buf1, BUFSIZ)); + inet_ntop (AF_INET, &l->link_data, buf2, BUFSIZ)); } if (l->m[0].type == LSA_LINK_TYPE_POINTOPOINT) @@ -580,9 +574,8 @@ ospf_nexthop_calculation (struct ospf_area *area, else if (v->type == OSPF_VERTEX_NETWORK) { /* See if any of V's parents are the root. */ - for (node = listhead (v->nexthop); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (v->nexthop, node, nnode, x)) { - x = (struct vertex_nexthop *) getdata (node); if (x->parent == area->spf) /* connects to root? */ { /* 16.1.1 para 5. ...the parent vertex is a network that @@ -615,9 +608,8 @@ ospf_nexthop_calculation (struct ospf_area *area, * destination simply inherits the set of next hops from the * parent. */ - for (node = listhead (v->nexthop); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (v->nexthop, node, nnode, nh)) { - nh = vertex_nexthop_dup (node->data); nh->parent = v; ospf_nexthop_add_unique (nh, w->nexthop); } @@ -843,20 +835,14 @@ ospf_spf_dump (struct vertex *v, int i) ip_masklen (lsa->mask)); } - for (nnode = listhead (v->nexthop); nnode; nextnode (nnode)) - { - nexthop = getdata (nnode); - if (IS_DEBUG_OSPF_EVENT) - zlog_debug (" nexthop %s", inet_ntoa (nexthop->router)); - } + if (IS_DEBUG_OSPF_EVENT) + for (ALL_LIST_ELEMENTS_RO (v->nexthop, nnode, nexthop)) + zlog_debug (" nexthop %s", inet_ntoa (nexthop->router)); i++; - for (cnode = listhead (v->child); cnode; nextnode (cnode)) - { - v = getdata (cnode); - ospf_spf_dump (v, i); - } + for (ALL_LIST_ELEMENTS_RO (v->child, cnode, v)) + ospf_spf_dump (v, i); } /* Second stage of SPF calculation. */ @@ -864,7 +850,7 @@ void ospf_spf_process_stubs (struct ospf_area *area, struct vertex *v, struct route_table *rt) { - struct listnode *cnode; + struct listnode *cnode, *cnnode; struct vertex *child; if (IS_DEBUG_OSPF_EVENT) @@ -903,10 +889,8 @@ ospf_spf_process_stubs (struct ospf_area *area, struct vertex *v, ospf_vertex_dump("ospf_process_stubs(): after examining links: ", v, 1, 1); - for (cnode = listhead (v->child); cnode; nextnode (cnode)) + for (ALL_LIST_ELEMENTS (v->child, cnode, cnnode, child)) { - child = getdata (cnode); - if (CHECK_FLAG (child->flags, OSPF_VERTEX_PROCESSED)) continue; @@ -921,7 +905,8 @@ ospf_rtrs_free (struct route_table *rtrs) { struct route_node *rn; struct list *or_list; - struct listnode *node; + struct ospf_route *or; + struct listnode *node, *nnode; if (IS_DEBUG_OSPF_EVENT) zlog_debug ("Route: Router Routing Table free"); @@ -929,8 +914,8 @@ ospf_rtrs_free (struct route_table *rtrs) for (rn = route_top (rtrs); rn; rn = route_next (rn)) if ((or_list = rn->info) != NULL) { - for (node = listhead (or_list); node; nextnode (node)) - ospf_route_free (node->data); + for (ALL_LIST_ELEMENTS (or_list, node, nnode, or)) + ospf_route_free (or); list_delete (or_list); @@ -958,10 +943,8 @@ ospf_rtrs_print (struct route_table *rtrs) for (rn = route_top (rtrs); rn; rn = route_next (rn)) if ((or_list = rn->info) != NULL) - for (ln = listhead (or_list); ln; nextnode (ln)) + for (ALL_LIST_ELEMENTS_RO (or_list, ln, or)) { - or = getdata (ln); - switch (or->path_type) { case OSPF_PATH_INTRA_AREA: @@ -982,9 +965,8 @@ ospf_rtrs_print (struct route_table *rtrs) break; } - for (pnode = listhead (or->paths); pnode; nextnode (pnode)) + for (ALL_LIST_ELEMENTS_RO (or->paths, pnode, path)) { - path = getdata (pnode); if (path->nexthop.s_addr == 0) { if (IS_DEBUG_OSPF_EVENT) @@ -1118,7 +1100,8 @@ ospf_spf_calculate_timer (struct thread *thread) { struct ospf *ospf = THREAD_ARG (thread); struct route_table *new_table, *new_rtrs; - struct listnode *node; + struct ospf_area *area; + struct listnode *node, *nnode; if (IS_DEBUG_OSPF_EVENT) zlog_debug ("SPF: Timer (SPF calculation expire)"); @@ -1132,8 +1115,8 @@ ospf_spf_calculate_timer (struct thread *thread) ospf_vl_unapprove (ospf); /* Calculate SPF for each area. */ - for (node = listhead (ospf->areas); node; node = nextnode (node)) - ospf_spf_calculate (node->data, new_table, new_rtrs); + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) + ospf_spf_calculate (area, new_table, new_rtrs); ospf_vl_shut_unapproved (ospf); diff --git a/ospfd/ospf_te.c b/ospfd/ospf_te.c index 0b04c969..582dc433 100644 --- a/ospfd/ospf_te.c +++ b/ospfd/ospf_te.c @@ -252,10 +252,10 @@ out: static struct mpls_te_link * lookup_linkparams_by_ifp (struct interface *ifp) { - struct listnode *node; + struct listnode *node, *nnode; struct mpls_te_link *lp; - LIST_LOOP (OspfMplsTE.iflist, lp, node) + for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) if (lp->ifp == ifp) return lp; @@ -269,7 +269,7 @@ lookup_linkparams_by_instance (struct ospf_lsa *lsa) struct mpls_te_link *lp; unsigned int key = GET_OPAQUE_ID (ntohl (lsa->data->id.s_addr)); - LIST_LOOP (OspfMplsTE.iflist, lp, node) + for (ALL_LIST_ELEMENTS_RO (OspfMplsTE.iflist, node, lp)) if (lp->instance == key) return lp; @@ -282,11 +282,12 @@ ospf_mpls_te_foreach_area ( void (*func)(struct mpls_te_link *lp, enum sched_opcode), enum sched_opcode sched_opcode) { - struct listnode *node, *node2; + struct listnode *node, *nnode; + struct listnode *node2; struct mpls_te_link *lp; struct ospf_area *area; - LIST_LOOP (OspfMplsTE.iflist, lp, node) + for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) { if ((area = lp->area) == NULL) continue; @@ -296,14 +297,14 @@ ospf_mpls_te_foreach_area ( if (func != NULL) (* func)(lp, sched_opcode); - for (node2 = nextnode (node); node2; nextnode (node2)) - if ((lp = getdata (node2)) != NULL) + for (node2 = listnextnode (node); node2; node2 = listnextnode (node2)) + if ((lp = listgetdata (node2)) != NULL) if (lp->area != NULL) if (IPV4_ADDR_SAME (&lp->area->area_id, &area->area_id)) lp->flags |= LPFLG_LOOKUP_DONE; } - LIST_LOOP (OspfMplsTE.iflist, lp, node) + for (ALL_LIST_ELEMENTS_RO (OspfMplsTE.iflist, node, lp)) if (lp->area != NULL) lp->flags &= ~LPFLG_LOOKUP_DONE; @@ -965,7 +966,7 @@ static int ospf_mpls_te_lsa_originate (void *arg) { struct ospf_area *area = (struct ospf_area *) arg; - struct listnode *node; + struct listnode *node, *nnode; struct mpls_te_link *lp; int rc = -1; @@ -976,10 +977,8 @@ ospf_mpls_te_lsa_originate (void *arg) goto out; } - for (node = listhead (OspfMplsTE.iflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) { - if ((lp = getdata (node)) == NULL) - continue; if (lp->area == NULL) continue; if (! IPV4_ADDR_SAME (&lp->area->area_id, &area->area_id)) @@ -1471,7 +1470,7 @@ DEFUN (mpls_te, "Configure MPLS-TE parameters\n" "Enable the MPLS-TE functionality\n") { - struct listnode *node; + struct listnode *node, *nnode; struct mpls_te_link *lp; if (OspfMplsTE.status == enabled) @@ -1488,9 +1487,8 @@ DEFUN (mpls_te, * 1) MPLS-TE was disabled at startup time, but now become enabled. * 2) MPLS-TE was once enabled then disabled, and now enabled again. */ - for (node = listhead (OspfMplsTE.iflist); node; nextnode (node)) - if ((lp = getdata (node)) != NULL) - initialize_linkparams (lp); + for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) + initialize_linkparams (lp); ospf_mpls_te_foreach_area (ospf_mpls_te_lsa_schedule, REORIGINATE_PER_AREA); @@ -1510,7 +1508,7 @@ DEFUN (no_mpls_te, "Configure MPLS-TE parameters\n" "Disable the MPLS-TE functionality\n") { - struct listnode *node; + struct listnode *node, *nnode; struct mpls_te_link *lp; if (OspfMplsTE.status == disabled) @@ -1521,11 +1519,10 @@ DEFUN (no_mpls_te, OspfMplsTE.status = disabled; - for (node = listhead (OspfMplsTE.iflist); node; nextnode (node)) - if ((lp = getdata (node)) != NULL) - if (lp->area != NULL) - if (lp->flags & LPFLG_LSA_ENGAGED) - ospf_mpls_te_lsa_schedule (lp, FLUSH_THIS_LSA); + for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) + if (lp->area != NULL) + if (lp->flags & LPFLG_LSA_ENGAGED) + ospf_mpls_te_lsa_schedule (lp, FLUSH_THIS_LSA); return CMD_SUCCESS; } @@ -1549,7 +1546,7 @@ DEFUN (mpls_te_router_addr, if (ntohs (ra->header.type) == 0 || ntohl (ra->value.s_addr) != ntohl (value.s_addr)) { - struct listnode *node; + struct listnode *node, *nnode; struct mpls_te_link *lp; int need_to_reoriginate = 0; @@ -1558,7 +1555,7 @@ DEFUN (mpls_te_router_addr, if (OspfMplsTE.status == disabled) goto out; - LIST_LOOP (OspfMplsTE.iflist, lp, node) + for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) { if (lp->area == NULL) continue; @@ -1569,8 +1566,8 @@ DEFUN (mpls_te_router_addr, break; } } - for (node = listhead (OspfMplsTE.iflist); node; nextnode (node)) - LIST_LOOP (OspfMplsTE.iflist, lp, node) + + for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) { if (lp->area == NULL) continue; @@ -1868,13 +1865,13 @@ DEFUN (show_mpls_te_link, "Interface name\n") { struct interface *ifp; - struct listnode *node; + struct listnode *node, *nnode; /* Show All Interfaces. */ if (argc == 0) { - LIST_LOOP (iflist, ifp, node) - show_mpls_te_link_sub (vty, ifp); + for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp)) + show_mpls_te_link_sub (vty, ifp); } /* Interface name is specified. */ else diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c index c0e1f6ce..55b33150 100644 --- a/ospfd/ospf_vty.c +++ b/ospfd/ospf_vty.c @@ -2319,6 +2319,7 @@ DEFUN (ospf_auto_cost_reference_bandwidth, struct ospf *ospf = vty->index; u_int32_t refbw; struct listnode *node; + struct interface *ifp; refbw = strtol (argv[0], NULL, 10); if (refbw < 1 || refbw > 4294967) @@ -2335,8 +2336,8 @@ DEFUN (ospf_auto_cost_reference_bandwidth, vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE); vty_out (vty, " Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE); - for (node = listhead (om->iflist); node; nextnode (node)) - ospf_if_recalculate_output_cost (getdata (node)); + for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp)) + ospf_if_recalculate_output_cost (ifp); return CMD_SUCCESS; } @@ -2349,7 +2350,8 @@ DEFUN (no_ospf_auto_cost_reference_bandwidth, "Use reference bandwidth method to assign OSPF cost\n") { struct ospf *ospf = vty->index; - struct listnode *node; + struct listnode *node, *nnode; + struct interface *ifp; if (ospf->ref_bandwidth == OSPF_DEFAULT_REF_BANDWIDTH) return CMD_SUCCESS; @@ -2358,8 +2360,8 @@ DEFUN (no_ospf_auto_cost_reference_bandwidth, vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE); vty_out (vty, " Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE); - for (node = listhead (om->iflist); node; nextnode (node)) - ospf_if_recalculate_output_cost (getdata (node)); + for (ALL_LIST_ELEMENTS (om->iflist, node, nnode, ifp)) + ospf_if_recalculate_output_cost (ifp); return CMD_SUCCESS; } @@ -2499,7 +2501,7 @@ DEFUN (show_ip_ospf, IP_STR "OSPF information\n") { - struct listnode *node; + struct listnode *node, *nnode; struct ospf_area * area; struct ospf *ospf; @@ -2562,9 +2564,8 @@ DEFUN (show_ip_ospf, listcount (ospf->areas), VTY_NEWLINE, VTY_NEWLINE); /* Show each area status. */ - for (node = listhead (ospf->areas); node; nextnode (node)) - if ((area = getdata (node)) != NULL) - show_ip_ospf_area (vty, area); + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) + show_ip_ospf_area (vty, area); return CMD_SUCCESS; } @@ -2708,8 +2709,8 @@ DEFUN (show_ip_ospf_interface, /* Show All Interfaces. */ if (argc == 0) - for (node = listhead (iflist); node; nextnode (node)) - show_ip_ospf_interface_sub (vty, ospf, node->data); + for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp)) + show_ip_ospf_interface_sub (vty, ospf, ifp); /* Interface name is specified. */ else { @@ -2764,6 +2765,7 @@ DEFUN (show_ip_ospf_neighbor, "Neighbor list\n") { struct ospf *ospf; + struct ospf_interface *oi; struct listnode *node; ospf = ospf_lookup (); @@ -2778,8 +2780,8 @@ DEFUN (show_ip_ospf_neighbor, "Time Address Interface RXmtL " "RqstL DBsmL%s", VTY_NEWLINE, VTY_NEWLINE); - for (node = listhead (ospf->oiflist); node; nextnode (node)) - show_ip_ospf_neighbor_sub (vty, getdata (node)); + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) + show_ip_ospf_neighbor_sub (vty, oi); return CMD_SUCCESS; } @@ -2795,6 +2797,7 @@ DEFUN (show_ip_ospf_neighbor_all, { struct ospf *ospf = vty->index; struct listnode *node; + struct ospf_interface *oi; if (ospf == NULL) { @@ -2807,20 +2810,16 @@ DEFUN (show_ip_ospf_neighbor_all, "Time Address Interface RXmtL " "RqstL DBsmL%s", VTY_NEWLINE, VTY_NEWLINE); - for (node = listhead (ospf->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) { - struct ospf_interface *oi = getdata (node); struct listnode *nbr_node; + struct ospf_nbr_nbma *nbr_nbma; show_ip_ospf_neighbor_sub (vty, oi); /* print Down neighbor status */ - for (nbr_node = listhead (oi->nbr_nbma); nbr_node; nextnode (nbr_node)) + for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nbr_node, nbr_nbma)) { - struct ospf_nbr_nbma *nbr_nbma; - - nbr_nbma = getdata (nbr_node); - if (nbr_nbma->nbr == NULL || nbr_nbma->nbr->state == NSM_Down) { @@ -2980,6 +2979,7 @@ DEFUN (show_ip_ospf_neighbor_id, struct ospf *ospf; struct listnode *node; struct ospf_neighbor *nbr; + struct ospf_interface *oi; struct in_addr router_id; int ret; @@ -2997,16 +2997,12 @@ DEFUN (show_ip_ospf_neighbor_id, return CMD_SUCCESS; } - for (node = listhead (ospf->oiflist); node; nextnode (node)) - { - struct ospf_interface *oi = getdata (node); - - if ((nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &router_id))) - { - show_ip_ospf_neighbor_detail_sub (vty, oi, nbr); - return CMD_SUCCESS; - } - } + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) + if ((nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &router_id))) + { + show_ip_ospf_neighbor_detail_sub (vty, oi, nbr); + return CMD_SUCCESS; + } /* Nothing to show. */ return CMD_SUCCESS; @@ -3022,6 +3018,7 @@ DEFUN (show_ip_ospf_neighbor_detail, "detail of all neighbors\n") { struct ospf *ospf; + struct ospf_interface *oi; struct listnode *node; ospf = ospf_lookup (); @@ -3031,9 +3028,8 @@ DEFUN (show_ip_ospf_neighbor_detail, return CMD_SUCCESS; } - for (node = listhead (ospf->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) { - struct ospf_interface *oi = getdata (node); struct route_node *rn; struct ospf_neighbor *nbr; @@ -3059,6 +3055,7 @@ DEFUN (show_ip_ospf_neighbor_detail_all, { struct ospf *ospf; struct listnode *node; + struct ospf_interface *oi; ospf = ospf_lookup (); if (ospf == NULL) @@ -3067,11 +3064,11 @@ DEFUN (show_ip_ospf_neighbor_detail_all, return CMD_SUCCESS; } - for (node = listhead (ospf->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) { - struct ospf_interface *oi = getdata (node); struct route_node *rn; 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)) @@ -3083,13 +3080,10 @@ DEFUN (show_ip_ospf_neighbor_detail_all, { struct listnode *nd; - for (nd = listhead (oi->nbr_nbma); nd; nextnode (nd)) - { - struct ospf_nbr_nbma *nbr_nbma = getdata (nd); - if (nbr_nbma->nbr == NULL - || nbr_nbma->nbr->state == NSM_Down) - show_ip_ospf_nbr_nbma_detail_sub (vty, oi, nbr_nbma); - } + for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nd, nbr_nbma)) + if (nbr_nbma->nbr == NULL + || nbr_nbma->nbr->state == NSM_Down) + show_ip_ospf_nbr_nbma_detail_sub (vty, oi, nbr_nbma); } } @@ -3609,7 +3603,8 @@ show_lsa_detail (struct vty *vty, struct ospf *ospf, int type, struct in_addr *id, struct in_addr *adv_router) { struct listnode *node; - + struct ospf_area *area; + switch (type) { case OSPF_AS_EXTERNAL_LSA: @@ -3622,9 +3617,8 @@ show_lsa_detail (struct vty *vty, struct ospf *ospf, int type, show_lsa_detail_proc (vty, AS_LSDB (ospf, type), id, adv_router); break; default: - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - struct ospf_area *area = node->data; vty_out (vty, "%s %s (Area %s)%s%s", VTY_NEWLINE, show_database_desc[type], ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE); @@ -3658,6 +3652,7 @@ show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type, struct in_addr *adv_router) { struct listnode *node; + struct ospf_area *area; switch (type) { @@ -3672,9 +3667,8 @@ show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type, adv_router); break; default: - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - struct ospf_area *area = node->data; vty_out (vty, "%s %s (Area %s)%s%s", VTY_NEWLINE, show_database_desc[type], ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE); @@ -3690,12 +3684,12 @@ show_ip_ospf_database_summary (struct vty *vty, struct ospf *ospf, int self) { struct ospf_lsa *lsa; struct route_node *rn; + struct ospf_area *area; struct listnode *node; int type; - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - struct ospf_area *area = node->data; for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++) { switch (type) @@ -3765,17 +3759,16 @@ show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf) vty_out (vty, "%s MaxAge Link States:%s%s", VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE); - for (node = listhead (ospf->maxage_lsa); node; nextnode (node)) - if ((lsa = node->data) != NULL) - { - vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE); - vty_out (vty, "Link State ID: %s%s", - inet_ntoa (lsa->data->id), VTY_NEWLINE); - vty_out (vty, "Advertising Router: %s%s", - inet_ntoa (lsa->data->adv_router), VTY_NEWLINE); - vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE); - vty_out (vty, "%s", VTY_NEWLINE); - } + for (ALL_LIST_ELEMENTS_RO (ospf->maxage_lsa, node, lsa)) + { + vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE); + vty_out (vty, "Link State ID: %s%s", + inet_ntoa (lsa->data->id), VTY_NEWLINE); + vty_out (vty, "Advertising Router: %s%s", + inet_ntoa (lsa->data->adv_router), VTY_NEWLINE); + vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE); + vty_out (vty, "%s", VTY_NEWLINE); + } } #define OSPF_LSA_TYPE_NSSA_DESC "NSSA external link state\n" @@ -6509,7 +6502,7 @@ show_ip_ospf_route_network (struct vty *vty, struct route_table *rt) { struct route_node *rn; struct ospf_route *or; - struct listnode *pnode; + struct listnode *pnode, *pnnode; struct ospf_path *path; vty_out (vty, "============ OSPF network routing table ============%s", @@ -6540,7 +6533,7 @@ show_ip_ospf_route_network (struct vty *vty, struct route_table *rt) } if (or->type == OSPF_DESTINATION_NETWORK) - LIST_LOOP (or->paths, path, pnode) + for (ALL_LIST_ELEMENTS (or->paths, pnode, pnnode, path)) { if (path->oi != NULL) { @@ -6562,7 +6555,8 @@ show_ip_ospf_route_router (struct vty *vty, struct route_table *rtrs) { struct route_node *rn; struct ospf_route *or; - struct listnode *pn, *nn; + struct listnode *pnode; + struct listnode *node; struct ospf_path *path; vty_out (vty, "============ OSPF router routing table =============%s", @@ -6574,33 +6568,32 @@ show_ip_ospf_route_router (struct vty *vty, struct route_table *rtrs) vty_out (vty, "R %-15s ", inet_ntoa (rn->p.u.prefix4)); - for (nn = listhead ((struct list *) rn->info); nn; nextnode (nn)) - if ((or = getdata (nn)) != NULL) - { - if (flag++) - vty_out (vty, "%24s", ""); - - /* Show path. */ - vty_out (vty, "%s [%d] area: %s", - (or->path_type == OSPF_PATH_INTER_AREA ? "IA" : " "), - or->cost, inet_ntoa (or->u.std.area_id)); - /* Show flags. */ - vty_out (vty, "%s%s%s", - (or->u.std.flags & ROUTER_LSA_BORDER ? ", ABR" : ""), - (or->u.std.flags & ROUTER_LSA_EXTERNAL ? ", ASBR" : ""), - VTY_NEWLINE); - - LIST_LOOP (or->paths, path, pn) - { - if (path->nexthop.s_addr == 0) - vty_out (vty, "%24s directly attached to %s%s", - "", path->oi->ifp->name, VTY_NEWLINE); - else - vty_out (vty, "%24s via %s, %s%s", "", - inet_ntoa (path->nexthop), path->oi->ifp->name, - VTY_NEWLINE); - } - } + for (ALL_LIST_ELEMENTS_RO ((struct list *)rn->info, node, or)) + { + if (flag++) + vty_out (vty, "%24s", ""); + + /* Show path. */ + vty_out (vty, "%s [%d] area: %s", + (or->path_type == OSPF_PATH_INTER_AREA ? "IA" : " "), + or->cost, inet_ntoa (or->u.std.area_id)); + /* Show flags. */ + vty_out (vty, "%s%s%s", + (or->u.std.flags & ROUTER_LSA_BORDER ? ", ABR" : ""), + (or->u.std.flags & ROUTER_LSA_EXTERNAL ? ", ASBR" : ""), + VTY_NEWLINE); + + for (ALL_LIST_ELEMENTS_RO (or->paths, pnode, path)) + { + if (path->nexthop.s_addr == 0) + vty_out (vty, "%24s directly attached to %s%s", + "", path->oi->ifp->name, VTY_NEWLINE); + else + vty_out (vty, "%24s via %s, %s%s", "", + inet_ntoa (path->nexthop), path->oi->ifp->name, + VTY_NEWLINE); + } + } } vty_out (vty, "%s", VTY_NEWLINE); } @@ -6610,7 +6603,7 @@ show_ip_ospf_route_external (struct vty *vty, struct route_table *rt) { struct route_node *rn; struct ospf_route *er; - struct listnode *pnode; + struct listnode *pnode, *pnnode; struct ospf_path *path; vty_out (vty, "============ OSPF external routing table ===========%s", @@ -6634,7 +6627,7 @@ show_ip_ospf_route_external (struct vty *vty, struct route_table *rt) break; } - LIST_LOOP (er->paths, path, pnode) + for (ALL_LIST_ELEMENTS (er->paths, pnode, pnnode, path)) { if (path->oi != NULL) { @@ -6770,10 +6763,8 @@ config_write_interface (struct vty *vty) struct route_node *rn = NULL; struct ospf_if_params *params; - for (n1 = listhead (iflist); n1; nextnode (n1)) + for (ALL_LIST_ELEMENTS_RO (iflist, n1, ifp)) { - ifp = getdata (n1); - if (memcmp (ifp->name, "VLINK", 5) == 0) continue; @@ -6849,9 +6840,8 @@ config_write_interface (struct vty *vty) } /* Cryptographic Authentication Key print. */ - for (n2 = listhead (params->auth_crypt); n2; nextnode (n2)) + for (ALL_LIST_ELEMENTS_RO (params->auth_crypt, n2, ck)) { - ck = getdata (n2); vty_out (vty, " ip ospf message-digest-key %d md5 %s", ck->key_id, ck->auth_key); if (params != IF_DEF_PARAMS (ifp)) @@ -6977,12 +6967,12 @@ int config_write_ospf_area (struct vty *vty, struct ospf *ospf) { struct listnode *node; + struct ospf_area *area; u_char buf[INET_ADDRSTRLEN]; /* Area configuration print. */ - for (node = listhead (ospf->areas); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) { - struct ospf_area *area = getdata (node); struct route_node *rn1; area_id2str ((char *) buf, INET_ADDRSTRLEN, area); @@ -7103,14 +7093,14 @@ int config_write_virtual_link (struct vty *vty, struct ospf *ospf) { struct listnode *node; + struct ospf_vl_data *vl_data; u_char buf[INET_ADDRSTRLEN]; /* Virtual-Link print */ - for (node = listhead (ospf->vlinks); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data)) { struct listnode *n2; struct crypt_key *ck; - struct ospf_vl_data *vl_data = getdata (node); struct ospf_interface *oi; if (vl_data != NULL) @@ -7148,14 +7138,13 @@ config_write_virtual_link (struct vty *vty, struct ospf *ospf) IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple, VTY_NEWLINE); /* md5 keys */ - for (n2 = listhead (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_crypt); n2; nextnode (n2)) - { - ck = getdata (n2); - vty_out (vty, " area %s virtual-link %s message-digest-key %d md5 %s%s", - buf, - inet_ntoa (vl_data->vl_peer), - ck->key_id, ck->auth_key, VTY_NEWLINE); - } + for (ALL_LIST_ELEMENTS_RO (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_crypt, + n2, ck)) + vty_out (vty, " area %s virtual-link %s" + " message-digest-key %d md5 %s%s", + buf, + inet_ntoa (vl_data->vl_peer), + ck->key_id, ck->auth_key, VTY_NEWLINE); } } @@ -7281,6 +7270,8 @@ int ospf_config_write (struct vty *vty) { struct ospf *ospf; + struct interface *ifp; + struct ospf_interface *oi; struct listnode *node; int write = 0; @@ -7329,28 +7320,17 @@ ospf_config_write (struct vty *vty) config_write_ospf_redistribute (vty, ospf); /* passive-interface print. */ - for (node = listhead (om->iflist); node; nextnode (node)) - { - struct interface *ifp = getdata (node); - - if (!ifp) - continue; - if (IF_DEF_PARAMS (ifp)->passive_interface == OSPF_IF_PASSIVE) - vty_out (vty, " passive-interface %s%s", - ifp->name, VTY_NEWLINE); - } - - for (node = listhead (ospf->oiflist); node; nextnode (node)) - { - struct ospf_interface *oi = getdata (node); - - if (OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface) && - oi->params->passive_interface == OSPF_IF_PASSIVE) - vty_out (vty, " passive-interface %s %s%s", - oi->ifp->name, - inet_ntoa (oi->address->u.prefix4), VTY_NEWLINE); - } - + for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp)) + if (IF_DEF_PARAMS (ifp)->passive_interface == OSPF_IF_PASSIVE) + vty_out (vty, " passive-interface %s%s", + ifp->name, VTY_NEWLINE); + + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) + if (OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface) && + oi->params->passive_interface == OSPF_IF_PASSIVE) + vty_out (vty, " passive-interface %s %s%s", + oi->ifp->name, + inet_ntoa (oi->address->u.prefix4), VTY_NEWLINE); /* Network area print. */ config_write_network_area (vty, ospf); diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c index 27299c59..e8513b39 100644 --- a/ospfd/ospf_zebra.c +++ b/ospfd/ospf_zebra.c @@ -359,10 +359,8 @@ ospf_zebra_add (struct prefix_ipv4 *p, struct ospf_route *or) stream_putc (s, or->paths->count); /* Nexthop, ifindex, distance and metric information. */ - for (node = listhead (or->paths); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (or->paths, node, path)) { - path = getdata (node); - if (path->nexthop.s_addr != INADDR_ANY) { stream_putc (s, ZEBRA_NEXTHOP_IPV4); @@ -409,7 +407,7 @@ ospf_zebra_delete (struct prefix_ipv4 *p, struct ospf_route *or) struct zapi_ipv4 api; struct ospf_path *path; struct in_addr *nexthop; - struct listnode *node; + struct listnode *node, *nnode; if (zclient->redist[ZEBRA_ROUTE_OSPF]) { @@ -419,10 +417,8 @@ ospf_zebra_delete (struct prefix_ipv4 *p, struct ospf_route *or) api.ifindex_num = 0; api.nexthop_num = 0; - for (node = listhead (or->paths); node; nextnode (node)) + for (ALL_LIST_ELEMENTS (or->paths, node, nnode, path)) { - path = getdata (node); - if (path->nexthop.s_addr != INADDR_ANY) { SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP); @@ -1027,21 +1023,20 @@ ospf_filter_update (struct access_list *access) } /* Update Area access-list. */ - for (node = listhead (ospf->areas); node; nextnode (node)) - if ((area = getdata (node)) != NULL) - { - if (EXPORT_NAME (area)) - { - EXPORT_LIST (area) = NULL; - abr_inv++; - } + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) + { + if (EXPORT_NAME (area)) + { + EXPORT_LIST (area) = NULL; + abr_inv++; + } - if (IMPORT_NAME (area)) - { - IMPORT_LIST (area) = NULL; - abr_inv++; - } - } + if (IMPORT_NAME (area)) + { + IMPORT_LIST (area) = NULL; + abr_inv++; + } + } /* Schedule ABR tasks -- this will be changed -- takada. */ if (IS_OSPF_ABR (ospf) && abr_inv) @@ -1077,27 +1072,26 @@ ospf_prefix_list_update (struct prefix_list *plist) } /* Update area filter-lists. */ - for (node = listhead (ospf->areas); node; nextnode (node)) - if ((area = getdata (node)) != NULL) - { - /* Update filter-list in. */ - if (PREFIX_NAME_IN (area)) - if (strcmp (PREFIX_NAME_IN (area), plist->name) == 0) - { - PREFIX_LIST_IN (area) = - prefix_list_lookup (AFI_IP, PREFIX_NAME_IN (area)); - abr_inv++; - } + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) + { + /* Update filter-list in. */ + if (PREFIX_NAME_IN (area)) + if (strcmp (PREFIX_NAME_IN (area), plist->name) == 0) + { + PREFIX_LIST_IN (area) = + prefix_list_lookup (AFI_IP, PREFIX_NAME_IN (area)); + abr_inv++; + } - /* Update filter-list out. */ - if (PREFIX_NAME_OUT (area)) - if (strcmp (PREFIX_NAME_OUT (area), plist->name) == 0) - { - PREFIX_LIST_IN (area) = - prefix_list_lookup (AFI_IP, PREFIX_NAME_OUT (area)); - abr_inv++; - } - } + /* Update filter-list out. */ + if (PREFIX_NAME_OUT (area)) + if (strcmp (PREFIX_NAME_OUT (area), plist->name) == 0) + { + PREFIX_LIST_IN (area) = + prefix_list_lookup (AFI_IP, PREFIX_NAME_OUT (area)); + abr_inv++; + } + } /* Schedule ABR task. */ if (IS_OSPF_ABR (ospf) && abr_inv) diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c index a77fb4b1..cbc3d13d 100644 --- a/ospfd/ospfd.c +++ b/ospfd/ospfd.c @@ -75,6 +75,7 @@ void ospf_router_id_update (struct ospf *ospf) { struct in_addr router_id, router_id_old; + struct ospf_interface *oi; struct listnode *node; if (IS_DEBUG_OSPF_EVENT) @@ -94,13 +95,9 @@ ospf_router_id_update (struct ospf *ospf) if (!IPV4_ADDR_SAME (&router_id_old, &router_id)) { - for (node = listhead (ospf->oiflist); node; nextnode (node)) - { - struct ospf_interface *oi = getdata (node); - - /* Update self-neighbor's router_id. */ - oi->nbr_self->router_id = router_id; - } + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) + /* Update self-neighbor's router_id. */ + oi->nbr_self->router_id = router_id; /* If AS-external-LSA is queued, then flush those LSAs. */ if (router_id_old.s_addr == 0 && ospf->external_origin) @@ -228,7 +225,7 @@ ospf_lookup () if (listcount (om->ospf) == 0) return NULL; - return getdata (listhead (om->ospf)); + return listgetdata (listhead (om->ospf)); } void @@ -271,7 +268,10 @@ ospf_finish (struct ospf *ospf) struct route_node *rn; struct ospf_nbr_nbma *nbr_nbma; struct ospf_lsa *lsa; - struct listnode *node; + struct ospf_interface *oi; + struct ospf_area *area; + struct ospf_vl_data *vl_data; + struct listnode *node, *nnode; int i; #ifdef HAVE_OPAQUE_LSA @@ -282,33 +282,17 @@ ospf_finish (struct ospf *ospf) for (i = 0; i < ZEBRA_ROUTE_MAX; i++) ospf_redistribute_unset (ospf, i); - for (node = listhead (ospf->areas); node;) - { - struct ospf_area *area = getdata (node); - nextnode (node); - - ospf_remove_vls_through_area (ospf, area); - } + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) + ospf_remove_vls_through_area (ospf, area); - for (node = listhead (ospf->vlinks); node; ) - { - struct ospf_vl_data *vl_data = node->data; - nextnode (node); - - ospf_vl_delete (ospf, vl_data); - } + for (ALL_LIST_ELEMENTS (ospf->vlinks, node, nnode, vl_data)) + ospf_vl_delete (ospf, vl_data); list_delete (ospf->vlinks); /* Reset interface. */ - for (node = listhead (ospf->oiflist); node;) - { - struct ospf_interface *oi = getdata (node); - nextnode (node); - - if (oi) - ospf_if_free (oi); - } + for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi)) + ospf_if_free (oi); /* Clear static neighbors */ for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn)) @@ -346,11 +330,8 @@ ospf_finish (struct ospf *ospf) } } - for (node = listhead (ospf->areas); node;) + for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area)) { - struct ospf_area *area = getdata (node); - nextnode (node); - listnode_delete (ospf->areas, area); ospf_area_free (area); } @@ -382,8 +363,8 @@ ospf_finish (struct ospf *ospf) ospf_lsdb_delete_all (ospf->lsdb); ospf_lsdb_free (ospf->lsdb); - for (node = listhead (ospf->maxage_lsa); node; nextnode (node)) - ospf_lsa_unlock (getdata (node)); + for (ALL_LIST_ELEMENTS (ospf->maxage_lsa, node, nnode, lsa)) + ospf_lsa_unlock (lsa); list_delete (ospf->maxage_lsa); @@ -565,13 +546,9 @@ ospf_area_lookup_by_area_id (struct ospf *ospf, struct in_addr area_id) struct ospf_area *area; struct listnode *node; - for (node = listhead (ospf->areas); node; nextnode (node)) - { - area = getdata (node); - - if (IPV4_ADDR_SAME (&area->area_id, &area_id)) - return area; - } + for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area)) + if (IPV4_ADDR_SAME (&area->area_id, &area_id)) + return area; return NULL; } @@ -728,6 +705,7 @@ void ospf_network_run (struct ospf *ospf, struct prefix *p, struct ospf_area *area) { struct interface *ifp; + struct connected *co; struct listnode *node; /* Schedule Router ID Update. */ @@ -739,21 +717,17 @@ ospf_network_run (struct ospf *ospf, struct prefix *p, struct ospf_area *area) } /* Get target interface. */ - for (node = listhead (om->iflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp)) { - struct listnode *cn; + struct listnode *cnode; - if ((ifp = getdata (node)) == NULL) - continue; - if (memcmp (ifp->name, "VLINK", 5) == 0) continue; /* if interface prefix is match specified prefix, then create socket and join multicast group. */ - for (cn = listhead (ifp->connected); cn; nextnode (cn)) + for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, co)) { - struct connected *co = getdata (cn); struct prefix *addr; if (CHECK_FLAG(co->flags,ZEBRA_IFA_SECONDARY)) @@ -768,7 +742,7 @@ ospf_network_run (struct ospf *ospf, struct prefix *p, struct ospf_area *area) && ! ospf_if_is_configured (ospf, &(addr->u.prefix4)) && ospf_network_match_iface(co,p)) { - struct ospf_interface *oi; + struct ospf_interface *oi; oi = ospf_if_new (ospf, ifp, co->address); oi->connected = co; @@ -829,7 +803,7 @@ void ospf_ls_upd_queue_empty (struct ospf_interface *oi) { struct route_node *rn; - struct listnode *node; + struct listnode *node, *nnode; struct list *lst; struct ospf_lsa *lsa; @@ -838,9 +812,8 @@ ospf_ls_upd_queue_empty (struct ospf_interface *oi) rn = route_next (rn)) if ((lst = (struct list *) rn->info)) { - for (node = listhead (lst); node; nextnode (node)) - if ((lsa = getdata (node))) - ospf_lsa_unlock (lsa); + for (ALL_LIST_ELEMENTS (lst, node, nnode, lsa)) + ospf_lsa_unlock (lsa); list_free (lst); rn->info = NULL; } @@ -857,10 +830,10 @@ void ospf_if_update (struct ospf *ospf) { struct route_node *rn; - struct listnode *node; - struct listnode *next; + struct listnode *node, *nnode; struct ospf_network *network; struct ospf_area *area; + struct ospf_interface *oi; if (ospf != NULL) { @@ -874,14 +847,11 @@ ospf_if_update (struct ospf *ospf) } /* Find interfaces that not configured already. */ - for (node = listhead (ospf->oiflist); node; node = next) + for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi)) { int found = 0; - struct ospf_interface *oi = getdata (node); struct connected *co = oi->connected; - next = nextnode (node); - if (oi->type == OSPF_IFTYPE_VIRTUALLINK) continue; @@ -916,16 +886,12 @@ ospf_if_update (struct ospf *ospf) void ospf_remove_vls_through_area (struct ospf *ospf, struct ospf_area *area) { - struct listnode *node, *next; + struct listnode *node, *nnode; struct ospf_vl_data *vl_data; - for (node = listhead (ospf->vlinks); node; node = next) - { - next = node->next; - if ((vl_data = getdata (node)) != NULL) - if (IPV4_ADDR_SAME (&vl_data->vl_area_id, &area->area_id)) - ospf_vl_delete (ospf, vl_data); - } + for (ALL_LIST_ELEMENTS (ospf->vlinks, node, nnode, vl_data)) + if (IPV4_ADDR_SAME (&vl_data->vl_area_id, &area->area_id)) + ospf_vl_delete (ospf, vl_data); } @@ -960,40 +926,35 @@ ospf_area_type_set (struct ospf_area *area, int type) switch (area->external_routing) { case OSPF_AREA_DEFAULT: - for (node = listhead (area->oiflist); node; nextnode (node)) - if ((oi = getdata (node)) != NULL) - if (oi->nbr_self != NULL) - { - UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP); - SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E); - } + for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi)) + if (oi->nbr_self != NULL) + { + UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP); + SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E); + } break; case OSPF_AREA_STUB: - for (node = listhead (area->oiflist); node; nextnode (node)) - if ((oi = getdata (node)) != NULL) - if (oi->nbr_self != NULL) - { - if (IS_DEBUG_OSPF_EVENT) - zlog_debug ("setting options on %s accordingly", IF_NAME (oi)); - UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP); - UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E); - if (IS_DEBUG_OSPF_EVENT) - zlog_debug ("options set on %s: %x", - IF_NAME (oi), OPTIONS (oi)); - } + for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi)) + if (oi->nbr_self != NULL) + { + if (IS_DEBUG_OSPF_EVENT) + zlog_debug ("setting options on %s accordingly", IF_NAME (oi)); + UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP); + UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E); + if (IS_DEBUG_OSPF_EVENT) + zlog_debug ("options set on %s: %x", + IF_NAME (oi), OPTIONS (oi)); + } break; case OSPF_AREA_NSSA: - for (node = listhead (area->oiflist); node; nextnode (node)) - if ((oi = getdata (node)) != NULL) - if (oi->nbr_self != NULL) - { - if (IS_DEBUG_OSPF_EVENT) - zlog_debug ("setting nssa options on %s accordingly", IF_NAME (oi)); - UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E); - SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP); - if (IS_DEBUG_OSPF_EVENT) - zlog_debug ("options set on %s: %x", IF_NAME (oi), OPTIONS (oi)); - } + for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi)) + if (oi->nbr_self != NULL) + { + zlog_debug ("setting nssa options on %s accordingly", IF_NAME (oi)); + UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E); + SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP); + zlog_debug ("options set on %s: %x", IF_NAME (oi), OPTIONS (oi)); + } break; default: break; @@ -1036,12 +997,9 @@ ospf_area_vlink_count (struct ospf *ospf, struct ospf_area *area) struct listnode *node; int count = 0; - for (node = listhead (ospf->vlinks); node; nextnode (node)) - { - vl = getdata (node); - if (IPV4_ADDR_SAME (&vl->vl_area_id, &area->area_id)) - count++; - } + for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl)) + if (IPV4_ADDR_SAME (&vl->vl_area_id, &area->area_id)) + count++; return count; } @@ -1474,10 +1432,8 @@ ospf_nbr_nbma_lookup_next (struct ospf *ospf, struct in_addr *addr, int first) return NULL; #if 0 - for (node = listhead (ospf->nbr_nbma); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->nbr_nbma, node, nbr_nbma)) { - nbr_nbma = getdata (node); - if (first) { *addr = nbr_nbma->addr; @@ -1516,9 +1472,8 @@ ospf_nbr_nbma_set (struct ospf *ospf, struct in_addr nbr_addr) rn = route_node_get (ospf->nbr_nbma, (struct prefix *)&p); rn->info = nbr_nbma; - for (node = listhead (ospf->oiflist); node; nextnode (node)) + for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) { - oi = getdata (node); if (oi->type == OSPF_IFTYPE_NBMA) if (prefix_match (oi->address, (struct prefix *)&p)) { |