Skip to content

Commit aabf23d

Browse files
committed
Merge branch 'ethtool-netlink-interface-preliminary-part'
Michal Kubecek says: ==================== ethtool netlink interface, preliminary part As Jakub Kicinski suggested in ethtool netlink v7 discussion, this submission consists only of preliminary patches which raised no objections; first four patches already have Acked-by or Reviewed-by. - patch 1 exposes permanent hardware address (as shown by "ethtool -P") via rtnetlink - patch 2 is renames existing netlink helper to a better name - patch 3 and 4 reorganize existing ethtool code (no functional change) - patch 5 makes the table of link mode names available as an ethtool string set (will be needed for the netlink interface) Once we get these out of the way, v8 of the first part of the ethtool netlink interface will follow. Changes from v2 to v3: fix SPDX licence identifiers (patch 3 and 5). Changes from v1 to v2: restore build time check that all link modes have assigned a name (patch 5). ==================== Reviewed-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
2 parents 545a682 + 428c122 commit aabf23d

File tree

11 files changed

+219
-90
lines changed

11 files changed

+219
-90
lines changed

include/net/netlink.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1735,7 +1735,7 @@ static inline void nla_nest_cancel(struct sk_buff *skb, struct nlattr *start)
17351735
}
17361736

17371737
/**
1738-
* nla_validate_nested - Validate a stream of nested attributes
1738+
* __nla_validate_nested - Validate a stream of nested attributes
17391739
* @start: container attribute
17401740
* @maxtype: maximum attribute type to be expected
17411741
* @policy: validation policy
@@ -1758,9 +1758,9 @@ static inline int __nla_validate_nested(const struct nlattr *start, int maxtype,
17581758
}
17591759

17601760
static inline int
1761-
nl80211_validate_nested(const struct nlattr *start, int maxtype,
1762-
const struct nla_policy *policy,
1763-
struct netlink_ext_ack *extack)
1761+
nla_validate_nested(const struct nlattr *start, int maxtype,
1762+
const struct nla_policy *policy,
1763+
struct netlink_ext_ack *extack)
17641764
{
17651765
return __nla_validate_nested(start, maxtype, policy,
17661766
NL_VALIDATE_STRICT, extack);

include/uapi/linux/ethtool.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,7 @@ struct ethtool_pauseparam {
593593
* @ETH_SS_RSS_HASH_FUNCS: RSS hush function names
594594
* @ETH_SS_PHY_STATS: Statistic names, for use with %ETHTOOL_GPHYSTATS
595595
* @ETH_SS_PHY_TUNABLES: PHY tunable names
596+
* @ETH_SS_LINK_MODES: link mode names
596597
*/
597598
enum ethtool_stringset {
598599
ETH_SS_TEST = 0,
@@ -604,6 +605,7 @@ enum ethtool_stringset {
604605
ETH_SS_TUNABLES,
605606
ETH_SS_PHY_STATS,
606607
ETH_SS_PHY_TUNABLES,
608+
ETH_SS_LINK_MODES,
607609
};
608610

609611
/**

include/uapi/linux/if_link.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ enum {
169169
IFLA_MAX_MTU,
170170
IFLA_PROP_LIST,
171171
IFLA_ALT_IFNAME, /* Alternative ifname */
172+
IFLA_PERM_ADDRESS,
172173
__IFLA_MAX
173174
};
174175

net/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ obj-$(CONFIG_NET) += $(tmp-y)
1313

1414
# LLC has to be linked before the files in net/802/
1515
obj-$(CONFIG_LLC) += llc/
16-
obj-$(CONFIG_NET) += ethernet/ 802/ sched/ netlink/ bpf/
16+
obj-$(CONFIG_NET) += ethernet/ 802/ sched/ netlink/ bpf/ ethtool/
1717
obj-$(CONFIG_NETFILTER) += netfilter/
1818
obj-$(CONFIG_INET) += ipv4/
1919
obj-$(CONFIG_TLS) += tls/

