]> git.proxmox.com Git - mirror_frr.git/commitdiff
2005-04-07 Paul Jakma <paul.jakma@sun.com>
authorpaul <paul>
Thu, 7 Apr 2005 07:30:20 +0000 (07:30 +0000)
committerpaul <paul>
Thu, 7 Apr 2005 07:30:20 +0000 (07:30 +0000)
* (global): Fix up list loops to match changes in lib/linklist,
  and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
  Rename getdata macro to listgetdata.
  Rename nextnode to listnextnode and fix its odd behaviour to be
  less dangerous.
  Make listgetdata macro assert node is not null, NULL list entries
          should be bug condition.
          ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
          with for loop, Suggested by Jim Carlson of Sun.
          Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
          "safety" of previous macro.
  LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
  distinguish from the similarly named functions, and reflect their
  effect better.
  Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
  with the old defines which were modified above,
  for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
  scan of the area list, rather than scanning all areas first for
  INTER_ROUTER and then again for INTER_NETWORK. According to
  16.2, the scan should be area specific anyway, and further
  ospf6d does not seem to implement 16.3 anyway.

84 files changed:
ChangeLog
HACKING
bgpd/bgp_network.c
bgpd/bgp_nexthop.c
bgpd/bgp_packet.c
bgpd/bgp_route.c
bgpd/bgp_routemap.c
bgpd/bgp_snmp.c
bgpd/bgp_vty.c
bgpd/bgp_zebra.c
bgpd/bgpd.c
configure.ac
isisd/isis_adjacency.c
isisd/isis_circuit.c
isisd/isis_dr.c
isisd/isis_dynhn.c
isisd/isis_events.c
isisd/isis_flags.c
isisd/isis_lsp.c
isisd/isis_pdu.c
isisd/isis_route.c
isisd/isis_spf.c
isisd/isis_tlv.c
isisd/isis_zebra.c
isisd/isisd.c
lib/ChangeLog
lib/if.c
lib/keychain.c
lib/linklist.c
lib/linklist.h
lib/smux.c
ospf6d/ChangeLog
ospf6d/ospf6_abr.c
ospf6d/ospf6_area.c
ospf6d/ospf6_asbr.c
ospf6d/ospf6_flood.c
ospf6d/ospf6_interface.c
ospf6d/ospf6_intra.c
ospf6d/ospf6_message.c
ospf6d/ospf6_neighbor.c
ospf6d/ospf6_snmp.c
ospf6d/ospf6_spf.c
ospf6d/ospf6_top.c
ospf6d/ospf6d.c
ospf6d/ospf6d.h
ospfd/ospf_abr.c
ospfd/ospf_apiserver.c
ospfd/ospf_ase.c
ospfd/ospf_flood.c
ospfd/ospf_ia.c
ospfd/ospf_interface.c
ospfd/ospf_ism.c
ospfd/ospf_lsa.c
ospfd/ospf_neighbor.c
ospfd/ospf_opaque.c
ospfd/ospf_packet.c
ospfd/ospf_route.c
ospfd/ospf_snmp.c
ospfd/ospf_spf.c
ospfd/ospf_te.c
ospfd/ospf_vty.c
ospfd/ospf_zebra.c
ospfd/ospfd.c
ripd/rip_interface.c
ripd/rip_offset.c
ripd/rip_peer.c
ripd/ripd.c
ripngd/ripng_interface.c
ripngd/ripng_nexthop.c
ripngd/ripng_offset.c
ripngd/ripng_peer.c
ripngd/ripngd.c
vtysh/vtysh_config.c
vtysh/vtysh_user.c
zebra/connected.c
zebra/if_ioctl.c
zebra/if_ioctl_solaris.c
zebra/interface.c
zebra/irdp_interface.c
zebra/irdp_main.c
zebra/redistribute.c
zebra/router-id.c
zebra/rtadv.c
zebra/zserv.c

index 33dc6242a93d261664ee1e076416daf7b3771e9a..0e5a24ca8081bd20332ce75550cdc16b8837659b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2005-04-07 Paul Jakma <paul.jakma@sun.com>
+
+       * (global): Fix up list loops to match changes in lib/linklist, 
+         and some basic auditing of usage.
+       * configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
+       * HACKING: Add notes about deprecating interfaces and commands.
+
 2005-04-05 Paul Jakma <paul@dishone.st>
 
        * HACKING: remove the 'manually patch redhat/quagga.spec' bit
diff --git a/HACKING b/HACKING
index 6f3e03b2c725ac0923e3e96e7133e3fc48eb586b..84972807597308cb957bc03e8dafb5b67a518a80 100644 (file)
--- a/HACKING
+++ b/HACKING
@@ -1,5 +1,5 @@
 -*- mode: text; -*-
-$Id: HACKING,v 1.18 2005/04/05 10:14:50 paul Exp $
+$Id: HACKING,v 1.19 2005/04/07 07:30:20 paul Exp $
 
 GUIDELINES FOR HACKING ON QUAGGA
 
@@ -44,6 +44,32 @@ these header files:
   lib/log.h    logging levels and usage guidance
   [more to be added]
 
+If changing an exported interface, please try to deprecate the interface in
+an orderly manner. If at all possible, try to retain the old deprecated
+interface as is, or functionally equivalent. Make a note of when the
+interface was deprecated and guard the deprecated interface definitions in
+the header file, ie:
+
+/* Deprecated: 20050406 */
+#if !defined(QUAGGA_NO_DEPRECATED_INTERFACES)
+#warning "Using deprecated <libname> (interface(s)|function(s))"
+...
+#endif /* QUAGGA_NO_DEPRECATED_INTERFACES */
+
+To ensure that the core Quagga sources do not use the deprecated interfaces
+(you should update Quagga sources to use new interfaces, if applicable)
+while allowing external sources to continue to build. Deprecated interfaces
+should be excised in the next unstable cycle.
+
+If changing or removing a command definition, *ensure* that you properly
+deprecate it - use the _DEPRECATED form of the appropriate DEFUN macro. This
+is *critical*. Even if the command can no longer function, you *must* still
+implement it as a do-nothing stub. Failure to follow this causes grief for
+systems administrators. Deprecated commands should be excised in the next
+unstable cycle. A list of deprecated commands should be collated for each
+release.
+
+See also below regarding SHARED LIBRARY VERSIONING.
 
 CHANGELOG
 
@@ -79,6 +105,9 @@ If any errors occur, move tags as needed and start over from the fresh
 checkouts.  Do not append to tarballs, as this has produced
 non-standards-conforming tarballs in the past.
 
+[TODO: collation of a list of deprecated commands. Possibly can be scripted
+to extract from vtysh/vtysh_cmd.c]
+
 TOOL VERSIONS
 
 Require versions of support tools are listed in INSTALL.quagga.txt.
index df377835d4b54a5f1a5881ddf11795f94ffa5fd6..e304868736475b0819a7609cc7ba8ba54d0ca61a 100644 (file)
@@ -184,10 +184,8 @@ bgp_update_address (struct interface *ifp)
   struct connected *connected;
   struct listnode *node;
 
