summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libsystemd-network/network-internal.c30
-rw-r--r--src/libsystemd-network/network-internal.h17
-rw-r--r--src/network/networkd-link.c19
-rw-r--r--src/network/networkd-link.h1
-rw-r--r--src/network/networkd-manager.c3
-rw-r--r--src/network/networkd-manager.h1
-rw-r--r--src/network/networkd-network.c6
-rw-r--r--src/network/networkd-network.h7
-rw-r--r--src/network/test-network.c2
-rw-r--r--src/udev/net/link-config.c2
10 files changed, 54 insertions, 34 deletions
diff --git a/src/libsystemd-network/network-internal.c b/src/libsystemd-network/network-internal.c
index 3bdabd99fb..459d13ad7d 100644
--- a/src/libsystemd-network/network-internal.c
+++ b/src/libsystemd-network/network-internal.c
@@ -192,30 +192,34 @@ bool net_match_config(Set *match_mac,
Set *match_permanent_mac,
char * const *match_paths,
char * const *match_drivers,
- char * const *match_types,
+ char * const *match_iftypes,
char * const *match_names,
char * const *match_property,
char * const *match_wifi_iftype,
char * const *match_ssid,
Set *match_bssid,
- unsigned short iftype,
sd_device *device,
const struct ether_addr *dev_mac,
const struct ether_addr *dev_permanent_mac,
+ const char *dev_driver,
+ unsigned short dev_iftype,
const char *dev_name,
char * const *alternative_names,
- enum nl80211_iftype wifi_iftype,
- const char *ssid,
- const struct ether_addr *bssid) {
+ enum nl80211_iftype dev_wifi_iftype,
+ const char *dev_ssid,
+ const struct ether_addr *dev_bssid) {
- const char *dev_path = NULL, *dev_driver = NULL, *mac_str;
- _cleanup_free_ char *dev_type;
+ _cleanup_free_ char *dev_iftype_str;
+ const char *dev_path = NULL;
- dev_type = link_get_type_string(iftype, device);
+ dev_iftype_str = link_get_type_string(dev_iftype, device);
if (device) {
+ const char *mac_str;
+
(void) sd_device_get_property_value(device, "ID_PATH", &dev_path);
- (void) sd_device_get_property_value(device, "ID_NET_DRIVER", &dev_driver);
+ if (!dev_driver)
+ (void) sd_device_get_property_value(device, "ID_NET_DRIVER", &dev_driver);
if (!dev_name)
(void) sd_device_get_sysname(device, &dev_name);
if (!dev_mac &&
@@ -238,7 +242,7 @@ bool net_match_config(Set *match_mac,
if (!net_condition_test_strv(match_drivers, dev_driver))
return false;
- if (!net_condition_test_strv(match_types, dev_type))
+ if (!net_condition_test_strv(match_iftypes, dev_iftype_str))
return false;
if (!net_condition_test_ifname(match_names, dev_name, alternative_names))
@@ -247,13 +251,13 @@ bool net_match_config(Set *match_mac,
if (!net_condition_test_property(match_property, device))
return false;
- if (!net_condition_test_strv(match_wifi_iftype, wifi_iftype_to_string(wifi_iftype)))
+ if (!net_condition_test_strv(match_wifi_iftype, wifi_iftype_to_string(dev_wifi_iftype)))
return false;
- if (!net_condition_test_strv(match_ssid, ssid))
+ if (!net_condition_test_strv(match_ssid, dev_ssid))
return false;
- if (match_bssid && (!bssid || !set_contains(match_bssid, bssid)))
+ if (match_bssid && (!dev_bssid || !set_contains(match_bssid, dev_bssid)))
return false;
return true;
diff --git a/src/libsystemd-network/network-internal.h b/src/libsystemd-network/network-internal.h
index c413afc7d5..aa61bc2614 100644
--- a/src/libsystemd-network/network-internal.h
+++ b/src/libsystemd-network/network-internal.h
@@ -17,23 +17,24 @@
char *link_get_type_string(unsigned short iftype, sd_device *device);
bool net_match_config(Set *match_mac,
Set *match_permanent_mac,
- char * const *match_path,
- char * const *match_driver,
- char * const *match_type,
- char * const *match_name,
+ char * const *match_paths,
+ char * const *match_drivers,
+ char * const *match_iftypes,
+ char * const *match_names,
char * const *match_property,
char * const *match_wifi_iftype,
char * const *match_ssid,
Set *match_bssid,
- unsigned short iftype,
sd_device *device,
const struct ether_addr *dev_mac,
const struct ether_addr *dev_permanent_mac,
+ const char *dev_driver,
+ unsigned short dev_iftype,
const char *dev_name,
char * const *alternative_names,
- enum nl80211_iftype wifi_iftype,
- const char *ssid,
- const struct ether_addr *bssid);
+ enum nl80211_iftype dev_wifi_iftype,
+ const char *dev_ssid,
+ const struct ether_addr *dev_bssid);
CONFIG_PARSER_PROTOTYPE(config_parse_net_condition);
CONFIG_PARSER_PROTOTYPE(config_parse_hwaddr);
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 214604cd9b..6ca6bfa8e4 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -618,10 +618,14 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
if (r < 0)
log_link_debug_errno(link, r, "MAC address not found for new device, continuing without");
- r = ethtool_get_permanent_macaddr(NULL, link->ifname, &link->permanent_mac);
+ r = ethtool_get_permanent_macaddr(&manager->ethtool_fd, link->ifname, &link->permanent_mac);
if (r < 0)
log_link_debug_errno(link, r, "Permanent MAC address not found for new device, continuing without: %m");
+ r = ethtool_get_driver(&manager->ethtool_fd, link->ifname, &link->driver);
+ if (r < 0)
+ log_link_debug_errno(link, r, "Failed to get driver, continuing without: %m");
+
r = sd_netlink_message_read_strv(message, IFLA_PROP_LIST, IFLA_ALT_IFNAME, &link->alternative_names);
if (r < 0 && r != -ENODATA)
return r;
@@ -725,6 +729,7 @@ static Link *link_free(Link *link) {
strv_free(link->alternative_names);
free(link->kind);
free(link->ssid);
+ free(link->driver);
(void) unlink(link->state_file);
free(link->state_file);
@@ -3139,8 +3144,10 @@ static int link_reconfigure_internal(Link *link, sd_netlink_message *m, bool for
strv_free_and_replace(link->alternative_names, s);
}
- r = network_get(link->manager, link->iftype, link->sd_device, link->ifname, link->alternative_names,
- &link->mac, &link->permanent_mac, link->wlan_iftype, link->ssid, &link->bssid, &network);
+ r = network_get(link->manager, link->iftype, link->sd_device,
+ link->ifname, link->alternative_names, link->driver,
+ &link->mac, &link->permanent_mac,
+ link->wlan_iftype, link->ssid, &link->bssid, &network);
if (r == -ENOENT) {
link_enter_unmanaged(link);
return 0;
@@ -3275,8 +3282,10 @@ static int link_initialized_and_synced(Link *link) {
if (r < 0)
return r;
- r = network_get(link->manager, link->iftype, link->sd_device, link->ifname, link->alternative_names,
- &link->mac, &link->permanent_mac, link->wlan_iftype, link->ssid, &link->bssid, &network);
+ r = network_get(link->manager, link->iftype, link->sd_device,
+ link->ifname, link->alternative_names, link->driver,
+ &link->mac, &link->permanent_mac,
+ link->wlan_iftype, link->ssid, &link->bssid, &network);
if (r == -ENOENT) {
link_enter_unmanaged(link);
return 0;
diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h
index c793a37df7..b1a8c432aa 100644
--- a/src/network/networkd-link.h
+++ b/src/network/networkd-link.h
@@ -66,6 +66,7 @@ typedef struct Link {
struct in6_addr ipv6ll_address;
uint32_t mtu;
sd_device *sd_device;
+ char *driver;
/* wlan */
enum nl80211_iftype wlan_iftype;
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c
index 3142f6ae86..0f67c106c3 100644
--- a/src/network/networkd-manager.c
+++ b/src/network/networkd-manager.c
@@ -1790,6 +1790,7 @@ int manager_new(Manager **ret) {
*m = (Manager) {
.speed_meter_interval_usec = SPEED_METER_DEFAULT_TIME_INTERVAL,
.manage_foreign_routes = true,
+ .ethtool_fd = -1,
};
m->state_file = strdup("/run/systemd/netif/state");
@@ -1900,6 +1901,8 @@ void manager_free(Manager *m) {
free(m->dynamic_timezone);
free(m->dynamic_hostname);
+ safe_close(m->ethtool_fd);
+
free(m);
}
diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h
index 6ee0233537..0b3ce911c8 100644
--- a/src/network/networkd-manager.h
+++ b/src/network/networkd-manager.h
@@ -26,6 +26,7 @@ struct Manager {
sd_bus *bus;
sd_device_monitor *device_monitor;
Hashmap *polkit_registry;
+ int ethtool_fd;
bool enumerating:1;
bool dirty:1;
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index 50e50fd945..2fdaafd040 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -776,8 +776,8 @@ int network_get_by_name(Manager *manager, const char *name, Network **ret) {
}
int network_get(Manager *manager, unsigned short iftype, sd_device *device,
- const char *ifname, char * const *alternative_names,
- const struct ether_addr *address, const struct ether_addr *permanent_address,
+ const char *ifname, char * const *alternative_names, const char *driver,
+ const struct ether_addr *mac, const struct ether_addr *permanent_mac,
enum nl80211_iftype wlan_iftype, const char *ssid, const struct ether_addr *bssid,
Network **ret) {
Network *network;
@@ -791,7 +791,7 @@ int network_get(Manager *manager, unsigned short iftype, sd_device *device,
network->match_path, network->match_driver,
network->match_type, network->match_name, network->match_property,
network->match_wlan_iftype, network->match_ssid, network->match_bssid,
- iftype, device, address, permanent_address,
+ device, mac, permanent_mac, driver, iftype,
ifname, alternative_names, wlan_iftype, ssid, bssid)) {
if (network->match_name && device) {
const char *attr;
diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h
index 95e4d58b97..934a33ac94 100644
--- a/src/network/networkd-network.h
+++ b/src/network/networkd-network.h
@@ -346,10 +346,11 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
int network_verify(Network *network);
int network_get_by_name(Manager *manager, const char *name, Network **ret);
-int network_get(Manager *manager, unsigned short iftype, sd_device *device, const char *ifname, char * const *alternative_names,
+int network_get(Manager *manager, unsigned short iftype, sd_device *device,
+ const char *ifname, char * const *alternative_names, const char *driver,
const struct ether_addr *mac, const struct ether_addr *permanent_mac,
- enum nl80211_iftype wlan_iftype, const char *ssid,
- const struct ether_addr *bssid, Network **ret);
+ enum nl80211_iftype wlan_iftype, const char *ssid, const struct ether_addr *bssid,
+ Network **ret);
int network_apply(Network *network, Link *link);
void network_apply_anonymize_if_set(Network *network);
diff --git a/src/network/test-network.c b/src/network/test-network.c
index 1600966283..2ac47e72f5 100644
--- a/src/network/test-network.c
+++ b/src/network/test-network.c
@@ -126,7 +126,7 @@ static void test_network_get(Manager *manager, sd_device *loopback) {
/* Let's hope that the test machine does not have a .network file that applies to loopback deviceā€¦
* But it is still possible, so let's allow that case too. */
- r = network_get(manager, 0, loopback, "lo", NULL, &mac, &mac, 0, NULL, NULL, &network);
+ r = network_get(manager, 0, loopback, "lo", NULL, NULL, &mac, &mac, 0, NULL, NULL, &network);
if (r == -ENOENT)
/* The expected case */
assert_se(!network);
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
index abe1276dfa..39bdfb73dd 100644
--- a/src/udev/net/link-config.c
+++ b/src/udev/net/link-config.c
@@ -270,7 +270,7 @@ int link_config_get(link_config_ctx *ctx, sd_device *device, link_config **ret)
LIST_FOREACH(links, link, ctx->links) {
if (net_match_config(link->match_mac, link->match_permanent_mac, link->match_path, link->match_driver,
link->match_type, link->match_name, link->match_property, NULL, NULL, NULL,
- iftype, device, NULL, &permanent_mac, NULL, NULL, 0, NULL, NULL)) {
+ device, NULL, &permanent_mac, NULL, iftype, NULL, NULL, 0, NULL, NULL)) {
if (link->match_name && !strv_contains(link->match_name, "*")) {
unsigned name_assign_type = NET_NAME_UNKNOWN;