Skip to content

Commit 542575f

Browse files
neocturnedavem330
authored andcommitted
bridge: implement get_link_ksettings ethtool method
We return the maximum speed of all active ports. This matches how the link speed would give an upper limit for traffic to/from any single peer if the bridge were replaced with a hardware switch. Signed-off-by: Matthias Schiffer <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 36fe3a6 commit 542575f

File tree

1 file changed

+34
-2
lines changed

1 file changed

+34
-2
lines changed

net/bridge/br_device.c

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,37 @@ static void br_getinfo(struct net_device *dev, struct ethtool_drvinfo *info)
263263
strlcpy(info->bus_info, "N/A", sizeof(info->bus_info));
264264
}
265265

266+
static int br_get_link_ksettings(struct net_device *dev,
267+
struct ethtool_link_ksettings *cmd)
268+
{
269+
struct net_bridge *br = netdev_priv(dev);
270+
struct net_bridge_port *p;
271+
272+
cmd->base.duplex = DUPLEX_UNKNOWN;
273+
cmd->base.port = PORT_OTHER;
274+
cmd->base.speed = SPEED_UNKNOWN;
275+
276+
list_for_each_entry(p, &br->port_list, list) {
277+
struct ethtool_link_ksettings ecmd;
278+
struct net_device *pdev = p->dev;
279+
280+
if (!netif_running(pdev) || !netif_oper_up(pdev))
281+
continue;
282+
283+
if (__ethtool_get_link_ksettings(pdev, &ecmd))
284+
continue;
285+
286+
if (ecmd.base.speed == (__u32)SPEED_UNKNOWN)
287+
continue;
288+
289+
if (cmd->base.speed == (__u32)SPEED_UNKNOWN ||
290+
cmd->base.speed < ecmd.base.speed)
291+
cmd->base.speed = ecmd.base.speed;
292+
}
293+
294+
return 0;
295+
}
296+
266297
static netdev_features_t br_fix_features(struct net_device *dev,
267298
netdev_features_t features)
268299
{
@@ -365,8 +396,9 @@ static int br_del_slave(struct net_device *dev, struct net_device *slave_dev)
365396
}
366397

367398
static const struct ethtool_ops br_ethtool_ops = {
368-
.get_drvinfo = br_getinfo,
369-
.get_link = ethtool_op_get_link,
399+
.get_drvinfo = br_getinfo,
400+
.get_link = ethtool_op_get_link,
401+
.get_link_ksettings = br_get_link_ksettings,
370402
};
371403

372404
static const struct net_device_ops br_netdev_ops = {

0 commit comments

Comments
 (0)