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 <contact@proelbtn.com>
This commit is contained in:
Ryoga Saito 2021-08-31 07:00:14 +00:00
parent cc8f05dfdc
commit a1a5100851
2 changed files with 21 additions and 8 deletions

View File

@ -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 ((afi == AFI_IP || afi == AFI_IP6) && safi == SAFI_MPLS_VPN) {
if (attr->srv6_l3vpn) { if (attr->srv6_l3vpn) {
uint8_t subtlv_len = uint8_t subtlv_len =
BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO_LENGTH BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE_LENGTH
+ BGP_ATTR_MIN_LEN + 1; // reserved + BGP_ATTR_MIN_LEN
uint8_t tlv_len = subtlv_len + 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 stream_putc(s, BGP_ATTR_FLAG_OPTIONAL
| BGP_ATTR_FLAG_TRANS); | BGP_ATTR_FLAG_TRANS);
stream_putc(s, BGP_ATTR_PREFIX_SID); 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_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, 0); /* reserved */
stream_putc(s, BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO); stream_putc(s, BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO);
stream_putw( stream_putw(s, subtlv_len);
s,
BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO_LENGTH);
stream_putc(s, 0); /* reserved */ stream_putc(s, 0); /* reserved */
stream_put(s, &attr->srv6_l3vpn->sid, stream_put(s, &attr->srv6_l3vpn->sid,
sizeof(attr->srv6_l3vpn->sid)); /* sid */ sizeof(attr->srv6_l3vpn->sid)); /* sid */
stream_putc(s, 0); /* sid_flags */ stream_putc(s, 0); /* sid_flags */
stream_putw(s, 0xffff); /* endpoint */ stream_putw(s, 0xffff); /* endpoint */
stream_putc(s, 0); /* reserved */ 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) { } else if (attr->srv6_vpn) {
stream_putc(s, BGP_ATTR_FLAG_OPTIONAL stream_putc(s, BGP_ATTR_FLAG_OPTIONAL
| BGP_ATTR_FLAG_TRANS); | BGP_ATTR_FLAG_TRANS);

View File

@ -78,6 +78,7 @@
/* SRv6 Service Data Sub-Sub-TLV types */ /* 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 1
#define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE_LENGTH 6
/* SRv6 SID Structure default values */ /* SRv6 SID Structure default values */
#define BGP_PREFIX_SID_SRV6_LOCATOR_BLOCK_LENGTH 40 #define BGP_PREFIX_SID_SRV6_LOCATOR_BLOCK_LENGTH 40