Commit 711d617d authored by Ondrej Zajicek (work)'s avatar Ondrej Zajicek (work) Committed by Jan Moskyto Matejka
Browse files

BGP: Add support for SAFI 129 (VPN multicast)

Which, in contrast to SAFI 128, does not use MPLS labels.
parent ffb38dfb
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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 )

+12 −10
Original line number Diff line number Diff line
@@ -143,6 +143,8 @@ bgp_afi:
 | 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; }
 ;
+26 −4
Original line number Diff line number Diff line
@@ -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,6 +1386,7 @@ bgp_encode_nlri_vpn4(struct bgp_write_state *s, struct bgp_bucket *buck, byte *b
    ADVANCE(pos, size, 1);

    /* Encode MPLS labels */
    if (s->mpls)
      bgp_encode_mpls_labels(s, s->mpls_labels, &pos, &size, pos - 1);

    /* Encode route distinguisher */
@@ -1430,6 +1431,7 @@ bgp_decode_nlri_vpn4(struct bgp_parse_state *s, byte *pos, uint len, rta *a)
      bgp_parse_error(s, 1);

    /* Decode MPLS labels */
    if (s->mpls)
      bgp_decode_mpls_labels(s, &pos, &len, &l, a);

    /* Decode route distinguisher */
@@ -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,