networkd: netdev - allow filtering on kernel cmdline, host and virt

This commit is contained in:
Tom Gundersen 2014-02-20 19:56:50 +01:00
parent 2cc412b593
commit c0dda18697
8 changed files with 94 additions and 57 deletions

View 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
# ------------------------------------------------------------------------------

View File

@ -1 +1,2 @@
/networkd-gperf.c
/networkd-network-gperf.c
/networkd-netdev-gperf.c

View File

@ -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)

View File

@ -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)

View 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;

View File

@ -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)

View 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;

View 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);