network/link: Match - filter on kernel cmdline, host and virt
authorTom Gundersen <teg@jklm.no>
Thu, 20 Feb 2014 18:39:49 +0000 (19:39 +0100)
committerTom Gundersen <teg@jklm.no>
Thu, 20 Feb 2014 20:50:34 +0000 (21:50 +0100)
src/network/networkd-gperf.gperf
src/network/networkd-network.c
src/network/networkd.h
src/shared/net-util.c
src/shared/net-util.h
src/udev/net/link-config-gperf.gperf
src/udev/net/link-config.c
src/udev/net/link-config.h

index ecc5ca0..cfffb33 100644 (file)
@@ -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)
index a470c22..fd1befc 100644 (file)
@@ -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)),
index 5a1bf1a..f16226a 100644 (file)
@@ -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;
index ba21ae4..06c50b5 100644 (file)
 #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,
index 0ec04db..a20b62e 100644 (file)
 #include <netinet/in.h>
 #include <stdbool.h>
 
+#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);
index 950fb15..ffc1b27 100644 (file)
@@ -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)
index 587eeef..15bea4f 100644 (file)
@@ -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)),
index 4fc8963..0dc156d 100644 (file)
@@ -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;