diff options
Diffstat (limited to 'include/linux/if_team.h')
| -rw-r--r-- | include/linux/if_team.h | 67 | 
1 files changed, 46 insertions, 21 deletions
diff --git a/include/linux/if_team.h b/include/linux/if_team.h index 58404b0c501..8185f57a9c7 100644 --- a/include/linux/if_team.h +++ b/include/linux/if_team.h @@ -28,10 +28,28 @@ struct team;  struct team_port {  	struct net_device *dev; -	struct hlist_node hlist; /* node in hash list */ +	struct hlist_node hlist; /* node in enabled ports hash list */  	struct list_head list; /* node in ordinary list */  	struct team *team; -	int index; +	int index; /* index of enabled port. If disabled, it's set to -1 */ + +	bool linkup; /* either state.linkup or user.linkup */ + +	struct { +		bool linkup; +		u32 speed; +		u8 duplex; +	} state; + +	/* Values set by userspace */ +	struct { +		bool linkup; +		bool linkup_enabled; +	} user; + +	/* Custom gennetlink interface related flags */ +	bool changed; +	bool removed;  	/*  	 * A place for storing original values of the device before it @@ -42,14 +60,6 @@ struct team_port {  		unsigned int mtu;  	} orig; -	bool linkup; -	u32 speed; -	u8 duplex; - -	/* Custom gennetlink interface related flags */ -	bool changed; -	bool removed; -  	struct rcu_head rcu;  }; @@ -68,18 +78,30 @@ struct team_mode_ops {  enum team_option_type {  	TEAM_OPTION_TYPE_U32,  	TEAM_OPTION_TYPE_STRING, +	TEAM_OPTION_TYPE_BINARY, +	TEAM_OPTION_TYPE_BOOL, +}; + +struct team_gsetter_ctx { +	union { +		u32 u32_val; +		const char *str_val; +		struct { +			const void *ptr; +			u32 len; +		} bin_val; +		bool bool_val; +	} data; +	struct team_port *port;  };  struct team_option {  	struct list_head list;  	const char *name; +	bool per_port;  	enum team_option_type type; -	int (*getter)(struct team *team, void *arg); -	int (*setter)(struct team *team, void *arg); - -	/* Custom gennetlink interface related flags */ -	bool changed; -	bool removed; +	int (*getter)(struct team *team, struct team_gsetter_ctx *ctx); +	int (*setter)(struct team *team, struct team_gsetter_ctx *ctx);  };  struct team_mode { @@ -103,13 +125,15 @@ struct team {  	struct mutex lock; /* used for overall locking, e.g. port lists write */  	/* -	 * port lists with port count +	 * List of enabled ports and their count  	 */ -	int port_count; -	struct hlist_head port_hlist[TEAM_PORT_HASHENTRIES]; -	struct list_head port_list; +	int en_port_count; +	struct hlist_head en_port_hlist[TEAM_PORT_HASHENTRIES]; + +	struct list_head port_list; /* list of all ports */  	struct list_head option_list; +	struct list_head option_inst_list; /* list of option instances */  	const struct team_mode *mode;  	struct team_mode_ops ops; @@ -119,7 +143,7 @@ struct team {  static inline struct hlist_head *team_port_index_hash(struct team *team,  						      int port_index)  { -	return &team->port_hlist[port_index & (TEAM_PORT_HASHENTRIES - 1)]; +	return &team->en_port_hlist[port_index & (TEAM_PORT_HASHENTRIES - 1)];  }  static inline struct team_port *team_get_port_by_index(struct team *team, @@ -216,6 +240,7 @@ enum {  	TEAM_ATTR_OPTION_TYPE,		/* u8 */  	TEAM_ATTR_OPTION_DATA,		/* dynamic */  	TEAM_ATTR_OPTION_REMOVED,	/* flag */ +	TEAM_ATTR_OPTION_PORT_IFINDEX,	/* u32 */ /* for per-port options */  	__TEAM_ATTR_OPTION_MAX,  	TEAM_ATTR_OPTION_MAX = __TEAM_ATTR_OPTION_MAX - 1,  |