]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Merge commit 'beb5f78a' into backport
authorMaria Matejka <mq@ucw.cz>
Mon, 11 Jul 2022 08:41:17 +0000 (10:41 +0200)
committerMaria Matejka <mq@ucw.cz>
Mon, 11 Jul 2022 08:41:17 +0000 (10:41 +0200)
1  2 
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

diff --cc nest/protocol.h
index d0810a8fcf1d4357ad071eac6788b67fb45816ed,3b3812a5162869db5df30da5cb3ce0f76168edc0..29d759ea3083beb5c04261639b070438b5ac6420
@@@ -213,7 -215,9 +213,7 @@@ struct proto 
    void (*ifa_notify)(struct proto *, unsigned flags, struct ifa *a);
    void (*rt_notify)(struct proto *, struct channel *, struct network *net, struct rte *new, struct rte *old);
    void (*neigh_notify)(struct neighbor *neigh);
-   int (*preexport)(struct proto *, struct rte *rt);
 -  void (*make_tmp_attrs)(struct rte *rt, struct linpool *pool);
 -  void (*store_tmp_attrs)(struct rte *rt, struct linpool *pool);
 -  int (*preexport)(struct channel *, struct rte **rt, struct linpool *pool);
++  int (*preexport)(struct channel *, struct rte *rt);
    void (*reload_routes)(struct channel *);
    void (*feed_begin)(struct channel *, int initial);
    void (*feed_end)(struct channel *);
diff --cc nest/route.h
index 6641a8d723273a27fe4a3501334f8d1274fb6615,1dacd92fa72e2c56d0f63048da079270ca4d53a9..a4f19fc49947fa0cac1931f931006908733ca161
@@@ -317,10 -354,10 +317,10 @@@ net *net_get(rtable *tab, const net_add
  net *net_route(rtable *tab, const net_addr *n);
  int net_roa_check(rtable *tab, const net_addr *n, u32 asn);
  rte *rte_find(net *net, struct rte_src *src);
 -rte *rte_get_temp(struct rta *);
 +rte *rte_get_temp(struct rta *, struct rte_src *src);
  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);
