summaryrefslogtreecommitdiffstats
path: root/net/switchdev/switchdev.c
diff options
context:
space:
mode:
authorJiri Pirko <jiri@mellanox.com>2015-10-01 05:03:46 -0400
committerDavid S. Miller <davem@davemloft.net>2015-10-03 07:49:40 -0400
commit9e8f4a548ab4710002c23c94c4b1bbde91b5e335 (patch)
treec2fe29079ccd3dd3a5218ad966ed0bab047d5e69 /net/switchdev/switchdev.c
parent648b4a995a057187ddd77cdb181e6a0b24ab2959 (diff)
switchdev: push object ID back to object structure
Suggested-by: Scott Feldman <sfeldma@gmail.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Acked-by: Scott Feldman <sfeldma@gmail.com> Reviewed-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/switchdev/switchdev.c')
-rw-r--r--net/switchdev/switchdev.c57
1 files changed, 29 insertions, 28 deletions
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c
index 0402b3633100..6e4a4f9ad927 100644
--- a/net/switchdev/switchdev.c
+++ b/net/switchdev/switchdev.c
@@ -270,7 +270,6 @@ int switchdev_port_attr_set(struct net_device *dev, struct switchdev_attr *attr)
270EXPORT_SYMBOL_GPL(switchdev_port_attr_set); 270EXPORT_SYMBOL_GPL(switchdev_port_attr_set);
271 271
272static int __switchdev_port_obj_add(struct net_device *dev, 272static int __switchdev_port_obj_add(struct net_device *dev,
273 enum switchdev_obj_id id,
274 const struct switchdev_obj *obj, 273 const struct switchdev_obj *obj,
275 struct switchdev_trans *trans) 274 struct switchdev_trans *trans)
276{ 275{
@@ -280,7 +279,7 @@ static int __switchdev_port_obj_add(struct net_device *dev,
280 int err = -EOPNOTSUPP; 279 int err = -EOPNOTSUPP;
281 280
282 if (ops && ops->switchdev_port_obj_add) 281 if (ops && ops->switchdev_port_obj_add)
283 return ops->switchdev_port_obj_add(dev, id, obj, trans); 282 return ops->switchdev_port_obj_add(dev, obj, trans);
284 283
285 /* Switch device port(s) may be stacked under 284 /* Switch device port(s) may be stacked under
286 * bond/team/vlan dev, so recurse down to add object on 285 * bond/team/vlan dev, so recurse down to add object on
@@ -288,7 +287,7 @@ static int __switchdev_port_obj_add(struct net_device *dev,
288 */ 287 */
289 288
290 netdev_for_each_lower_dev(dev, lower_dev, iter) { 289 netdev_for_each_lower_dev(dev, lower_dev, iter) {
291 err = __switchdev_port_obj_add(lower_dev, id, obj, trans); 290 err = __switchdev_port_obj_add(lower_dev, obj, trans);
292 if (err) 291 if (err)
293 break; 292 break;
294 } 293 }
@@ -309,7 +308,7 @@ static int __switchdev_port_obj_add(struct net_device *dev,
309 * 308 *
310 * rtnl_lock must be held. 309 * rtnl_lock must be held.
311 */ 310 */
312int switchdev_port_obj_add(struct net_device *dev, enum switchdev_obj_id id, 311int switchdev_port_obj_add(struct net_device *dev,
313 const struct switchdev_obj *obj) 312 const struct switchdev_obj *obj)
314{ 313{
315 struct switchdev_trans trans; 314 struct switchdev_trans trans;
@@ -327,7 +326,7 @@ int switchdev_port_obj_add(struct net_device *dev, enum switchdev_obj_id id,
327 */ 326 */
328 327
329 trans.ph_prepare = true; 328 trans.ph_prepare = true;
330 err = __switchdev_port_obj_add(dev, id, obj, &trans); 329 err = __switchdev_port_obj_add(dev, obj, &trans);
331 if (err) { 330 if (err) {
332 /* Prepare phase failed: abort the transaction. Any 331 /* Prepare phase failed: abort the transaction. Any
333 * resources reserved in the prepare phase are 332 * resources reserved in the prepare phase are
@@ -346,8 +345,8 @@ int switchdev_port_obj_add(struct net_device *dev, enum switchdev_obj_id id,
346 */ 345 */
347 346
348 trans.ph_prepare = false; 347 trans.ph_prepare = false;
349 err = __switchdev_port_obj_add(dev, id, obj, &trans); 348 err = __switchdev_port_obj_add(dev, obj, &trans);
350 WARN(err, "%s: Commit of object (id=%d) failed.\n", dev->name, id); 349 WARN(err, "%s: Commit of object (id=%d) failed.\n", dev->name, obj->id);
351 switchdev_trans_items_warn_destroy(dev, &trans); 350 switchdev_trans_items_warn_destroy(dev, &trans);
352 351
353 return err; 352 return err;
@@ -361,7 +360,7 @@ EXPORT_SYMBOL_GPL(switchdev_port_obj_add);
361 * @id: object ID 360 * @id: object ID
362 * @obj: object to delete 361 * @obj: object to delete
363 */ 362 */
364int switchdev_port_obj_del(struct net_device *dev, enum switchdev_obj_id id, 363int switchdev_port_obj_del(struct net_device *dev,
365 const struct switchdev_obj *obj) 364 const struct switchdev_obj *obj)
366{ 365{
367 const struct switchdev_ops *ops = dev->switchdev_ops; 366 const struct switchdev_ops *ops = dev->switchdev_ops;
@@ -370,7 +369,7 @@ int switchdev_port_obj_del(struct net_device *dev, enum switchdev_obj_id id,
370 int err = -EOPNOTSUPP; 369 int err = -EOPNOTSUPP;
371 370
372 if (ops && ops->switchdev_port_obj_del) 371 if (ops && ops->switchdev_port_obj_del)
373 return ops->switchdev_port_obj_del(dev, id, obj); 372 return ops->switchdev_port_obj_del(dev, obj);
374 373
375 /* Switch device port(s) may be stacked under 374 /* Switch device port(s) may be stacked under
376 * bond/team/vlan dev, so recurse down to delete object on 375 * bond/team/vlan dev, so recurse down to delete object on
@@ -378,7 +377,7 @@ int switchdev_port_obj_del(struct net_device *dev, enum switchdev_obj_id id,
378 */ 377 */
379 378
380 netdev_for_each_lower_dev(dev, lower_dev, iter) { 379 netdev_for_each_lower_dev(dev, lower_dev, iter) {
381 err = switchdev_port_obj_del(lower_dev, id, obj); 380 err = switchdev_port_obj_del(lower_dev, obj);
382 if (err) 381 if (err)
383 break; 382 break;
384 } 383 }
@@ -395,8 +394,7 @@ EXPORT_SYMBOL_GPL(switchdev_port_obj_del);
395 * @obj: object to dump 394 * @obj: object to dump
396 * @cb: function to call with a filled object 395 * @cb: function to call with a filled object
397 */ 396 */
398int switchdev_port_obj_dump(struct net_device *dev, enum switchdev_obj_id id, 397int switchdev_port_obj_dump(struct net_device *dev, struct switchdev_obj *obj,
399 struct switchdev_obj *obj,
400 switchdev_obj_dump_cb_t *cb) 398 switchdev_obj_dump_cb_t *cb)
401{ 399{
402 const struct switchdev_ops *ops = dev->switchdev_ops; 400 const struct switchdev_ops *ops = dev->switchdev_ops;
@@ -405,7 +403,7 @@ int switchdev_port_obj_dump(struct net_device *dev, enum switchdev_obj_id id,
405 int err = -EOPNOTSUPP; 403 int err = -EOPNOTSUPP;
406 404
407 if (ops && ops->switchdev_port_obj_dump) 405 if (ops && ops->switchdev_port_obj_dump)
408 return ops->switchdev_port_obj_dump(dev, id, obj, cb); 406 return ops->switchdev_port_obj_dump(dev, obj, cb);
409 407
410 /* Switch device port(s) may be stacked under 408 /* Switch device port(s) may be stacked under
411 * bond/team/vlan dev, so recurse down to dump objects on 409 * bond/team/vlan dev, so recurse down to dump objects on
@@ -413,7 +411,7 @@ int switchdev_port_obj_dump(struct net_device *dev, enum switchdev_obj_id id,
413 */ 411 */
414 412
415 netdev_for_each_lower_dev(dev, lower_dev, iter) { 413 netdev_for_each_lower_dev(dev, lower_dev, iter) {
416 err = switchdev_port_obj_dump(lower_dev, id, obj, cb); 414 err = switchdev_port_obj_dump(lower_dev, obj, cb);
417 break; 415 break;
418 } 416 }
419 417
@@ -579,6 +577,7 @@ static int switchdev_port_vlan_fill(struct sk_buff *skb, struct net_device *dev,
579 u32 filter_mask) 577 u32 filter_mask)
580{ 578{
581 struct switchdev_vlan_dump dump = { 579 struct switchdev_vlan_dump dump = {
580 .vlan.obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
582 .skb = skb, 581 .skb = skb,
583 .filter_mask = filter_mask, 582 .filter_mask = filter_mask,
584 }; 583 };
@@ -586,8 +585,7 @@ static int switchdev_port_vlan_fill(struct sk_buff *skb, struct net_device *dev,
586 585
587 if ((filter_mask & RTEXT_FILTER_BRVLAN) || 586 if ((filter_mask & RTEXT_FILTER_BRVLAN) ||
588 (filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED)) { 587 (filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED)) {
589 err = switchdev_port_obj_dump(dev, SWITCHDEV_OBJ_ID_PORT_VLAN, 588 err = switchdev_port_obj_dump(dev, &dump.vlan.obj,
590 &dump.vlan.obj,
591 switchdev_port_vlan_dump_cb); 589 switchdev_port_vlan_dump_cb);
592 if (err) 590 if (err)
593 goto err_out; 591 goto err_out;
@@ -701,12 +699,13 @@ static int switchdev_port_br_setlink_protinfo(struct net_device *dev,
701static int switchdev_port_br_afspec(struct net_device *dev, 699static int switchdev_port_br_afspec(struct net_device *dev,
702 struct nlattr *afspec, 700 struct nlattr *afspec,
703 int (*f)(struct net_device *dev, 701 int (*f)(struct net_device *dev,
704 enum switchdev_obj_id id,
705 const struct switchdev_obj *obj)) 702 const struct switchdev_obj *obj))
706{ 703{
707 struct nlattr *attr; 704 struct nlattr *attr;
708 struct bridge_vlan_info *vinfo; 705 struct bridge_vlan_info *vinfo;
709 struct switchdev_obj_port_vlan vlan = { {}, 0 }; 706 struct switchdev_obj_port_vlan vlan = {
707 .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
708 };
710 int rem; 709 int rem;
711 int err; 710 int err;
712 711
@@ -727,7 +726,7 @@ static int switchdev_port_br_afspec(struct net_device *dev,
727 vlan.vid_end = vinfo->vid; 726 vlan.vid_end = vinfo->vid;
728 if (vlan.vid_end <= vlan.vid_begin) 727 if (vlan.vid_end <= vlan.vid_begin)
729 return -EINVAL; 728 return -EINVAL;
730 err = f(dev, SWITCHDEV_OBJ_ID_PORT_VLAN, &vlan.obj); 729 err = f(dev, &vlan.obj);
731 if (err) 730 if (err)
732 return err; 731 return err;
733 memset(&vlan, 0, sizeof(vlan)); 732 memset(&vlan, 0, sizeof(vlan));
@@ -736,7 +735,7 @@ static int switchdev_port_br_afspec(struct net_device *dev,
736 return -EINVAL; 735 return -EINVAL;
737 vlan.vid_begin = vinfo->vid; 736 vlan.vid_begin = vinfo->vid;
738 vlan.vid_end = vinfo->vid; 737 vlan.vid_end = vinfo->vid;
739 err = f(dev, SWITCHDEV_OBJ_ID_PORT_VLAN, &vlan.obj); 738 err = f(dev, &vlan.obj);
740 if (err) 739 if (err)
741 return err; 740 return err;
742 memset(&vlan, 0, sizeof(vlan)); 741 memset(&vlan, 0, sizeof(vlan));
@@ -822,11 +821,12 @@ int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
822 u16 vid, u16 nlm_flags) 821 u16 vid, u16 nlm_flags)
823{ 822{
824 struct switchdev_obj_port_fdb fdb = { 823 struct switchdev_obj_port_fdb fdb = {
824 .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB,
825 .addr = addr, 825 .addr = addr,
826 .vid = vid, 826 .vid = vid,
827 }; 827 };
828 828
829 return switchdev_port_obj_add(dev, SWITCHDEV_OBJ_ID_PORT_FDB, &fdb.obj); 829 return switchdev_port_obj_add(dev, &fdb.obj);
830} 830}
831EXPORT_SYMBOL_GPL(switchdev_port_fdb_add); 831EXPORT_SYMBOL_GPL(switchdev_port_fdb_add);
832 832
@@ -846,11 +846,12 @@ int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
846 u16 vid) 846 u16 vid)
847{ 847{
848 struct switchdev_obj_port_fdb fdb = { 848 struct switchdev_obj_port_fdb fdb = {
849 .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB,
849 .addr = addr, 850 .addr = addr,
850 .vid = vid, 851 .vid = vid,
851 }; 852 };
852 853
853 return switchdev_port_obj_del(dev, SWITCHDEV_OBJ_ID_PORT_FDB, &fdb.obj); 854 return switchdev_port_obj_del(dev, &fdb.obj);
854} 855}
855EXPORT_SYMBOL_GPL(switchdev_port_fdb_del); 856EXPORT_SYMBOL_GPL(switchdev_port_fdb_del);
856 857
@@ -922,14 +923,14 @@ int switchdev_port_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
922 struct net_device *filter_dev, int idx) 923 struct net_device *filter_dev, int idx)
923{ 924{
924 struct switchdev_fdb_dump dump = { 925 struct switchdev_fdb_dump dump = {
926 .fdb.obj.id = SWITCHDEV_OBJ_ID_PORT_FDB,
925 .dev = dev, 927 .dev = dev,
926 .skb = skb, 928 .skb = skb,
927 .cb = cb, 929 .cb = cb,
928 .idx = idx, 930 .idx = idx,
929 }; 931 };
930 932
931 switchdev_port_obj_dump(dev, SWITCHDEV_OBJ_ID_PORT_FDB, &dump.fdb.obj, 933 switchdev_port_obj_dump(dev, &dump.fdb.obj, switchdev_port_fdb_dump_cb);
932 switchdev_port_fdb_dump_cb);
933 return dump.idx; 934 return dump.idx;
934} 935}
935EXPORT_SYMBOL_GPL(switchdev_port_fdb_dump); 936EXPORT_SYMBOL_GPL(switchdev_port_fdb_dump);
@@ -1008,6 +1009,7 @@ int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
1008 u8 tos, u8 type, u32 nlflags, u32 tb_id) 1009 u8 tos, u8 type, u32 nlflags, u32 tb_id)
1009{ 1010{
1010 struct switchdev_obj_ipv4_fib ipv4_fib = { 1011 struct switchdev_obj_ipv4_fib ipv4_fib = {
1012 .obj.id = SWITCHDEV_OBJ_ID_IPV4_FIB,
1011 .dst = dst, 1013 .dst = dst,
1012 .dst_len = dst_len, 1014 .dst_len = dst_len,
1013 .fi = fi, 1015 .fi = fi,
@@ -1035,8 +1037,7 @@ int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
1035 if (!dev) 1037 if (!dev)
1036 return 0; 1038 return 0;
1037 1039
1038 err = switchdev_port_obj_add(dev, SWITCHDEV_OBJ_ID_IPV4_FIB, 1040 err = switchdev_port_obj_add(dev, &ipv4_fib.obj);
1039 &ipv4_fib.obj);
1040 if (!err) 1041 if (!err)
1041 fi->fib_flags |= RTNH_F_OFFLOAD; 1042 fi->fib_flags |= RTNH_F_OFFLOAD;
1042 1043
@@ -1060,6 +1061,7 @@ int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
1060 u8 tos, u8 type, u32 tb_id) 1061 u8 tos, u8 type, u32 tb_id)
1061{ 1062{
1062 struct switchdev_obj_ipv4_fib ipv4_fib = { 1063 struct switchdev_obj_ipv4_fib ipv4_fib = {
1064 .obj.id = SWITCHDEV_OBJ_ID_IPV4_FIB,
1063 .dst = dst, 1065 .dst = dst,
1064 .dst_len = dst_len, 1066 .dst_len = dst_len,
1065 .fi = fi, 1067 .fi = fi,
@@ -1078,8 +1080,7 @@ int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
1078 if (!dev) 1080 if (!dev)
1079 return 0; 1081 return 0;
1080 1082
1081 err = switchdev_port_obj_del(dev, SWITCHDEV_OBJ_ID_IPV4_FIB, 1083 err = switchdev_port_obj_del(dev, &ipv4_fib.obj);
1082 &ipv4_fib.obj);
1083 if (!err) 1084 if (!err)
1084 fi->fib_flags &= ~RTNH_F_OFFLOAD; 1085 fi->fib_flags &= ~RTNH_F_OFFLOAD;
1085 1086