From a3e3b5b08b066e9a6138ced0e3d06ee68d1118a6 Mon Sep 17 00:00:00 2001 From: Ryoga Saito Date: Tue, 17 Aug 2021 10:13:04 +0000 Subject: [PATCH] bgpd: fix prefix sid sub-tlv header is missing draft-ietf-bess-srv6-services-07 defines SRv6 Service Sub-TLV header, but, current bgpd implementation send path attribute without SRv6 Service Sub-TLV header. Signed-off-by: Ryoga Saito --- bgpd/bgp_attr.c | 13 +++++++++++-- bgpd/bgp_attr.h | 5 ++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index fb97fea72d..c4d159afd0 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -4114,12 +4114,21 @@ bgp_size_t bgp_packet_attribute(struct bgp *bgp, struct peer *peer, /* SRv6 Service Information Attribute. */ if ((afi == AFI_IP || afi == AFI_IP6) && safi == SAFI_MPLS_VPN) { if (attr->srv6_l3vpn) { + uint8_t subtlv_len = + BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO_LENGTH + + BGP_ATTR_MIN_LEN + 1; // reserved + uint8_t tlv_len = subtlv_len + BGP_ATTR_MIN_LEN; stream_putc(s, BGP_ATTR_FLAG_OPTIONAL | BGP_ATTR_FLAG_TRANS); stream_putc(s, BGP_ATTR_PREFIX_SID); - stream_putc(s, 24); /* tlv len */ + stream_putc(s, tlv_len); stream_putc(s, BGP_PREFIX_SID_SRV6_L3_SERVICE); - stream_putw(s, 21); /* sub-tlv len */ + stream_putw(s, subtlv_len); + stream_putc(s, 0); /* reserved */ + stream_putc(s, BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO); + stream_putw( + s, + BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO_LENGTH); stream_putc(s, 0); /* reserved */ stream_put(s, &attr->srv6_l3vpn->sid, sizeof(attr->srv6_l3vpn->sid)); /* sid */ diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index a583581030..d76b2d5005 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -71,7 +71,10 @@ #define BGP_PREFIX_SID_IPV6_LENGTH 19 #define BGP_PREFIX_SID_ORIGINATOR_SRGB_LENGTH 6 #define BGP_PREFIX_SID_VPN_SID_LENGTH 19 -#define BGP_PREFIX_SID_SRV6_L3_SERVICE_LENGTH 21 + +/* SRv6 Service Sub-TLV types */ +#define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO 1 +#define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO_LENGTH 21 #define BGP_ATTR_NH_AFI(afi, attr) \ ((afi != AFI_L2VPN) ? afi : \ -- 2.39.5