net/core/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ obj-y := sock.o request_sock.o skbuff.o datagram.o stream.o scm.o \
88

99
obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
1010

11-
obj-y += dev.o ethtool.o dev_addr_lists.o dst.o netevent.o \
11+
obj-y += dev.o dev_addr_lists.o dst.o netevent.o \
1212
neighbour.o rtnetlink.o utils.o link_watch.o filter.o \
1313
sock_diag.o dev_ioctl.o tso.o sock_reuseport.o \
1414
fib_notifier.o xdp.o flow_offload.o

net/core/rtnetlink.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,
10411041
+ nla_total_size(4) /* IFLA_MIN_MTU */
10421042
+ nla_total_size(4) /* IFLA_MAX_MTU */
10431043
+ rtnl_prop_list_size(dev)
1044+
+ nla_total_size(MAX_ADDR_LEN) /* IFLA_PERM_ADDRESS */
10441045
+ 0;
10451046
}
10461047

@@ -1757,6 +1758,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
17571758
nla_put_s32(skb, IFLA_NEW_IFINDEX, new_ifindex) < 0)
17581759
goto nla_put_failure;
17591760

1761+
if (memchr_inv(dev->perm_addr, '\0', dev->addr_len) &&
1762+
nla_put(skb, IFLA_PERM_ADDRESS, dev->addr_len, dev->perm_addr))
1763+
goto nla_put_failure;
17601764

17611765
rcu_read_lock();
17621766
if (rtnl_fill_link_af(skb, dev, ext_filter_mask))
@@ -1822,6 +1826,7 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = {
18221826
[IFLA_PROP_LIST] = { .type = NLA_NESTED },
18231827
[IFLA_ALT_IFNAME] = { .type = NLA_STRING,
18241828
.len = ALTIFNAMSIZ - 1 },
1829+
[IFLA_PERM_ADDRESS] = { .type = NLA_REJECT },
18251830
};
18261831

