aboutsummaryrefslogtreecommitdiffstats
path: root/net/switchdev/switchdev.c
diff options
context:
space:
mode:
authorScott Feldman <sfeldma@gmail.com>2015-05-10 12:48:06 -0400
committerDavid S. Miller <davem@davemloft.net>2015-05-12 18:43:55 -0400
commit58c2cb16b116d7feace621bd6b647bbabacfa225 (patch)
tree01dba341543ad33607c95eee011fded948a755e0 /net/switchdev/switchdev.c
parent85fdb956726ff2af609e2f6ea7be781e4db74a07 (diff)
switchdev: convert fib_ipv4_add/del over to switchdev_port_obj_add/del
The IPv4 FIB ops convert nicely to the switchdev objs and we're left with only four switchdev ops: port get/set and port add/del. Other objs will follow, such as FDB. So go ahead and convert IPv4 FIB over to switchdev obj for consistency, anticipating more objs to come. Signed-off-by: Scott Feldman <sfeldma@gmail.com> Acked-by: Jiri Pirko <jiri@resnulli.us> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/switchdev/switchdev.c')
-rw-r--r--net/switchdev/switchdev.c49
1 files changed, 31 insertions, 18 deletions
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c
index 9210355ec965..65d49d4477b9 100644
--- a/net/switchdev/switchdev.c
+++ b/net/switchdev/switchdev.c
@@ -641,8 +641,19 @@ static struct net_device *switchdev_get_dev_by_nhs(struct fib_info *fi)
641int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi, 641int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
642 u8 tos, u8 type, u32 nlflags, u32 tb_id) 642 u8 tos, u8 type, u32 nlflags, u32 tb_id)
643{ 643{
644 struct switchdev_obj fib_obj = {
645 .id = SWITCHDEV_OBJ_IPV4_FIB,
646 .ipv4_fib = {
647 .dst = htonl(dst),
648 .dst_len = dst_len,
649 .fi = fi,
650 .tos = tos,
651 .type = type,
652 .nlflags = nlflags,
653 .tb_id = tb_id,
654 },
655 };
644 struct net_device *dev; 656 struct net_device *dev;
645 const struct switchdev_ops *ops;
646 int err = 0; 657 int err = 0;
647 658
648 /* Don't offload route if using custom ip rules or if 659 /* Don't offload route if using custom ip rules or if
@@ -660,15 +671,10 @@ int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
660 dev = switchdev_get_dev_by_nhs(fi); 671 dev = switchdev_get_dev_by_nhs(fi);
661 if (!dev) 672 if (!dev)
662 return 0; 673 return 0;
663 ops = dev->switchdev_ops; 674
664 675 err = switchdev_port_obj_add(dev, &fib_obj);
665 if (ops->switchdev_fib_ipv4_add) { 676 if (!err)
666 err = ops->switchdev_fib_ipv4_add(dev, htonl(dst), dst_len, 677 fi->fib_flags |= RTNH_F_EXTERNAL;
667 fi, tos, type, nlflags,
668 tb_id);
669 if (!err)
670 fi->fib_flags |= RTNH_F_EXTERNAL;
671 }
672 678
673 return err; 679 return err;
674} 680}
@@ -689,8 +695,19 @@ EXPORT_SYMBOL_GPL(switchdev_fib_ipv4_add);
689int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi, 695int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
690 u8 tos, u8 type, u32 tb_id) 696 u8 tos, u8 type, u32 tb_id)
691{ 697{
698 struct switchdev_obj fib_obj = {
699 .id = SWITCHDEV_OBJ_IPV4_FIB,
700 .ipv4_fib = {
701 .dst = htonl(dst),
702 .dst_len = dst_len,
703 .fi = fi,
704 .tos = tos,
705 .type = type,
706 .nlflags = 0,
707 .tb_id = tb_id,
708 },
709 };
692 struct net_device *dev; 710 struct net_device *dev;
693 const struct switchdev_ops *ops;
694 int err = 0; 711 int err = 0;
695 712
696 if (!(fi->fib_flags & RTNH_F_EXTERNAL)) 713 if (!(fi->fib_flags & RTNH_F_EXTERNAL))
@@ -699,14 +716,10 @@ int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
699 dev = switchdev_get_dev_by_nhs(fi); 716 dev = switchdev_get_dev_by_nhs(fi);
700 if (!dev) 717 if (!dev)
701 return 0; 718 return 0;
702 ops = dev->switchdev_ops;
703 719
704 if (ops->switchdev_fib_ipv4_del) { 720 err = switchdev_port_obj_del(dev, &fib_obj);
705 err = ops->switchdev_fib_ipv4_del(dev, htonl(dst), dst_len, 721 if (!err)
706 fi, tos, type, tb_id); 722 fi->fib_flags &= ~RTNH_F_EXTERNAL;
707 if (!err)
708 fi->fib_flags &= ~RTNH_F_EXTERNAL;
709 }
710 723
711 return err; 724 return err;
712} 725}