route_table_init_with_delegate(&zebra_if_table_delegate);
ifp->info = zebra_if;
-
- zebra_vrf_static_route_interface_fixup(ifp);
return 0;
}
old_vrf_id = ifp->vrf_id;
+ static_ifindex_update(ifp, false);
+
/* Uninstall connected routes. */
if_uninstall_connected(ifp);
/* Install connected routes (in new VRF). */
if_install_connected(ifp);
+ static_ifindex_update(ifp, true);
+
/* Due to connected route change, schedule RIB processing for both old
* and new VRF.
*/
ifp->vrf_id, ifp->name);
rib_update(old_vrf_id, RIB_UPDATE_IF_CHANGE);
rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
-
- zebra_vrf_static_route_interface_fixup(ifp);
}
static void ipv6_ll_address_to_mac(struct in6_addr *address, u_char *mac)
ifp->vrf_id, ifp->name);
rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
- zebra_vrf_static_route_interface_fixup(ifp);
-
/* Handle interface up for specific types for EVPN. Non-VxLAN interfaces
* are checked to see if (remote) neighbor entries need to be installed
* on them for ARP suppression.
return 0;
}
-/*
- * Moving an interface amongst different vrf's
- * causes the interface to get a new ifindex
- * so we need to find static routes with
- * the old ifindex and replace with new
- * ifindex to insert back into the table
- */
-void zebra_vrf_static_route_interface_fixup(struct interface *ifp)
-{
- afi_t afi;
- safi_t safi;
- struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id);
- struct route_table *stable = NULL;
- struct route_node *rn = NULL;
- struct static_route *si = NULL;
-
- if (!zvrf)
- return;
-
- for (afi = AFI_IP; afi < AFI_MAX; afi++) {
- for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
- stable = zvrf->stable[afi][safi];
- if (stable)
- for (rn = route_top(stable); rn;
- rn = route_next(rn)) {
- if (rn->info) {
- si = rn->info;
- if ((strcmp(si->ifname,
- ifp->name)
- == 0)
- && (si->ifindex
- != ifp->ifindex)) {
- si->ifindex =
- ifp->ifindex;
- static_install_route(
- afi, safi,
- &rn->p, NULL,
- si);
- }
- }
- }
- }
- }
-}
-
/* Callback upon enabling a VRF. */
static int zebra_vrf_enable(struct vrf *vrf)
{
vrf_id_t vrf_id,
u_int32_t table_id);
-extern void zebra_vrf_static_route_interface_fixup(struct interface *ifp);
extern void zebra_vrf_update_all(struct zserv *client);
extern struct zebra_vrf *zebra_vrf_lookup_by_id(vrf_id_t vrf_id);
extern struct zebra_vrf *zebra_vrf_lookup_by_name(const char *);