summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--eigrpd/eigrp_interface.c60
-rw-r--r--eigrpd/eigrp_structs.h2
-rw-r--r--ospfd/ospf_interface.c32
-rw-r--r--ospfd/ospf_interface.h2
-rw-r--r--pimd/pim_iface.c37
5 files changed, 67 insertions, 66 deletions
diff --git a/eigrpd/eigrp_interface.c b/eigrpd/eigrp_interface.c
index 6294c0dd0f..ece0b4b0c4 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;
}
diff --git a/eigrpd/eigrp_structs.h b/eigrpd/eigrp_structs.h
index e50858f071..82bddaaae3 100644
--- a/eigrpd/eigrp_structs.h
+++ b/eigrpd/eigrp_structs.h
@@ -176,6 +176,8 @@ struct eigrp_interface {
/* To which multicast groups do we currently belong? */
+ uint32_t curr_bandwidth;
+ uint32_t curr_mtu;
uint8_t multicast_memberships;
diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c
index 7ddffbcdbd..cfcffcdb3d 100644
--- a/ospfd/ospf_interface.c
+++ b/ospfd/ospf_interface.c
@@ -636,9 +636,13 @@ void ospf_if_update_params(struct interface *ifp, struct in_addr addr)
int ospf_if_new_hook(struct interface *ifp)
{
int rc = 0;
+ struct ospf_if_info *oii;
ifp->info = XCALLOC(MTYPE_OSPF_IF_INFO, sizeof(struct ospf_if_info));
+ oii = ifp->info;
+ oii->curr_mtu = ifp->mtu;
+
IF_OIFS(ifp) = route_table_init();
IF_OIFS_PARAMS(ifp) = route_table_init();
@@ -1261,31 +1265,21 @@ static int ospf_ifp_up(struct interface *ifp)
{
struct ospf_interface *oi;
struct route_node *rn;
+ struct ospf_if_info *oii = ifp->info;
- /* Interface is already up. */
- if (if_is_operative(ifp)) {
- /* Temporarily keep ifp values. */
- struct interface if_tmp;
- memcpy(&if_tmp, ifp, sizeof(struct interface));
+ ospf_if_recalculate_output_cost(ifp);
+ if (oii && oii->curr_mtu != ifp->mtu) {
if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
zlog_debug(
- "Zebra: Interface[%s] state update speed %u -> %u, bw %d -> %d",
- ifp->name, if_tmp.speed, ifp->speed,
- if_tmp.bandwidth, ifp->bandwidth);
+ "Zebra: Interface[%s] MTU change %u -> %u.",
+ ifp->name, oii->curr_mtu, ifp->mtu);
- ospf_if_recalculate_output_cost(ifp);
+ oii->curr_mtu = ifp->mtu;
+ /* Must reset the interface (simulate down/up) when MTU
+ * changes. */
+ ospf_if_reset(ifp);
- if (if_tmp.mtu != ifp->mtu) {
- if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
- zlog_debug(
- "Zebra: Interface[%s] MTU change %u -> %u.",
- ifp->name, if_tmp.mtu, ifp->mtu);
-
- /* Must reset the interface (simulate down/up) when MTU
- * changes. */
- ospf_if_reset(ifp);
- }
return 0;
}
diff --git a/ospfd/ospf_interface.h b/ospfd/ospf_interface.h
index cde52dbb9e..4b3dbcc5c2 100644
--- a/ospfd/ospf_interface.h
+++ b/ospfd/ospf_interface.h
@@ -117,6 +117,8 @@ struct ospf_if_info {
struct route_table *oifs;
unsigned int
membership_counts[MEMBER_MAX]; /* multicast group refcnts */
+
+ uint32_t curr_mtu;
};
struct ospf_interface;
diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c
index 3ee9caebcf..c615540149 100644
--- a/pimd/pim_iface.c
+++ b/pimd/pim_iface.c
@@ -1481,6 +1481,13 @@ void pim_if_create_pimreg(struct pim_instance *pim)
pim_if_new(pim->regiface, false, false, true,
false /*vxlan_term*/);
+ /*
+ * On vrf moves we delete the interface if there
+ * is nothing going on with it. We cannot have
+ * the pimregiface deleted.
+ */
+ pim->regiface->configured = true;
+
}
}
@@ -1581,6 +1588,7 @@ int pim_ifp_create(struct interface *ifp)
int pim_ifp_up(struct interface *ifp)
{
+ struct pim_interface *pim_ifp;
struct pim_instance *pim;
uint32_t table_id;
@@ -1593,24 +1601,21 @@ int pim_ifp_up(struct interface *ifp)
}
pim = pim_get_pim_instance(ifp->vrf_id);
- if (if_is_operative(ifp)) {
- struct pim_interface *pim_ifp;
- pim_ifp = ifp->info;
- /*
- * If we have a pim_ifp already and this is an if_add
- * that means that we probably have a vrf move event
- * If that is the case, set the proper vrfness.
- */
- if (pim_ifp)
- pim_ifp->pim = pim;
+ pim_ifp = ifp->info;
+ /*
+ * If we have a pim_ifp already and this is an if_add
+ * that means that we probably have a vrf move event
+ * If that is the case, set the proper vrfness.
+ */
+ if (pim_ifp)
+ pim_ifp->pim = pim;
- /*
- pim_if_addr_add_all() suffices for bringing up both IGMP and
- PIM
- */
- pim_if_addr_add_all(ifp);
- }
+ /*
+ pim_if_addr_add_all() suffices for bringing up both IGMP and
+ PIM
+ */
+ pim_if_addr_add_all(ifp);
/*
* If we have a pimreg device callback and it's for a specific