]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: introduce SID structure information
authorRyoga Saito <contact@proelbtn.com>
Tue, 31 Aug 2021 06:13:17 +0000 (06:13 +0000)
committerRyoga Saito <contact@proelbtn.com>
Fri, 3 Sep 2021 01:19:45 +0000 (01:19 +0000)
draft-ietf-bess-srv6-services-07 defines new SID structure Sub-Sub-TLV.
This patch adds SID structure information to bgp_attr_srv6_l3vpn. This
patch also defines default SID stucture used by following patches.

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

index 1ee92198ddeedb845fdec07bcd0940281ae04cd3..3c457394e31e76776df23b871f330b8437fcc237 100644 (file)
@@ -530,6 +530,12 @@ static uint32_t srv6_l3vpn_hash_key_make(const void *p)
        key = jhash(&l3vpn->sid, 16, key);
        key = jhash_1word(l3vpn->sid_flags, key);
        key = jhash_1word(l3vpn->endpoint_behavior, key);
+       key = jhash_1word(l3vpn->loc_block_len, key);
+       key = jhash_1word(l3vpn->loc_node_len, key);
+       key = jhash_1word(l3vpn->func_len, key);
+       key = jhash_1word(l3vpn->arg_len, key);
+       key = jhash_1word(l3vpn->transposition_len, key);
+       key = jhash_1word(l3vpn->transposition_offset, key);
        return key;
 }
 
@@ -540,7 +546,13 @@ static bool srv6_l3vpn_hash_cmp(const void *p1, const void *p2)
 
        return sid_same(&l3vpn1->sid, &l3vpn2->sid)
               && l3vpn1->sid_flags == l3vpn2->sid_flags
-              && l3vpn1->endpoint_behavior == l3vpn2->endpoint_behavior;
+              && l3vpn1->endpoint_behavior == l3vpn2->endpoint_behavior
+              && l3vpn1->loc_block_len == l3vpn2->loc_block_len
+              && l3vpn1->loc_node_len == l3vpn2->loc_node_len
+              && l3vpn1->func_len == l3vpn2->func_len
+              && l3vpn1->arg_len == l3vpn2->arg_len
+              && l3vpn1->transposition_len == l3vpn2->transposition_len
+              && l3vpn1->transposition_offset == l3vpn2->transposition_offset;
 }
 
 static bool srv6_l3vpn_same(const struct bgp_attr_srv6_l3vpn *h1,
@@ -2532,6 +2544,7 @@ static bgp_attr_parse_ret_t
 bgp_attr_srv6_service_data(struct bgp_attr_parser_args *args)
 {
        struct peer *const peer = args->peer;
+       struct attr *const attr = args->attr;
        uint8_t type, loc_block_len, loc_node_len, func_len, arg_len,
                transposition_len, transposition_offset;
        uint16_t length;
@@ -2574,6 +2587,13 @@ bgp_attr_srv6_service_data(struct bgp_attr_parser_args *args)
                                arg_len, transposition_len,
                                transposition_offset);
                }
+
+               attr->srv6_l3vpn->loc_block_len = loc_block_len;
+               attr->srv6_l3vpn->loc_node_len = loc_node_len;
+               attr->srv6_l3vpn->func_len = func_len;
+               attr->srv6_l3vpn->arg_len = arg_len;
+               attr->srv6_l3vpn->transposition_len = transposition_len;
+               attr->srv6_l3vpn->transposition_offset = transposition_offset;
        }
 
        else {
@@ -2600,6 +2620,7 @@ bgp_attr_srv6_service(struct bgp_attr_parser_args *args)
        uint8_t type, sid_flags;
        uint16_t length, endpoint_behavior;
        size_t headersz = sizeof(type) + sizeof(length);
+       bgp_attr_parse_ret_t err;
        char buf[BUFSIZ];
 
        if (STREAM_READABLE(peer->curr) < headersz) {
@@ -2647,14 +2668,25 @@ bgp_attr_srv6_service(struct bgp_attr_parser_args *args)
                }
                attr->srv6_l3vpn = XCALLOC(MTYPE_BGP_SRV6_L3VPN,
                                           sizeof(struct bgp_attr_srv6_l3vpn));
+               sid_copy(&attr->srv6_l3vpn->sid, &ipv6_sid);
                attr->srv6_l3vpn->sid_flags = sid_flags;
                attr->srv6_l3vpn->endpoint_behavior = endpoint_behavior;
-               sid_copy(&attr->srv6_l3vpn->sid, &ipv6_sid);
-               attr->srv6_l3vpn = srv6_l3vpn_intern(attr->srv6_l3vpn);
+               attr->srv6_l3vpn->loc_block_len = 0;
+               attr->srv6_l3vpn->loc_node_len = 0;
+               attr->srv6_l3vpn->func_len = 0;
+               attr->srv6_l3vpn->arg_len = 0;
+               attr->srv6_l3vpn->transposition_len = 0;
+               attr->srv6_l3vpn->transposition_offset = 0;
 
                // Sub-Sub-TLV found
-               if (length > BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO_LENGTH)
-                       return bgp_attr_srv6_service_data(args);
+               if (length > BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_INFO_LENGTH) {
+                       err = bgp_attr_srv6_service_data(args);
+
+                       if (err != BGP_ATTR_PARSE_PROCEED)
+                               return err;
+               }
+
+               attr->srv6_l3vpn = srv6_l3vpn_intern(attr->srv6_l3vpn);
        }
 
        /* Placeholder code for unsupported type */
