From 711d617dc106a8af34c6c8f3500f337a792f1f3d Mon Sep 17 00:00:00 2001 From: "Ondrej Zajicek (work)" Date: Thu, 30 Mar 2017 14:00:08 +0200 Subject: [PATCH] BGP: Add support for SAFI 129 (VPN multicast) Which, in contrast to SAFI 128, does not use MPLS labels. --- proto/bgp/bgp.h | 3 +++ proto/bgp/config.Y | 22 ++++++++++++---------- proto/bgp/packets.c | 30 ++++++++++++++++++++++++++---- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h index bdf32f26..61d3600d 100644 --- a/proto/bgp/bgp.h +++ b/proto/bgp/bgp.h @@ -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 ) diff --git a/proto/bgp/config.Y b/proto/bgp/config.Y index e2dc4053..63e82285 100644 --- a/proto/bgp/config.Y +++ b/proto/bgp/config.Y @@ -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 diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c index c6098e2b..0e974746 100644 --- a/proto/bgp/packets.c +++ b/proto/bgp/packets.c @@ -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,