]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: fix prefix sid sub-tlv header is missing
authorRyoga Saito <contact@proelbtn.com>
Tue, 17 Aug 2021 10:13:04 +0000 (10:13 +0000)
committerRyoga Saito <contact@proelbtn.com>
Wed, 18 Aug 2021 09:03:36 +0000 (09:03 +0000)
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 <contact@proelbtn.com>
bgpd/bgp_attr.c
bgpd/bgp_attr.h

index fb97fea72d72fedc5a9be25e72d424a70209687e..c4d159afd09181dd4963e16909d365425b729790 100644 (file)
@@ -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 */
index a583581030845e74b6e17aebb5da763536de886e..d76b2d500513501f7341c0e714668df8ed6f4017 100644 (file)
 #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 : \