diff options
author | Scott Feldman <sfeldma@gmail.com> | 2015-05-10 12:48:04 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-05-12 18:43:55 -0400 |
commit | 8793d0a664a8a2c5e18e929c1f995c784c105705 (patch) | |
tree | 8342ff461ce9775a9c9bb7cd67124dae18703141 /net/switchdev/switchdev.c | |
parent | 8508025c598bdee33d9afa153e9c00c7771e7d63 (diff) |
switchdev: add new switchdev_port_bridge_getlink
Like bridge_setlink, add switchdev wrapper to handle bridge_getlink and
call into port driver to get port attrs. For now, only BR_LEARNING and
BR_LEARNING_SYNC are returned. To add more, we'll probably want to break
away from ndo_dflt_bridge_getlink() and build the netlink skb directly in
the switchdev code.
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.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index 0e15b6f6bb56..9210355ec965 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c | |||
@@ -358,6 +358,34 @@ int call_switchdev_notifiers(unsigned long val, struct net_device *dev, | |||
358 | } | 358 | } |
359 | EXPORT_SYMBOL_GPL(call_switchdev_notifiers); | 359 | EXPORT_SYMBOL_GPL(call_switchdev_notifiers); |
360 | 360 | ||
361 | /** | ||
362 | * switchdev_port_bridge_getlink - Get bridge port attributes | ||
363 | * | ||
364 | * @dev: port device | ||
365 | * | ||
366 | * Called for SELF on rtnl_bridge_getlink to get bridge port | ||
367 | * attributes. | ||
368 | */ | ||
369 | int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, | ||
370 | struct net_device *dev, u32 filter_mask, | ||
371 | int nlflags) | ||
372 | { | ||
373 | struct switchdev_attr attr = { | ||
374 | .id = SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS, | ||
375 | }; | ||
376 | u16 mode = BRIDGE_MODE_UNDEF; | ||
377 | u32 mask = BR_LEARNING | BR_LEARNING_SYNC; | ||
378 | int err; | ||
379 | |||
380 | err = switchdev_port_attr_get(dev, &attr); | ||
381 | if (err) | ||
382 | return err; | ||
383 | |||
384 | return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode, | ||
385 | attr.brport_flags, mask, nlflags); | ||
386 | } | ||
387 | EXPORT_SYMBOL_GPL(switchdev_port_bridge_getlink); | ||
388 | |||
361 | static int switchdev_port_br_setflag(struct net_device *dev, | 389 | static int switchdev_port_br_setflag(struct net_device *dev, |
362 | struct nlattr *nlattr, | 390 | struct nlattr *nlattr, |
363 | unsigned long brport_flag) | 391 | unsigned long brport_flag) |