fib: introduce FIB info offload flag helpers
authorJiri Pirko <jiri@mellanox.com>
Mon, 26 Sep 2016 10:52:30 +0000 (12:52 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 28 Sep 2016 08:48:00 +0000 (04:48 -0400)
These helpers are to be used in case someone offloads the FIB entry. The
result is that if the entry is offloaded to at least one device, the
offload flag is set.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip_fib.h
net/switchdev/switchdev.c

index 116a9c0eb455a29d9df7a76b1a7b3b6a4c092d15..ffccf17879149d3567b7fe19d4b520f8690dfb78 100644 (file)
@@ -123,6 +123,7 @@ struct fib_info {
 #ifdef CONFIG_IP_ROUTE_MULTIPATH
        int                     fib_weight;
 #endif
+       unsigned int            fib_offload_cnt;
        struct rcu_head         rcu;
        struct fib_nh           fib_nh[0];
 #define fib_dev                fib_nh[0].nh_dev
@@ -174,6 +175,18 @@ struct fib_result_nl {
 
 __be32 fib_info_update_nh_saddr(struct net *net, struct fib_nh *nh);
 
+static inline void fib_info_offload_inc(struct fib_info *fi)
+{
+       fi->fib_offload_cnt++;
+       fi->fib_flags |= RTNH_F_OFFLOAD;
+}
+
+static inline void fib_info_offload_dec(struct fib_info *fi)
+{
+       if (--fi->fib_offload_cnt == 0)
+               fi->fib_flags &= ~RTNH_F_OFFLOAD;
+}
+
 #define FIB_RES_SADDR(net, res)                                \
        ((FIB_RES_NH(res).nh_saddr_genid ==             \
          atomic_read(&(net)->ipv4.dev_addr_genid)) ?   \
index 10b819308439cb6f63edc5d4c8f75dae2f06df1b..abd8d2a38a7dda876ab226f202ca092755cc5634 100644 (file)
@@ -1216,7 +1216,7 @@ int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
        ipv4_fib.obj.orig_dev = dev;
        err = switchdev_port_obj_add(dev, &ipv4_fib.obj);
        if (!err)
-               fi->fib_flags |= RTNH_F_OFFLOAD;
+               fib_info_offload_inc(fi);
 
        return err == -EOPNOTSUPP ? 0 : err;
 }
@@ -1260,7 +1260,7 @@ int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
        ipv4_fib.obj.orig_dev = dev;
        err = switchdev_port_obj_del(dev, &ipv4_fib.obj);
        if (!err)
-               fi->fib_flags &= ~RTNH_F_OFFLOAD;
+               fib_info_offload_dec(fi);
 
        return err == -EOPNOTSUPP ? 0 : err;
 }