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 src/network/networkd-manager.c
nodist_systemd_networkd_SOURCES = \ nodist_systemd_networkd_SOURCES = \
src/network/networkd-gperf.c src/network/networkd-network-gperf.c \
src/network/networkd-netdev-gperf.c
systemd_networkd_LDADD = \ systemd_networkd_LDADD = \
libudev-internal.la \ libudev-internal.la \
@ -3949,7 +3950,8 @@ test_network_SOURCES = \
src/network/networkd-address.c \ src/network/networkd-address.c \
src/network/networkd-route.c \ src/network/networkd-route.c \
src/network/networkd-manager.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 = \ test_network_LDADD = \
libudev-internal.la \ libudev-internal.la \
@ -3962,11 +3964,13 @@ tests += \
test-network test-network
EXTRA_DIST += \ EXTRA_DIST += \
src/network/networkd-gperf.gperf \ src/network/networkd-network-gperf.gperf \
src/network/networkd-netdev-gperf.gperf \
units/systemd-networkd.service.in units/systemd-networkd.service.in
CLEANFILES += \ CLEANFILES += \
src/network/networkd-gperf.c src/network/networkd-network-gperf.c \
src/network/networkd-netdev-gperf.c
endif 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->kind = _NETDEV_KIND_INVALID;
netdev->vlanid = VLANID_MAX + 1; netdev->vlanid = VLANID_MAX + 1;
r = config_parse(NULL, filename, file, "NetDev\0VLAN\0", config_item_perf_lookup, r = config_parse(NULL, filename, file, "Match\0NetDev\0VLAN\0", config_item_perf_lookup,
(void*) network_gperf_lookup, false, false, netdev); (void*) network_netdev_gperf_lookup, false, false, netdev);
if (r < 0) { if (r < 0) {
log_warning("Could not parse config file %s: %s", filename, strerror(-r)); log_warning("Could not parse config file %s: %s", filename, strerror(-r));
return r; return r;
@ -363,6 +363,12 @@ static int netdev_load_one(Manager *manager, const char *filename) {
if (!netdev->filename) if (!netdev->filename)
return log_oom(); 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); r = hashmap_put(netdev->manager->netdevs, netdev->name, netdev);
if (r < 0) if (r < 0)
return r; 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; network->dhcp_domainname = true;
r = config_parse(NULL, filename, file, "Match\0Network\0Address\0Route\0DHCPv4\0", config_item_perf_lookup, 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) { if (r < 0) {
log_warning("Could not parse config file %s: %s", filename, strerror(-r)); log_warning("Could not parse config file %s: %s", filename, strerror(-r));
return r; return r;

View file

@ -71,6 +71,10 @@ struct NetDev {
char *filename; char *filename;
Condition *condition_host;
Condition *condition_virt;
Condition *condition_kernel;
char *description; char *description;
char *name; char *name;
NetDevKind kind; 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); 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 */ /* Network */
int network_load(Manager *manager); 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); int ltype, const char *rvalue, void *data, void *userdata);
/* gperf */ /* gperf */
const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
const struct ConfigPerfItem* network_gperf_lookup(const char *key, unsigned length);
/* Route */ /* Route */
int route_new_static(Network *network, unsigned section, Route **ret); int route_new_static(Network *network, unsigned section, Route **ret);