Commit c9850187 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

fib: introduce FIB info offload flag helpers

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: default avatarJiri Pirko <jiri@mellanox.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b90eb754
...@@ -123,6 +123,7 @@ struct fib_info { ...@@ -123,6 +123,7 @@ struct fib_info {
#ifdef CONFIG_IP_ROUTE_MULTIPATH #ifdef CONFIG_IP_ROUTE_MULTIPATH
int fib_weight; int fib_weight;
#endif #endif
unsigned int fib_offload_cnt;
struct rcu_head rcu; struct rcu_head rcu;
struct fib_nh fib_nh[0]; struct fib_nh fib_nh[0];
#define fib_dev fib_nh[0].nh_dev #define fib_dev fib_nh[0].nh_dev
...@@ -174,6 +175,18 @@ struct fib_result_nl { ...@@ -174,6 +175,18 @@ struct fib_result_nl {
__be32 fib_info_update_nh_saddr(struct net *net, struct fib_nh *nh); __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) \ #define FIB_RES_SADDR(net, res) \
((FIB_RES_NH(res).nh_saddr_genid == \ ((FIB_RES_NH(res).nh_saddr_genid == \
atomic_read(&(net)->ipv4.dev_addr_genid)) ? \ atomic_read(&(net)->ipv4.dev_addr_genid)) ? \
......
...@@ -1216,7 +1216,7 @@ int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi, ...@@ -1216,7 +1216,7 @@ int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
ipv4_fib.obj.orig_dev = dev; ipv4_fib.obj.orig_dev = dev;
err = switchdev_port_obj_add(dev, &ipv4_fib.obj); err = switchdev_port_obj_add(dev, &ipv4_fib.obj);
if (!err) if (!err)
fi->fib_flags |= RTNH_F_OFFLOAD; fib_info_offload_inc(fi);
return err == -EOPNOTSUPP ? 0 : err; return err == -EOPNOTSUPP ? 0 : err;
} }
...@@ -1260,7 +1260,7 @@ int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi, ...@@ -1260,7 +1260,7 @@ int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
ipv4_fib.obj.orig_dev = dev; ipv4_fib.obj.orig_dev = dev;
err = switchdev_port_obj_del(dev, &ipv4_fib.obj); err = switchdev_port_obj_del(dev, &ipv4_fib.obj);
if (!err) if (!err)
fi->fib_flags &= ~RTNH_F_OFFLOAD; fib_info_offload_dec(fi);
return err == -EOPNOTSUPP ? 0 : err; return err == -EOPNOTSUPP ? 0 : err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment