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:
parent
8508025c59
commit
8793d0a664
@ -126,6 +126,9 @@ int register_switchdev_notifier(struct notifier_block *nb);
|
|||||||
int unregister_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,
|
int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
|
||||||
struct switchdev_notifier_info *info);
|
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,
|
int switchdev_port_bridge_setlink(struct net_device *dev,
|
||||||
struct nlmsghdr *nlh, u16 flags);
|
struct nlmsghdr *nlh, u16 flags);
|
||||||
int switchdev_port_bridge_dellink(struct net_device *dev,
|
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;
|
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,
|
static inline int switchdev_port_bridge_setlink(struct net_device *dev,
|
||||||
struct nlmsghdr *nlh,
|
struct nlmsghdr *nlh,
|
||||||
u16 flags)
|
u16 flags)
|
||||||
|
@ -358,6 +358,34 @@ int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(call_switchdev_notifiers);
|
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,
|
static int switchdev_port_br_setflag(struct net_device *dev,
|
||||||
struct nlattr *nlattr,
|
struct nlattr *nlattr,
|
||||||
unsigned long brport_flag)
|
unsigned long brport_flag)
|
||||||
|
Loading…
Reference in New Issue
Block a user