ospfd: interface speed change during intf add

The problem is seen where speed mismatch caused ECMP route
not being reflected with correct number paths (NHs).

During cold boot, some interface speed updated by zebra as
part of one shot timer and triggers interface add to clients.
In this case, ospf already have created interface (bond interface),
but speed was not updated, trigger to do interface speed change
as part of interface add, which will trigger all Router LSA to
use updated speed into cost calculation.

Ticket:CM-22170
Testing Done:
Bring up CLOS config with Spine and leafs. Leaf have CLAG pair,
with same VRR ip address.
At spine one of the bond connecting to leaf node was having
higher speed than the paired device, With this fix, at spine (DUT)
bond interface speed is equal from all peer nodes.

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
This commit is contained in:
Chirag Shah 2018-08-24 15:15:36 -07:00
parent 7968503909
commit 96065dc310
2 changed files with 22 additions and 10 deletions

View File

@ -288,6 +288,7 @@ int ospf_ase_calculate_route(struct ospf *ospf, struct ospf_lsa *lsa)
struct prefix_ipv4 asbr, p; struct prefix_ipv4 asbr, p;
struct route_node *rn; struct route_node *rn;
struct ospf_route *new, * or ; struct ospf_route *new, * or ;
char buf1[INET_ADDRSTRLEN];
int ret; int ret;
assert(lsa); assert(lsa);
@ -304,10 +305,14 @@ int ospf_ase_calculate_route(struct ospf *ospf, struct ospf_lsa *lsa)
return 0; return 0;
} }
if (IS_DEBUG_OSPF(lsa, LSA)) if (IS_DEBUG_OSPF(lsa, LSA)) {
snprintf(buf1, INET_ADDRSTRLEN, "%s",
inet_ntoa(al->header.adv_router));
zlog_debug( zlog_debug(
"Route[External]: Calculate AS-external-LSA to %s/%d", "Route[External]: Calculate AS-external-LSA to %s/%d adv_router %s",
inet_ntoa(al->header.id), ip_masklen(al->mask)); inet_ntoa(al->header.id), ip_masklen(al->mask), buf1);
}
/* (1) If the cost specified by the LSA is LSInfinity, or if the /* (1) If the cost specified by the LSA is LSInfinity, or if the
LSA's LS age is equal to MaxAge, then examine the next LSA. */ LSA's LS age is equal to MaxAge, then examine the next LSA. */
if ((metric = GET_METRIC(al->e[0].metric)) >= OSPF_LS_INFINITY) { if ((metric = GET_METRIC(al->e[0].metric)) >= OSPF_LS_INFINITY) {
@ -459,8 +464,9 @@ int ospf_ase_calculate_route(struct ospf *ospf, struct ospf_lsa *lsa)
if (!rn || (or = rn->info) == NULL) { if (!rn || (or = rn->info) == NULL) {
if (IS_DEBUG_OSPF(lsa, LSA)) if (IS_DEBUG_OSPF(lsa, LSA))
zlog_debug("Route[External]: Adding a new route %s/%d", zlog_debug("Route[External]: Adding a new route %s/%d with paths %u",
inet_ntoa(p.prefix), p.prefixlen); inet_ntoa(p.prefix), p.prefixlen,
listcount(asbr_route->paths));
ospf_route_add(ospf->new_external_route, &p, new, asbr_route); ospf_route_add(ospf->new_external_route, &p, new, asbr_route);

View File

@ -111,10 +111,11 @@ static int ospf_interface_add(int command, struct zclient *zclient,
if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
zlog_debug( zlog_debug(
"Zebra: interface add %s vrf %s[%u] index %d flags %llx metric %d mtu %d", "Zebra: interface add %s vrf %s[%u] index %d flags %llx metric %d mtu %d speed %u",
ifp->name, ospf_vrf_id_to_name(ifp->vrf_id), ifp->name, ospf_vrf_id_to_name(ifp->vrf_id),
ifp->vrf_id, ifp->ifindex, ifp->vrf_id, ifp->ifindex,
(unsigned long long)ifp->flags, ifp->metric, ifp->mtu); (unsigned long long)ifp->flags, ifp->metric, ifp->mtu,
ifp->speed);
assert(ifp->info); assert(ifp->info);
@ -128,6 +129,8 @@ static int ospf_interface_add(int command, struct zclient *zclient,
if (!ospf) if (!ospf)
return 0; return 0;
ospf_if_recalculate_output_cost(ifp);
ospf_if_update(ospf, ifp); ospf_if_update(ospf, ifp);
hook_call(ospf_if_update, ifp); hook_call(ospf_if_update, ifp);
@ -448,14 +451,17 @@ void ospf_zebra_add(struct ospf *ospf, struct prefix_ipv4 *p,
count++; count++;
if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) { if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) {
char buf[2][PREFIX2STR_BUFFER]; char buf[2][INET_ADDRSTRLEN];
struct interface *ifp;
ifp = if_lookup_by_index(path->ifindex, ospf->vrf_id);
zlog_debug( zlog_debug(
"Zebra: Route add %s nexthop %s, ifindex=%d", "Zebra: Route add %s nexthop %s, ifindex=%d %s",
prefix2str(p, buf[0], sizeof(buf[0])), prefix2str(p, buf[0], sizeof(buf[0])),
inet_ntop(AF_INET, &path->nexthop, inet_ntop(AF_INET, &path->nexthop,
buf[1], sizeof(buf[1])), buf[1], sizeof(buf[1])),
path->ifindex); path->ifindex, ifp ? ifp->name : " ");
} }
} }
api.nexthop_num = count; api.nexthop_num = count;