8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering This file is part of systemd.
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering Copyright 2013 Tom Gundersen <teg@jklm.no>
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering systemd is free software; you can redistribute it and/or modify it
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering under the terms of the GNU Lesser General Public License as published by
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering (at your option) any later version.
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering systemd is distributed in the hope that it will be useful, but
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering Lesser General Public License for more details.
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering You should have received a copy of the GNU Lesser General Public License
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poetteringstatic int network_load_one(Manager *manager, const char *filename) {
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering _cleanup_network_free_ Network *network = NULL;
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering log_debug("Skipping empty file: %s", filename);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering LIST_HEAD_INIT(network->static_addresses);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering LIST_HEAD_INIT(network->static_fdb_entries);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->stacked_netdevs = hashmap_new(&string_hash_ops);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->addresses_by_section = hashmap_new(NULL);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->routes_by_section = hashmap_new(NULL);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->fdb_entries_by_section = hashmap_new(NULL);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->name = strdup(basename(filename));
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->dhcp_route_metric = DHCP_ROUTE_METRIC;
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->dhcp_client_identifier = DHCP_CLIENT_ID_DUID;
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->dhcp_server_emit_timezone = true;
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->dnssec_mode = _DNSSEC_MODE_INVALID;
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->link_local = ADDRESS_FAMILY_IPV6;
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->ipv6_privacy_extensions = IPV6_PRIVACY_EXTENSIONS_NO;
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering "DHCPServer\0"
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering "BridgeFDB\0",
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering config_item_perf_lookup, network_network_gperf_lookup,
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering false, false, true, network);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering /* IPMasquerade=yes implies IPForward=yes */
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering network->ip_forward |= ADDRESS_FAMILY_IPV4;
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering LIST_PREPEND(networks, manager->networks, network);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering r = hashmap_ensure_allocated(&manager->networks_by_name, &string_hash_ops);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering r = hashmap_put(manager->networks_by_name, network->name, network);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering LIST_FOREACH(routes, route, network->static_routes) {
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering log_warning("Route section without Gateway field configured in %s. "
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering LIST_FOREACH(addresses, address, network->static_addresses) {
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering log_warning("Address section without Address field configured in %s. "
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering r = conf_files_list_strv(&files, ".network", NULL, network_dirs);
8530dc4467691a893aa2e07319b18a84fec96cadLennart Poettering return log_error_errno(r, "Failed to enumerate network files: %m");
Iterator i;
if (!network)
if (!network)
return -ENOENT;
if (device) {
if (parent)
if (attr)
return -ENOENT;
return -EINVAL;
return -errno;
const char *filename,
unsigned line,
const char *section,
unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
void *data,
void *userdata) {
if (!kind_string)
return log_oom();
for (p = kind_string; *p; p++)
*p = tolower(*p);
log_syntax(unit, LOG_ERR, filename, line, r, "%s could not be found, ignoring assignment: %s", lvalue, rvalue);
log_syntax(unit, LOG_ERR, filename, line, 0, "NetDev is not a %s, ignoring assignment: %s", lvalue, rvalue);
switch (kind) {
case NETDEV_KIND_BRIDGE:
case NETDEV_KIND_BOND:
case NETDEV_KIND_VLAN:
case NETDEV_KIND_MACVLAN:
case NETDEV_KIND_MACVTAP:
case NETDEV_KIND_IPVLAN:
case NETDEV_KIND_VXLAN:
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) {
assert(n);
p = rvalue;
log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract search or route domain, ignoring: %s", rvalue);
is_route = true;
log_syntax(unit, LOG_ERR, filename, line, 0, "'localhost' domain names may not be configure as search or route domains, ignoring assignment: %s", domain);
if (is_route) {
return log_oom();
return log_oom();
const char *filename,
unsigned line,
const char *section,
unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
void *data,
void *userdata) {
log_syntax(unit, LOG_ERR, filename, line, r, "Cannot add VLAN '%s' to network, ignoring: %m", rvalue);
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) {
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) {
s = ADDRESS_FAMILY_NO;
s = ADDRESS_FAMILY_IPV4;
s = ADDRESS_FAMILY_IPV6;
s = ADDRESS_FAMILY_YES;
*dhcp = s;
DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_client_identifier, dhcp_client_identifier, DCHPClientIdentifier, "Failed to parse client identifier type");
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) {
log_syntax(unit, LOG_ERR, filename, line, r, "IPv6 token can not be the ANY address, ignoring: %s", rvalue);
log_syntax(unit, LOG_ERR, filename, line, 0, "IPv6 token can not be longer than 64 bits, ignoring: %s", rvalue);
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) {
log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse IPv6 privacy extensions option, ignoring: %s", rvalue);
*ipv6_privacy_extensions = s;
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) {
r = config_parse_string(unit, filename, line, section, section_line, lvalue, ltype, rvalue, &hn, userdata);
log_syntax(unit, LOG_ERR, filename, line, 0, "Hostname is not valid, ignoring assignment: %s", rvalue);
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) {
r = config_parse_string(unit, filename, line, section, section_line, lvalue, ltype, rvalue, &tz, userdata);
log_syntax(unit, LOG_ERR, filename, line, 0, "Timezone is not valid, ignoring assignment: %s", rvalue);
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) {
const char *p = rvalue;
struct in_addr a, *m;
log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse DNS server address, ignoring: %s", w);
return log_oom();
m[n->n_dhcp_server_dns++] = a;
n->dhcp_server_dns = m;
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) {
const char *p = rvalue;
struct in_addr a, *m;
log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse NTP server address, ignoring: %s", w);
return log_oom();
m[n->n_dhcp_server_ntp++] = a;
n->dhcp_server_ntp = m;
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) {
const char *p = rvalue;
assert(n);
log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract negative trust anchor domain, ignoring: %s", rvalue);
r = dns_name_is_valid(w);
return log_oom();
w = NULL;
DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_use_domains, dhcp_use_domains, DHCPUseDomains, "Failed to parse DHCP use domains setting");