diff options
author | Jiri Pirko <jiri@mellanox.com> | 2015-12-03 06:12:13 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-12-03 11:49:26 -0500 |
commit | 8fd728566a354f7bc9cb6e781f185b8c39cf505b (patch) | |
tree | e11f678462aa460370e9a1e6fb4644f1497b8696 | |
parent | 764f5e544118508add420724789f46e04dba91eb (diff) |
team: fill-up LAG changeupper info struct and pass it along
Initialize netdev_lag_upper_info structure by TX type according to
current team mode and pass it along via netdev_master_upper_dev_link.
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/team/team.c | 23 | ||||
-rw-r--r-- | drivers/net/team/team_mode_activebackup.c | 1 | ||||
-rw-r--r-- | drivers/net/team/team_mode_broadcast.c | 1 | ||||
-rw-r--r-- | drivers/net/team/team_mode_loadbalance.c | 1 | ||||
-rw-r--r-- | drivers/net/team/team_mode_random.c | 1 | ||||
-rw-r--r-- | drivers/net/team/team_mode_roundrobin.c | 1 | ||||
-rw-r--r-- | include/linux/if_team.h | 1 |
7 files changed, 18 insertions, 11 deletions
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index f7b6ff7948b8..dd1504bbb4a7 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -1078,23 +1078,24 @@ static void team_port_disable_netpoll(struct team_port *port) | |||
1078 | } | 1078 | } |
1079 | #endif | 1079 | #endif |
1080 | 1080 | ||
1081 | static int team_upper_dev_link(struct net_device *dev, | 1081 | static int team_upper_dev_link(struct team *team, struct team_port *port) |
1082 | struct net_device *port_dev) | ||
1083 | { | 1082 | { |
1083 | struct netdev_lag_upper_info lag_upper_info; | ||
1084 | int err; | 1084 | int err; |
1085 | 1085 | ||
1086 | err = netdev_master_upper_dev_link(port_dev, dev, NULL, NULL); | 1086 | lag_upper_info.tx_type = team->mode->lag_tx_type; |
1087 | err = netdev_master_upper_dev_link(port->dev, team->dev, NULL, | ||
1088 | &lag_upper_info); | ||
1087 | if (err) | 1089 | if (err) |
1088 | return err; | 1090 | return err; |
1089 | port_dev->priv_flags |= IFF_TEAM_PORT; | 1091 | port->dev->priv_flags |= IFF_TEAM_PORT; |
1090 | return 0; | 1092 | return 0; |
1091 | } | 1093 | } |
1092 | 1094 | ||
1093 | static void team_upper_dev_unlink(struct net_device *dev, | 1095 | static void team_upper_dev_unlink(struct team *team, struct team_port *port) |
1094 | struct net_device *port_dev) | ||
1095 | { | 1096 | { |
1096 | netdev_upper_dev_unlink(port_dev, dev); | 1097 | netdev_upper_dev_unlink(port->dev, team->dev); |
1097 | port_dev->priv_flags &= ~IFF_TEAM_PORT; | 1098 | port->dev->priv_flags &= ~IFF_TEAM_PORT; |
1098 | } | 1099 | } |
1099 | 1100 | ||
1100 | static void __team_port_change_port_added(struct team_port *port, bool linkup); | 1101 | static void __team_port_change_port_added(struct team_port *port, bool linkup); |
@@ -1194,7 +1195,7 @@ static int team_port_add(struct team *team, struct net_device *port_dev) | |||
1194 | goto err_handler_register; | 1195 | goto err_handler_register; |
1195 | } | 1196 | } |
1196 | 1197 | ||
1197 | err = team_upper_dev_link(dev, port_dev); | 1198 | err = team_upper_dev_link(team, port); |
1198 | if (err) { | 1199 | if (err) { |
1199 | netdev_err(dev, "Device %s failed to set upper link\n", | 1200 | netdev_err(dev, "Device %s failed to set upper link\n", |
1200 | portname); | 1201 | portname); |
@@ -1220,7 +1221,7 @@ static int team_port_add(struct team *team, struct net_device *port_dev) | |||
1220 | return 0; | 1221 | return 0; |
1221 | 1222 | ||
1222 | err_option_port_add: | 1223 | err_option_port_add: |
1223 | team_upper_dev_unlink(dev, port_dev); | 1224 | team_upper_dev_unlink(team, port); |
1224 | 1225 | ||
1225 | err_set_upper_link: | 1226 | err_set_upper_link: |
1226 | netdev_rx_handler_unregister(port_dev); | 1227 | netdev_rx_handler_unregister(port_dev); |
@@ -1264,7 +1265,7 @@ static int team_port_del(struct team *team, struct net_device *port_dev) | |||
1264 | 1265 | ||
1265 | team_port_disable(team, port); | 1266 | team_port_disable(team, port); |
1266 | list_del_rcu(&port->list); | 1267 | list_del_rcu(&port->list); |
1267 | team_upper_dev_unlink(dev, port_dev); | 1268 | team_upper_dev_unlink(team, port); |
1268 | netdev_rx_handler_unregister(port_dev); | 1269 | netdev_rx_handler_unregister(port_dev); |
1269 | team_port_disable_netpoll(port); | 1270 | team_port_disable_netpoll(port); |
1270 | vlan_vids_del_by_dev(port_dev, dev); | 1271 | vlan_vids_del_by_dev(port_dev, dev); |
diff --git a/drivers/net/team/team_mode_activebackup.c b/drivers/net/team/team_mode_activebackup.c index 40fd3381b693..3f189823ba3b 100644 --- a/drivers/net/team/team_mode_activebackup.c +++ b/drivers/net/team/team_mode_activebackup.c | |||
@@ -127,6 +127,7 @@ static const struct team_mode ab_mode = { | |||
127 | .owner = THIS_MODULE, | 127 | .owner = THIS_MODULE, |
128 | .priv_size = sizeof(struct ab_priv), | 128 | .priv_size = sizeof(struct ab_priv), |
129 | .ops = &ab_mode_ops, | 129 | .ops = &ab_mode_ops, |
130 | .lag_tx_type = NETDEV_LAG_TX_TYPE_ACTIVEBACKUP, | ||
130 | }; | 131 | }; |
131 | 132 | ||
132 | static int __init ab_init_module(void) | 133 | static int __init ab_init_module(void) |
diff --git a/drivers/net/team/team_mode_broadcast.c b/drivers/net/team/team_mode_broadcast.c index c366cd299c06..302ff35b0cbc 100644 --- a/drivers/net/team/team_mode_broadcast.c +++ b/drivers/net/team/team_mode_broadcast.c | |||
@@ -56,6 +56,7 @@ static const struct team_mode bc_mode = { | |||
56 | .kind = "broadcast", | 56 | .kind = "broadcast", |
57 | .owner = THIS_MODULE, | 57 | .owner = THIS_MODULE, |
58 | .ops = &bc_mode_ops, | 58 | .ops = &bc_mode_ops, |
59 | .lag_tx_type = NETDEV_LAG_TX_TYPE_BROADCAST, | ||
59 | }; | 60 | }; |
60 | 61 | ||
61 | static int __init bc_init_module(void) | 62 | static int __init bc_init_module(void) |
diff --git a/drivers/net/team/team_mode_loadbalance.c b/drivers/net/team/team_mode_loadbalance.c index a1536d0d83a9..cdb19b385d42 100644 --- a/drivers/net/team/team_mode_loadbalance.c +++ b/drivers/net/team/team_mode_loadbalance.c | |||
@@ -661,6 +661,7 @@ static const struct team_mode lb_mode = { | |||
661 | .priv_size = sizeof(struct lb_priv), | 661 | .priv_size = sizeof(struct lb_priv), |
662 | .port_priv_size = sizeof(struct lb_port_priv), | 662 | .port_priv_size = sizeof(struct lb_port_priv), |
663 | .ops = &lb_mode_ops, | 663 | .ops = &lb_mode_ops, |
664 | .lag_tx_type = NETDEV_LAG_TX_TYPE_HASH, | ||
664 | }; | 665 | }; |
665 | 666 | ||
666 | static int __init lb_init_module(void) | 667 | static int __init lb_init_module(void) |
diff --git a/drivers/net/team/team_mode_random.c b/drivers/net/team/team_mode_random.c index cd2f692b8074..215f845782db 100644 --- a/drivers/net/team/team_mode_random.c +++ b/drivers/net/team/team_mode_random.c | |||
@@ -46,6 +46,7 @@ static const struct team_mode rnd_mode = { | |||
46 | .kind = "random", | 46 | .kind = "random", |
47 | .owner = THIS_MODULE, | 47 | .owner = THIS_MODULE, |
48 | .ops = &rnd_mode_ops, | 48 | .ops = &rnd_mode_ops, |
49 | .lag_tx_type = NETDEV_LAG_TX_TYPE_RANDOM, | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | static int __init rnd_init_module(void) | 52 | static int __init rnd_init_module(void) |
diff --git a/drivers/net/team/team_mode_roundrobin.c b/drivers/net/team/team_mode_roundrobin.c index 53665850b59e..0aa234118c03 100644 --- a/drivers/net/team/team_mode_roundrobin.c +++ b/drivers/net/team/team_mode_roundrobin.c | |||
@@ -58,6 +58,7 @@ static const struct team_mode rr_mode = { | |||
58 | .owner = THIS_MODULE, | 58 | .owner = THIS_MODULE, |
59 | .priv_size = sizeof(struct rr_priv), | 59 | .priv_size = sizeof(struct rr_priv), |
60 | .ops = &rr_mode_ops, | 60 | .ops = &rr_mode_ops, |
61 | .lag_tx_type = NETDEV_LAG_TX_TYPE_ROUNDROBIN, | ||
61 | }; | 62 | }; |
62 | 63 | ||
63 | static int __init rr_init_module(void) | 64 | static int __init rr_init_module(void) |
diff --git a/include/linux/if_team.h b/include/linux/if_team.h index a6aa970758a2..b84e49c3a738 100644 --- a/include/linux/if_team.h +++ b/include/linux/if_team.h | |||
@@ -164,6 +164,7 @@ struct team_mode { | |||
164 | size_t priv_size; | 164 | size_t priv_size; |
165 | size_t port_priv_size; | 165 | size_t port_priv_size; |
166 | const struct team_mode_ops *ops; | 166 | const struct team_mode_ops *ops; |
167 | enum netdev_lag_tx_type lag_tx_type; | ||
167 | }; | 168 | }; |
168 | 169 | ||
169 | #define TEAM_PORT_HASHBITS 4 | 170 | #define TEAM_PORT_HASHBITS 4 |