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