diff options
Diffstat (limited to 'include/linux/if_team.h')
| -rw-r--r-- | include/linux/if_team.h | 74 | 
1 files changed, 69 insertions, 5 deletions
diff --git a/include/linux/if_team.h b/include/linux/if_team.h index 8185f57a9c7..6960fc1841a 100644 --- a/include/linux/if_team.h +++ b/include/linux/if_team.h @@ -13,6 +13,9 @@  #ifdef __KERNEL__ +#include <linux/netpoll.h> +#include <net/sch_generic.h> +  struct team_pcpu_stats {  	u64			rx_packets;  	u64			rx_bytes; @@ -60,9 +63,54 @@ struct team_port {  		unsigned int mtu;  	} orig; -	struct rcu_head rcu; +#ifdef CONFIG_NET_POLL_CONTROLLER +	struct netpoll *np; +#endif + +	long mode_priv[0];  }; +static inline bool team_port_enabled(struct team_port *port) +{ +	return port->index != -1; +} + +static inline bool team_port_txable(struct team_port *port) +{ +	return port->linkup && team_port_enabled(port); +} + +#ifdef CONFIG_NET_POLL_CONTROLLER +static inline void team_netpoll_send_skb(struct team_port *port, +					 struct sk_buff *skb) +{ +	struct netpoll *np = port->np; + +	if (np) +		netpoll_send_skb(np, skb); +} +#else +static inline void team_netpoll_send_skb(struct team_port *port, +					 struct sk_buff *skb) +{ +} +#endif + +static inline int team_dev_queue_xmit(struct team *team, struct team_port *port, +				      struct sk_buff *skb) +{ +	BUILD_BUG_ON(sizeof(skb->queue_mapping) != +		     sizeof(qdisc_skb_cb(skb)->slave_dev_queue_mapping)); +	skb_set_queue_mapping(skb, qdisc_skb_cb(skb)->slave_dev_queue_mapping); + +	skb->dev = port->dev; +	if (unlikely(netpoll_tx_running(port->dev))) { +		team_netpoll_send_skb(port, skb); +		return 0; +	} +	return dev_queue_xmit(skb); +} +  struct team_mode_ops {  	int (*init)(struct team *team);  	void (*exit)(struct team *team); @@ -73,6 +121,8 @@ struct team_mode_ops {  	int (*port_enter)(struct team *team, struct team_port *port);  	void (*port_leave)(struct team *team, struct team_port *port);  	void (*port_change_mac)(struct team *team, struct team_port *port); +	void (*port_enabled)(struct team *team, struct team_port *port); +	void (*port_disabled)(struct team *team, struct team_port *port);  };  enum team_option_type { @@ -82,6 +132,11 @@ enum team_option_type {  	TEAM_OPTION_TYPE_BOOL,  }; +struct team_option_inst_info { +	u32 array_index; +	struct team_port *port; /* != NULL if per-port */ +}; +  struct team_gsetter_ctx {  	union {  		u32 u32_val; @@ -92,23 +147,28 @@ struct team_gsetter_ctx {  		} bin_val;  		bool bool_val;  	} data; -	struct team_port *port; +	struct team_option_inst_info *info;  };  struct team_option {  	struct list_head list;  	const char *name;  	bool per_port; +	unsigned int array_size; /* != 0 means the option is array */  	enum team_option_type type; +	int (*init)(struct team *team, struct team_option_inst_info *info);  	int (*getter)(struct team *team, struct team_gsetter_ctx *ctx);  	int (*setter)(struct team *team, struct team_gsetter_ctx *ctx);  }; +extern void team_option_inst_set_change(struct team_option_inst_info *opt_inst_info); +extern void team_options_change_check(struct team *team); +  struct team_mode { -	struct list_head list;  	const char *kind;  	struct module *owner;  	size_t priv_size; +	size_t port_priv_size;  	const struct team_mode_ops *ops;  }; @@ -178,8 +238,11 @@ extern int team_options_register(struct team *team,  extern void team_options_unregister(struct team *team,  				    const struct team_option *option,  				    size_t option_count); -extern int team_mode_register(struct team_mode *mode); -extern int team_mode_unregister(struct team_mode *mode); +extern int team_mode_register(const struct team_mode *mode); +extern void team_mode_unregister(const struct team_mode *mode); + +#define TEAM_DEFAULT_NUM_TX_QUEUES 16 +#define TEAM_DEFAULT_NUM_RX_QUEUES 16  #endif /* __KERNEL__ */ @@ -241,6 +304,7 @@ enum {  	TEAM_ATTR_OPTION_DATA,		/* dynamic */  	TEAM_ATTR_OPTION_REMOVED,	/* flag */  	TEAM_ATTR_OPTION_PORT_IFINDEX,	/* u32 */ /* for per-port options */ +	TEAM_ATTR_OPTION_ARRAY_INDEX,	/* u32 */ /* for array options */  	__TEAM_ATTR_OPTION_MAX,  	TEAM_ATTR_OPTION_MAX = __TEAM_ATTR_OPTION_MAX - 1,  |