diff options
| author | Igor Ryzhov <iryzhov@nfware.com> | 2024-04-02 00:56:17 +0300 | 
|---|---|---|
| committer | Mergify <37929162+mergify[bot]@users.noreply.github.com> | 2024-05-13 08:13:45 +0000 | 
| commit | 4e71db8ac2f0316b1046215b71301e460ec8686b (patch) | |
| tree | c34920d9935aa359c65d2b49d9c7953aa3836b44 | |
| parent | 35d0c9a44b590cfe80b9562f33b8fe49afe52122 (diff) | |
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 <iryzhov@nfware.com>
(cherry picked from commit c3d34b84f3e1b789b78b6ee93068f074eb884af1)
| -rw-r--r-- | isisd/isis_tlvs.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/isisd/isis_tlvs.c b/isisd/isis_tlvs.c index 2b0a58b739..93ae8c6cb2 100644 --- a/isisd/isis_tlvs.c +++ b/isisd/isis_tlvs.c @@ -8016,7 +8016,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]; @@ -8026,6 +8025,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);  		} @@ -8044,7 +8047,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]; @@ -8054,6 +8056,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);  		}  | 
