zebra: implement NEXTHOP_FLAG_ONLINK

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>
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index b0ade05..7a820bf 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -1443,8 +1443,11 @@
         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 @@
   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_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);