]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/ethtool-util.h
ethtool: make the size of 'features' array static
[thirdparty/systemd.git] / src / shared / ethtool-util.h
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
0ef6f454
LP
2#pragma once
3
5fde13d7 4#include <macro.h>
79b4428a 5#include <net/ethernet.h>
a39f92d3
SS
6#include <linux/ethtool.h>
7
538f15cf 8#include "conf-parser.h"
5fde13d7 9
72dda93a 10#define N_ADVERTISE 3
593022fa 11
5fde13d7
TG
12/* we can't use DUPLEX_ prefix, as it
13 * clashes with <linux/ethtool.h> */
14typedef enum Duplex {
9432a05c
SS
15 DUP_HALF = DUPLEX_HALF,
16 DUP_FULL = DUPLEX_FULL,
5fde13d7 17 _DUP_MAX,
2d93c20e 18 _DUP_INVALID = -EINVAL,
5fde13d7
TG
19} Duplex;
20
50725d10 21typedef enum NetDevFeature {
bf2334c0
YW
22 NET_DEV_FEAT_RX,
23 NET_DEV_FEAT_TX,
50725d10 24 NET_DEV_FEAT_GSO,
f7ea90fb
SS
25 NET_DEV_FEAT_GRO,
26 NET_DEV_FEAT_LRO,
50725d10 27 NET_DEV_FEAT_TSO,
ffa69a04 28 NET_DEV_FEAT_TSO6,
50725d10 29 _NET_DEV_FEAT_MAX,
2d93c20e 30 _NET_DEV_FEAT_INVALID = -EINVAL,
50725d10
SS
31} NetDevFeature;
32
593022fa 33typedef enum NetDevPort {
1637c357
YW
34 NET_DEV_PORT_TP = PORT_TP,
35 NET_DEV_PORT_AUI = PORT_AUI,
36 NET_DEV_PORT_MII = PORT_MII,
37 NET_DEV_PORT_FIBRE = PORT_FIBRE,
38 NET_DEV_PORT_BNC = PORT_BNC,
39 NET_DEV_PORT_DA = PORT_DA,
40 NET_DEV_PORT_NONE = PORT_NONE,
41 NET_DEV_PORT_OTHER = PORT_OTHER,
593022fa 42 _NET_DEV_PORT_MAX,
2d93c20e 43 _NET_DEV_PORT_INVALID = -EINVAL,
593022fa 44} NetDevPort;
a39f92d3
SS
45
46#define ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32 (SCHAR_MAX)
6cf0a204 47#define ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NBYTES (4 * ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32)
a39f92d3
SS
48
49/* layout of the struct passed from/to userland */
50struct ethtool_link_usettings {
51 struct ethtool_link_settings base;
52
53 struct {
54 uint32_t supported[ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32];
55 uint32_t advertising[ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32];
56 uint32_t lp_advertising[ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32];
57 } link_modes;
58};
59
5f945202
SS
60typedef struct netdev_channels {
61 uint32_t rx_count;
62 uint32_t tx_count;
63 uint32_t other_count;
64 uint32_t combined_count;
65
66 bool rx_count_set;
67 bool tx_count_set;
68 bool other_count_set;
69 bool combined_count_set;
70} netdev_channels;
71
224ded67
SS
72typedef struct netdev_ring_param {
73 uint32_t rx_pending;
e81f5fc4 74 uint32_t rx_mini_pending;
75 uint32_t rx_jumbo_pending;
224ded67
SS
76 uint32_t tx_pending;
77
78 bool rx_pending_set;
e81f5fc4 79 bool rx_mini_pending_set;
80 bool rx_jumbo_pending_set;
224ded67
SS
81 bool tx_pending_set;
82} netdev_ring_param;
83
64be35ab
ZJS
84int ethtool_get_driver(int *ethtool_fd, const char *ifname, char **ret);
85int ethtool_get_link_info(int *ethtool_fd, const char *ifname,
50299121 86 int *ret_autonegotiation, uint64_t *ret_speed,
33a8695f 87 Duplex *ret_duplex, NetDevPort *ret_port);
64be35ab 88int ethtool_get_permanent_macaddr(int *ethtool_fd, const char *ifname, struct ether_addr *ret);
c50404ae 89int ethtool_set_wol(int *ethtool_fd, const char *ifname, uint32_t wolopts);
cadc7ed2 90int ethtool_set_nic_buffer_size(int *ethtool_fd, const char *ifname, const netdev_ring_param *ring);
0db68800 91int ethtool_set_features(int *ethtool_fd, const char *ifname, const int features[static _NET_DEV_FEAT_MAX]);
64be35ab 92int ethtool_set_glinksettings(int *ethtool_fd, const char *ifname,
cadc7ed2 93 int autonegotiation, const uint32_t advertise[static N_ADVERTISE],
50299121 94 uint64_t speed, Duplex duplex, NetDevPort port);
cadc7ed2 95int ethtool_set_channels(int *ethtool_fd, const char *ifname, const netdev_channels *channels);
a34811e4 96int ethtool_set_flow_control(int *fd, const char *ifname, int rx, int tx, int autoneg);
5fde13d7
TG
97
98const char *duplex_to_string(Duplex d) _const_;
99Duplex duplex_from_string(const char *d) _pure_;
100
c50404ae 101int wol_options_to_string_alloc(uint32_t opts, char **ret);
5fde13d7 102
593022fa
SS
103const char *port_to_string(NetDevPort port) _const_;
104NetDevPort port_from_string(const char *port) _pure_;
105
2d18ac44
YW
106const char *ethtool_link_mode_bit_to_string(enum ethtool_link_mode_bit_indices val) _const_;
107enum ethtool_link_mode_bit_indices ethtool_link_mode_bit_from_string(const char *str) _pure_;
6cf0a204 108
538f15cf
YW
109CONFIG_PARSER_PROTOTYPE(config_parse_duplex);
110CONFIG_PARSER_PROTOTYPE(config_parse_wol);
111CONFIG_PARSER_PROTOTYPE(config_parse_port);
112CONFIG_PARSER_PROTOTYPE(config_parse_channel);
113CONFIG_PARSER_PROTOTYPE(config_parse_advertise);
224ded67 114CONFIG_PARSER_PROTOTYPE(config_parse_nic_buffer_size);