diff options
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)) { |