ipv6: Add "offload" and "trap" indications to routes
authorIdo Schimmel <idosch@mellanox.com>
Tue, 14 Jan 2020 11:23:12 +0000 (13:23 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Jan 2020 02:53:35 +0000 (18:53 -0800)
In a similar fashion to previous patch, add "offload" and "trap"
indication to IPv6 routes.

This is done by using two unused bits in 'struct fib6_info' to hold
these indications. Capable drivers are expected to set these when
processing the various in-kernel route notifications.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: David Ahern <dsahern@gmail.com>
Acked-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip6_fib.h
net/ipv6/route.c

index b579faea41e9c4c3448f49bf3096f0c8ebe4b0d1..fd60a8ac02ee0063967dab67ef6ce6fa2f98909e 100644 (file)
@@ -192,7 +192,9 @@ struct fib6_info {
                                        dst_nopolicy:1,
                                        dst_host:1,
                                        fib6_destroying:1,
-                                       unused:3;
+                                       offload:1,
+                                       trap:1,
+                                       unused:1;
 
        struct rcu_head                 rcu;
        struct nexthop                  *nh;
@@ -329,6 +331,13 @@ static inline void fib6_info_release(struct fib6_info *f6i)
                call_rcu(&f6i->rcu, fib6_info_destroy_rcu);
 }
 
+static inline void fib6_info_hw_flags_set(struct fib6_info *f6i, bool offload,
+                                         bool trap)
+{
+       f6i->offload = offload;
+       f6i->trap = trap;
+}
+
 enum fib6_walk_state {
 #ifdef CONFIG_IPV6_SUBTREES
        FWS_S,
index 0253b702afb7c0474946ead448dabbbc139dd378..4fbdc60b4e070802fcd6905dce800641816a79fa 100644 (file)
@@ -5576,6 +5576,13 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb,
                expires -= jiffies;
        }
 
+       if (!dst) {
+               if (rt->offload)
+                       rtm->rtm_flags |= RTM_F_OFFLOAD;
+               if (rt->trap)
+                       rtm->rtm_flags |= RTM_F_TRAP;
+       }
+
        if (rtnl_put_cacheinfo(skb, dst, 0, expires, dst ? dst->error : 0) < 0)
                goto nla_put_failure;