]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: Add nh_vrf_id to rib_add
authorDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 8 Jan 2018 15:21:09 +0000 (10:21 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 12 Jan 2018 14:20:36 +0000 (09:20 -0500)
Add to the rib_add function the ability to pass in the nexthops
vrf.

Additionally when we decode the netlink message from the linux
kernel, properly figure out the nexthops vrf_id.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
zebra/connected.c
zebra/kernel_socket.c
zebra/rib.h
zebra/rt_netlink.c
zebra/rtread_getmsg.c
zebra/zebra_rib.c

index 7b949c50416b943bfea95748e7d376e029392c85..d34fd9021a3e96eb48a264ae2083e7d68c438a39 100644 (file)
@@ -238,10 +238,12 @@ void connected_up(struct interface *ifp, struct connected *ifc)
                break;
        }
 
-       rib_add(afi, SAFI_UNICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT, 0, 0,
+       rib_add(afi, SAFI_UNICAST, ifp->vrf_id, ifp->vrf_id,
+               ZEBRA_ROUTE_CONNECT, 0, 0,
                &p, NULL, &nh, RT_TABLE_MAIN, ifp->metric, 0, 0, 0);
 
-       rib_add(afi, SAFI_MULTICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT, 0, 0,
+       rib_add(afi, SAFI_MULTICAST, ifp->vrf_id, ifp->vrf_id,
+               ZEBRA_ROUTE_CONNECT, 0, 0,
                &p, NULL, &nh, RT_TABLE_MAIN, ifp->metric, 0, 0, 0);
 
        if (IS_ZEBRA_DEBUG_RIB_DETAILED) {
index 9fd7bb1c246be1ba5795ba8796aeade5bb183e4e..ba028ed09cf64f47cd1112506583faddc893cff5 100644 (file)
@@ -1048,7 +1048,7 @@ void rtm_read(struct rt_msghdr *rtm)
 
                if (rtm->rtm_type == RTM_GET || rtm->rtm_type == RTM_ADD
                    || rtm->rtm_type == RTM_CHANGE)
-                       rib_add(AFI_IP, SAFI_UNICAST, VRF_DEFAULT,
+                       rib_add(AFI_IP, SAFI_UNICAST, VRF_DEFAULT, VRF_DEFAULT,
                                ZEBRA_ROUTE_KERNEL, 0, zebra_flags, &p, NULL,
                                &nh, 0, 0, 0, 0, 0);
                else
@@ -1096,7 +1096,7 @@ void rtm_read(struct rt_msghdr *rtm)
 
                if (rtm->rtm_type == RTM_GET || rtm->rtm_type == RTM_ADD
                    || rtm->rtm_type == RTM_CHANGE)
-                       rib_add(AFI_IP6, SAFI_UNICAST, VRF_DEFAULT,
+                       rib_add(AFI_IP6, SAFI_UNICAST, VRF_DEFAULT, VRF_DEFAULT,
                                ZEBRA_ROUTE_KERNEL, 0, zebra_flags, &p, NULL,
                                &nh, 0, 0, 0, 0, 0);
                else
index c92f5407717f35141d925f76d338e73c8f098950..6e3a85c1d11676843a219674929bc3a0cac05a66 100644 (file)
@@ -294,8 +294,8 @@ extern void rib_uninstall_kernel(struct route_node *rn, struct route_entry *re);
 /* NOTE:
  * All rib_add function will not just add prefix into RIB, but
  * also implicitly withdraw equal prefix of same type. */
-extern int rib_add(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
-                  u_short instance, int flags, struct prefix *p,
+extern int rib_add(afi_t afi, safi_t safi, vrf_id_t vrf_id, vrf_id_t nh_vrf_id,
+                  int type, u_short instance, int flags, struct prefix *p,
                   struct prefix_ipv6 *src_p, const struct nexthop *nh,
                   u_int32_t table_id, u_int32_t metric, u_int32_t mtu,
                   uint8_t distance, route_tag_t tag);
index cb3f598eb9599ae849971922ac9bf3b56a4bec20..384656a5739d7b74fd045da6927467c0c60f9c54 100644 (file)
@@ -403,6 +403,9 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl,
                afi = AFI_IP6;
 
        if (h->nlmsg_type == RTM_NEWROUTE) {
+               struct interface *ifp;
+               vrf_id_t nh_vrf_id = vrf_id;
+
                if (!tb[RTA_MULTIPATH]) {
                        struct nexthop nh;
                        size_t sz = (afi == AFI_IP) ? 4 : 16;
@@ -434,7 +437,14 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl,
                        if (gate)
                                memcpy(&nh.gate, gate, sz);
 
-                       rib_add(afi, SAFI_UNICAST, vrf_id, proto,
+                       if (index) {
+                               ifp = if_lookup_by_index(index,
+                                                        VRF_UNKNOWN);
+                               if (ifp)
+                                       nh_vrf_id = ifp->vrf_id;
+                       }
+
+                       rib_add(afi, SAFI_UNICAST, vrf_id, nh_vrf_id, proto,
                                0, flags, &p, NULL, &nh, table, metric,
                                mtu, distance, tag);
                } else {
@@ -465,6 +475,18 @@ static int netlink_route_change_read_unicast(struct sockaddr_nl *snl,
                                        break;
 
                                index = rtnh->rtnh_ifindex;
+                               if (index) {
+                                       /*
+                                        * Yes we are looking this up
+                                        * for every nexthop and just
+                                        * using the last one looked
+                                        * up right now
+                                        */
+                                       ifp = if_lookup_by_index(index,
+                                                                VRF_UNKNOWN);
+                                       if (ifp)
+                                               re->nh_vrf_id = ifp->vrf_id;
+                               }
                                gate = 0;
                                if (rtnh->rtnh_len > sizeof(*rtnh)) {
                                        memset(tb, 0, sizeof(tb));
index 69e45f9a6c4cc2c08e118df4af28fa841dcf0095..ba45f54ad2d6b4a0d20926b653a98eeb91a84025 100644 (file)
@@ -97,8 +97,9 @@ static void handle_route_entry(mib2_ipRouteEntry_t *routeEntry)
        nh.type = NEXTHOP_TYPE_IPV4;
        nh.gate.ipv4.s_addr = routeEntry->ipRouteNextHop;
 
-       rib_add(AFI_IP, SAFI_UNICAST, VRF_DEFAULT, ZEBRA_ROUTE_KERNEL, 0,
-               zebra_flags, &prefix, NULL, &nh, 0, 0, 0, 0, 0);
+       rib_add(AFI_IP, SAFI_UNICAST, VRF_DEFAULT, VRF_DEFAULT,
+               ZEBRA_ROUTE_KERNEL, 0, zebra_flags, &prefix, NULL,
+               &nh, 0, 0, 0, 0, 0);
 }
 
 void route_read(struct zebra_ns *zns)
index 6f9b8559089c2d2e799f225d8b054a910a855e4b..b1f0f70093052ac63f32920563a84c0c48b123b0 100644 (file)
@@ -2497,9 +2497,10 @@ void rib_delete(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
 }
 
 
-int rib_add(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type, u_short instance,
-           int flags, struct prefix *p, struct prefix_ipv6 *src_p,
-           const struct nexthop *nh, u_int32_t table_id, u_int32_t metric,
+int rib_add(afi_t afi, safi_t safi, vrf_id_t vrf_id, vrf_id_t nh_vrf_id,
+           int type, u_short instance, int flags, struct prefix *p,
+           struct prefix_ipv6 *src_p, const struct nexthop *nh,
+           u_int32_t table_id, u_int32_t metric,
            u_int32_t mtu, uint8_t distance, route_tag_t tag)
 {
        struct route_entry *re;
@@ -2515,7 +2516,7 @@ int rib_add(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type, u_short instance,
        re->mtu = mtu;
        re->table = table_id;
        re->vrf_id = vrf_id;
-       re->nh_vrf_id = vrf_id;
+       re->nh_vrf_id = nh_vrf_id;
        re->nexthop_num = 0;
        re->uptime = time(NULL);
        re->tag = tag;