]> git.puffer.fish Git - matthieu/frr.git/commitdiff
isisd: fix ip/ipv6 reachability tlvs
authorIgor Ryzhov <iryzhov@nfware.com>
Mon, 1 Apr 2024 21:56:17 +0000 (00:56 +0300)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Mon, 13 May 2024 08:12:22 +0000 (08:12 +0000)
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 <iryzhov@nfware.com>
(cherry picked from commit c3d34b84f3e1b789b78b6ee93068f074eb884af1)

isisd/isis_tlvs.c

index ecf43faa7060ac36d15b5c906c38ef1935ef7fcf..aaa88a058ca41bcdf77f94d47f7d14321082ebb3 100644 (file)
@@ -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);
                }