index 7eb1c8cf0e03f7d611078c193d543e5e03cd6477..955fde14507ad1cc96d2bbadd5002eb8a8904514 100644 (file)
 /* SRv6 Service Data Sub-Sub-TLV types */
 #define BGP_PREFIX_SID_SRV6_L3_SERVICE_SID_STRUCTURE 1
 
+/* SRv6 SID Structure default values */
+#define BGP_PREFIX_SID_SRV6_LOCATOR_BLOCK_LENGTH 40
+#define BGP_PREFIX_SID_SRV6_LOCATOR_NODE_LENGTH 24
+#define BGP_PREFIX_SID_SRV6_FUNCTION_LENGTH 16
+#define BGP_PREFIX_SID_SRV6_ARGUMENT_LENGTH 0
+#define BGP_PREFIX_SID_SRV6_TRANSPOSITION_LENGTH 16
+#define BGP_PREFIX_SID_SRV6_TRANSPOSITION_OFFSET 64
+
 #define BGP_ATTR_NH_AFI(afi, attr) \
        ((afi != AFI_L2VPN) ? afi : \
        ((attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV4) ? AFI_IP : AFI_IP6))
@@ -142,6 +150,12 @@ struct bgp_attr_srv6_l3vpn {
        uint8_t sid_flags;
        uint16_t endpoint_behavior;
        struct in6_addr sid;
+       uint8_t loc_block_len;
+       uint8_t loc_node_len;
+       uint8_t func_len;
+       uint8_t arg_len;
+       uint8_t transposition_len;
+       uint8_t transposition_offset;
 };
 
 /* BGP core attribute structure. */
index 24f28ba73370331ebfe59782d9a07abdbfc41546..a174cf97a3e041e4498ac8322777ecdf2dc0db11 100644 (file)
@@ -1167,10 +1167,24 @@ void vpn_leak_from_vrf_update(struct bgp *bgp_vpn,          /* to */
 
        /* Set SID for SRv6 VPN */
        if (bgp_vrf->vpn_policy[afi].tovpn_sid) {
+               encode_label(bgp_vrf->vpn_policy[afi].tovpn_sid_transpose_label,
+                            &label);
                static_attr.srv6_l3vpn = XCALLOC(MTYPE_BGP_SRV6_L3VPN,
                                sizeof(struct bgp_attr_srv6_l3vpn));
                static_attr.srv6_l3vpn->sid_flags = 0x00;
                static_attr.srv6_l3vpn->endpoint_behavior = 0xffff;
+               static_attr.srv6_l3vpn->loc_block_len =
+                       BGP_PREFIX_SID_SRV6_LOCATOR_BLOCK_LENGTH;
+               static_attr.srv6_l3vpn->loc_node_len =
+                       BGP_PREFIX_SID_SRV6_LOCATOR_NODE_LENGTH;
+               static_attr.srv6_l3vpn->func_len =
+                       BGP_PREFIX_SID_SRV6_FUNCTION_LENGTH;
+               static_attr.srv6_l3vpn->arg_len =
+                       BGP_PREFIX_SID_SRV6_ARGUMENT_LENGTH;
+               static_attr.srv6_l3vpn->transposition_len =
+                       BGP_PREFIX_SID_SRV6_TRANSPOSITION_LENGTH;
+               static_attr.srv6_l3vpn->transposition_offset =
+                       BGP_PREFIX_SID_SRV6_TRANSPOSITION_OFFSET;
                memcpy(&static_attr.srv6_l3vpn->sid,
                       bgp_vrf->vpn_policy[afi].tovpn_sid,
                       sizeof(static_attr.srv6_l3vpn->sid));