]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Make routing loops silent
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Fri, 28 Jan 2022 17:13:18 +0000 (18:13 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Fri, 28 Jan 2022 17:13:18 +0000 (18:13 +0100)
One of previous commits added error logging of invalid routes. This
also inadvertently caused error logging of route loops, which should
be ignored silently. Fix that.

proto/bgp/attrs.c
proto/bgp/packets.c

index 968d7d2b596965efba858d363c9d60dd451f519f..15713b634ed5531afc92786aa189c6c214bd8c81 100644 (file)
@@ -1397,19 +1397,19 @@ bgp_decode_attrs(struct bgp_parse_state *s, byte *data, uint len)
 
   /* Reject routes with our ASN in AS_PATH attribute */
   if (bgp_as_path_loopy(p, attrs, p->local_as))
-    goto withdraw;
+    goto loop;
 
   /* Reject routes with our Confederation ID in AS_PATH attribute; RFC 5065 4.0 */
   if ((p->public_as != p->local_as) && bgp_as_path_loopy(p, attrs, p->public_as))
-    goto withdraw;
+    goto loop;
 
   /* Reject routes with our Router ID in ORIGINATOR_ID attribute; RFC 4456 8 */
   if (p->is_internal && bgp_originator_id_loopy(p, attrs))
-    goto withdraw;
+    goto loop;
 
   /* Reject routes with our Cluster ID in CLUSTER_LIST attribute; RFC 4456 8 */
   if (p->rr_client && bgp_cluster_list_loopy(p, attrs))
-    goto withdraw;
+    goto loop;
 
   /* If there is no local preference, define one */
   if (!BIT32_TEST(s->attrs_seen, BA_LOCAL_PREF))
@@ -1430,6 +1430,10 @@ withdraw:
 
   s->err_withdraw = 1;
   return NULL;
+
+loop:
+  /* Loops are handled as withdraws, but ignored silently. Do not set err_withdraw. */
+  return NULL;
 }
 
 void
index 9d21fd34f2d04cd0385b06ebb40c3d983c227ce1..21052186801ad5cebc0725e9ebe9236316f12567 100644 (file)
@@ -1422,7 +1422,7 @@ bgp_decode_mpls_labels(struct bgp_parse_state *s, byte **pos, uint *len, uint *p
 
     /* RFC 8277 2.4 - withdraw does not have variable-size MPLS stack but
        fixed-size 24-bit Compatibility field, which MUST be ignored */
-    if (!a && !s->err_withdraw)
+    if (!s->reach_nlri_step)
       return;
   }
   while (!(label & BGP_MPLS_BOS));