From 9299fd00e7f75353d517627951b9b41b3b7bd339 Mon Sep 17 00:00:00 2001 From: Ryoga Saito Date: Tue, 31 Aug 2021 06:13:17 +0000 Subject: [PATCH] bgpd: introduce SID structure information 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 --- bgpd/bgp_attr.c | 42 +++++++++++++++++++++++++++++++++++++----- bgpd/bgp_attr.h | 14 ++++++++++++++ bgpd/bgp_mplsvpn.c | 14 ++++++++++++++ 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 1ee92198dd..3c457394e3 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -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 */ diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index 7eb1c8cf0e..955fde1450 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -79,6 +79,14 @@ /* 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. */ diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index 24f28ba733..a174cf97a3 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -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)); -- 2.39.5