From: Ryoga Saito Date: Tue, 31 Aug 2021 07:00:14 +0000 (+0000) Subject: bgpd: insert SID structure Sub-Sub-TLV X-Git-Tag: base_8.1~39^2~3 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=a1a51008513f1599e141af81aeedaf4e6821c555;p=matthieu%2Ffrr.git bgpd: insert SID structure Sub-Sub-TLV This patch enables frr to advertise SRv6 SID information with SID structure Sub-Sub-TLV. Signed-off-by: Ryoga Saito --- diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 3c457394e3..57de8a11ee 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -4267,26 +4267,38 @@ bgp_size_t bgp_packet_attribute(struct bgp *bgp, struct peer *peer, 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; + BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE_LENGTH + + BGP_ATTR_MIN_LEN + + BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO_LENGTH; + uint8_t tlv_len = subtlv_len + BGP_ATTR_MIN_LEN + 1; + uint8_t attr_len = tlv_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, tlv_len); + stream_putc(s, attr_len); stream_putc(s, BGP_PREFIX_SID_SRV6_L3_SERVICE); - stream_putw(s, subtlv_len); + stream_putw(s, tlv_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_putw(s, subtlv_len); stream_putc(s, 0); /* reserved */ stream_put(s, &attr->srv6_l3vpn->sid, sizeof(attr->srv6_l3vpn->sid)); /* sid */ stream_putc(s, 0); /* sid_flags */ stream_putw(s, 0xffff); /* endpoint */ stream_putc(s, 0); /* reserved */ + stream_putc( + s, + BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE); + stream_putw( + s, + BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE_LENGTH); + stream_putc(s, attr->srv6_l3vpn->loc_block_len); + stream_putc(s, attr->srv6_l3vpn->loc_node_len); + stream_putc(s, attr->srv6_l3vpn->func_len); + stream_putc(s, attr->srv6_l3vpn->arg_len); + stream_putc(s, attr->srv6_l3vpn->transposition_len); + stream_putc(s, attr->srv6_l3vpn->transposition_offset); } else if (attr->srv6_vpn) { stream_putc(s, BGP_ATTR_FLAG_OPTIONAL | BGP_ATTR_FLAG_TRANS); diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index 955fde1450..eb77d0a6bf 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -78,6 +78,7 @@ /* SRv6 Service Data Sub-Sub-TLV types */ #define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE 1 +#define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE_LENGTH 6 /* SRv6 SID Structure default values */ #define BGP_PREFIX_SID_SRV6_LOCATOR_BLOCK_LENGTH 40