1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-01-24 02:03:54 +03:00

udev: net_setup - allow matching on OriginalName=

This has been requested repeatedly, so let's give it a go. We explicitly do not allow matching
on names that have already been changed (from a previous udev run, or otherwise), and matching
on unpredictable names (ethX) is discouraged (but not currently disallowed).

We also currently allow:

[Match]
Name=veth0

[Link]
Name=my-name0
SomeOtherSetting=true

Which means that the link file will be applied the first time it is invoked, but
not on subsequent invocations, which may be surprising.
This commit is contained in:
Tom Gundersen 2014-12-04 18:12:55 +01:00
parent 03e8fdb346
commit 7eb08da4b3
8 changed files with 55 additions and 23 deletions

View File

@ -92,13 +92,25 @@
<para>The hardware address.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>OriginalName=</varname></term>
<listitem>
<para>The device name, as exposed by the udev
property "INTERFACE". May contain shell style
globs. This can not be used to match on names
that have already been changed from userspace.
Caution is adviced when matching on
kernel-assigned names, as they are known to
be unstable between reboots.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>Path=</varname></term>
<listitem>
<para>The persistent path, as exposed by the
udev property <literal>ID_PATH</literal>. May
contain shell style globs.</para>
</listitem>
<para>The persistent path, as exposed by the
udev property <literal>ID_PATH</literal>. May
contain shell style globs.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>Driver=</varname></term>

View File

@ -96,40 +96,47 @@ bool net_match_config(const struct ether_addr *match_mac,
const char *dev_parent_driver,
const char *dev_driver,
const char *dev_type,
const char *dev_name) {
const char *dev_name,
bool ignore_name_match) {
if (match_host && !condition_test(match_host))
return 0;
return false;
if (match_virt && !condition_test(match_virt))
return 0;
return false;
if (match_kernel && !condition_test(match_kernel))
return 0;
return false;
if (match_arch && !condition_test(match_arch))
return 0;
return false;
if (match_mac && (!dev_mac || memcmp(match_mac, dev_mac, ETH_ALEN)))
return 0;
return false;
if (match_path && (!dev_path || fnmatch(match_path, dev_path, 0)))
return 0;
return false;
if (match_driver) {
if (dev_parent_driver && !streq(match_driver, dev_parent_driver))
return 0;
return false;
else if (!streq_ptr(match_driver, dev_driver))
return 0;
return false;
}
if (match_type && !streq_ptr(match_type, dev_type))
return 0;
return false;
if (match_name && (!dev_name || fnmatch(match_name, dev_name, 0)))
return 0;
if (match_name) {
if (!dev_name || fnmatch(match_name, dev_name, 0))
return false;
else if (ignore_name_match) {
log_warning("ifname (%s) matched config, but is ignored as it is not the original name", dev_name);
return false;
}
}
return 1;
return true;
}
int config_parse_net_condition(const char *unit,

View File

@ -42,7 +42,8 @@ bool net_match_config(const struct ether_addr *match_mac,
const char *dev_parent_driver,
const char *dev_driver,
const char *dev_type,
const char *dev_name);
const char *dev_name,
bool ignore_name_match);
int config_parse_net_condition(const char *unit, const char *filename, unsigned line,
const char *section, unsigned section_line, const char *lvalue,

View File

@ -654,7 +654,7 @@ static int netdev_load_one(Manager *manager, const char *filename) {
if (net_match_config(NULL, NULL, NULL, NULL, NULL,
netdev_raw->match_host, netdev_raw->match_virt,
netdev_raw->match_kernel, netdev_raw->match_arch,
NULL, NULL, NULL, NULL, NULL, NULL) <= 0)
NULL, NULL, NULL, NULL, NULL, NULL, false) <= 0)
return 0;
if (!NETDEV_VTABLE(netdev_raw)) {

View File

@ -216,7 +216,7 @@ int network_get(Manager *manager, struct udev_device *device,
udev_device_get_driver(udev_device_get_parent(device)),
udev_device_get_property_value(device, "ID_NET_DRIVER"),
udev_device_get_devtype(device),
ifname)) {
ifname, false)) {
log_debug("%-*s: found matching network '%s'", IFNAMSIZ, ifname,
network->filename);
*ret = network;

View File

@ -17,6 +17,7 @@ struct ConfigPerfItem;
%includes
%%
Match.MACAddress, config_parse_hwaddr, 0, offsetof(link_config, match_mac)
Match.OriginalName, config_parse_ifname, 0, offsetof(link_config, match_name)
Match.Path, config_parse_string, 0, offsetof(link_config, match_path)
Match.Driver, config_parse_string, 0, offsetof(link_config, match_driver)
Match.Type, config_parse_string, 0, offsetof(link_config, match_type)

View File

@ -20,6 +20,7 @@
***/
#include <netinet/ether.h>
#include <linux/netdevice.h>
#include "sd-id128.h"
@ -95,6 +96,7 @@ static void link_configs_free(link_config_ctx *ctx) {
LIST_FOREACH_SAFE(links, link, link_next, ctx->links) {
free(link->filename);
free(link->name);
free(link->match_path);
free(link->match_driver);
free(link->match_type);
@ -223,17 +225,25 @@ int link_config_get(link_config_ctx *ctx, struct udev_device *device,
link_config *link;
LIST_FOREACH(links, link, ctx->links) {
const char* attr_value = udev_device_get_sysattr_value(device, "address");
const char* attr_value;
unsigned char name_assign_type = NET_NAME_UNKNOWN;
attr_value = udev_device_get_sysattr_value(device, "name_assign_type");
if (attr_value)
(void)safe_atou8(attr_value, &name_assign_type);
attr_value = udev_device_get_sysattr_value(device, "address");
if (net_match_config(link->match_mac, link->match_path, link->match_driver,
link->match_type, NULL, link->match_host,
link->match_type, link->match_name, link->match_host,
link->match_virt, link->match_kernel, link->match_arch,
attr_value ? ether_aton(attr_value) : NULL,
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)) {
udev_device_get_sysname(device),
name_assign_type == NET_NAME_RENAMED)) {
log_debug("Config file %s applies to device %s",
link->filename,
udev_device_get_sysname(device));

View File

@ -55,6 +55,7 @@ struct link_config {
char *match_path;
char *match_driver;
char *match_type;
char *match_name;
Condition *match_host;
Condition *match_virt;
Condition *match_kernel;