]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP Flowspec validation: Removed in-route optimization for multithreading compatibility
authorMaria Matejka <mq@ucw.cz>
Fri, 11 Feb 2022 21:29:13 +0000 (22:29 +0100)
committerMaria Matejka <mq@ucw.cz>
Wed, 9 Mar 2022 10:27:34 +0000 (11:27 +0100)
nest/route.h
nest/rt-table.c
proto/bgp/bgp.h
proto/bgp/packets.c
proto/pipe/pipe.c

index 9fd3bdcc5a798bf56b5940d7fbe147a13ae555da..d0237a377a3752cb911bd0fce54b1ce774674cc1 100644 (file)
@@ -267,7 +267,6 @@ typedef struct rte {
     struct {
       u8 suppressed;                   /* Used for deterministic MED comparison */
       s8 stale;                                /* Route is LLGR_STALE, -1 if unknown */
-      struct rtable *base_table;       /* Base table for Flowspec validation */
     } bgp;
 #endif
   } u;
index a5a8c42106a64c59ce1be3694add147289473f4c..e81adf9142370febbb72049de3a44e9c294aef02 100644 (file)
@@ -2831,12 +2831,16 @@ static rte *
 rt_flowspec_update_rte(rtable *tab, rte *r)
 {
 #ifdef CONFIG_BGP
-  if ((r->attrs->source != RTS_BGP) || !r->u.bgp.base_table)
+  if (r->attrs->source != RTS_BGP)
+    return NULL;
+
+  struct bgp_channel *bc = (struct bgp_channel *) r->sender;
+  if (!bc->base_table)
     return NULL;
 
   const net_addr *n = r->net->n.addr;
   struct bgp_proto *p = (void *) r->src->proto;
-  int valid = rt_flowspec_check(r->u.bgp.base_table, tab, n, r->attrs, p->is_interior);
+  int valid = rt_flowspec_check(bc->base_table, tab, n, r->attrs, p->is_interior);
   int dest = valid ? RTD_NONE : RTD_UNREACHABLE;
 
   if (dest == r->attrs->dest)
index 26e049663c94c3c7939e0643811aea382984a5fe..88e3bf3493d6c904012272cb90efc337c9b84ba7 100644 (file)
@@ -453,7 +453,6 @@ struct bgp_parse_state {
   jmp_buf err_jmpbuf;
 
   struct hostentry *hostentry;
-  struct rtable *base_table;
   adata *mpls_labels;
 
   /* Cached state for bgp_rte_update() */
index 1ab8c7936eebfd687d4ae2d68f7e0b085869af60..aeeb3c7af72d57e92758c92a58aa54c4afefb926 100644 (file)
@@ -1025,9 +1025,6 @@ bgp_apply_flow_validation(struct bgp_parse_state *s, const net_addr *n, rta *a)
   int valid = rt_flowspec_check(c->base_table, c->c.table, n, a, s->proto->is_interior);
   a->dest = valid ? RTD_NONE : RTD_UNREACHABLE;
 
-  /* Set rte.bgp.base_table later from this state variable */
-  s->base_table = c->base_table;
-
   /* Invalidate cached rta if dest changes */
   if (s->cached_rta && (s->cached_rta->dest != a->dest))
   {
@@ -1398,7 +1395,6 @@ bgp_rte_update(struct bgp_parse_state *s, const net_addr *n, u32 path_id, rta *a
   e->pflags = 0;
   e->u.bgp.suppressed = 0;
   e->u.bgp.stale = -1;
-  e->u.bgp.base_table = s->base_table;
   rte_update3(&s->channel->c, n, e, s->last_src);
 }
 
@@ -2462,8 +2458,6 @@ bgp_decode_nlri(struct bgp_parse_state *s, u32 afi, byte *nlri, uint len, ea_lis
   s->last_id = 0;
   s->last_src = s->proto->p.main_source;
 
-  s->base_table = NULL;
-
   /*
    * IPv4 BGP and MP-BGP may be used together in one update, therefore we do not
    * add BA_NEXT_HOP in bgp_decode_attrs(), but we add it here independently for
index 636c3e58c36a13aaabd794bfcb1e9f4f7bbb13d2..de86b62b6c044d1d2fb7e16b904703faf0030a58 100644 (file)
@@ -82,10 +82,7 @@ pipe_rt_notify(struct proto *P, struct channel *src_ch, net *n, rte *new, rte *o
 #ifdef CONFIG_BGP
       /* Hack to cleanup cached value */
       if (e->src->proto->proto == &proto_bgp)
-      {
        e->u.bgp.stale = -1;
-       e->u.bgp.base_table = NULL;
-      }
 #endif
     }
   else