]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Fix parsing of MPLS withdrawals
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Sat, 30 Jun 2018 22:43:24 +0000 (00:43 +0200)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Sat, 30 Jun 2018 22:43:24 +0000 (00:43 +0200)
RFC 3107 was bit vague with regard to labeled withdrawals, RFC 8277
clarified that. The old code was incompatible with some implementations,
namely with Juniper.

Thanks to Vadim Fedorenko for the original patch.

proto/bgp/packets.c

index 190fd6fe92944ddd6a9b8f12ab84e489a6be738b..d67ef0b23d366e30507bfbb811078ada069bcf5b 100644 (file)
@@ -1165,9 +1165,10 @@ bgp_decode_mpls_labels(struct bgp_parse_state *s, byte **pos, uint *len, uint *p
     ADVANCE(*pos, *len, 3);
     *pxlen -= 24;
 
-    /* Withdraw: Magic label stack value 0x800000 according to RFC 3107, section 3, last paragraph */
-    if (!a && !s->err_withdraw && (lnum == 1) && (label == BGP_MPLS_MAGIC))
-      break;
+    /* 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)
+      return;
   }
   while (!(label & BGP_MPLS_BOS));