]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: insert SID structure Sub-Sub-TLV
authorRyoga Saito <contact@proelbtn.com>
Tue, 31 Aug 2021 07:00:14 +0000 (07:00 +0000)
committerRyoga Saito <contact@proelbtn.com>
Fri, 3 Sep 2021 01:19:49 +0000 (01:19 +0000)
This patch enables frr to advertise SRv6 SID information with SID
structure Sub-Sub-TLV.

Signed-off-by: Ryoga Saito <contact@proelbtn.com>
bgpd/bgp_attr.c
bgpd/bgp_attr.h

index 3c457394e31e76776df23b871f330b8437fcc237..57de8a11eecfd4616d7aa3211066c3dacc72d048 100644 (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 (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);
index 955fde14507ad1cc96d2bbadd5002eb8a8904514..eb77d0a6bf7a715ce19c687308ba5ad090b86ef9 100644 (file)
@@ -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