mirror of
https://github.com/Dasharo/systemd.git
synced 2026-03-06 15:02:31 -08:00
Merge pull request #10819 from yuwata/fix-10807
ethtool: drop NetDevAdvertise
This commit is contained in:
58
meson.build
58
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 <net/if.h>'],
|
||||
['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
|
||||
['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
|
||||
['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 <net/if.h>'],
|
||||
['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
|
||||
['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
|
||||
['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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user