summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/systemd-networkd.service.xml5
-rw-r--r--man/udev.xml4
-rw-r--r--src/network/networkd-netdev.c2
-rw-r--r--src/network/networkd-network.c1
-rw-r--r--src/shared/net-util.c11
-rw-r--r--src/shared/net-util.h1
-rw-r--r--src/udev/net/link-config.c1
7 files changed, 18 insertions, 7 deletions
diff --git a/man/systemd-networkd.service.xml b/man/systemd-networkd.service.xml
index 026536ebd9..2517efc4a7 100644
--- a/man/systemd-networkd.service.xml
+++ b/man/systemd-networkd.service.xml
@@ -216,8 +216,9 @@
<listitem>
<para>The driver currently bound to the device, as
exposed by the udev property <literal>DRIVER</literal>
- of its parent device.
- </para>
+ of its parent device, or if that is not set the driver
+ as exposed by <literal>ethtool -i</literal> of the
+ device itself.</para>
</listitem>
</varlistentry>
<varlistentry>
diff --git a/man/udev.xml b/man/udev.xml
index 0e75715887..ae7dc61b03 100644
--- a/man/udev.xml
+++ b/man/udev.xml
@@ -807,7 +807,9 @@
<term><varname>Driver=</varname></term>
<listitem>
<para>The driver currently bound to the device, as exposed by the
- udev property <literal>DRIVER</literal> of its parent device.</para>
+ udev property <literal>DRIVER</literal> of its parent device, or if
+ that is not set the driver as exposed by <literal>ethtool -i</literal>
+ of the device itself.</para>
</listitem>
</varlistentry>
<varlistentry>
diff --git a/src/network/networkd-netdev.c b/src/network/networkd-netdev.c
index c3bda6da84..05f21fa874 100644
--- a/src/network/networkd-netdev.c
+++ b/src/network/networkd-netdev.c
@@ -366,7 +366,7 @@ static int netdev_load_one(Manager *manager, const char *filename) {
if (net_match_config(NULL, NULL, NULL, NULL, NULL,
netdev->match_host, netdev->match_virt,
netdev->match_kernel, netdev->match_arch,
- NULL, NULL, NULL, NULL, NULL) <= 0)
+ NULL, NULL, NULL, NULL, NULL, NULL) <= 0)
return 0;
r = hashmap_put(netdev->manager->netdevs, netdev->name, netdev);
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index 2e68bec2e7..14fa92aeaf 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -181,6 +181,7 @@ int network_get(Manager *manager, struct udev_device *device, Network **ret) {
udev_device_get_sysattr_value(device, "address"),
udev_device_get_property_value(device, "ID_PATH"),
udev_device_get_driver(udev_device_get_parent(device)),
+ udev_device_get_property_value(device, "ID_NET_DRIVER"),
udev_device_get_devtype(device),
udev_device_get_sysname(device))) {
log_debug("%s: found matching network '%s'",
diff --git a/src/shared/net-util.c b/src/shared/net-util.c
index a8a2c44bae..50cfa2c3f3 100644
--- a/src/shared/net-util.c
+++ b/src/shared/net-util.c
@@ -42,6 +42,7 @@ bool net_match_config(const struct ether_addr *match_mac,
Condition *match_arch,
const char *dev_mac,
const char *dev_path,
+ const char *dev_parent_driver,
const char *dev_driver,
const char *dev_type,
const char *dev_name) {
@@ -64,13 +65,17 @@ bool net_match_config(const struct ether_addr *match_mac,
if (match_path && (!dev_path || fnmatch(match_path, dev_path, 0)))
return 0;
- if (match_driver && !streq_ptr(match_driver, dev_driver))
- return 0;
+ if (match_driver) {
+ if (dev_parent_driver && !streq(match_driver, dev_parent_driver))
+ return 0;
+ else if (!streq_ptr(match_driver, dev_driver))
+ return 0;
+ }
if (match_type && !streq_ptr(match_type, dev_type))
return 0;
- if (match_name && (!dev_path || fnmatch(match_name, dev_name, 0)))
+ if (match_name && (!dev_name || fnmatch(match_name, dev_name, 0)))
return 0;
return 1;
diff --git a/src/shared/net-util.h b/src/shared/net-util.h
index 908fb22ffa..99479e1f5c 100644
--- a/src/shared/net-util.h
+++ b/src/shared/net-util.h
@@ -38,6 +38,7 @@ bool net_match_config(const struct ether_addr *match_mac,
Condition *match_arch,
const char *dev_mac,
const char *dev_path,
+ const char *dev_parent_driver,
const char *dev_driver,
const char *dev_type,
const char *dev_name);
diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
index 40b1d7f7bc..92d248fc6b 100644
--- a/src/udev/net/link-config.c
+++ b/src/udev/net/link-config.c
@@ -247,6 +247,7 @@ int link_config_get(link_config_ctx *ctx, struct udev_device *device, link_confi
udev_device_get_sysattr_value(device, "address"),
udev_device_get_property_value(device, "ID_PATH"),
udev_device_get_driver(udev_device_get_parent(device)),
+ udev_device_get_property_value(device, "ID_NET_DRIVER"),
udev_device_get_devtype(device),
NULL)) {
log_debug("Config file %s applies to device %s",