diff options
Diffstat (limited to 'include/net/switchdev.h')
| -rw-r--r-- | include/net/switchdev.h | 108 | 
1 files changed, 108 insertions, 0 deletions
diff --git a/include/net/switchdev.h b/include/net/switchdev.h index e4cac9218ce1..60d806b6a5ae 100644 --- a/include/net/switchdev.h +++ b/include/net/switchdev.h @@ -180,6 +180,14 @@ struct switchdev_obj_in_state_mrp {  typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj); +struct switchdev_brport { +	struct net_device *dev; +	const void *ctx; +	struct notifier_block *atomic_nb; +	struct notifier_block *blocking_nb; +	bool tx_fwd_offload; +}; +  enum switchdev_notifier_type {  	SWITCHDEV_FDB_ADD_TO_BRIDGE = 1,  	SWITCHDEV_FDB_DEL_TO_BRIDGE, @@ -197,6 +205,9 @@ enum switchdev_notifier_type {  	SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE,  	SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE,  	SWITCHDEV_VXLAN_FDB_OFFLOADED, + +	SWITCHDEV_BRPORT_OFFLOADED, +	SWITCHDEV_BRPORT_UNOFFLOADED,  };  struct switchdev_notifier_info { @@ -226,6 +237,11 @@ struct switchdev_notifier_port_attr_info {  	bool handled;  }; +struct switchdev_notifier_brport_info { +	struct switchdev_notifier_info info; /* must be first */ +	const struct switchdev_brport brport; +}; +  static inline struct net_device *  switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)  { @@ -238,8 +254,25 @@ switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info)  	return info->extack;  } +static inline bool +switchdev_fdb_is_dynamically_learned(const struct switchdev_notifier_fdb_info *fdb_info) +{ +	return !fdb_info->added_by_user && !fdb_info->is_local; +} +  #ifdef CONFIG_NET_SWITCHDEV +int switchdev_bridge_port_offload(struct net_device *brport_dev, +				  struct net_device *dev, const void *ctx, +				  struct notifier_block *atomic_nb, +				  struct notifier_block *blocking_nb, +				  bool tx_fwd_offload, +				  struct netlink_ext_ack *extack); +void switchdev_bridge_port_unoffload(struct net_device *brport_dev, +				     const void *ctx, +				     struct notifier_block *atomic_nb, +				     struct notifier_block *blocking_nb); +  void switchdev_deferred_process(void);  int switchdev_port_attr_set(struct net_device *dev,  			    const struct switchdev_attr *attr, @@ -266,6 +299,30 @@ void switchdev_port_fwd_mark_set(struct net_device *dev,  				 struct net_device *group_dev,  				 bool joining); +int switchdev_handle_fdb_add_to_device(struct net_device *dev, +		const struct switchdev_notifier_fdb_info *fdb_info, +		bool (*check_cb)(const struct net_device *dev), +		bool (*foreign_dev_check_cb)(const struct net_device *dev, +					     const struct net_device *foreign_dev), +		int (*add_cb)(struct net_device *dev, +			      const struct net_device *orig_dev, const void *ctx, +			      const struct switchdev_notifier_fdb_info *fdb_info), +		int (*lag_add_cb)(struct net_device *dev, +				  const struct net_device *orig_dev, const void *ctx, +				  const struct switchdev_notifier_fdb_info *fdb_info)); + +int switchdev_handle_fdb_del_to_device(struct net_device *dev, +		const struct switchdev_notifier_fdb_info *fdb_info, +		bool (*check_cb)(const struct net_device *dev), +		bool (*foreign_dev_check_cb)(const struct net_device *dev, +					     const struct net_device *foreign_dev), +		int (*del_cb)(struct net_device *dev, +			      const struct net_device *orig_dev, const void *ctx, +			      const struct switchdev_notifier_fdb_info *fdb_info), +		int (*lag_del_cb)(struct net_device *dev, +				  const struct net_device *orig_dev, const void *ctx, +				  const struct switchdev_notifier_fdb_info *fdb_info)); +  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), @@ -286,6 +343,25 @@ int switchdev_handle_port_attr_set(struct net_device *dev,  				      struct netlink_ext_ack *extack));  #else +static inline int +switchdev_bridge_port_offload(struct net_device *brport_dev, +			      struct net_device *dev, const void *ctx, +			      struct notifier_block *atomic_nb, +			      struct notifier_block *blocking_nb, +			      bool tx_fwd_offload, +			      struct netlink_ext_ack *extack) +{ +	return -EOPNOTSUPP; +} + +static inline void +switchdev_bridge_port_unoffload(struct net_device *brport_dev, +				const void *ctx, +				struct notifier_block *atomic_nb, +				struct notifier_block *blocking_nb) +{ +} +  static inline void switchdev_deferred_process(void)  {  } @@ -350,6 +426,38 @@ call_switchdev_blocking_notifiers(unsigned long val,  }  static inline int +switchdev_handle_fdb_add_to_device(struct net_device *dev, +		const struct switchdev_notifier_fdb_info *fdb_info, +		bool (*check_cb)(const struct net_device *dev), +		bool (*foreign_dev_check_cb)(const struct net_device *dev, +					     const struct net_device *foreign_dev), +		int (*add_cb)(struct net_device *dev, +			      const struct net_device *orig_dev, const void *ctx, +			      const struct switchdev_notifier_fdb_info *fdb_info), +		int (*lag_add_cb)(struct net_device *dev, +				  const struct net_device *orig_dev, const void *ctx, +				  const struct switchdev_notifier_fdb_info *fdb_info)) +{ +	return 0; +} + +static inline int +switchdev_handle_fdb_del_to_device(struct net_device *dev, +		const struct switchdev_notifier_fdb_info *fdb_info, +		bool (*check_cb)(const struct net_device *dev), +		bool (*foreign_dev_check_cb)(const struct net_device *dev, +					     const struct net_device *foreign_dev), +		int (*del_cb)(struct net_device *dev, +			      const struct net_device *orig_dev, const void *ctx, +			      const struct switchdev_notifier_fdb_info *fdb_info), +		int (*lag_del_cb)(struct net_device *dev, +				  const struct net_device *orig_dev, const void *ctx, +				  const struct switchdev_notifier_fdb_info *fdb_info)) +{ +	return 0; +} + +static inline 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),  |