/* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once #include "sd-device.h" #include "sd-netlink.h" #include "condition.h" #include "conf-parser.h" #include "ethtool-util.h" #include "hashmap.h" #include "list.h" #include "net-condition.h" #include "netif-naming-scheme.h" typedef struct LinkConfigContext LinkConfigContext; typedef struct LinkConfig LinkConfig; typedef enum MACAddressPolicy { MAC_ADDRESS_POLICY_PERSISTENT, MAC_ADDRESS_POLICY_RANDOM, MAC_ADDRESS_POLICY_NONE, _MAC_ADDRESS_POLICY_MAX, _MAC_ADDRESS_POLICY_INVALID = -EINVAL, } MACAddressPolicy; typedef struct Link { int ifindex; const char *ifname; const char *new_name; LinkConfig *config; sd_device *device; sd_device_action_t action; char *kind; char *driver; uint16_t iftype; uint32_t flags; struct hw_addr_data hw_addr; struct hw_addr_data permanent_hw_addr; unsigned name_assign_type; unsigned addr_assign_type; } Link; struct LinkConfig { char *filename; NetMatch match; LIST_HEAD(Condition, conditions); char *description; struct hw_addr_data hw_addr; MACAddressPolicy mac_address_policy; NamePolicy *name_policy; NamePolicy *alternative_names_policy; char *name; char **alternative_names; char *alias; uint32_t txqueues; uint32_t rxqueues; uint32_t txqueuelen; uint32_t mtu; uint32_t gso_max_segments; size_t gso_max_size; uint64_t speed; Duplex duplex; int autonegotiation; uint32_t advertise[N_ADVERTISE]; uint32_t wol; char *wol_password_file; uint8_t *wol_password; NetDevPort port; int features[_NET_DEV_FEAT_MAX]; netdev_channels channels; netdev_ring_param ring; int rx_flow_control; int tx_flow_control; int autoneg_flow_control; netdev_coalesce_param coalesce; uint8_t mdi; uint32_t sr_iov_num_vfs; OrderedHashmap *sr_iov_by_section; LIST_FIELDS(LinkConfig, configs); }; int link_config_ctx_new(LinkConfigContext **ret); LinkConfigContext* link_config_ctx_free(LinkConfigContext *ctx); DEFINE_TRIVIAL_CLEANUP_FUNC(LinkConfigContext*, link_config_ctx_free); int link_load_one(LinkConfigContext *ctx, const char *filename); int link_config_load(LinkConfigContext *ctx); bool link_config_should_reload(LinkConfigContext *ctx); int link_new(LinkConfigContext *ctx, sd_netlink **rtnl, sd_device *device, Link **ret); Link *link_free(Link *link); DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free); int link_get_config(LinkConfigContext *ctx, Link *link); int link_apply_config(LinkConfigContext *ctx, sd_netlink **rtnl, Link *link); const char *mac_address_policy_to_string(MACAddressPolicy p) _const_; MACAddressPolicy mac_address_policy_from_string(const char *p) _pure_; /* gperf lookup function */ const struct ConfigPerfItem* link_config_gperf_lookup(const char *key, GPERF_LEN_TYPE length); CONFIG_PARSER_PROTOTYPE(config_parse_ifalias); CONFIG_PARSER_PROTOTYPE(config_parse_rx_tx_queues); CONFIG_PARSER_PROTOTYPE(config_parse_txqueuelen); CONFIG_PARSER_PROTOTYPE(config_parse_wol_password); CONFIG_PARSER_PROTOTYPE(config_parse_mac_address_policy); CONFIG_PARSER_PROTOTYPE(config_parse_name_policy); CONFIG_PARSER_PROTOTYPE(config_parse_alternative_names_policy);