From c0dda18697e0994272c0c9616d36f6777b60e2c7 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Thu, 20 Feb 2014 19:56:50 +0100 Subject: [PATCH] networkd: netdev - allow filtering on kernel cmdline, host and virt --- Makefile.am | 12 ++++-- src/network/.gitignore | 3 +- src/network/networkd-gperf.gperf | 47 ------------------------ src/network/networkd-netdev-gperf.gperf | 24 ++++++++++++ src/network/networkd-netdev.c | 10 ++++- src/network/networkd-network-gperf.gperf | 43 ++++++++++++++++++++++ src/network/networkd-network.c | 2 +- src/network/networkd.h | 10 ++++- 8 files changed, 94 insertions(+), 57 deletions(-) delete mode 100644 src/network/networkd-gperf.gperf create mode 100644 src/network/networkd-netdev-gperf.gperf create mode 100644 src/network/networkd-network-gperf.gperf diff --git a/Makefile.am b/Makefile.am index ee7dd2d6c..6b6f6db02 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 b2a8c1ae1..885859648 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 cfffb3321..000000000 --- a/src/network/networkd-gperf.gperf +++ /dev/null @@ -1,47 +0,0 @@ -%{ -#include -#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 000000000..cdaacb18a --- /dev/null +++ b/src/network/networkd-netdev-gperf.gperf @@ -0,0 +1,24 @@ +%{ +#include +#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 ea6da69be..773163d76 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 000000000..011f7e903 --- /dev/null +++ b/src/network/networkd-network-gperf.gperf @@ -0,0 +1,43 @@ +%{ +#include +#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 fd1befceb..3119471fa 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 f16226ad7..8008df5a7 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); -- 2.30.2