mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 12:35:52 +02:00
net: team: Add new rx_enabled team port option
Allow independent control over rx enablement via the rx_enabled option without affecting tx enablement. This affects the normal enabled option since a port is only considered enabled if both tx and rx are enabled. If this option is not used, then the enabled option will continue to behave exactly as it did before. Tested in a follow-up patch with a new selftest. Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Marc Harvey <marcharvey@google.com> Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com> Link: https://patch.msgid.link/20260409-teaming-driver-internal-v7-8-f47e7589685d@google.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
68f0833f27
commit
0e47569a57
|
|
@ -941,6 +941,28 @@ static void __team_port_disable_rx(struct team *team,
|
|||
WRITE_ONCE(port->rx_enabled, false);
|
||||
}
|
||||
|
||||
static void team_port_enable_rx(struct team *team,
|
||||
struct team_port *port)
|
||||
{
|
||||
if (team_port_rx_enabled(port))
|
||||
return;
|
||||
|
||||
__team_port_enable_rx(team, port);
|
||||
team_adjust_ops(team);
|
||||
team_notify_peers(team);
|
||||
team_mcast_rejoin(team);
|
||||
}
|
||||
|
||||
static void team_port_disable_rx(struct team *team,
|
||||
struct team_port *port)
|
||||
{
|
||||
if (!team_port_rx_enabled(port))
|
||||
return;
|
||||
|
||||
__team_port_disable_rx(team, port);
|
||||
team_adjust_ops(team);
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable just TX on the port by adding to tx-enabled port hashlist and
|
||||
* setting port->tx_index (Might be racy so reader could see incorrect
|
||||
|
|
@ -1487,6 +1509,26 @@ static int team_port_en_option_set(struct team *team,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void team_port_rx_en_option_get(struct team *team,
|
||||
struct team_gsetter_ctx *ctx)
|
||||
{
|
||||
struct team_port *port = ctx->info->port;
|
||||
|
||||
ctx->data.bool_val = team_port_rx_enabled(port);
|
||||
}
|
||||
|
||||
static int team_port_rx_en_option_set(struct team *team,
|
||||
struct team_gsetter_ctx *ctx)
|
||||
{
|
||||
struct team_port *port = ctx->info->port;
|
||||
|
||||
if (ctx->data.bool_val)
|
||||
team_port_enable_rx(team, port);
|
||||
else
|
||||
team_port_disable_rx(team, port);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void team_user_linkup_option_get(struct team *team,
|
||||
struct team_gsetter_ctx *ctx)
|
||||
{
|
||||
|
|
@ -1608,6 +1650,13 @@ static const struct team_option team_options[] = {
|
|||
.getter = team_port_en_option_get,
|
||||
.setter = team_port_en_option_set,
|
||||
},
|
||||
{
|
||||
.name = "rx_enabled",
|
||||
.type = TEAM_OPTION_TYPE_BOOL,
|
||||
.per_port = true,
|
||||
.getter = team_port_rx_en_option_get,
|
||||
.setter = team_port_rx_en_option_set,
|
||||
},
|
||||
{
|
||||
.name = "user_linkup",
|
||||
.type = TEAM_OPTION_TYPE_BOOL,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user