From edbb03e95a3c31bf719d5c6c46eec14d0bcb9c8f Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Fri, 21 Feb 2014 14:51:19 +0100 Subject: [PATCH] .network/.netdev/.link: allow to match on architecture --- man/systemd-networkd.service.xml | 20 ++++++++++++++++++++ man/udev.xml | 9 +++++++++ src/network/networkd-netdev-gperf.gperf | 7 ++++--- src/network/networkd-netdev.c | 6 +++--- src/network/networkd-network-gperf.gperf | 1 + src/network/networkd-network.c | 1 + src/network/networkd.h | 8 +++++--- src/shared/net-util.c | 4 ++++ src/shared/net-util.h | 1 + src/udev/net/link-config-gperf.gperf | 1 + src/udev/net/link-config.c | 6 +++--- src/udev/net/link-config.h | 1 + 12 files changed, 53 insertions(+), 12 deletions(-) diff --git a/man/systemd-networkd.service.xml b/man/systemd-networkd.service.xml index 69157b13e..91e139248 100644 --- a/man/systemd-networkd.service.xml +++ b/man/systemd-networkd.service.xml @@ -133,6 +133,16 @@ + + Architecture + + Checks whether the system is running on a specific + architecture. See ConditionArchitecture= in + systemd.unit5 + for details. + + + The [NetDev] section accepts the following @@ -257,6 +267,16 @@ + + Architecture + + Checks whether the system is running on a specific + architecture. See ConditionArchitecture= in + systemd.unit5 + for details. + + + The [Network] section accepts the following keys: diff --git a/man/udev.xml b/man/udev.xml index 3dd2b489f..9e00933e5 100644 --- a/man/udev.xml +++ b/man/udev.xml @@ -845,6 +845,15 @@ for details. + + Architecture + + Checks whether the system is running on a specific + architecture. See ConditionArchitecture= in + systemd.unit5 + for details. + + The [Link] section accepts the following keys: diff --git a/src/network/networkd-netdev-gperf.gperf b/src/network/networkd-netdev-gperf.gperf index cdaacb18a..7dd47f971 100644 --- a/src/network/networkd-netdev-gperf.gperf +++ b/src/network/networkd-netdev-gperf.gperf @@ -15,9 +15,10 @@ struct ConfigPerfItem; %struct-type %includes %% -Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(NetDev, condition_host) -Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(NetDev, condition_virt) -Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(NetDev, condition_kernel) +Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(NetDev, match_host) +Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(NetDev, match_virt) +Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(NetDev, match_kernel) +Match.Architecture, config_parse_net_condition, CONDITION_ARCHITECTURE, offsetof(NetDev, match_arch) NetDev.Description, config_parse_string, 0, offsetof(NetDev, description) NetDev.Name, config_parse_ifname, 0, offsetof(NetDev, name) NetDev.Kind, config_parse_netdev_kind, 0, offsetof(NetDev, kind) diff --git a/src/network/networkd-netdev.c b/src/network/networkd-netdev.c index 773163d76..c3bda6da8 100644 --- a/src/network/networkd-netdev.c +++ b/src/network/networkd-netdev.c @@ -364,9 +364,9 @@ static int netdev_load_one(Manager *manager, const char *filename) { return log_oom(); if (net_match_config(NULL, NULL, NULL, NULL, NULL, - netdev->condition_host, netdev->condition_virt, - netdev->condition_kernel, NULL, NULL, NULL, - NULL, NULL) <= 0) + netdev->match_host, netdev->match_virt, + netdev->match_kernel, netdev->match_arch, + NULL, NULL, NULL, NULL, NULL) <= 0) return 0; r = hashmap_put(netdev->manager->netdevs, netdev->name, netdev); diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 011f7e903..44aeb9c3a 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -23,6 +23,7 @@ Match.Name, config_parse_ifname, 0, Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(Network, match_host) Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(Network, match_virt) Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(Network, match_kernel) +Match.Architecture, config_parse_net_condition, CONDITION_ARCHITECTURE, offsetof(Network, match_arch) Network.Description, config_parse_string, 0, offsetof(Network, description) Network.Bridge, config_parse_bridge, 0, offsetof(Network, bridge) Network.Bond, config_parse_bond, 0, offsetof(Network, bond) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 3119471fa..2e68bec2e 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -177,6 +177,7 @@ int network_get(Manager *manager, struct udev_device *device, Network **ret) { network->match_driver, network->match_type, network->match_name, network->match_host, network->match_virt, network->match_kernel, + network->match_arch, udev_device_get_sysattr_value(device, "address"), udev_device_get_property_value(device, "ID_PATH"), udev_device_get_driver(udev_device_get_parent(device)), diff --git a/src/network/networkd.h b/src/network/networkd.h index 8008df5a7..fb0976491 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -71,9 +71,10 @@ struct NetDev { char *filename; - Condition *condition_host; - Condition *condition_virt; - Condition *condition_kernel; + Condition *match_host; + Condition *match_virt; + Condition *match_kernel; + Condition *match_arch; char *description; char *name; @@ -100,6 +101,7 @@ struct Network { Condition *match_host; Condition *match_virt; Condition *match_kernel; + Condition *match_arch; char *description; NetDev *bridge; diff --git a/src/shared/net-util.c b/src/shared/net-util.c index 6008a41da..a8a2c44ba 100644 --- a/src/shared/net-util.c +++ b/src/shared/net-util.c @@ -39,6 +39,7 @@ bool net_match_config(const struct ether_addr *match_mac, Condition *match_host, Condition *match_virt, Condition *match_kernel, + Condition *match_arch, const char *dev_mac, const char *dev_path, const char *dev_driver, @@ -54,6 +55,9 @@ bool net_match_config(const struct ether_addr *match_mac, if (match_kernel && !condition_test_kernel_command_line(match_kernel)) return 0; + if (match_arch && !condition_test_architecture(match_arch)) + return 0; + if (match_mac && (!dev_mac || memcmp(match_mac, ether_aton(dev_mac), ETH_ALEN))) return 0; diff --git a/src/shared/net-util.h b/src/shared/net-util.h index a20b62e05..908fb22ff 100644 --- a/src/shared/net-util.h +++ b/src/shared/net-util.h @@ -35,6 +35,7 @@ bool net_match_config(const struct ether_addr *match_mac, Condition *match_host, Condition *match_virt, Condition *match_kernel, + Condition *match_arch, const char *dev_mac, const char *dev_path, const char *dev_driver, diff --git a/src/udev/net/link-config-gperf.gperf b/src/udev/net/link-config-gperf.gperf index ffc1b27a1..277ceb538 100644 --- a/src/udev/net/link-config-gperf.gperf +++ b/src/udev/net/link-config-gperf.gperf @@ -23,6 +23,7 @@ Match.Type, config_parse_string, 0, Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(link_config, match_host) Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(link_config, match_virt) Match.KernelCommandLine, config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(link_config, match_kernel) +Match.Architecture, config_parse_net_condition, CONDITION_ARCHITECTURE, offsetof(link_config, match_arch) Link.Description, config_parse_string, 0, offsetof(link_config, description) Link.MACAddressPolicy, config_parse_mac_policy, 0, offsetof(link_config, mac_policy) Link.MACAddress, config_parse_hwaddr, 0, offsetof(link_config, mac) diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 15bea4f4c..e8389c9be 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -240,9 +240,9 @@ int link_config_get(link_config_ctx *ctx, struct udev_device *device, link_confi LIST_FOREACH(links, link, ctx->links) { - if (net_match_config(link->match_mac, link->match_path, - link->match_driver, link->match_type, NULL, - link->match_host, link->match_virt, link->match_kernel, + if (net_match_config(link->match_mac, link->match_path, link->match_driver, + link->match_type, NULL, link->match_host, + link->match_virt, link->match_kernel, link->match_arch, udev_device_get_sysattr_value(device, "address"), udev_device_get_property_value(device, "ID_PATH"), udev_device_get_driver(udev_device_get_parent(device)), diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h index 0dc156d40..9d2eaff37 100644 --- a/src/udev/net/link-config.h +++ b/src/udev/net/link-config.h @@ -58,6 +58,7 @@ struct link_config { Condition *match_host; Condition *match_virt; Condition *match_kernel; + Condition *match_arch; char *description; struct ether_addr *mac; -- 2.30.2