-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
net: dsa: allow the DSA master to be seen and changed through rtnetlink
Some DSA switches have multiple CPU ports, which can be used to improve CPU termination throughput, but DSA, through dsa_tree_setup_cpu_ports(), sets up only the first one, leading to suboptimal use of hardware. The desire is to not change the default configuration but to permit the user to create a dynamic mapping between individual user ports and the CPU port that they are served by, configurable through rtnetlink. It is also intended to permit load balancing between CPU ports, and in that case, the foreseen model is for the DSA master to be a bonding interface whose lowers are the physical DSA masters. To that end, we create a struct rtnl_link_ops for DSA user ports with the "dsa" kind. We expose the IFLA_DSA_MASTER link attribute that contains the ifindex of the newly desired DSA master. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
- Loading branch information
Vladimir Oltean
authored and
Paolo Abeni
committed
Sep 20, 2022
1 parent
8f6a19c
commit 95f510d
Showing
9 changed files
with
372 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright 2022 NXP | ||
*/ | ||
#include <linux/netdevice.h> | ||
#include <net/rtnetlink.h> | ||
|
||
#include "dsa_priv.h" | ||
|
||
static const struct nla_policy dsa_policy[IFLA_DSA_MAX + 1] = { | ||
[IFLA_DSA_MASTER] = { .type = NLA_U32 }, | ||
}; | ||
|
||
static int dsa_changelink(struct net_device *dev, struct nlattr *tb[], | ||
struct nlattr *data[], | ||
struct netlink_ext_ack *extack) | ||
{ | ||
int err; | ||
|
||
if (!data) | ||
return 0; | ||
|
||
if (data[IFLA_DSA_MASTER]) { | ||
u32 ifindex = nla_get_u32(data[IFLA_DSA_MASTER]); | ||
struct net_device *master; | ||
|
||
master = __dev_get_by_index(dev_net(dev), ifindex); | ||
if (!master) | ||
return -EINVAL; | ||
|
||
err = dsa_slave_change_master(dev, master, extack); | ||
if (err) | ||
return err; | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
static size_t dsa_get_size(const struct net_device *dev) | ||
{ | ||
return nla_total_size(sizeof(u32)) + /* IFLA_DSA_MASTER */ | ||
0; | ||
} | ||
|
||
static int dsa_fill_info(struct sk_buff *skb, const struct net_device *dev) | ||
{ | ||
struct net_device *master = dsa_slave_to_master(dev); | ||
|
||
if (nla_put_u32(skb, IFLA_DSA_MASTER, master->ifindex)) | ||
return -EMSGSIZE; | ||
|
||
return 0; | ||
} | ||
|
||
struct rtnl_link_ops dsa_link_ops __read_mostly = { | ||
.kind = "dsa", | ||
.priv_size = sizeof(struct dsa_port), | ||
.maxtype = IFLA_DSA_MAX, | ||
.policy = dsa_policy, | ||
.changelink = dsa_changelink, | ||
.get_size = dsa_get_size, | ||
.fill_info = dsa_fill_info, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.