]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Modify FIB_WALK() and FIB_ITERATE() to work with new FIB code
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Mon, 21 Dec 2015 19:16:05 +0000 (20:16 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Mon, 21 Dec 2015 19:28:44 +0000 (20:28 +0100)
Returned user data pointers have offset relative to fib_node.

nest/route.h
nest/rt-fib.c
nest/rt-table.c
proto/ospf/ospf.c
proto/ospf/rt.c
proto/rip/packets.c
proto/rip/rip.c
sysdep/unix/krt.c

index 5db84650a7384918efe5c97678d31d1c520ca357..a30a3880b61b8a89f90d9429283253be9965f21b 100644 (file)
@@ -65,6 +65,12 @@ struct fib {
   fib_init_fn init;                    /* Constructor */
 };
 
+static inline void * fib_node_to_user(struct fib *f, struct fib_node *e)
+{ return e ? (void *) ((char *) e - f->node_offset) : NULL; }
+
+static inline struct fib_node * fib_user_to_node(struct fib *f, void *e)
+{ return e ? (void *) ((char *) e + f->node_offset) : NULL; }
+
 void fib_init(struct fib *f, pool *p, uint addr_type, uint node_size, uint node_offset, uint hash_order, fib_init_fn init);
 void *fib_find(struct fib *, const net_addr *);        /* Find or return NULL if doesn't exist */
 void *fib_get(struct fib *, const net_addr *);         /* Find or create new if nonexistent */
@@ -78,35 +84,38 @@ struct fib_node *fit_get(struct fib *, struct fib_iterator *);
 void fit_put(struct fib_iterator *, struct fib_node *);
 void fit_put_next(struct fib *f, struct fib_iterator *i, struct fib_node *n, uint hpos);
 
-/* XXXX: return user entries */
-#define FIB_WALK(fib, z) do {                                  \
-       struct fib_node *z, **ff = (fib)->hash_table;           \
-       uint count = (fib)->hash_size;                          \
-       while (count--)                                         \
-         for(z = *ff++; z; z=z->next)
+
+#define FIB_WALK(fib, type, z) do {                            \
+       struct fib_node *fn_, **ff_ = (fib)->hash_table;        \
+       uint count_ = (fib)->hash_size;                         \
+       type *z;                                                \
+       while (count_--)                                        \
+         for (fn_ = *ff_++; z = fib_node_to_user(fib, fn_); fn_=fn_->next)
 
 #define FIB_WALK_END } while (0)
 
 #define FIB_ITERATE_INIT(it, fib) fit_init(it, fib)
 
-#define FIB_ITERATE_START(fib, it, z) do {                     \
-       struct fib_node *z = fit_get(fib, it);                  \
-       uint count = (fib)->hash_size;                          \
-       uint hpos = (it)->hash;                                 \
+#define FIB_ITERATE_START(fib, it, type, z) do {               \
+       struct fib_node *fn_ = fit_get(fib, it);                \
+       uint count_ = (fib)->hash_size;                         \
+       uint hpos_ = (it)->hash;                                \
+       type *z;                                                \
        for(;;) {                                               \
-         if (!z)                                               \
+         if (!fn_)                                             \
             {                                                  \
-              if (++hpos >= count)                             \
+              if (++hpos_ >= count_)                           \
                 break;                                         \
-              z = (fib)->hash_table[hpos];                     \
+              fn_ = (fib)->hash_table[hpos_];                  \
               continue;                                        \
-           }
+           }                                                   \
+         z = fib_node_to_user(fib, fn_);
 
-#define FIB_ITERATE_END(z) z = z->next; } } while(0)
+#define FIB_ITERATE_END fn_ = fn_->next; } } while(0)
 
-#define FIB_ITERATE_PUT(it, z) fit_put(it, z)
+#define FIB_ITERATE_PUT(it) fit_put(it, fn_)
 
-#define FIB_ITERATE_PUT_NEXT(it, fib, z) fit_put_next(fib, it, z, hpos)
+#define FIB_ITERATE_PUT_NEXT(it, fib) fit_put_next(fib, it, fn_, hpos_)
 
 #define FIB_ITERATE_UNLINK(it, fib) fit_get(fib, it)
 
index 474236e001b857a388d2c2c965381182b2e1cfd2..c12d05197b49bbad77148f9e96fa3abd79016e00 100644 (file)
 #define HASH_LO_MIN 10
 
 
-static inline void * fib_node_to_user(struct fib *f, struct fib_node *e)
-{ return (void *) ((char *) e - f->node_offset); }
-
-static inline struct fib_node * fib_user_to_node(struct fib *f, void *e)
-{ return (void *) ((char *) e + f->node_offset); }
-
 static void
 fib_ht_alloc(struct fib *f)
 {
@@ -168,7 +162,7 @@ fib_rehash(struct fib *f, int step)
     struct fib_node *e = f->hash_table[FIB_HASH(f, a, t)];             \
     while (e && !net_equal_##t(CAST(t) e->addr, CAST(t) a))            \
       e = e->next;                                                     \
-    e ? fib_node_to_user(f, e) : NULL;                                 \
+    fib_node_to_user(f, e);                                            \
   })
 
 #define FIB_INSERT(f,a,e,t)                                            \
index 7eedec41587fbdcad9bb0d9c0397a98dbc58dbb5..963c8fbd724856eba123d478ef942a99ea1e799f 100644 (file)
@@ -1315,12 +1315,9 @@ rt_examine(rtable *t, net_addr *a, struct proto *p, struct filter *filter)
 void
 rt_refresh_begin(rtable *t, struct announce_hook *ah)
 {
-  net *n;
-  rte *e;
-
-  FIB_WALK(&t->fib, fn)
+  FIB_WALK(&t->fib, net, n)
     {
-      n = (net *) fn;
+      rte *e;
       for (e = n->routes; e; e = e->next)
        if (e->sender == ah)
          e->flags |= REF_STALE;
@@ -1340,12 +1337,10 @@ void
 rt_refresh_end(rtable *t, struct announce_hook *ah)
 {
   int prune = 0;
-  net *n;
-  rte *e;
 
-  FIB_WALK(&t->fib, fn)
+  FIB_WALK(&t->fib, net, n)
     {
-      n = (net *) fn;
+      rte *e;
       for (e = n->routes; e; e = e->next)
        if ((e->sender == ah) && (e->flags & REF_STALE))
          {
@@ -1387,21 +1382,19 @@ rte_dump(rte *e)
 void
 rt_dump(rtable *t)
 {
-  rte *e;
-  net *n;
-  struct announce_hook *a;
-
   debug("Dump of routing table <%s>\n", t->name);
 #ifdef DEBUGGING
   fib_check(&t->fib);
 #endif
-  FIB_WALK(&t->fib, fn)
+  FIB_WALK(&t->fib, net, n)
     {
-      n = (net *) fn;
+      rte *e;
       for(e=n->routes; e; e=e->next)
        rte_dump(e);
     }
   FIB_WALK_END;
+
+  struct announce_hook *a;
   WALK_LIST(a, t->hooks)
     debug("\tAnnounces routes to protocol %s\n", a->proto->name);
   debug("\n");
@@ -1471,19 +1464,18 @@ rt_prune_nets(rtable *tab)
 
   FIB_ITERATE_INIT(&fit, &tab->fib);
 again:
-  FIB_ITERATE_START(&tab->fib, &fit, f)
+  FIB_ITERATE_START(&tab->fib, &fit, net, n)
     {
-      net *n = (net *) f;
       ncnt++;
       if (!n->routes)          /* Orphaned FIB entry */
        {
-         FIB_ITERATE_PUT(&fit, f);
-         fib_delete(&tab->fib, f);
+         FIB_ITERATE_PUT(&fit);
+         fib_delete(&tab->fib, n);
          ndel++;
          goto again;
        }
     }
-  FIB_ITERATE_END(f);
+  FIB_ITERATE_END;
   DBG("Pruned %d of %d networks\n", ndel, ncnt);
 
   tab->gc_counter = 0;
@@ -1572,9 +1564,8 @@ rt_prune_step(rtable *tab, int *limit)
     }
 
 again:
-  FIB_ITERATE_START(&tab->fib, fit, fn)
+  FIB_ITERATE_START(&tab->fib, fit, net, n)
     {
-      net *n = (net *) fn;
       rte *e;
 
     rescan:
@@ -1583,7 +1574,7 @@ again:
          {
            if (*limit <= 0)
              {
-               FIB_ITERATE_PUT(fit, fn);
+               FIB_ITERATE_PUT(fit);
                return 0;
              }
 
@@ -1594,12 +1585,12 @@ again:
          }
       if (!n->routes)          /* Orphaned FIB entry */
        {
-         FIB_ITERATE_PUT(fit, fn);
-         fib_delete(&tab->fib, fn);
+         FIB_ITERATE_PUT(fit);
+         fib_delete(&tab->fib, n);
          goto again;
        }
     }
-  FIB_ITERATE_END(fn);
+  FIB_ITERATE_END;
 
 #ifdef DEBUGGING
   fib_check(&tab->fib);
@@ -1791,17 +1782,17 @@ rt_next_hop_update(rtable *tab)
       tab->nhu_state = 2;
     }
 
-  FIB_ITERATE_START(&tab->fib, fit, fn)
+  FIB_ITERATE_START(&tab->fib, fit, net, n)
     {
       if (max_feed <= 0)
        {
-         FIB_ITERATE_PUT(fit, fn);
+         FIB_ITERATE_PUT(fit);
          ev_schedule(tab->rt_event);
          return;
        }
-      max_feed -= rt_next_hop_update_net(tab, (net *) fn);
+      max_feed -= rt_next_hop_update_net(tab, n);
     }
-  FIB_ITERATE_END(fn);
+  FIB_ITERATE_END;
 
   /* state change 2->0, 3->1 */
   tab->nhu_state &= 1;
@@ -1971,13 +1962,12 @@ rt_feed_baby(struct proto *p)
 
 again:
   h = p->feed_ahook;
-  FIB_ITERATE_START(&h->table->fib, fit, fn)
+  FIB_ITERATE_START(&h->table->fib, fit, net, n)
     {
-      net *n = (net *) fn;
       rte *e = n->routes;
       if (max_feed <= 0)
        {
-         FIB_ITERATE_PUT(fit, fn);
+         FIB_ITERATE_PUT(fit);
          return 0;
        }
 
@@ -2008,7 +1998,7 @@ again:
            max_feed--;
          }
     }
-  FIB_ITERATE_END(fn);
+  FIB_ITERATE_END;
   p->feed_ahook = h->next;
   if (!p->feed_ahook)
     {
@@ -2534,9 +2524,8 @@ rt_show_cont(struct cli *c)
   struct fib *fib = &d->table->fib;
   struct fib_iterator *it = &d->fit;
 
-  FIB_ITERATE_START(fib, it, f)
+  FIB_ITERATE_START(fib, it, net, n)
     {
-      net *n = (net *) f;
       if (d->running_on_config && d->running_on_config != config)
        {
          cli_printf(c, 8004, "Stopped due to reconfiguration");
@@ -2549,12 +2538,12 @@ rt_show_cont(struct cli *c)
        }
       if (!max--)
        {
-         FIB_ITERATE_PUT(it, f);
+         FIB_ITERATE_PUT(it);
          return;
        }
       rt_show_net(c, n, d);
     }
-  FIB_ITERATE_END(f);
+  FIB_ITERATE_END;
   if (d->stats)
     cli_printf(c, 14, "%d of %d routes for %d networks", d->show_counter, d->rt_counter, d->net_counter);
   else
index 8008e4d8a49e920eb6805da8cc1c9d65cd32bcd2..4ffb187df0fedb4cf3cf05e15dcaf81410189b7a 100644 (file)
@@ -502,9 +502,9 @@ ospf_shutdown(struct proto *P)
     ospf_iface_shutdown(ifa);
 
   /* Cleanup locked rta entries */
-  FIB_WALK(&p->rtf, nftmp)
+  FIB_WALK(&p->rtf, ort, nf)
   {
-    rta_free(((ort *) nftmp)->old_rta);
+    rta_free(nf->old_rta);
   }
   FIB_WALK_END;
 
@@ -745,7 +745,6 @@ ospf_sh(struct proto *P)
   struct ospf_iface *ifa;
   struct ospf_neighbor *n;
   int ifano, nno, adjno, firstfib;
-  struct area_net *anet;
 
   if (p->p.proto_state != PS_UP)
   {
@@ -794,9 +793,8 @@ ospf_sh(struct proto *P)
     cli_msg(-1014, "\t\tNumber of adjacent neighbors:\t%u", adjno);
 
     firstfib = 1;
-    FIB_WALK(&oa->net_fib, nftmp)
+    FIB_WALK(&oa->net_fib, struct area_net, anet)
     {
-      anet = (struct area_net *) nftmp;
       if(firstfib)
       {
        cli_msg(-1014, "\t\tArea networks:");
@@ -808,9 +806,8 @@ ospf_sh(struct proto *P)
     FIB_WALK_END;
 
     firstfib = 1;
-    FIB_WALK(&oa->enet_fib, nftmp)
+    FIB_WALK(&oa->enet_fib, struct area_net, anet)
     {
-      anet = (struct area_net *) nftmp;
       if(firstfib)
       {
        cli_msg(-1014, "\t\tArea external networks:");
index 0031089c3e1008190183a5f17735635e96c3775e..707e376c267aa30fbe70e5f906f6b4425e8827e3 100644 (file)
@@ -1158,25 +1158,20 @@ static void
 ospf_rt_abr1(struct ospf_proto *p)
 {
   struct area_net *anet;
-  ort *nf, *default_nf;
+  ort *default_nf;
   net_addr default_net;
 
   /* RFC 2328 G.3 - incomplete resolution of virtual next hops - routers */
-  FIB_WALK(&p->backbone->rtr, nftmp)
+  FIB_WALK(&p->backbone->rtr, ort, nf)
   {
-    nf = (ort *) nftmp;
-
     if (nf->n.type && unresolved_vlink(nf))
       reset_ri(nf);
   }
   FIB_WALK_END;
 
 
-  FIB_WALK(&p->rtf, nftmp)
+  FIB_WALK(&p->rtf, ort, nf)
   {
-    nf = (ort *) nftmp;
-
-
     /* RFC 2328 G.3 - incomplete resolution of virtual next hops - networks */
     if (nf->n.type && unresolved_vlink(nf))
       reset_ri(nf);
@@ -1241,9 +1236,8 @@ ospf_rt_abr1(struct ospf_proto *p)
     /* RFC 2328 16.4. (3) - precompute preferred ASBR entries */
     if (oa_is_ext(oa))
     {
-      FIB_WALK(&oa->rtr, nftmp)
+      FIB_WALK(&oa->rtr, ort, nf)
       {
-       nf = (ort *) nftmp;
        if (nf->n.options & ORTA_ASBR)
          ri_install_asbr(p, rid_from_net(nf->fn.addr), &nf->n);
       }
@@ -1253,9 +1247,9 @@ ospf_rt_abr1(struct ospf_proto *p)
 
 
   /* Originate or flush ASBR summary LSAs */
-  FIB_WALK(&p->backbone->rtr, nftmp)
+  FIB_WALK(&p->backbone->rtr, ort, nf)
   {
-    check_sum_rt_lsa(p, (ort *) nftmp);
+    check_sum_rt_lsa(p, nf);
   }
   FIB_WALK_END;
 
@@ -1282,8 +1276,6 @@ ospf_rt_abr2(struct ospf_proto *p)
 {
   struct ospf_area *oa;
   struct top_hash_entry *en;
-  ort *nf, *nf2;
-
 
   /* RFC 3103 3.1 - type-7 translator election */
   struct ospf_area *bb = p->backbone;
@@ -1295,13 +1287,12 @@ ospf_rt_abr2(struct ospf_proto *p)
       if (oa->ac->translator)
        goto decided;
 
-      FIB_WALK(&oa->rtr, nftmp)
+      FIB_WALK(&oa->rtr, ort, nf)
       {
-       nf = (ort *) nftmp;
        if (!nf->n.type || !(nf->n.options & ORTA_ABR))
          continue;
 
-       nf2 = fib_find(&bb->rtr, nf->fn.addr);
+       ort *nf2 = fib_find(&bb->rtr, nf->fn.addr);
        if (!nf2 || !nf2->n.type || !(nf2->n.options & ORTA_ABR))
          continue;
 
@@ -1341,13 +1332,11 @@ ospf_rt_abr2(struct ospf_proto *p)
 
 
   /* Compute condensed external networks */
-  FIB_WALK(&p->rtf, nftmp)
+  FIB_WALK(&p->rtf, ort, nf)
   {
-    nf = (ort *) nftmp;
     if (rt_is_nssa(nf) && (nf->n.options & ORTA_PROP))
     {
-      struct area_net *anet = (struct area_net *)
-       fib_route(&nf->n.oa->enet_fib, nf->fn.addr);
+      struct area_net *anet = fib_route(&nf->n.oa->enet_fib, nf->fn.addr);
 
       if (anet)
       {
@@ -1356,7 +1345,7 @@ ospf_rt_abr2(struct ospf_proto *p)
          anet->active = 1;
 
          /* Get a RT entry and mark it to know that it is an area network */
-         nf2 = fib_get(&p->rtf, anet->fn.addr);
+         ort *nf2 = fib_get(&p->rtf, anet->fn.addr);
          nf2->area_net = 1;
        }
 
@@ -1371,10 +1360,8 @@ ospf_rt_abr2(struct ospf_proto *p)
   FIB_WALK_END;
 
 
-  FIB_WALK(&p->rtf, nftmp)
+  FIB_WALK(&p->rtf, ort, nf)
   {
-    nf = (ort *) nftmp;
-
     check_sum_net_lsa(p, nf);
     check_nssa_lsa(p, nf);
   }
@@ -1586,13 +1573,10 @@ ospf_rt_reset(struct ospf_proto *p)
 {
   struct ospf_area *oa;
   struct top_hash_entry *en;
-  struct area_net *anet;
-  ort *ri;
 
   /* Reset old routing table */
-  FIB_WALK(&p->rtf, nftmp)
+  FIB_WALK(&p->rtf, ort, ri)
   {
-    ri = (ort *) nftmp;
     ri->area_net = 0;
     reset_ri(ri);
   }
@@ -1613,9 +1597,8 @@ ospf_rt_reset(struct ospf_proto *p)
   WALK_LIST(oa, p->area_list)
   {
     /* Reset ASBR routing tables */
-    FIB_WALK(&oa->rtr, nftmp)
+    FIB_WALK(&oa->rtr, ort, ri)
     {
-      ri = (ort *) nftmp;
       reset_ri(ri);
     }
     FIB_WALK_END;
@@ -1623,17 +1606,15 @@ ospf_rt_reset(struct ospf_proto *p)
     /* Reset condensed area networks */
     if (p->areano > 1)
     {
-      FIB_WALK(&oa->net_fib, nftmp)
+      FIB_WALK(&oa->net_fib, struct area_net, anet)
       {
-       anet = (struct area_net *) nftmp;
        anet->active = 0;
        anet->metric = 0;
       }
       FIB_WALK_END;
 
-      FIB_WALK(&oa->enet_fib, nftmp)
+      FIB_WALK(&oa->enet_fib, struct area_net, anet)
       {
-       anet = (struct area_net *) nftmp;
        anet->active = 0;
        anet->metric = 0;
       }
@@ -1935,7 +1916,6 @@ rt_sync(struct ospf_proto *p)
   struct top_hash_entry *en;
   struct fib_iterator fit;
   struct fib *fib = &p->rtf;
-  ort *nf;
   struct ospf_area *oa;
 
   /* This is used for forced reload of routes */
@@ -1946,10 +1926,8 @@ rt_sync(struct ospf_proto *p)
   DBG("Now syncing my rt table with nest's\n");
   FIB_ITERATE_INIT(&fit, fib);
 again1:
-  FIB_ITERATE_START(fib, &fit, nftmp)
+  FIB_ITERATE_START(fib, &fit, ort, nf)
   {
-    nf = (ort *) nftmp;
-
     /* Sanity check of next-hop addresses, failure should not happen */
     if (nf->n.type)
     {
@@ -2027,12 +2005,12 @@ again1:
     /* Remove unused rt entry, some special entries are persistent */
     if (!nf->n.type && !nf->external_rte && !nf->area_net)
     {
-      FIB_ITERATE_PUT(&fit, nftmp);
-      fib_delete(fib, nftmp);
+      FIB_ITERATE_PUT(&fit);
+      fib_delete(fib, nf);
       goto again1;
     }
   }
-  FIB_ITERATE_END(nftmp);
+  FIB_ITERATE_END;
 
 
   WALK_LIST(oa, p->area_list)
@@ -2040,18 +2018,16 @@ again1:
     /* Cleanup ASBR hash tables */
     FIB_ITERATE_INIT(&fit, &oa->rtr);
 again2:
-    FIB_ITERATE_START(&oa->rtr, &fit, nftmp)
+    FIB_ITERATE_START(&oa->rtr, &fit, ort, nf)
     {
-      nf = (ort *) nftmp;
-
       if (!nf->n.type)
       {
-       FIB_ITERATE_PUT(&fit, nftmp);
-       fib_delete(&oa->rtr, nftmp);
+       FIB_ITERATE_PUT(&fit);
+       fib_delete(&oa->rtr, nf);
        goto again2;
       }
     }
-    FIB_ITERATE_END(nftmp);
+    FIB_ITERATE_END;
   }
 
   /* Cleanup stale LSAs */
index 2e83a4635e255fd684d5c4a7ed43ad11534321ff..1017eb9212fef36d80fb0e421c2a4b80b9a5bcfe 100644 (file)
@@ -417,10 +417,8 @@ rip_send_response(struct rip_proto *p, struct rip_iface *ifa)
   pkt->unused = 0;
   pos += rip_pkt_hdrlen(ifa);
 
-  FIB_ITERATE_START(&p->rtable, &ifa->tx_fit, z)
+  FIB_ITERATE_START(&p->rtable, &ifa->tx_fit, struct rip_entry, en)
   {
-    struct rip_entry *en = (struct rip_entry *) z;
-
     /* Dummy entries */
     if (!en->valid)
       goto next_entry;
@@ -437,7 +435,7 @@ rip_send_response(struct rip_proto *p, struct rip_iface *ifa)
     /* Not enough space for current entry */
     if (pos > max)
     {
-      FIB_ITERATE_PUT(&ifa->tx_fit, z);
+      FIB_ITERATE_PUT(&ifa->tx_fit);
       goto break_loop;
     }
 
@@ -490,7 +488,7 @@ rip_send_response(struct rip_proto *p, struct rip_iface *ifa)
 
   next_entry: ;
   }
-  FIB_ITERATE_END(z);
+  FIB_ITERATE_END;
   ifa->tx_active = 0;
 
   /* Do not send empty packet */
index f90d7711d19acf8d6e4b44502778b51358d29d07..7e5d6802e32d109cf3fdbe4b12f32b91389deea4 100644 (file)
@@ -823,9 +823,8 @@ rip_timer(timer *t)
   FIB_ITERATE_INIT(&fit, &p->rtable);
 
   loop:
-  FIB_ITERATE_START(&p->rtable, &fit, node)
+  FIB_ITERATE_START(&p->rtable, &fit, struct rip_entry, en)
   {
-    struct rip_entry *en = (struct rip_entry *) node;
     struct rip_rte *rt, **rp;
     int changed = 0;
 
@@ -852,7 +851,7 @@ rip_timer(timer *t)
        * rip_rt_notify() -> p->rtable change, invalidating hidden variables.
        */
 
-      FIB_ITERATE_PUT_NEXT(&fit, &p->rtable, node);
+      FIB_ITERATE_PUT_NEXT(&fit, &p->rtable);
       rip_announce_rte(p, en);
       goto loop;
     }
@@ -874,12 +873,12 @@ rip_timer(timer *t)
     /* Remove empty nodes */
     if (!en->valid && !en->routes)
     {
-      FIB_ITERATE_PUT(&fit, node);
-      fib_delete(&p->rtable, node);
+      FIB_ITERATE_PUT(&fit);
+      fib_delete(&p->rtable, en);
       goto loop;
     }
   }
-  FIB_ITERATE_END(node);
+  FIB_ITERATE_END;
 
   p->rt_reload = 0;
 
@@ -1248,9 +1247,8 @@ rip_dump(struct proto *P)
   int i;
 
   i = 0;
-  FIB_WALK(&p->rtable, e)
+  FIB_WALK(&p->rtable, struct rip_entry, en)
   {
-    struct rip_entry *en = (struct rip_entry *) e;
     debug("RIP: entry #%d: %N via %I dev %s valid %d metric %d age %d s\n",
          i++, en->n.addr, en->next_hop, en->iface->name,
          en->valid, en->metric, now - en->changed);
index 41293a06cf0623ed579de216a42906a375b4e687..a15d00e2d00963e10169b9413def61593d91aa3c 100644 (file)
@@ -412,9 +412,8 @@ krt_learn_prune(struct krt_proto *p)
 
   FIB_ITERATE_INIT(&fit, fib);
 again:
-  FIB_ITERATE_START(fib, &fit, f)
+  FIB_ITERATE_START(fib, &fit, net, n)
     {
-      net *n = (net *) f;
       rte *e, **ee, *best, **pbest, *old_best;
 
       old_best = n->routes;
@@ -445,8 +444,8 @@ again:
              krt_learn_announce_delete(p, n);
              n->n.flags &= ~KRF_INSTALLED;
            }
-         FIB_ITERATE_PUT(&fit, f);
-         fib_delete(fib, f);
+         FIB_ITERATE_PUT(&fit);
+         fib_delete(fib, n);
          goto again;
        }
       *pbest = best->next;
@@ -461,7 +460,7 @@ again:
       else
        DBG("%I/%d: uptodate (metric=%d)\n", n->n.prefix, n->n.pxlen, best->u.krt.metric);
     }
-  FIB_ITERATE_END(f);
+  FIB_ITERATE_END;
 
   p->reload = 0;
 }
@@ -579,9 +578,8 @@ krt_flush_routes(struct krt_proto *p)
   struct rtable *t = p->p.table;
 
   KRT_TRACE(p, D_EVENTS, "Flushing kernel routes");
-  FIB_WALK(&t->fib, f)
+  FIB_WALK(&t->fib, net, n)
     {
-      net *n = (net *) f;
       rte *e = n->routes;
       if (rte_is_valid(e) && (n->n.flags & KRF_INSTALLED))
        {
@@ -751,10 +749,9 @@ krt_prune(struct krt_proto *p)
   struct rtable *t = p->p.table;
 
   KRT_TRACE(p, D_EVENTS, "Pruning table %s", t->name);
-  FIB_WALK(&t->fib, f)
+  FIB_WALK(&t->fib, net, n)
     {
-      net *n = (net *) f;
-      int verdict = f->flags & KRF_VERDICT_MASK;
+      int verdict = n->n.flags & KRF_VERDICT_MASK;
       rte *new, *old, *rt_free = NULL;
       ea_list *tmpa = NULL;
 
@@ -783,7 +780,7 @@ krt_prune(struct krt_proto *p)
       switch (verdict)
        {
        case KRF_CREATE:
-         if (new && (f->flags & KRF_INSTALLED))
+         if (new && (n->n.flags & KRF_INSTALLED))
            {
              krt_trace_in(p, new, "reinstalling");
              krt_replace_rte(p, n, new, NULL, tmpa);
@@ -810,7 +807,7 @@ krt_prune(struct krt_proto *p)
       if (rt_free)
        rte_free(rt_free);
       lp_flush(krt_filter_lp);
-      f->flags &= ~KRF_VERDICT_MASK;
+      n->n.flags &= ~KRF_VERDICT_MASK;
     }
   FIB_WALK_END;