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>
This commit is contained in:
Родитель
8508025c59
Коммит
8793d0a664
|
@ -126,6 +126,9 @@ int register_switchdev_notifier(struct notifier_block *nb);
|
|||
int unregister_switchdev_notifier(struct notifier_block *nb);
|
||||
int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
|
||||
struct switchdev_notifier_info *info);
|
||||
int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
|
||||
struct net_device *dev, u32 filter_mask,
|
||||
int nlflags);
|
||||
int switchdev_port_bridge_setlink(struct net_device *dev,
|
||||
struct nlmsghdr *nlh, u16 flags);
|
||||
int switchdev_port_bridge_dellink(struct net_device *dev,
|
||||
|
@ -179,6 +182,13 @@ static inline int call_switchdev_notifiers(unsigned long val,
|
|||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static inline int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid,
|
||||
u32 seq, struct net_device *dev,
|
||||
u32 filter_mask, int nlflags)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int switchdev_port_bridge_setlink(struct net_device *dev,
|
||||
struct nlmsghdr *nlh,
|
||||
u16 flags)
|
||||
|
|
|
@ -358,6 +358,34 @@ int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(call_switchdev_notifiers);
|
||||
|
||||
/**
|
||||
* switchdev_port_bridge_getlink - Get bridge port attributes
|
||||
*
|
||||
* @dev: port device
|
||||
*
|
||||
* Called for SELF on rtnl_bridge_getlink to get bridge port
|
||||
* attributes.
|
||||
*/
|
||||
int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
|
||||
struct net_device *dev, u32 filter_mask,
|
||||
int nlflags)
|
||||
{
|
||||
struct switchdev_attr attr = {
|
||||
.id = SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS,
|
||||
};
|
||||
u16 mode = BRIDGE_MODE_UNDEF;
|
||||
u32 mask = BR_LEARNING | BR_LEARNING_SYNC;
|
||||
int err;
|
||||
|
||||
err = switchdev_port_attr_get(dev, &attr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode,
|
||||
attr.brport_flags, mask, nlflags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(switchdev_port_bridge_getlink);
|
||||
|
||||
static int switchdev_port_br_setflag(struct net_device *dev,
|
||||
struct nlattr *nlattr,
|
||||
unsigned long brport_flag)
|
||||
|
|
Загрузка…
Ссылка в новой задаче