-  for (node = listhead (ifp->connected); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, connected))
     {
-      connected = getdata (node);
-
       p = (struct prefix_ipv4 *) connected->address;
 
       if (p->family == AF_INET)
index 76c1c2a13d42aa950af9dff88d8ee0ba0521efa9..df55f326bc0cb124dbedb64b38de92ddb7f95ee8 100644 (file)
@@ -419,7 +419,7 @@ bgp_scan (afi_t afi, safi_t safi)
   struct bgp_info *bi;
   struct bgp_info *next;
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   int valid;
   int current;
   int changed;
@@ -437,7 +437,7 @@ bgp_scan (afi_t afi, safi_t safi)
     return;
 
   /* Maximum prefix check */
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       if (peer->status != Established)
        continue;
@@ -723,13 +723,10 @@ bgp_nexthop_self (afi_t afi, struct attr *attr)
   struct connected *ifc;
   struct prefix *p;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
-
-      for (node2 = listhead (ifp->connected); node2; nextnode (node2))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, node2, ifc))
        {
-         ifc = getdata (node2);
          p = ifc->address;
 
          if (p && p->family == AF_INET 
@@ -1033,7 +1030,7 @@ bgp_import (struct thread *t)
   struct bgp *bgp;
   struct bgp_node *rn;
   struct bgp_static *bgp_static;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   int valid;
   u_int32_t metric;
   struct in_addr nexthop;
@@ -1046,7 +1043,7 @@ bgp_import (struct thread *t)
   if (BGP_DEBUG (events, EVENTS))
     zlog_debug ("Import timer expired.");
 
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
     {
       for (afi = AFI_IP; afi < AFI_MAX; afi++)
        for (safi = SAFI_UNICAST; safi < SAFI_MPLS_VPN; safi++)
index 8f7577be5ae1bceb8bd839fd95cbc64461a84386..9fa23e52ffb7c5beacd3256dc3ae854a9de11c13 100644 (file)
@@ -1121,7 +1121,7 @@ int
 bgp_collision_detect (struct peer *new, struct in_addr remote_id)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct bgp *bgp;
 
   bgp = bgp_get_default ();
@@ -1137,7 +1137,7 @@ bgp_collision_detect (struct peer *new, struct in_addr remote_id)
      OPEN message, then the local system performs the following
      collision resolution procedure: */
 
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       /* Under OpenConfirm status, local peer structure already hold
          remote router ID. */
index 9009638db9017714b11b454d3ea0e5f44e1b9a57..4f3847d66fd6193a2bafc8e50c857126df51f76d 100644 (file)
@@ -1158,7 +1158,7 @@ bgp_process_rsclient (struct bgp *bgp, struct peer *rsclient,
   struct bgp_info_pair old_and_new;
   struct attr attr;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   p = &rn->p;
 
@@ -1170,7 +1170,7 @@ bgp_process_rsclient (struct bgp *bgp, struct peer *rsclient,
   if (CHECK_FLAG(rsclient->sflags, PEER_STATUS_GROUP))
   {
     group = rsclient->group;
-    LIST_LOOP(group->peer, rsclient, nn)
+    for (ALL_LIST_ELEMENTS (group->peer, node, nnode, rsclient))
       {
         /* Nothing to do. */
         if (old_select && old_select == new_select)
@@ -1203,7 +1203,7 @@ bgp_process_main (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
   struct bgp_info *new_select;
   struct bgp_info *old_select;
   struct bgp_info_pair old_and_new;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct peer *peer;
   struct attr attr;
 
@@ -1235,7 +1235,7 @@ bgp_process_main (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
 
 
   /* Check each BGP peer. */
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       bgp_process_announce_selected (peer, new_select, rn, &attr, afi, safi);
     }
@@ -1954,7 +1954,7 @@ bgp_update (struct peer *peer, struct prefix *p, struct attr *attr,
             struct prefix_rd *prd, u_char *tag, int soft_reconfig)
 {
   struct peer *rsclient;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct bgp *bgp;
   int ret;
 
@@ -1964,7 +1964,7 @@ bgp_update (struct peer *peer, struct prefix *p, struct attr *attr,
   bgp = peer->bgp;
 
   /* Process the update for each RS-client. */
-  LIST_LOOP(bgp->rsclient, rsclient, nn)
+  for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
     {
       if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
         bgp_update_rsclient (rsclient, afi, safi, attr, peer, p, type,
@@ -1984,12 +1984,12 @@ bgp_withdraw (struct peer *peer, struct prefix *p, struct attr *attr,
   struct bgp_node *rn;
   struct bgp_info *ri;
   struct peer *rsclient;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   bgp = peer->bgp;
 
   /* Process the withdraw for each RS-client. */
-  LIST_LOOP (bgp->rsclient, rsclient, nn)
+  for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
     {
       if (CHECK_FLAG (rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
         bgp_withdraw_rsclient (rsclient, afi, safi, peer, p, type, sub_type, prd, tag);
@@ -2316,7 +2316,7 @@ bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi)
   struct bgp_node *rn;
   struct bgp_table *table;
   struct peer *rsclient;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (safi != SAFI_MPLS_VPN)
     bgp_clear_route_table (peer, afi, safi, NULL, NULL);
@@ -2326,7 +2326,7 @@ bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi)
       if ((table = rn->info) != NULL)
        bgp_clear_route_table (peer, afi, safi, table, NULL);
 
-  LIST_LOOP (peer->bgp->rsclient, rsclient, nn)
+  for (ALL_LIST_ELEMENTS (peer->bgp->rsclient, node, nnode, rsclient))
     {
       if (CHECK_FLAG(rsclient->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
         bgp_clear_route_table (peer, afi, safi, NULL, rsclient);
@@ -2389,12 +2389,12 @@ void
 bgp_cleanup_routes ()
 {
   struct bgp *bgp;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct bgp_node *rn;
   struct bgp_table *table;
   struct bgp_info *ri;
 
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
     {
       table = bgp->rib[AFI_IP][SAFI_UNICAST];
 
@@ -2884,11 +2884,11 @@ bgp_static_update (struct bgp *bgp, struct prefix *p,
                   struct bgp_static *bgp_static, afi_t afi, safi_t safi)
 {
   struct peer *rsclient;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   bgp_static_update_main (bgp, p, bgp_static, afi, safi);
 
-  LIST_LOOP(bgp->rsclient, rsclient, nn)
+  for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, rsclient))
     {
       bgp_static_update_rsclient (rsclient, p, bgp_static, afi, safi);
     }
@@ -4558,7 +4558,7 @@ bgp_redistribute_add (struct prefix *p, struct in_addr *nexthop,
                      u_int32_t metric, u_char type)
 {
   struct bgp *bgp;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct bgp_info *new;
   struct bgp_info *bi;
   struct bgp_info info;
@@ -4577,7 +4577,7 @@ bgp_redistribute_add (struct prefix *p, struct in_addr *nexthop,
   attr.med = metric;
   attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
 
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
     {
       afi = family2afi (p->family);
 
@@ -4673,12 +4673,12 @@ void
 bgp_redistribute_delete (struct prefix *p, u_char type)
 {
   struct bgp *bgp;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   afi_t afi;
   struct bgp_node *rn;
   struct bgp_info *ri;
 
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
     {
       afi = family2afi (p->family);
 
@@ -5590,7 +5590,7 @@ route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
   struct bgp_info *ri;
   struct prefix *p;
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   char buf1[INET6_ADDRSTRLEN];
   char buf2[INET6_ADDRSTRLEN];
   int count = 0;
@@ -5649,7 +5649,7 @@ route_vty_out_detail_header (struct vty *vty, struct bgp *bgp,
   vty_out (vty, ")%s", VTY_NEWLINE);
 
   /* advertised peer */
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       if (bgp_adj_out_lookup (peer, p, afi, safi, rn))
        {
index b11aaf2350938767609c19d0359594c8370ef5eb..060c68c0d590e8b8281fa6e8ecb77b333afb7451 100644 (file)
@@ -108,7 +108,7 @@ route_match_peer (void *rule, struct prefix *prefix, route_map_object_t type,
   union sockunion *su2;
   struct peer_group *group;
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (type == RMAP_BGP)
     {
@@ -147,7 +147,7 @@ route_match_peer (void *rule, struct prefix *prefix, route_map_object_t type,
       else
         {
           group = peer->group;
-          LIST_LOOP (group->peer, peer, nn)
+          for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
             {
               if (sockunion_same (su, &peer->su))
                 return RMAP_MATCH;
@@ -2181,7 +2181,8 @@ bgp_route_map_update (const char *unused)
   afi_t afi;
   safi_t safi;
   int direct;
-  struct listnode *nn, *nm;
+  struct listnode *node, *nnode;
+  struct listnode *mnode, *mnnode;
   struct bgp *bgp;
   struct peer *peer;
   struct peer_group *group;
@@ -2190,9 +2191,9 @@ bgp_route_map_update (const char *unused)
   struct bgp_static *bgp_static;
 
   /* For neighbor route-map updates. */
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
     {
-      LIST_LOOP (bgp->peer, peer, nm)
+      for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
        {
          for (afi = AFI_IP; afi < AFI_MAX; afi++)
            for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
@@ -2214,7 +2215,7 @@ bgp_route_map_update (const char *unused)
                  filter->usmap.map = NULL;
              }
        }
-      LIST_LOOP (bgp->group, group, nm)
+      for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
        {
          for (afi = AFI_IP; afi < AFI_MAX; afi++)
            for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
@@ -2239,9 +2240,9 @@ bgp_route_map_update (const char *unused)
     }
 
   /* For default-originate route-map updates. */
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
     {
-      LIST_LOOP (bgp->peer, peer, nm)
+      for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
        {
          for (afi = AFI_IP; afi < AFI_MAX; afi++)
            for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
@@ -2256,7 +2257,7 @@ bgp_route_map_update (const char *unused)
     }
 
   /* For network route-map updates. */
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
     {
       for (afi = AFI_IP; afi < AFI_MAX; afi++)
        for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
@@ -2273,7 +2274,7 @@ bgp_route_map_update (const char *unused)
     }
 
   /* For redistribute route-map updates. */
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
     {
       for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
        {
index f2d554dfdf9ee3638e7b5ad028c7df1642028d3a..344358e37379b02c118af47f722330664ece0bf3 100644 (file)
@@ -280,7 +280,7 @@ peer_lookup_addr_ipv4 (struct in_addr *src)
 {
   struct bgp *bgp;
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node;
   struct in_addr addr;
   int ret;
 
@@ -288,7 +288,7 @@ peer_lookup_addr_ipv4 (struct in_addr *src)
   if (! bgp)
     return NULL;
 
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS_RO (bgp->peer, node, peer))
     {
       ret = inet_pton (AF_INET, peer->host, &addr);
       if (ret > 0)
@@ -305,7 +305,7 @@ bgp_peer_lookup_next (struct in_addr *src)
 {
   struct bgp *bgp;
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node;
   struct in_addr *p;
   union sockunion su;
   int ret;
@@ -316,7 +316,7 @@ bgp_peer_lookup_next (struct in_addr *src)
   if (! bgp)
     return NULL;
 
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS_RO (bgp->peer, node, peer))
     {
       ret = inet_pton (AF_INET, peer->host, &su.sin.sin_addr);
       if (ret > 0)
index c4b1ef543b61a006a09861a63e0413b5ae99565a..52025b76f8225f4e53268643b900409d39162682 100644 (file)
@@ -1996,7 +1996,7 @@ peer_rsclient_set_vty (struct vty *vty, const char *peer_str,
   struct bgp *bgp;
   struct peer *peer;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct bgp_filter *pfilter;
   struct bgp_filter *gfilter;
 
@@ -2032,7 +2032,7 @@ peer_rsclient_set_vty (struct vty *vty, const char *peer_str,
       group = peer->group;
       gfilter = &peer->filter[afi][safi];
 
-      LIST_LOOP(group->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
         {
           pfilter = &peer->filter[afi][safi];
 
@@ -2078,7 +2078,7 @@ peer_rsclient_unset_vty (struct vty *vty, const char *peer_str,
   struct bgp *bgp;
   struct peer *peer;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   bgp = vty->index;
 
@@ -2094,7 +2094,7 @@ peer_rsclient_unset_vty (struct vty *vty, const char *peer_str,
     {
       group = peer->group;
 
-      LIST_LOOP (group->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
         {
           ret = peer_af_flag_unset (peer, afi, safi, PEER_FLAG_RSERVER_CLIENT);
           if (ret < 0)
@@ -3967,12 +3967,12 @@ bgp_clear (struct vty *vty, struct bgp *bgp,  afi_t afi, safi_t safi,
 {
   int ret;
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   /* Clear all neighbors. */
   if (sort == clear_all)
     {
-      LIST_LOOP (bgp->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
        {
          if (stype == BGP_CLEAR_SOFT_NONE)
            ret = peer_clear (peer);
@@ -4028,7 +4028,7 @@ bgp_clear (struct vty *vty, struct bgp *bgp,  afi_t afi, safi_t safi,
          return -1; 
        }
 
-      LIST_LOOP (group->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
        {
          if (stype == BGP_CLEAR_SOFT_NONE)
            {
@@ -4049,7 +4049,7 @@ bgp_clear (struct vty *vty, struct bgp *bgp,  afi_t afi, safi_t safi,
 
   if (sort == clear_external)
     {
-      LIST_LOOP (bgp->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
        {
          if (peer_sort (peer) == BGP_PEER_IBGP) 
            continue;
@@ -4081,7 +4081,7 @@ bgp_clear (struct vty *vty, struct bgp *bgp,  afi_t afi, safi_t safi,
        }
       as = (as_t) as_ul;
 
-      LIST_LOOP (bgp->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
        {
          if (peer->as != as) 
            continue;
@@ -6425,7 +6425,7 @@ int
 bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   int count = 0;
   char timebuf[BGP_UPTIME_LEN];
   int len;
@@ -6433,7 +6433,7 @@ bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi)
   /* Header string for each address family. */
   static char header[] = "Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd";
 
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       if (peer->afc[afi][safi])
        {
@@ -7319,11 +7319,11 @@ int
 bgp_show_neighbor (struct vty *vty, struct bgp *bgp,
                   enum show_type type, union sockunion *su)
 {
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct peer *peer;
   int find = 0;
 
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       switch (type)
        {
@@ -7667,13 +7667,13 @@ bgp_write_rsclient_summary (struct vty *vty, struct peer *rsclient,
   char rmbuf[14];
   const char *rmname;
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   int len;
   int count = 0;
 
   if (CHECK_FLAG (rsclient->sflags, PEER_STATUS_GROUP))
     {
-      LIST_LOOP (rsclient->group->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (rsclient->group->peer, node, nnode, peer))
         {
           count++;
           bgp_write_rsclient_summary (vty, peer, afi, safi);
@@ -7732,13 +7732,13 @@ bgp_show_rsclient_summary (struct vty *vty, struct bgp *bgp,
                            afi_t afi, safi_t safi)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   int count = 0;
 
   /* Header string for each address family. */
   static char header[] = "Neighbor        V    AS  Export-Policy  Import-Policy  Up/Down  State";
 
-  LIST_LOOP (bgp->rsclient, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->rsclient, node, nnode, peer))
     {
       if (peer->afc[afi][safi] &&
          CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
index 176e447a376f11a1580101179b4f01225486c250..0c0c8c0c791e38ae6d4e38d470d05870a5ed64ff 100644 (file)
@@ -46,16 +46,16 @@ int
 bgp_router_id_update (int command, struct zclient *zclient, zebra_size_t length)
 {
   struct prefix router_id;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct bgp *bgp;
 
   zebra_router_id_update_read(zclient->ibuf,&router_id);
   router_id_zebra = router_id.u.prefix4;
 
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
     {
       if (!bgp->router_id_static.s_addr)
-      bgp_router_id_set (bgp, &router_id.u.prefix4);
+        bgp_router_id_set (bgp, &router_id.u.prefix4);
     }
 
   return 0;
@@ -92,7 +92,7 @@ bgp_interface_up (int command, struct zclient *zclient, zebra_size_t length)
   struct stream *s;
   struct interface *ifp;
   struct connected *c;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   s = zclient->ibuf;
   ifp = zebra_interface_state_read (s);
@@ -100,11 +100,8 @@ bgp_interface_up (int command, struct zclient *zclient, zebra_size_t length)
   if (! ifp)
     return 0;
 
-  for (node = listhead (ifp->connected); node; nextnode (node))
-    {
-      c = getdata (node);
-      bgp_connected_add (c);
-    }
+  for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, c))
+    bgp_connected_add (c);
 
   return 0;
 }
@@ -115,32 +112,29 @@ bgp_interface_down (int command, struct zclient *zclient, zebra_size_t length)
   struct stream *s;
   struct interface *ifp;
   struct connected *c;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   s = zclient->ibuf;
   ifp = zebra_interface_state_read (s);
   if (! ifp)
     return 0;
 
-  for (node = listhead (ifp->connected); node; nextnode (node))
-    {
-      c = getdata (node);
-      bgp_connected_delete (c);
-    }
+  for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, c))
+    bgp_connected_delete (c);
 
   /* Fast external-failover (Currently IPv4 only) */
   {
-    struct listnode *nn, *nm;
+    struct listnode *mnode;
     struct bgp *bgp;
     struct peer *peer;
     struct interface *peer_if;
 
-    LIST_LOOP (bm->bgp, bgp, nn)
+    for (ALL_LIST_ELEMENTS_RO (bm->bgp, mnode, bgp))
       {
        if (CHECK_FLAG (bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER))
          continue;
 
-       LIST_LOOP (bgp->peer, peer, nm)
+       for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
          {
            if (peer->ttl != 1)
              continue;
@@ -319,13 +313,10 @@ if_lookup_by_ipv4 (struct in_addr *addr)
   p.prefix = *addr;
   p.prefixlen = IPV4_MAX_BITLEN;
 
-  for (ifnode = listhead (iflist); ifnode; nextnode (ifnode))
+  for (ALL_LIST_ELEMENTS_RO (iflist, ifnode, ifp))
     {
-      ifp = getdata (ifnode);
-
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
        {
-         connected = getdata (cnode);
          cp = connected->address;
            
          if (cp->family == AF_INET)
@@ -345,13 +336,10 @@ if_lookup_by_ipv4_exact (struct in_addr *addr)
   struct connected *connected;
   struct prefix *cp; 
   
-  for (ifnode = listhead (iflist); ifnode; nextnode (ifnode))
+  for (ALL_LIST_ELEMENTS_RO (iflist, ifnode, ifp))
     {
-      ifp = getdata (ifnode);
-
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
        {
-         connected = getdata (cnode);
          cp = connected->address;
            
          if (cp->family == AF_INET)
@@ -377,13 +365,10 @@ if_lookup_by_ipv6 (struct in6_addr *addr)
   p.prefix = *addr;
   p.prefixlen = IPV6_MAX_BITLEN;
 
-  for (ifnode = listhead (iflist); ifnode; nextnode (ifnode))
+  for (ALL_LIST_ELEMENTS_RO (iflist, ifnode, ifp))
     {
-      ifp = getdata (ifnode);
-
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
        {
-         connected = getdata (cnode);
          cp = connected->address;
            
          if (cp->family == AF_INET6)
@@ -403,13 +388,10 @@ if_lookup_by_ipv6_exact (struct in6_addr *addr)
   struct connected *connected;
   struct prefix *cp; 
 
-  for (ifnode = listhead (iflist); ifnode; nextnode (ifnode))
+  for (ALL_LIST_ELEMENTS_RO (iflist, ifnode, ifp))
     {
-      ifp = getdata (ifnode);
-
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
        {
-         connected = getdata (cnode);
          cp = connected->address;
            
          if (cp->family == AF_INET6)
@@ -427,9 +409,8 @@ if_get_ipv6_global (struct interface *ifp, struct in6_addr *addr)
   struct connected *connected;
   struct prefix *cp; 
   
-  for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
     {
-      connected = getdata (cnode);
       cp = connected->address;
            
       if (cp->family == AF_INET6)
@@ -449,9 +430,8 @@ if_get_ipv6_local (struct interface *ifp, struct in6_addr *addr)
   struct connected *connected;
   struct prefix *cp; 
   
-  for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
     {
-      connected = getdata (cnode);
       cp = connected->address;
            
       if (cp->family == AF_INET6)
@@ -591,15 +571,12 @@ bgp_ifindex_by_nexthop (struct in6_addr *addr)
   p.prefix = *addr;
   p.prefixlen = IPV6_MAX_BITLEN;
 
-  for (ifnode = listhead (iflist); ifnode; nextnode (ifnode))
+  for (ALL_LIST_ELEMENTS_RO (iflist, ifnode, ifp))
     {
-      ifp = getdata (ifnode);
-
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
        {
          struct prefix *cp; 
 
-         connected = getdata (cnode);
          cp = connected->address;
            
          if (cp->family == AF_INET6)
index f3caf46e9bc06dd326f89ea17bd229c8149cfa33..d1e8d9697010fec2ce76c778a1e6473fb0e3b2fd 100644 (file)
@@ -160,7 +160,7 @@ int
 bgp_router_id_set (struct bgp *bgp, struct in_addr *id)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (bgp_config_check (bgp, BGP_CONFIG_ROUTER_ID)
       && IPV4_ADDR_SAME (&bgp->router_id, id))
@@ -170,7 +170,7 @@ bgp_router_id_set (struct bgp *bgp, struct in_addr *id)
   bgp_config_set (bgp, BGP_CONFIG_ROUTER_ID);
 
   /* Set all peer's local identifier with this value. */
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       IPV4_ADDR_COPY (&peer->local_id, id);
 
@@ -189,7 +189,7 @@ int
 bgp_cluster_id_set (struct bgp *bgp, struct in_addr *cluster_id)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (bgp_config_check (bgp, BGP_CONFIG_CLUSTER_ID)
       && IPV4_ADDR_SAME (&bgp->cluster_id, cluster_id))
@@ -199,7 +199,7 @@ bgp_cluster_id_set (struct bgp *bgp, struct in_addr *cluster_id)
   bgp_config_set (bgp, BGP_CONFIG_CLUSTER_ID);
 
   /* Clear all IBGP peer. */
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       if (peer_sort (peer) != BGP_PEER_IBGP)
        continue;
@@ -218,7 +218,7 @@ int
 bgp_cluster_id_unset (struct bgp *bgp)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! bgp_config_check (bgp, BGP_CONFIG_CLUSTER_ID))
     return 0;
@@ -227,7 +227,7 @@ bgp_cluster_id_unset (struct bgp *bgp)
   bgp_config_unset (bgp, BGP_CONFIG_CLUSTER_ID);
 
   /* Clear all IBGP peer. */
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       if (peer_sort (peer) != BGP_PEER_IBGP)
        continue;
@@ -267,7 +267,7 @@ int
 bgp_confederation_id_set (struct bgp *bgp, as_t as)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   int already_confed;
 
   if (as == 0)
@@ -281,7 +281,7 @@ bgp_confederation_id_set (struct bgp *bgp, as_t as)
   /* If we were doing confederation already, this is just an external
      AS change.  Just Reset EBGP sessions, not CONFED sessions.  If we
      were not doing confederation before, reset all EBGP sessions.  */
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       /* We're looking for peers who's AS is not local or part of our
         confederation.  */
@@ -328,12 +328,12 @@ int
 bgp_confederation_id_unset (struct bgp *bgp)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   bgp->confed_id = 0;
   bgp_config_unset (bgp, BGP_CONFIG_CONFEDERATION);
       
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       /* We're looking for peers who's AS is not local */
       if (peer_sort (peer) != BGP_PEER_IBGP)
@@ -374,7 +374,7 @@ int
 bgp_confederation_peers_add (struct bgp *bgp, as_t as)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! bgp)
     return BGP_ERR_INVALID_BGP;
@@ -398,7 +398,7 @@ bgp_confederation_peers_add (struct bgp *bgp, as_t as)
 
   if (bgp_config_check (bgp, BGP_CONFIG_CONFEDERATION))
     {
-      LIST_LOOP (bgp->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
        {
          if (peer->as == as)
            {
@@ -424,7 +424,7 @@ bgp_confederation_peers_remove (struct bgp *bgp, as_t as)
   int i;
   int j;
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! bgp)
     return -1;
@@ -454,7 +454,7 @@ bgp_confederation_peers_remove (struct bgp *bgp, as_t as)
      CONFED */
   if (bgp_config_check (bgp, BGP_CONFIG_CONFEDERATION))
     {
-      LIST_LOOP (bgp->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
        {
          if (peer->as == as)
            {
@@ -980,13 +980,13 @@ peer_deactivate (struct peer *peer, afi_t afi, safi_t safi)
 {
   struct peer_group *group;
   struct peer *peer1;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
     {
       group = peer->group;
 
-      LIST_LOOP (group->peer, peer1, nn)
+      for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer1))
        {
          if (peer1->af_group[afi][safi])
            return BGP_ERR_PEER_GROUP_MEMBER_EXISTS;
@@ -1233,9 +1233,9 @@ struct peer_group *
 peer_group_lookup (struct bgp *bgp, const char *name)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
-  LIST_LOOP (bgp->group, group, nn)
+  for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
     {
       if (strcmp (group->name, name) == 0)
        return group;
@@ -1528,7 +1528,7 @@ peer_group_remote_as (struct bgp *bgp, const char *group_name, as_t *as)
 {
   struct peer_group *group;
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   group = peer_group_lookup (bgp, group_name);
   if (! group)
@@ -1541,7 +1541,7 @@ peer_group_remote_as (struct bgp *bgp, const char *group_name, as_t *as)
      number must be updated to same number.  */
   peer_as_change (group->conf, *as);
 
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       if (peer->as != *as)
        peer_as_change (peer, *as);
@@ -1555,11 +1555,11 @@ peer_group_delete (struct peer_group *group)
 {
   struct bgp *bgp;
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   bgp = group->bgp;
 
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       peer->group = NULL;
       peer_delete (peer);
@@ -1584,12 +1584,12 @@ int
 peer_group_remote_as_delete (struct peer_group *group)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! group->conf->as)
     return 0;
 
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       peer->group = NULL;
       peer_delete (peer);
@@ -1819,7 +1819,7 @@ struct bgp *
 bgp_get_default ()
 {
   if (bm->bgp->head)
-    return bm->bgp->head->data;
+    return (listgetdata (listhead (bm->bgp)));
   return NULL;
 }
 
@@ -1828,9 +1828,9 @@ struct bgp *
 bgp_lookup (as_t as, const char *name)
 {
   struct bgp *bgp;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
     if (bgp->as == as
        && ((bgp->name == NULL && name == NULL) 
            || (bgp->name && name && strcmp (bgp->name, name) == 0)))
@@ -1843,9 +1843,9 @@ struct bgp *
 bgp_lookup_by_name (const char *name)
 {
   struct bgp *bgp;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
     if ((bgp->name == NULL && name == NULL)
        || (bgp->name && name && strcmp (bgp->name, name) == 0))
       return bgp;
@@ -1912,7 +1912,7 @@ int
 bgp_delete (struct bgp *bgp)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node;
   struct listnode *next;
   afi_t afi;
   safi_t safi;
@@ -1930,12 +1930,8 @@ bgp_delete (struct bgp *bgp)
   bgp->group->del = (void (*)(void *)) peer_group_delete;
   list_delete (bgp->group);
 
-  for (nn = bgp->peer->head; nn; nn = next)
-    {
-      peer = nn->data;
-      next = nn->next;
-      peer_delete (peer);
-    }
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, next, peer))
+    peer_delete (peer);
 
   bgp->rsclient->del = (void (*)(void *)) peer_delete;
   list_delete (bgp->rsclient);
@@ -1964,7 +1960,7 @@ struct peer *
 peer_lookup (struct bgp *bgp, union sockunion *su)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! bgp)
     bgp = bgp_get_default ();
@@ -1972,7 +1968,7 @@ peer_lookup (struct bgp *bgp, union sockunion *su)
   if (! bgp)
     return NULL;
   
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       if (sockunion_same (&peer->su, su)
          && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
@@ -1986,14 +1982,14 @@ peer_lookup_with_open (union sockunion *su, as_t remote_as,
                       struct in_addr *remote_id, int *as)
 {
   struct peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct bgp *bgp;
 
   bgp = bgp_get_default ();
   if (! bgp)
     return NULL;
 
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       if (sockunion_same (&peer->su, su)
          && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
@@ -2005,7 +2001,7 @@ peer_lookup_with_open (union sockunion *su, as_t remote_as,
            *as = 1;
        }
     }
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       if (sockunion_same (&peer->su, su)
          &&  ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
@@ -2231,7 +2227,7 @@ peer_flag_modify (struct peer *peer, u_int32_t flag, int set)
   int found;
   int size;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct peer_flag_action action;
 
   memset (&action, 0, sizeof (struct peer_flag_action));
@@ -2288,7 +2284,7 @@ peer_flag_modify (struct peer *peer, u_int32_t flag, int set)
   /* peer-group member updates. */
   group = peer->group;
 
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       if (set && CHECK_FLAG (peer->flags, flag) == flag)
        continue;
@@ -2333,7 +2329,7 @@ peer_af_flag_modify (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag,
 {
   int found;
   int size;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct peer_group *group;
   struct peer_flag_action action;
 
@@ -2411,7 +2407,7 @@ peer_af_flag_modify (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag,
     {
       group = peer->group;
       
-      LIST_LOOP (group->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
        {
          if (! peer->af_group[afi][safi])
            continue;
@@ -2467,7 +2463,7 @@ int
 peer_ebgp_multihop_set (struct peer *peer, int ttl)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (peer_sort (peer) == BGP_PEER_IBGP)
     return 0;
@@ -2482,7 +2478,7 @@ peer_ebgp_multihop_set (struct peer *peer, int ttl)
   else
     {
       group = peer->group;
-      LIST_LOOP (group->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
        {
          if (peer_sort (peer) == BGP_PEER_IBGP)
            continue;
@@ -2500,7 +2496,7 @@ int
 peer_ebgp_multihop_unset (struct peer *peer)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (peer_sort (peer) == BGP_PEER_IBGP)
     return 0;
@@ -2518,7 +2514,7 @@ peer_ebgp_multihop_unset (struct peer *peer)
   else
     {
       group = peer->group;
-      LIST_LOOP (group->peer, peer, nn)
+      for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
        {
          if (peer_sort (peer) == BGP_PEER_IBGP)
            continue;
@@ -2560,7 +2556,7 @@ int
 peer_update_source_if_set (struct peer *peer, const char *ifname)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (peer->update_if)
     {
@@ -2595,7 +2591,7 @@ peer_update_source_if_set (struct peer *peer, const char *ifname)
 
   /* peer-group member updates. */
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       if (peer->update_if)
        {
@@ -2630,7 +2626,7 @@ int
 peer_update_source_addr_set (struct peer *peer, union sockunion *su)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (peer->update_source)
     {
@@ -2664,7 +2660,7 @@ peer_update_source_addr_set (struct peer *peer, union sockunion *su)
 
   /* peer-group member updates. */
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       if (peer->update_source)
        {
@@ -2699,7 +2695,7 @@ peer_update_source_unset (struct peer *peer)
 {
   union sockunion *su;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
       && ! peer->update_source
@@ -2746,7 +2742,7 @@ peer_update_source_unset (struct peer *peer)
 
   /* peer-group member updates. */
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       if (! peer->update_source && ! peer->update_if)
        continue;
@@ -2780,7 +2776,7 @@ peer_default_originate_set (struct peer *peer, afi_t afi, safi_t safi,
                            const char *rmap)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   /* Adress family must be activated.  */
   if (! peer->afc[afi][safi])
@@ -2814,7 +2810,7 @@ peer_default_originate_set (struct peer *peer, afi_t afi, safi_t safi,
 
   /* peer-group member updates. */
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
 
@@ -2836,7 +2832,7 @@ int
 peer_default_originate_unset (struct peer *peer, afi_t afi, safi_t safi)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   /* Adress family must be activated.  */
   if (! peer->afc[afi][safi])
@@ -2865,7 +2861,7 @@ peer_default_originate_unset (struct peer *peer, afi_t afi, safi_t safi)
 
   /* peer-group member updates. */
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
 
@@ -2899,7 +2895,7 @@ int
 peer_weight_set (struct peer *peer, u_int16_t weight)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   SET_FLAG (peer->config, PEER_CONFIG_WEIGHT);
   peer->weight = weight;
@@ -2909,7 +2905,7 @@ peer_weight_set (struct peer *peer, u_int16_t weight)
 
   /* peer-group member updates. */
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       peer->weight = group->conf->weight;
     }
@@ -2920,7 +2916,7 @@ int
 peer_weight_unset (struct peer *peer)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   /* Set default weight. */
   if (peer_group_active (peer))
@@ -2935,7 +2931,7 @@ peer_weight_unset (struct peer *peer)
 
   /* peer-group member updates. */
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       peer->weight = 0;
     }
@@ -2946,7 +2942,7 @@ int
 peer_timers_set (struct peer *peer, u_int32_t keepalive, u_int32_t holdtime)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   /* Not for peer group memeber.  */
   if (peer_group_active (peer))
@@ -2974,7 +2970,7 @@ peer_timers_set (struct peer *peer, u_int32_t keepalive, u_int32_t holdtime)
 
   /* peer-group member updates. */
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       SET_FLAG (peer->config, PEER_CONFIG_TIMER);
       peer->holdtime = group->conf->holdtime;
@@ -2987,7 +2983,7 @@ int
 peer_timers_unset (struct peer *peer)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (peer_group_active (peer))
     return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
@@ -3002,7 +2998,7 @@ peer_timers_unset (struct peer *peer)
 
   /* peer-group member updates. */
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       UNSET_FLAG (peer->config, PEER_CONFIG_TIMER);
       peer->holdtime = 0;
@@ -3106,7 +3102,7 @@ int
 peer_allowas_in_set (struct peer *peer, afi_t afi, safi_t safi, int allow_num)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (allow_num < 1 || allow_num > 10)
     return BGP_ERR_INVALID_VALUE;
@@ -3122,7 +3118,7 @@ peer_allowas_in_set (struct peer *peer, afi_t afi, safi_t safi, int allow_num)
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       if (peer->allowas_in[afi][safi] != allow_num)
        {
@@ -3139,7 +3135,7 @@ int
 peer_allowas_in_unset (struct peer *peer, afi_t afi, safi_t safi)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN))
     {
@@ -3151,7 +3147,7 @@ peer_allowas_in_unset (struct peer *peer, afi_t afi, safi_t safi)
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN))
        {
@@ -3167,7 +3163,7 @@ peer_local_as_set (struct peer *peer, as_t as, int no_prepend)
 {
   struct bgp *bgp = peer->bgp;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (peer_sort (peer) != BGP_PEER_EBGP
       && peer_sort (peer) != BGP_PEER_INTERNAL)
@@ -3205,7 +3201,7 @@ peer_local_as_set (struct peer *peer, as_t as, int no_prepend)
     }
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       peer->change_local_as = as;
       if (no_prepend)
@@ -3230,7 +3226,7 @@ int
 peer_local_as_unset (struct peer *peer)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (peer_group_active (peer))
     return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
@@ -3256,7 +3252,7 @@ peer_local_as_unset (struct peer *peer)
     }
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       peer->change_local_as = 0;
       UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
@@ -3280,7 +3276,7 @@ peer_distribute_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
 {
   struct bgp_filter *filter;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -3305,7 +3301,7 @@ peer_distribute_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       filter = &peer->filter[afi][safi];
 
@@ -3327,7 +3323,7 @@ peer_distribute_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
   struct bgp_filter *filter;
   struct bgp_filter *gfilter;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -3364,7 +3360,7 @@ peer_distribute_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
     return 0;
 
     group = peer->group;
-    LIST_LOOP (group->peer, peer, nn)
+    for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
       {
        filter = &peer->filter[afi][safi];
 
@@ -3387,15 +3383,16 @@ peer_distribute_update (struct access_list *access)
   afi_t afi;
   safi_t safi;
   int direct;
-  struct listnode *nn, *nm;
+  struct listnode *mnode, *mnnode;
+  struct listnode *node, *nnode;
   struct bgp *bgp;
   struct peer *peer;
   struct peer_group *group;
   struct bgp_filter *filter;
 
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
     {
-      LIST_LOOP (bgp->peer, peer, nm)
+      for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
        {
          for (afi = AFI_IP; afi < AFI_MAX; afi++)
            for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
@@ -3412,7 +3409,7 @@ peer_distribute_update (struct access_list *access)
                  }
              }
        }
-      LIST_LOOP (bgp->group, group, nm)
+      for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
        {
          for (afi = AFI_IP; afi < AFI_MAX; afi++)
            for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
@@ -3439,7 +3436,7 @@ peer_prefix_list_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
 {
   struct bgp_filter *filter;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -3464,7 +3461,7 @@ peer_prefix_list_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       filter = &peer->filter[afi][safi];
 
@@ -3485,7 +3482,7 @@ peer_prefix_list_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
   struct bgp_filter *filter;
   struct bgp_filter *gfilter;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -3522,7 +3519,7 @@ peer_prefix_list_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       filter = &peer->filter[afi][safi];
 
@@ -3542,7 +3539,8 @@ peer_prefix_list_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
 void
 peer_prefix_list_update (struct prefix_list *plist)
 {
-  struct listnode *nn, *nm;
+  struct listnode *mnode, *mnnode;
+  struct listnode *node, *nnode;
   struct bgp *bgp;
   struct peer *peer;
   struct peer_group *group;
@@ -3551,9 +3549,9 @@ peer_prefix_list_update (struct prefix_list *plist)
   safi_t safi;
   int direct;
 
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
     {
-      LIST_LOOP (bgp->peer, peer, nm)
+      for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
        {
          for (afi = AFI_IP; afi < AFI_MAX; afi++)
            for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
@@ -3570,7 +3568,7 @@ peer_prefix_list_update (struct prefix_list *plist)
                  }
              }
        }
-      LIST_LOOP (bgp->group, group, nm)
+      for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
        {
          for (afi = AFI_IP; afi < AFI_MAX; afi++)
            for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
@@ -3596,7 +3594,7 @@ peer_aslist_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
 {
   struct bgp_filter *filter;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -3618,7 +3616,7 @@ peer_aslist_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       filter = &peer->filter[afi][safi];
 
@@ -3639,7 +3637,7 @@ peer_aslist_unset (struct peer *peer,afi_t afi, safi_t safi, int direct)
   struct bgp_filter *filter;
   struct bgp_filter *gfilter;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -3678,7 +3676,7 @@ peer_aslist_unset (struct peer *peer,afi_t afi, safi_t safi, int direct)
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       filter = &peer->filter[afi][safi];
 
@@ -3700,15 +3698,16 @@ peer_aslist_update ()
   afi_t afi;
   safi_t safi;
   int direct;
-  struct listnode *nn, *nm;
+  struct listnode *mnode, *mnnode;
+  struct listnode *node, *nnode;
   struct bgp *bgp;
   struct peer *peer;
   struct peer_group *group;
   struct bgp_filter *filter;
 
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
     {
-      LIST_LOOP (bgp->peer, peer, nm)
+      for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
        {
          for (afi = AFI_IP; afi < AFI_MAX; afi++)
            for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
@@ -3725,7 +3724,7 @@ peer_aslist_update ()
                  }
              }
        }
-      LIST_LOOP (bgp->group, group, nm)
+      for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
        {
          for (afi = AFI_IP; afi < AFI_MAX; afi++)
            for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
@@ -3752,7 +3751,7 @@ peer_route_map_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
 {
   struct bgp_filter *filter;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -3777,7 +3776,7 @@ peer_route_map_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       filter = &peer->filter[afi][safi];
 
@@ -3799,7 +3798,7 @@ peer_route_map_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
   struct bgp_filter *filter;
   struct bgp_filter *gfilter;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -3836,7 +3835,7 @@ peer_route_map_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       filter = &peer->filter[afi][safi];
 
@@ -3858,7 +3857,7 @@ peer_unsuppress_map_set (struct peer *peer, afi_t afi, safi_t safi,
 {
   struct bgp_filter *filter;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -3878,7 +3877,7 @@ peer_unsuppress_map_set (struct peer *peer, afi_t afi, safi_t safi,
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       filter = &peer->filter[afi][safi];
 
@@ -3899,7 +3898,7 @@ peer_unsuppress_map_unset (struct peer *peer, afi_t afi, safi_t safi)
 {
   struct bgp_filter *filter;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -3918,7 +3917,7 @@ peer_unsuppress_map_unset (struct peer *peer, afi_t afi, safi_t safi)
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       filter = &peer->filter[afi][safi];
 
@@ -3939,7 +3938,7 @@ peer_maximum_prefix_set (struct peer *peer, afi_t afi, safi_t safi,
                         int warning, u_int16_t restart)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -3957,7 +3956,7 @@ peer_maximum_prefix_set (struct peer *peer, afi_t afi, safi_t safi,
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       if (! peer->af_group[afi][safi])
        continue;
@@ -3978,7 +3977,7 @@ int
 peer_maximum_prefix_unset (struct peer *peer, afi_t afi, safi_t safi)
 {
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   if (! peer->afc[afi][safi])
     return BGP_ERR_PEER_INACTIVE;
@@ -4014,7 +4013,7 @@ peer_maximum_prefix_unset (struct peer *peer, afi_t afi, safi_t safi)
     return 0;
 
   group = peer->group;
-  LIST_LOOP (group->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
     {
       if (! peer->af_group[afi][safi])
        continue;
@@ -4606,13 +4605,13 @@ bgp_config_write_family (struct vty *vty, struct bgp *bgp, afi_t afi,
   int write = 0;
   struct peer *peer;
   struct peer_group *group;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   bgp_config_write_network (vty, bgp, afi, safi, &write);
 
   bgp_config_write_redistribute (vty, bgp, afi, safi, &write);
 
-  LIST_LOOP (bgp->group, group, nn)
+  for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
     {
       if (group->conf->afc[afi][safi])
        {
@@ -4620,7 +4619,7 @@ bgp_config_write_family (struct vty *vty, struct bgp *bgp, afi_t afi,
          bgp_config_write_peer (vty, bgp, group->conf, afi, safi);
        }
     }
-  LIST_LOOP (bgp->peer, peer, nn)
+  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
     {
       if (peer->afc[afi][safi])
        {
@@ -4644,7 +4643,8 @@ bgp_config_write (struct vty *vty)
   struct bgp *bgp;
   struct peer_group *group;
   struct peer *peer;
-  struct listnode *nn, *nm, *no;
+  struct listnode *node, *nnode;
+  struct listnode *mnode, *mnnode;
 
   /* BGP Multiple instance. */
   if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE))
@@ -4661,7 +4661,7 @@ bgp_config_write (struct vty *vty)
     }
 
   /* BGP configuration. */
-  LIST_LOOP (bm->bgp, bgp, nn)
+  for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
     {
       if (write)
        vty_out (vty, "!%s", VTY_NEWLINE);
@@ -4789,13 +4789,13 @@ bgp_config_write (struct vty *vty)
                 bgp->default_holdtime, VTY_NEWLINE);
 
       /* peer-group */
-      LIST_LOOP (bgp->group, group, nm)
+      for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
        {
          bgp_config_write_peer (vty, bgp, group->conf, AFI_IP, SAFI_UNICAST);
        }
 
       /* Normal neighbor configuration. */
-      LIST_LOOP (bgp->peer, peer, no)
+      for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
        {
          if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
            bgp_config_write_peer (vty, bgp, peer, AFI_IP, SAFI_UNICAST);
@@ -4887,15 +4887,15 @@ bgp_terminate ()
 {
   struct bgp *bgp;
   struct peer *peer;
-  struct listnode *nn;
-  struct listnode *mm;
+  struct listnode *node, *nnode;
+  struct listnode *mnode, *mnnode;
 
-  LIST_LOOP (bm->bgp, bgp, nn)
-    LIST_LOOP (bgp->peer, peer, mm)
+  for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
+    for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
       if (peer->status == Established)
           bgp_notify_send (peer, BGP_NOTIFY_CEASE,
                            BGP_NOTIFY_CEASE_PEER_UNCONFIG);
-
+  
   bgp_cleanup_routes ();
 }
 
index eba7d89d7122d44ee946838aac8a3fd052749c7d..fb80ee6ac2aef63649215b8453a1f95968ebed1b 100755 (executable)
@@ -5,7 +5,7 @@
 ##  Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
 ##  Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
 ##
-## $Id: configure.ac,v 1.98 2005/04/03 23:46:37 hasso Exp $
+## $Id: configure.ac,v 1.99 2005/04/07 07:30:20 paul Exp $
 AC_PREREQ(2.53)
 
 AC_INIT(Quagga, 0.99.0, [http://bugzilla.quagga.net])
@@ -1252,6 +1252,14 @@ AC_DEFINE_UNQUOTED(OSPF6_VTYSH_PATH, "$quagga_statedir/ospf6d.vty",ospf6d vty so
 AC_DEFINE_UNQUOTED(ISIS_VTYSH_PATH, "$quagga_statedir/isisd.vty",isisd vty socket)
 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$quagga_statedir",daemon vty directory)
 
+dnl -------------------------------
+dnl Quagga sources should always be 
+dnl current wrt interfaces. Dont
+dnl allow deprecated interfaces to
+dnl be exposed.
+dnl -------------------------------
+AC_DEFINE(QUAGGA_NO_DEPRECATED_INTERFACES, 1, Hide deprecated interfaces)
+
 dnl ---------------------------
 dnl Check htonl works correctly
 dnl ---------------------------
index 87609f6413ffd02d2353ee6b9d6000836cbcf275..0a48c070dd7e31053fa00f5bccac8dba2ac8c89d 100644 (file)
@@ -103,12 +103,9 @@ isis_adj_lookup (u_char * sysid, struct list *adjdb)
   struct isis_adjacency *adj;
   struct listnode *node;
 
-  for (node = listhead (adjdb); node; nextnode (node))
-    {
-      adj = getdata (node);
-      if (memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN) == 0)
-       return adj;
-    }
+  for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj))
+    if (memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN) == 0)
+      return adj;
 
   return NULL;
 }
@@ -120,12 +117,9 @@ isis_adj_lookup_snpa (u_char * ssnpa, struct list *adjdb)
   struct listnode *node;
   struct isis_adjacency *adj;
 
-  for (node = listhead (adjdb); node; nextnode (node))
-    {
-      adj = getdata (node);
-      if (memcmp (adj->snpa, ssnpa, ETH_ALEN) == 0)
-       return adj;
-    }
+  for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj))
+    if (memcmp (adj->snpa, ssnpa, ETH_ALEN) == 0)
+      return adj;
 
   return NULL;
 }
@@ -136,17 +130,15 @@ isis_adj_lookup_snpa (u_char * ssnpa, struct list *adjdb)
 void
 isis_delete_adj (struct isis_adjacency *adj, struct list *adjdb)
 {
-  struct isis_adjacency *adj2;
+  struct isis_adjacency *adj2 = NULL;
   struct listnode *node;
 
   if (adjdb)
     {
-      for (node = listhead (adjdb); node; nextnode (node))
-       {
-         adj2 = getdata (node);
-         if (adj2 == adj)
-           break;
-       }
+      for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj2))
+        if (adj2 == adj)
+          break;
+
       listnode_delete (adjdb, adj);
     }
 
@@ -249,20 +241,16 @@ isis_adj_print (struct isis_adjacency *adj)
     {
       zlog_debug ("IPv4 Addresses:");
 
-      for (node = listhead (adj->ipv4_addrs); node; nextnode (node))
-       {
-         ipv4_addr = getdata (node);
-         zlog_debug ("%s", inet_ntoa (*ipv4_addr));
-       }
+      for (ALL_LIST_ELEMENTS_RO (adj->ipv4_addrs, node, ipv4_addr))
+        zlog_debug ("%s", inet_ntoa (*ipv4_addr));
     }
 
 #ifdef HAVE_IPV6
   if (adj->ipv6_addrs && listcount (adj->ipv6_addrs) > 0)
     {
       zlog_debug ("IPv6 Addresses:");
-      for (node = listhead (adj->ipv6_addrs); node; nextnode (node))
+      for (ALL_LIST_ELEMENTS_RO (adj->ipv6_addrs, node, ipv6_addr))
        {
-         ipv6_addr = getdata (node);
          inet_ntop (AF_INET6, ipv6_addr, (char *)ip6, INET6_ADDRSTRLEN);
          zlog_debug ("%s", ip6);
        }
@@ -400,19 +388,15 @@ isis_adj_print_vty2 (struct isis_adjacency *adj, struct vty *vty, char detail)
       if (adj->ipv4_addrs && listcount (adj->ipv4_addrs) > 0)
        {
          vty_out (vty, "    IPv4 Addresses:%s", VTY_NEWLINE);
-         for (node = listhead (adj->ipv4_addrs); node; nextnode (node))
-           {
-             ip_addr = getdata (node);
-             vty_out (vty, "      %s%s", inet_ntoa (*ip_addr), VTY_NEWLINE);
-           }
+         for (ALL_LIST_ELEMENTS_RO (adj->ipv4_addrs, node, ip_addr))
+            vty_out (vty, "      %s%s", inet_ntoa (*ip_addr), VTY_NEWLINE);
        }
 #ifdef HAVE_IPV6
       if (adj->ipv6_addrs && listcount (adj->ipv6_addrs) > 0)
        {
          vty_out (vty, "    IPv6 Addresses:%s", VTY_NEWLINE);
-         for (node = listhead (adj->ipv6_addrs); node; nextnode (node))
+         for (ALL_LIST_ELEMENTS_RO (adj->ipv4_addrs, node, ipv6_addr))
            {
-             ipv6_addr = getdata (node);
              inet_ntop (AF_INET6, ipv6_addr, (char *)ip6, INET6_ADDRSTRLEN);
              vty_out (vty, "      %s%s", ip6, VTY_NEWLINE);
            }
@@ -463,13 +447,11 @@ void
 isis_adjdb_iterate (struct list *adjdb, void (*func) (struct isis_adjacency *,
                                                      void *), void *arg)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_adjacency *adj;
-  for (node = listhead (adjdb); node; nextnode (node))
-    {
-      adj = getdata (node);
-      (*func) (adj, arg);
-    }
+
+  for (ALL_LIST_ELEMENTS (adjdb, node, nnode, adj))
+    (*func) (adj, arg);
 }
 
 void
@@ -484,9 +466,8 @@ isis_adj_build_neigh_list (struct list *adjdb, struct list *list)
       return;
     }
 
-  for (node = listhead (adjdb); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj))
     {
-      adj = getdata (node);
       if (!adj)
        {
          zlog_warn ("isis_adj_build_neigh_list(): NULL adj");
@@ -512,10 +493,8 @@ isis_adj_build_up_list (struct list *adjdb, struct list *list)
       return;
     }
 
-  for (node = listhead (adjdb); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj))
     {
-      adj = getdata (node);
-
       if (!adj)
        {
          zlog_warn ("isis_adj_build_up_list(): NULL adj");
index 1a98a6337dc1ed42d0e13e54d027f363cbc39745..b99fa5daf0af51c5ee03691607fdf3cad0563132 100644 (file)
@@ -150,13 +150,10 @@ circuit_lookup_by_ifp (struct interface *ifp, struct list *list)
   if (!list)
     return NULL;
 
-  for (node = listhead (list); node; nextnode (node))
-    {
-      circuit = getdata (node);
-      if (circuit->interface == ifp)
-       return circuit;
-    }
-
+  for (ALL_LIST_ELEMENTS_RO (list, node, circuit))
+    if (circuit->interface == ifp)
+      return circuit;
+  
   return NULL;
 }
 
@@ -170,9 +167,8 @@ circuit_scan_by_ifp (struct interface *ifp)
   if (!isis->area_list)
     return NULL;
 
-  for (node = listhead (isis->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
     {
-      area = getdata (node);
       circuit = circuit_lookup_by_ifp (ifp, area->circuit_list);
       if (circuit)
        return circuit;
@@ -295,12 +291,9 @@ isis_circuit_del_addr (struct isis_circuit *circuit,
       ipv4->prefixlen = connected->address->prefixlen;
       ipv4->prefix = connected->address->u.prefix4;
 
-      for (node = listhead (circuit->ip_addrs); node; nextnode (node))
-       {
-         ip = getdata (node);
-         if (prefix_same ((struct prefix *) ip, (struct prefix *) &ipv4))
-           break;
-       }
+      for (ALL_LIST_ELEMENTS_RO (circuit->ip_addrs, node, ip))
+        if (prefix_same ((struct prefix *) ip, (struct prefix *) &ipv4))
+          break;
 
       if (ip)
        {
@@ -324,9 +317,8 @@ isis_circuit_del_addr (struct isis_circuit *circuit,
 
       if (IN6_IS_ADDR_LINKLOCAL (&ipv6->prefix))
        {
-         for (node = listhead (circuit->ipv6_link); node; nextnode (node))
+         for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_link, node, ip6))
            {
-             ip6 = getdata (node);
              if (prefix_same ((struct prefix *) ip6, (struct prefix *) ipv6))
                break;
            }
@@ -338,9 +330,8 @@ isis_circuit_del_addr (struct isis_circuit *circuit,
        }
       else
        {
-         for (node = listhead (circuit->ipv6_non_link); node; nextnode (node))
+         for (ALL_LIST_ELEMENTS_RO (circuit->ipv6_non_link, node, ip6))
            {
-             ip6 = getdata (node);
              if (prefix_same ((struct prefix *) ip6, (struct prefix *) ipv6))
                break;
            }
@@ -368,7 +359,7 @@ isis_circuit_del_addr (struct isis_circuit *circuit,
 void
 isis_circuit_if_add (struct isis_circuit *circuit, struct interface *ifp)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct connected *conn;
 
   circuit->interface = ifp;
@@ -416,12 +407,8 @@ isis_circuit_if_add (struct isis_circuit *circuit, struct interface *ifp)
       zlog_warn ("isis_circuit_if_add: unsupported media");
     }
 
-  for (node = ifp->connected ? listhead (ifp->connected) : NULL; node;
-       nextnode (node))
-    {
-      conn = getdata (node);
-      isis_circuit_add_addr (circuit, conn);
-    }
+  for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, conn))
+    isis_circuit_add_addr (circuit, conn);
 
   return;
 }
@@ -631,14 +618,14 @@ isis_interface_config_write (struct vty *vty)
 {
 
   int write = 0;
-  struct listnode *node;
-  struct listnode *node2;
+  struct listnode *node, *nnode;
+  struct listnode *node2, *nnode2;
   struct interface *ifp;
   struct isis_area *area;
   struct isis_circuit *c;
   int i;
 
-  LIST_LOOP (iflist, ifp, node)
+  for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
   {
     /* IF name */
     vty_out (vty, "interface %s%s", ifp->name, VTY_NEWLINE);
@@ -650,7 +637,7 @@ isis_interface_config_write (struct vty *vty)
        write++;
       }
     /* ISIS Circuit */
-    LIST_LOOP (isis->area_list, area, node2)
+    for (ALL_LIST_ELEMENTS (isis->area_list, node2, nnode2, area))
     {
       c = circuit_lookup_by_ifp (ifp, area->circuit_list);
       if (c)
@@ -901,7 +888,7 @@ DEFUN (no_ip_router_isis,
   struct isis_circuit *circuit = NULL;
   struct interface *ifp;
   struct isis_area *area;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   ifp = (struct interface *) vty->index;
   assert (ifp);
@@ -912,7 +899,7 @@ DEFUN (no_ip_router_isis,
       vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
       return CMD_WARNING;
     }
-  LIST_LOOP (area->circuit_list, circuit, node)
+  for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))
     if (circuit->interface == ifp)
       break;
   if (!circuit)
index 4eadc9c11e4aea0e2d86ff1a746f10833af16384..75713566b1535bb9cab2624cc429900d01be5d60 100644 (file)
@@ -130,7 +130,7 @@ int
 isis_dr_elect (struct isis_circuit *circuit, int level)
 {
   struct list *adjdb;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_adjacency *adj, *adj_dr = NULL;
   struct list *list = list_new ();
   u_char own_prio;
@@ -152,9 +152,8 @@ isis_dr_elect (struct isis_circuit *circuit, int level)
   /*
    * Loop the adjacencies and find the one with the biggest priority
    */
-  for (node = listhead (list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (list, node, nnode, adj))
     {
-      adj = getdata (node);
       /* clear flag for show output */
       adj->dis_record[level - 1].dis = ISIS_IS_NOT_DIS;
       adj->dis_record[level - 1].last_dis_change = time (NULL);
@@ -215,11 +214,8 @@ isis_dr_elect (struct isis_circuit *circuit, int level)
           */
 
          /* rotate the history log */
-         for (node = listhead (list); node; nextnode (node))
-           {
-             adj = getdata (node);
-             isis_check_dr_change (adj, level);
-           }
+         for (ALL_LIST_ELEMENTS (list, node, nnode, adj))
+            isis_check_dr_change (adj, level);
 
          /* commence */
          list_delete (list);
@@ -238,11 +234,8 @@ isis_dr_elect (struct isis_circuit *circuit, int level)
        * if yes rotate the history log
        */
 
-      for (node = listhead (list); node; nextnode (node))
-       {
-         adj = getdata (node);
-         isis_check_dr_change (adj, level);
-       }
+      for (ALL_LIST_ELEMENTS (list, node, nnode, adj))
+        isis_check_dr_change (adj, level);
 
       /*
        * We are not DR - if we were -> resign
index 41c36371467d51267ee3fd5c63a3368218a3b370..68257ddce86a7bf6a61600d51e8772ae867cdeaa 100644 (file)
@@ -60,12 +60,9 @@ dynhn_find_by_id (u_char * id)
   struct listnode *node = NULL;
   struct isis_dynhn *dyn = NULL;
 
-  for (node = listhead (dyn_cache); node; nextnode (node))
-    {
-      dyn = getdata (node);
-      if (memcmp (dyn->id, id, ISIS_SYS_ID_LEN) == 0)
-       return dyn;
-    }
+  for (ALL_LIST_ELEMENTS_RO (dyn_cache, node, dyn))
+    if (memcmp (dyn->id, id, ISIS_SYS_ID_LEN) == 0)
+      return dyn;
 
   return NULL;
 }
@@ -114,9 +111,8 @@ dynhn_print_all (struct vty *vty)
   struct isis_dynhn *dyn;
 
   vty_out (vty, "Level  System ID      Dynamic Hostname%s", VTY_NEWLINE);
-  for (node = listhead (dyn_cache); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (dyn_cache, node, dyn))
     {
-      dyn = getdata (node);
       vty_out (vty, "%-7d", dyn->level);
       vty_out (vty, "%-15s%-15s%s", sysid_print (dyn->id), dyn->name.name,
               VTY_NEWLINE);
index 66d694f60e38f65ae416008d9f4092c37fdf7c55..d54036a5fc3dfb2a83e17cc308df70e15ecc1004 100644 (file)
@@ -88,7 +88,7 @@ isis_event_circuit_state_change (struct isis_circuit *circuit, int up)
 void
 isis_event_system_type_change (struct isis_area *area, int newtype)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_circuit *circuit;
 
   if (isis->debugs & DEBUG_EVENTS)
@@ -125,11 +125,8 @@ isis_event_system_type_change (struct isis_area *area, int newtype)
     }
 
   area->is_type = newtype;
-  for (node = listhead (area->circuit_list); node; nextnode (node))
-    {
-      circuit = getdata (node);
-      isis_event_circuit_type_change (circuit, newtype);
-    }
+  for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))
+    isis_event_circuit_type_change (circuit, newtype);
 
   spftree_area_init (area);
   lsp_regenerate_schedule (area);
index 0ef048e2c186367e2826893487a10e53e5b25ae8..9c861c945c472ce2c0260e6e090dd72f0b4f05f0 100644 (file)
@@ -43,7 +43,7 @@ flags_get_index (struct flags *flags)
   else
     {
       node = listhead (flags->free_idcs);
-      index = (int) getdata (node);
+      index = (int) listgetdata (node);
       listnode_delete (flags->free_idcs, (void *) index);
     }
 
index 987a9b32b54a342bd4a4ffd28c9f5242a31d7298..88d4886bcb1d21e54a9d2651d6ae25dceb93813d 100644 (file)
@@ -187,12 +187,11 @@ static void
 lsp_remove_frags (struct list *frags, dict_t * lspdb)
 {
   dnode_t *dnode;
-  struct listnode *lnode;
+  struct listnode *lnode, *lnnode;
   struct isis_lsp *lsp;
 
-  for (lnode = listhead (frags); lnode; nextnode (lnode))
+  for (ALL_LIST_ELEMENTS (frags, lnode, lnnode, lsp))
     {
-      lsp = getdata (lnode);
       dnode = dict_lookup (lspdb, lsp->lsp_header->lsp_id);
       lsp_destroy (lsp);
       dnode_destroy (dict_delete (lspdb, dnode));
@@ -325,18 +324,15 @@ static void
 lsp_seqnum_update (struct isis_lsp *lsp0)
 {
   struct isis_lsp *lsp;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   lsp_inc_seqnum (lsp0, 0);
 
   if (!lsp0->lspu.frags)
     return;
 
-  for (node = listhead (lsp0->lspu.frags); node; nextnode (node))
-    {
-      lsp = getdata (node);
-      lsp_inc_seqnum (lsp, 0);
-    }
+  for (ALL_LIST_ELEMENTS (lsp0->lspu.frags, node, nnode, lsp))
+    lsp_inc_seqnum (lsp, 0);
 
   return;
 }
@@ -717,7 +713,7 @@ lsp_print_detail (dnode_t * node, struct vty *vty, char dynhost)
   struct isis_lsp *lsp = dnode_get (node);
   struct area_addr *area_addr;
   int i;
-  struct listnode *lnode;
+  struct listnode *lnode, *lnnode;
   struct is_neigh *is_neigh;
   struct te_is_neigh *te_is_neigh;
   struct ipv4_reachability *ipv4_reach;
@@ -739,15 +735,14 @@ lsp_print_detail (dnode_t * node, struct vty *vty, char dynhost)
 
   /* for all area address */
   if (lsp->tlv_data.area_addrs)
-    {
-      LIST_LOOP (lsp->tlv_data.area_addrs, area_addr, lnode)
+    for (ALL_LIST_ELEMENTS (lsp->tlv_data.area_addrs, lnode, 
+                            lnnode, area_addr))
       {
        vty_out (vty, "  Area Address: %s%s",
                 isonet_print (area_addr->area_addr, area_addr->addr_len),
                 VTY_NEWLINE);
       }
-    }
-
+  
   /* for the nlpid tlv */
   if (lsp->tlv_data.nlpids)
     {
@@ -777,13 +772,12 @@ lsp_print_detail (dnode_t * node, struct vty *vty, char dynhost)
     }
 
   if (lsp->tlv_data.ipv4_addrs)
-    {
-      LIST_LOOP (lsp->tlv_data.ipv4_addrs, ipv4_addr, lnode)
+    for (ALL_LIST_ELEMENTS (lsp->tlv_data.ipv4_addrs, lnode, 
+                            lnnode, ipv4_addr))
       {
        memcpy (ipv4_address, inet_ntoa (*ipv4_addr), sizeof (ipv4_address));
        vty_out (vty, "  IP:        %s%s", ipv4_address, VTY_NEWLINE);
       }
-    }
 
   /* TE router id */
   if (lsp->tlv_data.router_id)
@@ -795,18 +789,17 @@ lsp_print_detail (dnode_t * node, struct vty *vty, char dynhost)
 
   /* for the IS neighbor tlv */
   if (lsp->tlv_data.is_neighs)
-    {
-      LIST_LOOP (lsp->tlv_data.is_neighs, is_neigh, lnode)
+    for (ALL_LIST_ELEMENTS (lsp->tlv_data.is_neighs, lnode, lnnode, is_neigh))
       {
        lspid_print (is_neigh->neigh_id, LSPid, dynhost, 0);
        vty_out (vty, "  Metric: %d IS %s%s",
                 is_neigh->metrics.metric_default, LSPid, VTY_NEWLINE);
       }
-    }
   
   /* for the internal reachable tlv */
   if (lsp->tlv_data.ipv4_int_reachs)
-    LIST_LOOP (lsp->tlv_data.ipv4_int_reachs, ipv4_reach, lnode)
+    for (ALL_LIST_ELEMENTS (lsp->tlv_data.ipv4_int_reachs, lnode, 
+                            lnnode, ipv4_reach))
     {
       memcpy (ipv4_reach_prefix, inet_ntoa (ipv4_reach->prefix),
              sizeof (ipv4_reach_prefix));
@@ -819,7 +812,8 @@ lsp_print_detail (dnode_t * node, struct vty *vty, char dynhost)
 
   /* for the external reachable tlv */
   if (lsp->tlv_data.ipv4_ext_reachs)
-    LIST_LOOP (lsp->tlv_data.ipv4_ext_reachs, ipv4_reach, lnode)
+    for (ALL_LIST_ELEMENTS (lsp->tlv_data.ipv4_ext_reachs, lnode, 
+                            lnnode, ipv4_reach))
     {
       memcpy (ipv4_reach_prefix, inet_ntoa (ipv4_reach->prefix),
              sizeof (ipv4_reach_prefix));
@@ -829,11 +823,12 @@ lsp_print_detail (dnode_t * node, struct vty *vty, char dynhost)
               ipv4_reach->metrics.metric_default, ipv4_reach_prefix,
               ipv4_reach_mask, VTY_NEWLINE);
     }
-
+  
   /* IPv6 tlv */
 #ifdef HAVE_IPV6
   if (lsp->tlv_data.ipv6_reachs)
-    LIST_LOOP (lsp->tlv_data.ipv6_reachs, ipv6_reach, lnode)
+    for (ALL_LIST_ELEMENTS (lsp->tlv_data.ipv6_reachs, lnode, 
+                            lnnode, ipv6_reach))
     {
       memset (&in6, 0, sizeof (in6));
       memcpy (in6.s6_addr, ipv6_reach->prefix,
@@ -850,9 +845,11 @@ lsp_print_detail (dnode_t * node, struct vty *vty, char dynhost)
                 buff, ipv6_reach->prefix_len, VTY_NEWLINE);
     }
 #endif
+
   /* TE IS neighbor tlv */
   if (lsp->tlv_data.te_is_neighs)
-    LIST_LOOP (lsp->tlv_data.te_is_neighs, te_is_neigh, lnode)
+    for (ALL_LIST_ELEMENTS (lsp->tlv_data.te_is_neighs, lnode, 
+                            lnnode, te_is_neigh))
     {
       /* FIXME: metric display is wrong. */
       lspid_print (te_is_neigh->neigh_id, LSPid, dynhost, 0);
@@ -862,7 +859,8 @@ lsp_print_detail (dnode_t * node, struct vty *vty, char dynhost)
 
   /* TE IPv4 tlv */
   if (lsp->tlv_data.te_ipv4_reachs)
-    LIST_LOOP (lsp->tlv_data.te_ipv4_reachs, te_ipv4_reach, lnode)
+    for (ALL_LIST_ELEMENTS (lsp->tlv_data.te_ipv4_reachs, lnode, 
+                            lnnode, te_ipv4_reach))
     {
       /* FIXME: There should be better way to output this stuff. */
       vty_out (vty, "  Metric: %d extd-IP %s/%d%s",
@@ -949,7 +947,7 @@ void
 lsp_build_nonpseudo (struct isis_lsp *lsp, struct isis_area *area)
 {
   struct is_neigh *is_neigh;
-  struct listnode *node, *ipnode;
+  struct listnode *node, *nnode, *ipnode, *ipnnode;
   int level = lsp->level;
   struct isis_circuit *circuit;
   struct prefix_ipv4 *ipv4;
@@ -1027,9 +1025,8 @@ lsp_build_nonpseudo (struct isis_lsp *lsp, struct isis_area *area)
   /*
    * Then add tlvs related to circuits
    */
-  for (node = listhead (area->circuit_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))
     {
-      circuit = getdata (node);
       if (circuit->state != C_STATE_UP)
        continue;
 
@@ -1044,10 +1041,8 @@ lsp_build_nonpseudo (struct isis_lsp *lsp, struct isis_area *area)
              lsp->tlv_data.ipv4_int_reachs = list_new ();
              lsp->tlv_data.ipv4_int_reachs->del = free_tlv;
            }
-         for (ipnode = listhead (circuit->ip_addrs); ipnode;
-              nextnode (ipnode))
+          for (ALL_LIST_ELEMENTS (circuit->ip_addrs, ipnode, ipnnode, ipv4))
            {
-             ipv4 = getdata (ipnode);
              ipreach =
                XMALLOC (MTYPE_ISIS_TLV, sizeof (struct ipv4_reachability));
              ipreach->metrics = circuit->metrics[level - 1];
@@ -1068,10 +1063,9 @@ lsp_build_nonpseudo (struct isis_lsp *lsp, struct isis_area *area)
              lsp->tlv_data.ipv6_reachs = list_new ();
              lsp->tlv_data.ipv6_reachs->del = free_tlv;
            }
-         for (ipnode = listhead (circuit->ipv6_non_link); ipnode;
-              nextnode (ipnode))
+          for (ALL_LIST_ELEMENTS (circuit->ipv6_non_link, ipnode, 
+                                  ipnnode, ipv6))
            {
-             ipv6 = getdata (ipnode);
              ip6reach =
                XMALLOC (MTYPE_ISIS_TLV, sizeof (struct ipv6_reachability));
              memset (ip6reach, 0, sizeof (struct ipv6_reachability));
@@ -1192,8 +1186,8 @@ lsp_tlv_fit (struct isis_lsp *lsp, struct list **from, struct list **to,
        count = count / tlvsize;
       for (i = 0; i < count; i++)
        {
-         listnode_add (*to, getdata (listhead (*from)));
-         listnode_delete (*from, getdata (listhead (*from)));
+         listnode_add (*to, listgetdata (listhead (*from)));
+         listnode_delete (*from, listgetdata (listhead (*from)));
        }
       tlv_build_func (*to, lsp->pdu);
     }
@@ -1256,7 +1250,7 @@ static void
 lsp_build_nonpseudo (struct isis_lsp *lsp, struct isis_area *area)
 {
   struct is_neigh *is_neigh;
-  struct listnode *node, *ipnode;
+  struct listnode *node, *nnode, *ipnode, *ipnnode;
   int level = lsp->level;
   struct isis_circuit *circuit;
   struct prefix_ipv4 *ipv4;
@@ -1360,9 +1354,8 @@ lsp_build_nonpseudo (struct isis_lsp *lsp, struct isis_area *area)
   /*
    * Then build lists of tlvs related to circuits
    */
-  for (node = listhead (area->circuit_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))
     {
-      circuit = getdata (node);
       if (circuit->state != C_STATE_UP)
        continue;
 
@@ -1376,10 +1369,8 @@ lsp_build_nonpseudo (struct isis_lsp *lsp, struct isis_area *area)
            {
              tlv_data.ipv4_int_reachs = list_new ();
            }
-         for (ipnode = listhead (circuit->ip_addrs); ipnode;
-              nextnode (ipnode))
+          for (ALL_LIST_ELEMENTS (circuit->ip_addrs, ipnode, ipnnode, ipv4))
            {
-             ipv4 = getdata (ipnode);
              ipreach =
                XMALLOC (MTYPE_ISIS_TLV, sizeof (struct ipv4_reachability));
              ipreach->metrics = circuit->metrics[level - 1];
@@ -1402,10 +1393,9 @@ lsp_build_nonpseudo (struct isis_lsp *lsp, struct isis_area *area)
            {
              tlv_data.ipv6_reachs = list_new ();
            }
-         for (ipnode = listhead (circuit->ipv6_non_link); ipnode;
-              nextnode (ipnode))
+          for (ALL_LIST_ELEMENTS (circuit->ipv6_non_link, ipnode, ipnnode,
+                                  ipv6))
            {
-             ipv6 = getdata (ipnode);
              ip6reach =
                XMALLOC (MTYPE_ISIS_TLV, sizeof (struct ipv6_reachability));
              memset (ip6reach, 0, sizeof (struct ipv6_reachability));
@@ -1696,9 +1686,8 @@ lsp_non_pseudo_regenerate (struct isis_area *area, int level)
   lsp->last_generated = time (NULL);
   area->lsp_regenerate_pending[level - 1] = 0;
   ISIS_FLAGS_SET_ALL (lsp->SRMflags);
-  for (node = listhead (lsp->lspu.frags); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (lsp->lspu.frags, node, frag))
     {
-      frag = getdata (node);
       frag->lsp_header->rem_lifetime = htons (isis_jitter
                                              (area->
                                               max_lsp_lifetime[level - 1],
@@ -1862,7 +1851,7 @@ lsp_build_pseudo (struct isis_lsp *lsp, struct isis_circuit *circuit,
   struct is_neigh *is_neigh;
   struct es_neigh *es_neigh;
   struct list *adj_list;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_passwd *passwd;
 
   assert (circuit);
@@ -1893,9 +1882,8 @@ lsp_build_pseudo (struct isis_lsp *lsp, struct isis_circuit *circuit,
   adj_list = list_new ();
   isis_adj_build_up_list (circuit->u.bc.adjdb[level - 1], adj_list);
 
-  for (node = listhead (adj_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (adj_list, node, nnode, adj))
     {
-      adj = getdata (node);
       if (adj->circuit_t & level)
        {
          if ((level == 1 && adj->sys_type == ISIS_SYSTYPE_L1_IS) ||
@@ -2127,7 +2115,7 @@ lsp_tick (struct thread *thread)
   struct isis_circuit *circuit;
   struct isis_lsp *lsp;
   struct list *lsp_list;
-  struct listnode *lspnode, *cnode;
+  struct listnode *lspnode, *lspnnode, *cnode;
   dnode_t *dnode, *dnode_next;
   int level;
 
@@ -2174,14 +2162,10 @@ lsp_tick (struct thread *thread)
           */
          if (listcount (lsp_list) > 0)
            {
-             for (cnode = listhead (area->circuit_list); cnode;
-                  nextnode (cnode))
+              for (ALL_LIST_ELEMENTS_RO (area->circuit_list, cnode, circuit))
                {
-                 circuit = getdata (cnode);
-                 for (lspnode = listhead (lsp_list); lspnode;
-                      nextnode (lspnode))
+                  for (ALL_LIST_ELEMENTS (lsp_list, lspnode, lspnnode, lsp))
                    {
-                     lsp = getdata (lspnode);
                      if (ISIS_CHECK_FLAG (lsp->SRMflags, circuit))
                        {
                          /* FIXME: if same or elder lsp is already in lsp
index 6dcc75e98a87eb31b2295bf4154f4809585df914..9d3b18adc22b57644187ab9d6563b0313c95281f 100644 (file)
@@ -80,11 +80,12 @@ static int
 area_match (struct list *left, struct list *right)
 {
   struct area_addr *addr1, *addr2;
-  struct listnode *node1, *node2;
+  struct listnode *node1, *nnode1;
+  struct listnode *node2, *nnode2;
 
-  LIST_LOOP (left, addr1, node1)
+  for (ALL_LIST_ELEMENTS (left, node1, nnode1, addr1))
   {
-    LIST_LOOP (right, addr2, node2)
+    for (ALL_LIST_ELEMENTS (right, node2, nnode2, addr2))
     {
       if (addr1->addr_len == addr2->addr_len &&
          !memcmp (addr1->area_addr, addr2->area_addr, (int) addr1->addr_len))
@@ -139,14 +140,15 @@ ip_match (struct list *left, struct list *right)
 {
   struct prefix_ipv4 *ip1;
   struct in_addr *ip2;
-  struct listnode *node1, *node2;
+  struct listnode *node1, *nnode1;
+  struct listnode *node2, *nnode2;
 
   if ((left == NULL) || (right == NULL))
     return 0;
   
-  LIST_LOOP (left, ip1, node1)
+  for (ALL_LIST_ELEMENTS (left, node1, nnode1, ip1))
   {
-    LIST_LOOP (right, ip2, node2)
+    for (ALL_LIST_ELEMENTS (right, node2, nnode2, ip2))
     {
       if (ip_same_subnet (ip1, ip2))
        {
@@ -223,7 +225,7 @@ del_ip_addr (void *val)
 static void
 tlvs_to_adj_ipv4_addrs (struct tlvs *tlvs, struct isis_adjacency *adj)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct in_addr *ipv4_addr, *malloced;
 
   if (adj->ipv4_addrs)
@@ -234,7 +236,7 @@ tlvs_to_adj_ipv4_addrs (struct tlvs *tlvs, struct isis_adjacency *adj)
   adj->ipv4_addrs = list_new ();
   if (tlvs->ipv4_addrs)
     {
-      LIST_LOOP (tlvs->ipv4_addrs, ipv4_addr, node)
+      for (ALL_LIST_ELEMENTS (tlvs->ipv4_addrs, node, nnode, ipv4_addr))
       {
        malloced = XMALLOC (MTYPE_ISIS_TMP, sizeof (struct in_addr));
        memcpy (malloced, ipv4_addr, sizeof (struct in_addr));
@@ -247,7 +249,7 @@ tlvs_to_adj_ipv4_addrs (struct tlvs *tlvs, struct isis_adjacency *adj)
 static void
 tlvs_to_adj_ipv6_addrs (struct tlvs *tlvs, struct isis_adjacency *adj)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct in6_addr *ipv6_addr, *malloced;
 
   if (adj->ipv6_addrs)
@@ -258,7 +260,7 @@ tlvs_to_adj_ipv6_addrs (struct tlvs *tlvs, struct isis_adjacency *adj)
   adj->ipv6_addrs = list_new ();
   if (tlvs->ipv6_addrs)
     {
-      LIST_LOOP (tlvs->ipv6_addrs, ipv6_addr, node)
+      for (ALL_LIST_ELEMENTS (tlvs->ipv6_addrs, node, nnode, ipv6_addr))
       {
        malloced = XMALLOC (MTYPE_ISIS_TMP, sizeof (struct in6_addr));
        memcpy (malloced, ipv6_addr, sizeof (struct in6_addr));
@@ -661,7 +663,7 @@ process_lan_hello (int level, struct isis_circuit *circuit, u_char * ssnpa)
   u_int32_t expected = 0, found;
   struct tlvs tlvs;
   u_char *snpa;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   if ((stream_get_endp (circuit->rcv_stream) -
        stream_get_getp (circuit->rcv_stream)) < ISIS_LANHELLO_HDRLEN)
@@ -884,7 +886,7 @@ process_lan_hello (int level, struct isis_circuit *circuit, u_char * ssnpa)
     {
       if (adj->adj_state != ISIS_ADJ_UP)
        {
-         LIST_LOOP (tlvs.lan_neighs, snpa, node)
+         for (ALL_LIST_ELEMENTS (tlvs.lan_neighs, node, nnode, snpa))
            if (!memcmp (snpa, circuit->u.bc.snpa, ETH_ALEN))
            {
              isis_adj_state_change (adj, ISIS_ADJ_UP,
@@ -1267,7 +1269,8 @@ process_snp (int snp_type, int level, struct isis_circuit *circuit,
   uint32_t found = 0, expected = 0;
   struct isis_lsp *lsp;
   struct lsp_entry *entry;
-  struct listnode *node, *node2;
+  struct listnode *node, *nnode;
+  struct listnode *node2, *nnode2;
   struct tlvs tlvs;
   struct list *lsp_list = NULL;
   struct isis_passwd *passwd;
@@ -1424,7 +1427,7 @@ process_snp (int snp_type, int level, struct isis_circuit *circuit,
                  typechar, snpa_print (ssnpa), circuit->interface->name);
       if (tlvs.lsp_entries)
        {
-         LIST_LOOP (tlvs.lsp_entries, entry, node)
+         for (ALL_LIST_ELEMENTS (tlvs.lsp_entries, node, nnode, entry))
          {
            zlog_debug ("ISIS-Snp (%s):         %cSNP entry %s, seq 0x%08x,"
                        " cksum 0x%04x, lifetime %us",
@@ -1440,7 +1443,7 @@ process_snp (int snp_type, int level, struct isis_circuit *circuit,
   /* 7.3.15.2 b) Actions on LSP_ENTRIES reported */
   if (tlvs.lsp_entries)
     {
-      LIST_LOOP (tlvs.lsp_entries, entry, node)
+      for (ALL_LIST_ELEMENTS (tlvs.lsp_entries, node, nnode, entry))
       {
        lsp = lsp_search (entry->lsp_id, circuit->area->lspdb[level - 1]);
        own_lsp = !memcmp (entry->lsp_id, isis->sysid, ISIS_SYS_ID_LEN);
@@ -1507,9 +1510,9 @@ process_snp (int snp_type, int level, struct isis_circuit *circuit,
       /* Fixme: Find a better solution */
       if (tlvs.lsp_entries)
        {
-         LIST_LOOP (tlvs.lsp_entries, entry, node)
+         for (ALL_LIST_ELEMENTS (tlvs.lsp_entries, node, nnode, entry))
          {
-           LIST_LOOP (lsp_list, lsp, node2)
+           for (ALL_LIST_ELEMENTS (lsp_list, node2, nnode2, lsp))
            {
              if (lsp_id_cmp (lsp->lsp_header->lsp_id, entry->lsp_id) == 0)
                {
@@ -1520,7 +1523,7 @@ process_snp (int snp_type, int level, struct isis_circuit *circuit,
          }
        }
       /* on remaining LSPs we set SRM (neighbor knew not of) */
-      LIST_LOOP (lsp_list, lsp, node2)
+      for (ALL_LIST_ELEMENTS (lsp_list, node2, nnode2, lsp))
       {
        ISIS_SET_FLAG (lsp->SRMflags, circuit);
       }
@@ -2178,7 +2181,7 @@ send_csnp (struct isis_circuit *circuit, int level)
   u_char start[ISIS_SYS_ID_LEN + 2];
   u_char stop[ISIS_SYS_ID_LEN + 2];
   struct list *list = NULL;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_lsp *lsp;
 
   memset (start, 0x00, ISIS_SYS_ID_LEN + 2);
@@ -2200,9 +2203,9 @@ send_csnp (struct isis_circuit *circuit, int level)
       if (isis->debugs & DEBUG_SNP_PACKETS)
        {
          zlog_debug ("ISIS-Snp (%s): Sent L%d CSNP on %s, length %ld",
-                     circuit->area->area_tag, level, circuit->interface->name,
-                     STREAM_SIZE (circuit->snd_stream));
-         LIST_LOOP (list, lsp, node)
+                    circuit->area->area_tag, level, circuit->interface->name,
+                    STREAM_SIZE (circuit->snd_stream));
+         for (ALL_LIST_ELEMENTS (list, node, nnode, lsp))
          {
            zlog_debug ("ISIS-Snp (%s):         CSNP entry %s, seq 0x%08x,"
                        " cksum 0x%04x, lifetime %us",
@@ -2275,7 +2278,7 @@ build_psnp (int level, struct isis_circuit *circuit, struct list *lsps)
   int retval = 0;
   struct isis_lsp *lsp;
   struct isis_passwd *passwd;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   if (level == 1)
     fill_fixed_hdr_andstream (&fixed_hdr, L1_PARTIAL_SEQ_NUM,
@@ -2313,7 +2316,7 @@ build_psnp (int level, struct isis_circuit *circuit, struct list *lsps)
 
   if (isis->debugs & DEBUG_SNP_PACKETS)
     {
-      LIST_LOOP (lsps, lsp, node)
+      for (ALL_LIST_ELEMENTS (lsps, node, nnode, lsp))
       {
        zlog_debug ("ISIS-Snp (%s):         PSNP entry %s, seq 0x%08x,"
                    " cksum 0x%04x, lifetime %us",
@@ -2343,7 +2346,7 @@ send_psnp (int level, struct isis_circuit *circuit)
   int retval = ISIS_OK;
   struct isis_lsp *lsp;
   struct list *list = NULL;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   if ((circuit->circ_type == CIRCUIT_T_BROADCAST &&
        !circuit->u.bc.is_dr[level - 1]) ||
@@ -2380,11 +2383,8 @@ send_psnp (int level, struct isis_circuit *circuit)
                   * sending succeeded, we can clear SSN flags of this circuit
                   * for the LSPs in list
                   */
-                 for (node = listhead (list); node; nextnode (node))
-                   {
-                     lsp = getdata (node);
-                     ISIS_CLEAR_FLAG (lsp->SSNflags, circuit);
-                   }
+                 for (ALL_LIST_ELEMENTS (list, node, nnode, lsp))
+                    ISIS_CLEAR_FLAG (lsp->SSNflags, circuit);
                }
            }
          list_delete (list);
@@ -2467,10 +2467,7 @@ send_lsp (struct thread *thread)
 
   if (circuit->state == C_STATE_UP)
     {
-      node = listhead (circuit->lsp_queue);
-      assert (node);
-
-      lsp = getdata (node);
+      lsp = listgetdata ((node = listhead (circuit->lsp_queue)));
 
       /*
        * Do not send if levels do not match
index 3ef903808f47c49182da5418ac03fc7b25673604..04346d4acbd0803d762c043f70d6f11a97838d41 100644 (file)
@@ -59,9 +59,8 @@ isis_nexthop_create (struct in_addr *ip, unsigned int ifindex)
   struct listnode *node;
   struct isis_nexthop *nexthop;
 
-  for (node = listhead (isis->nexthops); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (isis->nexthops, node, nexthop))
     {
-      nexthop = getdata (node);
       if (nexthop->ifindex != ifindex)
        continue;
       if (ip && memcmp (&nexthop->ip, ip, sizeof (struct in_addr)) != 0)
@@ -106,9 +105,8 @@ nexthoplookup (struct list *nexthops, struct in_addr *ip,
   struct listnode *node;
   struct isis_nexthop *nh;
 
-  for (node = listhead (nexthops); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (nexthops, node, nh))
     {
-      nh = getdata (node);
       if (!(memcmp (ip, &nh->ip, sizeof (struct in_addr))) &&
          ifindex == nh->ifindex)
        return 1;
@@ -133,8 +131,8 @@ nexthops_print (struct list *nhs)
 {
   struct listnode *node;
 
-  for (node = listhead (nhs); node; nextnode (node))
-    nexthop_print (getdata (node));
+  for (ALL_LIST_ELEMENTS_RO (nhs, node, nh))
+    nexthop_print (nh);
 }
 #endif /* 0 */
 
@@ -165,9 +163,8 @@ isis_nexthop6_create (struct in6_addr *ip6, unsigned int ifindex)
   struct listnode *node;
   struct isis_nexthop6 *nexthop6;
 
-  for (node = listhead (isis->nexthops6); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (isis->nexthops6, node, nexthop6))
     {
-      nexthop6 = getdata (node);
       if (nexthop6->ifindex != ifindex)
        continue;
       if (ip6 && memcmp (&nexthop6->ip6, ip6, sizeof (struct in6_addr)) != 0)
@@ -203,9 +200,8 @@ nexthop6lookup (struct list *nexthops6, struct in6_addr *ip6,
   struct listnode *node;
   struct isis_nexthop6 *nh6;
 
-  for (node = listhead (nexthops6); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (nexthops6, node, nh6))
     {
-      nh6 = getdata (node);
       if (!(memcmp (ip6, &nh6->ip6, sizeof (struct in6_addr))) &&
          ifindex == nh6->ifindex)
        return 1;
@@ -230,8 +226,8 @@ nexthops6_print (struct list *nhs6)
 {
   struct listnode *node;
 
-  for (node = listhead (nhs6); node; nextnode (node))
-    nexthop6_print (getdata (node));
+  for (ALL_LIST_ELEMENTS_RO (nhs6, node, nh6))
+    nexthop6_print (nh6);
 }
 #endif /* EXTREME_DEBUG */
 #endif /* HAVE_IPV6 */
@@ -240,14 +236,14 @@ static void
 adjinfo2nexthop (struct list *nexthops, struct isis_adjacency *adj)
 {
   struct isis_nexthop *nh;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct in_addr *ipv4_addr;
 
   if (adj->ipv4_addrs == NULL)
     return;
-  for (node = listhead (adj->ipv4_addrs); node; nextnode (node))
+
+  for (ALL_LIST_ELEMENTS (adj->ipv4_addrs, node, nnode, ipv4_addr))
     {
-      ipv4_addr = getdata (node);
       if (!nexthoplookup (nexthops, ipv4_addr,
                          adj->circuit->interface->ifindex))
        {
@@ -262,16 +258,15 @@ adjinfo2nexthop (struct list *nexthops, struct isis_adjacency *adj)
 static void
 adjinfo2nexthop6 (struct list *nexthops6, struct isis_adjacency *adj)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct in6_addr *ipv6_addr;
   struct isis_nexthop6 *nh6;
 
   if (!adj->ipv6_addrs)
     return;
 
-  for (node = listhead (adj->ipv6_addrs); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (adj->ipv6_addrs, node, nnode, ipv6_addr))
     {
-      ipv6_addr = getdata (node);
       if (!nexthop6lookup (nexthops6, ipv6_addr,
                           adj->circuit->interface->ifindex))
        {
@@ -289,7 +284,7 @@ isis_route_info_new (uint32_t cost, uint32_t depth, u_char family,
 {
   struct isis_route_info *rinfo;
   struct isis_adjacency *adj;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   rinfo = XMALLOC (MTYPE_ISIS_ROUTE_INFO, sizeof (struct isis_route_info));
   if (!rinfo)
@@ -302,21 +297,15 @@ isis_route_info_new (uint32_t cost, uint32_t depth, u_char family,
   if (family == AF_INET)
     {
       rinfo->nexthops = list_new ();
-      for (node = listhead (adjacencies); node; nextnode (node))
-       {
-         adj = getdata (node);
-         adjinfo2nexthop (rinfo->nexthops, adj);
-       }
+      for (ALL_LIST_ELEMENTS (adjacencies, node, nnode, adj))
+        adjinfo2nexthop (rinfo->nexthops, adj);
     }
 #ifdef HAVE_IPV6
   if (family == AF_INET6)
     {
       rinfo->nexthops6 = list_new ();
-      for (node = listhead (adjacencies); node; nextnode (node))
-       {
-         adj = getdata (node);
-         adjinfo2nexthop6 (rinfo->nexthops6, adj);
-       }
+      for (ALL_LIST_ELEMENTS (adjacencies, node, nnode, adj))
+        adjinfo2nexthop6 (rinfo->nexthops6, adj);
     }
 
 #endif /* HAVE_IPV6 */
@@ -363,7 +352,7 @@ static int
 isis_route_info_same (struct isis_route_info *new,
                      struct isis_route_info *old, u_char family)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_nexthop *nexthop;
 #ifdef HAVE_IPV6
   struct isis_nexthop6 *nexthop6;
@@ -373,40 +362,28 @@ isis_route_info_same (struct isis_route_info *new,
 
   if (family == AF_INET)
     {
-      for (node = listhead (new->nexthops); node; nextnode (node))
-       {
-         nexthop = (struct isis_nexthop *) getdata (node);
-         if (nexthoplookup (old->nexthops, &nexthop->ip, nexthop->ifindex) ==
-             0)
-           return 0;
-       }
-
-      for (node = listhead (old->nexthops); node; nextnode (node))
-       {
-         nexthop = (struct isis_nexthop *) getdata (node);
-         if (nexthoplookup (new->nexthops, &nexthop->ip, nexthop->ifindex) ==
-             0)
-           return 0;
-       }
+      for (ALL_LIST_ELEMENTS (new->nexthops, node, nnode, nexthop))
+        if (nexthoplookup (old->nexthops, &nexthop->ip, nexthop->ifindex) 
+              == 0)
+          return 0;
+
+      for (ALL_LIST_ELEMENTS (old->nexthops, node, nnode, nexthop))
+        if (nexthoplookup (new->nexthops, &nexthop->ip, nexthop->ifindex) 
+             == 0)
+          return 0;
     }
 #ifdef HAVE_IPV6
   else if (family == AF_INET6)
     {
-      for (node = listhead (new->nexthops6); node; nextnode (node))
-       {
-         nexthop6 = (struct isis_nexthop6 *) getdata (node);
-         if (nexthop6lookup (old->nexthops6, &nexthop6->ip6,
-                             nexthop6->ifindex) == 0)
-           return 0;
-       }
-
-      for (node = listhead (old->nexthops6); node; nextnode (node))
-       {
-         nexthop6 = (struct isis_nexthop6 *) getdata (node);
-         if (nexthop6lookup (new->nexthops6, &nexthop6->ip6,
-                             nexthop6->ifindex) == 0)
-           return 0;
-       }
+      for (ALL_LIST_ELEMENTS (new->nexthops6, node, nnode, nexthop6))
+        if (nexthop6lookup (old->nexthops6, &nexthop6->ip6,
+                            nexthop6->ifindex) == 0)
+          return 0;
+
+      for (ALL_LIST_ELEMENTS (old->nexthops6, node, nnode, nexthop6))
+        if (nexthop6lookup (new->nexthops6, &nexthop6->ip6,
+                            nexthop6->ifindex) == 0)
+          return 0;
     }
 #endif /* HAVE_IPV6 */
 
@@ -416,12 +393,11 @@ isis_route_info_same (struct isis_route_info *new,
 static void
 isis_nexthops_merge (struct list *new, struct list *old)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_nexthop *nexthop;
 
-  for (node = listhead (new); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (new, node, nnode, nexthop))
     {
-      nexthop = (struct isis_nexthop *) getdata (node);
       if (nexthoplookup (old, &nexthop->ip, nexthop->ifindex))
        continue;
       listnode_add (old, nexthop);
@@ -433,12 +409,11 @@ isis_nexthops_merge (struct list *new, struct list *old)
 static void
 isis_nexthops6_merge (struct list *new, struct list *old)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_nexthop6 *nexthop6;
 
-  for (node = listhead (new); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (new, node, nnode, nexthop6))
     {
-      nexthop6 = (struct isis_nexthop6 *) getdata (node);
       if (nexthop6lookup (old, &nexthop6->ip6, nexthop6->ifindex))
        continue;
       listnode_add (old, nexthop6);
index 90a9ac582f506114ff81b768eafdb2a53f34b8b7..dc5765a577ec4f94723fef833be20cc2f2a73f16 100644 (file)
@@ -67,18 +67,13 @@ union_adjlist (struct list *target, struct list *source)
   struct listnode *node, *node2;
 
   zlog_debug ("Union adjlist!");
-  for (node = listhead (source); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (source, node, adj))
     {
-      adj = getdata (node);
-
       /* lookup adjacency in the source list */
-      for (node2 = listhead (target); node2; nextnode (node2))
-       {
-         adj2 = getdata (node2);
-         if (adj == adj2)
+      for (ALL_LIST_ELEMENTS_RO (target, node2, adj2))
+        if (adj == adj2)
            break;
-       }
-
+      
       if (!node2)
        listnode_add (target, adj);
     }
@@ -89,16 +84,16 @@ union_adjlist (struct list *target, struct list *source)
 static void
 remove_excess_adjs (struct list *adjs)
 {
-  struct listnode *node, *excess = NULL;
+  struct listnode *node, *nnode, *excess = NULL;
   struct isis_adjacency *adj, *candidate = NULL;
   int comp;
 
-  for (node = listhead (adjs); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (adjs, node, nnode, adj)) 
     {
       if (excess == NULL)
        excess = node;
-      candidate = getdata (excess);
-      adj = getdata (node);
+      candidate = listgetdata (excess);
+
       if (candidate->sys_type < adj->sys_type)
        {
          excess = node;
@@ -360,9 +355,8 @@ isis_find_vertex (struct list *list, void *id, enum vertextype vtype)
   struct isis_vertex *vertex;
   struct prefix *p1, *p2;
 
-  for (node = listhead (list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (list, node, vertex))
     {
-      vertex = getdata (node);
       if (vertex->type != vtype)
        continue;
       switch (vtype)
@@ -426,9 +420,11 @@ isis_spf_add2tent (struct isis_spftree *spftree, enum vertextype vtype,
       listnode_add (spftree->tents, vertex);
       return vertex;
     }
-  for (node = listhead (spftree->tents); node; nextnode (node))
+  
+  /* XXX: This cant use the standard ALL_LIST_ELEMENT macro */
+  for (node = listhead (spftree->tents); node; node = listnextnode (node))
     {
-      v = getdata (node);
+      v = listgetdata (node);
       if (v->d_N > vertex->d_N)
        {
          list_add_node_prev (spftree->tents, node, vertex);
@@ -443,8 +439,9 @@ isis_spf_add2tent (struct isis_spftree *spftree, enum vertextype vtype,
                {
                  break;
                }
-             nextnode (node);
-             (node) ? (v = getdata (node)) : (v = NULL);
+              /* XXX: this seems dubious, node is the loop iterator */
+             node = listnextnode (node);
+             (node) ? (v = listgetdata (node)) : (v = NULL);
            }
          list_add_node_prev (spftree->tents, node, vertex);
          break;
@@ -586,10 +583,8 @@ lspfragloop:
     {
       if (lsp->tlv_data.is_neighs)
        {
-         for (node = listhead (lsp->tlv_data.is_neighs); node;
-              nextnode (node))
+          for (ALL_LIST_ELEMENTS_RO (lsp->tlv_data.is_neighs, node, is_neigh))
            {
-             is_neigh = getdata (node);
              /* C.2.6 a) */
              /* Two way connectivity */
              if (!memcmp (is_neigh->neigh_id, isis->sysid, ISIS_SYS_ID_LEN))
@@ -604,10 +599,9 @@ lspfragloop:
       if (family == AF_INET && lsp->tlv_data.ipv4_int_reachs)
        {
          prefix.family = AF_INET;
-         for (node = listhead (lsp->tlv_data.ipv4_int_reachs); node;
-              nextnode (node))
+          for (ALL_LIST_ELEMENTS_RO (lsp->tlv_data.ipv4_int_reachs, 
+                                     node, ipreach))
            {
-             ipreach = getdata (node);
              dist = cost + ipreach->metrics.metric_default;
              vtype = VTYPE_IPREACH_INTERNAL;
              prefix.u.prefix4 = ipreach->prefix;
@@ -620,10 +614,9 @@ lspfragloop:
       if (family == AF_INET && lsp->tlv_data.ipv4_ext_reachs)
        {
          prefix.family = AF_INET;
-         for (node = listhead (lsp->tlv_data.ipv4_ext_reachs); node;
-              nextnode (node))
+          for (ALL_LIST_ELEMENTS_RO (lsp->tlv_data.ipv4_ext_reachs,
+                                     node, ipreach))
            {
-             ipreach = getdata (node);
              dist = cost + ipreach->metrics.metric_default;
              vtype = VTYPE_IPREACH_EXTERNAL;
              prefix.u.prefix4 = ipreach->prefix;
@@ -636,10 +629,9 @@ lspfragloop:
       if (family == AF_INET6 && lsp->tlv_data.ipv6_reachs)
        {
          prefix.family = AF_INET6;
-         for (node = listhead (lsp->tlv_data.ipv6_reachs); node;
-              nextnode (node))
+          for (ALL_LIST_ELEMENTS_RO (lsp->tlv_data.ipv6_reachs, 
+                                     node, ip6reach))
            {
-             ip6reach = getdata (node);
              dist = cost + ip6reach->metric;
              vtype = (ip6reach->control_info & CTRL_INFO_DISTRIBUTION) ?
                VTYPE_IP6REACH_EXTERNAL : VTYPE_IP6REACH_INTERNAL;
@@ -656,11 +648,11 @@ lspfragloop:
   if (fragnode == NULL)
     fragnode = listhead (lsp->lspu.frags);
   else
-    nextnode (fragnode);
+    fragnode = listnextnode (fragnode);
 
   if (fragnode)
     {
-      lsp = getdata (fragnode);
+      lsp = listgetdata (fragnode);
       goto lspfragloop;
     }
 
@@ -672,7 +664,7 @@ isis_spf_process_pseudo_lsp (struct isis_spftree *spftree,
                             struct isis_lsp *lsp, uint16_t cost,
                             uint16_t depth, int family)
 {
-  struct listnode *node, *fragnode = NULL;
+  struct listnode *node, *nnode, *fragnode = NULL;
   struct is_neigh *is_neigh;
   enum vertextype vtype;
 
@@ -685,11 +677,8 @@ pseudofragloop:
       return ISIS_WARNING;
     }
 
-  for (node = (lsp->tlv_data.is_neighs ?
-              listhead (lsp->tlv_data.is_neighs) : NULL);
-       node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (lsp->tlv_data.is_neighs, node, nnode, is_neigh))
     {
-      is_neigh = getdata (node);
       vtype = LSP_PSEUDO_ID (is_neigh->neigh_id) ? VTYPE_PSEUDO_IS
        : VTYPE_NONPSEUDO_IS;
       /* Two way connectivity */
@@ -709,11 +698,11 @@ pseudofragloop:
   if (fragnode == NULL)
     fragnode = listhead (lsp->lspu.frags);
   else
-    nextnode (fragnode);
+    fragnode = listnextnode (fragnode);
 
   if (fragnode)
     {
-      lsp = getdata (fragnode);
+      lsp = listgetdata (fragnode);
       goto pseudofragloop;
     }
 
@@ -726,7 +715,9 @@ isis_spf_preload_tent (struct isis_spftree *spftree,
 {
   struct isis_vertex *vertex;
   struct isis_circuit *circuit;
-  struct listnode *cnode, *anode, *ipnode;
+  struct listnode *cnode, *cnnode;
+  struct listnode *anode;
+  struct listnode *ipnode, *ipnnode;
   struct isis_adjacency *adj;
   struct isis_lsp *lsp;
   struct list *adj_list;
@@ -739,9 +730,8 @@ isis_spf_preload_tent (struct isis_spftree *spftree,
   struct prefix_ipv6 *ipv6;
 #endif /* HAVE_IPV6 */
 
-  for (cnode = listhead (area->circuit_list); cnode; nextnode (cnode))
+  for (ALL_LIST_ELEMENTS (area->circuit_list, cnode, cnnode, circuit))
     {
-      circuit = getdata (cnode);
       if (circuit->state != C_STATE_UP)
        continue;
       if (!(circuit->circuit_is_type & level))
@@ -758,11 +748,8 @@ isis_spf_preload_tent (struct isis_spftree *spftree,
       if (family == AF_INET)
        {
          prefix.family = AF_INET;
-         for (ipnode =
-              (circuit->ip_addrs ? listhead (circuit->ip_addrs) : NULL);
-              ipnode; nextnode (ipnode))
+          for (ALL_LIST_ELEMENTS (circuit->ip_addrs, ipnode, ipnnode, ipv4))
            {
-             ipv4 = getdata (ipnode);
              prefix.u.prefix4 = ipv4->prefix;
              prefix.prefixlen = ipv4->prefixlen;
              isis_spf_add_local (spftree, VTYPE_IPREACH_INTERNAL, &prefix,
@@ -773,11 +760,9 @@ isis_spf_preload_tent (struct isis_spftree *spftree,
       if (family == AF_INET6)
        {
          prefix.family = AF_INET6;
-         for (ipnode = (circuit->ipv6_non_link ? listhead
-                        (circuit->ipv6_non_link) : NULL); ipnode;
-              nextnode (ipnode))
+         for (ALL_LIST_ELEMENTS (circuit->ipv6_non_link, 
+                                 ipnode, ipnnode, ipv6))
            {
-             ipv6 = getdata (ipnode);
              prefix.prefixlen = ipv6->prefixlen;
              prefix.u.prefix6 = ipv6->prefix;
              isis_spf_add_local (spftree, VTYPE_IP6REACH_INTERNAL,
@@ -803,10 +788,10 @@ isis_spf_preload_tent (struct isis_spftree *spftree,
          anode = listhead (adj_list);
          while (anode)
            {
-             adj = getdata (anode);
+             adj = listgetdata (anode);
              if (!speaks (&adj->nlpids, family))
                {
-                 nextnode (anode);
+                 anode = listnextnode (anode);
                  continue;
                }
              switch (adj->sys_type)
@@ -840,7 +825,7 @@ isis_spf_preload_tent (struct isis_spftree *spftree,
                default:
                  zlog_warn ("isis_spf_preload_tent unknow adj type");
                }
-             nextnode (anode);
+             anode = listnextnode (anode);
            }
          list_delete (adj_list);
          /*
@@ -990,7 +975,7 @@ isis_run_spf (struct isis_area *area, int level, int family)
   while (listcount (spftree->tents) > 0)
     {
       node = listhead (spftree->tents);
-      vertex = getdata (node);
+      vertex = listgetdata (node);
       /* Remove from tent list */
       list_delete_node (spftree->tents, node);
       if (isis_find_vertex (spftree->paths, vertex->N.id, vertex->type))
@@ -1262,7 +1247,7 @@ isis_spf_schedule6 (struct isis_area *area, int level)
 static void
 isis_print_paths (struct vty *vty, struct list *paths)
 {
-  struct listnode *node, *anode;
+  struct listnode *node;
   struct isis_vertex *vertex;
   struct isis_dynhn *dyn, *nh_dyn = NULL;
   struct isis_adjacency *adj;
@@ -1272,9 +1257,9 @@ isis_print_paths (struct vty *vty, struct list *paths)
 
   vty_out (vty, "System Id            Metric     Next-Hop"
           "             Interface   SNPA%s", VTY_NEWLINE);
-  for (node = listhead (paths); node; nextnode (node))
+
+  for (ALL_LIST_ELEMENTS_RO (paths, node, vertex))
     {
-      vertex = getdata (node);
       if (vertex->type != VTYPE_NONPSEUDO_IS)
        continue;
       if (memcmp (vertex->N.id, isis->sysid, ISIS_SYS_ID_LEN) == 0)
@@ -1285,8 +1270,7 @@ isis_print_paths (struct vty *vty, struct list *paths)
       else
        {
          dyn = dynhn_find_by_id ((u_char *) vertex->N.id);
-         anode = listhead (vertex->Adj_N);
-         adj = getdata (anode);
+         adj = listgetdata (listhead (vertex->Adj_N));
          if (adj)
            {
              nh_dyn = dynhn_find_by_id (adj->sysid);
@@ -1326,10 +1310,8 @@ DEFUN (show_isis_topology,
   if (!isis->area_list || isis->area_list->count == 0)
     return CMD_SUCCESS;
 
-  for (node = listhead (isis->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
     {
-      area = getdata (node);
-
       vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
               VTY_NEWLINE);
 
@@ -1372,10 +1354,8 @@ DEFUN (show_isis_topology_l1,
   if (!isis->area_list || isis->area_list->count == 0)
     return CMD_SUCCESS;
 
-  for (node = listhead (isis->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
     {
-      area = getdata (node);
-
       vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
               VTY_NEWLINE);
 
@@ -1414,10 +1394,8 @@ DEFUN (show_isis_topology_l2,
   if (!isis->area_list || isis->area_list->count == 0)
     return CMD_SUCCESS;
 
-  for (node = listhead (isis->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
     {
-      area = getdata (node);
-
       vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
               VTY_NEWLINE);
 
index bc65363237e3a54caf4a271c0d9fc2ea626ded8f..3dae5d89da73cb7fac98774dd8655f64189f7068 100644 (file)
@@ -776,9 +776,8 @@ tlv_add_area_addrs (struct list *area_addrs, struct stream *stream)
   u_char value[255];
   u_char *pos = value;
 
-  for (node = listhead (area_addrs); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (area_addrs, node, area_addr))
     {
-      area_addr = getdata (node);
       if (pos - value + area_addr->addr_len > 255)
        goto err;
       *pos = area_addr->addr_len;
@@ -797,7 +796,7 @@ err:
 int
 tlv_add_is_neighs (struct list *is_neighs, struct stream *stream)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct is_neigh *is_neigh;
   u_char value[255];
   u_char *pos = value;
@@ -806,9 +805,8 @@ tlv_add_is_neighs (struct list *is_neighs, struct stream *stream)
   *pos = 0;                    /*is_neigh->virtual; */
   pos++;
 
-  for (node = listhead (is_neighs); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (is_neighs, node, nnode, is_neigh))
     {
-      is_neigh = getdata (node);
       if (pos - value + IS_NEIGHBOURS_LEN > 255)
        {
          retval = add_tlv (IS_NEIGHBOURS, pos - value, value, stream);
@@ -834,15 +832,14 @@ tlv_add_is_neighs (struct list *is_neighs, struct stream *stream)
 int
 tlv_add_lan_neighs (struct list *lan_neighs, struct stream *stream)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   u_char *snpa;
   u_char value[255];
   u_char *pos = value;
   int retval;
 
-  for (node = listhead (lan_neighs); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (lan_neighs, node, nnode, snpa))
     {
-      snpa = getdata (node);
       if (pos - value + ETH_ALEN > 255)
        {
          retval = add_tlv (LAN_NEIGHBOURS, pos - value, value, stream);
@@ -901,15 +898,14 @@ tlv_add_checksum (struct checksum *checksum, struct stream *stream)
 int
 tlv_add_ip_addrs (struct list *ip_addrs, struct stream *stream)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct prefix_ipv4 *ipv4;
   u_char value[255];
   u_char *pos = value;
   int retval;
 
-  for (node = listhead (ip_addrs); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (ip_addrs, node, nnode, ipv4))
     {
-      ipv4 = getdata (node);
       if (pos - value + IPV4_MAX_BYTELEN > 255)
        {
          retval = add_tlv (IPV4_ADDR, pos - value, value, stream);
@@ -934,15 +930,14 @@ tlv_add_dynamic_hostname (struct hostname *hostname, struct stream *stream)
 int
 tlv_add_lsp_entries (struct list *lsps, struct stream *stream)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_lsp *lsp;
   u_char value[255];
   u_char *pos = value;
   int retval;
 
-  for (node = listhead (lsps); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (lsps, node, nnode, lsp))
     {
-      lsp = getdata (node);
       if (pos - value + LSP_ENTRIES_LEN > 255)
        {
          retval = add_tlv (LSP_ENTRIES, pos - value, value, stream);
@@ -966,15 +961,14 @@ tlv_add_lsp_entries (struct list *lsps, struct stream *stream)
 int
 tlv_add_ipv4_reachs (struct list *ipv4_reachs, struct stream *stream)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ipv4_reachability *reach;
   u_char value[255];
   u_char *pos = value;
   int retval;
 
-  for (node = listhead (ipv4_reachs); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (ipv4_reachs, node, nnode, reach))
     {
-      reach = getdata (node);
       if (pos - value + IPV4_REACH_LEN > 255)
        {
          retval =
@@ -1005,15 +999,14 @@ tlv_add_ipv4_reachs (struct list *ipv4_reachs, struct stream *stream)
 int
 tlv_add_ipv6_addrs (struct list *ipv6_addrs, struct stream *stream)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct prefix_ipv6 *ipv6;
   u_char value[255];
   u_char *pos = value;
   int retval;
 
-  for (node = listhead (ipv6_addrs); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (ipv6_addrs, node, nnode, ipv6))
     {
-      ipv6 = getdata (node);
       if (pos - value + IPV6_MAX_BYTELEN > 255)
        {
          retval = add_tlv (IPV6_ADDR, pos - value, value, stream);
@@ -1031,15 +1024,14 @@ tlv_add_ipv6_addrs (struct list *ipv6_addrs, struct stream *stream)
 int
 tlv_add_ipv6_reachs (struct list *ipv6_reachs, struct stream *stream)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ipv6_reachability *ip6reach;
   u_char value[255];
   u_char *pos = value;
   int retval, prefix_octets;
 
-  for (node = listhead (ipv6_reachs); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (ipv6_reachs, node, nnode, ip6reach))
     {
-      ip6reach = getdata (node);
       if (pos - value + IPV6_MAX_BYTELEN + 6 > 255)
        {
          retval = add_tlv (IPV6_REACHABILITY, pos - value, value, stream);
index 4690fe3116ebf0399c3bb549b4f7e4039b69dd42..f45b9c13846e703a3357068e6ceb16cb8aab22f1 100644 (file)
@@ -280,9 +280,8 @@ isis_zebra_route_add_ipv4 (struct prefix *prefix,
       stream_putc (stream, listcount (route_info->nexthops));
 
       /* Nexthop, ifindex, distance and metric information */
-      for (node = listhead (route_info->nexthops); node; nextnode (node))
+      for (ALL_LIST_ELEMENTS_RO (route_info->nexthops, node, nexthop))
        {
-         nexthop = getdata (node);
          /* FIXME: can it be ? */
          if (nexthop->ip.s_addr != INADDR_ANY)
            {
@@ -379,10 +378,8 @@ isis_zebra_route_add_ipv6 (struct prefix *prefix,
 
   /* for each nexthop */
   i = 0;
-  for (node = listhead (route_info->nexthops6); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (route_info->nexthops6, node, nexthop6))
     {
-      nexthop6 = getdata (node);
-
       if (!IN6_IS_ADDR_LINKLOCAL (&nexthop6->ip6) &&
          !IN6_IS_ADDR_UNSPECIFIED (&nexthop6->ip6))
        {
@@ -458,10 +455,8 @@ isis_zebra_route_del_ipv6 (struct prefix *prefix,
 
   /* for each nexthop */
   i = 0;
-  for (node = listhead (route_info->nexthops6); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (route_info->nexthops6, node, nexthop6))
     {
-      nexthop6 = getdata (node);
-
       if (!IN6_IS_ADDR_LINKLOCAL (&nexthop6->ip6) &&
          !IN6_IS_ADDR_UNSPECIFIED (&nexthop6->ip6))
        {
index 229f1356a9147af82aec7e673a2f9af046797ae0..c2bb90644e5f1157f6374b7d03c365587e3b6f58 100644 (file)
@@ -144,9 +144,9 @@ struct isis_area *
 isis_area_lookup (const char *area_tag)
 {
   struct isis_area *area;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
-  LIST_LOOP (isis->area_list, area, node)
+  for (ALL_LIST_ELEMENTS (isis->area_list, node, nnode, area))
     if ((area->area_tag == NULL && area_tag == NULL) ||
        (area->area_tag && area_tag
         && strcmp (area->area_tag, area_tag) == 0))
@@ -185,7 +185,7 @@ int
 isis_area_destroy (struct vty *vty, const char *area_tag)
 {
   struct isis_area *area;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_circuit *circuit;
 
   area = isis_area_lookup (area_tag);
@@ -198,13 +198,9 @@ isis_area_destroy (struct vty *vty, const char *area_tag)
 
   if (area->circuit_list)
     {
-      node = listhead (area->circuit_list);
-      while (node)
-       {
-         circuit = getdata (node);
-         nextnode (node);
-         isis_circuit_del (circuit);
-       }
+      for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))
+        isis_circuit_del (circuit);
+      
       list_delete (area->circuit_list);
     }
   listnode_delete (isis->area_list, area);
@@ -225,7 +221,7 @@ area_net_title (struct vty *vty, u_char *net_title)
   struct isis_area *area;
   struct area_addr *addr;
   struct area_addr *addrp;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   u_char buff[255];
   area = vty->index;
@@ -284,7 +280,7 @@ area_net_title (struct vty *vty, u_char *net_title)
        }
 
       /* now we see that we don't already have this address */
-      LIST_LOOP (area->area_addrs, addrp, node)
+      for (ALL_LIST_ELEMENTS (area->area_addrs, node, nnode, addrp))
       {
        if ((addrp->addr_len + ISIS_SYS_ID_LEN + 1) == (addr->addr_len))
          {
@@ -318,7 +314,7 @@ area_clear_net_title (struct vty *vty, u_char *net_title)
 {
   struct isis_area *area;
   struct area_addr addr, *addrp = NULL;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   u_char buff[255];
 
   area = vty->index;
@@ -338,7 +334,7 @@ area_clear_net_title (struct vty *vty, u_char *net_title)
 
   memcpy (addr.area_addr, buff, (int) addr.addr_len);
 
-  LIST_LOOP (area->area_addrs, addrp, node)
+  for (ALL_LIST_ELEMENTS (area->area_addrs, node, nnode, addrp))
     if (addrp->addr_len == addr.addr_len &&
        !memcmp (addrp->area_addr, addr.area_addr, addr.addr_len))
     break;
@@ -362,7 +358,7 @@ area_clear_net_title (struct vty *vty, u_char *net_title)
 int
 show_clns_neigh (struct vty *vty, char detail)
 {
-  struct listnode *node_area, *node_circ;
+  struct listnode *anode, *annode, *cnode, *cnnode;
   struct isis_area *area;
   struct isis_circuit *circuit;
   struct list *db;
@@ -374,20 +370,16 @@ show_clns_neigh (struct vty *vty, char detail)
       return CMD_SUCCESS;
     }
 
-  for (node_area = listhead (isis->area_list); node_area;
-       nextnode (node_area))
+  for (ALL_LIST_ELEMENTS (isis->area_list, anode, annode, area))
     {
-      area = getdata (node_area);
       vty_out (vty, "Area %s:%s", area->area_tag, VTY_NEWLINE);
 
       if (detail == ISIS_UI_LEVEL_BRIEF)
        vty_out (vty, "  System Id           Interface   L  State        "
                 "Holdtime SNPA%s", VTY_NEWLINE);
 
-      for (node_circ = listhead (area->circuit_list); node_circ;
-          nextnode (node_circ))
+      for (ALL_LIST_ELEMENTS (area->circuit_list, cnode, cnnode, circuit))
        {
-         circuit = getdata (node_circ);
          if (circuit->circ_type == CIRCUIT_T_BROADCAST)
            {
              for (i = 0; i < 2; i++)
@@ -902,16 +894,15 @@ DEFUN (show_database,
        "show isis database",
        SHOW_STR "IS-IS information\n" "IS-IS link state database\n")
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_area *area;
   int level, lsp_count;
 
   if (isis->area_list->count == 0)
     return CMD_SUCCESS;
 
-  for (node = listhead (isis->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (isis->area_list, node, nnode, area))
     {
-      area = getdata (node);
       vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
               VTY_NEWLINE);
       for (level = 0; level < ISIS_LEVELS; level++)
@@ -941,16 +932,15 @@ DEFUN (show_database_detail,
        "IS-IS information\n"
        "IS-IS link state database\n")
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct isis_area *area;
   int level, lsp_count;
 
   if (isis->area_list->count == 0)
     return CMD_SUCCESS;
 
-  for (node = listhead (isis->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (isis->area_list, node, nnode, area))
     {
-      area = getdata (node);
       vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
               VTY_NEWLINE);
       for (level = 0; level < ISIS_LEVELS; level++)
@@ -1222,7 +1212,7 @@ DEFUN (no_is_type,
    * Put the is-type back to default. Which is level-1-2 on first
    * circuit for the area level-1 for the rest
    */
-  if (getdata (listhead (isis->area_list)) == area)
+  if (listgetdata (listhead (isis->area_list)) == area)
     type = IS_LEVEL_1_AND_2;
   else
     type = IS_LEVEL_1;
@@ -1603,10 +1593,10 @@ DEFUN (show_isis_generated_topology,
        "CLNS neighbor adjacencies\n")
 {
   struct isis_area *area;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct listnode *node2;
   struct arc *arc;
-  LIST_LOOP (isis->area_list, area, node)
+  for (ALL_LIST_ELEMENTS (isis->area_list, node, nnode, area))
   {
     if (area->topology)
       {
@@ -1852,10 +1842,10 @@ isis_config_write (struct vty *vty)
   if (isis != NULL)
     {
       struct isis_area *area;
-      struct listnode *node;
-      struct listnode *node2;
+      struct listnode *node, *nnode;
+      struct listnode *node2, *nnode2;
 
-      LIST_LOOP (isis->area_list, area, node)
+      for (ALL_LIST_ELEMENTS (isis->area_list, node, nnode, area))
       {
        /* ISIS - Area name */
        vty_out (vty, "router isis %s%s", area->area_tag, VTY_NEWLINE);
@@ -1864,7 +1854,7 @@ isis_config_write (struct vty *vty)
        if (listcount (area->area_addrs) > 0)
          {
            struct area_addr *area_addr;
-           LIST_LOOP (area->area_addrs, area_addr, node2)
+           for (ALL_LIST_ELEMENTS (area->area_addrs, node2, nnode2, area_addr))
            {
              vty_out (vty, " net %s%s",
                       isonet_print (area_addr->area_addr,
index ee20de8478e50d2eafaa987fdb0ee34472d48e70..3473257ad520a18216f8e53e361b71ffff6bd62b 100644 (file)
@@ -1,3 +1,25 @@
+2005-04-07 Paul Jakma <paul.jakma@sun.com>
+
+       * linklist.h: Add usage comments.         
+         Rename getdata macro to listgetdata.
+         Rename nextnode to listnextnode and fix its odd behaviour to be
+         less dangerous.
+         Make listgetdata macro assert node is not null, NULL list entries
+          should be bug condition.
+          ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
+          with for loop, Suggested by Jim Carlson of Sun.
+          Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
+          "safety" of previous macro.
+         LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
+         distinguish from the similarly named functions, and reflect their
+         effect better.
+         Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section 
+         with the old defines which were modified above, 
+         for backwards compatibility - guarded to prevent Quagga using it..
+       * linklist.c: fix up for linklist.h changes.
+       * *.c: fix up for new list loop macro, try audit other loop
+          usage at same time, to some degree.
+
 2004-04-05 Hasso Tepper <hasso at quagga.net>
 
        * lib/prefix.[hc]: inet6_ntoa utility function copied from
index dbf4f20276426e6ebda9edf2e92215f9e4d338a6..35fe9caa84097a5593ec591b3331f5523bc570f9 100644 (file)
--- a/lib/if.c
+++ b/lib/if.c
@@ -183,9 +183,8 @@ if_lookup_by_index (unsigned int index)
   struct listnode *node;
   struct interface *ifp;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO(iflist, node, ifp))
     {
-      ifp = getdata (node);
       if (ifp->ifindex == index)
        return ifp;
     }
@@ -216,9 +215,8 @@ if_lookup_by_name (const char *name)
   struct listnode *node;
   struct interface *ifp;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
       if (strcmp(name, ifp->name) == 0)
        return ifp;
     }
@@ -229,15 +227,13 @@ struct interface *
 if_lookup_by_name_len(const char *name, size_t namelen)
 {
   struct listnode *node;
+  struct interface *ifp;
 
   if (namelen > INTERFACE_NAMSIZ)
     return NULL;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      struct interface *ifp;
-
-      ifp = getdata (node);
       if (!memcmp(name, ifp->name, namelen) && (ifp->name[namelen] == '\0'))
        return ifp;
     }
@@ -254,14 +250,10 @@ if_lookup_exact_address (struct in_addr src)
   struct prefix *p;
   struct connected *c;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
-
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, c))
        {
-         c = getdata (cnode);
-
          p = c->address;
 
          if (p && p->family == AF_INET)
@@ -293,14 +285,10 @@ if_lookup_address (struct in_addr src)
 
   match = NULL;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
-
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, c))
        {
-         c = getdata (cnode);
-
          if (c->address && (c->address->family == AF_INET))
            {
              if (CONNECTED_POINTOPOINT_HOST(c))
@@ -450,6 +438,7 @@ void
 if_dump (struct interface *ifp)
 {
   struct listnode *node;
+  struct connected *c;
 
   zlog_info ("Interface %s index %d metric %d mtu %d "
 #ifdef HAVE_IPV6
@@ -462,7 +451,7 @@ if_dump (struct interface *ifp)
 #endif /* HAVE_IPV6 */
             if_flag_dump (ifp->flags));
   
-  for (node = listhead (ifp->connected); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, c))
     ;
 }
 
@@ -471,9 +460,10 @@ void
 if_dump_all ()
 {
   struct listnode *node;
+  void *p;
 
-  for (node = listhead (iflist); node; nextnode (node))
-    if_dump (getdata (node));
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, p))
+    if_dump (p);
 }
 
 DEFUN (interface_desc, 
@@ -581,13 +571,10 @@ DEFUN (show_address,
   struct connected *ifc;
   struct prefix *p;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
-
-      for (node2 = listhead (ifp->connected); node2; nextnode (node2))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, node2, ifc))
        {
-         ifc = getdata (node2);
          p = ifc->address;
 
          if (p->family == AF_INET)
@@ -677,7 +664,7 @@ connected_delete_by_prefix (struct interface *ifp, struct prefix *p)
   /* In case of same prefix come, replace it with new one. */
   for (node = listhead (ifp->connected); node; node = next)
     {
-      ifc = getdata (node);
+      ifc = listgetdata (node);
       next = node->next;
 
       if (connected_same_prefix (ifc->address, p))
@@ -706,10 +693,8 @@ connected_lookup_address (struct interface *ifp, struct in_addr dst)
 
   match = NULL;
 
-  for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, c))
     {
-      c = getdata (cnode);
-
       if (c->address && (c->address->family == AF_INET))
         {
          if (CONNECTED_POINTOPOINT_HOST(c))
@@ -838,7 +823,6 @@ ifaddr_ipv4_lookup (struct in_addr *addr, unsigned int ifindex)
   struct prefix_ipv4 p;
   struct route_node *rn;
   struct interface *ifp;
-  struct listnode *node;
 
   if (addr)
     {
index a3219ef410ec524a093846e76111871ff341f60c..2b5b06840c17a242c612ba61e65c855eb4ff074b 100644 (file)
@@ -61,13 +61,13 @@ key_free (struct key *key)
 struct keychain *
 keychain_lookup (const char *name)
 {
-  struct listnode *nn;
+  struct listnode *node;
   struct keychain *keychain;
 
   if (name == NULL)
     return NULL;
 
-  LIST_LOOP (keychain_list, keychain, nn)
+  for (ALL_LIST_ELEMENTS_RO (keychain_list, node, keychain))
     {
       if (strcmp (keychain->name, name) == 0)
        return keychain;
@@ -127,10 +127,10 @@ keychain_delete (struct keychain *keychain)
 struct key *
 key_lookup (const struct keychain *keychain, u_int32_t index)
 {
-  struct listnode *nn;
+  struct listnode *node;
   struct key *key;
 
-  LIST_LOOP (keychain->key, key, nn)
+  for (ALL_LIST_ELEMENTS_RO (keychain->key, node, key))
     {
       if (key->index == index)
        return key;
@@ -141,13 +141,13 @@ key_lookup (const struct keychain *keychain, u_int32_t index)
 struct key *
 key_lookup_for_accept (const struct keychain *keychain, u_int32_t index)
 {
-  struct listnode *nn;
+  struct listnode *node;
   struct key *key;
   time_t now;
 
   now = time (NULL);
 
-  LIST_LOOP (keychain->key, key, nn)
+  for (ALL_LIST_ELEMENTS_RO (keychain->key, node, key))
     {
       if (key->index >= index)
        {
@@ -165,13 +165,13 @@ key_lookup_for_accept (const struct keychain *keychain, u_int32_t index)
 struct key *
 key_match_for_accept (const struct keychain *keychain, const char *auth_str)
 {
-  struct listnode *nn;
+  struct listnode *node;
   struct key *key;
   time_t now;
 
   now = time (NULL);
 
-  LIST_LOOP (keychain->key, key, nn)
+  for (ALL_LIST_ELEMENTS_RO (keychain->key, node, key))
     {
       if (key->accept.start == 0 ||
          (key->accept.start <= now &&
@@ -185,13 +185,13 @@ key_match_for_accept (const struct keychain *keychain, const char *auth_str)
 struct key *
 key_lookup_for_send (const struct keychain *keychain)
 {
-  struct listnode *nn;
+  struct listnode *node;
   struct key *key;
   time_t now;
 
   now = time (NULL);
 
-  LIST_LOOP (keychain->key, key, nn)
+  for (ALL_LIST_ELEMENTS_RO (keychain->key, node, key))
     {
       if (key->send.start == 0)
        return key;
@@ -881,15 +881,15 @@ keychain_config_write (struct vty *vty)
 {
   struct keychain *keychain;
   struct key *key;
-  struct listnode *nn;
-  struct listnode *nm;
+  struct listnode *node;
+  struct listnode *knode;
   char buf[BUFSIZ];
 
-  LIST_LOOP (keychain_list, keychain, nn)
+  for (ALL_LIST_ELEMENTS_RO (keychain_list, node, keychain))
     {
       vty_out (vty, "key chain %s%s", keychain->name, VTY_NEWLINE);
       
-      LIST_LOOP (keychain->key, key, nm)
+      for (ALL_LIST_ELEMENTS_RO (keychain->key, knode, key))
        {
          vty_out (vty, " key %d%s", key->index, VTY_NEWLINE);
 
index 3970c24ff9798fe12d87e923dc6f323bddb82374..4c47153320fcd9c71553086916ff92aec1446c85 100644 (file)
@@ -247,8 +247,8 @@ listnode_lookup (struct list *list, void *data)
   struct listnode *node;
 
   assert(list);
-  for (node = list->head; node; nextnode (node))
-    if (data == getdata (node))
+  for (node = listhead(list); node; node = listnextnode (node))
+    if (data == listgetdata (node))
       return node;
   return NULL;
 }
@@ -317,6 +317,6 @@ list_add_list (struct list *l, struct list *m)
 {
   struct listnode *n;
 
-  for (n = listhead (m); n; nextnode (n))
+  for (n = listhead (m); n; n = listnextnode (n))
     listnode_add (l, n->data);
 }
index b766420fadb862e9bbf164cac70a914187a55665..80b21f64ad24ad6f68abe0f617a65ff3985f505f 100644 (file)
 #ifndef _ZEBRA_LINKLIST_H
 #define _ZEBRA_LINKLIST_H
 
+/* listnodes must always contain data to be valid. Adding an empty node
+ * to a list is invalid
+ */
 struct listnode 
 {
   struct listnode *next;
   struct listnode *prev;
+  
+  /* private member, use getdata() to retrieve, do not access directly */
   void *data;
 };
 
@@ -33,25 +38,31 @@ struct list
 {
   struct listnode *head;
   struct listnode *tail;
+
   /* invariant: count is the number of listnodes in the list */
   unsigned int count;
+
   /*
    * Returns -1 if val1 < val2, 0 if equal?, 1 if val1 > val2.
    * Used as definition of sorted for listnode_add_sort
    */
   int (*cmp) (void *val1, void *val2);
+
+  /* callback to free user-owned data when listnode is deleted. supplying
+   * this callback is very much encouraged!
+   */
   void (*del) (void *val);
 };
 
-#define nextnode(X) ((X) = (X)->next)
+#define listnextnode(X) ((X)->next)
 #define listhead(X) ((X)->head)
 #define listtail(X) ((X)->tail)
 #define listcount(X) ((X)->count)
 #define list_isempty(X) ((X)->head == NULL && (X)->tail == NULL)
-#define getdata(X) ((X)->data)
+#define listgetdata(X) (assert((X)->data != NULL), (X)->data)
 
 /* Prototypes. */
-struct list *list_new();
+struct list *list_new(); /* encouraged: set list.del callback on new lists */
 void list_free (struct list *);
 
 void listnode_add (struct list *, void *);
@@ -72,13 +83,33 @@ void list_add_node_prev (struct list *, struct listnode *, void *);
 void list_add_node_next (struct list *, struct listnode *, void *);
 void list_add_list (struct list *, struct list *);
 
-/* List iteration macro. */
-#define LIST_LOOP(L,V,N) \
-  for ((N) = (L)->head; (N); (N) = (N)->next) \
-    if (((V) = (N)->data) != NULL)
+/* List iteration macro. 
+ * Usage: for (ALL_LIST_ELEMENTS (...) { ... }
+ * It is safe to delete the listnode using this macro.
+ */
+#define ALL_LIST_ELEMENTS(list,node,nextnode,data) \
+  (node) = listhead(list); \
+  (node) != NULL && \
+    ((data) = listgetdata(node),(nextnode) = listnextnode(node), 1); \
+  (node) = (nextnode)
+
+/* read-only list iteration macro.
+ * Usage: as per ALL_LIST_ELEMENTS, but not safe to delete the listnode Only
+ * use this macro when it is *immediately obvious* the listnode is not
+ * deleted in the body of the loop. Does not have forward-reference overhead
+ * of previous macro.
+ */
+#define ALL_LIST_ELEMENTS_RO(list,node,data) \
+  (node) = listhead(list); \
+  (node) != NULL && ((data) = listgetdata(node), 1); \
+  (node) = listnextnode(node)
 
-/* List node add macro.  */
-#define LISTNODE_ADD(L,N) \
+/* these *do not* cleanup list nodes and referenced data, as the functions
+ * do - these macros simply {de,at}tach a listnode from/to a list.
+ */
+/* List node attach macro.  */
+#define LISTNODE_ATTACH(L,N) \
   do { \
     (N)->prev = (L)->tail; \
     if ((L)->head == NULL) \
@@ -89,8 +120,8 @@ void list_add_list (struct list *, struct list *);
     (L)->count++; \
   } while (0)
 
-/* List node delete macro.  */
-#define LISTNODE_DELETE(L,N) \
+/* List node detach macro.  */
+#define LISTNODE_DETACH(L,N) \
   do { \
     if ((N)->prev) \
       (N)->prev->next = (N)->next; \
@@ -103,4 +134,15 @@ void list_add_list (struct list *, struct list *);
     (L)->count--; \
   } while (0)
 
+/* Deprecated: 20050406 */
+#if !defined(QUAGGA_NO_DEPRECATED_INTERFACES)
+#warning "Using deprecated libzebra interfaces"
+#define LISTNODE_ADD(L,N) LISTNODE_ATTACH(L,N)
+#define LISTNODE_DELETE(L,N) LISTNODE_DETACH(L,N)
+#define nextnode(X) ((X) = (X)->next)
+#define getdata(X) listgetdata(X)
+#define LIST_LOOP(L,V,N) \
+  for (ALL_LIST_ELEMENTS_RO (L,N,V))
+#endif /* QUAGGA_NO_DEPRECATED_INTERFACES */
+
 #endif /* _ZEBRA_LINKLIST_H */
index 0c2dba3ae467ad0b8e1e4daec9c730da5cab4e38..28f402d886180cfefefb696189bfa0a8f9c1ad54 100644 (file)
@@ -441,12 +441,11 @@ smux_set (oid *reqid, size_t *reqid_len,
   int result;
   u_char *statP = NULL;
   WriteMethod *write_method = NULL;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   /* Check */
-  for (node = treelist->head; node; node = node->next)
+  for (ALL_LIST_ELEMENTS (treelist, node, nnode, subtree))
     {
-      subtree = node->data;
       subresult = oid_compare_part (reqid, *reqid_len,
                                     subtree->name, subtree->name_len);
 
@@ -509,12 +508,11 @@ smux_get (oid *reqid, size_t *reqid_len, int exact,
   size_t suffix_len;
   int result;
   WriteMethod *write_method=NULL;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   /* Check */
-  for (node = treelist->head; node; node = node->next)
+  for (ALL_LIST_ELEMENTS (treelist, node, nnode,subtree))
     {
-      subtree = node->data;
       subresult = oid_compare_part (reqid, *reqid_len, 
                                    subtree->name, subtree->name_len);
 
@@ -578,7 +576,7 @@ smux_getnext (oid *reqid, size_t *reqid_len, int exact,
   size_t suffix_len;
   int result;
   WriteMethod *write_method=NULL;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
 
   /* Save incoming request. */
@@ -586,9 +584,8 @@ smux_getnext (oid *reqid, size_t *reqid_len, int exact,
   savelen = *reqid_len;
 
   /* Check */
-  for (node = treelist->head; node; node = node->next)
+  for (ALL_LIST_ELEMENTS (treelist, node, nnode, subtree))
     {
-      subtree = node->data;
       subresult = oid_compare_part (reqid, *reqid_len, 
                                    subtree->name, subtree->name_len);
 
@@ -1108,17 +1105,15 @@ smux_register (int sock)
   long priority;
   long operation;
   struct subtree *subtree;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   ret = 0;
 
-  for (node = treelist->head; node; node = node->next)
+  for (ALL_LIST_ELEMENTS (treelist, node, nnode, subtree))
     {
       ptr = buf;
       len = BUFSIZ;
 
-      subtree = node->data;
-
       /* SMUX RReq Header. */
       ptr = asn_build_header (ptr, &len, (u_char) SMUX_RREQ, 0);
 
index dc48ab7ba99a0260612f99b7b2f0ea10440c55ef..bc04cc9434ef3bc0ca7342557186011ee9964579 100644 (file)
@@ -1,3 +1,13 @@
+2005-04-07 Paul Jakma <paul@dishone.st>
+
+       * (global) Fix up list loops to match changes in lib/linklist,
+         and some basic auditing of usage.
+       * ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
+         scan of the area list, rather than scanning all areas first for
+         INTER_ROUTER and then again for INTER_NETWORK. According to
+         16.2, the scan should be area specific anyway, and further
+         ospf6d does not seem to implement 16.3 anyway.
+
 2005-04-02 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
        * ospf6_interface.[ch]: (ospf6_interface_lookup_by_name) Remove unused
index 8bacfcd37524d0fd083e721724342122bac33dfd..7eb8f09c19faa6df1a93b41fc51f256651d582b3 100644 (file)
@@ -56,12 +56,9 @@ ospf6_is_router_abr (struct ospf6 *o)
   struct ospf6_area *oa;
   int area_count = 0;
 
-  for (node = listhead (o->area_list); node; nextnode (node))
-    {
-      oa = OSPF6_AREA (getdata (node));
-      if (IS_AREA_ENABLED (oa))
-        area_count++;
-    }
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, node, oa))
+    if (IS_AREA_ENABLED (oa))
+      area_count++;
 
   if (area_count > 1)
     return 1;
@@ -73,12 +70,10 @@ ospf6_abr_enable_area (struct ospf6_area *area)
 {
   struct ospf6_area *oa;
   struct ospf6_route *ro;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
-  for (node = listhead (area->ospf6->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (area->ospf6->area_list, node, nnode, oa))
     {
-      oa = OSPF6_AREA (getdata (node));
-
       /* update B bit for each area */
       OSPF6_ROUTER_LSA_SCHEDULE (oa);
 
@@ -111,7 +106,7 @@ ospf6_abr_disable_area (struct ospf6_area *area)
   struct ospf6_area *oa;
   struct ospf6_route *ro;
   struct ospf6_lsa *old;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   /* Withdraw all summary prefixes previously originated */
   for (ro = ospf6_route_head (area->summary_prefix); ro;
@@ -136,13 +131,9 @@ ospf6_abr_disable_area (struct ospf6_area *area)
     }
 
   /* Schedule Router-LSA for each area (ABR status may change) */
-  for (node = listhead (area->ospf6->area_list); node; nextnode (node))
-    {
-      oa = OSPF6_AREA (getdata (node));
-
-      /* update B bit for each area */
-      OSPF6_ROUTER_LSA_SCHEDULE (oa);
-    }
+  for (ALL_LIST_ELEMENTS (area->ospf6->area_list, node, nnode, oa))
+    /* update B bit for each area */
+    OSPF6_ROUTER_LSA_SCHEDULE (oa);
 }
 
 /* RFC 2328 12.4.3. Summary-LSAs */
@@ -470,7 +461,7 @@ ospf6_abr_range_update (struct ospf6_route *range)
 void
 ospf6_abr_originate_summary (struct ospf6_route *route)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_area *oa;
   struct ospf6_route *range = NULL;
 
@@ -482,11 +473,8 @@ ospf6_abr_originate_summary (struct ospf6_route *route)
         ospf6_abr_range_update (range);
     }
 
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
-    {
-      oa = (struct ospf6_area *) getdata (node);
-      ospf6_abr_originate_summary_to_area (route, oa);
-    }
+  for (ALL_LIST_ELEMENTS (ospf6->area_list, node, nnode, oa))
+    ospf6_abr_originate_summary_to_area (route, oa);
 }
 
 /* RFC 2328 16.2. Calculating the inter-area routes */
@@ -656,22 +644,17 @@ ospf6_abr_examin_brouter (u_int32_t router_id)
 {
   struct ospf6_lsa *lsa;
   struct ospf6_area *oa;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   u_int16_t type;
 
-  type = htons (OSPF6_LSTYPE_INTER_ROUTER);
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (ospf6->area_list, node, nnode, oa))
     {
-      oa = OSPF6_AREA (getdata (node));
+      type = htons (OSPF6_LSTYPE_INTER_ROUTER);
       for (lsa = ospf6_lsdb_type_router_head (type, router_id, oa->lsdb); lsa;
            lsa = ospf6_lsdb_type_router_next (type, router_id, lsa))
         ospf6_abr_examin_summary (lsa, oa);
-    }
 
-  type = htons (OSPF6_LSTYPE_INTER_PREFIX);
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
-    {
-      oa = OSPF6_AREA (getdata (node));
+      type = htons (OSPF6_LSTYPE_INTER_PREFIX);
       for (lsa = ospf6_lsdb_type_router_head (type, router_id, oa->lsdb); lsa;
            lsa = ospf6_lsdb_type_router_next (type, router_id, lsa))
         ospf6_abr_examin_summary (lsa, oa);
index 2a738cb6dea544e4e6d929e059baf9d6c7b4d2ec..57070e162f49f681893aaed2f1812586e0780113 100644 (file)
@@ -175,7 +175,7 @@ ospf6_area_create (u_int32_t area_id, struct ospf6 *o)
 void
 ospf6_area_delete (struct ospf6_area *oa)
 {
-  struct listnode *n;
+  struct listnode *n, *nnode;
   struct ospf6_interface *oi;
 
   ospf6_route_table_delete (oa->range_table);
@@ -183,9 +183,8 @@ ospf6_area_delete (struct ospf6_area *oa)
   ospf6_route_table_delete (oa->summary_router);
 
   /* ospf6 interface list */
-  for (n = listhead (oa->if_list); n; nextnode (n))
+  for (ALL_LIST_ELEMENTS (oa->if_list, n, nnode, oi))
     {
-      oi = (struct ospf6_interface *) getdata (n);
       ospf6_interface_delete (oi);
     }
   list_delete (oa->if_list);
@@ -217,12 +216,9 @@ ospf6_area_lookup (u_int32_t area_id, struct ospf6 *ospf6)
   struct ospf6_area *oa;
   struct listnode *n;
 
-  for (n = listhead (ospf6->area_list); n; nextnode (n))
-    {
-      oa = (struct ospf6_area *) getdata (n);
-      if (oa->area_id == area_id)
-        return oa;
-    }
+  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, n, oa))
+    if (oa->area_id == area_id)
+      return oa;
 
   return (struct ospf6_area *) NULL;
 }
@@ -240,31 +236,25 @@ ospf6_area_get (u_int32_t area_id, struct ospf6 *o)
 void
 ospf6_area_enable (struct ospf6_area *oa)
 {
-  struct listnode *i;
+  struct listnode *node, *nnode;
   struct ospf6_interface *oi;
 
   SET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
 
-  for (i = listhead (oa->if_list); i; nextnode (i))
-    {
-      oi = (struct ospf6_interface *) getdata (i);
-      ospf6_interface_enable (oi);
-    }
+  for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi))
+    ospf6_interface_enable (oi);
 }
 
 void
 ospf6_area_disable (struct ospf6_area *oa)
 {
-  struct listnode *i;
+  struct listnode *node, *nnode;
   struct ospf6_interface *oi;
 
   UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
 
-  for (i = listhead (oa->if_list); i; nextnode (i))
-    {
-      oi = (struct ospf6_interface *) getdata (i);
-      ospf6_interface_disable (oi);
-    }
+  for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi))
+    ospf6_interface_disable (oi);
 }
 
 \f
@@ -279,11 +269,9 @@ ospf6_area_show (struct vty *vty, struct ospf6_area *oa)
            oa->lsdb->count, VNL);
 
   vty_out (vty, "     Interface attached to this area:");
-  for (i = listhead (oa->if_list); i; nextnode (i))
-    {
-      oi = (struct ospf6_interface *) getdata (i);
-      vty_out (vty, " %s", oi->interface->name);
-    }
+  for (ALL_LIST_ELEMENTS_RO (oa->if_list, i, oi))
+    vty_out (vty, " %s", oi->interface->name);
+  
   vty_out (vty, "%s", VNL);
 }
 
@@ -415,10 +403,8 @@ ospf6_area_config_write (struct vty *vty)
   struct ospf6_route *range;
   char buf[128];
 
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
     {
-      oa = OSPF6_AREA (getdata (node));
-
       for (range = ospf6_route_head (oa->range_table); range;
            range = ospf6_route_next (range))
         {
@@ -444,9 +430,9 @@ DEFUN (show_ipv6_ospf6_spf_tree,
   struct prefix prefix;
 
   ospf6_linkstate_prefix (ospf6->router_id, htonl (0), &prefix);
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
+
+  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
     {
-      oa = (struct ospf6_area *) getdata (node);
       route = ospf6_route_lookup (&prefix, oa->spf_table);
       if (route == NULL)
         {
index c9fc5c1c4a7891dc19fba59b291ae25aeb8a3a9e..564efb2255f69966b9dcfc87495e32ebea109764 100644 (file)
@@ -444,7 +444,7 @@ ospf6_asbr_redistribute_add (int type, int ifindex, struct prefix *prefix,
   struct prefix prefix_id;
   struct route_node *node;
   char pbuf[64], ibuf[16];
-  struct listnode *lnode;
+  struct listnode *lnode, *lnnode;
   struct ospf6_area *oa;
 
   if (! ospf6_zebra_is_redistribute (type))
@@ -574,11 +574,8 @@ ospf6_asbr_redistribute_add (int type, int ifindex, struct prefix *prefix,
   ospf6_as_external_lsa_originate (route);
 
   /* Router-Bit (ASBR Flag) may have to be updated */
-  for (lnode = listhead (ospf6->area_list); lnode; nextnode (lnode))
-    {
-      oa = (struct ospf6_area *) getdata (lnode);
-      OSPF6_ROUTER_LSA_SCHEDULE (oa);
-    }
+  for (ALL_LIST_ELEMENTS (ospf6->area_list, lnode, lnnode, oa))
+    OSPF6_ROUTER_LSA_SCHEDULE (oa);
 }
 
 void
@@ -590,7 +587,7 @@ ospf6_asbr_redistribute_remove (int type, int ifindex, struct prefix *prefix)
   struct ospf6_lsa *lsa;
   struct prefix prefix_id;
   char pbuf[64], ibuf[16];
-  struct listnode *lnode;
+  struct listnode *lnode, *lnnode;
   struct ospf6_area *oa;
 
   match = ospf6_route_lookup (prefix, ospf6->external_table);
@@ -642,11 +639,8 @@ ospf6_asbr_redistribute_remove (int type, int ifindex, struct prefix *prefix)
   XFREE (MTYPE_OSPF6_EXTERNAL_INFO, info);
 
   /* Router-Bit (ASBR Flag) may have to be updated */
-  for (lnode = listhead (ospf6->area_list); lnode; nextnode (lnode))
-    {
-      oa = (struct ospf6_area *) getdata (lnode);
-      OSPF6_ROUTER_LSA_SCHEDULE (oa);
-    }
+  for (ALL_LIST_ELEMENTS (ospf6->area_list, lnode, lnnode, oa))
+    OSPF6_ROUTER_LSA_SCHEDULE (oa);
 }
 
 DEFUN (ospf6_redistribute,
index 9971ef1c9e610ebf0db6970e13acb1614b9c2d0d..39b7c1f366aa8fb5e7b7484ed43ecbc76d7b0310 100644 (file)
@@ -245,7 +245,7 @@ void
 ospf6_flood_interface (struct ospf6_neighbor *from,
                        struct ospf6_lsa *lsa, struct ospf6_interface *oi)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_neighbor *on;
   struct ospf6_lsa *req;
   int retrans_added = 0;
@@ -259,10 +259,8 @@ ospf6_flood_interface (struct ospf6_neighbor *from,
     }
 
   /* (1) For each neighbor */
-  for (node = listhead (oi->neighbor_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
     {
-      on = (struct ospf6_neighbor *) getdata (node);
-
       if (is_debug)
         zlog_debug ("To neighbor %s", on->name);
 
@@ -380,9 +378,8 @@ ospf6_flood_interface (struct ospf6_neighbor *from,
   else
     {
       /* reschedule retransmissions to all neighbors */
-      for (node = listhead (oi->neighbor_list); node; nextnode (node))
+      for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
         {
-          on = (struct ospf6_neighbor *) getdata (node);
           THREAD_OFF (on->thread_send_lsupdate);
           on->thread_send_lsupdate =
             thread_add_event (master, ospf6_lsupdate_send_neighbor, on, 0);
@@ -394,13 +391,11 @@ void
 ospf6_flood_area (struct ospf6_neighbor *from,
                   struct ospf6_lsa *lsa, struct ospf6_area *oa)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_interface *oi;
 
-  for (node = listhead (oa->if_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi))
     {
-      oi = OSPF6_INTERFACE (getdata (node));
-
       if (OSPF6_LSA_SCOPE (lsa->header->type) == OSPF6_SCOPE_LINKLOCAL &&
           oi != OSPF6_INTERFACE (lsa->lsdb->data))
         continue;
@@ -419,13 +414,11 @@ void
 ospf6_flood_process (struct ospf6_neighbor *from,
                      struct ospf6_lsa *lsa, struct ospf6 *process)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_area *oa;
 
-  for (node = listhead (process->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (process->area_list, node, nnode, oa))
     {
-      oa = OSPF6_AREA (getdata (node));
-
       if (OSPF6_LSA_SCOPE (lsa->header->type) == OSPF6_SCOPE_AREA &&
           oa != OSPF6_AREA (lsa->lsdb->data))
         continue;
@@ -450,13 +443,12 @@ ospf6_flood (struct ospf6_neighbor *from, struct ospf6_lsa *lsa)
 void
 ospf6_flood_clear_interface (struct ospf6_lsa *lsa, struct ospf6_interface *oi)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_neighbor *on;
   struct ospf6_lsa *rem;
 
-  for (node = listhead (oi->neighbor_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
     {
-      on = OSPF6_NEIGHBOR (getdata (node));
       rem = ospf6_lsdb_lookup (lsa->header->type, lsa->header->id,
                                lsa->header->adv_router, on->retrans_list);
       if (rem && ! ospf6_lsa_compare (rem, lsa))
@@ -474,13 +466,11 @@ ospf6_flood_clear_interface (struct ospf6_lsa *lsa, struct ospf6_interface *oi)
 void
 ospf6_flood_clear_area (struct ospf6_lsa *lsa, struct ospf6_area *oa)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_interface *oi;
 
-  for (node = listhead (oa->if_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi))
     {
-      oi = OSPF6_INTERFACE (getdata (node));
-
       if (OSPF6_LSA_SCOPE (lsa->header->type) == OSPF6_SCOPE_LINKLOCAL &&
           oi != OSPF6_INTERFACE (lsa->lsdb->data))
         continue;
@@ -498,13 +488,11 @@ ospf6_flood_clear_area (struct ospf6_lsa *lsa, struct ospf6_area *oa)
 void
 ospf6_flood_clear_process (struct ospf6_lsa *lsa, struct ospf6 *process)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_area *oa;
 
-  for (node = listhead (process->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (process->area_list, node, nnode, oa))
     {
-      oa = OSPF6_AREA (getdata (node));
-
       if (OSPF6_LSA_SCOPE (lsa->header->type) == OSPF6_SCOPE_AREA &&
           oa != OSPF6_AREA (lsa->lsdb->data))
         continue;
@@ -725,21 +713,13 @@ ospf6_is_maxage_lsa_drop (struct ospf6_lsa *lsa, struct ospf6_neighbor *from)
     return 0;
 
   process = from->ospf6_if->area->ospf6;
-  for (i = listhead (process->area_list); i; nextnode (i))
-    {
-      oa = OSPF6_AREA (getdata (i));
-      for (j = listhead (oa->if_list); j; nextnode (j))
-        {
-          oi = OSPF6_INTERFACE (getdata (j));
-          for (k = listhead (oi->neighbor_list); k; nextnode (k))
-            {
-              on = OSPF6_NEIGHBOR (getdata (k));
-              if (on->state == OSPF6_NEIGHBOR_EXCHANGE ||
-                  on->state == OSPF6_NEIGHBOR_LOADING)
-                count++;
-            }
-        }
-    }
+
+  for (ALL_LIST_ELEMENTS_RO (process->area_list, i, oa))
+    for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
+      for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, k, on))
+        if (on->state == OSPF6_NEIGHBOR_EXCHANGE ||
+            on->state == OSPF6_NEIGHBOR_LOADING)
+          count++;
 
   if (count == 0)
     return 1;
index d4180d92ef43b65297557dad6919a7d67101edf2..0614e44099618f4507329cb61f80e0c5e8790e03 100644 (file)
@@ -151,14 +151,12 @@ ospf6_interface_create (struct interface *ifp)
 void
 ospf6_interface_delete (struct ospf6_interface *oi)
 {
-  struct listnode *n;
+  struct listnode *node, *nnode;
   struct ospf6_neighbor *on;
 
-  for (n = listhead (oi->neighbor_list); n; nextnode (n))
-    {
-      on = (struct ospf6_neighbor *) getdata (n);
+  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
       ospf6_neighbor_delete (on);
-    }
+  
   list_delete (oi->neighbor_list);
 
   THREAD_OFF (oi->thread_send_hello);
@@ -199,16 +197,14 @@ ospf6_interface_enable (struct ospf6_interface *oi)
 void
 ospf6_interface_disable (struct ospf6_interface *oi)
 {
-  struct listnode *i;
+  struct listnode *node, *nnode;
   struct ospf6_neighbor *on;
 
   SET_FLAG (oi->flag, OSPF6_INTERFACE_DISABLE);
 
-  for (i = listhead (oi->neighbor_list); i; nextnode (i))
-    {
-      on = (struct ospf6_neighbor *) getdata (i);
+  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
       ospf6_neighbor_delete (on);
-    }
+
   list_delete_all_node (oi->neighbor_list);
 
   ospf6_lsdb_remove_all (oi->lsdb);
@@ -228,10 +224,8 @@ ospf6_interface_get_linklocal_address (struct interface *ifp)
   struct in6_addr *l = (struct in6_addr *) NULL;
 
   /* for each connected address */
-  for (n = listhead (ifp->connected); n; nextnode (n))
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, n, c))
     {
-      c = (struct connected *) getdata (n);
-
       /* if family not AF_INET6, ignore */
       if (c->address->family != AF_INET6)
         continue;
@@ -318,7 +312,7 @@ ospf6_interface_connected_route_update (struct interface *ifp)
   struct ospf6_interface *oi;
   struct ospf6_route *route;
   struct connected *c;
-  struct listnode *i;
+  struct listnode *node, *nnode;
 
   oi = (struct ospf6_interface *) ifp->info;
   if (oi == NULL)
@@ -333,10 +327,9 @@ ospf6_interface_connected_route_update (struct interface *ifp)
 
   /* update "route to advertise" interface route table */
   ospf6_route_remove_all (oi->route_connected);
-  for (i = listhead (oi->interface->connected); i; nextnode (i))
-    {
-      c = (struct connected *) getdata (i);
 
+  for (ALL_LIST_ELEMENTS (oi->interface->connected, node, nnode, c))
+    {
       if (c->address->family != AF_INET6)
         continue;
 
@@ -498,7 +491,7 @@ better_drouter (struct ospf6_neighbor *a, struct ospf6_neighbor *b)
 static u_char
 dr_election (struct ospf6_interface *oi)
 {
-  struct listnode *i;
+  struct listnode *node, *nnode;
   struct ospf6_neighbor *on, *drouter, *bdrouter, myself;
   struct ospf6_neighbor *best_drouter, *best_bdrouter;
   u_char next_state = 0;
@@ -517,20 +510,16 @@ dr_election (struct ospf6_interface *oi)
   myself.router_id = oi->area->ospf6->router_id;
 
   /* Electing BDR (2) */
-  for (i = listhead (oi->neighbor_list); i; nextnode (i))
-    {
-      on = (struct ospf6_neighbor *) getdata (i);
-      bdrouter = better_bdrouter (bdrouter, on);
-    }
+  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
+    bdrouter = better_bdrouter (bdrouter, on);
+  
   best_bdrouter = bdrouter;
   bdrouter = better_bdrouter (best_bdrouter, &myself);
 
   /* Electing DR (3) */
-  for (i = listhead (oi->neighbor_list); i; nextnode (i))
-    {
-      on = (struct ospf6_neighbor *) getdata (i);
-      drouter = better_drouter (drouter, on);
-    }
+  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
+    drouter = better_drouter (drouter, on);
+
   best_drouter = drouter;
   drouter = better_drouter (best_drouter, &myself);
   if (drouter == NULL)
@@ -576,9 +565,8 @@ dr_election (struct ospf6_interface *oi)
                    (drouter ? drouter->name : "0.0.0.0"),
                    (bdrouter ? bdrouter->name : "0.0.0.0"));
 
-      for (i = listhead (oi->neighbor_list); i; nextnode (i))
+      for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, node, on))
         {
-          on = (struct ospf6_neighbor *) getdata (i);
           if (on->state < OSPF6_NEIGHBOR_TWOWAY)
             continue;
           /* Schedule AdjOK. */
@@ -724,7 +712,7 @@ int
 interface_down (struct thread *thread)
 {
   struct ospf6_interface *oi;
-  struct listnode *n;
+  struct listnode *node, *nnode;
   struct ospf6_neighbor *on;
 
   oi = (struct ospf6_interface *) THREAD_ARG (thread);
@@ -740,11 +728,9 @@ interface_down (struct thread *thread)
 
   ospf6_interface_state_change (OSPF6_INTERFACE_DOWN, oi);
 
-  for (n = listhead (oi->neighbor_list); n; nextnode (n))
-    {
-      on = (struct ospf6_neighbor *) getdata (n);
-      ospf6_neighbor_delete (on);
-    }
+  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
+    ospf6_neighbor_delete (on);
+  
   list_delete_all_node (oi->neighbor_list);
 
   return 0;
@@ -790,9 +776,9 @@ ospf6_interface_show (struct vty *vty, struct interface *ifp)
     oi = (struct ospf6_interface *) ifp->info;
 
   vty_out (vty, "  Internet Address:%s", VNL);
-  for (i = listhead (ifp->connected); i; nextnode (i))
+
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, i, c))
     {
-      c = (struct connected *)getdata (i);
       p = c->address;
       prefix2str (p, strbuf, sizeof (strbuf));
       switch (p->family)
@@ -896,11 +882,8 @@ DEFUN (show_ipv6_ospf6_interface,
     }
   else
     {
-      for (i = listhead (iflist); i; nextnode (i))
-        {
-          ifp = (struct interface *) getdata (i);
-          ospf6_interface_show (vty, ifp);
-        }
+      for (ALL_LIST_ELEMENTS_RO (iflist, i, ifp))
+        ospf6_interface_show (vty, ifp);
     }
 
   return CMD_SUCCESS;
@@ -992,9 +975,8 @@ DEFUN (show_ipv6_ospf6_interface_prefix,
   struct ospf6_interface *oi;
   struct interface *ifp;
 
-  for (i = listhead (iflist); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (iflist, i, ifp))
     {
-      ifp = (struct interface *) getdata (i);
       oi = (struct ospf6_interface *) ifp->info;
       if (oi == NULL)
         continue;
@@ -1045,7 +1027,7 @@ DEFUN (ipv6_ospf6_ifmtu,
   struct ospf6_interface *oi;
   struct interface *ifp;
   unsigned int ifmtu, iobuflen;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_neighbor *on;
 
   ifp = (struct interface *) vty->index;
@@ -1084,9 +1066,8 @@ DEFUN (ipv6_ospf6_ifmtu,
     oi->ifmtu = ifmtu;
 
   /* re-establish adjacencies */
-  for (node = listhead (oi->neighbor_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
     {
-      on = (struct ospf6_neighbor *) getdata (node);
       THREAD_OFF (on->inactivity_timer);
       thread_execute (master, inactivity_timer, on, 0);
     }
@@ -1106,7 +1087,7 @@ DEFUN (no_ipv6_ospf6_ifmtu,
   struct ospf6_interface *oi;
   struct interface *ifp;
   unsigned int iobuflen;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_neighbor *on;
 
   ifp = (struct interface *) vty->index;
@@ -1133,9 +1114,8 @@ DEFUN (no_ipv6_ospf6_ifmtu,
     oi->ifmtu = ifp->mtu;
 
   /* re-establish adjacencies */
-  for (node = listhead (oi->neighbor_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
     {
-      on = (struct ospf6_neighbor *) getdata (node);
       THREAD_OFF (on->inactivity_timer);
       thread_execute (master, inactivity_timer, on, 0);
     }
@@ -1355,7 +1335,7 @@ DEFUN (ipv6_ospf6_passive,
 {
   struct ospf6_interface *oi;
   struct interface *ifp;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_neighbor *on;
 
   ifp = (struct interface *) vty->index;
@@ -1369,9 +1349,8 @@ DEFUN (ipv6_ospf6_passive,
   SET_FLAG (oi->flag, OSPF6_INTERFACE_PASSIVE);
   THREAD_OFF (oi->thread_send_hello);
 
-  for (node = listhead (oi->neighbor_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
     {
-      on = (struct ospf6_neighbor *) getdata (node);
       THREAD_OFF (on->inactivity_timer);
       thread_execute (master, inactivity_timer, on, 0);
     }
@@ -1490,9 +1469,8 @@ config_write_ospf6_interface (struct vty *vty)
   struct ospf6_interface *oi;
   struct interface *ifp;
 
-  for (i = listhead (iflist); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (iflist, i, ifp))
     {
-      ifp = (struct interface *) getdata (i);
       oi = (struct ospf6_interface *) ifp->info;
       if (oi == NULL)
         continue;
index e78441149143d3c347782a3da87f6aabde0dd29f..21693dbceae17dec40ca1b82172dc30e10e30e7c 100644 (file)
@@ -109,7 +109,8 @@ ospf6_router_lsa_originate (struct thread *thread)
   struct ospf6_lsa *lsa;
 
   u_int32_t link_state_id = 0;
-  struct listnode *i, *j;
+  struct listnode *node, *nnode;
+  struct listnode *j;
   struct ospf6_interface *oi;
   struct ospf6_neighbor *on, *drouter = NULL;
   struct ospf6_router_lsa *router_lsa;
@@ -151,10 +152,8 @@ ospf6_router_lsa_originate (struct thread *thread)
   lsdesc = (struct ospf6_router_lsdesc *)
     ((caddr_t) router_lsa + sizeof (struct ospf6_router_lsa));
 
-  for (i = listhead (oa->if_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi))
     {
-      oi = (struct ospf6_interface *) getdata (i);
-
       /* Interfaces in state Down or Loopback are not described */
       if (oi->state == OSPF6_INTERFACE_DOWN ||
           oi->state == OSPF6_INTERFACE_LOOPBACK)
@@ -162,12 +161,10 @@ ospf6_router_lsa_originate (struct thread *thread)
 
       /* Nor are interfaces without any full adjacencies described */
       count = 0;
-      for (j = listhead (oi->neighbor_list); j; nextnode (j))
-        {
-          on = (struct ospf6_neighbor *) getdata (j);
-          if (on->state == OSPF6_NEIGHBOR_FULL)
-            count++;
-        }
+      for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, j, on))
+        if (on->state == OSPF6_NEIGHBOR_FULL)
+          count++;
+      
       if (count == 0)
         continue;
 
@@ -215,9 +212,8 @@ ospf6_router_lsa_originate (struct thread *thread)
       /* Point-to-Point interfaces */
       if (if_is_pointopoint (oi->interface))
         {
-          for (j = listhead (oi->neighbor_list); j; nextnode (j))
+          for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, j, on))
             {
-              on = (struct ospf6_neighbor *) getdata (j);
               if (on->state != OSPF6_NEIGHBOR_FULL)
                 continue;
 
@@ -383,12 +379,11 @@ ospf6_network_lsa_originate (struct thread *thread)
 
   /* If none of neighbor is adjacent to us */
   count = 0;
-  for (i = listhead (oi->neighbor_list); i; nextnode (i))
-    {
-      on = (struct ospf6_neighbor *) getdata (i);
-      if (on->state == OSPF6_NEIGHBOR_FULL)
-        count++;
-    }
+  
+  for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, i, on))
+    if (on->state == OSPF6_NEIGHBOR_FULL)
+      count++;
+  
   if (count == 0)
     {
       if (IS_OSPF6_DEBUG_ORIGINATE (NETWORK))
@@ -425,10 +420,8 @@ ospf6_network_lsa_originate (struct thread *thread)
   lsdesc++;
 
   /* Walk through the neighbors */
-  for (i = listhead (oi->neighbor_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, i, on))
     {
-      on = (struct ospf6_neighbor *) getdata (i);
-
       if (on->state != OSPF6_NEIGHBOR_FULL)
         continue;
 
@@ -725,10 +718,8 @@ ospf6_intra_prefix_lsa_originate_stub (struct thread *thread)
 
   route_advertise = ospf6_route_table_create ();
 
-  for (i = listhead (oa->if_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (oa->if_list, i, oi))
     {
-      oi = (struct ospf6_interface *) getdata (i);
-
       if (oi->state == OSPF6_INTERFACE_DOWN)
         {
           if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
@@ -737,12 +728,11 @@ ospf6_intra_prefix_lsa_originate_stub (struct thread *thread)
         }
 
       full_count = 0;
-      for (j = listhead (oi->neighbor_list); j; nextnode (j))
-        {
-          on = (struct ospf6_neighbor *) getdata (j);
-          if (on->state == OSPF6_NEIGHBOR_FULL)
-            full_count++;
-        }
+
+      for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, j, on))
+        if (on->state == OSPF6_NEIGHBOR_FULL)
+          full_count++;
+
       if (oi->state != OSPF6_INTERFACE_LOOPBACK &&
           oi->state != OSPF6_INTERFACE_POINTTOPOINT &&
           full_count != 0)
@@ -891,12 +881,10 @@ ospf6_intra_prefix_lsa_originate_transit (struct thread *thread)
     }
 
   full_count = 0;
-  for (i = listhead (oi->neighbor_list); i; nextnode (i))
-    {
-      on = (struct ospf6_neighbor *) getdata (i);
-      if (on->state == OSPF6_NEIGHBOR_FULL)
-        full_count++;
-    }
+  for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, i, on))
+    if (on->state == OSPF6_NEIGHBOR_FULL)
+      full_count++;
+  
   if (full_count == 0)
     {
       if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
index 1486b6939967d95c2aa0728cd7401ed02581d65e..a4e5d67409895b1b2d0723017ce0bf986ceeaa6a 100644 (file)
@@ -1388,7 +1388,7 @@ ospf6_hello_send (struct thread *thread)
   struct ospf6_header *oh;
   struct ospf6_hello *hello;
   u_char *p;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_neighbor *on;
 
   oi = (struct ospf6_interface *) THREAD_ARG (thread);
@@ -1422,10 +1422,8 @@ ospf6_hello_send (struct thread *thread)
 
   p = (char *)((caddr_t) hello + sizeof (struct ospf6_hello));
 
-  for (node = listhead (oi->neighbor_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
     {
-      on = (struct ospf6_neighbor *) getdata (node);
-
       if (on->state < OSPF6_NEIGHBOR_INIT)
         continue;
 
index 5e71c7b4969733bb588f876c4b1a4fccf093ab01..dd46ebc7d4b5fc424480ea4bf3119bf60c06c35d 100644 (file)
@@ -61,12 +61,10 @@ ospf6_neighbor_lookup (u_int32_t router_id,
   struct listnode *n;
   struct ospf6_neighbor *on;
 
-  for (n = listhead (oi->neighbor_list); n; nextnode (n))
-    {
-      on = (struct ospf6_neighbor *) getdata (n);
-      if (on->router_id == router_id)
-        return on;
-    }
+  for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, n, on))
+    if (on->router_id == router_id)
+      return on;
+  
   return (struct ospf6_neighbor *) NULL;
 }
 
@@ -795,19 +793,11 @@ DEFUN (show_ipv6_ospf6_neighbor,
              "RouterID", "State", "Duration", "DR", "BDR", "I/F",
              "State", VNL);
 
-  for (i = listhead (ospf6->area_list); i; nextnode (i))
-    {
-      oa = (struct ospf6_area *) getdata (i);
-      for (j = listhead (oa->if_list); j; nextnode (j))
-        {
-          oi = (struct ospf6_interface *) getdata (j);
-          for (k = listhead (oi->neighbor_list); k; nextnode (k))
-            {
-              on = (struct ospf6_neighbor *) getdata (k);
-              (*showfunc) (vty, on);
-            }
-        }
-    }
+  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, i, oa))
+    for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
+      for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, k, on))
+        (*showfunc) (vty, on);
+
   return CMD_SUCCESS;
 }
 
@@ -849,20 +839,11 @@ DEFUN (show_ipv6_ospf6_neighbor_one,
       return CMD_SUCCESS;
     }
 
-  for (i = listhead (ospf6->area_list); i; nextnode (i))
-    {
-      oa = (struct ospf6_area *) getdata (i);
-      for (j = listhead (oa->if_list); j; nextnode (j))
-        {
-          oi = (struct ospf6_interface *) getdata (j);
-          for (k = listhead (oi->neighbor_list); k; nextnode (k))
-            {
-              on = (struct ospf6_neighbor *) getdata (k);
-              if (on->router_id == router_id)
-                (*showfunc) (vty, on);
-            }
-        }
-    }
+  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, i, oa))
+    for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
+      for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, k, on))
+        (*showfunc) (vty, on);
+  
   return CMD_SUCCESS;
 }
 
index 3cc4f2dd6cee3d00c6bbe447cd96a71ef7223a6f..09fa27ce7bfdfe1359c119407e5c76fa326daa12 100644 (file)
@@ -318,9 +318,8 @@ ospfv3AreaEntry (struct variable *v, oid *name, size_t *length,
              inet_ntoa (* (struct in_addr *) &area_id),
              exact, len, *length);
 
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
     {
-      oa = (struct ospf6_area *) getdata (node);
       if (area == NULL)
         {
           if (len == 0) /* return first area entry */
@@ -435,10 +434,8 @@ ospfv3AreaLsdbEntry (struct variable *v, oid *name, size_t *length,
     }
   else
     {
-      for (node = listhead (ospf6->area_list); node; nextnode (node))
+      for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
         {
-          oa = (struct ospf6_area *) getdata (node);
-
           if (lsa)
             continue;
           if (ntohl (oa->area_id) < ntohl (area_id.s_addr))
index d212c43a17a2feaae527ee006bd60cbfb16471a7..08c1eb73bc070e4cbd2df5272653d5f1ee05e4b8 100644 (file)
@@ -281,7 +281,7 @@ ospf6_spf_install (struct ospf6_vertex *v,
   struct ospf6_route *route;
   int i, j;
   struct ospf6_vertex *prev, *w;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   if (IS_OSPF6_DEBUG_SPF (PROCESS))
     zlog_debug ("SPF install %s hops %d cost %d",
@@ -322,7 +322,7 @@ ospf6_spf_install (struct ospf6_vertex *v,
       prev = (struct ospf6_vertex *) route->route_option;
       if (prev->hops > v->hops)
         {
-          LIST_LOOP (prev->child_list, w, node)
+          for (ALL_LIST_ELEMENTS (prev->child_list, node, nnode, w))
             {
               assert (w->parent == prev);
               w->parent = v;
@@ -502,9 +502,8 @@ ospf6_spf_log_database (struct ospf6_area *oa)
   snprintf (p, end - p, " Area %s: %d", oa->name, oa->lsdb->count);
   p = (buffer + strlen (buffer) < end ? buffer + strlen (buffer) : end);
 
-  for (node = listhead (oa->if_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (oa->if_list, node, oi))
     {
-      oi = (struct ospf6_interface *) getdata (node);
       snprintf (p, end - p, " I/F %s: %d",
                 oi->interface->name, oi->lsdb->count);
       p = (buffer + strlen (buffer) < end ? buffer + strlen (buffer) : end);
@@ -556,7 +555,7 @@ void
 ospf6_spf_display_subtree (struct vty *vty, const char *prefix, int rest,
                            struct ospf6_vertex *v)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct ospf6_vertex *c;
   char *next_prefix;
   int len;
@@ -575,7 +574,7 @@ ospf6_spf_display_subtree (struct vty *vty, const char *prefix, int rest,
   snprintf (next_prefix, len, "%s%s", prefix, (rest ? "|  " : "   "));
 
   restnum = listcount (v->child_list);
-  LIST_LOOP (v->child_list, c, node)
+  for (ALL_LIST_ELEMENTS (v->child_list, node, nnode, c))
     {
       restnum--;
       ospf6_spf_display_subtree (vty, next_prefix, restnum, c);
index b0fe5ca7d286fb704a651e6291cfdaca8e43420d..b3d45167b55fab143914d6e371caaba397a4b0fd 100644 (file)
@@ -143,14 +143,11 @@ ospf6_create ()
 void
 ospf6_delete (struct ospf6 *o)
 {
-  struct listnode *i;
+  struct listnode *node, *nnode;
   struct ospf6_area *oa;
 
-  for (i = listhead (o->area_list); i; nextnode (i))
-    {
-      oa = (struct ospf6_area *) getdata (i);
-      ospf6_area_delete (oa);
-    }
+  for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
+    ospf6_area_delete (oa);
 
   ospf6_lsdb_delete (o->lsdb);
   ospf6_lsdb_delete (o->lsdb_self);
@@ -167,34 +164,29 @@ ospf6_delete (struct ospf6 *o)
 void
 ospf6_enable (struct ospf6 *o)
 {
-  struct listnode *i;
+  struct listnode *node, *nnode;
   struct ospf6_area *oa;
 
   if (CHECK_FLAG (o->flag, OSPF6_DISABLED))
     {
       UNSET_FLAG (o->flag, OSPF6_DISABLED);
-      for (i = listhead (o->area_list); i; nextnode (i))
-        {
-          oa = (struct ospf6_area *) getdata (i);
-          ospf6_area_enable (oa);
-        }
+      for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
+        ospf6_area_enable (oa);
     }
 }
 
 void
 ospf6_disable (struct ospf6 *o)
 {
-  struct listnode *i;
+  struct listnode *node, *nnode;
   struct ospf6_area *oa;
 
   if (! CHECK_FLAG (o->flag, OSPF6_DISABLED))
     {
       SET_FLAG (o->flag, OSPF6_DISABLED);
-      for (i = listhead (o->area_list); i; nextnode (i))
-        {
-          oa = (struct ospf6_area *) getdata (i);
-          ospf6_area_disable (oa);
-        }
+      
+      for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
+        ospf6_area_disable (oa);
 
       ospf6_lsdb_remove_all (o->lsdb);
       ospf6_route_remove_all (o->route_table);
@@ -213,15 +205,12 @@ ospf6_maxage_remover (struct thread *thread)
 
   o->maxage_remover = (struct thread *) NULL;
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
-      for (j = listhead (oa->if_list); j; nextnode (j))
+      for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
         {
-          oi = (struct ospf6_interface *) getdata (j);
-          for (k = listhead (oi->neighbor_list); k; nextnode (k))
+          for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, k, on))
             {
-              on = (struct ospf6_neighbor *) getdata (k);
               if (on->state != OSPF6_NEIGHBOR_EXCHANGE &&
                   on->state != OSPF6_NEIGHBOR_LOADING)
                 continue;
@@ -231,14 +220,11 @@ ospf6_maxage_remover (struct thread *thread)
         }
     }
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
-      for (j = listhead (oa->if_list); j; nextnode (j))
-        {
-          oi = (struct ospf6_interface *) getdata (j);
-          OSPF6_LSDB_MAXAGE_REMOVER (oi->lsdb);
-        }
+      for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
+        OSPF6_LSDB_MAXAGE_REMOVER (oi->lsdb);
+      
       OSPF6_LSDB_MAXAGE_REMOVER (oa->lsdb);
     }
   OSPF6_LSDB_MAXAGE_REMOVER (o->lsdb);
@@ -466,11 +452,9 @@ ospf6_show (struct vty *vty, struct ospf6 *o)
   /* Areas */
   vty_out (vty, " Number of areas in this router is %u%s",
            listcount (o->area_list), VNL);
-  for (n = listhead (o->area_list); n; nextnode (n))
-    {
-      oa = (struct ospf6_area *) getdata (n);
-      ospf6_area_show (vty, oa);
-    }
+
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, n, oa))
+    ospf6_area_show (vty, oa);
 }
 
 /* show top level structures */
@@ -629,15 +613,11 @@ config_write_ospf6 (struct vty *vty)
   ospf6_redistribute_config_write (vty);
   ospf6_area_config_write (vty);
 
-  for (j = listhead (ospf6->area_list); j; nextnode (j))
+  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, j, oa))
     {
-      oa = (struct ospf6_area *) getdata (j);
-      for (k = listhead (oa->if_list); k; nextnode (k))
-        {
-          oi = (struct ospf6_interface *) getdata (k);
-          vty_out (vty, " interface %s area %s%s",
-                   oi->interface->name, oa->name, VNL);
-        }
+      for (ALL_LIST_ELEMENTS_RO (oa->if_list, k, oi))
+        vty_out (vty, " interface %s area %s%s",
+                 oi->interface->name, oa->name, VNL);
     }
   vty_out (vty, "!%s", VNL);
   return 0;
index d10d1df670d0808229ace540346a900d3e5a9c9d..e8fba97dbf72c89a819070d9ff74afaa98ab9836 100644 (file)
@@ -187,19 +187,16 @@ DEFUN (show_ipv6_ospf6_database,
 
   level = parse_show_level (argc, argv);
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
       vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
       ospf6_lsdb_show (vty, level, NULL, NULL, NULL, oa->lsdb);
     }
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
-      for (j = listhead (oa->if_list); j; nextnode (j))
+      for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
         {
-          oi = (struct ospf6_interface *) getdata (j);
           vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                    oi->interface->name, oa->name, VNL, VNL);
           ospf6_lsdb_show (vty, level, NULL, NULL, NULL, oi->lsdb);
@@ -262,21 +259,18 @@ DEFUN (show_ipv6_ospf6_database_type,
   switch (OSPF6_LSA_SCOPE (type))
     {
       case OSPF6_SCOPE_AREA:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
             vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
             ospf6_lsdb_show (vty, level, &type, NULL, NULL, oa->lsdb);
           }
         break;
 
       case OSPF6_SCOPE_LINKLOCAL:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
-            for (j = listhead (oa->if_list); j; nextnode (j))
+            for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
               {
-                oi = (struct ospf6_interface *) getdata (j);
                 vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                          oi->interface->name, oa->name, VNL, VNL);
                 ospf6_lsdb_show (vty, level, &type, NULL, NULL, oi->lsdb);
@@ -353,19 +347,16 @@ DEFUN (show_ipv6_ospf6_database_id,
   argv++;
   level = parse_show_level (argc, argv);
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
       vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
       ospf6_lsdb_show (vty, level, NULL, &id, NULL, oa->lsdb);
     }
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
-      for (j = listhead (oa->if_list); j; nextnode (j))
+      for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
         {
-          oi = (struct ospf6_interface *) getdata (j);
           vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                    oi->interface->name, oa->name, VNL, VNL);
           ospf6_lsdb_show (vty, level, NULL, &id, NULL, oi->lsdb);
@@ -452,19 +443,16 @@ DEFUN (show_ipv6_ospf6_database_router,
   argv++;
   level = parse_show_level (argc, argv);
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
       vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
       ospf6_lsdb_show (vty, level, NULL, NULL, &adv_router, oa->lsdb);
     }
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
-      for (j = listhead (oa->if_list); j; nextnode (j))
+      for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
         {
-          oi = (struct ospf6_interface *) getdata (j);
           vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                    oi->interface->name, oa->name, VNL, VNL);
           ospf6_lsdb_show (vty, level, NULL, NULL, &adv_router, oi->lsdb);
@@ -569,21 +557,18 @@ DEFUN (show_ipv6_ospf6_database_type_id,
   switch (OSPF6_LSA_SCOPE (type))
     {
       case OSPF6_SCOPE_AREA:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
             vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
             ospf6_lsdb_show (vty, level, &type, &id, NULL, oa->lsdb);
           }
         break;
 
       case OSPF6_SCOPE_LINKLOCAL:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
-            for (j = listhead (oa->if_list); j; nextnode (j))
+            for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
               {
-                oi = (struct ospf6_interface *) getdata (j);
                 vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                          oi->interface->name, oa->name, VNL, VNL);
                 ospf6_lsdb_show (vty, level, &type, &id, NULL, oi->lsdb);
@@ -728,21 +713,18 @@ DEFUN (show_ipv6_ospf6_database_type_router,
   switch (OSPF6_LSA_SCOPE (type))
     {
       case OSPF6_SCOPE_AREA:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
             vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
             ospf6_lsdb_show (vty, level, &type, NULL, &adv_router, oa->lsdb);
           }
         break;
 
       case OSPF6_SCOPE_LINKLOCAL:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
-            for (j = listhead (oa->if_list); j; nextnode (j))
+            for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
               {
-                oi = (struct ospf6_interface *) getdata (j);
                 vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                          oi->interface->name, oa->name, VNL, VNL);
                 ospf6_lsdb_show (vty, level, &type, NULL, &adv_router, oi->lsdb);
@@ -881,19 +863,16 @@ DEFUN (show_ipv6_ospf6_database_id_router,
   argv++;
   level = parse_show_level (argc, argv);
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
       vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
       ospf6_lsdb_show (vty, level, NULL, &id, &adv_router, oa->lsdb);
     }
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
-      for (j = listhead (oa->if_list); j; nextnode (j))
+      for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
         {
-          oi = (struct ospf6_interface *) getdata (j);
           vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                    oi->interface->name, oa->name, VNL, VNL);
           ospf6_lsdb_show (vty, level, NULL, &id, &adv_router, oi->lsdb);
@@ -967,19 +946,16 @@ DEFUN (show_ipv6_ospf6_database_adv_router_linkstate_id,
   argv++;
   level = parse_show_level (argc, argv);
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
       vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
       ospf6_lsdb_show (vty, level, NULL, &id, &adv_router, oa->lsdb);
     }
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
-      for (j = listhead (oa->if_list); j; nextnode (j))
+      for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
         {
-          oi = (struct ospf6_interface *) getdata (j);
           vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                    oi->interface->name, oa->name, VNL, VNL);
           ospf6_lsdb_show (vty, level, NULL, &id, &adv_router, oi->lsdb);
@@ -1071,21 +1047,18 @@ DEFUN (show_ipv6_ospf6_database_type_id_router,
   switch (OSPF6_LSA_SCOPE (type))
     {
       case OSPF6_SCOPE_AREA:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
             vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
             ospf6_lsdb_show (vty, level, &type, &id, &adv_router, oa->lsdb);
           }
         break;
 
       case OSPF6_SCOPE_LINKLOCAL:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
-            for (j = listhead (oa->if_list); j; nextnode (j))
+            for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
               {
-                oi = (struct ospf6_interface *) getdata (j);
                 vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                          oi->interface->name, oa->name, VNL, VNL);
                 ospf6_lsdb_show (vty, level, &type, &id, &adv_router, oi->lsdb);
@@ -1196,21 +1169,18 @@ DEFUN (show_ipv6_ospf6_database_type_adv_router_linkstate_id,
   switch (OSPF6_LSA_SCOPE (type))
     {
       case OSPF6_SCOPE_AREA:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
             vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
             ospf6_lsdb_show (vty, level, &type, &id, &adv_router, oa->lsdb);
           }
         break;
 
       case OSPF6_SCOPE_LINKLOCAL:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
-            for (j = listhead (oa->if_list); j; nextnode (j))
+            for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
               {
-                oi = (struct ospf6_interface *) getdata (j);
                 vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                          oi->interface->name, oa->name, VNL, VNL);
                 ospf6_lsdb_show (vty, level, &type, &id, &adv_router, oi->lsdb);
@@ -1282,19 +1252,16 @@ DEFUN (show_ipv6_ospf6_database_self_originated,
 
   adv_router = o->router_id;
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
       vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
       ospf6_lsdb_show (vty, level, NULL, NULL, &adv_router, oa->lsdb);
     }
 
-  for (i = listhead (o->area_list); i; nextnode (i))
+  for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
     {
-      oa = (struct ospf6_area *) getdata (i);
-      for (j = listhead (oa->if_list); j; nextnode (j))
+      for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
         {
-          oi = (struct ospf6_interface *) getdata (j);
           vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                    oi->interface->name, oa->name, VNL, VNL);
           ospf6_lsdb_show (vty, level, NULL, NULL, &adv_router, oi->lsdb);
@@ -1362,21 +1329,18 @@ DEFUN (show_ipv6_ospf6_database_type_self_originated,
   switch (OSPF6_LSA_SCOPE (type))
     {
       case OSPF6_SCOPE_AREA:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
             vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
             ospf6_lsdb_show (vty, level, &type, NULL, &adv_router, oa->lsdb);
           }
         break;
 
       case OSPF6_SCOPE_LINKLOCAL:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
-            for (j = listhead (oa->if_list); j; nextnode (j))
+            for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
               {
-                oi = (struct ospf6_interface *) getdata (j);
                 vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                          oi->interface->name, oa->name, VNL, VNL);
                 ospf6_lsdb_show (vty, level, &type, NULL, &adv_router, oi->lsdb);
@@ -1478,21 +1442,18 @@ DEFUN (show_ipv6_ospf6_database_type_self_originated_linkstate_id,
   switch (OSPF6_LSA_SCOPE (type))
     {
       case OSPF6_SCOPE_AREA:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
             vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
             ospf6_lsdb_show (vty, level, &type, &id, &adv_router, oa->lsdb);
           }
         break;
 
       case OSPF6_SCOPE_LINKLOCAL:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
-            for (j = listhead (oa->if_list); j; nextnode (j))
+            for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
               {
-                oi = (struct ospf6_interface *) getdata (j);
                 vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                          oi->interface->name, oa->name, VNL, VNL);
                 ospf6_lsdb_show (vty, level, &type, &id, &adv_router, oi->lsdb);
@@ -1594,21 +1555,18 @@ DEFUN (show_ipv6_ospf6_database_type_id_self_originated,
   switch (OSPF6_LSA_SCOPE (type))
     {
       case OSPF6_SCOPE_AREA:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
             vty_out (vty, AREA_LSDB_TITLE_FORMAT, VNL, oa->name, VNL, VNL);
             ospf6_lsdb_show (vty, level, &type, &id, &adv_router, oa->lsdb);
           }
         break;
 
       case OSPF6_SCOPE_LINKLOCAL:
-        for (i = listhead (o->area_list); i; nextnode (i))
+        for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
           {
-            oa = (struct ospf6_area *) getdata (i);
-            for (j = listhead (oa->if_list); j; nextnode (j))
+            for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
               {
-                oi = (struct ospf6_interface *) getdata (j);
                 vty_out (vty, IF_LSDB_TITLE_FORMAT, VNL,
                          oi->interface->name, oa->name, VNL, VNL);
                 ospf6_lsdb_show (vty, level, &type, &id, &adv_router, oi->lsdb);
@@ -1730,10 +1688,8 @@ DEFUN (show_ipv6_ospf6_linkstate,
   struct listnode *node;
   struct ospf6_area *oa;
 
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
     {
-      oa = OSPF6_AREA (getdata (node));
-
       vty_out (vty, "%s        SPF Result in Area %s%s%s",
                VNL, oa->name, VNL, VNL);
       ospf6_linkstate_table_show (vty, argc, argv, oa->spf_table);
@@ -1787,10 +1743,8 @@ DEFUN (show_ipv6_ospf6_linkstate_detail,
   sargv[sargc++] = "detail";
   sargv[sargc] = NULL;
 
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
     {
-      oa = OSPF6_AREA (getdata (node));
-
       vty_out (vty, "%s        SPF Result in Area %s%s%s",
                VNL, oa->name, VNL, VNL);
       ospf6_linkstate_table_show (vty, sargc, sargv, oa->spf_table);
index 6fcf200e2ab59b12c4dbe576f57c69ecaa81f8a9..4b718d7a66f471a38fe957bb96d30aec774392f1 100644 (file)
@@ -50,7 +50,7 @@ extern struct thread_master *master;
 #endif /* IPV6_DROP_MEMBERSHIP */
 #endif /* ! IPV6_LEAVE_GROUP */
 
-/* cast macro */
+/* cast macro: XXX - these *must* die, ick ick. */
 #define OSPF6_PROCESS(x) ((struct ospf6 *) (x))
 #define OSPF6_AREA(x) ((struct ospf6_area *) (x))
 #define OSPF6_INTERFACE(x) ((struct ospf6_interface *) (x))
index 416b3e79435e63d946e0e5dfc3ad9940c927dfdd..90ed3920e117aaea02c7b621b7884871aa8c6792 100644 (file)
@@ -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
index 89af2a36ea39b10db44f410fa5df5484edae7601..59233c72cbcde96dd7f11786eda6f5719e7232ab 100644 (file)
@@ -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 *) &param, 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 *) &param, 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;
index c4f4dd3db006f7cd37ddc266faaecda34e391545..f9f79e3c16552d6851cc2f6bf75756a489021097 100644 (file)
@@ -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 ();
index 586c25fb810645d8c9fba5b664b8b27dccf91349..06e0f1c7a797a931db9e54b0a0124f520ad7a563 100644 (file)
@@ -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);
 }
 
 \f
index 5bdcfba657378357b1602228cf733c2b268eb4df..87613bf17418ea1ed5817298c22377d992b34a08 100644 (file)
@@ -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);
     }
 }
index 027dfb9dcafb731466686c9d53c0a6ca75451351..f8490f5ef44618058b3da55271febbbd6575b7fb 100644 (file)
@@ -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);
index dd0f066964de935370d5b39618bb90d6ddb7bea5..5d498d7dd15a33303bd3001021f54dd92784a362 100644 (file)
@@ -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;
index 203c4a5e6943309a5558e834133466b7b654abf4..e02d457ee8c51814e7963c2dab1e720cb5063e9c 100644 (file)
@@ -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);
   
index 61366ed75cce26c10dd515c48174ca1795227ff2..35906ec8a3faa6d9816879cae4b0fa95738da762 100644 (file)
@@ -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;
index 01a8e1ce1a302b092efaa5bf04e328d85bc14693..d6b2f25bc1fdad41a9ff9c76a232000a34ceaaef 100644 (file)
@@ -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:
index 4f18c04d3e089ed0990ab45ac6ecbe83244675f1..8892f0e592f778ffc554c64ef5fd2c6261290df0 100644 (file)
@@ -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 =
index cf55bf0e0830f122f21762b79c7035bcc04976d1..ca39d9b26df0c018a253989ba70f34256419fd63 100644 (file)
@@ -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)
index c1994ab423f5daf6f6425710b84801ad2d1d10a2..4ed1fab8900dffc662bb357fb5dac5cec2af359c 100644 (file)
@@ -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
index 9a4e8ffa2c98fc90337589b670571ae2e04d7bd5..c69fc7f11a9d9796df040b69e97a319484599ef7 100644 (file)
@@ -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);
 
index 0b04c969b5b1038f58bab6bfb4d912b4459da334..582dc4332a75713bc816207dff60bc60f4ebbd03 100644 (file)
@@ -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
index c0e1f6cea9951e4b6c7d429e82f8ffbf6991a9de..55b33150c174ff0e81bf8b27f74d94e7d623bf33 100644 (file)
@@ -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);
index 27299c59946d479a11cb7cd113038fda5adabe2b..e8513b39668fc13c13eb55fe11347ed3eefb2456 100644 (file)
@@ -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)
index a77fb4b16d71a6169f5a6bb652b9afa73c639bd5..cbc3d13d67b5703e8e2d218f7eea7c6313955c1e 100644 (file)
@@ -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);
 }
 
 \f
@@ -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))
          {
index f58fb3371be015b2dc4fe936bc83a3e5e8b151cc..da73724a6388a0962b106bc0d0730a8cbc97c820 100644 (file)
@@ -222,17 +222,14 @@ rip_request_interface_send (struct interface *ifp, u_char version)
   /* RIPv1 and non multicast interface. */
   if (if_is_pointopoint (ifp) || if_is_broadcast (ifp))
     {
-      struct listnode *cnode;
+      struct listnode *cnode, *cnnode;
+      struct connected *connected;
 
       if (IS_RIP_DEBUG_EVENT)
        zlog_debug ("broadcast request to %s", ifp->name);
 
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS (ifp->connected, cnode, cnnode, connected))
        {
-         struct connected *connected;
-
-         connected = getdata (cnode);
-
          if (connected->address->family == AF_INET)
            {
              memset (&to, 0, sizeof (struct sockaddr_in));
@@ -321,20 +318,19 @@ int
 rip_multicast_join (struct interface *ifp, int sock)
 {
   struct listnode *cnode;
+  struct connected *ifc;
 
   if (if_is_operative (ifp) && if_is_multicast (ifp))
     {
       if (IS_RIP_DEBUG_EVENT)
        zlog_debug ("multicast join at %s", ifp->name);
 
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, ifc))
        {
          struct prefix_ipv4 *p;
-         struct connected *connected;
          struct in_addr group;
              
-         connected = getdata (cnode);
-         p = (struct prefix_ipv4 *) connected->address;
+         p = (struct prefix_ipv4 *) ifc->address;
       
          if (p->family != AF_INET)
            continue;
@@ -354,21 +350,20 @@ void
 rip_multicast_leave (struct interface *ifp, int sock)
 {
   struct listnode *cnode;
+  struct connected *connected;
 
   if (if_is_up (ifp) && if_is_multicast (ifp))
     {
       if (IS_RIP_DEBUG_EVENT)
        zlog_debug ("multicast leave from %s", ifp->name);
 
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
        {
          struct prefix_ipv4 *p;
-         struct connected *connected;
          struct in_addr group;
-             
-         connected = getdata (cnode);
+          
          p = (struct prefix_ipv4 *) connected->address;
-      
+         
          if (p->family != AF_INET)
            continue;
       
@@ -387,18 +382,15 @@ rip_if_ipv4_address_check (struct interface *ifp)
   struct connected *connected;
   int count = 0;
 
-  for (nn = listhead (ifp->connected); nn; nextnode (nn))
-    if ((connected = getdata (nn)) != NULL)
-      {
-       struct prefix *p;
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, nn, connected))
+    {
+      struct prefix *p;
 
-       p = connected->address;
+      p = connected->address;
 
-       if (p->family == AF_INET)
-          {
-           count++;
-         }
-      }
+      if (p->family == AF_INET)
+        count++;
+    }
                                                
   return count;
 }
@@ -411,20 +403,17 @@ int
 if_check_address (struct in_addr addr)
 {
   struct listnode *node;
-
-  for (node = listhead (iflist); node; nextnode (node))
+  struct interface *ifp;
+  
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
       struct listnode *cnode;
-      struct interface *ifp;
-
-      ifp = getdata (node);
+      struct connected *connected;
 
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
        {
-         struct connected *connected;
          struct prefix_ipv4 *p;
 
-         connected = getdata (cnode);
          p = (struct prefix_ipv4 *) connected->address;
 
          if (p->family != AF_INET)
@@ -443,6 +432,7 @@ if_valid_neighbor (struct in_addr addr)
 {
   struct listnode *node;
   struct connected *connected = NULL;
+  struct interface *ifp;
   struct prefix_ipv4 *p;
   struct prefix_ipv4 pa;
 
@@ -450,17 +440,12 @@ if_valid_neighbor (struct in_addr addr)
   pa.prefix = addr;
   pa.prefixlen = IPV4_MAX_PREFIXLEN;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
       struct listnode *cnode;
-      struct interface *ifp;
-
-      ifp = getdata (node);
 
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
        {
-         connected = getdata (cnode);
-
          if (if_is_pointopoint (ifp))
            {
              p = (struct prefix_ipv4 *) connected->address;
@@ -610,9 +595,8 @@ rip_interface_clean ()
   struct interface *ifp;
   struct rip_interface *ri;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
       ri = ifp->info;
 
       ri->enable_network = 0;
@@ -634,9 +618,8 @@ rip_interface_reset ()
   struct interface *ifp;
   struct rip_interface *ri;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
       ri = ifp->info;
 
       ri->enable_network = 0;
@@ -741,13 +724,10 @@ void
 rip_if_down_all ()
 {
   struct interface *ifp;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
-  for (node = listhead (iflist); node; nextnode (node))
-    {
-      ifp = getdata (node);
-      rip_if_down (ifp);
-    }
+  for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
+    rip_if_down (ifp);
 }
 
 static void
@@ -875,33 +855,32 @@ rip_interface_address_delete (int command, struct zclient *zclient,
 int
 rip_enable_network_lookup_if (struct interface *ifp)
 {
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct connected *connected;
   struct prefix_ipv4 address;
 
-  for (nn = listhead (ifp->connected); nn; nextnode (nn))
-    if ((connected = getdata (nn)) != NULL)
-      {
-       struct prefix *p; 
-       struct route_node *node;
+  for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, connected))
+    {
+      struct prefix *p; 
+      struct route_node *node;
 
-       p = connected->address;
+      p = connected->address;
 
-       if (p->family == AF_INET)
-         {
-           address.family = AF_INET;
-           address.prefix = p->u.prefix4;
-           address.prefixlen = IPV4_MAX_BITLEN;
-           
-           node = route_node_match (rip_enable_network,
-                                    (struct prefix *)&address);
-           if (node)
-             {
-               route_unlock_node (node);
-               return 1;
-             }
-         }
-      }
+      if (p->family == AF_INET)
+        {
+          address.family = AF_INET;
+          address.prefix = p->u.prefix4;
+          address.prefixlen = IPV4_MAX_BITLEN;
+          
+          node = route_node_match (rip_enable_network,
+                                   (struct prefix *)&address);
+          if (node)
+            {
+              route_unlock_node (node);
+              return 1;
+            }
+        }
+    }
   return -1;
 }
 
@@ -1065,39 +1044,38 @@ int rip_redistribute_check (int);
 void
 rip_connect_set (struct interface *ifp, int set)
 {
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct connected *connected;
   struct prefix_ipv4 address;
 
-  for (nn = listhead (ifp->connected); nn; nextnode (nn))
-    if ((connected = getdata (nn)) != NULL)
-      {
-       struct prefix *p; 
-       p = connected->address;
-
-       if (p->family != AF_INET)
-         continue;
-
-       address.family = AF_INET;
-       address.prefix = p->u.prefix4;
-       address.prefixlen = p->prefixlen;
-       apply_mask_ipv4 (&address);
-
-       if (set) {
-          /* Check once more wether this prefix is within a "network IF_OR_PREF" one */
-          if ((rip_enable_if_lookup(connected->ifp->name) >= 0) ||
-              (rip_enable_network_lookup2(connected) >= 0))
-           rip_redistribute_add (ZEBRA_ROUTE_CONNECT, RIP_ROUTE_INTERFACE,
-                                 &address, connected->ifp->ifindex, NULL);
-       } else
-         {
-           rip_redistribute_delete (ZEBRA_ROUTE_CONNECT, RIP_ROUTE_INTERFACE,
-                                    &address, connected->ifp->ifindex);
-           if (rip_redistribute_check (ZEBRA_ROUTE_CONNECT))
-             rip_redistribute_add (ZEBRA_ROUTE_CONNECT, RIP_ROUTE_REDISTRIBUTE,
-                                   &address, connected->ifp->ifindex, NULL);
-         }
-      }
+  for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, connected))
+    {
+      struct prefix *p; 
+      p = connected->address;
+
+      if (p->family != AF_INET)
+        continue;
+
+      address.family = AF_INET;
+      address.prefix = p->u.prefix4;
+      address.prefixlen = p->prefixlen;
+      apply_mask_ipv4 (&address);
+
+      if (set) {
+        /* Check once more wether this prefix is within a "network IF_OR_PREF" one */
+        if ((rip_enable_if_lookup(connected->ifp->name) >= 0) ||
+            (rip_enable_network_lookup2(connected) >= 0))
+          rip_redistribute_add (ZEBRA_ROUTE_CONNECT, RIP_ROUTE_INTERFACE,
+                                &address, connected->ifp->ifindex, NULL);
+      } else
+        {
+          rip_redistribute_delete (ZEBRA_ROUTE_CONNECT, RIP_ROUTE_INTERFACE,
+                                   &address, connected->ifp->ifindex);
+          if (rip_redistribute_check (ZEBRA_ROUTE_CONNECT))
+            rip_redistribute_add (ZEBRA_ROUTE_CONNECT, RIP_ROUTE_REDISTRIBUTE,
+                                  &address, connected->ifp->ifindex, NULL);
+        }
+    }
 }
 
 /* Update interface status. */
@@ -1169,14 +1147,11 @@ void
 rip_enable_apply_all ()
 {
   struct interface *ifp;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   /* Check each interface. */
-  for (node = listhead (iflist); node; nextnode (node))
-    {
-      ifp = getdata (node);
-      rip_enable_apply (ifp);
-    }
+  for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
+    rip_enable_apply (ifp);
 }
 
 int
@@ -1294,13 +1269,10 @@ void
 rip_passive_interface_apply_all ()
 {
   struct interface *ifp;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
-  for (node = listhead (iflist); node; nextnode (node))
-    {
-      ifp = getdata (node);
-      rip_passive_interface_apply (ifp);
-    }
+  for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
+    rip_passive_interface_apply (ifp);
 }
 
 /* Passive interface. */
@@ -2021,11 +1993,10 @@ rip_interface_config_write (struct vty *vty)
   struct listnode *node;
   struct interface *ifp;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
       struct rip_interface *ri;
 
-      ifp = getdata (node);
       ri = ifp->info;
 
       /* Do not display the interface if there is no
index 6899c4d1742958b8c614390d701dd08a43eac0e0..61f13760459b16e4307a64b4a88c844060e6e4f0 100644 (file)
@@ -78,9 +78,9 @@ struct rip_offset_list *
 rip_offset_list_lookup (const char *ifname)
 {
   struct rip_offset_list *offset;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
-  LIST_LOOP (rip_offset_list_master, offset, nn)
+  for (ALL_LIST_ELEMENTS (rip_offset_list_master, node, nnode, offset))
     {
       if (strcmp_safe (offset->ifname, ifname) == 0)
        return offset;
@@ -378,10 +378,10 @@ rip_offset_clean ()
 int
 config_write_rip_offset_list (struct vty *vty)
 {
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct rip_offset_list *offset;
 
-  LIST_LOOP (rip_offset_list_master, offset, nn)
+  for (ALL_LIST_ELEMENTS (rip_offset_list_master, node, nnode, offset))
     {
       if (! offset->ifname)
        {
index 20c2da738fb5aaa254e4ac217585d7672ddc125a..51df568ad4c96a3213d1965f82d73a08c832dea0 100644 (file)
@@ -53,9 +53,9 @@ struct rip_peer *
 rip_peer_lookup (struct in_addr *addr)
 {
   struct rip_peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
-  LIST_LOOP (peer_list, peer, nn)
+  for (ALL_LIST_ELEMENTS (peer_list, node, nnode, peer))
     {
       if (IPV4_ADDR_SAME (&peer->addr, addr))
        return peer;
@@ -67,9 +67,9 @@ struct rip_peer *
 rip_peer_lookup_next (struct in_addr *addr)
 {
   struct rip_peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
-  LIST_LOOP (peer_list, peer, nn)
+  for (ALL_LIST_ELEMENTS (peer_list, node, nnode, peer))
     {
       if (htonl (peer->addr.s_addr) > htonl (addr->s_addr))
        return peer;
@@ -183,11 +183,11 @@ void
 rip_peer_display (struct vty *vty)
 {
   struct rip_peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 #define RIP_UPTIME_LEN 25
   char timebuf[RIP_UPTIME_LEN];
 
-  LIST_LOOP (peer_list, peer, nn)
+  for (ALL_LIST_ELEMENTS (peer_list, node, nnode, peer))
     {
       vty_out (vty, "    %-16s %9d %9d %9d   %s%s", inet_ntoa (peer->addr),
               peer->recv_badpackets, peer->recv_badroutes,
index afdcd8321d44a33a0889a989203a70a8c0751932..3dd91dae976faf0bfce9b0abd9d3236f6ab69279 100644 (file)
@@ -365,13 +365,10 @@ rip_nexthop_check (struct in_addr *addr)
 
   /* If nexthop address matches local configured address then it is
      invalid nexthop. */
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
-
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, ifc))
        {           
-         ifc = getdata (cnode);
          p = ifc->address;
 
          if (p->family == AF_INET
@@ -2440,7 +2437,8 @@ rip_update_interface (struct connected *ifc, u_char version, int route_type)
 void
 rip_update_process (int route_type)
 {
-  struct listnode *node, *ifnode;
+  struct listnode *node;
+  struct listnode *ifnode, *ifnnode;
   struct connected *connected;
   struct interface *ifp;
   struct rip_interface *ri;
@@ -2449,10 +2447,8 @@ rip_update_process (int route_type)
   struct prefix_ipv4 *p;
 
   /* Send RIP update to each interface. */
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
-
       if (if_is_loopback (ifp))
        continue;
 
@@ -2480,8 +2476,7 @@ rip_update_process (int route_type)
            }
 
           /* send update on each connected network */
-
-         LIST_LOOP(ifp->connected, connected, ifnode)
+         for (ALL_LIST_ELEMENTS (ifp->connected, ifnode, ifnnode, connected))
            {
              struct prefix_ipv4 *ifaddr;
               int done = 0;
@@ -2716,7 +2711,7 @@ rip_request_send (struct sockaddr_in *to, struct interface *ifp,
 {
   struct rte *rte;
   struct rip_packet rip_packet;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   memset (&rip_packet, 0, sizeof (rip_packet));
 
@@ -2740,7 +2735,7 @@ rip_request_send (struct sockaddr_in *to, struct interface *ifp,
     }
        
   /* send request on each connected network */
-  LIST_LOOP(ifp->connected, connected, node)
+  for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, connected))
     {
       struct prefix_ipv4 *p;
 
@@ -3533,9 +3528,8 @@ DEFUN (show_ip_rip_status,
 
   vty_out (vty, "    Interface        Send  Recv   Key-chain%s", VTY_NEWLINE);
 
-  for (node = listhead (iflist); node; node = nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
       ri = ifp->info;
 
       if (ri->enable_network || ri->enable_interface)
@@ -3563,9 +3557,8 @@ DEFUN (show_ip_rip_status,
 
   {
     int found_passive = 0;
-    for (node = listhead (iflist); node; node = nextnode (node))
+    for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
       {
-       ifp = getdata (node);
        ri = ifp->info;
 
        if ((ri->enable_network || ri->enable_interface) && ri->passive)
@@ -3761,13 +3754,10 @@ void
 rip_distribute_update_all (struct prefix_list *notused)
 {
   struct interface *ifp;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
-  for (node = listhead (iflist); node; nextnode (node))
-    {
-      ifp = getdata (node);
-      rip_distribute_update_interface (ifp);
-    }
+  for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
+    rip_distribute_update_interface (ifp);
 }
 /* ARGSUSED */
 void
@@ -3955,13 +3945,10 @@ void
 rip_routemap_update (const char *notused)
 {
   struct interface *ifp;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
-  for (node = listhead (iflist); node; nextnode (node))
-    {
-      ifp = getdata (node);
-      rip_if_rmap_update_interface (ifp);
-    }
+  for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
+    rip_if_rmap_update_interface (ifp);
 
   rip_routemap_update_redistribute ();
 }
index 6d5d468c0ecc0a0b69da1b6ce71852f834ff5252..d2fa3d608427d7e561adacd197a66dc16e8d81de 100644 (file)
@@ -144,8 +144,8 @@ ripng_if_ipv6_lladdress_check (struct interface *ifp)
   struct connected *connected;
   int count = 0;
 
-  for (nn = listhead (ifp->connected); nn; nextnode (nn))
-    if ((connected = getdata (nn)) != NULL) {
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, nn, connected))
+    {
       struct prefix *p;
       p = connected->address;
 
@@ -166,12 +166,10 @@ ripng_check_max_mtu ()
   unsigned int mtu;
 
   mtu = 0;
-  for (node = listhead (iflist); node; nextnode (node))
-    {
-      ifp = getdata (node);
-      if (mtu < ifp->mtu6)
-       mtu = ifp->mtu6;
-    }
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
+    if (mtu < ifp->mtu6)
+      mtu = ifp->mtu6;
+
   return mtu;
 }
 
@@ -339,13 +337,12 @@ ripng_interface_delete (int command, struct zclient *zclient,
 void
 ripng_interface_clean ()
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct interface *ifp;
   struct ripng_interface *ri;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
     {
-      ifp = getdata (node);
       ri = ifp->info;
 
       ri->enable_network = 0;
@@ -366,9 +363,8 @@ ripng_interface_reset () {
   struct interface *ifp;
   struct ripng_interface *ri;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
       ri = ifp->info;
 
       ri->enable_network = 0;
@@ -535,33 +531,32 @@ struct route_table *ripng_enable_network;
 int
 ripng_enable_network_lookup_if (struct interface *ifp)
 {
-  struct listnode *listnode;
+  struct listnode *node;
   struct connected *connected;
   struct prefix_ipv6 address;
 
-  for (listnode = listhead (ifp->connected); listnode; nextnode (listnode))
-    if ((connected = getdata (listnode)) != NULL)
-      {
-       struct prefix *p; 
-       struct route_node *node;
-
-       p = connected->address;
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, connected))
+    {
+      struct prefix *p; 
+      struct route_node *node;
 
-       if (p->family == AF_INET6)
-         {
-           address.family = AF_INET6;
-           address.prefix = p->u.prefix6;
-           address.prefixlen = IPV6_MAX_BITLEN;
+      p = connected->address;
 
-           node = route_node_match (ripng_enable_network,
-                                    (struct prefix *)&address);
-           if (node)
-             {
-               route_unlock_node (node);
-               return 1;
-             }
-         }
-      }
+      if (p->family == AF_INET6)
+        {
+          address.family = AF_INET6;
+          address.prefix = p->u.prefix6;
+          address.prefixlen = IPV6_MAX_BITLEN;
+
+          node = route_node_match (ripng_enable_network,
+                                   (struct prefix *)&address);
+          if (node)
+            {
+              route_unlock_node (node);
+              return 1;
+            }
+        }
+    }
   return -1;
 }
 
@@ -722,12 +717,12 @@ int ripng_redistribute_check (int);
 void
 ripng_connect_set (struct interface *ifp, int set)
 {
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct connected *connected;
   struct prefix_ipv6 address;
 
-  for (nn = listhead (ifp->connected); nn; nextnode (nn))
-    if ((connected = getdata (nn)) != NULL) {
+  for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, connected))
+    {
       struct prefix *p;
       p = connected->address;
 
@@ -829,11 +824,8 @@ ripng_enable_apply_all ()
   struct interface *ifp;
   struct listnode *node;
 
-  for (node = listhead (iflist); node; nextnode (node))
-    {
-      ifp = getdata (node);
-      ripng_enable_apply (ifp);
-    }
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
+    ripng_enable_apply (ifp);
 }
 \f
 /* Clear all network and neighbor configuration */
@@ -897,11 +889,8 @@ ripng_passive_interface_apply_all (void)
   struct interface *ifp;
   struct listnode *node;
 
-  for (node = listhead (iflist); node; nextnode (node))
-    {
-      ifp = getdata (node);
-      ripng_passive_interface_apply (ifp);
-    }
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
+    ripng_passive_interface_apply (ifp);
 }
 
 /* Passive interface. */
@@ -1171,9 +1160,8 @@ interface_config_write (struct vty *vty)
   struct ripng_interface *ri;
   int write = 0;
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
       ri = ifp->info;
 
       /* Do not display the interface if there is no
index 1c1829d49fc6dc229e76449f843dafbf1196643e..05f190e27b14017b527017df0ca0e5e811b51344 100644 (file)
@@ -117,7 +117,7 @@ ripng_rte_send(struct list *ripng_rte_list, struct interface *ifp,
                struct sockaddr_in6 *to) {
 
   struct ripng_rte_data *data;
-  struct listnode * nn;
+  struct listnode *node, *nnode;
 
   struct in6_addr last_nexthop;
   struct in6_addr myself_nexthop;
@@ -154,8 +154,7 @@ ripng_rte_send(struct list *ripng_rte_list, struct interface *ifp,
            sizeof (struct ripng_packet) +
            sizeof (struct rte)) / sizeof (struct rte);
 
-  LIST_LOOP(ripng_rte_list, data, nn) {
-
+  for (ALL_LIST_ELEMENTS (ripng_rte_list, node, nnode, data)) {
     /* (2.1) Next hop support */
     if (!IPV6_ADDR_SAME(&last_nexthop, NEXTHOP_OUT_PTR(data))) {
 
index 46e23f0b61d9cd673afc40e148c0bd542cdeb77b..31d78ba8e964b1c0853bf4077ff223369a78727b 100644 (file)
@@ -81,9 +81,9 @@ struct ripng_offset_list *
 ripng_offset_list_lookup (const char *ifname)
 {
   struct ripng_offset_list *offset;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
-  LIST_LOOP (ripng_offset_list_master, offset, nn)
+  for (ALL_LIST_ELEMENTS (ripng_offset_list_master, node, nnode, offset))
     {
       if (strcmp_safe (offset->ifname, ifname) == 0)
        return offset;
@@ -382,10 +382,10 @@ ripng_offset_clean ()
 int
 config_write_ripng_offset_list (struct vty *vty)
 {
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct ripng_offset_list *offset;
 
-  LIST_LOOP (ripng_offset_list_master, offset, nn)
+  for (ALL_LIST_ELEMENTS (ripng_offset_list_master, node, nnode, offset))
     {
       if (! offset->ifname)
        {
index 66282614a10b7b9730fdaf3a83f50440bbb575a8..bfbade50c963d2e1b8380ba79587dd2c6445cd9d 100644 (file)
@@ -59,9 +59,9 @@ struct ripng_peer *
 ripng_peer_lookup (struct in6_addr *addr)
 {
   struct ripng_peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
-  LIST_LOOP (peer_list, peer, nn)
+  for (ALL_LIST_ELEMENTS (peer_list, node, nnode, peer))
     {
       if (IPV6_ADDR_SAME (&peer->addr, addr))
        return peer;
@@ -73,9 +73,9 @@ struct ripng_peer *
 ripng_peer_lookup_next (struct in6_addr *addr)
 {
   struct ripng_peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
-  LIST_LOOP (peer_list, peer, nn)
+  for (ALL_LIST_ELEMENTS (peer_list, node, nnode, peer))
     {
       if (addr6_cmp(&peer->addr, addr) > 0) 
        return peer;
@@ -191,11 +191,11 @@ void
 ripng_peer_display (struct vty *vty)
 {
   struct ripng_peer *peer;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 #define RIPNG_UPTIME_LEN 25
   char timebuf[RIPNG_UPTIME_LEN];
 
-  LIST_LOOP (peer_list, peer, nn)
+  for (ALL_LIST_ELEMENTS (peer_list, node, nnode, peer))
     {
       vty_out (vty, "    %s %s%14s %10d %10d %10d      %s%s", inet6_ntoa (&peer->addr),
                VTY_NEWLINE, " ",
index b6b5f5aefa4523119c541f477c051423a165506d..ec6c4d04c4d7a94812df29dfafd28b16e1d07ef0 100644 (file)
@@ -380,20 +380,19 @@ ripng_nexthop_rte (struct rte *rte,
 int
 ripng_lladdr_check (struct interface *ifp, struct in6_addr *addr)
 {
-  struct listnode *listnode;
+  struct listnode *node;
   struct connected *connected;
   struct prefix *p;
 
-  for (listnode = listhead (ifp->connected); listnode; nextnode (listnode))
-    if ((connected = getdata (listnode)) != NULL)
-      {
-       p = connected->address;
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, connected))
+    {
+      p = connected->address;
 
-       if (p->family == AF_INET6 &&
-           IN6_IS_ADDR_LINKLOCAL (&p->u.prefix6) &&
-           IN6_ARE_ADDR_EQUAL (&p->u.prefix6, addr))
-         return 1;
-      }
+      if (p->family == AF_INET6 &&
+          IN6_IS_ADDR_LINKLOCAL (&p->u.prefix6) &&
+          IN6_ARE_ADDR_EQUAL (&p->u.prefix6, addr))
+        return 1;
+    }
   return 0;
 }
 
@@ -1439,9 +1438,8 @@ ripng_update (struct thread *t)
     zlog_debug ("RIPng update timer expired!");
 
   /* Supply routes to each interface. */
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
       ri = ifp->info;
 
       if (if_is_loopback (ifp) || ! if_is_up (ifp))
@@ -1523,9 +1521,8 @@ ripng_triggered_update (struct thread *t)
 
   /* Split Horizon processing is done when generating triggered
      updates as well as normal updates (see section 2.6). */
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
-      ifp = getdata (node);
       ri = ifp->info;
 
       if (if_is_loopback (ifp) || ! if_is_up (ifp))
@@ -2137,6 +2134,7 @@ DEFUN (show_ipv6_ripng_status,
        "IPv6 routing protocol process parameters and statistics\n")
 {
   struct listnode *node;
+  struct interface *ifp;
   int ripng_network_write (struct vty *, int);
   void ripng_redistribute_write (struct vty *, int);
 
@@ -2171,12 +2169,10 @@ DEFUN (show_ipv6_ripng_status,
 
   vty_out (vty, "    Interface        Send  Recv%s", VTY_NEWLINE);
 
-  for (node = listhead (iflist); node; node = nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
       struct ripng_interface *ri;
-      struct interface *ifp;
-
-      ifp = getdata (node);
+      
       ri = ifp->info;
 
       if (ri->enable_network || ri->enable_interface)
@@ -2808,11 +2804,8 @@ ripng_distribute_update_all (struct prefix_list *notused)
   struct interface *ifp;
   struct listnode *node;
 
-  for (node = listhead (iflist); node; nextnode (node))
-    {
-      ifp = getdata (node);
-      ripng_distribute_update_interface (ifp);
-    }
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
+    ripng_distribute_update_interface (ifp);
 }
 
 void
@@ -2986,11 +2979,8 @@ ripng_routemap_update (const char *unused)
   struct interface *ifp;
   struct listnode *node;
 
-  for (node = listhead (iflist); node; nextnode (node))
-    {
-      ifp = getdata (node);
-      ripng_if_rmap_update_interface (ifp);
-    }
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
+    ripng_if_rmap_update_interface (ifp);
 
   ripng_routemap_update_redistribute ();
 }
index fe8d52fb759a238433df19bc22cabd738c981347..70c37462fddd21a8bf6280e8b20185eb6d547fa4 100644 (file)
@@ -88,7 +88,7 @@ config_get (int index, const char *line)
   struct config *config;
   struct config *config_loop;
   struct list *master;
-  struct listnode *nn;
+  struct listnode *node, *nnode;
 
   config = config_loop = NULL;
 
@@ -102,7 +102,7 @@ config_get (int index, const char *line)
       vector_set_index (configvec, index, master);
     }
   
-  LIST_LOOP (master, config_loop, nn)
+  for (ALL_LIST_ELEMENTS (master, node, nnode, config_loop))
     {
       if (strcmp (config_loop->name, line) == 0)
        config = config_loop;
@@ -130,10 +130,10 @@ config_add_line (struct list *config, const char *line)
 void
 config_add_line_uniq (struct list *config, const char *line)
 {
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   char *pnt;
 
-  LIST_LOOP (config, pnt, nn)
+  for (ALL_LIST_ELEMENTS (config, node, nnode, pnt))
     {
       if (strcmp (pnt, line) == 0)
        return;
@@ -294,14 +294,14 @@ vtysh_config_parse (char *line)
 void
 vtysh_config_dump (FILE *fp)
 {
-  struct listnode *nn;
-  struct listnode *nm;
+  struct listnode *node, *nnode;
+  struct listnode *mnode, *mnnode;
   struct config *config;
   struct list *master;
   char *line;
   unsigned int i;
 
-  LIST_LOOP (config_top, line, nn)
+  for (ALL_LIST_ELEMENTS (config_top, node, nnode, line))
     {
       fprintf (fp, "%s\n", line);
       fflush (fp);
@@ -312,12 +312,12 @@ vtysh_config_dump (FILE *fp)
   for (i = 0; i < vector_active (configvec); i++)
     if ((master = vector_slot (configvec, i)) != NULL)
       {
-       LIST_LOOP (master, config, nn)
+       for (ALL_LIST_ELEMENTS (master, node, nnode, config))
          {
            fprintf (fp, "%s\n", config->name);
            fflush (fp);
 
-           LIST_LOOP (config->line, line, nm)
+           for (ALL_LIST_ELEMENTS (config->line, mnode, mnnode, line))
              {
                fprintf  (fp, "%s\n", line);
                fflush (fp);
index f84cca83d07c454c770ba279815944e073663ea3..1ae2d8cbade36279d9cd971b604b8ec4ab7d0898 100644 (file)
@@ -116,10 +116,10 @@ user_free (struct user *user)
 struct user *
 user_lookup (const char *name)
 {
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct user *user;
 
-  LIST_LOOP (userlist, user, nn)
+  for (ALL_LIST_ELEMENTS (userlist, node, nnode, user))
     {
       if (strcmp (user->name, name) == 0)
        return user;
@@ -130,10 +130,10 @@ user_lookup (const char *name)
 void
 user_config_write ()
 {
-  struct listnode *nn;
+  struct listnode *node, *nnode;
   struct user *user;
 
-  LIST_LOOP (userlist, user, nn)
+  for (ALL_LIST_ELEMENTS (userlist, node, nnode, user))
     {
       if (user->nopassword)
        printf (" username %s nopassword\n", user->name);
index 5f581915be95b4a52dc1e562da35d28947d252a1..3ce59530f30e6ac910732a1f724da7c86f5daae3 100644 (file)
@@ -41,13 +41,10 @@ connected_check_ipv4 (struct interface *ifp, struct prefix *p)
   struct connected *ifc;
   struct listnode *node;
 
-  for (node = listhead (ifp->connected); node; node = nextnode (node))
-    {
-      ifc = getdata (node);
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, ifc))
+    if (prefix_same (ifc->address, p))
+      return ifc;
 
-      if (prefix_same (ifc->address, p))
-       return ifc;
-    }
   return NULL;
 }
 
@@ -267,13 +264,10 @@ connected_check_ipv6 (struct interface *ifp, struct prefix *p)
   struct connected *ifc;
   struct listnode *node;
 
-  for (node = listhead (ifp->connected); node; node = nextnode (node))
-    {
-      ifc = getdata (node);
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, ifc))
+    if (prefix_same (ifc->address, p))
+      return ifc;
 
-      if (prefix_same (ifc->address, p))
-       return ifc;
-    }
   return 0;
 }
 
index 0d7713db93ff1d1e59d30389bcc52e1ba4288903..24c4cd746a749f6c39261dad0a0c50ba00f489dd 100644 (file)
@@ -409,13 +409,11 @@ if_get_addr (struct interface *ifp)
 static void
 interface_info_ioctl ()
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct interface *ifp;
   
-  LIST_LOOP (iflist, ifp, node)
+  for (ALL_LIST_ELEMENTS (iflist, ifp, node, nnode))
     {
-      ifp = getdata (node);
-
       if_get_index (ifp);
 #ifdef SIOCGIFHWADDR
       if_get_hwaddr (ifp);
index aa01b0733c68f3ebe9710e38ed9e6ca16ae8c9e1..ae6a94520c91643a1b2a87b615065b7b7ea52c37 100644 (file)
@@ -344,7 +344,7 @@ if_lookup_linklocal (struct interface *ifp)
   if (ifp == NULL)
     return NULL;
 
-  LIST_LOOP (ifp->connected, ifc, node)
+  for (ALL_LIST_ELEMENTS_RO(ifp->connected, ifc, node))
     {
       if ((ifc->address->family == AF_INET6) &&
           (IN6_IS_ADDR_LINKLOCAL (&ifc->address->u.prefix6)))
index 0f294a56fb17068117c7337bcf6ad0517a81c86a..bd31fb40eb1733f46f21a1fed236e2038bb36df1 100644 (file)
@@ -170,7 +170,7 @@ if_subnet_delete (struct interface *ifp, struct connected *ifc)
       /* If deleted address is primary, mark subsequent one as such and distribute. */
       if (! CHECK_FLAG (ifc->flags, ZEBRA_IFA_SECONDARY))
        {
-         ifc = (struct connected *) addr_list->head->data;
+         ifc = listgetdata (listhead (addr_list));
          zebra_interface_address_delete_update (ifp, ifc);
          UNSET_FLAG (ifc->flags, ZEBRA_IFA_SECONDARY);
          zebra_interface_address_add_update (ifp, ifc);
@@ -192,14 +192,13 @@ if_subnet_delete (struct interface *ifp, struct connected *ifc)
 void
 if_addr_wakeup (struct interface *ifp)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct connected *ifc;
   struct prefix *p;
   int ret;
 
-  for (node = listhead (ifp->connected); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, ifc))
     {
-      ifc = getdata (node);
       p = ifc->address;
        
       if (CHECK_FLAG (ifc->conf, ZEBRA_IFC_CONFIGURED)
@@ -334,7 +333,7 @@ if_delete_update (struct interface *ifp)
       last = NULL;
       while ((node = (last ? last->next : listhead (ifp->connected))))
        {
-         ifc = getdata (node);
+         ifc = listgetdata (node);
          p = ifc->address;
          
          if (p->family == AF_INET)
@@ -354,7 +353,7 @@ if_delete_update (struct interface *ifp)
                    }
                  next = node->next;
 
-                 ifc = getdata (node);
+                 ifc = listgetdata (node);
                  p = ifc->address;
 
                  connected_down_ipv4 (ifp, ifc);
@@ -423,10 +422,8 @@ if_up (struct interface *ifp)
   /* Install connected routes to the kernel. */
   if (ifp->connected)
     {
-      for (node = listhead (ifp->connected); node; node = next)
+      for (ALL_LIST_ELEMENTS (ifp->connected, node, next, ifc))
        {
-         next = node->next;
-         ifc = getdata (node);
          p = ifc->address;
 
          if (p->family == AF_INET)
@@ -458,10 +455,8 @@ if_down (struct interface *ifp)
   /* Delete connected routes from the kernel. */
   if (ifp->connected)
     {
-      for (node = listhead (ifp->connected); node; node = next)
+      for (ALL_LIST_ELEMENTS (ifp->connected, node, next, ifc))
        {
-         next = node->next;
-         ifc = getdata (node);
          p = ifc->address;
 
          if (p->family == AF_INET)
@@ -727,16 +722,12 @@ if_dump_vty (struct vty *vty, struct interface *ifp)
       if (! rn->info)
        continue;
       
-      for (node = listhead ((struct list *) rn->info); node; nextnode (node))
-       {
-         connected = getdata (node);
-         connected_dump_vty (vty, connected);
-       }
+      for (ALL_LIST_ELEMENTS_RO ((struct list *)rn->info, node, connected))
+        connected_dump_vty (vty, connected);
     }
 
-  for (node = listhead (ifp->connected); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, connected))
     {
-      connected = getdata (node);
       if (CHECK_FLAG (connected->conf, ZEBRA_IFC_REAL) &&
          (connected->address->family == AF_INET6))
        connected_dump_vty (vty, connected);
@@ -902,8 +893,8 @@ DEFUN (show_interface, show_interface_cmd,
     }
 
   /* All interface print. */
-  for (node = listhead (iflist); node; nextnode (node))
-    if_dump_vty (vty, getdata (node));
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
+    if_dump_vty (vty, ifp);
 
   return CMD_SUCCESS;
 }
@@ -919,10 +910,9 @@ DEFUN (show_interface_desc,
   struct interface *ifp;
 
   vty_out (vty, "Interface       Status  Protocol  Description%s", VTY_NEWLINE);
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
       int len;
-      ifp = getdata (node);
 
       len = vty_out (vty, "%s", ifp->name);
       vty_out (vty, "%*s", (16 - len), " ");
@@ -1514,14 +1504,13 @@ if_config_write (struct vty *vty)
   struct interface *ifp;
   char buf[BUFSIZ];
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
     {
       struct zebra_if *if_data;
       struct listnode *addrnode;
       struct connected *ifc;
       struct prefix *p;
 
-      ifp = getdata (node);
       if_data = ifp->info;
       
       vty_out (vty, "interface %s%s", ifp->name,
@@ -1539,9 +1528,8 @@ if_config_write (struct vty *vty)
       if (CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_LINKDETECTION))
        vty_out(vty, " link-detect%s", VTY_NEWLINE);
 
-      for (addrnode = listhead (ifp->connected); addrnode; nextnode (addrnode))
+      for (ALL_LIST_ELEMENTS_RO (ifp->connected, addrnode, ifc))
          {
-           ifc = getdata (addrnode);
            if (CHECK_FLAG (ifc->conf, ZEBRA_IFC_CONFIGURED))
              {
                p = ifc->address;
index 5f913856b5455cd1621984c57a3ef6c6cf23d2ec..dd7734026b312fcdc243ec03db438a1de44dfb60 100644 (file)
@@ -81,7 +81,7 @@ irdp_get_prefix(struct interface *ifp)
   struct connected *ifc;
   
   if (ifp->connected)
-    LIST_LOOP (ifp->connected, ifc, node)
+    for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, ifc))
       return ifc->address;
 
   return NULL;
@@ -235,7 +235,7 @@ irdp_if_start(struct interface *ifp, int multicast, int set_defaults)
 
   seed = 0;
   if( ifp->connected)
-    LIST_LOOP (ifp->connected, ifc, node)
+    for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, ifc))
       {
         seed = ifc->address->u.prefix4.s_addr;
         break;
@@ -355,7 +355,7 @@ void irdp_config_write (struct vty *vty, struct interface *ifp)
     vty_out (vty, " ip irdp preference %ld%s",  
             irdp->Preference, VTY_NEWLINE);
 
-    LIST_LOOP (irdp->AdvPrefList, adv, node)
+    for (ALL_LIST_ELEMENTS_RO (irdp->AdvPrefList, node, adv))
       vty_out (vty, " ip irdp address %s preference %d%s",
                     inet_2a(adv->ip.s_addr, b1),
                     adv->pref, 
@@ -610,7 +610,7 @@ DEFUN (ip_irdp_address_preference,
 
   pref = atoi(argv[1]);
 
-  LIST_LOOP (irdp->AdvPrefList, adv, node)
+  for (ALL_LIST_ELEMENTS_RO (irdp->AdvPrefList, node, adv))
     if(adv->ip.s_addr == ip.s_addr) 
       return CMD_SUCCESS;
 
@@ -656,11 +656,8 @@ DEFUN (no_ip_irdp_address_preference,
 
   pref = atoi(argv[1]);
 
-  for (node = listhead (irdp->AdvPrefList); node; node = nnode)
+  for (ALL_LIST_ELEMENTS (irdp->AdvPrefList, node, nnode, adv))
     {
-      nnode = node->next;
-      adv = getdata (node);
-      
       if(adv->ip.s_addr == ip.s_addr )
         {
           listnode_delete(irdp->AdvPrefList, adv);
index af6bb80b573205ef862023f6bfc5ab7fcb14fff0..04f12f185c9ddb22fe8718dd24bdedb2b439f638 100644 (file)
@@ -150,7 +150,7 @@ get_pref(struct irdp_interface *irdp, struct prefix *p)
   if( irdp->AdvPrefList == NULL )
     return irdp->Preference;
   
-  LIST_LOOP (irdp->AdvPrefList, adv, node)
+  for (ALL_LIST_ELEMENTS_RO (irdp->AdvPrefList, node, adv))
     if( p->u.prefix4.s_addr == adv->ip.s_addr )
       return adv->pref;
 
@@ -234,13 +234,13 @@ int irdp_send_thread(struct thread *t_advert)
   struct zebra_if *zi=ifp->info;
   struct irdp_interface *irdp=&zi->irdp;
   struct prefix *p;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct connected *ifc;
 
   irdp->flags &= ~IF_SOLICIT;
 
   if(ifp->connected) 
-    LIST_LOOP (ifp->connected, ifc, node)
+    for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, ifc))
       {
         p = ifc->address;
         irdp_advertisement(ifp, p);
@@ -266,7 +266,7 @@ void irdp_advert_off(struct interface *ifp)
 {
   struct zebra_if *zi=ifp->info;
   struct irdp_interface *irdp=&zi->irdp;
-  struct listnode *node;
+  struct listnode *node, *nnode;
   int i;
   struct connected *ifc;
   struct prefix *p;
@@ -275,7 +275,7 @@ void irdp_advert_off(struct interface *ifp)
   irdp->t_advertise = NULL;
   
   if(ifp->connected) 
-    LIST_LOOP (ifp->connected, ifc, node)
+    for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, ifc))
       {
         p = ifc->address;
 
@@ -319,16 +319,15 @@ void process_solicit (struct interface *ifp)
 void irdp_finish()
 {
 
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct interface *ifp;
   struct zebra_if *zi;
   struct irdp_interface *irdp;
 
   zlog_info("IRDP: Received shutdown notification.");
   
-  for (node = listhead (iflist); node; node = nextnode (node))
+  for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
     {
-      ifp = getdata(node);
       zi = ifp->info;
       
       if (!zi) 
index 949159de8b5624073deec2d15f1187d5e25ff24f..dff6cb54e5f0a1a0ca8243b6a635833d064923ba 100644 (file)
@@ -169,71 +169,71 @@ zebra_redistribute (struct zserv *client, int type)
 void
 redistribute_add (struct prefix *p, struct rib *rib)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct zserv *client;
 
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    if ((client = getdata (node)) != NULL)
-      {
-       if (is_default (p))
-         {
-           if (client->redist_default || client->redist[rib->type])
-             {
-               if (p->family == AF_INET)
-                 zsend_route_multipath (ZEBRA_IPV4_ROUTE_ADD, client, p, rib);
+  for (ALL_LIST_ELEMENTS (zebrad.client_list, node, nnode, client))
+    {
+      if (is_default (p))
+        {
+          if (client->redist_default || client->redist[rib->type])
+            {
+              if (p->family == AF_INET)
+                zsend_route_multipath (ZEBRA_IPV4_ROUTE_ADD, client, p, rib);
 #ifdef HAVE_IPV6
-               if (p->family == AF_INET6)
-                 zsend_route_multipath (ZEBRA_IPV6_ROUTE_ADD, client, p, rib);
+              if (p->family == AF_INET6)
+                zsend_route_multipath (ZEBRA_IPV6_ROUTE_ADD, client, p, rib);
 #endif /* HAVE_IPV6 */   
-             }
-         }
-       else if (client->redist[rib->type])
-         {
-           if (p->family == AF_INET)
-             zsend_route_multipath (ZEBRA_IPV4_ROUTE_ADD, client, p, rib);
+           }
+        }
+      else if (client->redist[rib->type])
+        {
+          if (p->family == AF_INET)
+            zsend_route_multipath (ZEBRA_IPV4_ROUTE_ADD, client, p, rib);
 #ifdef HAVE_IPV6
-           if (p->family == AF_INET6)
-             zsend_route_multipath (ZEBRA_IPV6_ROUTE_ADD, client, p, rib);
+          if (p->family == AF_INET6)
+            zsend_route_multipath (ZEBRA_IPV6_ROUTE_ADD, client, p, rib);
 #endif /* HAVE_IPV6 */   
-         }
-      }
+        }
+    }
 }
 
 void
 redistribute_delete (struct prefix *p, struct rib *rib)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct zserv *client;
 
   /* Add DISTANCE_INFINITY check. */
   if (rib->distance == DISTANCE_INFINITY)
     return;
 
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    if ((client = getdata (node)) != NULL)
-      {
-       if (is_default (p))
-         {
-           if (client->redist_default || client->redist[rib->type])
-             {
-               if (p->family == AF_INET)
-                 zsend_route_multipath (ZEBRA_IPV4_ROUTE_DELETE, client, p, rib);
+  for (ALL_LIST_ELEMENTS (zebrad.client_list, node, nnode, client))
+    {
+      if (is_default (p))
+       {
+         if (client->redist_default || client->redist[rib->type])
+           {
+             if (p->family == AF_INET)
+               zsend_route_multipath (ZEBRA_IPV4_ROUTE_DELETE, client, p,
+                                      rib);
 #ifdef HAVE_IPV6
-               if (p->family == AF_INET6)
-                 zsend_route_multipath (ZEBRA_IPV6_ROUTE_DELETE, client, p, rib);
-#endif /* HAVE_IPV6 */   
-             }
-         }
-       else if (client->redist[rib->type])
-         {
-           if (p->family == AF_INET)
-             zsend_route_multipath (ZEBRA_IPV4_ROUTE_DELETE, client, p, rib);
+             if (p->family == AF_INET6)
+               zsend_route_multipath (ZEBRA_IPV6_ROUTE_DELETE, client, p,
+                                      rib);
+#endif /* HAVE_IPV6 */
+           }
+       }
+      else if (client->redist[rib->type])
+       {
+         if (p->family == AF_INET)
+           zsend_route_multipath (ZEBRA_IPV4_ROUTE_DELETE, client, p, rib);
 #ifdef HAVE_IPV6
-           if (p->family == AF_INET6)
-             zsend_route_multipath (ZEBRA_IPV6_ROUTE_DELETE, client, p, rib);
-#endif /* HAVE_IPV6 */   
-         }
-      }
+         if (p->family == AF_INET6)
+           zsend_route_multipath (ZEBRA_IPV6_ROUTE_DELETE, client, p, rib);
+#endif /* HAVE_IPV6 */
+       }
+    }
 }
 
 void
@@ -306,46 +306,43 @@ zebra_redistribute_default_delete (int command, struct zserv *client,
 void
 zebra_interface_up_update (struct interface *ifp)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct zserv *client;
 
   if (IS_ZEBRA_DEBUG_EVENT)
     zlog_debug ("MESSAGE: ZEBRA_INTERFACE_UP %s", ifp->name);
 
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    if ((client = getdata (node)) != NULL)
-      zsend_interface_update (ZEBRA_INTERFACE_UP, client, ifp);
+  for (ALL_LIST_ELEMENTS (zebrad.client_list, node, nnode, client))
+    zsend_interface_update (ZEBRA_INTERFACE_UP, client, ifp);
 }
 
 /* Interface down information. */
 void
 zebra_interface_down_update (struct interface *ifp)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct zserv *client;
 
   if (IS_ZEBRA_DEBUG_EVENT)
     zlog_debug ("MESSAGE: ZEBRA_INTERFACE_DOWN %s", ifp->name);
 
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    if ((client = getdata (node)) != NULL)
-      zsend_interface_update (ZEBRA_INTERFACE_DOWN, client, ifp);
+  for (ALL_LIST_ELEMENTS (zebrad.client_list, node, nnode, client))
+    zsend_interface_update (ZEBRA_INTERFACE_DOWN, client, ifp);
 }
 
 /* Interface information update. */
 void
 zebra_interface_add_update (struct interface *ifp)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct zserv *client;
 
   if (IS_ZEBRA_DEBUG_EVENT)
     zlog_debug ("MESSAGE: ZEBRA_INTERFACE_ADD %s", ifp->name);
     
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    if ((client = getdata (node)) != NULL)
-      if (client->ifinfo)
-       zsend_interface_add (client, ifp);
+  for (ALL_LIST_ELEMENTS (zebrad.client_list, node, nnode, client))
+    if (client->ifinfo)
+      zsend_interface_add (client, ifp);
 }
 
 /*
@@ -357,16 +354,15 @@ zebra_interface_add_update (struct interface *ifp)
 void
 zebra_interface_delete_update (struct interface *ifp)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct zserv *client;
 
   if (IS_ZEBRA_DEBUG_EVENT)
     zlog_debug ("MESSAGE: ZEBRA_INTERFACE_DELETE %s", ifp->name);
 
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    if ((client = getdata (node)) != NULL)
-      if (client->ifinfo)
-       zsend_interface_delete (client, ifp);
+  for (ALL_LIST_ELEMENTS (zebrad.client_list, node, nnode, client))
+    if (client->ifinfo)
+      zsend_interface_delete (client, ifp);
 }
 #endif /* defined(RTM_IFANNOUNCE) || defined(HAVE_NETLINK) */
 
@@ -375,7 +371,7 @@ void
 zebra_interface_address_add_update (struct interface *ifp,
                                    struct connected *ifc)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct zserv *client;
   struct prefix *p;
   char buf[BUFSIZ];
@@ -390,10 +386,9 @@ zebra_interface_address_add_update (struct interface *ifp,
 
   router_id_add_address(ifc);
 
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    if ((client = getdata (node)) != NULL)
-      if (client->ifinfo && CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL))
-       zsend_interface_address (ZEBRA_INTERFACE_ADDRESS_ADD, client, ifp, ifc);
+  for (ALL_LIST_ELEMENTS (zebrad.client_list, node, nnode, client))
+    if (client->ifinfo && CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL))
+      zsend_interface_address (ZEBRA_INTERFACE_ADDRESS_ADD, client, ifp, ifc);
 }
 
 /* Interface address deletion. */
@@ -401,7 +396,7 @@ void
 zebra_interface_address_delete_update (struct interface *ifp,
                                       struct connected *ifc)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct zserv *client;
   struct prefix *p;
   char buf[BUFSIZ];
@@ -416,8 +411,7 @@ zebra_interface_address_delete_update (struct interface *ifp,
 
   router_id_del_address(ifc);
 
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    if ((client = getdata (node)) != NULL)
-      if (client->ifinfo && CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL))
-       zsend_interface_address (ZEBRA_INTERFACE_ADDRESS_DELETE, client, ifp, ifc);
+  for (ALL_LIST_ELEMENTS (zebrad.client_list, node, nnode, client))
+    if (client->ifinfo && CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL))
+      zsend_interface_address (ZEBRA_INTERFACE_ADDRESS_DELETE, client, ifp, ifc);
 }
index 3052e56a553fade2527b405bad37f255fc3a282f..6194582e069f4f60a1c30a3fc4528b11a89e2fc9 100644 (file)
@@ -52,12 +52,10 @@ router_id_find_node (struct list *l, struct connected *ifc)
   struct listnode *node;
   struct connected *c;
 
-  for (node = l->head; node; node = node->next)
-    {
-      c = (struct connected *) getdata (node);
-      if (prefix_same (ifc->address, c->address))
-       return c;
-    }
+  for (ALL_LIST_ELEMENTS_RO (l, node, c))
+    if (prefix_same (ifc->address, c->address))
+      return c;
+
   return NULL;
 }
 
@@ -94,13 +92,13 @@ router_id_get (struct prefix *p)
   else if (!list_isempty (&rid_lo_sorted_list))
     {
       node = listtail (&rid_lo_sorted_list);
-      c = getdata (node);
+      c = listgetdata (node);
       p->u.prefix4.s_addr = c->address->u.prefix4.s_addr;
     }
   else if (!list_isempty (&rid_all_sorted_list))
     {
       node = listtail (&rid_all_sorted_list);
-      c = getdata (node);
+      c = listgetdata (node);
       p->u.prefix4.s_addr = c->address->u.prefix4.s_addr;
     }
 }
@@ -115,9 +113,9 @@ router_id_set (struct prefix *p)
   rid_user_assigned.u.prefix4.s_addr = p->u.prefix4.s_addr;
 
   router_id_get (&p2);
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    if ((client = getdata (node)) != NULL)
-      zsend_router_id_update (client, &p2);
+
+  for (ALL_LIST_ELEMENTS_RO (zebrad.client_list, node, client))
+    zsend_router_id_update (client, &p2);
 }
 
 void
@@ -148,9 +146,8 @@ router_id_add_address (struct connected *ifc)
   if (prefix_same (&before, &after))
     return;
 
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    if ((client = getdata (node)) != NULL)
-      zsend_router_id_update (client, &after);
+  for (ALL_LIST_ELEMENTS_RO (zebrad.client_list, node, client))
+    zsend_router_id_update (client, &after);
 }
 
 void
@@ -182,9 +179,8 @@ router_id_del_address (struct connected *ifc)
   if (prefix_same (&before, &after))
     return;
 
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    if ((client = getdata (node)) != NULL)
-      zsend_router_id_update (client, &after);
+  for (ALL_LIST_ELEMENTS_RO (zebrad.client_list, node, client))
+    zsend_router_id_update (client, &after);
 }
 
 void
index 725965630d1f74d939abf489e5b5db8646e78d7e..3e22398574cfa82fd6212e53abf56a459e7a8164 100644 (file)
@@ -166,6 +166,7 @@ rtadv_send_packet (int sock, struct interface *ifp)
   int ret;
   int len = 0;
   struct zebra_if *zif;
+  struct rtadv_prefix *rprefix;
   u_char all_nodes_addr[] = {0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
   struct listnode *node;
 
@@ -245,12 +246,9 @@ rtadv_send_packet (int sock, struct interface *ifp)
     }
 
   /* Fill in prefix. */
-  for (node = listhead (zif->rtadv.AdvPrefixList); node; node = nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (zif->rtadv.AdvPrefixList, node, rprefix))
     {
       struct nd_opt_prefix_info *pinfo;
-      struct rtadv_prefix *rprefix;
-
-      rprefix = getdata (node);
 
       pinfo = (struct nd_opt_prefix_info *) (buf + len);
 
@@ -338,7 +336,7 @@ rtadv_send_packet (int sock, struct interface *ifp)
 int
 rtadv_timer (struct thread *thread)
 {
-  struct listnode *node;
+  struct listnode *node, *nnode;
   struct interface *ifp;
   struct zebra_if *zif;
   int period;
@@ -355,10 +353,8 @@ rtadv_timer (struct thread *thread)
       rtadv_event (RTADV_TIMER_MSEC, 10 /* 10 ms */);
     }
 
-  for (node = listhead (iflist); node; nextnode (node))
+  for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
     {
-      ifp = getdata (node);
-
       if (if_is_loopback (ifp))
        continue;
 
@@ -553,12 +549,9 @@ rtadv_prefix_lookup (struct list *rplist, struct prefix *p)
   struct listnode *node;
   struct rtadv_prefix *rprefix;
 
-  for (node = listhead (rplist); node; node = nextnode (node))
-    {
-      rprefix = getdata (node);
-      if (prefix_same (&rprefix->prefix, p))
-       return rprefix;
-    }
+  for (ALL_LIST_ELEMENTS_RO (rplist, node, rprefix))
+    if (prefix_same (&rprefix->prefix, p))
+      return rprefix;
   return NULL;
 }
 
@@ -1426,9 +1419,8 @@ rtadv_config_write (struct vty *vty, struct interface *ifp)
   if (zif->rtadv.AdvOtherConfigFlag)
     vty_out (vty, " ipv6 nd other-config-flag%s", VTY_NEWLINE);
 
-  for (node = listhead(zif->rtadv.AdvPrefixList); node; node = nextnode (node))
+  for (ALL_LIST_ELEMENTS_RO (zif->rtadv.AdvPrefixList, node, rprefix))
     {
-      rprefix = getdata (node);
       vty_out (vty, " ipv6 nd prefix %s/%d",
               inet_ntop (AF_INET6, &rprefix->prefix.u.prefix6, 
                          (char *) buf, INET6_ADDRSTRLEN),
index a34e214af7d4a786187fb8e68e4218afe20df42c..4eaf6bd38db55e3b61668a430915fbf8839eeeab 100644 (file)
@@ -721,18 +721,16 @@ zsend_router_id_update (struct zserv *client, struct prefix *p)
 static int
 zread_interface_add (struct zserv *client, u_short length)
 {
-  struct listnode *ifnode;
-  struct listnode *cnode;
+  struct listnode *ifnode, *ifnnode;
+  struct listnode *cnode, *cnnode;
   struct interface *ifp;
   struct connected *c;
 
   /* Interface information is needed. */
   client->ifinfo = 1;
 
-  for (ifnode = listhead (iflist); ifnode; ifnode = nextnode (ifnode))
+  for (ALL_LIST_ELEMENTS (iflist, ifnode, ifnnode, ifp))
     {
-      ifp = getdata (ifnode);
-
       /* Skip pseudo interface. */
       if (! CHECK_FLAG (ifp->status, ZEBRA_INTERFACE_ACTIVE))
        continue;
@@ -740,9 +738,8 @@ zread_interface_add (struct zserv *client, u_short length)
       if (zsend_interface_add (client, ifp) < 0)
         return -1;
 
-      for (cnode = listhead (ifp->connected); cnode; nextnode (cnode))
+      for (ALL_LIST_ELEMENTS (ifp->connected, cnode, cnnode, c))
        {
-         c = getdata (cnode);
          if (CHECK_FLAG (c->conf, ZEBRA_IFC_REAL) &&
              (zsend_interface_address (ZEBRA_INTERFACE_ADDRESS_ADD, client, 
                                        ifp, c) < 0))
@@ -1566,11 +1563,9 @@ DEFUN (show_zebra_client,
   struct listnode *node;
   struct zserv *client;
 
-  for (node = listhead (zebrad.client_list); node; nextnode (node))
-    {
-      client = getdata (node);
-      vty_out (vty, "Client fd %d%s", client->sock, VTY_NEWLINE);
-    }
+  for (ALL_LIST_ELEMENTS_RO (zebrad.client_list, node, client))
+    vty_out (vty, "Client fd %d%s", client->sock, VTY_NEWLINE);
+  
   return CMD_SUCCESS;
 }