aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Pirko <jiri@mellanox.com>2015-12-03 06:12:13 -0500
committerDavid S. Miller <davem@davemloft.net>2015-12-03 11:49:26 -0500
commit8fd728566a354f7bc9cb6e781f185b8c39cf505b (patch)
treee11f678462aa460370e9a1e6fb4644f1497b8696
parent764f5e544118508add420724789f46e04dba91eb (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.c23
-rw-r--r--drivers/net/team/team_mode_activebackup.c1
-rw-r--r--drivers/net/team/team_mode_broadcast.c1
-rw-r--r--drivers/net/team/team_mode_loadbalance.c1
-rw-r--r--drivers/net/team/team_mode_random.c1
-rw-r--r--drivers/net/team/team_mode_roundrobin.c1
-rw-r--r--include/linux/if_team.h1
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
1081static int team_upper_dev_link(struct net_device *dev, 1081static 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
1093static void team_upper_dev_unlink(struct net_device *dev, 1095static 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
1100static void __team_port_change_port_added(struct team_port *port, bool linkup); 1101static 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
1222err_option_port_add: 1223err_option_port_add:
1223 team_upper_dev_unlink(dev, port_dev); 1224 team_upper_dev_unlink(team, port);
1224 1225
1225err_set_upper_link: 1226err_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
132static int __init ab_init_module(void) 133static 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
61static int __init bc_init_module(void) 62static 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
666static int __init lb_init_module(void) 667static 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
51static int __init rnd_init_module(void) 52static 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
63static int __init rr_init_module(void) 64static 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