From: Carmine Scarpitta Date: Sat, 10 Jun 2023 13:51:30 +0000 (+0200) Subject: isisd: Update router cap TLV size computation X-Git-Tag: base_9.1~88^2~136 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=ff1d6169bf9f16858037239af0a761b198d089c7;p=matthieu%2Ffrr.git isisd: Update router cap TLV size computation Update the `isis_router_cap_tlv_size` function to take into account the SRv6 Capabilities Sub-TLV and SRv6-related MSDs when calculating the size needed to pack the Router Capabilities TLV. Signed-off-by: Carmine Scarpitta --- diff --git a/isisd/isis_tlvs.c b/isisd/isis_tlvs.c index dd4a72d2c4..69c73ef081 100644 --- a/isisd/isis_tlvs.c +++ b/isisd/isis_tlvs.c @@ -4193,7 +4193,7 @@ static size_t isis_router_cap_tlv_size(const struct isis_router_cap *router_cap) #ifndef FABRICD size_t fad_sz; #endif /* ifndef FABRICD */ - int nb_algo; + int nb_algo, nb_msd; if ((router_cap->srgb.range_size != 0) && (router_cap->srgb.lower_bound != 0)) { @@ -4227,6 +4227,28 @@ static size_t isis_router_cap_tlv_size(const struct isis_router_cap *router_cap) } #endif /* ifndef FABRICD */ + if (router_cap->srv6_cap.is_srv6_capable) { + sz += ISIS_SUBTLV_TYPE_FIELD_SIZE + + ISIS_SUBTLV_LENGTH_FIELD_SIZE + + ISIS_SUBTLV_SRV6_CAPABILITIES_SIZE; + + nb_algo = isis_tlvs_sr_algo_count(router_cap); + if (nb_algo != 0) + sz += ISIS_SUBTLV_TYPE_FIELD_SIZE + + ISIS_SUBTLV_LENGTH_FIELD_SIZE + nb_algo; + + nb_msd = router_cap->srv6_msd.max_seg_left_msd + + router_cap->srv6_msd.max_end_pop_msd + + router_cap->srv6_msd.max_h_encaps_msd + + router_cap->srv6_msd.max_end_d_msd; + if (nb_msd != 0) + sz += ISIS_SUBTLV_TYPE_FIELD_SIZE + + ISIS_SUBTLV_LENGTH_FIELD_SIZE + + (ISIS_SUBTLV_NODE_MSD_TYPE_SIZE + + ISIS_SUBTLV_NODE_MSD_VALUE_SIZE) * + nb_msd; + } + return sz; } diff --git a/isisd/isis_tlvs.h b/isisd/isis_tlvs.h index 6ded0c3411..f24c88b165 100644 --- a/isisd/isis_tlvs.h +++ b/isisd/isis_tlvs.h @@ -461,6 +461,10 @@ enum isis_tlv_type { /* subTLVs size for TE and SR */ enum ext_subtlv_size { + /* Sub-TLV Type and Length fields */ + ISIS_SUBTLV_TYPE_FIELD_SIZE = 1, + ISIS_SUBTLV_LENGTH_FIELD_SIZE = 1, + /* RFC 5307 */ ISIS_SUBTLV_LLRI_SIZE = 8, @@ -471,6 +475,8 @@ enum ext_subtlv_size { /* RFC 8491 */ ISIS_SUBTLV_NODE_MSD_SIZE = 2, + ISIS_SUBTLV_NODE_MSD_TYPE_SIZE = 1, + ISIS_SUBTLV_NODE_MSD_VALUE_SIZE = 1, /* RFC 8667 sections #2 & #3 */ ISIS_SUBTLV_SID_LABEL_SIZE = 3,