diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2018-02-08 09:12:12 -0500 |
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2018-02-08 19:35:53 -0500 |
| commit | 4a7371e9e21569eee0e728f64ea06870d1aafa5e (patch) | |
| tree | 15d90068bac9ca5259e6e63b5df7cac7747df08f /zebra/rt_netlink.c | |
| parent | a97e5c1a8075fcab9d9e0edb453167752fc3e2b9 (diff) | |
*: Track vrfs per nexthop not per route entry
Track the vfrs on a per nexthop basis instead
of on a per route entry basis.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'zebra/rt_netlink.c')
| -rw-r--r-- | zebra/rt_netlink.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 20cc292e11..b8011c2a76 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -443,10 +443,10 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl, if (ifp) nh_vrf_id = ifp->vrf_id; } + nh.vrf_id = nh_vrf_id; - rib_add(afi, SAFI_UNICAST, vrf_id, nh_vrf_id, proto, - 0, flags, &p, NULL, &nh, table, metric, - mtu, distance, tag); + rib_add(afi, SAFI_UNICAST, vrf_id, proto, 0, flags, &p, + NULL, &nh, table, metric, mtu, distance, tag); } else { /* This is a multipath route */ @@ -463,13 +463,13 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl, re->metric = metric; re->mtu = mtu; re->vrf_id = vrf_id; - re->nh_vrf_id = vrf_id; re->table = table; re->nexthop_num = 0; re->uptime = time(NULL); re->tag = tag; for (;;) { + vrf_id_t nh_vrf_id; if (len < (int)sizeof(*rtnh) || rtnh->rtnh_len > len) break; @@ -485,8 +485,17 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl, ifp = if_lookup_by_index(index, VRF_UNKNOWN); if (ifp) - re->nh_vrf_id = ifp->vrf_id; - } + nh_vrf_id = ifp->vrf_id; + else { + zlog_warn( + "%s: Unknown interface %u specified, defaulting to VRF_DEFAULT", + __PRETTY_FUNCTION__, + index); + nh_vrf_id = VRF_DEFAULT; + } + } else + nh_vrf_id = vrf_id; + gate = 0; if (rtnh->rtnh_len > sizeof(*rtnh)) { memset(tb, 0, sizeof(tb)); @@ -503,24 +512,27 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl, if (index) route_entry_nexthop_ipv4_ifindex_add( re, gate, - prefsrc, index); + prefsrc, index, + nh_vrf_id); else route_entry_nexthop_ipv4_add( re, gate, - prefsrc); + prefsrc, + nh_vrf_id); } else if (rtm->rtm_family == AF_INET6) { if (index) route_entry_nexthop_ipv6_ifindex_add( - re, gate, - index); + re, gate, index, + nh_vrf_id); else route_entry_nexthop_ipv6_add( - re, gate); + re, gate, + nh_vrf_id); } } else - route_entry_nexthop_ifindex_add(re, - index); + route_entry_nexthop_ifindex_add( + re, index, nh_vrf_id); len -= NLMSG_ALIGN(rtnh->rtnh_len); rtnh = RTNH_NEXT(rtnh); |
