diff options
Diffstat (limited to 'include/net/switchdev.h')
| -rw-r--r-- | include/net/switchdev.h | 84 | 
1 files changed, 30 insertions, 54 deletions
diff --git a/include/net/switchdev.h b/include/net/switchdev.h index a7fdab5ee6c3..0ebd67ae7012 100644 --- a/include/net/switchdev.h +++ b/include/net/switchdev.h @@ -20,14 +20,7 @@  #define SWITCHDEV_F_SKIP_EOPNOTSUPP	BIT(1)  #define SWITCHDEV_F_DEFER		BIT(2) -struct switchdev_trans_item { -	struct list_head list; -	void *data; -	void (*destructor)(const void *data); -}; -  struct switchdev_trans { -	struct list_head item_list;  	bool ph_prepare;  }; @@ -43,10 +36,9 @@ static inline bool switchdev_trans_ph_commit(struct switchdev_trans *trans)  enum switchdev_attr_id {  	SWITCHDEV_ATTR_ID_UNDEFINED, -	SWITCHDEV_ATTR_ID_PORT_PARENT_ID,  	SWITCHDEV_ATTR_ID_PORT_STP_STATE,  	SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS, -	SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT, +	SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS,  	SWITCHDEV_ATTR_ID_PORT_MROUTER,  	SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,  	SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING, @@ -61,10 +53,8 @@ struct switchdev_attr {  	void *complete_priv;  	void (*complete)(struct net_device *dev, int err, void *priv);  	union { -		struct netdev_phys_item_id ppid;	/* PORT_PARENT_ID */  		u8 stp_state;				/* PORT_STP_STATE */ -		unsigned long brport_flags;		/* PORT_BRIDGE_FLAGS */ -		unsigned long brport_flags_support;	/* PORT_BRIDGE_FLAGS_SUPPORT */ +		unsigned long brport_flags;		/* PORT_{PRE}_BRIDGE_FLAGS */  		bool mrouter;				/* PORT_MROUTER */  		clock_t ageing_time;			/* BRIDGE_AGEING_TIME */  		bool vlan_filtering;			/* BRIDGE_VLAN_FILTERING */ @@ -108,28 +98,8 @@ struct switchdev_obj_port_mdb {  #define SWITCHDEV_OBJ_PORT_MDB(OBJ) \  	container_of((OBJ), struct switchdev_obj_port_mdb, obj) -void switchdev_trans_item_enqueue(struct switchdev_trans *trans, -				  void *data, void (*destructor)(void const *), -				  struct switchdev_trans_item *tritem); -void *switchdev_trans_item_dequeue(struct switchdev_trans *trans); -  typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj); -/** - * struct switchdev_ops - switchdev operations - * - * @switchdev_port_attr_get: Get a port attribute (see switchdev_attr). - * - * @switchdev_port_attr_set: Set a port attribute (see switchdev_attr). - */ -struct switchdev_ops { -	int	(*switchdev_port_attr_get)(struct net_device *dev, -					   struct switchdev_attr *attr); -	int	(*switchdev_port_attr_set)(struct net_device *dev, -					   const struct switchdev_attr *attr, -					   struct switchdev_trans *trans); -}; -  enum switchdev_notifier_type {  	SWITCHDEV_FDB_ADD_TO_BRIDGE = 1,  	SWITCHDEV_FDB_DEL_TO_BRIDGE, @@ -139,6 +109,7 @@ enum switchdev_notifier_type {  	SWITCHDEV_PORT_OBJ_ADD, /* Blocking. */  	SWITCHDEV_PORT_OBJ_DEL, /* Blocking. */ +	SWITCHDEV_PORT_ATTR_SET, /* May be blocking . */  	SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE,  	SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE, @@ -167,6 +138,13 @@ struct switchdev_notifier_port_obj_info {  	bool handled;  }; +struct switchdev_notifier_port_attr_info { +	struct switchdev_notifier_info info; /* must be first */ +	const struct switchdev_attr *attr; +	struct switchdev_trans *trans; +	bool handled; +}; +  static inline struct net_device *  switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)  { @@ -182,8 +160,6 @@ switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info)  #ifdef CONFIG_NET_SWITCHDEV  void switchdev_deferred_process(void); -int switchdev_port_attr_get(struct net_device *dev, -			    struct switchdev_attr *attr);  int switchdev_port_attr_set(struct net_device *dev,  			    const struct switchdev_attr *attr);  int switchdev_port_obj_add(struct net_device *dev, @@ -195,7 +171,8 @@ int switchdev_port_obj_del(struct net_device *dev,  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); +			     struct switchdev_notifier_info *info, +			     struct netlink_ext_ack *extack);  int register_switchdev_blocking_notifier(struct notifier_block *nb);  int unregister_switchdev_blocking_notifier(struct notifier_block *nb); @@ -207,9 +184,6 @@ void switchdev_port_fwd_mark_set(struct net_device *dev,  				 struct net_device *group_dev,  				 bool joining); -bool switchdev_port_same_parent_id(struct net_device *a, -				   struct net_device *b); -  int switchdev_handle_port_obj_add(struct net_device *dev,  			struct switchdev_notifier_port_obj_info *port_obj_info,  			bool (*check_cb)(const struct net_device *dev), @@ -223,19 +197,18 @@ int switchdev_handle_port_obj_del(struct net_device *dev,  			int (*del_cb)(struct net_device *dev,  				      const struct switchdev_obj *obj)); -#define SWITCHDEV_SET_OPS(netdev, ops) ((netdev)->switchdev_ops = (ops)) +int switchdev_handle_port_attr_set(struct net_device *dev, +			struct switchdev_notifier_port_attr_info *port_attr_info, +			bool (*check_cb)(const struct net_device *dev), +			int (*set_cb)(struct net_device *dev, +				      const struct switchdev_attr *attr, +				      struct switchdev_trans *trans));  #else  static inline void switchdev_deferred_process(void)  {  } -static inline int switchdev_port_attr_get(struct net_device *dev, -					  struct switchdev_attr *attr) -{ -	return -EOPNOTSUPP; -} -  static inline int switchdev_port_attr_set(struct net_device *dev,  					  const struct switchdev_attr *attr)  { @@ -267,7 +240,8 @@ static inline int unregister_switchdev_notifier(struct notifier_block *nb)  static inline int call_switchdev_notifiers(unsigned long val,  					   struct net_device *dev, -					   struct switchdev_notifier_info *info) +					   struct switchdev_notifier_info *info, +					   struct netlink_ext_ack *extack)  {  	return NOTIFY_DONE;  } @@ -293,12 +267,6 @@ call_switchdev_blocking_notifiers(unsigned long val,  	return NOTIFY_DONE;  } -static inline bool switchdev_port_same_parent_id(struct net_device *a, -						 struct net_device *b) -{ -	return false; -} -  static inline int  switchdev_handle_port_obj_add(struct net_device *dev,  			struct switchdev_notifier_port_obj_info *port_obj_info, @@ -321,8 +289,16 @@ switchdev_handle_port_obj_del(struct net_device *dev,  	return 0;  } -#define SWITCHDEV_SET_OPS(netdev, ops) do {} while (0) - +static inline int +switchdev_handle_port_attr_set(struct net_device *dev, +			struct switchdev_notifier_port_attr_info *port_attr_info, +			bool (*check_cb)(const struct net_device *dev), +			int (*set_cb)(struct net_device *dev, +				      const struct switchdev_attr *attr, +				      struct switchdev_trans *trans)) +{ +	return 0; +}  #endif  #endif /* _LINUX_SWITCHDEV_H_ */  |