diff --git a/meson.build b/meson.build index ccea945720..906960fb71 100644 --- a/meson.build +++ b/meson.build @@ -449,33 +449,39 @@ endforeach conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h) -foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'], - ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'], - ['IFLA_VRF_TABLE', 'linux/if_link.h'], - ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'], - ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'], - ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'], - ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'], - ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'], - ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'], - ['IFLA_VXLAN_GPE', 'linux/if_link.h'], - ['IFLA_GENEVE_LABEL', 'linux/if_link.h'], +foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'], + ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'], + ['IFLA_VRF_TABLE', 'linux/if_link.h'], + ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'], + ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'], + ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'], + ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'], + ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'], + ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'], + ['IFLA_VXLAN_GPE', 'linux/if_link.h'], + ['IFLA_GENEVE_LABEL', 'linux/if_link.h'], # if_tunnel.h is buggy and cannot be included on its own - ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include '], - ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include '], - ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include '], - ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'], - ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'], - ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'], - ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'], - ['IPVLAN_F_PRIVATE', 'linux/if_link.h'], - ['NDA_IFINDEX', 'linux/neighbour.h'], - ['IFA_FLAGS', 'linux/if_addr.h'], - ['FRA_UID_RANGE', 'linux/fib_rules.h'], - ['LO_FLAGS_PARTSCAN', 'linux/loop.h'], - ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'], - ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'], - ['FOU_CMD_GET', 'linux/fou.h'], + ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include '], + ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include '], + ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include '], + ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'], + ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'], + ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'], + ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'], + ['IPVLAN_F_PRIVATE', 'linux/if_link.h'], + ['NDA_IFINDEX', 'linux/neighbour.h'], + ['IFA_FLAGS', 'linux/if_addr.h'], + ['FRA_UID_RANGE', 'linux/fib_rules.h'], + ['LO_FLAGS_PARTSCAN', 'linux/loop.h'], + ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'], + ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'], + ['FOU_CMD_GET', 'linux/fou.h'], + ['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'], + ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'], + ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'], + ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'], + ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'], + ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'], ] prefix = decl.length() > 2 ? decl[2] : '' have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix) diff --git a/src/basic/missing.h b/src/basic/missing.h index d671202551..85af7acdfe 100644 --- a/src/basic/missing.h +++ b/src/basic/missing.h @@ -1457,4 +1457,131 @@ struct statx { #define FOU_ENCAP_MAX (__FOU_ENCAP_MAX - 1) #endif +#if !HAVE_ETHTOOL_LINK_MODE_10baseT_Half_BIT /* linux@3f1ac7a700d039c61d8d8b99f28d605d489a60cf (4.6) */ +struct ethtool_link_settings { + __u32 cmd; + __u32 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 autoneg; + __u8 mdio_support; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __s8 link_mode_masks_nwords; + __u8 transceiver; + __u8 reserved1[3]; + __u32 reserved[7]; + __u32 link_mode_masks[0]; + /* layout of link_mode_masks fields: + * __u32 map_supported[link_mode_masks_nwords]; + * __u32 map_advertising[link_mode_masks_nwords]; + * __u32 map_lp_advertising[link_mode_masks_nwords]; + */ +}; +enum ethtool_link_mode_bit_indices { + ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0, + ETHTOOL_LINK_MODE_10baseT_Full_BIT = 1, + ETHTOOL_LINK_MODE_100baseT_Half_BIT = 2, + ETHTOOL_LINK_MODE_100baseT_Full_BIT = 3, + ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 4, + ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 5, + ETHTOOL_LINK_MODE_Autoneg_BIT = 6, + ETHTOOL_LINK_MODE_TP_BIT = 7, + ETHTOOL_LINK_MODE_AUI_BIT = 8, + ETHTOOL_LINK_MODE_MII_BIT = 9, + ETHTOOL_LINK_MODE_FIBRE_BIT = 10, + ETHTOOL_LINK_MODE_BNC_BIT = 11, + ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 12, + ETHTOOL_LINK_MODE_Pause_BIT = 13, + ETHTOOL_LINK_MODE_Asym_Pause_BIT = 14, + ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 15, + ETHTOOL_LINK_MODE_Backplane_BIT = 16, + ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 17, + ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 18, + ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 19, + ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 20, + ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 21, + ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 22, + ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 23, + ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 24, + ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 25, + ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 26, + ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 27, + ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 28, + ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 29, + ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 30, + ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 31, + ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 32, + ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 33, + ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 34, + ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 35, + ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 36, + ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 37, + ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 38, + ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 39, + ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 40, + ETHTOOL_LINK_MODE_1000baseX_Full_BIT = 41, + ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 42, + ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 43, + ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44, + ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45, + ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46, + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47, + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48, + + ETHTOOL_LINK_MODE_FEC_NONE_BIT = 49, + ETHTOOL_LINK_MODE_FEC_RS_BIT = 50, + ETHTOOL_LINK_MODE_FEC_BASER_BIT = 51, + + /* Last allowed bit for __ETHTOOL_LINK_MODE_LEGACY_MASK is bit + * 31. Please do NOT define any SUPPORTED_* or ADVERTISED_* + * macro for bits > 31. The only way to use indices > 31 is to + * use the new ETHTOOL_GLINKSETTINGS/ETHTOOL_SLINKSETTINGS API. + */ + + __ETHTOOL_LINK_MODE_LAST + = ETHTOOL_LINK_MODE_FEC_BASER_BIT, +}; +#else +#if !HAVE_ETHTOOL_LINK_MODE_25000baseCR_Full_BIT /* linux@3851112e4737cd52aaeda0ce8d084be9ee128106 (4.7) */ +#define ETHTOOL_LINK_MODE_25000baseCR_Full_BIT 31 +#define ETHTOOL_LINK_MODE_25000baseKR_Full_BIT 32 +#define ETHTOOL_LINK_MODE_25000baseSR_Full_BIT 33 +#define ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT 34 +#define ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT 35 +#define ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT 36 +#define ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT 37 +#define ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT 38 +#define ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT 39 +#endif +#if !HAVE_ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT /* linux@89da45b8b5b2187734a11038b8593714f964ffd1 (4.8) */ +#define ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT 40 +#endif +#if !HAVE_ETHTOOL_LINK_MODE_1000baseX_Full_BIT /* linux@5711a98221443aec54c4c81ee98c6ae46acccb65 (4.9) */ +#define ETHTOOL_LINK_MODE_1000baseX_Full_BIT 41 +#define ETHTOOL_LINK_MODE_10000baseCR_Full_BIT 42 +#define ETHTOOL_LINK_MODE_10000baseSR_Full_BIT 43 +#define ETHTOOL_LINK_MODE_10000baseLR_Full_BIT 44 +#define ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT 45 +#define ETHTOOL_LINK_MODE_10000baseER_Full_BIT 46 +#endif +#if !HAVE_ETHTOOL_LINK_MODE_2500baseT_Full_BIT /* linux@94842b4fc4d6b1691cfc86c6f5251f299d27f4ba (4.10) */ +#define ETHTOOL_LINK_MODE_2500baseT_Full_BIT 47 +#define ETHTOOL_LINK_MODE_5000baseT_Full_BIT 48 +#endif +#if !HAVE_ETHTOOL_LINK_MODE_FEC_NONE_BIT /* linux@1a5f3da20bd966220931239fbd31e6ac6ff42251 (4.14) */ +#define ETHTOOL_LINK_MODE_FEC_NONE_BIT 49 +#define ETHTOOL_LINK_MODE_FEC_RS_BIT 50 +#define ETHTOOL_LINK_MODE_FEC_BASER_BIT 51 +#endif +#endif + +/* Strictly speaking, this is not a missing field. Just for our convention. */ +#if !HAVE_ETHTOOL_LINK_MODE_FEC_NONE_BIT +#define _ETHTOOL_LINK_MODE_MAX 52 +#else +#define _ETHTOOL_LINK_MODE_MAX (__ETHTOOL_LINK_MODE_LAST + 1) +#endif + #include "missing_syscall.h" diff --git a/src/udev/net/ethtool-util.c b/src/udev/net/ethtool-util.c index 1897f97a04..05721c71f2 100644 --- a/src/udev/net/ethtool-util.c +++ b/src/udev/net/ethtool-util.c @@ -56,24 +56,62 @@ static const char* const netdev_feature_table[_NET_DEV_FEAT_MAX] = { [NET_DEV_FEAT_TSO6] = "tx-tcp6-segmentation", }; -static const char* const advertise_table[_NET_DEV_ADVERTISE_MAX] = { - [NET_DEV_ADVERTISE_10BASET_HALF] = "10baset-half", - [NET_DEV_ADVERTISE_10BASET_FULL] = "10baset-full", - [NET_DEV_ADVERTISE_100BASET_HALF] = "100baset-half", - [NET_DEV_ADVERTISE_100BASET_FULL] = "100baset-full", - [NET_DEV_ADVERTISE_1000BASET_HALF] = "1000baset-half", - [NET_DEV_ADVERTISE_1000BASET_FULL] = "1000baset-full", - [NET_DEV_ADVERTISE_10000BASET_FULL] = "10000baset-full", - [NET_DEV_ADVERTISE_2500BASEX_FULL] = "2500basex-full", - [NET_DEV_ADVERTISE_1000BASEKX_FULL] = "1000basekx-full", - [NET_DEV_ADVERTISE_10000BASEKX4_FULL] = "10000basekx4-full", - [NET_DEV_ADVERTISE_10000BASEKR_FULL] = "10000basekr-full", - [NET_DEV_ADVERTISE_10000BASER_FEC] = "10000baser-fec", - [NET_DEV_ADVERTISE_20000BASEMLD2_Full] = "20000basemld2-full", - [NET_DEV_ADVERTISE_20000BASEKR2_Full] = "20000basekr2-full", +static const char* const ethtool_link_mode_bit_table[_ETHTOOL_LINK_MODE_MAX] = { + [ETHTOOL_LINK_MODE_10baseT_Half_BIT] = "10baset-half", + [ETHTOOL_LINK_MODE_10baseT_Full_BIT] = "10baset-full", + [ETHTOOL_LINK_MODE_100baseT_Half_BIT] = "100baset-half", + [ETHTOOL_LINK_MODE_100baseT_Full_BIT] = "100baset-full", + [ETHTOOL_LINK_MODE_1000baseT_Half_BIT] = "1000baset-half", + [ETHTOOL_LINK_MODE_1000baseT_Full_BIT] = "1000baset-full", + [ETHTOOL_LINK_MODE_Autoneg_BIT] = "autonegotiation", + [ETHTOOL_LINK_MODE_TP_BIT] = "tp", + [ETHTOOL_LINK_MODE_AUI_BIT] = "aui", + [ETHTOOL_LINK_MODE_MII_BIT] = "mii", + [ETHTOOL_LINK_MODE_FIBRE_BIT] = "fibre", + [ETHTOOL_LINK_MODE_BNC_BIT] = "bnc", + [ETHTOOL_LINK_MODE_10000baseT_Full_BIT] = "10000baset-full", + [ETHTOOL_LINK_MODE_Pause_BIT] = "pause", + [ETHTOOL_LINK_MODE_Asym_Pause_BIT] = "asym-pause", + [ETHTOOL_LINK_MODE_2500baseX_Full_BIT] = "2500basex-full", + [ETHTOOL_LINK_MODE_Backplane_BIT] = "backplane", + [ETHTOOL_LINK_MODE_1000baseKX_Full_BIT] = "1000basekx-full", + [ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT] = "10000basekx4-full", + [ETHTOOL_LINK_MODE_10000baseKR_Full_BIT] = "10000basekr-full", + [ETHTOOL_LINK_MODE_10000baseR_FEC_BIT] = "10000baser-fec", + [ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT] = "20000basemld2-full", + [ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT] = "20000basekr2-full", + [ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT] = "40000basekr4-full", + [ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT] = "40000basecr4-full", + [ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT] = "40000basesr4-full", + [ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT] = "40000baselr4-full", + [ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT] = "56000basekr4-full", + [ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT] = "56000basecr4-full", + [ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT] = "56000basesr4-full", + [ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT] = "56000baselr4-full", + [ETHTOOL_LINK_MODE_25000baseCR_Full_BIT] = "25000basecr-full", + [ETHTOOL_LINK_MODE_25000baseKR_Full_BIT] = "25000basekr-full", + [ETHTOOL_LINK_MODE_25000baseSR_Full_BIT] = "25000basesr-full", + [ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT] = "50000basecr2-full", + [ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT] = "50000basekr2-full", + [ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT] = "100000basekr4-full", + [ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT] = "100000basesr4-full", + [ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT] = "100000basecr4-full", + [ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT] = "100000baselr4-er4-full", + [ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT] = "50000basesr2-full", + [ETHTOOL_LINK_MODE_1000baseX_Full_BIT] = "1000basex-full", + [ETHTOOL_LINK_MODE_10000baseCR_Full_BIT] = "10000basecr-full", + [ETHTOOL_LINK_MODE_10000baseSR_Full_BIT] = "10000basesr-full", + [ETHTOOL_LINK_MODE_10000baseLR_Full_BIT] = "10000baselr-full", + [ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT] = "10000baselrm-full", + [ETHTOOL_LINK_MODE_10000baseER_Full_BIT] = "10000baseer-full", + [ETHTOOL_LINK_MODE_2500baseT_Full_BIT] = "2500baset-full", + [ETHTOOL_LINK_MODE_5000baseT_Full_BIT] = "5000baset-full", + [ETHTOOL_LINK_MODE_FEC_NONE_BIT] = "fec-none", + [ETHTOOL_LINK_MODE_FEC_RS_BIT] = "fec-rs", + [ETHTOOL_LINK_MODE_FEC_BASER_BIT] = "fec-baser", }; -DEFINE_STRING_TABLE_LOOKUP(advertise, NetDevAdvertise); +DEFINE_STRING_TABLE_LOOKUP(ethtool_link_mode_bit, enum ethtool_link_mode_bit_indices); int ethtool_connect(int *ret) { int fd; @@ -574,12 +612,8 @@ int ethtool_set_glinksettings(int *fd, const char *ifname, struct link_config *l u->base.autoneg = link->autonegotiation; - if (link->advertise) { - uint32_t advertise[ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32] = {}; - - advertise[0] = link->advertise; - memcpy(&u->link_modes.advertising, advertise, ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NBYTES); - } + if (link->advertise) + memcpy(&u->link_modes.advertising, link->advertise, ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NBYTES); if (u->base.cmd == ETHTOOL_GLINKSETTINGS) r = set_slinksettings(*fd, &ifr, u); @@ -703,8 +737,9 @@ int config_parse_advertise(const char *unit, const char *rvalue, void *data, void *userdata) { + uint32_t a[ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32] = {}; + enum ethtool_link_mode_bit_indices mode; link_config *config = data; - NetDevAdvertise mode, a = 0; const char *p; int r; @@ -716,7 +751,7 @@ int config_parse_advertise(const char *unit, if (isempty(rvalue)) { /* Empty string resets the value. */ - config->advertise = 0; + config->advertise = mfree(config->advertise); return 0; } @@ -733,15 +768,28 @@ int config_parse_advertise(const char *unit, if (r == 0) break; - mode = advertise_from_string(w); - if (mode == _NET_DEV_ADVERTISE_INVALID) { + mode = ethtool_link_mode_bit_from_string(w); + if (mode < 0) { log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse advertise mode, ignoring: %s", w); continue; } - a |= mode; + + a[mode / 32] |= 1UL << (mode % 32); } - config->advertise |= a; + if (!config->advertise) { + config->advertise = new(uint32_t, ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32); + if (!config->advertise) + return log_oom(); + + memcpy(config->advertise, a, ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NBYTES); + + } else { + unsigned i; + + for (i = 0; i < ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32; i++) + config->advertise[i] |= a[i]; + } return 0; } diff --git a/src/udev/net/ethtool-util.h b/src/udev/net/ethtool-util.h index 73c4d447d1..93d4ea4d3f 100644 --- a/src/udev/net/ethtool-util.h +++ b/src/udev/net/ethtool-util.h @@ -54,25 +54,6 @@ typedef enum NetDevPort { _NET_DEV_PORT_INVALID = -1 } NetDevPort; -typedef enum NetDevAdvertise { - NET_DEV_ADVERTISE_10BASET_HALF = 1 << ETHTOOL_LINK_MODE_10baseT_Half_BIT, - NET_DEV_ADVERTISE_10BASET_FULL = 1 << ETHTOOL_LINK_MODE_10baseT_Full_BIT, - NET_DEV_ADVERTISE_100BASET_HALF = 1 << ETHTOOL_LINK_MODE_100baseT_Half_BIT, - NET_DEV_ADVERTISE_100BASET_FULL = 1 << ETHTOOL_LINK_MODE_100baseT_Full_BIT, - NET_DEV_ADVERTISE_1000BASET_HALF = 1 << ETHTOOL_LINK_MODE_1000baseT_Half_BIT, - NET_DEV_ADVERTISE_1000BASET_FULL = 1 << ETHTOOL_LINK_MODE_1000baseT_Full_BIT, - NET_DEV_ADVERTISE_10000BASET_FULL = 1 << ETHTOOL_LINK_MODE_10000baseT_Full_BIT, - NET_DEV_ADVERTISE_2500BASEX_FULL = 1 << ETHTOOL_LINK_MODE_2500baseX_Full_BIT, - NET_DEV_ADVERTISE_1000BASEKX_FULL = 1 << ETHTOOL_LINK_MODE_1000baseKX_Full_BIT, - NET_DEV_ADVERTISE_10000BASEKX4_FULL = 1 << ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT, - NET_DEV_ADVERTISE_10000BASEKR_FULL = 1 << ETHTOOL_LINK_MODE_10000baseKR_Full_BIT, - NET_DEV_ADVERTISE_10000BASER_FEC = 1 << ETHTOOL_LINK_MODE_10000baseR_FEC_BIT, - NET_DEV_ADVERTISE_20000BASEMLD2_Full = 1 << ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT, - NET_DEV_ADVERTISE_20000BASEKR2_Full = 1 << ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT, - _NET_DEV_ADVERTISE_MAX, - _NET_DEV_ADVERTISE_INVALID = -1, -} NetDevAdvertise; - #define ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32 (SCHAR_MAX) #define ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NBYTES (4 * ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32) @@ -117,8 +98,8 @@ WakeOnLan wol_from_string(const char *wol) _pure_; const char *port_to_string(NetDevPort port) _const_; NetDevPort port_from_string(const char *port) _pure_; -const char *advertise_to_string(NetDevAdvertise advertise) _const_; -NetDevAdvertise advertise_from_string(const char *advertise) _pure_; +const char *ethtool_link_mode_bit_to_string(enum ethtool_link_mode_bit_indices val) _const_; +enum ethtool_link_mode_bit_indices ethtool_link_mode_bit_from_string(const char *str) _pure_; CONFIG_PARSER_PROTOTYPE(config_parse_duplex); CONFIG_PARSER_PROTOTYPE(config_parse_wol); diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index b9c95e6139..161e116d72 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -69,6 +69,7 @@ static void link_config_free(link_config *link) { free(link->name_policy); free(link->name); free(link->alias); + free(link->advertise); free(link); } @@ -373,10 +374,9 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, log_warning_errno(r, "Could not set port (%s) of %s: %m", port_to_string(config->port), old_name); if (config->advertise) - log_warning_errno(r, "Could not set advertise mode to 0x%X: %m", config->advertise); + log_warning_errno(r, "Could not set advertise mode: %m"); /* TODO: include modes in the log message. */ if (config->speed) { - speed = DIV_ROUND_UP(config->speed, 1000000); if (r == -EOPNOTSUPP) { r = ethtool_set_speed(&ctx->ethtool_fd, old_name, speed, config->duplex); diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h index 88e3651b7b..f2f0843555 100644 --- a/src/udev/net/link-config.h +++ b/src/udev/net/link-config.h @@ -55,7 +55,7 @@ struct link_config { size_t speed; Duplex duplex; int autonegotiation; - uint32_t advertise; + uint32_t *advertise; WakeOnLan wol; NetDevPort port; int features[_NET_DEV_FEAT_MAX];