diff options
| author | Jafar Al-Gharaibeh <jafar@atcorp.com> | 2024-07-25 16:59:40 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-25 16:59:40 -0400 | 
| commit | abb2891870746d133108cbe854448abd1e414745 (patch) | |
| tree | 32b31a023b567442e6d3cb4564bee1847d3754ea | |
| parent | 4a582da39d0d1d12ba0b36489c43ce27c2b22666 (diff) | |
| parent | d32c3aea86a1790152693cb51af61b8189f71e56 (diff) | |
Merge pull request #16380 from FRRouting/mergify/bp/stable/10.0/pr-16350
zebra: Fix to avoid two Vrfs with same table ids (backport #16350)
| -rw-r--r-- | zebra/interface.c | 36 | 
1 files changed, 20 insertions, 16 deletions
diff --git a/zebra/interface.c b/zebra/interface.c index 41624d4dba..9eb1503551 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -1523,23 +1523,27 @@ static void interface_vrf_change(enum dplane_op_e op, ifindex_t ifindex,  				"DPLANE_OP_INTF_UPDATE for VRF %s(%u) table %u",  				name, ifindex, tableid); -		if (!vrf_lookup_by_id((vrf_id_t)ifindex)) { -			vrf_id_t exist_id; - -			exist_id = zebra_vrf_lookup_by_table(tableid, ns_id); -			if (exist_id != VRF_DEFAULT) { -				vrf = vrf_lookup_by_id(exist_id); - -				if (vrf) -					flog_err(EC_ZEBRA_VRF_MISCONFIGURED, -						 "VRF %s id %u table id overlaps existing vrf %s(%d), misconfiguration exiting", -						 name, ifindex, vrf->name, -						 vrf->vrf_id); -				else -					flog_err(EC_ZEBRA_VRF_NOT_FOUND, -						 "VRF %s id %u does not exist", -						 name, ifindex); +		/* +		 * For a given tableid, if there already exists a vrf and it +		 * is different from the current vrf to be operated, then there +		 * is a misconfiguration and zebra will exit. +		 */ +		vrf_id_t exist_id = zebra_vrf_lookup_by_table(tableid, ns_id); + +		if (exist_id != VRF_DEFAULT) { +			vrf = vrf_lookup_by_id(exist_id); + +			if (!vrf_lookup_by_id((vrf_id_t)ifindex) && !vrf) { +				flog_err(EC_ZEBRA_VRF_NOT_FOUND, +					 "VRF %s id %u does not exist", name, +					 ifindex); +				exit(-1); +			} +			if (vrf && strcmp(name, vrf->name)) { +				flog_err(EC_ZEBRA_VRF_MISCONFIGURED, +					 "VRF %s id %u table id overlaps existing vrf %s(%d), misconfiguration exiting", +					 name, ifindex, vrf->name, vrf->vrf_id);  				exit(-1);  			}  		}  | 