18271832
static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = {

net/ethtool/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# SPDX-License-Identifier: GPL-2.0-only
2+
3+
obj-y += ioctl.o common.o

net/ethtool/common.c

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
3+
#include "common.h"
4+
5+
const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
6+
[NETIF_F_SG_BIT] = "tx-scatter-gather",
7+
[NETIF_F_IP_CSUM_BIT] = "tx-checksum-ipv4",
8+
[NETIF_F_HW_CSUM_BIT] = "tx-checksum-ip-generic",
9+
[NETIF_F_IPV6_CSUM_BIT] = "tx-checksum-ipv6",
10+
[NETIF_F_HIGHDMA_BIT] = "highdma",
11+
[NETIF_F_FRAGLIST_BIT] = "tx-scatter-gather-fraglist",
12+
[NETIF_F_HW_VLAN_CTAG_TX_BIT] = "tx-vlan-hw-insert",
13+
14+
[NETIF_F_HW_VLAN_CTAG_RX_BIT] = "rx-vlan-hw-parse",
15+
[NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter",
16+
[NETIF_F_HW_VLAN_STAG_TX_BIT] = "tx-vlan-stag-hw-insert",
17+
[NETIF_F_HW_VLAN_STAG_RX_BIT] = "rx-vlan-stag-hw-parse",
18+
[NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
19+
[NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged",
20+
[NETIF_F_GSO_BIT] = "tx-generic-segmentation",
21+
[NETIF_F_LLTX_BIT] = "tx-lockless",
22+
[NETIF_F_NETNS_LOCAL_BIT] = "netns-local",
23+
[NETIF_F_GRO_BIT] = "rx-gro",
24+
[NETIF_F_GRO_HW_BIT] = "rx-gro-hw",
25+
[NETIF_F_LRO_BIT] = "rx-lro",
26+
27+
[NETIF_F_TSO_BIT] = "tx-tcp-segmentation",
28+
[NETIF_F_GSO_ROBUST_BIT] = "tx-gso-robust",
29+
[NETIF_F_TSO_ECN_BIT] = "tx-tcp-ecn-segmentation",
30+
[NETIF_F_TSO_MANGLEID_BIT] = "tx-tcp-mangleid-segmentation",
31+
[NETIF_F_TSO6_BIT] = "tx-tcp6-segmentation",
32+
[NETIF_F_FSO_BIT] = "tx-fcoe-segmentation",
33+
[NETIF_F_GSO_GRE_BIT] = "tx-gre-segmentation",
34+
[NETIF_F_GSO_GRE_CSUM_BIT] = "tx-gre-csum-segmentation",
35+
[NETIF_F_GSO_IPXIP4_BIT] = "tx-ipxip4-segmentation",
36+
[NETIF_F_GSO_IPXIP6_BIT] = "tx-ipxip6-segmentation",
37+
[NETIF_F_GSO_UDP_TUNNEL_BIT] = "tx-udp_tnl-segmentation",
38+
[NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT] = "tx-udp_tnl-csum-segmentation",
39+
[NETIF_F_GSO_PARTIAL_BIT] = "tx-gso-partial",
40+
[NETIF_F_GSO_SCTP_BIT] = "tx-sctp-segmentation",
41+
[NETIF_F_GSO_ESP_BIT] = "tx-esp-segmentation",
42+
[NETIF_F_GSO_UDP_L4_BIT] = "tx-udp-segmentation",
43+
44+
[NETIF_F_FCOE_CRC_BIT] = "tx-checksum-fcoe-crc",
45+
[NETIF_F_SCTP_CRC_BIT] = "tx-checksum-sctp",
46+
[NETIF_F_FCOE_MTU_BIT] = "fcoe-mtu",
47+
[NETIF_F_NTUPLE_BIT] = "rx-ntuple-filter",
48+
[NETIF_F_RXHASH_BIT] = "rx-hashing",
49+
[NETIF_F_RXCSUM_BIT] = "rx-checksum",
50+
[NETIF_F_NOCACHE_COPY_BIT] = "tx-nocache-copy",
51+
[NETIF_F_LOOPBACK_BIT] = "loopback",
52+
[NETIF_F_RXFCS_BIT] = "rx-fcs",
53+
[NETIF_F_RXALL_BIT] = "rx-all",
54+
[NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload",
55+
[NETIF_F_HW_TC_BIT] = "hw-tc-offload",
56+
[NETIF_F_HW_ESP_BIT] = "esp-hw-offload",
57+
[NETIF_F_HW_ESP_TX_CSUM_BIT] = "esp-tx-csum-hw-offload",
58+
[NETIF_F_RX_UDP_TUNNEL_PORT_BIT] = "rx-udp_tunnel-port-offload",
59+
[NETIF_F_HW_TLS_RECORD_BIT] = "tls-hw-record",
60+
[NETIF_F_HW_TLS_TX_BIT] = "tls-hw-tx-offload",
61+
[NETIF_F_HW_TLS_RX_BIT] = "tls-hw-rx-offload",
62+
};
63+
64+
const char
65+
rss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN] = {
66+
[ETH_RSS_HASH_TOP_BIT] = "toeplitz",
67+
[ETH_RSS_HASH_XOR_BIT] = "xor",
68+
[ETH_RSS_HASH_CRC32_BIT] = "crc32",
69+
};
70+
71+
const char
72+
tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
73+
[ETHTOOL_ID_UNSPEC] = "Unspec",
74+
[ETHTOOL_RX_COPYBREAK] = "rx-copybreak",
75+
[ETHTOOL_TX_COPYBREAK] = "tx-copybreak",
76+
[ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout",
77+
};
78+
79+
const char
80+
phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
81+
[ETHTOOL_ID_UNSPEC] = "Unspec",
82+
[ETHTOOL_PHY_DOWNSHIFT] = "phy-downshift",
83+
[ETHTOOL_PHY_FAST_LINK_DOWN] = "phy-fast-link-down",
84+
[ETHTOOL_PHY_EDPD] = "phy-energy-detect-power-down",
85+
};
86+
87+
#define __LINK_MODE_NAME(speed, type, duplex) \
88+
#speed "base" #type "/" #duplex
89+
#define __DEFINE_LINK_MODE_NAME(speed, type, duplex) \
90+
[ETHTOOL_LINK_MODE(speed, type, duplex)] = \
91+
__LINK_MODE_NAME(speed, type, duplex)
92+
#define __DEFINE_SPECIAL_MODE_NAME(_mode, _name) \
93+
[ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = _name
94+
95+
const char link_mode_names[][ETH_GSTRING_LEN] = {
96+
__DEFINE_LINK_MODE_NAME(10, T, Half),
97+
__DEFINE_LINK_MODE_NAME(10, T, Full),
98+
__DEFINE_LINK_MODE_NAME(100, T, Half),
99+
__DEFINE_LINK_MODE_NAME(100, T, Full),
100+
__DEFINE_LINK_MODE_NAME(1000, T, Half),
101+
__DEFINE_LINK_MODE_NAME(1000, T, Full),
102+
__DEFINE_SPECIAL_MODE_NAME(Autoneg, "Autoneg"),
103+
__DEFINE_SPECIAL_MODE_NAME(TP, "TP"),
104+
__DEFINE_SPECIAL_MODE_NAME(AUI, "AUI"),
105+
__DEFINE_SPECIAL_MODE_NAME(MII, "MII"),
106+
__DEFINE_SPECIAL_MODE_NAME(FIBRE, "FIBRE"),
107+
__DEFINE_SPECIAL_MODE_NAME(BNC, "BNC"),
108+
__DEFINE_LINK_MODE_NAME(10000, T, Full),
109+
__DEFINE_SPECIAL_MODE_NAME(Pause, "Pause"),
110+
__DEFINE_SPECIAL_MODE_NAME(Asym_Pause, "Asym_Pause"),
111+
__DEFINE_LINK_MODE_NAME(2500, X, Full),
112+
__DEFINE_SPECIAL_MODE_NAME(Backplane, "Backplane"),
113+
__DEFINE_LINK_MODE_NAME(1000, KX, Full),
114+
__DEFINE_LINK_MODE_NAME(10000, KX4, Full),
115+
__DEFINE_LINK_MODE_NAME(10000, KR, Full),
116+
__DEFINE_SPECIAL_MODE_NAME(10000baseR_FEC, "10000baseR_FEC"),
117+
__DEFINE_LINK_MODE_NAME(20000, MLD2, Full),
118+
__DEFINE_LINK_MODE_NAME(20000, KR2, Full),
119+
__DEFINE_LINK_MODE_NAME(40000, KR4, Full),
120+
__DEFINE_LINK_MODE_NAME(40000, CR4, Full),
121+
__DEFINE_LINK_MODE_NAME(40000, SR4, Full),
122+
__DEFINE_LINK_MODE_NAME(40000, LR4, Full),
123+
__DEFINE_LINK_MODE_NAME(56000, KR4, Full),
124+
__DEFINE_LINK_MODE_NAME(56000, CR4, Full),
125+
__DEFINE_LINK_MODE_NAME(56000, SR4, Full),
126+
__DEFINE_LINK_MODE_NAME(56000, LR4, Full),
127+
__DEFINE_LINK_MODE_NAME(25000, CR, Full),
128+
__DEFINE_LINK_MODE_NAME(25000, KR, Full),
129+
__DEFINE_LINK_MODE_NAME(25000, SR, Full),
130+
__DEFINE_LINK_MODE_NAME(50000, CR2, Full),
131+
__DEFINE_LINK_MODE_NAME(50000, KR2, Full),
132+
__DEFINE_LINK_MODE_NAME(100000, KR4, Full),
133+
__DEFINE_LINK_MODE_NAME(100000, SR4, Full),
134+
__DEFINE_LINK_MODE_NAME(100000, CR4, Full),
135+
__DEFINE_LINK_MODE_NAME(100000, LR4_ER4, Full),
136+
__DEFINE_LINK_MODE_NAME(50000, SR2, Full),
137+
__DEFINE_LINK_MODE_NAME(1000, X, Full),
138+
__DEFINE_LINK_MODE_NAME(10000, CR, Full),
139+
__DEFINE_LINK_MODE_NAME(10000, SR, Full),
140+
__DEFINE_LINK_MODE_NAME(10000, LR, Full),
141+
__DEFINE_LINK_MODE_NAME(10000, LRM, Full),
142+
__DEFINE_LINK_MODE_NAME(10000, ER, Full),
143+
__DEFINE_LINK_MODE_NAME(2500, T, Full),
144+
__DEFINE_LINK_MODE_NAME(5000, T, Full),
145+
__DEFINE_SPECIAL_MODE_NAME(FEC_NONE, "None"),
146+
__DEFINE_SPECIAL_MODE_NAME(FEC_RS, "RS"),
147+
__DEFINE_SPECIAL_MODE_NAME(FEC_BASER, "BASER"),
148+
__DEFINE_LINK_MODE_NAME(50000, KR, Full),
149+
__DEFINE_LINK_MODE_NAME(50000, SR, Full),
150+
__DEFINE_LINK_MODE_NAME(50000, CR, Full),
151+
__DEFINE_LINK_MODE_NAME(50000, LR_ER_FR, Full),
152+
__DEFINE_LINK_MODE_NAME(50000, DR, Full),
153+
__DEFINE_LINK_MODE_NAME(100000, KR2, Full),
154+
__DEFINE_LINK_MODE_NAME(100000, SR2, Full),
155+
__DEFINE_LINK_MODE_NAME(100000, CR2, Full),
156+
__DEFINE_LINK_MODE_NAME(100000, LR2_ER2_FR2, Full),
157+
__DEFINE_LINK_MODE_NAME(100000, DR2, Full),
158+
__DEFINE_LINK_MODE_NAME(200000, KR4, Full),
159+
__DEFINE_LINK_MODE_NAME(200000, SR4, Full),
160+
__DEFINE_LINK_MODE_NAME(200000, LR4_ER4_FR4, Full),
161+
__DEFINE_LINK_MODE_NAME(200000, DR4, Full),
162+
__DEFINE_LINK_MODE_NAME(200000, CR4, Full),
163+
__DEFINE_LINK_MODE_NAME(100, T1, Full),
164+
__DEFINE_LINK_MODE_NAME(1000, T1, Full),
165+
__DEFINE_LINK_MODE_NAME(400000, KR8, Full),
166+
__DEFINE_LINK_MODE_NAME(400000, SR8, Full),
167+
__DEFINE_LINK_MODE_NAME(400000, LR8_ER8_FR8, Full),
168+
__DEFINE_LINK_MODE_NAME(400000, DR8, Full),
169+
__DEFINE_LINK_MODE_NAME(400000, CR8, Full),
170+
};
171+
static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);

net/ethtool/common.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
3+
#ifndef _ETHTOOL_COMMON_H
4+
#define _ETHTOOL_COMMON_H
5+
6+
#include <linux/ethtool.h>
7+
8+
/* compose link mode index from speed, type and duplex */
9+
#define ETHTOOL_LINK_MODE(speed, type, duplex) \
10+
ETHTOOL_LINK_MODE_ ## speed ## base ## type ## _ ## duplex ## _BIT
11+
12+
extern const char
13+
netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN];
14+
extern const char
15+
rss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN];
16+
extern const char
17+
tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN];
18+
extern const char
19+
phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN];
20+
extern const char link_mode_names[][ETH_GSTRING_LEN];
21+
22+
#endif /* _ETHTOOL_COMMON_H */

0 commit comments

Comments
 (0)