summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-02-20 19:56:50 +0100
committerTom Gundersen <teg@jklm.no>2014-02-20 22:12:25 +0100
commitc0dda18697e0994272c0c9616d36f6777b60e2c7 (patch)
tree736fc238bdc6278dc82ecce6dd05cd087130bf58
parent2cc412b59353576cece2d5b30c6a39c70552f0a0 (diff)
networkd: netdev - allow filtering on kernel cmdline, host and virt
-rw-r--r--Makefile.am12
-rw-r--r--src/network/.gitignore3
-rw-r--r--src/network/networkd-gperf.gperf47
-rw-r--r--src/network/networkd-netdev-gperf.gperf24
-rw-r--r--src/network/networkd-netdev.c10
-rw-r--r--src/network/networkd-network-gperf.gperf43
-rw-r--r--src/network/networkd-network.c2
-rw-r--r--src/network/networkd.h10
8 files changed, 94 insertions, 57 deletions
diff --git a/Makefile.am b/Makefile.am
index ee7dd2d6cf..6b6f6db025 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -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
# ------------------------------------------------------------------------------
diff --git a/src/network/.gitignore b/src/network/.gitignore
index b2a8c1ae1a..8858596489 100644
--- a/src/network/.gitignore
+++ b/src/network/.gitignore
@@ -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
index cfffb3321d..0000000000
--- a/src/network/networkd-gperf.gperf
+++ /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
index 0000000000..cdaacb18ae
--- /dev/null
+++ b/src/network/networkd-netdev-gperf.gperf
@@ -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)
diff --git a/src/network/networkd-netdev.c b/src/network/networkd-netdev.c
index ea6da69beb..773163d76c 100644
--- a/src/network/networkd-netdev.c
+++ b/src/network/networkd-netdev.c
@@ -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
index 0000000000..011f7e9038
--- /dev/null
+++ b/src/network/networkd-network-gperf.gperf
@@ -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)
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index fd1befcebf..3119471fa2 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -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;
diff --git a/src/network/networkd.h b/src/network/networkd.h
index f16226ad7d..8008df5a79 100644
--- a/src/network/networkd.h
+++ b/src/network/networkd.h
@@ -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);