diff --git a/bfdd/ptm_adapter.c b/bfdd/ptm_adapter.c index 3e2ace6ea6..1d5e8310fd 100644 --- a/bfdd/ptm_adapter.c +++ b/bfdd/ptm_adapter.c @@ -698,13 +698,14 @@ static int bfdd_interface_update(ZAPI_CALLBACK_ARGS) static int bfdd_interface_vrf_update(ZAPI_CALLBACK_ARGS) { struct interface *ifp; + struct vrf *nvrf; vrf_id_t nvrfid; ifp = zebra_interface_vrf_update_read(zclient->ibuf, vrf_id, &nvrfid); if (ifp == NULL) return 0; - - if_update_to_new_vrf(ifp, nvrfid); + nvrf = vrf_lookup_by_id(nvrfid); + if_update_to_new_vrf(ifp, nvrf); return 0; } diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 252eb88143..44c1261a9a 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -503,7 +503,7 @@ static int bgp_interface_vrf_update(ZAPI_CALLBACK_ARGS) } } - if_update_to_new_vrf(ifp, new_vrf_id); + if_update_to_new_vrf(ifp, vrf_lookup_by_id(new_vrf_id)); bgp = bgp_lookup_by_vrf_id(new_vrf_id); if (!bgp) diff --git a/lib/if.c b/lib/if.c index a803754375..16d2b2bd6e 100644 --- a/lib/if.c +++ b/lib/if.c @@ -157,11 +157,18 @@ struct interface *if_create(const char *name, struct vrf *vrf) return ifp; } -/* Create new interface structure. */ -void if_update_to_new_vrf(struct interface *ifp, vrf_id_t vrf_id) +/* Create new interface structure. + * vrf must be created outside of this routing + */ +void if_update_to_new_vrf(struct interface *ifp, struct vrf *vrf) { - struct vrf *old_vrf, *vrf; + struct vrf *old_vrf; + if (!vrf) { + flog_err(EC_LIB_INTERFACE, "interface %s. Unknown VRF", + ifp->name); + return; + } /* remove interface from old master vrf list */ old_vrf = vrf_lookup_by_id(ifp->vrf_id); if (old_vrf) { @@ -170,8 +177,7 @@ void if_update_to_new_vrf(struct interface *ifp, vrf_id_t vrf_id) IFINDEX_RB_REMOVE(old_vrf, ifp); } - ifp->vrf_id = vrf_id; - vrf = vrf_get(ifp->vrf_id, NULL); + ifp->vrf_id = vrf->vrf_id; IFNAME_RB_INSERT(vrf, ifp); if (ifp->ifindex != IFINDEX_INTERNAL) @@ -439,7 +445,7 @@ struct interface *if_get_by_name(const char *name, struct vrf *vrf) /* If it came from the kernel or by way of zclient, * believe it and update the ifp accordingly. */ - if_update_to_new_vrf(ifp, vrf->vrf_id); + if_update_to_new_vrf(ifp, vrf); return ifp; } return if_create(name, vrf); diff --git a/lib/if.h b/lib/if.h index 794952897d..8bbbd1082d 100644 --- a/lib/if.h +++ b/lib/if.h @@ -479,7 +479,7 @@ extern int if_cmp_name_func(const char *p1, const char *p2); * This is useful for vrf route-leaking. So more than anything * else think before you use VRF_UNKNOWN */ -extern void if_update_to_new_vrf(struct interface *, vrf_id_t vrf_id); +extern void if_update_to_new_vrf(struct interface *, struct vrf *vrf); extern struct interface *if_create(const char *name, struct vrf *vrf); extern struct interface *if_lookup_by_index(ifindex_t, vrf_id_t vrf_id); extern struct interface *if_lookup_exact_address(void *matchaddr, int family, diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c index 9db89faa93..01b48b0c74 100644 --- a/ospfd/ospf_zebra.c +++ b/ospfd/ospf_zebra.c @@ -366,7 +366,7 @@ static int ospf_interface_vrf_update(ZAPI_CALLBACK_ARGS) ospf_vrf_id_to_name(new_vrf_id), new_vrf_id); /*if_update(ifp, ifp->name, strlen(ifp->name), new_vrf_id);*/ - if_update_to_new_vrf(ifp, new_vrf_id); + if_update_to_new_vrf(ifp, vrf_lookup_by_id(new_vrf_id)); return 0; } diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 2a772639fb..b5cde6b7f5 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -291,7 +291,7 @@ static int pim_zebra_interface_vrf_update(ZAPI_CALLBACK_ARGS) __PRETTY_FUNCTION__, ifp->name, vrf_id, new_vrf_id); - if_update_to_new_vrf(ifp, new_vrf_id); + if_update_to_new_vrf(ifp, vrf_lookup_by_id(new_vrf_id)); return 0; } diff --git a/ripd/rip_interface.c b/ripd/rip_interface.c index 634fee0b30..631c7f4603 100644 --- a/ripd/rip_interface.c +++ b/ripd/rip_interface.c @@ -468,17 +468,20 @@ int rip_interface_vrf_update(ZAPI_CALLBACK_ARGS) { struct interface *ifp; vrf_id_t new_vrf_id; + struct vrf *new_vrf; ifp = zebra_interface_vrf_update_read(zclient->ibuf, vrf_id, &new_vrf_id); if (!ifp) return 0; + new_vrf = vrf_lookup_by_id(new_vrf_id); + if (IS_RIP_DEBUG_ZEBRA) zlog_debug("interface %s VRF change vrf_id %u new vrf id %u", ifp->name, vrf_id, new_vrf_id); - if_update_to_new_vrf(ifp, new_vrf_id); + if_update_to_new_vrf(ifp, new_vrf); rip_interface_sync(ifp); return 0; diff --git a/ripngd/ripng_interface.c b/ripngd/ripng_interface.c index d83f4d2791..ebecb64847 100644 --- a/ripngd/ripng_interface.c +++ b/ripngd/ripng_interface.c @@ -314,17 +314,20 @@ int ripng_interface_vrf_update(ZAPI_CALLBACK_ARGS) { struct interface *ifp; vrf_id_t new_vrf_id; + struct vrf *new_vrf; ifp = zebra_interface_vrf_update_read(zclient->ibuf, vrf_id, &new_vrf_id); if (!ifp) return 0; + new_vrf = vrf_lookup_by_id(new_vrf_id); + if (IS_RIPNG_DEBUG_ZEBRA) zlog_debug("interface %s VRF change vrf_id %u new vrf id %u", ifp->name, vrf_id, new_vrf_id); - if_update_to_new_vrf(ifp, new_vrf_id); + if_update_to_new_vrf(ifp, new_vrf); ripng_interface_sync(ifp); return 0; diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c index 2c94dd52b5..acd1159ca6 100644 --- a/zebra/if_netlink.c +++ b/zebra/if_netlink.c @@ -1233,7 +1233,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) } else { /* pre-configured interface, learnt now */ if (ifp->vrf_id != vrf_id) - if_update_to_new_vrf(ifp, vrf_id); + if_update_to_new_vrf(ifp, vrf); } /* Update interface information. */ diff --git a/zebra/interface.c b/zebra/interface.c index b183b285e0..0eec68e840 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -768,6 +768,7 @@ void if_delete_update(struct interface *ifp) void if_handle_vrf_change(struct interface *ifp, vrf_id_t vrf_id) { vrf_id_t old_vrf_id; + struct vrf *vrf = vrf_lookup_by_id(vrf_id); old_vrf_id = ifp->vrf_id; @@ -785,7 +786,7 @@ void if_handle_vrf_change(struct interface *ifp, vrf_id_t vrf_id) zebra_interface_vrf_update_del(ifp, vrf_id); /* update VRF */ - if_update_to_new_vrf(ifp, vrf_id); + if_update_to_new_vrf(ifp, vrf); /* Send out notification on interface VRF change. */ /* This is to issue an ADD, if needed. */