diff --cc nest/rt-show.c
index 198779665515b516679a4f33a27e835cccdf97f4,7639e5f7214946285d0705f78c6a125cf83aa7c2..183d023c95808c7ca704b911989697ce55ebfca1
@@@ -153,7 -154,7 +153,7 @@@ rt_show_net(struct cli *c, net *n, stru
        else if (d->export_mode)
        {
          struct proto *ep = ec->proto;
-         int ic = ep->preexport ? ep->preexport(ep, e) : 0;
 -        int ic = ep->preexport ? ep->preexport(ec, &e, c->show_pool) : 0;
++        int ic = ep->preexport ? ep->preexport(ec, e) : 0;
  
          if (ec->ra_mode == RA_OPTIMAL || ec->ra_mode == RA_MERGED)
            pass = 1;
diff --cc nest/rt-table.c
index 19bed165cc304a815ef7352af372f2b005b070d7,a2fa5e770620e3c3d5af30e521e215dad5549e28..97bbc4f0c5d3746c5fc753ed6354d2b71b0d62bf
@@@ -725,7 -870,7 +725,7 @@@ export_filter_(struct channel *c, rte *
    rt = rt0;
    *rt_free = NULL;
  
-   v = p->preexport ? p->preexport(p, rt) : 0;
 -  v = p->preexport ? p->preexport(c, &rt, pool) : 0;
++  v = p->preexport ? p->preexport(c, rt) : 0;
    if (v < 0)
      {
        if (silent)
@@@ -1694,9 -1895,12 +1695,9 @@@ rt_examine(rtable *t, net_addr *a, stru
    rte_update_lock();
  
    /* Rest is stripped down export_filter() */
-   int v = p->preexport ? p->preexport(p, rt) : 0;
 -  int v = p->preexport ? p->preexport(c, &rt, rte_update_pool) : 0;
++  int v = p->preexport ? p->preexport(c, rt) : 0;
    if (v == RIC_PROCESS)
 -  {
 -    rte_make_tmp_attrs(&rt, rte_update_pool, NULL);
      v = (f_run(filter, &rt, rte_update_pool, FF_SILENT) <= F_ACCEPT);
 -  }
  
    /* Discard temporary rte */
    if (rt != n->routes)
index d9ebfbad1d1b2db45be8241f45bbb07267f05021,0d0304f9bfb1e0f00b6b6084deccd322893b3fee..7ea1aba89431579bb06a869ff6ee417761185177
@@@ -2256,11 -2230,12 +2256,11 @@@ babel_kick_timer(struct babel_proto *p
  
  
  static int
- babel_preexport(struct proto *P, struct rte *new)
 -babel_preexport(struct channel *C, struct rte **new, struct linpool *pool UNUSED)
++babel_preexport(struct channel *C, struct rte *new)
  {
 -  struct rta *a = (*new)->attrs;
 -
 +  struct rta *a = new->attrs;
    /* Reject our own unreachable routes */
-   if ((a->dest == RTD_UNREACHABLE) && (new->src->proto == P))
 -  if ((a->dest == RTD_UNREACHABLE) && (a->src->proto == C->proto))
++  if ((a->dest == RTD_UNREACHABLE) && (new->src->proto == C->proto))
      return -1;
  
    return 0;
index d8948f298d179f085340682ab370b37ee7df3ff0,9dd9fb1ace60386891d051d4ca7e11a7f11fc18a..2f6cf640446b6f88732200ae776212136bde3d0e
@@@ -1676,10 -1669,11 +1676,10 @@@ bgp_free_prefix(struct bgp_channel *c, 
   */
  
  int
- bgp_preexport(struct proto *P, rte *e)
 -bgp_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED)
++bgp_preexport(struct channel *C, rte *e)
  {
 -  rte *e = *new;
 -  struct proto *SRC = e->attrs->src->proto;
 +  struct proto *SRC = e->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 */
diff --cc proto/bgp/bgp.h
index 8a44514cc17441c0d54c086ec9e2e7dc2509b6f7,7cd1c27da2aa22e9fd406b290d68168219eba376..13102857d47a618bb287f230a22992208afc670e
@@@ -585,9 -588,8 +585,9 @@@ int bgp_rte_better(struct rte *, struc
  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);
 +u32 bgp_rte_igp_metric(struct rte *);
  void bgp_rt_notify(struct proto *P, struct channel *C, net *n, rte *new, rte *old);
- int bgp_preexport(struct proto *, struct rte *);
 -int bgp_preexport(struct channel *, struct rte **, struct linpool *);
++int bgp_preexport(struct channel *, struct rte *);
  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 d8bcc8383b72db0667fca0e78deb4b19a69330fc,42ffdb06397424ed8683081eaf015c98a18fdc33..ad4b2d14ddcb73bce601848e6b1b40cc87a8ad56
  #include <stdlib.h>
  #include "ospf.h"
  
- static int ospf_preexport(struct proto *P, rte *new);
 -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 int ospf_preexport(struct channel *P, rte *new);
  static void ospf_reload_routes(struct channel *C);
  static int ospf_rte_better(struct rte *new, struct rte *old);
 -static int ospf_rte_same(struct rte *new, struct rte *old);
 +static u32 ospf_rte_igp_metric(struct rte *rt);
  static void ospf_disp(timer *timer);
  
  
@@@ -482,13 -484,14 +482,13 @@@ ospf_disp(timer * timer
   * import to the filters.
   */
  static int
- ospf_preexport(struct proto *P, rte *e)
 -ospf_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED)
++ospf_preexport(struct channel *C, rte *e)
  {
-   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->src->proto == P)
 -  if (e->attrs->src->proto == &p->p)
++  if (e->src->proto == &p->p)
      return -1;
  
    /* Do not export routes to stub areas */
index c34571353dc4fad426bb65d2e1477827f66310f6,481f5804ec7922f8b73fa1440304ea3abd98b5bb..1f1ad85744199fd4ca0fa535a7f239e20de85de6
@@@ -97,11 -101,11 +97,11 @@@ pipe_rt_notify(struct proto *P, struct 
  }
  
  static int
- pipe_preexport(struct proto *P, rte *e)
 -pipe_preexport(struct channel *C, rte **ee, struct linpool *p UNUSED)
++pipe_preexport(struct channel *C, rte *e)
  {
 -  struct proto *pp = (*ee)->sender->proto;
 +  struct proto *pp = e->sender->proto;
  
-   if (pp == P)
+   if (pp == C->proto)
      return -1;        /* Avoid local loops automatically */
  
    return 0;
index 7985997a32baca767014b0a51addd3633f1eb53d,fe3713ef4164ce74cee598c017193f18142c4f9c..541c398613a85599bf200370ec4c302bdd89da45
@@@ -391,12 -391,12 +391,12 @@@ radv_net_match_trigger(struct radv_conf
  }
  
  int
- radv_preexport(struct proto *P, rte *new)
 -radv_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED)
++radv_preexport(struct channel *C, rte *new)
  {
    // 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))
 +  if (radv_net_match_trigger(cf, new->net))
      return RIC_PROCESS;
  
    if (cf->propagate_routes)
index bfd69b7371122e8921bb5648b8781150986edace,a02cf9779a6bec11b29fb813d773ffe3e3601356..be547a936faa17d5b4ae651e95955d412f03b2aa
@@@ -888,11 -886,29 +888,11 @@@ krt_scan_timer_kick(struct krt_proto *p
   *    Updates
   */
  
 -static void
 -krt_make_tmp_attrs(struct rte *rt, struct linpool *pool)
 -{
 -  rte_init_tmp_attrs(rt, pool, 2);
 -  rte_make_tmp_attr(rt, EA_KRT_SOURCE, EAF_TYPE_INT, rt->u.krt.proto);
 -  rte_make_tmp_attr(rt, EA_KRT_METRIC, EAF_TYPE_INT, rt->u.krt.metric);
 -}
 -
 -static void
 -krt_store_tmp_attrs(struct rte *rt, struct linpool *pool)
 -{
 -  rte_init_tmp_attrs(rt, pool, 2);
 -  rt->u.krt.proto = rte_store_tmp_attr(rt, EA_KRT_SOURCE);
 -  rt->u.krt.metric = rte_store_tmp_attr(rt, EA_KRT_METRIC);
 -}
 -
  static int
- krt_preexport(struct proto *P, rte *e)
 -krt_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED)
++krt_preexport(struct channel *C, rte *e)
  {
    // struct krt_proto *p = (struct krt_proto *) P;
-   if (e->src->proto == P)
 -  rte *e = *new;
 -
 -  if (e->attrs->src->proto == C->proto)
++  if (e->src->proto == C->proto)
      return -1;
  
    if (!krt_capable(e))