forked from mirrors/linux
		
	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
					
				
					 2 changed files with 38 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue