diff options
| -rw-r--r-- | staticd/static_nht.c | 66 | ||||
| -rw-r--r-- | staticd/static_vrf.c | 6 | ||||
| -rw-r--r-- | staticd/static_zebra.c | 22 | ||||
| -rw-r--r-- | vtysh/vtysh.h | 2 | ||||
| -rw-r--r-- | zebra/if_netlink.c | 6 | ||||
| -rw-r--r-- | zebra/interface.c | 11 | ||||
| -rw-r--r-- | zebra/interface.h | 9 |
7 files changed, 82 insertions, 40 deletions
diff --git a/staticd/static_nht.c b/staticd/static_nht.c index c6e4587b6a..44f7fb79da 100644 --- a/staticd/static_nht.c +++ b/staticd/static_nht.c @@ -29,8 +29,8 @@ #include "static_zebra.h" #include "static_nht.h" -void static_nht_update(struct prefix *p, uint32_t nh_num, - afi_t afi, vrf_id_t vrf_id) +void static_nht_update(struct prefix *p, uint32_t nh_num, afi_t afi, + vrf_id_t nh_vrf_id) { struct route_table *stable; struct static_route *si; @@ -40,41 +40,47 @@ void static_nht_update(struct prefix *p, uint32_t nh_num, bool orig; bool reinstall; - vrf = vrf_lookup_by_id(vrf_id); + RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) { + svrf = vrf->info; + if (!svrf) + continue; - if (!vrf || !vrf->info) - return; + stable = static_vrf_static_table(afi, SAFI_UNICAST, svrf); + if (!stable) + continue; - svrf = vrf->info; - stable = static_vrf_static_table(afi, SAFI_UNICAST, svrf); - if (!stable) - return; + for (rn = route_top(stable); rn; rn = route_next(rn)) { + reinstall = false; + for (si = rn->info; si; si = si->next) { + if (si->nh_vrf_id != nh_vrf_id) + continue; - for (rn = route_top(stable); rn; rn = route_next(rn)) { - reinstall = false; - for (si = rn->info; si; si = si->next) { - if (si->type != STATIC_IPV4_GATEWAY && - si->type != STATIC_IPV4_GATEWAY_IFNAME && - si->type != STATIC_IPV6_GATEWAY && - si->type != STATIC_IPV6_GATEWAY_IFNAME) - continue; + if (si->type != STATIC_IPV4_GATEWAY + && si->type != STATIC_IPV4_GATEWAY_IFNAME + && si->type != STATIC_IPV6_GATEWAY + && si->type != STATIC_IPV6_GATEWAY_IFNAME) + continue; - orig = si->nh_valid; - if (p->family == AF_INET && - p->u.prefix4.s_addr == si->addr.ipv4.s_addr) - si->nh_valid = !!nh_num; + orig = si->nh_valid; + if (p->family == AF_INET + && p->u.prefix4.s_addr + == si->addr.ipv4.s_addr) + si->nh_valid = !!nh_num; - if (p->family == AF_INET6 && - memcmp(&p->u.prefix6, &si->addr.ipv6, 16) == 0) - si->nh_valid = !!nh_num; + if (p->family == AF_INET6 + && memcmp(&p->u.prefix6, &si->addr.ipv6, 16) + == 0) + si->nh_valid = !!nh_num; - if (orig != si->nh_valid) - reinstall = true; + if (orig != si->nh_valid) + reinstall = true; - if (reinstall) { - static_zebra_route_add(rn, si, vrf_id, - SAFI_UNICAST, true); - reinstall = false; + if (reinstall) { + static_zebra_route_add( + rn, si, vrf->vrf_id, + SAFI_UNICAST, true); + reinstall = false; + } } } } diff --git a/staticd/static_vrf.c b/staticd/static_vrf.c index d33c1539c8..ad143209ee 100644 --- a/staticd/static_vrf.c +++ b/staticd/static_vrf.c @@ -153,12 +153,18 @@ static int static_vrf_config_write(struct vty *vty) struct vrf *vrf; RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) { + if (vrf->vrf_id != VRF_DEFAULT) + vty_frame(vty, "vrf %s\n", vrf->name); + static_config(vty, vrf->info, AFI_IP, SAFI_UNICAST, "ip route"); static_config(vty, vrf->info, AFI_IP, SAFI_MULTICAST, "ip mroute"); static_config(vty, vrf->info, AFI_IP6, SAFI_UNICAST, "ipv6 route"); + + if (vrf->vrf_id != VRF_DEFAULT) + vty_endframe(vty, "!\n"); } return 0; diff --git a/staticd/static_zebra.c b/staticd/static_zebra.c index a87dc074df..4692dc00d7 100644 --- a/staticd/static_zebra.c +++ b/staticd/static_zebra.c @@ -35,6 +35,7 @@ #include "nexthop.h" #include "nexthop_group.h" #include "hash.h" +#include "jhash.h" #include "static_vrf.h" #include "static_routes.h" @@ -180,6 +181,9 @@ static void zebra_connected(struct zclient *zclient) struct static_nht_data { struct prefix *nh; + + vrf_id_t nh_vrf_id; + uint32_t refcount; uint8_t nh_num; }; @@ -201,13 +205,18 @@ static int static_zebra_nexthop_update(int command, struct zclient *zclient, memset(&lookup, 0, sizeof(lookup)); lookup.nh = &nhr.prefix; + lookup.nh_vrf_id = vrf_id; nhtd = hash_lookup(static_nht_hash, &lookup); - if (nhtd) + + if (nhtd) { nhtd->nh_num = nhr.nexthop_num; + static_nht_update(&nhr.prefix, nhr.nexthop_num, afi, + nhtd->nh_vrf_id); + } else + zlog_err("No nhtd?"); - static_nht_update(&nhr.prefix, nhr.nexthop_num, afi, vrf_id); return 1; } @@ -219,8 +228,10 @@ static void static_zebra_capabilities(struct zclient_capabilities *cap) static unsigned int static_nht_hash_key(void *data) { struct static_nht_data *nhtd = data; + unsigned int key = 0; - return prefix_hash_key(nhtd->nh); + key = prefix_hash_key(nhtd->nh); + return jhash_1word(nhtd->nh_vrf_id, key); } static int static_nht_hash_cmp(const void *d1, const void *d2) @@ -228,6 +239,9 @@ static int static_nht_hash_cmp(const void *d1, const void *d2) const struct static_nht_data *nhtd1 = d1; const struct static_nht_data *nhtd2 = d2; + if (nhtd1->nh_vrf_id != nhtd2->nh_vrf_id) + return 0; + return prefix_same(nhtd1->nh, nhtd2->nh); } @@ -242,6 +256,7 @@ static void *static_nht_hash_alloc(void *data) prefix_copy(new->nh, copy->nh); new->refcount = 0; new->nh_num = 0; + new->nh_vrf_id = copy->nh_vrf_id; return new; } @@ -293,6 +308,7 @@ void static_zebra_nht_register(struct static_route *si, bool reg) memset(&lookup, 0, sizeof(lookup)); lookup.nh = &p; + lookup.nh_vrf_id = si->nh_vrf_id; si->nh_registered = reg; diff --git a/vtysh/vtysh.h b/vtysh/vtysh.h index c8e4c025e0..5bff01a506 100644 --- a/vtysh/vtysh.h +++ b/vtysh/vtysh.h @@ -53,7 +53,7 @@ DECLARE_MGROUP(MVTYSH) #define VTYSH_RMAP VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_BGPD|VTYSH_ISISD|VTYSH_PIMD|VTYSH_EIGRPD|VTYSH_SHARPD #define VTYSH_INTERFACE VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_ISISD|VTYSH_PIMD|VTYSH_NHRPD|VTYSH_EIGRPD|VTYSH_BABELD|VTYSH_PBRD #define VTYSH_NS VTYSH_ZEBRA -#define VTYSH_VRF VTYSH_ZEBRA|VTYSH_PIMD +#define VTYSH_VRF VTYSH_ZEBRA|VTYSH_PIMD|VTYSH_STATICD enum vtysh_write_integrated { WRITE_INTEGRATED_UNSPECIFIED, diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c index a15d914243..0dcf5082a2 100644 --- a/zebra/if_netlink.c +++ b/zebra/if_netlink.c @@ -259,6 +259,8 @@ static void netlink_determine_zebra_iftype(char *kind, zebra_iftype_t *zif_type) *zif_type = ZEBRA_IF_VXLAN; else if (strcmp(kind, "macvlan") == 0) *zif_type = ZEBRA_IF_MACVLAN; + else if (strcmp(kind, "veth") == 0) + *zif_type = ZEBRA_IF_VETH; } #define parse_rtattr_nested(tb, max, rta) \ @@ -675,7 +677,7 @@ static int netlink_interface(struct nlmsghdr *h, ns_id_t ns_id, int startup) SET_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK); /* Update link. */ - zebra_if_update_link(ifp, link_ifindex); + zebra_if_update_link(ifp, link_ifindex, ns_id); /* Hardware type and address. */ ifp->ll_type = netlink_to_zebra_link_type(ifi->ifi_type); @@ -1262,7 +1264,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) ZEBRA_INTERFACE_VRF_LOOPBACK); /* Update link. */ - zebra_if_update_link(ifp, link_ifindex); + zebra_if_update_link(ifp, link_ifindex, ns_id); netlink_interface_update_hw_addr(tb, ifp); diff --git a/zebra/interface.c b/zebra/interface.c index 763931d350..32ee1a566a 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -1002,13 +1002,16 @@ void if_refresh(struct interface *ifp) if_get_flags(ifp); } -void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex) +void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex, + ns_id_t ns_id) { struct zebra_if *zif; + if (IS_ZEBRA_IF_VETH(ifp)) + return; zif = (struct zebra_if *)ifp->info; zif->link_ifindex = link_ifindex; - zif->link = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT), + zif->link = if_lookup_by_index_per_ns(zebra_ns_lookup(ns_id), link_ifindex); } @@ -1093,6 +1096,10 @@ static const char *zebra_ziftype_2str(zebra_iftype_t zif_type) return "VRF"; break; + case ZEBRA_IF_VETH: + return "VETH"; + break; + default: return "Unknown"; break; diff --git a/zebra/interface.h b/zebra/interface.h index 9634bfdb3f..956d430cf9 100644 --- a/zebra/interface.h +++ b/zebra/interface.h @@ -191,6 +191,7 @@ typedef enum { ZEBRA_IF_BRIDGE, /* bridge device */ ZEBRA_IF_VLAN, /* VLAN sub-interface */ ZEBRA_IF_MACVLAN, /* MAC VLAN interface*/ + ZEBRA_IF_VETH, /* VETH interface*/ } zebra_iftype_t; /* Zebra "slave" interface type */ @@ -312,7 +313,10 @@ static inline void zebra_if_set_ziftype(struct interface *ifp, #define IS_ZEBRA_IF_MACVLAN(ifp) \ (((struct zebra_if *)(ifp->info))->zif_type == ZEBRA_IF_MACVLAN) -#define IS_ZEBRA_IF_BRIDGE_SLAVE(ifp) \ +#define IS_ZEBRA_IF_VETH(ifp) \ + (((struct zebra_if *)(ifp->info))->zif_type == ZEBRA_IF_VETH) + +#define IS_ZEBRA_IF_BRIDGE_SLAVE(ifp) \ (((struct zebra_if *)(ifp->info))->zif_slave_type \ == ZEBRA_IF_SLAVE_BRIDGE) @@ -344,7 +348,8 @@ extern int if_subnet_add(struct interface *, struct connected *); extern int if_subnet_delete(struct interface *, struct connected *); extern int ipv6_address_configured(struct interface *ifp); extern void if_handle_vrf_change(struct interface *ifp, vrf_id_t vrf_id); -extern void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex); +extern void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex, + ns_id_t ns_id); extern void vrf_add_update(struct vrf *vrfp); |
