team: fill-up LAG changeupper info struct and pass it along
authorJiri Pirko <jiri@mellanox.com>
Thu, 3 Dec 2015 11:12:13 +0000 (12:12 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Dec 2015 16:49:26 +0000 (11:49 -0500)
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>
drivers/net/team/team.c
drivers/net/team/team_mode_activebackup.c
drivers/net/team/team_mode_broadcast.c
drivers/net/team/team_mode_loadbalance.c
drivers/net/team/team_mode_random.c
drivers/net/team/team_mode_roundrobin.c
include/linux/if_team.h

index f7b6ff7948b8c66c43fbb2022c74abfec45ae532..dd1504bbb4a75429059d29647527458bb25a8823 100644 (file)
@@ -1078,23 +1078,24 @@ static void team_port_disable_netpoll(struct team_port *port)
 }
 #endif
 
-static int team_upper_dev_link(struct net_device *dev,
-                              struct net_device *port_dev)
+static int team_upper_dev_link(struct team *team, struct team_port *port)
 {
+       struct netdev_lag_upper_info lag_upper_info;
        int err;
 
-       err = netdev_master_upper_dev_link(port_dev, dev, NULL, NULL);
+       lag_upper_info.tx_type = team->mode->lag_tx_type;
+       err = netdev_master_upper_dev_link(port->dev, team->dev, NULL,
+                                          &lag_upper_info);
        if (err)
                return err;
-       port_dev->priv_flags |= IFF_TEAM_PORT;
+       port->dev->priv_flags |= IFF_TEAM_PORT;
        return 0;
 }
 
-static void team_upper_dev_unlink(struct net_device *dev,
-                                 struct net_device *port_dev)
+static void team_upper_dev_unlink(struct team *team, struct team_port *port)
 {
-       netdev_upper_dev_unlink(port_dev, dev);
-       port_dev->priv_flags &= ~IFF_TEAM_PORT;
+       netdev_upper_dev_unlink(port->dev, team->dev);
+       port->dev->priv_flags &= ~IFF_TEAM_PORT;
 }
 
 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)
                goto err_handler_register;
        }
 
-       err = team_upper_dev_link(dev, port_dev);
+       err = team_upper_dev_link(team, port);
        if (err) {
                netdev_err(dev, "Device %s failed to set upper link\n",
                           portname);
@@ -1220,7 +1221,7 @@ static int team_port_add(struct team *team, struct net_device *port_dev)
        return 0;
 
 err_option_port_add:
-       team_upper_dev_unlink(dev, port_dev);
+       team_upper_dev_unlink(team, port);
 
 err_set_upper_link:
        netdev_rx_handler_unregister(port_dev);
@@ -1264,7 +1265,7 @@ static int team_port_del(struct team *team, struct net_device *port_dev)
 
        team_port_disable(team, port);
        list_del_rcu(&port->list);
-       team_upper_dev_unlink(dev, port_dev);
+       team_upper_dev_unlink(team, port);
        netdev_rx_handler_unregister(port_dev);
        team_port_disable_netpoll(port);
        vlan_vids_del_by_dev(port_dev, dev);
index 40fd3381b6932f34ae4b75ff1f5b8c42361512d7..3f189823ba3b2e44e7bc3603af8ef90424421208 100644 (file)
@@ -127,6 +127,7 @@ static const struct team_mode ab_mode = {
        .owner          = THIS_MODULE,
        .priv_size      = sizeof(struct ab_priv),
        .ops            = &ab_mode_ops,
+       .lag_tx_type    = NETDEV_LAG_TX_TYPE_ACTIVEBACKUP,
 };
 
 static int __init ab_init_module(void)
index c366cd299c06a6cf4e0351c5614b066c8e18ee91..302ff35b0cbc72df188a072c3d4ec1c69445146a 100644 (file)
@@ -56,6 +56,7 @@ static const struct team_mode bc_mode = {
        .kind           = "broadcast",
        .owner          = THIS_MODULE,
        .ops            = &bc_mode_ops,
+       .lag_tx_type    = NETDEV_LAG_TX_TYPE_BROADCAST,
 };
 
 static int __init bc_init_module(void)
index a1536d0d83a9700fe1281565c2b4fcb2f81134b0..cdb19b385d42c878e59bf9bf345dd8bfdfd53eb3 100644 (file)
@@ -661,6 +661,7 @@ static const struct team_mode lb_mode = {
        .priv_size      = sizeof(struct lb_priv),
        .port_priv_size = sizeof(struct lb_port_priv),
        .ops            = &lb_mode_ops,
+       .lag_tx_type    = NETDEV_LAG_TX_TYPE_HASH,
 };
 
 static int __init lb_init_module(void)
index cd2f692b8074e6b543a511b5f76a775a7ab17f47..215f845782db40b92d26b53de7983610d7e3eaf0 100644 (file)
@@ -46,6 +46,7 @@ static const struct team_mode rnd_mode = {
        .kind           = "random",
        .owner          = THIS_MODULE,
        .ops            = &rnd_mode_ops,
+       .lag_tx_type    = NETDEV_LAG_TX_TYPE_RANDOM,
 };
 
 static int __init rnd_init_module(void)
index 53665850b59e280c171155690848ca5b5fcbb814..0aa234118c0351f760e28c666602afadf4bb0133 100644 (file)
@@ -58,6 +58,7 @@ static const struct team_mode rr_mode = {
        .owner          = THIS_MODULE,
        .priv_size      = sizeof(struct rr_priv),
        .ops            = &rr_mode_ops,
+       .lag_tx_type    = NETDEV_LAG_TX_TYPE_ROUNDROBIN,
 };
 
 static int __init rr_init_module(void)
index a6aa970758a22065901f861dd29d4b14110bbe3b..b84e49c3a738fc4c2e726c31d78b85296e68a5b5 100644 (file)
@@ -164,6 +164,7 @@ struct team_mode {
        size_t priv_size;
        size_t port_priv_size;
        const struct team_mode_ops *ops;
+       enum netdev_lag_tx_type lag_tx_type;
 };
 
 #define TEAM_PORT_HASHBITS 4