diff options
| author | Mark Stapp <mjs@cisco.com> | 2024-10-22 15:57:53 -0700 | 
|---|---|---|
| committer | Mark Stapp <mjs@cisco.com> | 2024-10-28 14:54:06 -0400 | 
| commit | d349877aa5fe1f7e61ed2154d7b9126f9a95b24d (patch) | |
| tree | 72b84bf63daf7656209a4a61e4b2ff2ac05e016b /zebra/interface.c | |
| parent | 971b392cfe054ec5de387a4638109ea8ceaa0d75 (diff) | |
zebra: removing use of per-NS if_table
Remove use of the per-NS if_table from zebra/interface
module. Use new add, lookup, and iteration apis.
Signed-off-by: Mark Stapp <mjs@cisco.com>
Diffstat (limited to 'zebra/interface.c')
| -rw-r--r-- | zebra/interface.c | 144 | 
1 files changed, 46 insertions, 98 deletions
diff --git a/zebra/interface.c b/zebra/interface.c index 3e92053ba9..74e2500532 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -225,62 +225,14 @@ static int if_zebra_delete_hook(struct interface *ifp)  	return 0;  } -/* Build the table key */ -static void if_build_key(uint32_t ifindex, struct prefix *p) -{ -	p->family = AF_INET; -	p->prefixlen = IPV4_MAX_BITLEN; -	p->u.prefix4.s_addr = ifindex; -} - -/* Link an interface in a per NS interface tree */ -struct interface *if_link_per_ns(struct zebra_ns *ns, struct interface *ifp) -{ -	struct prefix p; -	struct route_node *rn; - -	if (ifp->ifindex == IFINDEX_INTERNAL) -		return NULL; - -	if_build_key(ifp->ifindex, &p); -	rn = route_node_get(ns->if_table, &p); -	if (rn->info) { -		ifp = (struct interface *)rn->info; -		route_unlock_node(rn); /* get */ -		return ifp; -	} - -	rn->info = ifp; -	ifp->node = rn; - -	return ifp; -} - -/* Delete a VRF. This is called in vrf_terminate(). */ -void if_unlink_per_ns(struct interface *ifp) -{ -	if (!ifp->node) -		return; - -	ifp->node->info = NULL; -	route_unlock_node(ifp->node); -	ifp->node = NULL; -} -  /* Look up an interface by identifier within a NS */  struct interface *if_lookup_by_index_per_ns(struct zebra_ns *ns,  					    uint32_t ifindex)  { -	struct prefix p; -	struct route_node *rn;  	struct interface *ifp = NULL; -	if_build_key(ifindex, &p); -	rn = route_node_lookup(ns->if_table, &p); -	if (rn) { -		ifp = (struct interface *)rn->info; -		route_unlock_node(rn); /* lookup */ -	} +	ifp = zebra_ns_lookup_ifp(ns, ifindex); +  	return ifp;  } @@ -288,18 +240,11 @@ struct interface *if_lookup_by_index_per_ns(struct zebra_ns *ns,  struct interface *if_lookup_by_name_per_ns(struct zebra_ns *ns,  					   const char *ifname)  { -	struct route_node *rn;  	struct interface *ifp; -	for (rn = route_top(ns->if_table); rn; rn = route_next(rn)) { -		ifp = (struct interface *)rn->info; -		if (ifp && strcmp(ifp->name, ifname) == 0) { -			route_unlock_node(rn); -			return (ifp); -		} -	} +	ifp = zebra_ns_lookup_ifp_name(ns, ifname); -	return NULL; +	return ifp;  }  struct interface *if_lookup_by_index_per_nsid(ns_id_t ns_id, uint32_t ifindex) @@ -571,7 +516,8 @@ void if_add_update(struct interface *ifp)  		zns = zvrf->zns;  	else  		zns = zebra_ns_lookup(NS_DEFAULT); -	if_link_per_ns(zns, ifp); + +	zebra_ns_link_ifp(zns, ifp);  	if_data = ifp->info;  	assert(if_data); @@ -776,7 +722,7 @@ void if_delete_update(struct interface **pifp)  	/* Send out notification on interface delete. */  	zebra_interface_delete_update(ifp); -	if_unlink_per_ns(ifp); +	zebra_ns_unlink_ifp(ifp);  	/* Update ifindex after distributing the delete message.  This is in  	   case any client needs to have the old value of ifindex available @@ -1082,50 +1028,52 @@ void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex,  }  /* - * during initial link dump kernel does not order lower devices before - * upper devices so we need to fixup link dependencies at the end of dump + * Callback for per-ns link fixup iteration   */ -void zebra_if_update_all_links(struct zebra_ns *zns) +static int zif_link_fixup_cb(struct interface *ifp, void *arg)  { -	struct route_node *rn; -	struct interface *ifp;  	struct zebra_if *zif; -	if (IS_ZEBRA_DEBUG_KERNEL) -		zlog_info("fixup link dependencies"); +	zif = ifp->info; +	/* update bond-member to bond linkages */ +	if ((IS_ZEBRA_IF_BOND_SLAVE(ifp)) && +	    (zif->bondslave_info.bond_ifindex != IFINDEX_INTERNAL) && +	    !zif->bondslave_info.bond_if) { +		if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_KERNEL) +			zlog_debug("bond mbr %s map to bond %d", zif->ifp->name, +				   zif->bondslave_info.bond_ifindex); +		zebra_l2_map_slave_to_bond(zif, ifp->vrf->vrf_id); +	} -	for (rn = route_top(zns->if_table); rn; rn = route_next(rn)) { -		ifp = (struct interface *)rn->info; -		if (!ifp) -			continue; -		zif = ifp->info; -		/* update bond-member to bond linkages */ -		if ((IS_ZEBRA_IF_BOND_SLAVE(ifp)) -		    && (zif->bondslave_info.bond_ifindex != IFINDEX_INTERNAL) -		    && !zif->bondslave_info.bond_if) { -			if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_KERNEL) -				zlog_debug("bond mbr %s map to bond %d", -					   zif->ifp->name, -					   zif->bondslave_info.bond_ifindex); -			zebra_l2_map_slave_to_bond(zif, ifp->vrf->vrf_id); -		} +	/* update SVI linkages */ +	if ((zif->link_ifindex != IFINDEX_INTERNAL) && !zif->link) { +		zif->link = if_lookup_by_index_per_nsid(zif->link_nsid, +							zif->link_ifindex); +		if (IS_ZEBRA_DEBUG_KERNEL) +			zlog_debug("interface %s/%d's lower fixup to %s/%d", +				   ifp->name, ifp->ifindex, +				   zif->link ? zif->link->name : "unk", +				   zif->link_ifindex); +	} -		/* update SVI linkages */ -		if ((zif->link_ifindex != IFINDEX_INTERNAL) && !zif->link) { -			zif->link = if_lookup_by_index_per_nsid( -				zif->link_nsid, zif->link_ifindex); -			if (IS_ZEBRA_DEBUG_KERNEL) -				zlog_debug("interface %s/%d's lower fixup to %s/%d", -						ifp->name, ifp->ifindex, -						zif->link?zif->link->name:"unk", -						zif->link_ifindex); -		} +	/* Update VLAN<=>SVI map */ +	if (IS_ZEBRA_IF_VLAN(ifp)) +		zebra_evpn_acc_bd_svi_set(zif, NULL, +					  !!if_is_operative(ifp)); -		/* Update VLAN<=>SVI map */ -		if (IS_ZEBRA_IF_VLAN(ifp)) -			zebra_evpn_acc_bd_svi_set(zif, NULL, -						  !!if_is_operative(ifp)); -	} +	return NS_WALK_CONTINUE; +} + +/* + * during initial link dump kernel does not order lower devices before + * upper devices so we need to fixup link dependencies at the end of dump + */ +void zebra_if_update_all_links(struct zebra_ns *zns) +{ +	if (IS_ZEBRA_DEBUG_KERNEL) +		zlog_debug("fixup link dependencies"); + +	zebra_ns_ifp_walk(zns, zif_link_fixup_cb, NULL);  }  static bool if_ignore_set_protodown(const struct interface *ifp, bool new_down,  | 
