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 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 a new issue