]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: implement NEXTHOP_FLAG_ONLINK
authorChristian Franke <chris@opensourcerouting.org>
Fri, 5 Jul 2013 15:35:39 +0000 (15:35 +0000)
committerDavid Lamparter <equinox@opensourcerouting.org>
Thu, 19 Sep 2013 16:04:40 +0000 (18:04 +0200)
On Linux, the kernel will only allow for a route to be installed when
its gateway is directly attached according the kernel fib.

There are cases when this restriction by the kernel is too strong, in
those cases, we deploy the RTNH_F_ONLINK netlink flag.

Signed-off-by: Christian Franke <chris@opensourcerouting.org>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
zebra/rib.h
zebra/rt_netlink.c
zebra/zebra_vty.c

index 4d98e059568161608002e23f3ed09de8e33ae0ee..1c548795e6ea43e17d419689fbdb8e0cd068e30b 100644 (file)
@@ -253,6 +253,7 @@ struct nexthop
 #define NEXTHOP_FLAG_ACTIVE     (1 << 0) /* This nexthop is alive. */
 #define NEXTHOP_FLAG_FIB        (1 << 1) /* FIB nexthop. */
 #define NEXTHOP_FLAG_RECURSIVE  (1 << 2) /* Recursive nexthop. */
+#define NEXTHOP_FLAG_ONLINK     (1 << 3) /* Nexthop should be installed onlink. */
 
   /* Nexthop address */
   union g_addr gate;
index b0ade05884e765bc965852951f2983af82a20e7c..7a820bfd1413343d055d32a2ef67cac330391236 100644 (file)
@@ -1443,8 +1443,11 @@ _netlink_route_build_singlepath(
         int bytelen,
         struct nexthop *nexthop,
         struct nlmsghdr *nlmsg,
+        struct rtmsg *rtmsg,
         size_t req_size)
 {
+  if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
+    rtmsg->rtm_flags |= RTNH_F_ONLINK;
   if (nexthop->type == NEXTHOP_TYPE_IPV4
       || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
     {
@@ -1534,6 +1537,9 @@ _netlink_route_build_multipath(
   rtnh->rtnh_hops = 0;
   rta->rta_len += rtnh->rtnh_len;
 
+  if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
+    rtnh->rtnh_flags |= RTNH_F_ONLINK;
+
   if (nexthop->type == NEXTHOP_TYPE_IPV4
       || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
     {
@@ -1733,7 +1739,8 @@ netlink_route_multipath (int cmd, struct prefix *p, struct rib *rib,
 
               _netlink_route_debug(cmd, p, nexthop, routedesc, family);
               _netlink_route_build_singlepath(routedesc, bytelen,
-                                              nexthop, &req.n, sizeof req);
+                                              nexthop, &req.n, &req.r,
+                                              sizeof req);
 
               if (cmd == RTM_NEWROUTE)
                 SET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB);
index e1da7df8376e25c52be5f07530f493f75c38c0b4..45928e930a806f35243e75f1858147753d5445ab 100644 (file)
@@ -615,6 +615,9 @@ vty_show_ip_route_detail (struct vty *vty, struct route_node *rn)
          if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
            vty_out (vty, " inactive");
 
+         if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
+           vty_out (vty, " onlink");
+
          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
            vty_out (vty, " (recursive)");
 
@@ -710,6 +713,9 @@ vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
       if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
        vty_out (vty, " inactive");
 
+      if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
+       vty_out (vty, " onlink");
+
       if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
        vty_out (vty, " (recursive)");
 
@@ -1600,6 +1606,9 @@ vty_show_ipv6_route_detail (struct vty *vty, struct route_node *rn)
          if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
            vty_out (vty, " inactive");
 
+         if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
+           vty_out (vty, " onlink");
+
          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
            vty_out (vty, " (recursive)");