diff options
author | Philippe Guibert <philippe.guibert@6wind.com> | 2019-02-11 17:42:50 +0100 |
---|---|---|
committer | Philippe Guibert <philippe.guibert@6wind.com> | 2019-06-12 14:10:28 +0200 |
commit | a41c4e1b1f577443ad26222704a69649c280cd9e (patch) | |
tree | 2d01484bb959675b20c1596be1c1f4e28ddaf403 | |
parent | lib, bgpd, ospfd, pimd, zebra, rip, ripng, bfd: change if_update_to_new_vrf()... (diff) | |
download | frr-a41c4e1b1f577443ad26222704a69649c280cd9e.tar.xz frr-a41c4e1b1f577443ad26222704a69649c280cd9e.zip |
*: change interface structure, from vrf_id to vrf
Field vrf_id is replaced by the pointer of the struct vrf *.
For that all other code referencing to (interface)->vrf_id is replaced.
This work should not change the behaviour.
It is just a continuation work toward having an interface API handling
vrf pointer only.
some new generic functions are created in vrf:
vrf_to_id, vrf_to_name,
a zebra function is also created:
zvrf_info_lookup
an ospf function is also created:
ospf_lookup_by_vrf
it is to be noted that now that interface has a vrf pointer, some more
optimisations could be thought through all the rest of the code. as
example, many structure store the vrf_id. those structures could get
the exact vrf structure if inherited from an interface vrf context.
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
36 files changed, 229 insertions, 177 deletions
diff --git a/bfdd/bfd.c b/bfdd/bfd.c index 435443182..3d8f38181 100644 --- a/bfdd/bfd.c +++ b/bfdd/bfd.c @@ -139,7 +139,7 @@ int bfd_session_enable(struct bfd_session *bs) if (bs->key.ifname[0]) { if (vrf) - ifp = if_lookup_by_name(bs->key.ifname, vrf->vrf_id); + ifp = if_lookup_by_name(bs->key.ifname, vrf); else ifp = if_lookup_by_name_all_vrf(bs->key.ifname); if (ifp == NULL) { @@ -148,7 +148,7 @@ int bfd_session_enable(struct bfd_session *bs) return 0; } if (bs->key.ifname[0] && !vrf) { - vrf = vrf_lookup_by_id(ifp->vrf_id); + vrf = ifp->vrf; if (vrf == NULL) { log_error( "session-enable: specified VRF doesn't exists."); diff --git a/bfdd/ptm_adapter.c b/bfdd/ptm_adapter.c index 1d5e8310f..a634d923d 100644 --- a/bfdd/ptm_adapter.c +++ b/bfdd/ptm_adapter.c @@ -572,7 +572,10 @@ static void bfdd_sessions_enable_interface(struct interface *ifp) { struct bfd_session_observer *bso; struct bfd_session *bs; - struct vrf *vrf; + struct vrf *vrf = ifp->vrf; + + if (!vrf) + return; TAILQ_FOREACH(bso, &bglobal.bg_obslist, bso_entry) { bs = bso->bso_bs; @@ -581,9 +584,6 @@ static void bfdd_sessions_enable_interface(struct interface *ifp) /* Interface name mismatch. */ if (strcmp(ifp->name, bs->key.ifname)) continue; - vrf = vrf_lookup_by_id(ifp->vrf_id); - if (!vrf) - continue; if (bs->key.vrfname[0] && strcmp(vrf->name, bs->key.vrfname)) continue; diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 44c1261a9..ae30fcfb1 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -802,7 +802,7 @@ bool bgp_zebra_nexthop_set(union sockunion *local, union sockunion *remote, peer->bgp->vrf_id)); } else if (peer->update_if) ifp = if_lookup_by_name(peer->update_if, - vrf_lookup_by_id(peer->bgp->vrf_id)); + vrf_lookup_by_id(peer->bgp->vrf_id)); else ifp = if_lookup_by_ipv6_exact(&local->sin6.sin6_addr, local->sin6.sin6_scope_id, diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c index 0334b98a1..d2733ebaf 100644 --- a/isisd/isis_cli.c +++ b/isisd/isis_cli.c @@ -97,8 +97,7 @@ DEFPY(no_router_isis, no_router_isis_cmd, "no router isis WORD$tag", /* add callbacks to delete each of the circuits listed */ const char *vrf_name = - vrf_lookup_by_id(circuit->interface->vrf_id) - ->name; + circuit->interface->vrf->name; snprintf( temp_xpath, XPATH_MAXLEN, "/frr-interface:lib/interface[name='%s'][vrf='%s']/frr-isisd:isis", @@ -141,7 +141,7 @@ struct interface *if_create(const char *name, struct vrf *vrf) assert(name); strlcpy(ifp->name, name, sizeof(ifp->name)); - ifp->vrf_id = vrf->vrf_id; + ifp->vrf = vrf; IFNAME_RB_INSERT(vrf, ifp); ifp->connected = list_new(); ifp->connected->del = (void (*)(void *))connected_free; @@ -170,14 +170,14 @@ void if_update_to_new_vrf(struct interface *ifp, struct vrf *vrf) return; } /* remove interface from old master vrf list */ - old_vrf = vrf_lookup_by_id(ifp->vrf_id); + old_vrf = ifp->vrf; if (old_vrf) { IFNAME_RB_REMOVE(old_vrf, ifp); if (ifp->ifindex != IFINDEX_INTERNAL) IFINDEX_RB_REMOVE(old_vrf, ifp); } - ifp->vrf_id = vrf->vrf_id; + ifp->vrf = vrf; IFNAME_RB_INSERT(vrf, ifp); if (ifp->ifindex != IFINDEX_INTERNAL) @@ -225,9 +225,8 @@ void if_delete_retain(struct interface *ifp) /* Delete and free interface structure. */ void if_delete(struct interface *ifp) { - struct vrf *vrf; + struct vrf *vrf = ifp->vrf; - vrf = vrf_lookup_by_id(ifp->vrf_id); assert(vrf); IFNAME_RB_REMOVE(vrf, ifp); @@ -440,7 +439,7 @@ struct interface *if_get_by_name(const char *name, struct vrf *vrf) case VRF_BACKEND_VRF_LITE: ifp = if_lookup_by_name_all_vrf(name); if (ifp) { - if (ifp->vrf_id == vrf->vrf_id) + if (ifp->vrf == vrf) return ifp; /* If it came from the kernel or by way of zclient, * believe it and update the ifp accordingly. @@ -458,7 +457,7 @@ void if_set_index(struct interface *ifp, ifindex_t ifindex) { struct vrf *vrf; - vrf = vrf_lookup_by_id(ifp->vrf_id); + vrf = ifp->vrf; assert(vrf); if (ifp->ifindex == ifindex) @@ -602,7 +601,8 @@ static void if_dump(const struct interface *ifp) zlog_info( "Interface %s vrf %u index %d metric %d mtu %d " "mtu6 %d %s", - ifp->name, ifp->vrf_id, ifp->ifindex, ifp->metric, + ifp->name, vrf_to_id(ifp->vrf), + ifp->ifindex, ifp->metric, ifp->mtu, ifp->mtu6, if_flag_dump(ifp->flags)); } @@ -784,7 +784,8 @@ connected_log(struct connected *connected, char *str) p = connected->address; snprintf(logbuf, BUFSIZ, "%s interface %s vrf %u %s %s/%d ", str, - ifp->name, ifp->vrf_id, prefix_family_str(p), + ifp->name, vrf_to_id(ifp->vrf), + prefix_family_str(p), inet_ntop(p->family, &p->u.prefix, buf, BUFSIZ), p->prefixlen); p = connected->destination; @@ -1159,7 +1160,7 @@ DEFPY_NOSH (interface, ifp = if_lookup_by_name(ifname, vrf); else ifp = if_lookup_by_name_all_vrf(ifname); - if (ifp && ifp->vrf_id != vrf->vrf_id) { + if (ifp && ifp->vrf != vrf) { /* * Special case 1: a VRF name was specified, but the found * interface is associated to different VRF. Reject the command. @@ -1175,7 +1176,7 @@ DEFPY_NOSH (interface, * interface is associated to a VRF other than the default one. * Update vrf_id and vrfname to account for that. */ - vrf = vrf_lookup_by_id(ifp->vrf_id); + vrf = ifp->vrf; assert(vrf); vrfname = vrf->name; } @@ -1340,7 +1341,7 @@ static int lib_interface_create(enum nb_event event, */ if (vrf_get_backend() == VRF_BACKEND_VRF_LITE) { ifp = if_lookup_by_name_all_vrf(ifname); - if (ifp && ifp->vrf_id != vrf->vrf_id) { + if (ifp && ifp->vrf != vrf) { zlog_warn( "%s: interface %s already exists in another VRF", __func__, ifp->name); @@ -294,7 +294,7 @@ struct interface { #endif /* HAVE_NET_RT_IFLIST */ struct route_node *node; - vrf_id_t vrf_id; + struct vrf *vrf; QOBJ_FIELDS }; @@ -305,33 +305,37 @@ RB_HEAD(if_index_head, interface); RB_PROTOTYPE(if_index_head, interface, index_entry, if_cmp_func) DECLARE_QOBJ_TYPE(interface) -#define IFNAME_RB_INSERT(vrf, ifp) \ - if (RB_INSERT(if_name_head, &vrf->ifaces_by_name, (ifp))) \ +#define IFNAME_RB_INSERT(_vrf, _ifp) \ + if (RB_INSERT(if_name_head, &(_vrf)->ifaces_by_name, (_ifp))) \ flog_err(EC_LIB_INTERFACE, \ "%s(%s): corruption detected -- interface with this " \ "name exists already in VRF %u!", \ - __func__, (ifp)->name, (ifp)->vrf_id); + __func__, (_ifp)->name, (_ifp)->vrf ? \ + (_ifp)->vrf->vrf_id : VRF_UNKNOWN); -#define IFNAME_RB_REMOVE(vrf, ifp) \ - if (RB_REMOVE(if_name_head, &vrf->ifaces_by_name, (ifp)) == NULL) \ +#define IFNAME_RB_REMOVE(_vrf, _ifp) \ + if (RB_REMOVE(if_name_head, &(_vrf)->ifaces_by_name, (_ifp)) == NULL) \ flog_err(EC_LIB_INTERFACE, \ "%s(%s): corruption detected -- interface with this " \ "name doesn't exist in VRF %u!", \ - __func__, (ifp)->name, (ifp)->vrf_id); + __func__, (_ifp)->name, (_ifp)->vrf ? \ + (_ifp)->vrf->vrf_id : VRF_UNKNOWN); -#define IFINDEX_RB_INSERT(vrf, ifp) \ - if (RB_INSERT(if_index_head, &vrf->ifaces_by_index, (ifp))) \ +#define IFINDEX_RB_INSERT(_vrf, _ifp) \ + if (RB_INSERT(if_index_head, &(_vrf)->ifaces_by_index, (_ifp))) \ flog_err(EC_LIB_INTERFACE, \ "%s(%u): corruption detected -- interface with this " \ "ifindex exists already in VRF %u!", \ - __func__, (ifp)->ifindex, (ifp)->vrf_id); + __func__, (_ifp)->ifindex, (_ifp)->vrf ? \ + (_ifp)->vrf->vrf_id : VRF_UNKNOWN); -#define IFINDEX_RB_REMOVE(vrf, ifp) \ - if (RB_REMOVE(if_index_head, &vrf->ifaces_by_index, (ifp)) == NULL) \ +#define IFINDEX_RB_REMOVE(_vrf, _ifp) \ + if (RB_REMOVE(if_index_head, &(_vrf)->ifaces_by_index, (_ifp)) == NULL)\ flog_err(EC_LIB_INTERFACE, \ "%s(%u): corruption detected -- interface with this " \ "ifindex doesn't exist in VRF %u!", \ - __func__, (ifp)->ifindex, (ifp)->vrf_id); + __func__, (_ifp)->ifindex, (_ifp)->vrf ? \ + (_ifp)->vrf->vrf_id : VRF_UNKNOWN); #define FOR_ALL_INTERFACES(vrf, ifp) \ if (vrf) \ @@ -923,14 +923,15 @@ int vrf_bind(vrf_id_t vrf_id, int fd, const char *name) { int ret = 0; struct interface *ifp; + struct vrf *vrf = vrf_lookup_by_id(vrf_id); - if (fd < 0 || name == NULL) + if (fd < 0 || name == NULL || !vrf) return fd; /* the device should exist * otherwise we should return * case ifname = vrf in netns mode => return */ - ifp = if_lookup_by_name(name, vrf_id); + ifp = if_lookup_by_name(name, vrf); if (!ifp) return fd; #ifdef SO_BINDTODEVICE @@ -1017,3 +1018,13 @@ vrf_id_t vrf_generate_id(void) return ++vrf_id_local; } + +vrf_id_t vrf_to_id(struct vrf *vrf) +{ + return vrf ? vrf->vrf_id : VRF_UNKNOWN; +} + +const char *vrf_to_name(struct vrf *vrf) +{ + return vrf ? vrf->name : "NIL"; +} @@ -113,6 +113,8 @@ extern struct vrf *vrf_lookup_by_name(const char *); extern struct vrf *vrf_get(vrf_id_t, const char *); extern const char *vrf_id_to_name(vrf_id_t vrf_id); extern vrf_id_t vrf_name_to_id(const char *); +extern vrf_id_t vrf_to_id(struct vrf *vrf); +extern const char *vrf_to_name(struct vrf *vrf); /* vrf context is searched and created */ diff --git a/lib/zclient.c b/lib/zclient.c index da8dc4e90..94d92f67e 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -1469,6 +1469,11 @@ struct interface *zebra_interface_add_read(struct stream *s, vrf_id_t vrf_id) /* Lookup/create interface by name. */ ifp = if_get_by_name(ifname_tmp, vrf); + /* update vrf_id of interface */ + if (ifp->vrf->vrf_id == VRF_UNKNOWN && + vrf->vrf_id != VRF_UNKNOWN) + ifp->vrf = vrf; + zebra_interface_if_set_value(s, ifp); return ifp; @@ -2844,11 +2849,12 @@ void zclient_interface_set_master(struct zclient *client, s = client->obuf; stream_reset(s); - zclient_create_header(s, ZEBRA_INTERFACE_SET_MASTER, master->vrf_id); + zclient_create_header(s, ZEBRA_INTERFACE_SET_MASTER, + vrf_to_id(master->vrf)); - stream_putl(s, master->vrf_id); + stream_putl(s, vrf_to_id(master->vrf)); stream_putl(s, master->ifindex); - stream_putl(s, slave->vrf_id); + stream_putl(s, vrf_to_id(slave->vrf)); stream_putl(s, slave->ifindex); stream_putw_at(s, 0, stream_get_endp(s)); diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index 4075f3209..6516129c5 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -349,8 +349,8 @@ void ospf_if_free(struct ospf_interface *oi) if (IS_DEBUG_OSPF_EVENT) zlog_debug("%s: ospf interface %s vrf %s id %u deleted", __PRETTY_FUNCTION__, oi->ifp->name, - ospf_vrf_id_to_name(oi->ifp->vrf_id), - oi->ifp->vrf_id); + vrf_to_name(oi->ifp->vrf), + vrf_to_id(oi->ifp->vrf)); ospf_delete_from_if(oi->ifp, oi); diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c index e2ddf36a3..6fee49d12 100644 --- a/ospfd/ospf_vty.c +++ b/ospfd/ospf_vty.c @@ -7279,7 +7279,7 @@ static int ospf_vty_dead_interval_set(struct vty *vty, const char *interval_str, if (nbr_str) { struct ospf *ospf = NULL; - ospf = ospf_lookup_by_vrf_id(ifp->vrf_id); + ospf = ospf_lookup_by_vrf(ifp->vrf); if (ospf) { oi = ospf_if_lookup_by_local_addr(ospf, ifp, addr); if (oi) @@ -7396,7 +7396,7 @@ DEFUN (no_ip_ospf_dead_interval, if (argc == 1) { struct ospf *ospf = NULL; - ospf = ospf_lookup_by_vrf_id(ifp->vrf_id); + ospf = ospf_lookup_by_vrf(ifp->vrf); if (ospf) { oi = ospf_if_lookup_by_local_addr(ospf, ifp, addr); if (oi) @@ -7995,8 +7995,8 @@ DEFUN (ip_ospf_area, argv_find(argv, argc, "area", &idx); areaid = argv[idx + 1]->arg; - if (ifp->vrf_id && !instance) - ospf = ospf_lookup_by_vrf_id(ifp->vrf_id); + if (ifp->vrf && ifp->vrf->vrf_id && !instance) + ospf = ospf_lookup_by_vrf(ifp->vrf); else ospf = ospf_lookup_instance(instance); @@ -8093,8 +8093,8 @@ DEFUN (no_ip_ospf_area, if (argv_find(argv, argc, "(1-65535)", &idx)) instance = strtol(argv[idx]->arg, NULL, 10); - if (ifp->vrf_id && !instance) - ospf = ospf_lookup_by_vrf_id(ifp->vrf_id); + if (ifp->vrf && ifp->vrf->vrf_id && !instance) + ospf = ospf_lookup_by_vrf(ifp->vrf); else ospf = ospf_lookup_instance(instance); @@ -9720,7 +9720,7 @@ static int config_write_interface_one(struct vty *vty, struct vrf *vrf) continue; vty_frame(vty, "!\n"); - if (ifp->vrf_id == VRF_DEFAULT) + if (ifp->vrf->vrf_id == VRF_DEFAULT) vty_frame(vty, "interface %s\n", ifp->name); else vty_frame(vty, "interface %s vrf %s\n", ifp->name, diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c index 01b48b0c7..33d2c82d0 100644 --- a/ospfd/ospf_zebra.c +++ b/ospfd/ospf_zebra.c @@ -110,8 +110,8 @@ static int ospf_interface_add(ZAPI_CALLBACK_ARGS) if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) zlog_debug( "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->vrf_id, ifp->ifindex, + ifp->name, vrf_to_name(ifp->vrf), + vrf_to_id(ifp->vrf), ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu, ifp->speed); @@ -152,8 +152,8 @@ static int ospf_interface_delete(ZAPI_CALLBACK_ARGS) if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE)) zlog_debug( "Zebra: interface delete %s vrf %s[%u] index %d flags %llx metric %d mtu %d", - ifp->name, ospf_vrf_id_to_name(ifp->vrf_id), - ifp->vrf_id, ifp->ifindex, + ifp->name, vrf_to_name(ifp->vrf), + vrf_to_id(ifp->vrf), ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu); hook_call(ospf_if_delete, ifp); diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c index 073a51561..de51ec226 100644 --- a/ospfd/ospfd.c +++ b/ospfd/ospfd.c @@ -452,6 +452,11 @@ struct ospf *ospf_lookup_by_vrf_id(vrf_id_t vrf_id) vrf = vrf_lookup_by_id(vrf_id); if (!vrf) return NULL; + return ospf_lookup_by_vrf(vrf); +} + +struct ospf *ospf_lookup_by_vrf(struct vrf *vrf) +{ return (vrf->info) ? (struct ospf *)vrf->info : NULL; } @@ -1347,8 +1352,8 @@ void ospf_if_update(struct ospf *ospf, struct interface *ifp) if (IS_DEBUG_OSPF_EVENT) zlog_debug( - "%s: interface %s ifp->vrf_id %u ospf vrf %s vrf_id %u router_id %s", - __PRETTY_FUNCTION__, ifp->name, ifp->vrf_id, + "%s: interface %s ifp->vrf->vrf_id %u ospf vrf %s vrf_id %u router_id %s", + __PRETTY_FUNCTION__, ifp->name, vrf_to_id(ifp->vrf), ospf_vrf_id_to_name(ospf->vrf_id), ospf->vrf_id, inet_ntoa(ospf->router_id)); diff --git a/ospfd/ospfd.h b/ospfd/ospfd.h index cbea033b7..a46febaec 100644 --- a/ospfd/ospfd.h +++ b/ospfd/ospfd.h @@ -507,6 +507,7 @@ extern struct ospf *ospf_get_instance(unsigned short); extern struct ospf *ospf_lookup_by_inst_name(unsigned short instance, const char *name); extern struct ospf *ospf_lookup_by_vrf_id(vrf_id_t vrf_id); +extern struct ospf *ospf_lookup_by_vrf(struct vrf *vrf); extern void ospf_finish(struct ospf *); extern void ospf_router_id_update(struct ospf *ospf); extern int ospf_network_set(struct ospf *, struct prefix_ipv4 *, struct in_addr, diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 4d6af1b51..6ccc6ed19 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -120,7 +120,7 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim, pim_ifp = XCALLOC(MTYPE_PIM_INTERFACE, sizeof(*pim_ifp)); pim_ifp->options = 0; - pim_ifp->pim = pim_get_pim_instance(ifp->vrf_id); + pim_ifp->pim = pim_get_pim_instance(vrf_to_id(ifp->vrf)); pim_ifp->mroute_vif_index = -1; pim_ifp->igmp_version = IGMP_DEFAULT_VERSION; @@ -781,7 +781,7 @@ void pim_if_addr_del_all(struct interface *ifp) struct connected *ifc; struct listnode *node; struct listnode *nextnode; - struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id); + struct vrf *vrf = ifp->vrf; struct pim_instance *pim; if (!vrf) @@ -853,7 +853,7 @@ struct in_addr pim_find_primary_addr(struct interface *ifp) int v4_addrs = 0; int v6_addrs = 0; struct pim_interface *pim_ifp = ifp->info; - struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id); + struct vrf *vrf = ifp->vrf; if (!vrf) return addr; @@ -894,7 +894,7 @@ struct in_addr pim_find_primary_addr(struct interface *ifp) if (!v4_addrs && v6_addrs && !if_is_loopback(ifp)) { struct interface *lo_ifp; // DBS - Come back and check here - if (ifp->vrf_id == VRF_DEFAULT) + if (!ifp->vrf || ifp->vrf->vrf_id == VRF_DEFAULT) lo_ifp = if_lookup_by_name("lo", vrf); else lo_ifp = if_lookup_by_name(vrf->name, vrf); diff --git a/pimd/pim_static.c b/pimd/pim_static.c index 442b22e06..4ddf21951 100644 --- a/pimd/pim_static.c +++ b/pimd/pim_static.c @@ -92,7 +92,7 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif, return -4; } #endif - if (iif->vrf_id != oif->vrf_id) { + if (iif->vrf != oif->vrf) { return -3; } diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index b5cde6b7f..c4d183535 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -214,7 +214,7 @@ static int pim_zebra_if_state_up(ZAPI_CALLBACK_ARGS) RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) { if ((table_id == vrf->data.l.table_id) - && (ifp->vrf_id != vrf->vrf_id)) { + && (ifp->vrf != vrf)) { struct interface *master = if_lookup_by_name( vrf->name, vrf); diff --git a/ripd/rip_interface.c b/ripd/rip_interface.c index 631c7f460..307785cdb 100644 --- a/ripd/rip_interface.c +++ b/ripd/rip_interface.c @@ -364,7 +364,7 @@ int rip_interface_down(ZAPI_CALLBACK_ARGS) if (IS_RIP_DEBUG_ZEBRA) zlog_debug( "interface %s vrf %u index %d flags %llx metric %d mtu %d is down", - ifp->name, ifp->vrf_id, ifp->ifindex, + ifp->name, ifp->vrf->vrf_id, ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu); return 0; @@ -385,7 +385,7 @@ int rip_interface_up(ZAPI_CALLBACK_ARGS) if (IS_RIP_DEBUG_ZEBRA) zlog_debug( "interface %s vrf %u index %d flags %#llx metric %d mtu %d is up", - ifp->name, ifp->vrf_id, ifp->ifindex, + ifp->name, ifp->vrf->vrf_id, ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu); rip_interface_sync(ifp); @@ -413,7 +413,7 @@ int rip_interface_add(ZAPI_CALLBACK_ARGS) if (IS_RIP_DEBUG_ZEBRA) zlog_debug( "interface add %s vrf %u index %d flags %#llx metric %d mtu %d", - ifp->name, ifp->vrf_id, ifp->ifindex, + ifp->name, ifp->vrf->vrf_id, ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu); /* Check if this interface is RIP enabled or not.*/ @@ -453,7 +453,7 @@ int rip_interface_delete(ZAPI_CALLBACK_ARGS) zlog_info( "interface delete %s vrf %u index %d flags %#llx metric %d mtu %d", - ifp->name, ifp->vrf_id, ifp->ifindex, + ifp->name, ifp->vrf->vrf_id, ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu); /* To support pseudo interface do not free interface structure. */ @@ -482,6 +482,7 @@ int rip_interface_vrf_update(ZAPI_CALLBACK_ARGS) ifp->name, vrf_id, new_vrf_id); if_update_to_new_vrf(ifp, new_vrf); + rip_interface_sync(ifp); return 0; @@ -1226,7 +1227,7 @@ void rip_interface_sync(struct interface *ifp) { struct vrf *vrf; - vrf = vrf_lookup_by_id(ifp->vrf_id); + vrf = ifp->vrf; if (vrf) { struct rip_interface *ri; diff --git a/ripd/ripd.c b/ripd/ripd.c index 72af5326b..2098435d7 100644 --- a/ripd/ripd.c +++ b/ripd/ripd.c @@ -3451,6 +3451,8 @@ void rip_if_rmap_update_interface(struct interface *ifp) if (!rip) return; + if (ifp->vrf && ifp->vrf->vrf_id == VRF_UNKNOWN) + return; ctx = rip->if_rmap_ctx; if (!ctx) return; diff --git a/ripngd/ripng_interface.c b/ripngd/ripng_interface.c index ebecb6484..71f5552b2 100644 --- a/ripngd/ripng_interface.c +++ b/ripngd/ripng_interface.c @@ -210,7 +210,7 @@ int ripng_interface_up(ZAPI_CALLBACK_ARGS) if (IS_RIPNG_DEBUG_ZEBRA) zlog_debug( "interface up %s vrf %u index %d flags %llx metric %d mtu %d", - ifp->name, ifp->vrf_id, ifp->ifindex, + ifp->name, ifp->vrf->vrf_id, ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu6); ripng_interface_sync(ifp); @@ -247,7 +247,7 @@ int ripng_interface_down(ZAPI_CALLBACK_ARGS) if (IS_RIPNG_DEBUG_ZEBRA) zlog_debug( "interface down %s vrf %u index %d flags %#llx metric %d mtu %d", - ifp->name, ifp->vrf_id, ifp->ifindex, + ifp->name, ifp->vrf->vrf_id, ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu6); return 0; @@ -264,7 +264,7 @@ int ripng_interface_add(ZAPI_CALLBACK_ARGS) if (IS_RIPNG_DEBUG_ZEBRA) zlog_debug( "RIPng interface add %s vrf %u index %d flags %#llx metric %d mtu %d", - ifp->name, ifp->vrf_id, ifp->ifindex, + ifp->name, ifp->vrf->vrf_id, ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu6); /* Check is this interface is RIP enabled or not.*/ @@ -299,7 +299,7 @@ int ripng_interface_delete(ZAPI_CALLBACK_ARGS) zlog_info( "interface delete %s vrf %u index %d flags %#llx metric %d mtu %d", - ifp->name, ifp->vrf_id, ifp->ifindex, + ifp->name, ifp->vrf->vrf_id, ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu6); /* To support pseudo interface do not free interface structure. */ @@ -328,6 +328,7 @@ int ripng_interface_vrf_update(ZAPI_CALLBACK_ARGS) ifp->name, vrf_id, new_vrf_id); if_update_to_new_vrf(ifp, new_vrf); + ripng_interface_sync(ifp); return 0; @@ -932,7 +933,7 @@ void ripng_interface_sync(struct interface *ifp) { struct vrf *vrf; - vrf = vrf_lookup_by_id(ifp->vrf_id); + vrf = ifp->vrf; if (vrf) { struct ripng_interface *ri; diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c index 67a52e9f0..b083a07f8 100644 --- a/ripngd/ripngd.c +++ b/ripngd/ripngd.c @@ -2603,6 +2603,8 @@ void ripng_if_rmap_update_interface(struct interface *ifp) struct if_rmap *if_rmap; struct if_rmap_ctx *ctx; + if (ifp->vrf && ifp->vrf->vrf_id == VRF_UNKNOWN) + return; if (!ripng) return; ctx = ripng->if_rmap_ctx; diff --git a/staticd/static_routes.c b/staticd/static_routes.c index 9c012c475..e9fdad6ba 100644 --- a/staticd/static_routes.c +++ b/staticd/static_routes.c @@ -516,7 +516,7 @@ static void static_fixup_intf_nh(struct route_table *stable, for (rn = route_top(stable); rn; rn = route_next(rn)) { for (si = rn->info; si; si = si->next) { - if (si->nh_vrf_id != ifp->vrf_id) + if (si->nh_vrf_id != vrf_to_id(ifp->vrf)) continue; if (si->ifindex != ifp->ifindex) @@ -542,7 +542,7 @@ void static_install_intf_nh(struct interface *ifp) struct static_vrf *svrf = vrf->info; /* Not needed if same vrf since happens naturally */ - if (vrf->vrf_id == ifp->vrf_id) + if (vrf == ifp->vrf) continue; /* Install any static routes configured for this interface. */ diff --git a/zebra/connected.c b/zebra/connected.c index bba221c2c..bd4f9b66a 100644 --- a/zebra/connected.c +++ b/zebra/connected.c @@ -207,16 +207,16 @@ void connected_up(struct interface *ifp, struct connected *ifc) struct nexthop nh = { .type = NEXTHOP_TYPE_IFINDEX, .ifindex = ifp->ifindex, - .vrf_id = ifp->vrf_id, + .vrf_id = vrf_to_id(ifp->vrf), }; struct zebra_vrf *zvrf; uint32_t metric; - zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id); + zvrf = zebra_vrf_lookup_by_id(ifp->vrf->vrf_id); if (!zvrf) { flog_err(EC_ZEBRA_VRF_NOT_FOUND, "%s: Received Up for interface but no associated zvrf: %d", - __PRETTY_FUNCTION__, ifp->vrf_id); + __PRETTY_FUNCTION__, ifp->vrf->vrf_id); return; } if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL)) @@ -265,7 +265,7 @@ void connected_up(struct interface *ifp, struct connected *ifc) zlog_debug( "%u: IF %s address %s add/up, scheduling RIB processing", - ifp->vrf_id, ifp->name, + vrf_to_id(ifp->vrf), ifp->name, prefix2str(&p, buf, sizeof(buf))); } rib_update(zvrf->vrf->vrf_id, RIB_UPDATE_IF_CHANGE); @@ -383,15 +383,15 @@ void connected_down(struct interface *ifp, struct connected *ifc) struct nexthop nh = { .type = NEXTHOP_TYPE_IFINDEX, .ifindex = ifp->ifindex, - .vrf_id = ifp->vrf_id, + .vrf_id = vrf_to_id(ifp->vrf), }; struct zebra_vrf *zvrf; - zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id); + zvrf = zebra_vrf_lookup_by_id(ifp->vrf->vrf_id); if (!zvrf) { flog_err(EC_ZEBRA_VRF_NOT_FOUND, "%s: Received Up for interface but no associated zvrf: %d", - __PRETTY_FUNCTION__, ifp->vrf_id); + __PRETTY_FUNCTION__, ifp->vrf->vrf_id); return; } @@ -473,22 +473,22 @@ static void connected_delete_helper(struct connected *ifc, struct prefix *p) zlog_debug( "%u: IF %s IP %s address del, scheduling RIB processing", - ifp->vrf_id, ifp->name, + vrf_to_id(ifp->vrf), ifp->name, prefix2str(p, buf, sizeof(buf))); } - rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE); + rib_update(vrf_to_id(ifp->vrf), RIB_UPDATE_IF_CHANGE); /* Schedule LSP forwarding entries for processing, if appropriate. */ - if (ifp->vrf_id == VRF_DEFAULT) { + if (vrf_to_id(ifp->vrf) == VRF_DEFAULT) { if (IS_ZEBRA_DEBUG_MPLS) { char buf[PREFIX_STRLEN]; zlog_debug( "%u: IF %s IP %s address delete, scheduling MPLS processing", - ifp->vrf_id, ifp->name, + vrf_to_id(ifp->vrf), ifp->name, prefix2str(p, buf, sizeof(buf))); } - mpls_mark_lsps_for_processing(vrf_info_lookup(ifp->vrf_id), p); + mpls_mark_lsps_for_processing(zvrf_info_lookup(ifp->vrf), p); } } diff --git a/zebra/if_ioctl.c b/zebra/if_ioctl.c index a5a18a10f..6ce566262 100644 --- a/zebra/if_ioctl.c +++ b/zebra/if_ioctl.c @@ -152,7 +152,8 @@ static int if_get_hwaddr(struct interface *ifp) ifreq.ifr_addr.sa_family = AF_INET; /* Fetch Hardware address if available. */ - ret = vrf_if_ioctl(SIOCGIFHWADDR, (caddr_t)&ifreq, ifp->vrf_id); + ret = vrf_if_ioctl(SIOCGIFHWADDR, (caddr_t)&ifreq, + vrf_to_id(ifp->vrf)); if (ret < 0) ifp->hw_addr_len = 0; else { diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c index acd1159ca..4b6000c94 100644 --- a/zebra/if_netlink.c +++ b/zebra/if_netlink.c @@ -387,7 +387,7 @@ static int get_iflink_speed(struct interface *interface) /* use ioctl to get IP address of an interface */ frr_elevate_privs(&zserv_privs) { sd = vrf_socket(PF_INET, SOCK_DGRAM, IPPROTO_IP, - interface->vrf_id, + vrf_to_id(interface->vrf), NULL); if (sd < 0) { if (IS_ZEBRA_DEBUG_KERNEL) @@ -396,7 +396,7 @@ static int get_iflink_speed(struct interface *interface) return 0; } /* Get the current link state for the interface */ - rc = vrf_ioctl(interface->vrf_id, sd, SIOCETHTOOL, + rc = vrf_ioctl(vrf_to_id(interface->vrf), sd, SIOCETHTOOL, (char *)&ifdata); } if (rc < 0) { @@ -1232,7 +1232,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) ifp = if_get_by_name(name, vrf); } else { /* pre-configured interface, learnt now */ - if (ifp->vrf_id != vrf_id) + if (ifp->vrf != vrf) if_update_to_new_vrf(ifp, vrf); } @@ -1272,16 +1272,16 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) bridge_ifindex); else if (IS_ZEBRA_IF_BOND_SLAVE(ifp)) zebra_l2if_update_bond_slave(ifp, bond_ifindex); - } else if (ifp->vrf_id != vrf_id) { + } else if (ifp->vrf != vrf) { /* VRF change for an interface. */ if (IS_ZEBRA_DEBUG_KERNEL) zlog_debug( "RTM_NEWLINK vrf-change for %s(%u) " "vrf_id %u -> %u flags 0x%x", - name, ifp->ifindex, ifp->vrf_id, vrf_id, - ifi->ifi_flags); + name, ifp->ifindex, vrf_to_id(ifp->vrf), + vrf_id, ifi->ifi_flags); - if_handle_vrf_change(ifp, vrf_id); + if_handle_vrf_change(ifp, vrf->vrf_id); } else { bool was_bridge_slave, was_bond_slave; diff --git a/zebra/interface.c b/zebra/interface.c index 0eec68e84..6e16ae819 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -530,7 +530,7 @@ void if_add_update(struct interface *ifp) { struct zebra_if *if_data; struct zebra_ns *zns; - struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id); + struct zebra_vrf *zvrf = zvrf_info_lookup(ifp->vrf); /* case interface populate before vrf enabled */ if (zvrf->zns) @@ -558,7 +558,8 @@ void if_add_update(struct interface *ifp) zlog_debug( "interface %s vrf %u index %d is shutdown. " "Won't wake it up.", - ifp->name, ifp->vrf_id, ifp->ifindex); + ifp->name, vrf_to_id(ifp->vrf), + ifp->ifindex); return; } @@ -567,12 +568,13 @@ void if_add_update(struct interface *ifp) if (IS_ZEBRA_DEBUG_KERNEL) zlog_debug( "interface %s vrf %u index %d becomes active.", - ifp->name, ifp->vrf_id, ifp->ifindex); + ifp->name, vrf_to_id(ifp->vrf), ifp->ifindex); } else { if (IS_ZEBRA_DEBUG_KERNEL) zlog_debug("interface %s vrf %u index %d is added.", - ifp->name, ifp->vrf_id, ifp->ifindex); + ifp->name, vrf_to_id(ifp->vrf), + ifp->ifindex); } } @@ -714,7 +716,7 @@ void if_delete_update(struct interface *ifp) flog_err( EC_LIB_INTERFACE, "interface %s vrf %u index %d is still up while being deleted.", - ifp->name, ifp->vrf_id, ifp->ifindex); + ifp->name, vrf_to_id(ifp->vrf), ifp->ifindex); return; } @@ -726,7 +728,7 @@ void if_delete_update(struct interface *ifp) if (IS_ZEBRA_DEBUG_KERNEL) zlog_debug("interface %s vrf %u index %d is now inactive.", - ifp->name, ifp->vrf_id, ifp->ifindex); + ifp->name, vrf_to_id(ifp->vrf), ifp->ifindex); /* Delete connected routes from the kernel. */ if_delete_connected(ifp); @@ -750,7 +752,7 @@ void if_delete_update(struct interface *ifp) * occur with this implementation whereas it is not possible with * vrf-lite). */ - if (ifp->vrf_id && !vrf_is_backend_netns()) + if (ifp->vrf->vrf_id && !vrf_is_backend_netns()) if_handle_vrf_change(ifp, VRF_DEFAULT); /* Reset some zebra interface params to default values. */ @@ -770,7 +772,7 @@ 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; + old_vrf_id = vrf_to_id(ifp->vrf); /* Uninstall connected routes. */ if_uninstall_connected(ifp); @@ -801,9 +803,9 @@ void if_handle_vrf_change(struct interface *ifp, vrf_id_t vrf_id) */ if (IS_ZEBRA_DEBUG_RIB_DETAILED) zlog_debug("%u: IF %s VRF change, scheduling RIB processing", - ifp->vrf_id, ifp->name); + vrf_to_id(ifp->vrf), ifp->name); rib_update(old_vrf_id, RIB_UPDATE_IF_CHANGE); - rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE); + rib_update(vrf_to_id(ifp->vrf), RIB_UPDATE_IF_CHANGE); } static void ipv6_ll_address_to_mac(struct in6_addr *address, uint8_t *mac) @@ -821,7 +823,7 @@ void if_nbr_mac_to_ipv4ll_neigh_update(struct interface *ifp, struct in6_addr *address, int add) { - struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id); + struct zebra_vrf *zvrf = zvrf_info_lookup(ifp->vrf); struct zebra_if *zif = ifp->info; char buf[16] = "169.254.0.1"; struct in_addr ipv4_ll; @@ -917,7 +919,7 @@ void if_up(struct interface *ifp) { struct zebra_if *zif; struct interface *link_if; - struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id); + struct zebra_vrf *zvrf = zvrf_info_lookup(ifp->vrf); zif = ifp->info; zif->up_count++; @@ -948,8 +950,8 @@ void if_up(struct interface *ifp) if (IS_ZEBRA_DEBUG_RIB_DETAILED) zlog_debug("%u: IF %s up, scheduling RIB processing", - ifp->vrf_id, ifp->name); - rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE); + vrf_to_id(ifp->vrf), ifp->name); + rib_update(vrf_to_id(ifp->vrf), RIB_UPDATE_IF_CHANGE); /* Handle interface up for specific types for EVPN. Non-VxLAN interfaces * are checked to see if (remote) neighbor entries need to be installed @@ -974,7 +976,7 @@ void if_down(struct interface *ifp) { struct zebra_if *zif; struct interface *link_if; - struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id); + struct zebra_vrf *zvrf = zvrf_info_lookup(ifp->vrf); zif = ifp->info; zif->down_count++; @@ -1006,8 +1008,8 @@ void if_down(struct interface *ifp) if (IS_ZEBRA_DEBUG_RIB_DETAILED) zlog_debug("%u: IF %s down, scheduling RIB processing", - ifp->vrf_id, ifp->name); - rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE); + vrf_to_id(ifp->vrf), ifp->name); + rib_update(vrf_to_id(ifp->vrf), RIB_UPDATE_IF_CHANGE); if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(ifp); @@ -1308,7 +1310,7 @@ static void if_dump_vty(struct vty *vty, struct interface *ifp) zebra_ptm_show_status(vty, ifp); - vrf = vrf_lookup_by_id(ifp->vrf_id); + vrf = ifp->vrf; vty_out(vty, " vrf: %s\n", vrf->name); if (ifp->desc) @@ -3134,9 +3136,9 @@ static int if_config_write(struct vty *vty) struct vrf *vrf; if_data = ifp->info; - vrf = vrf_lookup_by_id(ifp->vrf_id); + vrf = ifp->vrf; - if (ifp->vrf_id == VRF_DEFAULT) + if (vrf->vrf_id == VRF_DEFAULT) vty_frame(vty, "interface %s\n", ifp->name); else vty_frame(vty, "interface %s vrf %s\n", diff --git a/zebra/ioctl.c b/zebra/ioctl.c index 8202e076a..628be6563 100644 --- a/zebra/ioctl.c +++ b/zebra/ioctl.c @@ -142,7 +142,8 @@ void if_get_metric(struct interface *ifp) ifreq_set_name(&ifreq, ifp); - if (vrf_if_ioctl(SIOCGIFMETRIC, (caddr_t)&ifreq, ifp->vrf_id) < 0) + if (vrf_if_ioctl(SIOCGIFMETRIC, (caddr_t)&ifreq, + vrf_to_id(ifp->vrf)) < 0) return; ifp->metric = ifreq.ifr_metric; if (ifp->metric == 0) @@ -160,7 +161,8 @@ void if_get_mtu(struct interface *ifp) ifreq_set_name(&ifreq, ifp); #if defined(SIOCGIFMTU) - if (vrf_if_ioctl(SIOCGIFMTU, (caddr_t)&ifreq, ifp->vrf_id) < 0) { + if (vrf_if_ioctl(SIOCGIFMTU, (caddr_t)&ifreq, + vrf_to_id(ifp->vrf)) < 0) { zlog_info("Can't lookup mtu by ioctl(SIOCGIFMTU)"); ifp->mtu6 = ifp->mtu = -1; return; @@ -427,7 +429,7 @@ void if_get_flags(struct interface *ifp) ifreq_set_name(&ifreq, ifp); - ret = vrf_if_ioctl(SIOCGIFFLAGS, (caddr_t)&ifreq, ifp->vrf_id); + ret = vrf_if_ioctl(SIOCGIFFLAGS, (caddr_t)&ifreq, vrf_to_id(ifp->vrf)); if (ret < 0) { flog_err_sys(EC_LIB_SYSTEM_CALL, "vrf_if_ioctl(SIOCGIFFLAGS) failed: %s", @@ -477,7 +479,7 @@ int if_set_flags(struct interface *ifp, uint64_t flags) ifreq.ifr_flags = ifp->flags; ifreq.ifr_flags |= flags; - ret = vrf_if_ioctl(SIOCSIFFLAGS, (caddr_t)&ifreq, ifp->vrf_id); + ret = vrf_if_ioctl(SIOCSIFFLAGS, (caddr_t)&ifreq, vrf_to_id(ifp->vrf)); if (ret < 0) { zlog_info("can't set interface flags"); @@ -498,7 +500,7 @@ int if_unset_flags(struct interface *ifp, uint64_t flags) ifreq.ifr_flags = ifp->flags; ifreq.ifr_flags &= ~flags; - ret = vrf_if_ioctl(SIOCSIFFLAGS, (caddr_t)&ifreq, ifp->vrf_id); + ret = vrf_if_ioctl(SIOCSIFFLAGS, (caddr_t)&ifreq, vrf_to_id(ifp->vrf)); if (ret < 0) { zlog_info("can't unset interface flags"); diff --git a/zebra/redistribute.c b/zebra/redistribute.c index b13f1170c..7b3332e58 100644 --- a/zebra/redistribute.c +++ b/zebra/redistribute.c @@ -402,7 +402,7 @@ void zebra_interface_up_update(struct interface *ifp) if (IS_ZEBRA_DEBUG_EVENT) zlog_debug("MESSAGE: ZEBRA_INTERFACE_UP %s(%u)", - ifp->name, ifp->vrf_id); + ifp->name, vrf_to_id(ifp->vrf)); if (ifp->ptm_status || !ifp->ptm_enable) { for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, @@ -422,7 +422,7 @@ void zebra_interface_down_update(struct interface *ifp) if (IS_ZEBRA_DEBUG_EVENT) zlog_debug("MESSAGE: ZEBRA_INTERFACE_DOWN %s(%u)", - ifp->name, ifp->vrf_id); + ifp->name, vrf_to_id(ifp->vrf)); for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, client)) { zsend_interface_update(ZEBRA_INTERFACE_DOWN, client, ifp); @@ -437,7 +437,7 @@ void zebra_interface_add_update(struct interface *ifp) if (IS_ZEBRA_DEBUG_EVENT) zlog_debug("MESSAGE: ZEBRA_INTERFACE_ADD %s(%u)", ifp->name, - ifp->vrf_id); + vrf_to_id(ifp->vrf)); for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, client)) { client->ifadd_cnt++; @@ -453,7 +453,7 @@ void zebra_interface_delete_update(struct interface *ifp) if (IS_ZEBRA_DEBUG_EVENT) zlog_debug("MESSAGE: ZEBRA_INTERFACE_DELETE %s(%u)", - ifp->name, ifp->vrf_id); + ifp->name, vrf_to_id(ifp->vrf)); for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, client)) { client->ifdel_cnt++; @@ -475,7 +475,7 @@ void zebra_interface_address_add_update(struct interface *ifp, p = ifc->address; zlog_debug("MESSAGE: ZEBRA_INTERFACE_ADDRESS_ADD %s on %s(%u)", prefix2str(p, buf, sizeof(buf)), ifp->name, - ifp->vrf_id); + vrf_to_id(ifp->vrf)); } if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL)) @@ -509,7 +509,7 @@ void zebra_interface_address_delete_update(struct interface *ifp, p = ifc->address; zlog_debug("MESSAGE: ZEBRA_INTERFACE_ADDRESS_DELETE %s on %s(%u)", prefix2str(p, buf, sizeof(buf)), - ifp->name, ifp->vrf_id); + ifp->name, vrf_to_id(ifp->vrf)); } zebra_vxlan_add_del_gw_macip(ifp, ifc->address, 0); @@ -535,7 +535,7 @@ void zebra_interface_vrf_update_del(struct interface *ifp, vrf_id_t new_vrf_id) if (IS_ZEBRA_DEBUG_EVENT) zlog_debug( "MESSAGE: ZEBRA_INTERFACE_VRF_UPDATE/DEL %s VRF Id %u -> %u", - ifp->name, ifp->vrf_id, new_vrf_id); + ifp->name, vrf_to_id(ifp->vrf), new_vrf_id); for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, client)) { /* Need to delete if the client is not interested in the new @@ -558,7 +558,7 @@ void zebra_interface_vrf_update_add(struct interface *ifp, vrf_id_t old_vrf_id) if (IS_ZEBRA_DEBUG_EVENT) zlog_debug( "MESSAGE: ZEBRA_INTERFACE_VRF_UPDATE/ADD %s VRF Id %u -> %u", - ifp->name, old_vrf_id, ifp->vrf_id); + ifp->name, old_vrf_id, vrf_to_id(ifp->vrf)); for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, client)) { /* Need to add if the client is interested in the new VRF. */ @@ -816,7 +816,7 @@ void zebra_interface_parameters_update(struct interface *ifp) if (IS_ZEBRA_DEBUG_EVENT) zlog_debug("MESSAGE: ZEBRA_INTERFACE_LINK_PARAMS %s(%u)", - ifp->name, ifp->vrf_id); + ifp->name, vrf_to_id(ifp->vrf)); for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, client)) zsend_interface_link_params(client, ifp); diff --git a/zebra/router-id.c b/zebra/router-id.c index 569ffbab4..b5a8860c4 100644 --- a/zebra/router-id.c +++ b/zebra/router-id.c @@ -122,7 +122,7 @@ void router_id_add_address(struct connected *ifc) struct prefix before; struct prefix after; struct zserv *client; - struct zebra_vrf *zvrf = vrf_info_get(ifc->ifp->vrf_id); + struct zebra_vrf *zvrf = vrf_info_get(vrf_to_id(ifc->ifp->vrf)); if (router_id_bad_address(ifc)) return; @@ -154,7 +154,7 @@ void router_id_del_address(struct connected *ifc) struct prefix before; struct listnode *node; struct zserv *client; - struct zebra_vrf *zvrf = vrf_info_get(ifc->ifp->vrf_id); + struct zebra_vrf *zvrf = vrf_info_get(vrf_to_id(ifc->ifp->vrf)); if (router_id_bad_address(ifc)) return; diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 92c78a4cb..1624eea39 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -545,7 +545,7 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id, zebra_ns_lookup(ns_id), index); if (ifp) - nh_vrf_id = ifp->vrf_id; + nh_vrf_id = vrf_to_id(ifp->vrf); } nh.vrf_id = nh_vrf_id; @@ -605,7 +605,7 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id, zebra_ns_lookup(ns_id), index); if (ifp) - nh_vrf_id = ifp->vrf_id; + nh_vrf_id = vrf_to_id(ifp->vrf); else { flog_warn( EC_ZEBRA_UNKNOWN_INTERFACE, @@ -1889,7 +1889,7 @@ static int netlink_vxlan_flood_list_update(struct interface *ifp, char buf[256]; } req; uint8_t dst_mac[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; - struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id); + struct zebra_vrf *zvrf = zvrf_info_lookup(ifp->vrf); zns = zvrf->zns; memset(&req, 0, sizeof(req)); @@ -2287,7 +2287,7 @@ static int netlink_macfdb_update(struct interface *ifp, vlanid_t vid, int vid_present = 0; char vid_buf[20]; char dst_buf[30]; - struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id); + struct zebra_vrf *zvrf = zvrf_info_lookup(ifp->vrf); zns = zvrf->zns; zif = ifp->info; @@ -2631,7 +2631,7 @@ int netlink_neigh_read_specific_ip(struct ipaddr *ip, { int ret = 0; struct zebra_ns *zns; - struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(vlan_if->vrf_id); + struct zebra_vrf *zvrf = zvrf_info_lookup(vlan_if->vrf); char buf[INET6_ADDRSTRLEN]; struct zebra_dplane_info dp_info; @@ -2644,7 +2644,7 @@ int netlink_neigh_read_specific_ip(struct ipaddr *ip, __PRETTY_FUNCTION__, vlan_if->name, vlan_if->ifindex, ipaddr2str(ip, buf, sizeof(buf)), - vlan_if->vrf_id); + vrf_to_id(vlan_if->vrf)); ret = netlink_request_specific_neigh_in_vlan(zns, RTM_GETNEIGH, ip, vlan_if->ifindex); @@ -2709,7 +2709,7 @@ static int netlink_neigh_update2(struct interface *ifp, struct ipaddr *ip, struct zebra_ns *zns; char buf[INET6_ADDRSTRLEN]; char buf2[ETHER_ADDR_STRLEN]; - struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id); + struct zebra_vrf *zvrf = zvrf_info_lookup(ifp->vrf); zns = zvrf->zns; memset(&req, 0, sizeof(req)); diff --git a/zebra/rtadv.c b/zebra/rtadv.c index e181b495b..d591e230c 100644 --- a/zebra/rtadv.c +++ b/zebra/rtadv.c @@ -532,7 +532,7 @@ static int rtadv_timer(struct thread *thread) static void rtadv_process_solicit(struct interface *ifp) { - struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id); + struct zebra_vrf *zvrf = zvrf_info_lookup(ifp->vrf); assert(zvrf); rtadv_send_packet(rtadv_get_socket(zvrf), ifp); @@ -882,7 +882,7 @@ static void ipv6_nd_suppress_ra_set(struct interface *ifp, struct zebra_vrf *zvrf; zif = ifp->info; - zvrf = vrf_info_lookup(ifp->vrf_id); + zvrf = zvrf_info_lookup(ifp->vrf); if (status == RA_SUPPRESS) { /* RA is currently enabled */ @@ -955,11 +955,11 @@ static void zebra_interface_radv_set(ZAPI_HANDLER_ARGS, int enable) zebra_route_string(client->proto)); return; } - if (ifp->vrf_id != zvrf_id(zvrf)) { + if (ifp->vrf != zvrf->vrf) { zlog_debug( "%u: IF %u RA %s client %s - VRF mismatch, IF VRF %u", zvrf_id(zvrf), ifindex, enable ? "enable" : "disable", - zebra_route_string(client->proto), ifp->vrf_id); + zebra_route_string(client->proto), vrf_to_id(ifp->vrf)); return; } @@ -1056,7 +1056,7 @@ DEFUN (ipv6_nd_ra_interval_msec, struct zebra_if *zif = ifp->info; struct zebra_vrf *zvrf; - zvrf = vrf_info_lookup(ifp->vrf_id); + zvrf = zvrf_info_lookup(ifp->vrf); interval = strtoul(argv[idx_number]->arg, NULL, 10); if ((zif->rtadv.AdvDefaultLifetime != -1 @@ -1094,7 +1094,7 @@ DEFUN (ipv6_nd_ra_interval, struct zebra_if *zif = ifp->info; struct zebra_vrf *zvrf; - zvrf = vrf_info_lookup(ifp->vrf_id); + zvrf = zvrf_info_lookup(ifp->vrf); interval = strtoul(argv[idx_number]->arg, NULL, 10); if ((zif->rtadv.AdvDefaultLifetime != -1 @@ -1133,7 +1133,7 @@ DEFUN (no_ipv6_nd_ra_interval, struct zebra_if *zif = ifp->info; struct zebra_vrf *zvrf = NULL; - zvrf = vrf_info_lookup(ifp->vrf_id); + zvrf = zvrf_info_lookup(ifp->vrf); if (zif->rtadv.MaxRtrAdvInterval % 1000) zvrf->rtadv.adv_msec_if_count--; diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index f4347e5ac..2f41f7133 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -165,7 +165,7 @@ int zsend_interface_add(struct zserv *client, struct interface *ifp) { struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ); - zclient_create_header(s, ZEBRA_INTERFACE_ADD, ifp->vrf_id); + zclient_create_header(s, ZEBRA_INTERFACE_ADD, vrf_to_id(ifp->vrf)); zserv_encode_interface(s, ifp); client->ifadd_cnt++; @@ -177,7 +177,7 @@ int zsend_interface_delete(struct zserv *client, struct interface *ifp) { struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ); - zclient_create_header(s, ZEBRA_INTERFACE_DELETE, ifp->vrf_id); + zclient_create_header(s, ZEBRA_INTERFACE_DELETE, vrf_to_id(ifp->vrf)); zserv_encode_interface(s, ifp); client->ifdel_cnt++; @@ -217,7 +217,8 @@ int zsend_interface_link_params(struct zserv *client, struct interface *ifp) return 0; } - zclient_create_header(s, ZEBRA_INTERFACE_LINK_PARAMS, ifp->vrf_id); + zclient_create_header(s, ZEBRA_INTERFACE_LINK_PARAMS, + vrf_to_id(ifp->vrf)); /* Add Interface Index */ stream_putl(s, ifp->ifindex); @@ -279,7 +280,7 @@ int zsend_interface_address(int cmd, struct zserv *client, struct prefix *p; struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ); - zclient_create_header(s, cmd, ifp->vrf_id); + zclient_create_header(s, cmd, vrf_to_id(ifp->vrf)); stream_putl(s, ifp->ifindex); /* Interface address flag. */ @@ -321,7 +322,7 @@ static int zsend_interface_nbr_address(int cmd, struct zserv *client, struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ); struct prefix *p; - zclient_create_header(s, cmd, ifp->vrf_id); + zclient_create_header(s, cmd, vrf_to_id(ifp->vrf)); stream_putl(s, ifp->ifindex); /* Prefix information. */ @@ -429,7 +430,8 @@ int zsend_interface_vrf_update(struct zserv *client, struct interface *ifp, { struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ); - zclient_create_header(s, ZEBRA_INTERFACE_VRF_UPDATE, ifp->vrf_id); + zclient_create_header(s, ZEBRA_INTERFACE_VRF_UPDATE, + vrf_to_id(ifp->vrf)); /* Fill in the name of the interface and its new VRF (id) */ stream_put(s, ifp->name, INTERFACE_NAMSIZ); @@ -504,7 +506,7 @@ int zsend_interface_update(int cmd, struct zserv *client, struct interface *ifp) { struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ); - zclient_create_header(s, cmd, ifp->vrf_id); + zclient_create_header(s, cmd, vrf_to_id(ifp->vrf)); zserv_encode_interface(s, ifp); if (cmd == ZEBRA_INTERFACE_UP) diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c index 1707d3a68..3d64c201f 100644 --- a/zebra/zebra_dplane.c +++ b/zebra/zebra_dplane.c @@ -1916,7 +1916,7 @@ enum zebra_dplane_result dplane_intf_addr_set(const struct interface *ifp, struct prefix_ipv4 *p; p = (struct prefix_ipv4 *)ifc->address; - rib_lookup_and_pushup(p, ifp->vrf_id); + rib_lookup_and_pushup(p, ifp->vrf->vrf_id); } #endif @@ -1947,7 +1947,7 @@ static enum zebra_dplane_result intf_addr_update_internal( prefix2str(ifc->address, addr_str, sizeof(addr_str)); zlog_debug("init intf ctx %s: idx %d, addr %u:%s", - dplane_op2str(op), ifp->ifindex, ifp->vrf_id, + dplane_op2str(op), ifp->ifindex, ifp->vrf->vrf_id, addr_str); } @@ -1955,9 +1955,9 @@ static enum zebra_dplane_result intf_addr_update_internal( ctx->zd_op = op; ctx->zd_status = ZEBRA_DPLANE_REQUEST_SUCCESS; - ctx->zd_vrf_id = ifp->vrf_id; + ctx->zd_vrf_id = ifp->vrf->vrf_id; - zns = zebra_ns_lookup(ifp->vrf_id); + zns = zebra_ns_lookup(ifp->vrf->vrf_id); dplane_ctx_ns_init(ctx, zns, false); /* Init the interface-addr-specific area */ diff --git a/zebra/zebra_ptm.c b/zebra/zebra_ptm.c index 46f138552..636bceb98 100644 --- a/zebra/zebra_ptm.c +++ b/zebra/zebra_ptm.c @@ -522,7 +522,7 @@ static int zebra_ptm_handle_bfd_msg(void *arg, void *in_ctxt, } if (!strcmp(ZEBRA_PTM_INVALID_VRF, vrf_str) && ifp) { - vrf_id = ifp->vrf_id; + vrf_id = vrf_to_id(ifp->vrf); } else { vrf_id = vrf_name_to_id(vrf_str); } diff --git a/zebra/zebra_vrf.h b/zebra/zebra_vrf.h index 972fe381c..1b8766950 100644 --- a/zebra/zebra_vrf.h +++ b/zebra/zebra_vrf.h @@ -193,6 +193,15 @@ static inline vrf_id_t zvrf_id(struct zebra_vrf *zvrf) return zvrf->vrf->vrf_id; } +static inline struct zebra_vrf *zvrf_info_lookup(struct vrf *vrf) +{ + struct zebra_vrf *zvrf = NULL; + + if (vrf) + zvrf = (struct zebra_vrf *)vrf->info; + return zvrf; +} + static inline const char *zvrf_ns_name(struct zebra_vrf *zvrf) { if (!zvrf->vrf || !zvrf->vrf->ns_ctxt) diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c index 077c1ff8f..99e2f9b17 100644 --- a/zebra/zebra_vxlan.c +++ b/zebra/zebra_vxlan.c @@ -2353,7 +2353,7 @@ static void zvni_process_neigh_on_local_mac_change(zebra_vni_t *zvni, struct zebra_vrf *zvrf = NULL; char buf[ETHER_ADDR_STRLEN]; - zvrf = vrf_info_lookup(zvni->vxlan_if->vrf_id); + zvrf = zvrf_info_lookup(zvni->vxlan_if->vrf); if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug("Processing neighbors on local MAC %s %s, VNI %u", @@ -2612,7 +2612,7 @@ struct interface *zebra_get_vrr_intf_for_svi(struct interface *ifp) struct interface *tmp_if = NULL; struct zebra_if *zif = NULL; - zvrf = vrf_info_lookup(ifp->vrf_id); + zvrf = zvrf_info_lookup(ifp->vrf); assert(zvrf); FOR_ALL_INTERFACES (zvrf->vrf, tmp_if) { @@ -2716,10 +2716,10 @@ static int zvni_advertise_subnet(zebra_vni_t *zvni, struct interface *ifp, apply_mask(&p); if (advertise) - ip_prefix_send_to_client(ifp->vrf_id, &p, + ip_prefix_send_to_client(vrf_to_id(ifp->vrf), &p, ZEBRA_IP_PREFIX_ROUTE_ADD); else - ip_prefix_send_to_client(ifp->vrf_id, &p, + ip_prefix_send_to_client(vrf_to_id(ifp->vrf), &p, ZEBRA_IP_PREFIX_ROUTE_DEL); } return 0; @@ -2838,7 +2838,7 @@ static int zvni_gw_macip_del(struct interface *ifp, zebra_vni_t *zvni, if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug( "%u:SVI %s(%u) VNI %u, sending GW MAC %s IP %s del to BGP", - ifp->vrf_id, ifp->name, ifp->ifindex, zvni->vni, + vrf_to_id(ifp->vrf), ifp->name, ifp->ifindex, zvni->vni, prefix_mac2str(&(n->emac), buf1, sizeof(buf1)), ipaddr2str(ip, buf2, sizeof(buf2))); @@ -3025,11 +3025,11 @@ static int zvni_local_neigh_update(zebra_vni_t *zvni, } } - zvrf = vrf_info_lookup(zvni->vxlan_if->vrf_id); + zvrf = zvrf_info_lookup(zvni->vxlan_if->vrf); if (!zvrf) { if (IS_ZEBRA_DEBUG_VXLAN) - zlog_debug("\tUnable to find vrf for: %d", - zvni->vxlan_if->vrf_id); + zlog_debug("\tUnable to find vrf for: %s", + zvni->vxlan_if->vrf->name); return -1; } @@ -4086,8 +4086,9 @@ static void zvni_build_hash_table(void) vlan_if = zvni_map_to_svi(vxl->access_vlan, zif->brslave_info.br_if); if (vlan_if) { - zvni->vrf_id = vlan_if->vrf_id; - zl3vni = zl3vni_from_vrf(vlan_if->vrf_id); + zvni->vrf_id = vrf_to_id(vlan_if->vrf); + zl3vni = zl3vni_from_vrf( + vrf_to_id(vlan_if->vrf)); if (zl3vni) listnode_add_sort(zl3vni->l2vnis, zvni); } @@ -5240,7 +5241,7 @@ static void process_remote_macip_add(vni_t vni, return; } - zvrf = vrf_info_lookup(zvni->vxlan_if->vrf_id); + zvrf = zvrf_info_lookup(zvni->vxlan_if->vrf); if (!zvrf) return; @@ -5568,7 +5569,7 @@ static void process_remote_macip_del(vni_t vni, if (!mac && !n) return; - zvrf = vrf_info_lookup(zvni->vxlan_if->vrf_id); + zvrf = zvrf_info_lookup(zvni->vxlan_if->vrf); /* Ignore the delete if this mac is a gateway mac-ip */ if (CHECK_FLAG(mac->flags, ZEBRA_MAC_LOCAL) @@ -7255,7 +7256,7 @@ int zebra_vxlan_handle_kernel_neigh_del(struct interface *ifp, return 0; } - zvrf = vrf_info_lookup(zvni->vxlan_if->vrf_id); + zvrf = zvrf_info_lookup(zvni->vxlan_if->vrf); if (!zvrf) { zlog_debug("%s: VNI %u vrf lookup failed.", __PRETTY_FUNCTION__, zvni->vni); @@ -7678,11 +7679,11 @@ int zebra_vxlan_local_mac_add_update(struct interface *ifp, return -1; } - zvrf = vrf_info_lookup(zvni->vxlan_if->vrf_id); + zvrf = zvrf_info_lookup(zvni->vxlan_if->vrf); if (!zvrf) { if (IS_ZEBRA_DEBUG_VXLAN) - zlog_debug("\tNo Vrf found for vrf_id: %d", - zvni->vxlan_if->vrf_id); + zlog_debug("\tNo Vrf found for vrf_id: %s", + zvni->vxlan_if->vrf->name); return -1; } @@ -8214,10 +8215,10 @@ int zebra_vxlan_svi_up(struct interface *ifp, struct interface *link_if) zlog_debug( "SVI %s(%u) VNI %u VRF %s is UP, installing neighbors", ifp->name, ifp->ifindex, zvni->vni, - vrf_id_to_name(ifp->vrf_id)); + vrf_to_name(ifp->vrf)); /* update the vrf information for l2-vni and inform bgp */ - zvni->vrf_id = ifp->vrf_id; + zvni->vrf_id = vrf_to_id(ifp->vrf); zvni_send_add_to_client(zvni); /* Install any remote neighbors for this VNI. */ @@ -8343,8 +8344,8 @@ int zebra_vxlan_if_up(struct interface *ifp) vlan_if = zvni_map_to_svi(vxl->access_vlan, zif->brslave_info.br_if); if (vlan_if) { - zvni->vrf_id = vlan_if->vrf_id; - zl3vni = zl3vni_from_vrf(vlan_if->vrf_id); + zvni->vrf_id = vrf_to_id(vlan_if->vrf); + zl3vni = zl3vni_from_vrf(vrf_to_id(vlan_if->vrf)); if (zl3vni) listnode_add_sort(zl3vni->l2vnis, zvni); } @@ -8672,8 +8673,8 @@ int zebra_vxlan_if_add(struct interface *ifp) vlan_if = zvni_map_to_svi(vxl->access_vlan, zif->brslave_info.br_if); if (vlan_if) { - zvni->vrf_id = vlan_if->vrf_id; - zl3vni = zl3vni_from_vrf(vlan_if->vrf_id); + zvni->vrf_id = vrf_to_id(vlan_if->vrf); + zl3vni = zl3vni_from_vrf(vrf_to_id(vlan_if->vrf)); if (zl3vni) listnode_add_sort(zl3vni->l2vnis, zvni); } @@ -8690,7 +8691,7 @@ int zebra_vxlan_if_add(struct interface *ifp) zlog_debug( "Add L2-VNI %u VRF %s intf %s(%u) VLAN %u local IP %s mcast_grp %s master %u", vni, - vlan_if ? vrf_id_to_name(vlan_if->vrf_id) + vlan_if ? vrf_to_name(vlan_if->vrf) : VRF_DEFAULT_NAME, ifp->name, ifp->ifindex, vxl->access_vlan, addr_buf1, addr_buf2, |