summaryrefslogtreecommitdiffstats
path: root/eigrpd/eigrp_interface.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2019-10-24 21:09:18 +0200
committerDonald Sharp <sharpd@cumulusnetworks.com>2019-12-04 20:23:20 +0100
commit85d25587bfd551e4ce39501dd54a07c4325bb7ae (patch)
treeafd6960e0cff1b508b26795547ca28aeb814e268 /eigrpd/eigrp_interface.c
parentospfd: interface name and ip address can be 32 bytes (diff)
downloadfrr-85d25587bfd551e4ce39501dd54a07c4325bb7ae.tar.xz
frr-85d25587bfd551e4ce39501dd54a07c4325bb7ae.zip
eigrpd, ospfd, pimd: Fix assumption that interface may not be up
Commit: ddbf3e60604019d4b38d51226700e2244cc531b6 This commit modified the interface up handling code in ZAPI such that the zclient handled the decoding for you. Prior to this commit ospf assumed that it could use the old ifp pointer to know state before reading the stream. This lead to a situation where ospf would `smartly` track and do the right thing in this situation. This commit changed this assumption and in certain scenarios, say a interface was changed after it was already up would lead to situations where ospf would not properly handle the new interface up. Modify ospf to track data that is important to it in it's interface->info pointer. This code pattern was followed in both eigrp and pim. In eigrp's case it was just behaving weirdly in any event so fixing this pattern is not a big deal. In pim's case it was not properly using this so it's a no-op to fix. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'eigrpd/eigrp_interface.c')
-rw-r--r--eigrpd/eigrp_interface.c60
1 files changed, 29 insertions, 31 deletions
diff --git a/eigrpd/eigrp_interface.c b/eigrpd/eigrp_interface.c
index 6294c0dd0..ece0b4b0c 100644
--- a/eigrpd/eigrp_interface.c
+++ b/eigrpd/eigrp_interface.c
@@ -99,6 +99,9 @@ struct eigrp_interface *eigrp_if_new(struct eigrp *eigrp, struct interface *ifp,
ei->params.auth_type = EIGRP_AUTH_TYPE_NONE;
ei->params.auth_keychain = NULL;
+ ei->curr_bandwidth = ifp->bandwidth;
+ ei->curr_mtu = ifp->mtu;
+
return ei;
}
@@ -139,45 +142,40 @@ static int eigrp_ifp_create(struct interface *ifp)
static int eigrp_ifp_up(struct interface *ifp)
{
- /* Interface is already up. */
- if (if_is_operative(ifp)) {
- /* Temporarily keep ifp values. */
- struct interface if_tmp;
- memcpy(&if_tmp, ifp, sizeof(struct interface));
+ struct eigrp_interface *ei = ifp->info;
- if (IS_DEBUG_EIGRP(zebra, ZEBRA_INTERFACE))
- zlog_debug("Zebra: Interface[%s] state update.",
- ifp->name);
+ if (IS_DEBUG_EIGRP(zebra, ZEBRA_INTERFACE))
+ zlog_debug("Zebra: Interface[%s] state change to up.",
+ ifp->name);
- if (if_tmp.bandwidth != ifp->bandwidth) {
- if (IS_DEBUG_EIGRP(zebra, ZEBRA_INTERFACE))
- zlog_debug(
- "Zebra: Interface[%s] bandwidth change %d -> %d.",
- ifp->name, if_tmp.bandwidth,
- ifp->bandwidth);
+ if (!ei)
+ return 0;
- // eigrp_if_recalculate_output_cost (ifp);
- }
+ if (ei->curr_bandwidth != ifp->bandwidth) {
+ if (IS_DEBUG_EIGRP(zebra, ZEBRA_INTERFACE))
+ zlog_debug(
+ "Zebra: Interface[%s] bandwidth change %d -> %d.",
+ ifp->name, ei->curr_bandwidth,
+ ifp->bandwidth);
- if (if_tmp.mtu != ifp->mtu) {
- if (IS_DEBUG_EIGRP(zebra, ZEBRA_INTERFACE))
- zlog_debug(
- "Zebra: Interface[%s] MTU change %u -> %u.",
- ifp->name, if_tmp.mtu, ifp->mtu);
+ ei->curr_bandwidth = ifp->bandwidth;
+ // eigrp_if_recalculate_output_cost (ifp);
+ }
- /* Must reset the interface (simulate down/up) when MTU
- * changes. */
- eigrp_if_reset(ifp);
- }
+ if (ei->curr_mtu != ifp->mtu) {
+ if (IS_DEBUG_EIGRP(zebra, ZEBRA_INTERFACE))
+ zlog_debug(
+ "Zebra: Interface[%s] MTU change %u -> %u.",
+ ifp->name, ei->curr_mtu, ifp->mtu);
+
+ ei->curr_mtu = ifp->mtu;
+ /* Must reset the interface (simulate down/up) when MTU
+ * changes. */
+ eigrp_if_reset(ifp);
return 0;
}
- if (IS_DEBUG_EIGRP(zebra, ZEBRA_INTERFACE))
- zlog_debug("Zebra: Interface[%s] state change to up.",
- ifp->name);
-
- if (ifp->info)
- eigrp_if_up(ifp->info);
+ eigrp_if_up(ifp->info);
return 0;
}