aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Pirko <jiri@mellanox.com>2016-09-26 06:52:30 -0400
committerDavid S. Miller <davem@davemloft.net>2016-09-28 04:48:00 -0400
commitc98501879b1b1af90c7325574f2672e9efca592c (patch)
treecc6f5e21ae1250962df15dc0e014a85975501c67
parentb90eb754949931b2e4481b1df9a03f84d4be66ba (diff)
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: Jiri Pirko <jiri@mellanox.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/ip_fib.h13
-rw-r--r--net/switchdev/switchdev.c4
2 files changed, 15 insertions, 2 deletions
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index 116a9c0eb455..ffccf1787914 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -123,6 +123,7 @@ struct fib_info {
123#ifdef CONFIG_IP_ROUTE_MULTIPATH 123#ifdef CONFIG_IP_ROUTE_MULTIPATH
124 int fib_weight; 124 int fib_weight;
125#endif 125#endif
126 unsigned int fib_offload_cnt;
126 struct rcu_head rcu; 127 struct rcu_head rcu;
127 struct fib_nh fib_nh[0]; 128 struct fib_nh fib_nh[0];
128#define fib_dev fib_nh[0].nh_dev 129#define fib_dev fib_nh[0].nh_dev
@@ -174,6 +175,18 @@ struct fib_result_nl {
174 175
175__be32 fib_info_update_nh_saddr(struct net *net, struct fib_nh *nh); 176__be32 fib_info_update_nh_saddr(struct net *net, struct fib_nh *nh);
176 177
178static inline void fib_info_offload_inc(struct fib_info *fi)
179{
180 fi->fib_offload_cnt++;
181 fi->fib_flags |= RTNH_F_OFFLOAD;
182}
183
184static inline void fib_info_offload_dec(struct fib_info *fi)
185{
186 if (--fi->fib_offload_cnt == 0)
187 fi->fib_flags &= ~RTNH_F_OFFLOAD;
188}
189
177#define FIB_RES_SADDR(net, res) \ 190#define FIB_RES_SADDR(net, res) \
178 ((FIB_RES_NH(res).nh_saddr_genid == \ 191 ((FIB_RES_NH(res).nh_saddr_genid == \
179 atomic_read(&(net)->ipv4.dev_addr_genid)) ? \ 192 atomic_read(&(net)->ipv4.dev_addr_genid)) ? \
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c
index 10b819308439..abd8d2a38a7d 100644
--- a/net/switchdev/switchdev.c
+++ b/net/switchdev/switchdev.c
@@ -1216,7 +1216,7 @@ int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
1216 ipv4_fib.obj.orig_dev = dev; 1216 ipv4_fib.obj.orig_dev = dev;
1217 err = switchdev_port_obj_add(dev, &ipv4_fib.obj); 1217 err = switchdev_port_obj_add(dev, &ipv4_fib.obj);
1218 if (!err) 1218 if (!err)
1219 fi->fib_flags |= RTNH_F_OFFLOAD; 1219 fib_info_offload_inc(fi);
1220 1220
1221 return err == -EOPNOTSUPP ? 0 : err; 1221 return err == -EOPNOTSUPP ? 0 : err;
1222} 1222}
@@ -1260,7 +1260,7 @@ int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
1260 ipv4_fib.obj.orig_dev = dev; 1260 ipv4_fib.obj.orig_dev = dev;
1261 err = switchdev_port_obj_del(dev, &ipv4_fib.obj); 1261 err = switchdev_port_obj_del(dev, &ipv4_fib.obj);
1262 if (!err) 1262 if (!err)
1263 fi->fib_flags &= ~RTNH_F_OFFLOAD; 1263 fib_info_offload_dec(fi);
1264 1264
1265 return err == -EOPNOTSUPP ? 0 : err; 1265 return err == -EOPNOTSUPP ? 0 : err;
1266} 1266}