]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Add support for SAFI 129 (VPN multicast)
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Thu, 30 Mar 2017 12:00:08 +0000 (14:00 +0200)
committerJan Moskyto Matejka <mq@ucw.cz>
Wed, 12 Apr 2017 14:04:22 +0000 (16:04 +0200)
Which, in contrast to SAFI 128, does not use MPLS labels.

proto/bgp/bgp.h
proto/bgp/config.Y
proto/bgp/packets.c

index bdf32f26f945da948838b14924c6bfe0bc17fc06..61d3600d9695747a1db0cf041b39ec8cd3aaf20e 100644 (file)
@@ -33,6 +33,7 @@ struct eattr;
 #define BGP_SAFI_MULTICAST     2
 #define BGP_SAFI_MPLS          4
 #define BGP_SAFI_MPLS_VPN      128
+#define BGP_SAFI_VPN_MULTICAST 129
 #define BGP_SAFI_FLOW          133
 
 /* Internal AF codes */
@@ -49,6 +50,8 @@ struct eattr;
 #define BGP_AF_IPV6_MPLS       BGP_AF( BGP_AFI_IPV6, BGP_SAFI_MPLS )
 #define BGP_AF_VPN4_MPLS       BGP_AF( BGP_AFI_IPV4, BGP_SAFI_MPLS_VPN )
 #define BGP_AF_VPN6_MPLS       BGP_AF( BGP_AFI_IPV6, BGP_SAFI_MPLS_VPN )
+#define BGP_AF_VPN4_MC         BGP_AF( BGP_AFI_IPV4, BGP_SAFI_VPN_MULTICAST )
+#define BGP_AF_VPN6_MC         BGP_AF( BGP_AFI_IPV6, BGP_SAFI_VPN_MULTICAST )
 #define BGP_AF_FLOW4           BGP_AF( BGP_AFI_IPV4, BGP_SAFI_FLOW )
 #define BGP_AF_FLOW6           BGP_AF( BGP_AFI_IPV6, BGP_SAFI_FLOW )
 
index e2dc40531237cb983fcbd242714dfc75ca25d37a..63e82285f842d6e96751762d7806a2d1a1522eef 100644 (file)
@@ -135,16 +135,18 @@ bgp_proto:
  ;
 
 bgp_afi:
-   IPV4 { $$ = BGP_AF_IPV4; }
- | IPV6 { $$ = BGP_AF_IPV6; }
- | IPV4 MULTICAST { $$ = BGP_AF_IPV4_MC; }
- | IPV6 MULTICAST { $$ = BGP_AF_IPV6_MC; }
- | IPV4 MPLS { $$ = BGP_AF_IPV4_MPLS; }
- | IPV6 MPLS { $$ = BGP_AF_IPV6_MPLS; }
- | VPN4 MPLS { $$ = BGP_AF_VPN4_MPLS; }
- | VPN6 MPLS { $$ = BGP_AF_VPN6_MPLS; }
- | FLOW4 { $$ = BGP_AF_FLOW4; }
- | FLOW6 { $$ = BGP_AF_FLOW6; }
+   IPV4                        { $$ = BGP_AF_IPV4; }
+ | IPV6                        { $$ = BGP_AF_IPV6; }
+ | IPV4 MULTICAST      { $$ = BGP_AF_IPV4_MC; }
+ | IPV6 MULTICAST      { $$ = BGP_AF_IPV6_MC; }
+ | IPV4 MPLS           { $$ = BGP_AF_IPV4_MPLS; }
+ | IPV6 MPLS           { $$ = BGP_AF_IPV6_MPLS; }
+ | VPN4 MPLS           { $$ = BGP_AF_VPN4_MPLS; }
+ | VPN6 MPLS           { $$ = BGP_AF_VPN6_MPLS; }
+ | VPN4 MULTICAST      { $$ = BGP_AF_VPN4_MC; }
+ | VPN6 MULTICAST      { $$ = BGP_AF_VPN6_MC; }
+ | FLOW4               { $$ = BGP_AF_FLOW4; }
+ | FLOW6               { $$ = BGP_AF_FLOW6; }
  ;
 
 bgp_channel_start: bgp_afi
index c6098e2b20849fc81c8145886cb1e3e7997e0acf..0e9747462aaa45b766fa1da219c937d2df78d378 100644 (file)
@@ -289,8 +289,8 @@ bgp_write_capabilities(struct bgp_conn *conn, byte *buf)
   /* Create capability list in buffer */
 
   /*
-   * Note that max length is ~ 20+14*af_count. With max 10 channels that is
-   * 160. Option limit is 253 and buffer size is 4096, so we cannot overflow
+   * Note that max length is ~ 20+14*af_count. With max 12 channels that is
+   * 188. Option limit is 253 and buffer size is 4096, so we cannot overflow
    * unless we add new capabilities or more AFs.
    */
 
@@ -1386,7 +1386,8 @@ bgp_encode_nlri_vpn4(struct bgp_write_state *s, struct bgp_bucket *buck, byte *b
     ADVANCE(pos, size, 1);
 
     /* Encode MPLS labels */
-    bgp_encode_mpls_labels(s, s->mpls_labels, &pos, &size, pos - 1);
+    if (s->mpls)
+      bgp_encode_mpls_labels(s, s->mpls_labels, &pos, &size, pos - 1);
 
     /* Encode route distinguisher */
     put_u64(pos, net->rd);
@@ -1430,7 +1431,8 @@ bgp_decode_nlri_vpn4(struct bgp_parse_state *s, byte *pos, uint len, rta *a)
       bgp_parse_error(s, 1);
 
     /* Decode MPLS labels */
-    bgp_decode_mpls_labels(s, &pos, &len, &l, a);
+    if (s->mpls)
+      bgp_decode_mpls_labels(s, &pos, &len, &l, a);
 
     /* Decode route distinguisher */
     if (l < 64)
@@ -1824,6 +1826,26 @@ static const struct bgp_af_desc bgp_af_table[] = {
     .decode_next_hop = bgp_decode_next_hop_vpn,
     .update_next_hop = bgp_update_next_hop_ip,
   },
+  {
+    .afi = BGP_AF_VPN4_MC,
+    .net = NET_VPN4,
+    .name = "vpn4-mc",
+    .encode_nlri = bgp_encode_nlri_vpn4,
+    .decode_nlri = bgp_decode_nlri_vpn4,
+    .encode_next_hop = bgp_encode_next_hop_vpn,
+    .decode_next_hop = bgp_decode_next_hop_vpn,
+    .update_next_hop = bgp_update_next_hop_ip,
+  },
+  {
+    .afi = BGP_AF_VPN6_MC,
+    .net = NET_VPN6,
+    .name = "vpn6-mc",
+    .encode_nlri = bgp_encode_nlri_vpn6,
+    .decode_nlri = bgp_decode_nlri_vpn6,
+    .encode_next_hop = bgp_encode_next_hop_vpn,
+    .decode_next_hop = bgp_decode_next_hop_vpn,
+    .update_next_hop = bgp_update_next_hop_ip,
+  },
   {
     .afi = BGP_AF_FLOW4,
     .net = NET_FLOW4,