From b6e5b5ff5c282ffed6ad68fd93fbbbe19eb472d7 Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Tue, 2 Apr 2024 00:56:17 +0300 Subject: [PATCH] isisd: fix ip/ipv6 reachability tlvs Don't allocate subtlvs container if there's nothing to add to it. If the container is allocated, the "sub-TLVs presence" bit is set in the TLVs even if there's no actual sub-TLVs, what violates the RFC. Fixes #14514. Signed-off-by: Igor Ryzhov (cherry picked from commit c3d34b84f3e1b789b78b6ee93068f074eb884af1) --- isisd/isis_tlvs.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/isisd/isis_tlvs.c b/isisd/isis_tlvs.c index ecf43faa70..aaa88a058c 100644 --- a/isisd/isis_tlvs.c +++ b/isisd/isis_tlvs.c @@ -8011,7 +8011,6 @@ void isis_tlvs_add_extended_ip_reach(struct isis_tlvs *tlvs, apply_mask_ipv4(&r->prefix); if (pcfgs) { - r->subtlvs = isis_alloc_subtlvs(ISIS_CONTEXT_SUBTLV_IP_REACH); for (int i = 0; i < SR_ALGORITHM_COUNT; i++) { struct isis_prefix_sid *psid; struct sr_prefix_cfg *pcfg = pcfgs[i]; @@ -8021,6 +8020,10 @@ void isis_tlvs_add_extended_ip_reach(struct isis_tlvs *tlvs, psid = XCALLOC(MTYPE_ISIS_SUBTLV, sizeof(*psid)); isis_sr_prefix_cfg2subtlv(pcfg, external, psid); + + if (!r->subtlvs) + r->subtlvs = isis_alloc_subtlvs( + ISIS_CONTEXT_SUBTLV_IP_REACH); append_item(&r->subtlvs->prefix_sids, (struct isis_item *)psid); } @@ -8039,7 +8042,6 @@ void isis_tlvs_add_ipv6_reach(struct isis_tlvs *tlvs, uint16_t mtid, memcpy(&r->prefix, dest, sizeof(*dest)); apply_mask_ipv6(&r->prefix); if (pcfgs) { - r->subtlvs = isis_alloc_subtlvs(ISIS_CONTEXT_SUBTLV_IP_REACH); for (int i = 0; i < SR_ALGORITHM_COUNT; i++) { struct isis_prefix_sid *psid; struct sr_prefix_cfg *pcfg = pcfgs[i]; @@ -8049,6 +8051,10 @@ void isis_tlvs_add_ipv6_reach(struct isis_tlvs *tlvs, uint16_t mtid, psid = XCALLOC(MTYPE_ISIS_SUBTLV, sizeof(*psid)); isis_sr_prefix_cfg2subtlv(pcfg, external, psid); + + if (!r->subtlvs) + r->subtlvs = isis_alloc_subtlvs( + ISIS_CONTEXT_SUBTLV_IPV6_REACH); append_item(&r->subtlvs->prefix_sids, (struct isis_item *)psid); } -- 2.39.5