From: Tom Gundersen Date: Thu, 20 Feb 2014 18:39:49 +0000 (+0100) Subject: network/link: Match - filter on kernel cmdline, host and virt X-Git-Tag: v210~109 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=2cc412b59353576cece2d5b30c6a39c70552f0a0;hp=b77c08e06b67d5b1dd8aaf67b732e93851d8ae43 network/link: Match - filter on kernel cmdline, host and virt --- diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index ecc5ca0ba..cfffb3321 100644 --- a/src/network/networkd-gperf.gperf +++ b/src/network/networkd-gperf.gperf @@ -15,30 +15,33 @@ struct ConfigPerfItem; %struct-type %includes %% -Match.MACAddress, config_parse_hwaddr, 0, offsetof(Network, match_mac) -Match.Path, config_parse_string, 0, offsetof(Network, match_path) -Match.Driver, config_parse_string, 0, offsetof(Network, match_driver) -Match.Type, config_parse_string, 0, offsetof(Network, match_type) -Match.Name, config_parse_ifname, 0, offsetof(Network, match_name) -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) -Network.VLAN, config_parse_vlan, 0, offsetof(Network, vlans) -Network.DHCP, config_parse_bool, 0, offsetof(Network, dhcp) -Network.Address, config_parse_address, 0, 0 -Network.Gateway, config_parse_gateway, 0, 0 -Network.DNS, config_parse_dns, 0, offsetof(Network, dns) -Address.Address, config_parse_address, 0, 0 -Address.Broadcast, config_parse_broadcast, 0, 0 -Address.Label, config_parse_label, 0, 0 -Route.Gateway, config_parse_gateway, 0, 0 -Route.Destination, config_parse_destination, 0, 0 -DHCPv4.UseDNS, config_parse_bool, 0, offsetof(Network, dhcp_dns) -DHCPv4.UseMTU, config_parse_bool, 0, offsetof(Network, dhcp_mtu) -DHCPv4.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp_hostname) -DHCPv4.UseDomainName, config_parse_bool, 0, offsetof(Network, dhcp_domainname) -DHCPv4.CriticalConnection, config_parse_bool, 0, offsetof(Network, dhcp_critical) -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) -VLAN.Id, config_parse_uint64, 0, offsetof(NetDev, vlanid) +Match.MACAddress, config_parse_hwaddr, 0, offsetof(Network, match_mac) +Match.Path, config_parse_string, 0, offsetof(Network, match_path) +Match.Driver, config_parse_string, 0, offsetof(Network, match_driver) +Match.Type, config_parse_string, 0, offsetof(Network, match_type) +Match.Name, config_parse_ifname, 0, offsetof(Network, match_name) +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) +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) +Network.VLAN, config_parse_vlan, 0, offsetof(Network, vlans) +Network.DHCP, config_parse_bool, 0, offsetof(Network, dhcp) +Network.Address, config_parse_address, 0, 0 +Network.Gateway, config_parse_gateway, 0, 0 +Network.DNS, config_parse_dns, 0, offsetof(Network, dns) +Address.Address, config_parse_address, 0, 0 +Address.Broadcast, config_parse_broadcast, 0, 0 +Address.Label, config_parse_label, 0, 0 +Route.Gateway, config_parse_gateway, 0, 0 +Route.Destination, config_parse_destination, 0, 0 +DHCPv4.UseDNS, config_parse_bool, 0, offsetof(Network, dhcp_dns) +DHCPv4.UseMTU, config_parse_bool, 0, offsetof(Network, dhcp_mtu) +DHCPv4.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp_hostname) +DHCPv4.UseDomainName, config_parse_bool, 0, offsetof(Network, dhcp_domainname) +DHCPv4.CriticalConnection, config_parse_bool, 0, offsetof(Network, dhcp_critical) +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) +VLAN.Id, config_parse_uint64, 0, offsetof(NetDev, vlanid) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index a470c22e3..fd1befceb 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -175,7 +175,8 @@ int network_get(Manager *manager, struct udev_device *device, Network **ret) { LIST_FOREACH(networks, network, manager->networks) { if (net_match_config(network->match_mac, network->match_path, network->match_driver, network->match_type, - network->match_name, + network->match_name, network->match_host, + network->match_virt, network->match_kernel, 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 5a1bf1a4c..f16226ad7 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -32,6 +32,7 @@ #include "rtnl-util.h" #include "hashmap.h" #include "list.h" +#include "condition-util.h" typedef struct NetDev NetDev; typedef struct Network Network; @@ -92,6 +93,9 @@ struct Network { char *match_driver; char *match_type; char *match_name; + Condition *match_host; + Condition *match_virt; + Condition *match_kernel; char *description; NetDev *bridge; diff --git a/src/shared/net-util.c b/src/shared/net-util.c index ba21ae437..06c50b593 100644 --- a/src/shared/net-util.c +++ b/src/shared/net-util.c @@ -28,18 +28,31 @@ #include "utf8.h" #include "util.h" #include "conf-parser.h" +#include "condition.h" bool net_match_config(const struct ether_addr *match_mac, const char *match_path, const char *match_driver, const char *match_type, const char *match_name, + Condition *match_host, + Condition *match_virt, + Condition *match_kernel, const char *dev_mac, const char *dev_path, const char *dev_driver, const char *dev_type, const char *dev_name) { + if (match_host && !condition_test_host(match_host)) + return 0; + + if (match_virt && !condition_test_virtualization(match_virt)) + return 0; + + if (match_kernel && !condition_test_kernel_command_line(match_kernel)) + return 0; + if (match_mac && (!dev_mac || memcmp(match_mac, ether_aton(dev_mac), ETH_ALEN))) return 0; @@ -64,6 +77,47 @@ unsigned net_netmask_to_prefixlen(const struct in_addr *addr) { return 32 - u32ctz(be32toh(addr->s_addr)); } +int config_parse_net_condition(const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + ConditionType cond = ltype; + Condition **ret = data; + bool negate; + Condition *c; + _cleanup_free_ char *s = NULL; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(data); + + negate = rvalue[0] == '!'; + if (negate) + rvalue++; + + s = strdup(rvalue); + if (!s) + return log_oom(); + + c = condition_new(cond, s, false, negate); + if (!c) + return log_oom(); + + if (*ret) + condition_free(*ret); + + *ret = c; + return 0; +} + int config_parse_ifname(const char *unit, const char *filename, unsigned line, diff --git a/src/shared/net-util.h b/src/shared/net-util.h index 0ec04db87..a20b62e05 100644 --- a/src/shared/net-util.h +++ b/src/shared/net-util.h @@ -25,11 +25,16 @@ #include #include +#include "condition-util.h" + bool net_match_config(const struct ether_addr *match_mac, const char *match_path, const char *match_driver, const char *match_type, const char *match_name, + Condition *match_host, + Condition *match_virt, + Condition *match_kernel, const char *dev_mac, const char *dev_path, const char *dev_driver, @@ -38,6 +43,10 @@ bool net_match_config(const struct ether_addr *match_mac, unsigned net_netmask_to_prefixlen(const struct in_addr *netmask); +int config_parse_net_condition(const char *unit, const char *filename, unsigned line, + const char *section, unsigned section_line, const char *lvalue, + int ltype, const char *rvalue, void *data, void *userdata); + int config_parse_hwaddr(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); diff --git a/src/udev/net/link-config-gperf.gperf b/src/udev/net/link-config-gperf.gperf index 950fb1528..ffc1b27a1 100644 --- a/src/udev/net/link-config-gperf.gperf +++ b/src/udev/net/link-config-gperf.gperf @@ -16,17 +16,20 @@ struct ConfigPerfItem; %struct-type %includes %% -Match.MACAddress, config_parse_hwaddr, 0, offsetof(link_config, match_mac) -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) -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) -Link.NamePolicy, config_parse_name_policy, 0, offsetof(link_config, name_policy) -Link.Name, config_parse_ifname, 0, offsetof(link_config, name) -Link.Alias, config_parse_ifalias, 0, offsetof(link_config, alias) -Link.MTU, config_parse_unsigned, 0, offsetof(link_config, mtu) -Link.SpeedMBytes, config_parse_unsigned, 0, offsetof(link_config, speed) -Link.Duplex, config_parse_duplex, 0, offsetof(link_config, duplex) -Link.WakeOnLan, config_parse_wol, 0, offsetof(link_config, wol) +Match.MACAddress, config_parse_hwaddr, 0, offsetof(link_config, match_mac) +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) +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) +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) +Link.NamePolicy, config_parse_name_policy, 0, offsetof(link_config, name_policy) +Link.Name, config_parse_ifname, 0, offsetof(link_config, name) +Link.Alias, config_parse_ifalias, 0, offsetof(link_config, alias) +Link.MTU, config_parse_unsigned, 0, offsetof(link_config, mtu) +Link.SpeedMBytes, config_parse_unsigned, 0, offsetof(link_config, speed) +Link.Duplex, config_parse_duplex, 0, offsetof(link_config, duplex) +Link.WakeOnLan, config_parse_wol, 0, offsetof(link_config, wol) diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 587eeefad..15bea4f4c 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -242,6 +242,7 @@ int link_config_get(link_config_ctx *ctx, struct udev_device *device, link_confi 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, 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 4fc896311..0dc156d40 100644 --- a/src/udev/net/link-config.h +++ b/src/udev/net/link-config.h @@ -23,6 +23,7 @@ #include "ethtool-util.h" +#include "condition-util.h" #include "libudev.h" #include "util.h" #include "list.h" @@ -54,6 +55,9 @@ struct link_config { char *match_path; char *match_driver; char *match_type; + Condition *match_host; + Condition *match_virt; + Condition *match_kernel; char *description; struct ether_addr *mac;