Skip to content

Commit

Permalink
team: allow userspace to take control over carrier
Browse files Browse the repository at this point in the history
Some modes don't require any special carrier handling so
in these cases, the kernel can control the carrier as for
any other interface.  However, some other modes, e.g. lacp,
requires more than just that, so userspace needs to control
the carrier itself.

The daemon today is ready to control it, but the kernel
still can change it based on events.

This fix so that either kernel or userspace is controlling
the carrier.

Signed-off-by: Flavio Leitner <fbl@redhat.com>
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Flavio Leitner authored and David S. Miller committed Feb 6, 2013
1 parent 3b72c2f commit e185483
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 0 deletions.
8 changes: 8 additions & 0 deletions drivers/net/team/team.c
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,7 @@ static bool team_is_mode_set(struct team *team)

static void team_set_no_mode(struct team *team)
{
team->user_carrier_enabled = false;
team->mode = &__team_no_mode;
}

Expand Down Expand Up @@ -1710,6 +1711,10 @@ static netdev_features_t team_fix_features(struct net_device *dev,

static int team_change_carrier(struct net_device *dev, bool new_carrier)
{
struct team *team = netdev_priv(dev);

team->user_carrier_enabled = true;

if (new_carrier)
netif_carrier_on(dev);
else
Expand Down Expand Up @@ -2573,6 +2578,9 @@ static void __team_carrier_check(struct team *team)
struct team_port *port;
bool team_linkup;

if (team->user_carrier_enabled)
return;

team_linkup = false;
list_for_each_entry(port, &team->port_list, list) {
if (port->linkup) {
Expand Down
1 change: 1 addition & 0 deletions include/linux/if_team.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ struct team {

const struct team_mode *mode;
struct team_mode_ops ops;
bool user_carrier_enabled;
bool queue_override_enabled;
struct list_head *qom_lists; /* array of queue override mapping lists */
long mode_priv[TEAM_MODE_PRIV_LONGS];
Expand Down

0 comments on commit e185483

Please sign in to comment.