summaryrefslogtreecommitdiffstats
path: root/ospfd/ospf_interface.c
diff options
context:
space:
mode:
authorChirag Shah <chirag@nvidia.com>2023-05-26 22:43:50 +0200
committerChirag Shah <chirag@nvidia.com>2023-06-01 19:39:21 +0200
commit0d005b2d5c294d9d0a8db9d8beca83b97e0fd8ff (patch)
treefff1907e2793d169639933dc3a9241df68e9edf2 /ospfd/ospf_interface.c
parentMerge pull request #13652 from opensourcerouting/fix/drop_old_releases_from_t... (diff)
downloadfrr-0d005b2d5c294d9d0a8db9d8beca83b97e0fd8ff.tar.xz
frr-0d005b2d5c294d9d0a8db9d8beca83b97e0fd8ff.zip
ospfd: fix interface param type update
interface link update event needs to be handle properly in ospf interface cache. Example: When vrf (interface) is created its default type would be set to BROADCAST because ifp->status is not set to VRF. Subsequent link event sets ifp->status to vrf, ospf interface update need to compare current type to new default type which would be VRF (OSPF_IFTYPE_LOOPBACK). Since ospf type param was created in first add event, ifp vrf link event didn't update ospf type param which leads to treat vrf as non loopback interface. Ticket:#3459451 Testing Done: Running config suppose to bypass rendering default network broadcast for loopback/vrf types. Before fix: vrf vrf1 vni 4001 exit-vrf ! interface vrf1 ip ospf network broadcast exit After fix: (interface vrf1 is not displayed). vrf vrf1 vni 4001 exit-vrf Signed-off-by: Chirag Shah <chirag@nvidia.com>
Diffstat (limited to 'ospfd/ospf_interface.c')
-rw-r--r--ospfd/ospf_interface.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c
index 2c66cb3cf..9e6acdbf0 100644
--- a/ospfd/ospf_interface.c
+++ b/ospfd/ospf_interface.c
@@ -1346,18 +1346,28 @@ static int ospf_ifp_create(struct interface *ifp)
if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
zlog_debug(
- "Zebra: interface add %s vrf %s[%u] index %d flags %llx metric %d mtu %d speed %u",
+ "Zebra: interface add %s vrf %s[%u] index %d flags %llx metric %d mtu %d speed %u status 0x%x",
ifp->name, ifp->vrf->name, ifp->vrf->vrf_id,
ifp->ifindex, (unsigned long long)ifp->flags,
- ifp->metric, ifp->mtu, ifp->speed);
+ ifp->metric, ifp->mtu, ifp->speed, ifp->status);
assert(ifp->info);
oii = ifp->info;
oii->curr_mtu = ifp->mtu;
- if (IF_DEF_PARAMS(ifp)
- && !OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp), type)) {
+ /* Change ospf type param based on following
+ * condition:
+ * ospf type params is not set (first creation),
+ * OR ospf param type is changed based on
+ * link event, currently only handle for
+ * loopback interface type, for other ospf interface,
+ * type can be set from user config which needs to be
+ * preserved.
+ */
+ if (IF_DEF_PARAMS(ifp) &&
+ (!OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS(ifp), type) ||
+ if_is_loopback(ifp))) {
SET_IF_PARAM(IF_DEF_PARAMS(ifp), type);
IF_DEF_PARAMS(ifp)->type = ospf_default_iftype(ifp);
}