X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-network.c;h=eb13e9e93dab5297bcb2811c49edb6e272432e6a;hb=6528693a94821e0e13a8e112fb481c4ab0c62688;hp=e25909374f810d78b109349784e60219db43d2ab;hpb=be737420b7cd9489bfa2d518a577a0b56cb51862;p=thirdparty%2Fsystemd.git diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index e25909374f8..eb13e9e93da 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -1,9 +1,4 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ -/*** - This file is part of systemd. - - Copyright 2013 Tom Gundersen -***/ #include #include @@ -41,7 +36,12 @@ static int network_config_compare_func(const void *a, const void *b) { if (r != 0) return r; - return y->line - x->line; + if (x->line < y->line) + return -1; + if (x->line > y->line) + return 1; + + return 0; } const struct hash_ops network_config_hash_ops = { @@ -224,9 +224,11 @@ static int network_load_one(Manager *manager, const char *filename) { network->router_emit_dns = true; network->router_emit_domains = true; - network->use_bpdu = true; - network->allow_port_to_be_root = true; - network->unicast_flood = true; + network->use_bpdu = -1; + network->hairpin = -1; + network->fast_leave = -1; + network->allow_port_to_be_root = -1; + network->unicast_flood = -1; network->priority = LINK_BRIDGE_PORT_PRIORITY_INVALID; network->lldp_mode = LLDP_MODE_ROUTERS_ONLY; @@ -234,6 +236,7 @@ static int network_load_one(Manager *manager, const char *filename) { network->llmnr = RESOLVE_SUPPORT_YES; network->mdns = RESOLVE_SUPPORT_NO; network->dnssec_mode = _DNSSEC_MODE_INVALID; + network->dns_over_tls_mode = _DNS_OVER_TLS_MODE_INVALID; network->link_local = ADDRESS_FAMILY_IPV6; @@ -245,6 +248,8 @@ static int network_load_one(Manager *manager, const char *filename) { network->duid.type = _DUID_TYPE_INVALID; network->proxy_arp = -1; network->arp = -1; + network->multicast = -1; + network->allmulticast = -1; network->ipv6_accept_ra_use_dns = true; network->ipv6_accept_ra_route_table = RT_TABLE_MAIN; network->ipv6_mtu = 0; @@ -268,7 +273,8 @@ static int network_load_one(Manager *manager, const char *filename) { "BridgeFDB\0" "BridgeVLAN\0" "IPv6PrefixDelegation\0" - "IPv6Prefix\0", + "IPv6Prefix\0" + "CAN\0", config_item_perf_lookup, network_network_gperf_lookup, CONFIG_PARSE_WARN, network); if (r < 0) @@ -351,7 +357,7 @@ void network_free(Network *network) { free(network->filename); - free(network->match_mac); + set_free_free(network->match_mac); strv_free(network->match_path); strv_free(network->match_driver); strv_free(network->match_type); @@ -359,6 +365,7 @@ void network_free(Network *network) { free(network->description); free(network->dhcp_vendor_class_identifier); + strv_free(network->dhcp_user_class); free(network->dhcp_hostname); free(network->mac); @@ -964,7 +971,8 @@ int config_parse_hostname( void *data, void *userdata) { - char **hostname = data, *hn = NULL; + _cleanup_free_ char *hn = NULL; + char **hostname = data; int r; assert(filename); @@ -977,13 +985,20 @@ int config_parse_hostname( if (!hostname_is_valid(hn, false)) { log_syntax(unit, LOG_ERR, filename, line, 0, "Hostname is not valid, ignoring assignment: %s", rvalue); - free(hn); return 0; } - free(*hostname); - *hostname = hostname_cleanup(hn); - return 0; + r = dns_name_is_valid(hn); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to check validity of hostname '%s', ignoring assignment: %m", rvalue); + return 0; + } + if (r == 0) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Hostname is not a valid DNS domain name, ignoring assignment: %s", rvalue); + return 0; + } + + return free_and_replace(*hostname, hn); } int config_parse_timezone( @@ -1009,7 +1024,7 @@ int config_parse_timezone( if (r < 0) return r; - if (!timezone_is_valid(tz)) { + if (!timezone_is_valid(tz, LOG_ERR)) { log_syntax(unit, LOG_ERR, filename, line, 0, "Timezone is not valid, ignoring assignment: %s", rvalue); free(tz); return 0; @@ -1385,6 +1400,58 @@ int config_parse_ntp( return 0; } +int config_parse_dhcp_user_class( + 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) { + + char ***l = data; + int r; + + assert(l); + assert(lvalue); + assert(rvalue); + + if (isempty(rvalue)) { + *l = strv_free(*l); + return 0; + } + + for (;;) { + _cleanup_free_ char *w = NULL; + + r = extract_first_word(&rvalue, &w, NULL, 0); + if (r == -ENOMEM) + return log_oom(); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, "Failed to split user classes option, ignoring: %s", rvalue); + break; + } + if (r == 0) + break; + + if (strlen(w) > 255) { + log_syntax(unit, LOG_ERR, filename, line, r, "%s length is not in the range 1-255, ignoring.", w); + continue; + } + + r = strv_push(l, w); + if (r < 0) + return log_oom(); + + w = NULL; + } + + return 0; +} + int config_parse_dhcp_route_table(const char *unit, const char *filename, unsigned line,