summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJafar Al-Gharaibeh <jafar@atcorp.com>2024-07-25 16:59:40 -0400
committerGitHub <noreply@github.com>2024-07-25 16:59:40 -0400
commitabb2891870746d133108cbe854448abd1e414745 (patch)
tree32b31a023b567442e6d3cb4564bee1847d3754ea
parent4a582da39d0d1d12ba0b36489c43ce27c2b22666 (diff)
parentd32c3aea86a1790152693cb51af61b8189f71e56 (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.c36
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);
}
}