chiark / gitweb /
networkd: netdev - allow filtering on kernel cmdline, host and virt
authorTom Gundersen <teg@jklm.no>
Thu, 20 Feb 2014 18:56:50 +0000 (19:56 +0100)
committerTom Gundersen <teg@jklm.no>
Thu, 20 Feb 2014 21:12:25 +0000 (22:12 +0100)
Makefile.am
src/network/.gitignore
src/network/networkd-gperf.gperf [deleted file]
src/network/networkd-netdev-gperf.gperf [new file with mode: 0644]
src/network/networkd-netdev.c
src/network/networkd-network-gperf.gperf [new file with mode: 0644]
src/network/networkd-network.c
src/network/networkd.h

index ee7dd2d6cf0bc43f26b5ab6dd770be58b7518d0b..6b6f6db025dbf496a31b4136830fa0204c1fcf85 100644 (file)
@@ -3925,7 +3925,8 @@ systemd_networkd_SOURCES = \
        src/network/networkd-manager.c
 
 nodist_systemd_networkd_SOURCES = \
-       src/network/networkd-gperf.c
+       src/network/networkd-network-gperf.c \
+       src/network/networkd-netdev-gperf.c
 
 systemd_networkd_LDADD = \
        libudev-internal.la \
@@ -3949,7 +3950,8 @@ test_network_SOURCES = \
        src/network/networkd-address.c \
        src/network/networkd-route.c \
        src/network/networkd-manager.c \
-       src/network/networkd-gperf.c
+       src/network/networkd-network-gperf.c \
+       src/network/networkd-netdev-gperf.c
 
 test_network_LDADD = \
        libudev-internal.la \
@@ -3962,11 +3964,13 @@ tests += \
        test-network
 
 EXTRA_DIST += \
-       src/network/networkd-gperf.gperf \
+       src/network/networkd-network-gperf.gperf \
+       src/network/networkd-netdev-gperf.gperf \
        units/systemd-networkd.service.in
 
 CLEANFILES += \
-       src/network/networkd-gperf.c
+       src/network/networkd-network-gperf.c \
+       src/network/networkd-netdev-gperf.c
 endif
 
 # ------------------------------------------------------------------------------
index b2a8c1ae1a33f0a6e74c74d4a9d384d69b49e5ca..8858596489610f1cd9cd7fca968dd310b7f88c7b 100644 (file)
@@ -1 +1,2 @@
-/networkd-gperf.c
+/networkd-network-gperf.c
+/networkd-netdev-gperf.c
diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf
deleted file mode 100644 (file)
index cfffb33..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-%{
-#include <stddef.h>
-#include "conf-parser.h"
-#include "networkd.h"
-#include "net-util.h"
-%}
-struct ConfigPerfItem;
-%null_strings
-%language=ANSI-C
-%define slot-name section_and_lvalue
-%define hash-function-name network_gperf_hash
-%define lookup-function-name network_gperf_lookup
-%readonly-tables
-%omit-struct-type
-%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)
-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-netdev-gperf.gperf b/src/network/networkd-netdev-gperf.gperf
new file mode 100644 (file)
index 0000000..cdaacb1
--- /dev/null
@@ -0,0 +1,24 @@
+%{
+#include <stddef.h>
+#include "conf-parser.h"
+#include "networkd.h"
+#include "net-util.h"
+%}
+struct ConfigPerfItem;
+%null_strings
+%language=ANSI-C
+%define slot-name section_and_lvalue
+%define hash-function-name network_netdev_gperf_hash
+%define lookup-function-name network_netdev_gperf_lookup
+%readonly-tables
+%omit-struct-type
+%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)
+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 ea6da69beb284051e33db297449d244fe2d62f4e..773163d76c63a8db232d2d4ea1e84307e4c6fe75 100644 (file)
@@ -337,8 +337,8 @@ static int netdev_load_one(Manager *manager, const char *filename) {
         netdev->kind = _NETDEV_KIND_INVALID;
         netdev->vlanid = VLANID_MAX + 1;
 
-        r = config_parse(NULL, filename, file, "NetDev\0VLAN\0", config_item_perf_lookup,
-                        (void*) network_gperf_lookup, false, false, netdev);
+        r = config_parse(NULL, filename, file, "Match\0NetDev\0VLAN\0", config_item_perf_lookup,
+                        (void*) network_netdev_gperf_lookup, false, false, netdev);
         if (r < 0) {
                 log_warning("Could not parse config file %s: %s", filename, strerror(-r));
                 return r;
@@ -363,6 +363,12 @@ static int netdev_load_one(Manager *manager, const char *filename) {
         if (!netdev->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)
+                return 0;
+
         r = hashmap_put(netdev->manager->netdevs, netdev->name, netdev);
         if (r < 0)
                 return r;
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
new file mode 100644 (file)
index 0000000..011f7e9
--- /dev/null
@@ -0,0 +1,43 @@
+%{
+#include <stddef.h>
+#include "conf-parser.h"
+#include "networkd.h"
+#include "net-util.h"
+%}
+struct ConfigPerfItem;
+%null_strings
+%language=ANSI-C
+%define slot-name section_and_lvalue
+%define hash-function-name network_network_gperf_hash
+%define lookup-function-name network_network_gperf_lookup
+%readonly-tables
+%omit-struct-type
+%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)
+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)
index fd1befcebffcce019893b73226d9add99e8ed5de..3119471fa25a8801bb4b3d4e9ce8dff8d0db1290 100644 (file)
@@ -74,7 +74,7 @@ static int network_load_one(Manager *manager, const char *filename) {
         network->dhcp_domainname = true;
 
         r = config_parse(NULL, filename, file, "Match\0Network\0Address\0Route\0DHCPv4\0", config_item_perf_lookup,
-                        (void*) network_gperf_lookup, false, false, network);
+                        (void*) network_network_gperf_lookup, false, false, network);
         if (r < 0) {
                 log_warning("Could not parse config file %s: %s", filename, strerror(-r));
                 return r;
index f16226ad7d0378f830fecfec9f87727aad622c0d..8008df5a793a9a4155f49999d60071cb8f19fbee 100644 (file)
@@ -71,6 +71,10 @@ struct NetDev {
 
         char *filename;
 
+        Condition *condition_host;
+        Condition *condition_virt;
+        Condition *condition_kernel;
+
         char *description;
         char *name;
         NetDevKind kind;
@@ -242,6 +246,9 @@ NetDevKind netdev_kind_from_string(const char *d) _pure_;
 
 int config_parse_netdev_kind(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);
 
+/* gperf */
+const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
+
 /* Network */
 
 int network_load(Manager *manager);
@@ -267,8 +274,7 @@ int config_parse_vlan(const char *unit, const char *filename, unsigned line,
                       int ltype, const char *rvalue, void *data, void *userdata);
 
 /* gperf */
-
-const struct ConfigPerfItem* network_gperf_lookup(const char *key, unsigned length);
+const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
 
 /* Route */
 int route_new_static(Network *network, unsigned section, Route **ret);