mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 15:33:56 +00:00
bgpd: more SAFI fixes
(with resolved conflict in bgpd/bgp_packet.c) Two macros resolving to the same integer constant broke a case block and a more thorough merge of BGP_SAFI_VPNV4 and BGP_SAFI_VPNV6 was performed. * bgpd.h: MPLS-labeled VPN SAFI is AFI-independent, switch to single * macro * bgp_capability_test.c: update test data * bgp_mp_attr_test.c: idem * bgp_route.c: (bgp_maximum_prefix_overflow, bgp_table_stats_vty) update macro and check conditions (where appropriate) * bgp_packet.c: (bgp_route_refresh_send, bgp_capability_send, bgp_update_receive, bgp_route_refresh_receive): idem * bgp_open.c: (bgp_capability_vty_out, bgp_afi_safi_valid_indices, bgp_open_capability_orf, bgp_open_capability): idem * bgp_attr.c: (bgp_mp_reach_parse, bgp_packet_attribute, bgp_packet_withdraw): idem
This commit is contained in:
parent
beb1ca03bf
commit
42e6d745d1
@ -1520,7 +1520,7 @@ bgp_mp_reach_parse (struct peer *peer, bgp_size_t length, struct attr *attr,
|
|||||||
return BGP_ATTR_PARSE_ERROR;
|
return BGP_ATTR_PARSE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (safi != BGP_SAFI_VPNV4)
|
if (safi != SAFI_MPLS_LABELED_VPN)
|
||||||
{
|
{
|
||||||
ret = bgp_nlri_sanity_check (peer, afi, stream_pnt (s), nlri_len);
|
ret = bgp_nlri_sanity_check (peer, afi, stream_pnt (s), nlri_len);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -1564,7 +1564,7 @@ bgp_mp_unreach_parse (struct peer *peer, bgp_size_t length,
|
|||||||
|
|
||||||
withdraw_len = length - BGP_MP_UNREACH_MIN_SIZE;
|
withdraw_len = length - BGP_MP_UNREACH_MIN_SIZE;
|
||||||
|
|
||||||
if (safi != BGP_SAFI_VPNV4)
|
if (safi != SAFI_MPLS_LABELED_VPN)
|
||||||
{
|
{
|
||||||
ret = bgp_nlri_sanity_check (peer, afi, stream_pnt (s), withdraw_len);
|
ret = bgp_nlri_sanity_check (peer, afi, stream_pnt (s), withdraw_len);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -2269,7 +2269,7 @@ bgp_packet_attribute (struct bgp *bgp, struct peer *peer,
|
|||||||
sizep = stream_get_endp (s);
|
sizep = stream_get_endp (s);
|
||||||
stream_putc (s, 0); /* Length of this attribute. */
|
stream_putc (s, 0); /* Length of this attribute. */
|
||||||
stream_putw (s, AFI_IP); /* AFI */
|
stream_putw (s, AFI_IP); /* AFI */
|
||||||
stream_putc (s, BGP_SAFI_VPNV4); /* SAFI */
|
stream_putc (s, SAFI_MPLS_LABELED_VPN); /* SAFI */
|
||||||
|
|
||||||
stream_putc (s, 12);
|
stream_putc (s, 12);
|
||||||
stream_putl (s, 0);
|
stream_putl (s, 0);
|
||||||
@ -2432,7 +2432,7 @@ bgp_packet_withdraw (struct peer *peer, struct stream *s, struct prefix *p,
|
|||||||
if (safi == SAFI_MPLS_VPN)
|
if (safi == SAFI_MPLS_VPN)
|
||||||
{
|
{
|
||||||
/* SAFI */
|
/* SAFI */
|
||||||
stream_putc (s, BGP_SAFI_VPNV4);
|
stream_putc (s, SAFI_MPLS_LABELED_VPN);
|
||||||
|
|
||||||
/* prefix. */
|
/* prefix. */
|
||||||
stream_putc (s, p->prefixlen + 88);
|
stream_putc (s, p->prefixlen + 88);
|
||||||
|
@ -96,8 +96,8 @@ bgp_capability_vty_out (struct vty *vty, struct peer *peer)
|
|||||||
case SAFI_UNICAST_MULTICAST:
|
case SAFI_UNICAST_MULTICAST:
|
||||||
vty_out (vty, "SAFI Unicast Multicast");
|
vty_out (vty, "SAFI Unicast Multicast");
|
||||||
break;
|
break;
|
||||||
case BGP_SAFI_VPNV4:
|
case SAFI_MPLS_LABELED_VPN:
|
||||||
vty_out (vty, "SAFI MPLS-VPN");
|
vty_out (vty, "SAFI MPLS-labeled VPN");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
vty_out (vty, "SAFI Unknown %d ", mpc.safi);
|
vty_out (vty, "SAFI Unknown %d ", mpc.safi);
|
||||||
@ -127,14 +127,6 @@ bgp_capability_mp_data (struct stream *s, struct capability_mp_data *mpc)
|
|||||||
int
|
int
|
||||||
bgp_afi_safi_valid_indices (afi_t afi, safi_t *safi)
|
bgp_afi_safi_valid_indices (afi_t afi, safi_t *safi)
|
||||||
{
|
{
|
||||||
/* VPNvX are AFI specific */
|
|
||||||
if ((afi == AFI_IP6 && *safi == BGP_SAFI_VPNV4)
|
|
||||||
|| (afi == AFI_IP && *safi == BGP_SAFI_VPNV6))
|
|
||||||
{
|
|
||||||
zlog_warn ("Invalid afi/safi combination (%u/%u)", afi, *safi);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (afi)
|
switch (afi)
|
||||||
{
|
{
|
||||||
case AFI_IP:
|
case AFI_IP:
|
||||||
@ -143,9 +135,8 @@ bgp_afi_safi_valid_indices (afi_t afi, safi_t *safi)
|
|||||||
#endif
|
#endif
|
||||||
switch (*safi)
|
switch (*safi)
|
||||||
{
|
{
|
||||||
/* BGP VPNvX SAFI isn't contigious with others, remap */
|
/* BGP MPLS-labeled VPN SAFI isn't contigious with others, remap */
|
||||||
case BGP_SAFI_VPNV4:
|
case SAFI_MPLS_LABELED_VPN:
|
||||||
case BGP_SAFI_VPNV6:
|
|
||||||
*safi = SAFI_MPLS_VPN;
|
*safi = SAFI_MPLS_VPN;
|
||||||
case SAFI_UNICAST:
|
case SAFI_UNICAST:
|
||||||
case SAFI_MULTICAST:
|
case SAFI_MULTICAST:
|
||||||
@ -859,7 +850,7 @@ bgp_open_capability_orf (struct stream *s, struct peer *peer,
|
|||||||
int number_of_orfs = 0;
|
int number_of_orfs = 0;
|
||||||
|
|
||||||
if (safi == SAFI_MPLS_VPN)
|
if (safi == SAFI_MPLS_VPN)
|
||||||
safi = BGP_SAFI_VPNV4;
|
safi = SAFI_MPLS_LABELED_VPN;
|
||||||
|
|
||||||
stream_putc (s, BGP_OPEN_OPT_CAP);
|
stream_putc (s, BGP_OPEN_OPT_CAP);
|
||||||
capp = stream_get_endp (s); /* Set Capability Len Pointer */
|
capp = stream_get_endp (s); /* Set Capability Len Pointer */
|
||||||
@ -967,7 +958,7 @@ bgp_open_capability (struct stream *s, struct peer *peer)
|
|||||||
stream_putc (s, CAPABILITY_CODE_MP_LEN);
|
stream_putc (s, CAPABILITY_CODE_MP_LEN);
|
||||||
stream_putw (s, AFI_IP);
|
stream_putw (s, AFI_IP);
|
||||||
stream_putc (s, 0);
|
stream_putc (s, 0);
|
||||||
stream_putc (s, BGP_SAFI_VPNV4);
|
stream_putc (s, SAFI_MPLS_LABELED_VPN);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
/* IPv6 unicast. */
|
/* IPv6 unicast. */
|
||||||
|
@ -946,7 +946,7 @@ bgp_route_refresh_send (struct peer *peer, afi_t afi, safi_t safi,
|
|||||||
|
|
||||||
/* Adjust safi code. */
|
/* Adjust safi code. */
|
||||||
if (safi == SAFI_MPLS_VPN)
|
if (safi == SAFI_MPLS_VPN)
|
||||||
safi = BGP_SAFI_VPNV4;
|
safi = SAFI_MPLS_LABELED_VPN;
|
||||||
|
|
||||||
s = stream_new (BGP_MAX_PACKET_SIZE);
|
s = stream_new (BGP_MAX_PACKET_SIZE);
|
||||||
|
|
||||||
@ -1036,7 +1036,7 @@ bgp_capability_send (struct peer *peer, afi_t afi, safi_t safi,
|
|||||||
|
|
||||||
/* Adjust safi code. */
|
/* Adjust safi code. */
|
||||||
if (safi == SAFI_MPLS_VPN)
|
if (safi == SAFI_MPLS_VPN)
|
||||||
safi = BGP_SAFI_VPNV4;
|
safi = SAFI_MPLS_LABELED_VPN;
|
||||||
|
|
||||||
s = stream_new (BGP_MAX_PACKET_SIZE);
|
s = stream_new (BGP_MAX_PACKET_SIZE);
|
||||||
|
|
||||||
@ -1799,17 +1799,17 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
|
|||||||
{
|
{
|
||||||
if (mp_update.length
|
if (mp_update.length
|
||||||
&& mp_update.afi == AFI_IP
|
&& mp_update.afi == AFI_IP
|
||||||
&& mp_update.safi == BGP_SAFI_VPNV4)
|
&& mp_update.safi == SAFI_MPLS_LABELED_VPN)
|
||||||
bgp_nlri_parse_vpnv4 (peer, NLRI_ATTR_ARG, &mp_update);
|
bgp_nlri_parse_vpnv4 (peer, NLRI_ATTR_ARG, &mp_update);
|
||||||
|
|
||||||
if (mp_withdraw.length
|
if (mp_withdraw.length
|
||||||
&& mp_withdraw.afi == AFI_IP
|
&& mp_withdraw.afi == AFI_IP
|
||||||
&& mp_withdraw.safi == BGP_SAFI_VPNV4)
|
&& mp_withdraw.safi == SAFI_MPLS_LABELED_VPN)
|
||||||
bgp_nlri_parse_vpnv4 (peer, NULL, &mp_withdraw);
|
bgp_nlri_parse_vpnv4 (peer, NULL, &mp_withdraw);
|
||||||
|
|
||||||
if (! withdraw_len
|
if (! withdraw_len
|
||||||
&& mp_withdraw.afi == AFI_IP
|
&& mp_withdraw.afi == AFI_IP
|
||||||
&& mp_withdraw.safi == BGP_SAFI_VPNV4
|
&& mp_withdraw.safi == SAFI_MPLS_LABELED_VPN
|
||||||
&& mp_withdraw.length == 0)
|
&& mp_withdraw.length == 0)
|
||||||
{
|
{
|
||||||
/* End-of-RIB received */
|
/* End-of-RIB received */
|
||||||
@ -1969,7 +1969,7 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
|
|||||||
/* Check AFI and SAFI. */
|
/* Check AFI and SAFI. */
|
||||||
if ((afi != AFI_IP && afi != AFI_IP6)
|
if ((afi != AFI_IP && afi != AFI_IP6)
|
||||||
|| (safi != SAFI_UNICAST && safi != SAFI_MULTICAST
|
|| (safi != SAFI_UNICAST && safi != SAFI_MULTICAST
|
||||||
&& safi != BGP_SAFI_VPNV4))
|
&& safi != SAFI_MPLS_LABELED_VPN))
|
||||||
{
|
{
|
||||||
if (BGP_DEBUG (normal, NORMAL))
|
if (BGP_DEBUG (normal, NORMAL))
|
||||||
{
|
{
|
||||||
@ -1980,7 +1980,7 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Adjust safi code. */
|
/* Adjust safi code. */
|
||||||
if (safi == BGP_SAFI_VPNV4)
|
if (safi == SAFI_MPLS_LABELED_VPN)
|
||||||
safi = SAFI_MPLS_VPN;
|
safi = SAFI_MPLS_VPN;
|
||||||
|
|
||||||
if (size != BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE)
|
if (size != BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE)
|
||||||
|
@ -1659,7 +1659,7 @@ bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi,
|
|||||||
u_int8_t ndata[7];
|
u_int8_t ndata[7];
|
||||||
|
|
||||||
if (safi == SAFI_MPLS_VPN)
|
if (safi == SAFI_MPLS_VPN)
|
||||||
safi = BGP_SAFI_VPNV4;
|
safi = SAFI_MPLS_LABELED_VPN;
|
||||||
|
|
||||||
ndata[0] = (afi >> 8);
|
ndata[0] = (afi >> 8);
|
||||||
ndata[1] = afi;
|
ndata[1] = afi;
|
||||||
@ -9379,10 +9379,8 @@ bgp_table_stats_vty (struct vty *vty, const char *name,
|
|||||||
safi = SAFI_MULTICAST;
|
safi = SAFI_MULTICAST;
|
||||||
else if (strncmp (safi_str, "u", 1) == 0)
|
else if (strncmp (safi_str, "u", 1) == 0)
|
||||||
safi = SAFI_UNICAST;
|
safi = SAFI_UNICAST;
|
||||||
else if (strncmp (safi_str, "vpnv4", 5) == 0)
|
else if (strncmp (safi_str, "vpnv4", 5) == 0 || strncmp (safi_str, "vpnv6", 5) == 0)
|
||||||
safi = BGP_SAFI_VPNV4;
|
safi = SAFI_MPLS_LABELED_VPN;
|
||||||
else if (strncmp (safi_str, "vpnv6", 5) == 0)
|
|
||||||
safi = BGP_SAFI_VPNV6;
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
vty_out (vty, "%% Invalid subsequent address family %s%s",
|
vty_out (vty, "%% Invalid subsequent address family %s%s",
|
||||||
@ -9397,13 +9395,6 @@ bgp_table_stats_vty (struct vty *vty, const char *name,
|
|||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((afi == AFI_IP && safi == BGP_SAFI_VPNV6)
|
|
||||||
|| (afi == AFI_IP6 && safi == BGP_SAFI_VPNV4))
|
|
||||||
{
|
|
||||||
vty_out (vty, "%% Invalid subsequent address family %s for %s%s",
|
|
||||||
afi_str, safi_str, VTY_NEWLINE);
|
|
||||||
return CMD_WARNING;
|
|
||||||
}
|
|
||||||
return bgp_table_stats (vty, bgp, afi, safi);
|
return bgp_table_stats (vty, bgp, afi, safi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -727,9 +727,8 @@ struct bgp_nlri
|
|||||||
#define BGP_DEFAULT_RESTART_TIME 120
|
#define BGP_DEFAULT_RESTART_TIME 120
|
||||||
#define BGP_DEFAULT_STALEPATH_TIME 360
|
#define BGP_DEFAULT_STALEPATH_TIME 360
|
||||||
|
|
||||||
/* SAFI which used in open capability negotiation. */
|
/* RFC4364 */
|
||||||
#define BGP_SAFI_VPNV4 128
|
#define SAFI_MPLS_LABELED_VPN 128
|
||||||
#define BGP_SAFI_VPNV6 128
|
|
||||||
|
|
||||||
/* Max TTL value. */
|
/* Max TTL value. */
|
||||||
#define TTL_MAX 255
|
#define TTL_MAX 255
|
||||||
|
@ -96,10 +96,10 @@ static struct test_segment mp_segments[] =
|
|||||||
},
|
},
|
||||||
/* 6 */
|
/* 6 */
|
||||||
{ "MP3",
|
{ "MP3",
|
||||||
"MP IP6/VPNv4",
|
"MP IP6/MPLS-labeled VPN",
|
||||||
{ CAPABILITY_CODE_MP, 0x4, 0x0, 0x2, 0x0, 0x80 },
|
{ CAPABILITY_CODE_MP, 0x4, 0x0, 0x2, 0x0, 0x80 },
|
||||||
6, SHOULD_PARSE, 0, /* parses, but invalid afi,safi */
|
6, SHOULD_PARSE, 0,
|
||||||
1, AFI_IP6, BGP_SAFI_VPNV4, INVALID_AFI,
|
1, AFI_IP6, SAFI_MPLS_LABELED_VPN, VALID_AFI,
|
||||||
},
|
},
|
||||||
/* 7 */
|
/* 7 */
|
||||||
{ "MP5",
|
{ "MP5",
|
||||||
@ -110,21 +110,14 @@ static struct test_segment mp_segments[] =
|
|||||||
},
|
},
|
||||||
/* 8 */
|
/* 8 */
|
||||||
{ "MP6",
|
{ "MP6",
|
||||||
"MP IP4/VPNv4",
|
"MP IP4/MPLS-laveled VPN",
|
||||||
{ CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x80 },
|
{ CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x80 },
|
||||||
6, SHOULD_PARSE, 0,
|
6, SHOULD_PARSE, 0,
|
||||||
1, AFI_IP, BGP_SAFI_VPNV4, VALID_AFI,
|
1, AFI_IP, SAFI_MPLS_LABELED_VPN, VALID_AFI,
|
||||||
},
|
},
|
||||||
/* 9 */
|
|
||||||
{ "MP7",
|
|
||||||
"MP IP4/VPNv6",
|
|
||||||
{ CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x81 },
|
|
||||||
6, SHOULD_PARSE, 0, /* parses, but invalid afi,safi tuple */
|
|
||||||
1, AFI_IP, BGP_SAFI_VPNV6, INVALID_AFI,
|
|
||||||
},
|
|
||||||
/* 10 */
|
/* 10 */
|
||||||
{ "MP8",
|
{ "MP8",
|
||||||
"MP unknown AFI",
|
"MP unknown AFI/SAFI",
|
||||||
{ CAPABILITY_CODE_MP, 0x4, 0x0, 0xa, 0x0, 0x81 },
|
{ CAPABILITY_CODE_MP, 0x4, 0x0, 0xa, 0x0, 0x81 },
|
||||||
6, SHOULD_PARSE, 0,
|
6, SHOULD_PARSE, 0,
|
||||||
1, 0xa, 0x81, INVALID_AFI, /* parses, but unknown */
|
1, 0xa, 0x81, INVALID_AFI, /* parses, but unknown */
|
||||||
|
@ -286,10 +286,10 @@ static struct test_segment {
|
|||||||
SHOULD_ERR,
|
SHOULD_ERR,
|
||||||
AFI_IP, SAFI_UNICAST, VALID_AFI,
|
AFI_IP, SAFI_UNICAST, VALID_AFI,
|
||||||
},
|
},
|
||||||
{ "IPv4-vpnv4",
|
{ "IPv4-MLVPN",
|
||||||
"IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRIs",
|
"IPv4/MPLS-labeled VPN MP Reach, RD, Nexthop, 3 NLRIs",
|
||||||
{
|
{
|
||||||
/* AFI / SAFI */ 0x0, AFI_IP, BGP_SAFI_VPNV4,
|
/* AFI / SAFI */ 0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
|
||||||
/* nexthop bytes */ 12,
|
/* nexthop bytes */ 12,
|
||||||
/* RD */ 0, 0, 1, 2,
|
/* RD */ 0, 0, 1, 2,
|
||||||
0, 0xff, 3, 4,
|
0, 0xff, 3, 4,
|
||||||
@ -409,10 +409,10 @@ static struct test_segment mp_unreach_segments [] =
|
|||||||
SHOULD_ERR,
|
SHOULD_ERR,
|
||||||
AFI_IP, SAFI_UNICAST, VALID_AFI,
|
AFI_IP, SAFI_UNICAST, VALID_AFI,
|
||||||
},
|
},
|
||||||
{ "IPv4-unreach-vpnv4",
|
{ "IPv4-unreach-MLVPN",
|
||||||
"IPv4/VPNv4 MP Unreach, RD, 3 NLRIs",
|
"IPv4/MPLS-labeled VPN MP Unreach, RD, 3 NLRIs",
|
||||||
{
|
{
|
||||||
/* AFI / SAFI */ 0x0, AFI_IP, BGP_SAFI_VPNV4,
|
/* AFI / SAFI */ 0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
|
||||||
/* nexthop bytes */ 12,
|
/* nexthop bytes */ 12,
|
||||||
/* RD */ 0, 0, 1, 2,
|
/* RD */ 0, 0, 1, 2,
|
||||||
0, 0xff, 3, 4,
|
0, 0xff, 3, 4,
|
||||||
|
Loading…
Reference in New Issue
Block a user