]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Preexport callback now takes the channel instead of protocol as argument next-preexport
authorMaria Matejka <mq@ucw.cz>
Mon, 27 Jun 2022 17:04:22 +0000 (19:04 +0200)
committerMaria Matejka <mq@ucw.cz>
Mon, 27 Jun 2022 17:04:24 +0000 (19:04 +0200)
Passing protocol to preexport was in fact a historical relic from the
old times when channels weren't a thing. Refactoring that to match
current extensibility needs.

nest/protocol.h
nest/route.h
nest/rt-show.c
nest/rt-table.c
proto/babel/babel.c
proto/bgp/attrs.c
proto/bgp/bgp.h
proto/ospf/ospf.c
proto/pipe/pipe.c
proto/radv/radv.c
sysdep/unix/krt.c

index abcc505d4ce320ec4287a73561c23ab7ec25f8e5..3b3812a5162869db5df30da5cb3ce0f76168edc0 100644 (file)
@@ -217,7 +217,7 @@ struct proto {
   void (*neigh_notify)(struct neighbor *neigh);
   void (*make_tmp_attrs)(struct rte *rt, struct linpool *pool);
   void (*store_tmp_attrs)(struct rte *rt, struct linpool *pool);
-  int (*preexport)(struct proto *, struct rte **rt, struct linpool *pool);
+  int (*preexport)(struct channel *, struct rte **rt, struct linpool *pool);
   void (*reload_routes)(struct channel *);
   void (*feed_begin)(struct channel *, int initial);
   void (*feed_end)(struct channel *);
index 395139a31975fdec8826776aad201b447f36901f..1dacd92fa72e2c56d0f63048da079270ca4d53a9 100644 (file)
@@ -357,7 +357,7 @@ rte *rte_find(net *net, struct rte_src *src);
 rte *rte_get_temp(struct rta *);
 void rte_update2(struct channel *c, const net_addr *n, rte *new, struct rte_src *src);
 /* rte_update() moved to protocol.h to avoid dependency conflicts */
-int rt_examine(rtable *t, net_addr *a, struct proto *p, const struct filter *filter);
+int rt_examine(rtable *t, net_addr *a, struct channel *c, const struct filter *filter);
 rte *rt_export_merged(struct channel *c, net *net, rte **rt_free, linpool *pool, int silent);
 void rt_refresh_begin(rtable *t, struct channel *c);
 void rt_refresh_end(rtable *t, struct channel *c);
index f8b7ba510caa7ac6323be30e115d29bbccd469d1..7639e5f7214946285d0705f78c6a125cf83aa7c2 100644 (file)
@@ -154,7 +154,7 @@ rt_show_net(struct cli *c, net *n, struct rt_show_data *d)
       else if (d->export_mode)
        {
          struct proto *ep = ec->proto;
-         int ic = ep->preexport ? ep->preexport(ep, &e, c->show_pool) : 0;
+         int ic = ep->preexport ? ep->preexport(ec, &e, c->show_pool) : 0;
 
          if (ec->ra_mode == RA_OPTIMAL || ec->ra_mode == RA_MERGED)
            pass = 1;
index 2cf5542145c26667afffaf244ac1058323efab9f..a2fa5e770620e3c3d5af30e521e215dad5549e28 100644 (file)
@@ -870,7 +870,7 @@ export_filter_(struct channel *c, rte *rt0, rte **rt_free, linpool *pool, int si
   rt = rt0;
   *rt_free = NULL;
 
-  v = p->preexport ? p->preexport(p, &rt, pool) : 0;
+  v = p->preexport ? p->preexport(c, &rt, pool) : 0;
   if (v < 0)
     {
       if (silent)
@@ -1883,8 +1883,9 @@ rte_modify(rte *old)
 
 /* Check rtable for best route to given net whether it would be exported do p */
 int
-rt_examine(rtable *t, net_addr *a, struct proto *p, const struct filter *filter)
+rt_examine(rtable *t, net_addr *a, struct channel *c, const struct filter *filter)
 {
+  struct proto *p = c->proto;
   net *n = net_find(t, a);
   rte *rt = n ? n->routes : NULL;
 
@@ -1894,7 +1895,7 @@ rt_examine(rtable *t, net_addr *a, struct proto *p, const struct filter *filter)
   rte_update_lock();
 
   /* Rest is stripped down export_filter() */
-  int v = p->preexport ? p->preexport(p, &rt, rte_update_pool) : 0;
+  int v = p->preexport ? p->preexport(c, &rt, rte_update_pool) : 0;
   if (v == RIC_PROCESS)
   {
     rte_make_tmp_attrs(&rt, rte_update_pool, NULL);
index 71452a6f539fe410925aa67696d8516f5b932391..0d0304f9bfb1e0f00b6b6084deccd322893b3fee 100644 (file)
@@ -2230,12 +2230,12 @@ babel_kick_timer(struct babel_proto *p)
 
 
 static int
-babel_preexport(struct proto *P, struct rte **new, struct linpool *pool UNUSED)
+babel_preexport(struct channel *C, struct rte **new, struct linpool *pool UNUSED)
 {
   struct rta *a = (*new)->attrs;
 
   /* Reject our own unreachable routes */
-  if ((a->dest == RTD_UNREACHABLE) && (a->src->proto == P))
+  if ((a->dest == RTD_UNREACHABLE) && (a->src->proto == C->proto))
     return -1;
 
   return 0;
index a97871735aac8e616454b1e717a1481401f4853c..9dd9fb1ace60386891d051d4ca7e11a7f11fc18a 100644 (file)
@@ -1669,11 +1669,11 @@ bgp_free_prefix(struct bgp_channel *c, struct bgp_prefix *px)
  */
 
 int
-bgp_preexport(struct proto *P, rte **new, struct linpool *pool UNUSED)
+bgp_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED)
 {
   rte *e = *new;
   struct proto *SRC = e->attrs->src->proto;
-  struct bgp_proto *p = (struct bgp_proto *) P;
+  struct bgp_proto *p = (struct bgp_proto *) C->proto;
   struct bgp_proto *src = (SRC->proto == &proto_bgp) ? (struct bgp_proto *) SRC : NULL;
 
   /* Reject our routes */
index 4969c0b9c0d508ca281ac5e23f95a69079e66cb2..7cd1c27da2aa22e9fd406b290d68168219eba376 100644 (file)
@@ -589,7 +589,7 @@ int bgp_rte_mergable(rte *pri, rte *sec);
 int bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best);
 struct rte *bgp_rte_modify_stale(struct rte *r, struct linpool *pool);
 void bgp_rt_notify(struct proto *P, struct channel *C, net *n, rte *new, rte *old);
-int bgp_preexport(struct proto *, struct rte **, struct linpool *);
+int bgp_preexport(struct channel *, struct rte **, struct linpool *);
 int bgp_get_attr(const struct eattr *e, byte *buf, int buflen);
 void bgp_get_route_info(struct rte *, byte *buf);
 int bgp_total_aigp_metric_(rte *e, u64 *metric, const struct adata **ad);
index ba8c2e2bc12f53c82670619a589ef075066ee686..42ffdb06397424ed8683081eaf015c98a18fdc33 100644 (file)
 #include <stdlib.h>
 #include "ospf.h"
 
-static int ospf_preexport(struct proto *P, rte **new, struct linpool *pool);
+static int ospf_preexport(struct channel *C, rte **new, struct linpool *pool);
 static void ospf_make_tmp_attrs(struct rte *rt, struct linpool *pool);
 static void ospf_store_tmp_attrs(struct rte *rt, struct linpool *pool);
 static void ospf_reload_routes(struct channel *C);
@@ -484,14 +484,14 @@ ospf_disp(timer * timer)
  * import to the filters.
  */
 static int
-ospf_preexport(struct proto *P, rte **new, struct linpool *pool UNUSED)
+ospf_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED)
 {
-  struct ospf_proto *p = (struct ospf_proto *) P;
+  struct ospf_proto *p = (struct ospf_proto *) C->proto;
   struct ospf_area *oa = ospf_main_area(p);
   rte *e = *new;
 
   /* Reject our own routes */
-  if (e->attrs->src->proto == P)
+  if (e->attrs->src->proto == &p->p)
     return -1;
 
   /* Do not export routes to stub areas */
index f991d09ab3f753ab9924a320a9325b899c996cb3..481f5804ec7922f8b73fa1440304ea3abd98b5bb 100644 (file)
@@ -101,11 +101,11 @@ pipe_rt_notify(struct proto *P, struct channel *src_ch, net *n, rte *new, rte *o
 }
 
 static int
-pipe_preexport(struct proto *P, rte **ee, struct linpool *p UNUSED)
+pipe_preexport(struct channel *C, rte **ee, struct linpool *p UNUSED)
 {
   struct proto *pp = (*ee)->sender->proto;
 
-  if (pp == P)
+  if (pp == C->proto)
     return -1; /* Avoid local loops automatically */
 
   return 0;
index 66e8eb4bbde24af361dc909ea9f5627baebfe140..fe3713ef4164ce74cee598c017193f18142c4f9c 100644 (file)
@@ -391,10 +391,10 @@ radv_net_match_trigger(struct radv_config *cf, net *n)
 }
 
 int
-radv_preexport(struct proto *P, rte **new, struct linpool *pool UNUSED)
+radv_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED)
 {
   // struct radv_proto *p = (struct radv_proto *) P;
-  struct radv_config *cf = (struct radv_config *) (P->cf);
+  struct radv_config *cf = (struct radv_config *) (C->proto->cf);
 
   if (radv_net_match_trigger(cf, (*new)->net))
     return RIC_PROCESS;
@@ -555,7 +555,7 @@ radv_check_active(struct radv_proto *p)
     return 1;
 
   struct channel *c = p->p.main_channel;
-  return rt_examine(c->table, &cf->trigger, &p->p, c->out_filter);
+  return rt_examine(c->table, &cf->trigger, c, c->out_filter);
 }
 
 static void
index 7c2614b101047c96bb7645a928e749e62942d2fd..a02cf9779a6bec11b29fb813d773ffe3e3601356 100644 (file)
@@ -903,12 +903,12 @@ krt_store_tmp_attrs(struct rte *rt, struct linpool *pool)
 }
 
 static int
-krt_preexport(struct proto *P, rte **new, struct linpool *pool UNUSED)
+krt_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED)
 {
   // struct krt_proto *p = (struct krt_proto *) P;
   rte *e = *new;
 
-  if (e->attrs->src->proto == P)
+  if (e->attrs->src->proto == C->proto)
     return -1;
 
   if (!krt_capable(e))