network: move conf parsers and function prototypes
This commit is contained in:
parent
539bcc831b
commit
ca5ad760a5
|
@ -55,11 +55,16 @@ sources = files('''
|
|||
networkd-can.h
|
||||
networkd-conf.c
|
||||
networkd-conf.h
|
||||
networkd-dhcp-common.c
|
||||
networkd-dhcp-common.h
|
||||
networkd-dhcp4.c
|
||||
networkd-dhcp4.h
|
||||
networkd-dhcp6.c
|
||||
networkd-dhcp6.h
|
||||
networkd-fdb.c
|
||||
networkd-fdb.h
|
||||
networkd-ipv4ll.c
|
||||
networkd-ipv4ll.h
|
||||
networkd-ipv6-proxy-ndp.c
|
||||
networkd-ipv6-proxy-ndp.h
|
||||
networkd-link-bus.c
|
||||
|
|
|
@ -9,6 +9,9 @@
|
|||
|
||||
#include "conf-parser.h"
|
||||
|
||||
#define BRIDGE_VLAN_BITMAP_MAX 4096
|
||||
#define BRIDGE_VLAN_BITMAP_LEN (BRIDGE_VLAN_BITMAP_MAX / 32)
|
||||
|
||||
typedef struct Link Link;
|
||||
|
||||
int br_vlan_configure(Link *link, uint16_t pvid, uint32_t *br_vid_bitmap, uint32_t *br_untagged_bitmap);
|
||||
|
|
|
@ -0,0 +1,140 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
|
||||
#include "networkd-dhcp-common.h"
|
||||
#include "networkd-network.h"
|
||||
#include "parse-util.h"
|
||||
#include "string-table.h"
|
||||
|
||||
int config_parse_dhcp(
|
||||
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) {
|
||||
|
||||
AddressFamilyBoolean *dhcp = data, s;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
/* Note that this is mostly like
|
||||
* config_parse_address_family_boolean(), except that it
|
||||
* understands some old names for the enum values */
|
||||
|
||||
s = address_family_boolean_from_string(rvalue);
|
||||
if (s < 0) {
|
||||
|
||||
/* Previously, we had a slightly different enum here,
|
||||
* support its values for compatibility. */
|
||||
|
||||
if (streq(rvalue, "none"))
|
||||
s = ADDRESS_FAMILY_NO;
|
||||
else if (streq(rvalue, "v4"))
|
||||
s = ADDRESS_FAMILY_IPV4;
|
||||
else if (streq(rvalue, "v6"))
|
||||
s = ADDRESS_FAMILY_IPV6;
|
||||
else if (streq(rvalue, "both"))
|
||||
s = ADDRESS_FAMILY_YES;
|
||||
else {
|
||||
log_syntax(unit, LOG_ERR, filename, line, 0,
|
||||
"Failed to parse DHCP option, ignoring: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
log_syntax(unit, LOG_WARNING, filename, line, 0,
|
||||
"DHCP=%s is deprecated, please use DHCP=%s instead.",
|
||||
rvalue, address_family_boolean_to_string(s));
|
||||
}
|
||||
|
||||
*dhcp = s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_section_route_table(
|
||||
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) {
|
||||
|
||||
Network *network = data;
|
||||
uint32_t rt;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
r = safe_atou32(rvalue, &rt);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to parse RouteTable=%s, ignoring assignment: %m", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (streq_ptr(section, "DHCP")) {
|
||||
network->dhcp_route_table = rt;
|
||||
network->dhcp_route_table_set = true;
|
||||
} else { /* section is IPv6AcceptRA */
|
||||
network->ipv6_accept_ra_route_table = rt;
|
||||
network->ipv6_accept_ra_route_table_set = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_iaid(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) {
|
||||
Network *network = data;
|
||||
uint32_t iaid;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(network);
|
||||
|
||||
r = safe_atou32(rvalue, &iaid);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Unable to read IAID, ignoring assignment: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
network->iaid = iaid;
|
||||
network->iaid_set = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_use_domains, dhcp_use_domains, DHCPUseDomains,
|
||||
"Failed to parse DHCP use domains setting");
|
||||
|
||||
static const char* const dhcp_use_domains_table[_DHCP_USE_DOMAINS_MAX] = {
|
||||
[DHCP_USE_DOMAINS_NO] = "no",
|
||||
[DHCP_USE_DOMAINS_ROUTE] = "route",
|
||||
[DHCP_USE_DOMAINS_YES] = "yes",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(dhcp_use_domains, DHCPUseDomains, DHCP_USE_DOMAINS_YES);
|
|
@ -0,0 +1,33 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
#pragma once
|
||||
|
||||
#include "conf-parser.h"
|
||||
#include "dhcp-identifier.h"
|
||||
#include "time-util.h"
|
||||
|
||||
#define DHCP_ROUTE_METRIC 1024
|
||||
|
||||
typedef enum DHCPUseDomains {
|
||||
DHCP_USE_DOMAINS_NO,
|
||||
DHCP_USE_DOMAINS_YES,
|
||||
DHCP_USE_DOMAINS_ROUTE,
|
||||
_DHCP_USE_DOMAINS_MAX,
|
||||
_DHCP_USE_DOMAINS_INVALID = -1,
|
||||
} DHCPUseDomains;
|
||||
|
||||
typedef struct DUID {
|
||||
/* Value of Type in [DHCP] section */
|
||||
DUIDType type;
|
||||
|
||||
uint8_t raw_data_len;
|
||||
uint8_t raw_data[MAX_DUID_LEN];
|
||||
usec_t llt_time;
|
||||
} DUID;
|
||||
|
||||
const char* dhcp_use_domains_to_string(DHCPUseDomains p) _const_;
|
||||
DHCPUseDomains dhcp_use_domains_from_string(const char *s) _pure_;
|
||||
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_domains);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_iaid);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_section_route_table);
|
|
@ -7,9 +7,11 @@
|
|||
#include "hostname-util.h"
|
||||
#include "parse-util.h"
|
||||
#include "network-internal.h"
|
||||
#include "networkd-dhcp4.h"
|
||||
#include "networkd-link.h"
|
||||
#include "networkd-manager.h"
|
||||
#include "networkd-network.h"
|
||||
#include "string-table.h"
|
||||
#include "string-util.h"
|
||||
#include "sysctl-util.h"
|
||||
|
||||
|
@ -1078,3 +1080,175 @@ int dhcp4_configure(Link *link) {
|
|||
|
||||
return dhcp4_set_client_identifier(link);
|
||||
}
|
||||
|
||||
int config_parse_dhcp_max_attempts(
|
||||
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) {
|
||||
|
||||
Network *network = data;
|
||||
uint64_t a;
|
||||
int r;
|
||||
|
||||
assert(network);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
|
||||
if (isempty(rvalue)) {
|
||||
network->dhcp_max_attempts = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (streq(rvalue, "infinity")) {
|
||||
network->dhcp_max_attempts = (uint64_t) -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = safe_atou64(rvalue, &a);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to parse DHCP maximum attempts, ignoring: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (a == 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, 0,
|
||||
"%s= must be positive integer or 'infinity', ignoring: %s", lvalue, rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
network->dhcp_max_attempts = a;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_dhcp_black_listed_ip_address(
|
||||
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) {
|
||||
|
||||
Network *network = data;
|
||||
const char *p;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
if (isempty(rvalue)) {
|
||||
network->dhcp_black_listed_ip = set_free(network->dhcp_black_listed_ip);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (p = rvalue;;) {
|
||||
_cleanup_free_ char *n = NULL;
|
||||
union in_addr_union ip;
|
||||
|
||||
r = extract_first_word(&p, &n, NULL, 0);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to parse DHCP black listed ip address, ignoring assignment: %s",
|
||||
rvalue);
|
||||
return 0;
|
||||
}
|
||||
if (r == 0)
|
||||
return 0;
|
||||
|
||||
r = in_addr_from_string(AF_INET, n, &ip);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"DHCP black listed ip address is invalid, ignoring assignment: %s", n);
|
||||
continue;
|
||||
}
|
||||
|
||||
r = set_ensure_allocated(&network->dhcp_black_listed_ip, NULL);
|
||||
if (r < 0)
|
||||
return log_oom();
|
||||
|
||||
r = set_put(network->dhcp_black_listed_ip, UINT32_TO_PTR(ip.in.s_addr));
|
||||
if (r < 0)
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to store DHCP black listed ip address '%s', ignoring assignment: %m", n);
|
||||
}
|
||||
|
||||
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, 0,
|
||||
"%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;
|
||||
}
|
||||
|
||||
static const char* const dhcp_client_identifier_table[_DHCP_CLIENT_ID_MAX] = {
|
||||
[DHCP_CLIENT_ID_MAC] = "mac",
|
||||
[DHCP_CLIENT_ID_DUID] = "duid",
|
||||
[DHCP_CLIENT_ID_DUID_ONLY] = "duid-only",
|
||||
};
|
||||
|
||||
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(dhcp_client_identifier, DHCPClientIdentifier);
|
||||
DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_client_identifier, dhcp_client_identifier, DHCPClientIdentifier,
|
||||
"Failed to parse client identifier type");
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
#pragma once
|
||||
|
||||
#include "conf-parser.h"
|
||||
|
||||
typedef struct Link Link;
|
||||
|
||||
typedef enum DHCPClientIdentifier {
|
||||
DHCP_CLIENT_ID_MAC,
|
||||
DHCP_CLIENT_ID_DUID,
|
||||
/* The following option may not be good for RFC regarding DHCP (3315 and 4361).
|
||||
* But some setups require this. E.g., Sky Broadband, the second largest provider in the UK
|
||||
* requires the client id to be set to a custom string, reported at
|
||||
* https://github.com/systemd/systemd/issues/7828 */
|
||||
DHCP_CLIENT_ID_DUID_ONLY,
|
||||
_DHCP_CLIENT_ID_MAX,
|
||||
_DHCP_CLIENT_ID_INVALID = -1,
|
||||
} DHCPClientIdentifier;
|
||||
|
||||
void dhcp4_release_old_lease(Link *link);
|
||||
int dhcp4_configure(Link *link);
|
||||
int dhcp4_set_client_identifier(Link *link);
|
||||
int dhcp4_set_promote_secondaries(Link *link);
|
||||
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_client_identifier);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_black_listed_ip_address);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_max_attempts);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_user_class);
|
|
@ -13,6 +13,7 @@
|
|||
#include "hostname-util.h"
|
||||
#include "missing_network.h"
|
||||
#include "network-internal.h"
|
||||
#include "networkd-dhcp6.h"
|
||||
#include "networkd-link.h"
|
||||
#include "networkd-manager.h"
|
||||
#include "siphash24.h"
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
#pragma once
|
||||
|
||||
#include "sd-dhcp6-client.h"
|
||||
|
||||
#include "conf-parser.h"
|
||||
|
||||
typedef struct Link Link;
|
||||
|
||||
int dhcp6_request_prefix_delegation(Link *link);
|
||||
int dhcp6_configure(Link *link);
|
||||
int dhcp6_request_address(Link *link, int ir);
|
||||
int dhcp6_lease_pd_prefix_lost(sd_dhcp6_client *client, Link* link);
|
|
@ -5,8 +5,10 @@
|
|||
|
||||
#include "network-internal.h"
|
||||
#include "networkd-address.h"
|
||||
#include "networkd-manager.h"
|
||||
#include "networkd-ipv4ll.h"
|
||||
#include "networkd-link.h"
|
||||
#include "networkd-manager.h"
|
||||
#include "parse-util.h"
|
||||
|
||||
static int ipv4ll_address_lost(Link *link) {
|
||||
_cleanup_(address_freep) Address *address = NULL;
|
||||
|
@ -234,3 +236,45 @@ int ipv4ll_configure(Link *link) {
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_ipv4ll(
|
||||
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) {
|
||||
|
||||
AddressFamilyBoolean *link_local = data;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
/* Note that this is mostly like
|
||||
* config_parse_address_family_boolean(), except that it
|
||||
* applies only to IPv4 */
|
||||
|
||||
r = parse_boolean(rvalue);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to parse %s=%s, ignoring assignment. "
|
||||
"Note that the setting %s= is deprecated, please use LinkLocalAddressing= instead.",
|
||||
lvalue, rvalue, lvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
SET_FLAG(*link_local, ADDRESS_FAMILY_IPV4, r);
|
||||
|
||||
log_syntax(unit, LOG_WARNING, filename, line, 0,
|
||||
"%s=%s is deprecated, please use LinkLocalAddressing=%s instead.",
|
||||
lvalue, rvalue, address_family_boolean_to_string(*link_local));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
#pragma once
|
||||
|
||||
#include "conf-parser.h"
|
||||
|
||||
#define IPV4LL_ROUTE_METRIC 2048
|
||||
|
||||
typedef struct Link Link;
|
||||
|
||||
int ipv4ll_configure(Link *link);
|
||||
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_ipv4ll);
|
|
@ -19,6 +19,9 @@
|
|||
#include "netlink-util.h"
|
||||
#include "network-internal.h"
|
||||
#include "networkd-can.h"
|
||||
#include "networkd-dhcp4.h"
|
||||
#include "networkd-dhcp6.h"
|
||||
#include "networkd-ipv4ll.h"
|
||||
#include "networkd-ipv6-proxy-ndp.h"
|
||||
#include "networkd-link-bus.h"
|
||||
#include "networkd-link.h"
|
||||
|
|
|
@ -168,18 +168,8 @@ int link_ipv6ll_gained(Link *link, const struct in6_addr *address);
|
|||
|
||||
int link_set_mtu(Link *link, uint32_t mtu);
|
||||
|
||||
int ipv4ll_configure(Link *link);
|
||||
bool link_ipv4ll_enabled(Link *link, AddressFamilyBoolean mask);
|
||||
|
||||
void dhcp4_release_old_lease(Link *link);
|
||||
int dhcp4_configure(Link *link);
|
||||
int dhcp4_set_client_identifier(Link *link);
|
||||
int dhcp4_set_promote_secondaries(Link *link);
|
||||
int dhcp6_request_prefix_delegation(Link *link);
|
||||
int dhcp6_configure(Link *link);
|
||||
int dhcp6_request_address(Link *link, int ir);
|
||||
int dhcp6_lease_pd_prefix_lost(sd_dhcp6_client *client, Link* link);
|
||||
|
||||
int link_stop_clients(Link *link, bool may_keep_dhcp);
|
||||
|
||||
const char* link_state_to_string(LinkState s) _const_;
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "local-addresses.h"
|
||||
#include "netlink-util.h"
|
||||
#include "network-internal.h"
|
||||
#include "networkd-dhcp6.h"
|
||||
#include "networkd-link-bus.h"
|
||||
#include "networkd-manager.h"
|
||||
#include "networkd-speed-meter.h"
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include "sd-ndisc.h"
|
||||
|
||||
#include "missing_network.h"
|
||||
#include "networkd-dhcp6.h"
|
||||
#include "networkd-ndisc.h"
|
||||
#include "networkd-route.h"
|
||||
#include "strv.h"
|
||||
|
|
|
@ -6,6 +6,9 @@ _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"")
|
|||
#include "conf-parser.h"
|
||||
#include "network-internal.h"
|
||||
#include "networkd-conf.h"
|
||||
#include "networkd-dhcp-common.h"
|
||||
#include "networkd-dhcp4.h"
|
||||
#include "networkd-ipv4ll.h"
|
||||
#include "networkd-ndisc.h"
|
||||
#include "networkd-network.h"
|
||||
#include "vlan-util.h"
|
||||
|
|
|
@ -811,110 +811,6 @@ int config_parse_domains(
|
|||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_ipv4ll(
|
||||
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) {
|
||||
|
||||
AddressFamilyBoolean *link_local = data;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
/* Note that this is mostly like
|
||||
* config_parse_address_family_boolean(), except that it
|
||||
* applies only to IPv4 */
|
||||
|
||||
r = parse_boolean(rvalue);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to parse %s=%s, ignoring assignment. "
|
||||
"Note that the setting %s= is deprecated, please use LinkLocalAddressing= instead.",
|
||||
lvalue, rvalue, lvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
SET_FLAG(*link_local, ADDRESS_FAMILY_IPV4, r);
|
||||
|
||||
log_syntax(unit, LOG_WARNING, filename, line, 0,
|
||||
"%s=%s is deprecated, please use LinkLocalAddressing=%s instead.",
|
||||
lvalue, rvalue, address_family_boolean_to_string(*link_local));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_dhcp(
|
||||
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) {
|
||||
|
||||
AddressFamilyBoolean *dhcp = data, s;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
/* Note that this is mostly like
|
||||
* config_parse_address_family_boolean(), except that it
|
||||
* understands some old names for the enum values */
|
||||
|
||||
s = address_family_boolean_from_string(rvalue);
|
||||
if (s < 0) {
|
||||
|
||||
/* Previously, we had a slightly different enum here,
|
||||
* support its values for compatibility. */
|
||||
|
||||
if (streq(rvalue, "none"))
|
||||
s = ADDRESS_FAMILY_NO;
|
||||
else if (streq(rvalue, "v4"))
|
||||
s = ADDRESS_FAMILY_IPV4;
|
||||
else if (streq(rvalue, "v6"))
|
||||
s = ADDRESS_FAMILY_IPV6;
|
||||
else if (streq(rvalue, "both"))
|
||||
s = ADDRESS_FAMILY_YES;
|
||||
else {
|
||||
log_syntax(unit, LOG_ERR, filename, line, 0,
|
||||
"Failed to parse DHCP option, ignoring: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
log_syntax(unit, LOG_WARNING, filename, line, 0,
|
||||
"DHCP=%s is deprecated, please use DHCP=%s instead.",
|
||||
rvalue, address_family_boolean_to_string(s));
|
||||
}
|
||||
|
||||
*dhcp = s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char* const dhcp_client_identifier_table[_DHCP_CLIENT_ID_MAX] = {
|
||||
[DHCP_CLIENT_ID_MAC] = "mac",
|
||||
[DHCP_CLIENT_ID_DUID] = "duid",
|
||||
[DHCP_CLIENT_ID_DUID_ONLY] = "duid-only",
|
||||
};
|
||||
|
||||
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(dhcp_client_identifier, DHCPClientIdentifier);
|
||||
DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_client_identifier, dhcp_client_identifier, DHCPClientIdentifier,
|
||||
"Failed to parse client identifier type");
|
||||
|
||||
int config_parse_ipv6token(
|
||||
const char* unit,
|
||||
const char *filename,
|
||||
|
@ -1149,114 +1045,6 @@ int config_parse_dhcp_server_dns(
|
|||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_radv_dns(
|
||||
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) {
|
||||
|
||||
Network *n = data;
|
||||
const char *p = rvalue;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
|
||||
for (;;) {
|
||||
_cleanup_free_ char *w = NULL;
|
||||
union in_addr_union a;
|
||||
|
||||
r = extract_first_word(&p, &w, NULL, 0);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to extract word, ignoring: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
if (in_addr_from_string(AF_INET6, w, &a) >= 0) {
|
||||
struct in6_addr *m;
|
||||
|
||||
m = reallocarray(n->router_dns, n->n_router_dns + 1, sizeof(struct in6_addr));
|
||||
if (!m)
|
||||
return log_oom();
|
||||
|
||||
m[n->n_router_dns++] = a.in6;
|
||||
n->router_dns = m;
|
||||
|
||||
} else
|
||||
log_syntax(unit, LOG_ERR, filename, line, 0,
|
||||
"Failed to parse DNS server address, ignoring: %s", w);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_radv_search_domains(
|
||||
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) {
|
||||
|
||||
Network *n = data;
|
||||
const char *p = rvalue;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
|
||||
for (;;) {
|
||||
_cleanup_free_ char *w = NULL, *idna = NULL;
|
||||
|
||||
r = extract_first_word(&p, &w, NULL, 0);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to extract word, ignoring: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
r = dns_name_apply_idna(w, &idna);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to apply IDNA to domain name '%s', ignoring: %m", w);
|
||||
continue;
|
||||
} else if (r == 0)
|
||||
/* transfer ownership to simplify subsequent operations */
|
||||
idna = TAKE_PTR(w);
|
||||
|
||||
r = ordered_set_ensure_allocated(&n->router_search_domains, &string_hash_ops);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = ordered_set_consume(n->router_search_domains, TAKE_PTR(idna));
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_dhcp_server_ntp(
|
||||
const char *unit,
|
||||
const char *filename,
|
||||
|
@ -1485,250 +1273,6 @@ 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, 0,
|
||||
"%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_section_route_table(
|
||||
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) {
|
||||
|
||||
Network *network = data;
|
||||
uint32_t rt;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
r = safe_atou32(rvalue, &rt);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to parse RouteTable=%s, ignoring assignment: %m", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (streq_ptr(section, "DHCP")) {
|
||||
network->dhcp_route_table = rt;
|
||||
network->dhcp_route_table_set = true;
|
||||
} else { /* section is IPv6AcceptRA */
|
||||
network->ipv6_accept_ra_route_table = rt;
|
||||
network->ipv6_accept_ra_route_table_set = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_dhcp_max_attempts(
|
||||
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) {
|
||||
|
||||
Network *network = data;
|
||||
uint64_t a;
|
||||
int r;
|
||||
|
||||
assert(network);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
|
||||
if (isempty(rvalue)) {
|
||||
network->dhcp_max_attempts = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (streq(rvalue, "infinity")) {
|
||||
network->dhcp_max_attempts = (uint64_t) -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = safe_atou64(rvalue, &a);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to parse DHCP maximum attempts, ignoring: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (a == 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, 0,
|
||||
"%s= must be positive integer or 'infinity', ignoring: %s", lvalue, rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
network->dhcp_max_attempts = a;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_dhcp_black_listed_ip_address(
|
||||
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) {
|
||||
|
||||
Network *network = data;
|
||||
const char *p;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
if (isempty(rvalue)) {
|
||||
network->dhcp_black_listed_ip = set_free(network->dhcp_black_listed_ip);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (p = rvalue;;) {
|
||||
_cleanup_free_ char *n = NULL;
|
||||
union in_addr_union ip;
|
||||
|
||||
r = extract_first_word(&p, &n, NULL, 0);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to parse DHCP black listed ip address, ignoring assignment: %s",
|
||||
rvalue);
|
||||
return 0;
|
||||
}
|
||||
if (r == 0)
|
||||
return 0;
|
||||
|
||||
r = in_addr_from_string(AF_INET, n, &ip);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"DHCP black listed ip address is invalid, ignoring assignment: %s", n);
|
||||
continue;
|
||||
}
|
||||
|
||||
r = set_ensure_allocated(&network->dhcp_black_listed_ip, NULL);
|
||||
if (r < 0)
|
||||
return log_oom();
|
||||
|
||||
r = set_put(network->dhcp_black_listed_ip, UINT32_TO_PTR(ip.in.s_addr));
|
||||
if (r < 0)
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to store DHCP black listed ip address '%s', ignoring assignment: %m", n);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_use_domains, dhcp_use_domains, DHCPUseDomains,
|
||||
"Failed to parse DHCP use domains setting");
|
||||
|
||||
static const char* const dhcp_use_domains_table[_DHCP_USE_DOMAINS_MAX] = {
|
||||
[DHCP_USE_DOMAINS_NO] = "no",
|
||||
[DHCP_USE_DOMAINS_ROUTE] = "route",
|
||||
[DHCP_USE_DOMAINS_YES] = "yes",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(dhcp_use_domains, DHCPUseDomains, DHCP_USE_DOMAINS_YES);
|
||||
|
||||
int config_parse_iaid(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) {
|
||||
Network *network = data;
|
||||
uint32_t iaid;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(network);
|
||||
|
||||
r = safe_atou32(rvalue, &iaid);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Unable to read IAID, ignoring assignment: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
network->iaid = iaid;
|
||||
network->iaid_set = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_required_for_online(
|
||||
const char *unit,
|
||||
const char *filename,
|
||||
|
|
|
@ -6,13 +6,14 @@
|
|||
|
||||
#include "condition.h"
|
||||
#include "conf-parser.h"
|
||||
#include "dhcp-identifier.h"
|
||||
#include "hashmap.h"
|
||||
#include "netdev/bridge.h"
|
||||
#include "netdev/netdev.h"
|
||||
#include "networkd-address-label.h"
|
||||
#include "networkd-address.h"
|
||||
#include "networkd-brvlan.h"
|
||||
#include "networkd-dhcp-common.h"
|
||||
#include "networkd-dhcp4.h"
|
||||
#include "networkd-fdb.h"
|
||||
#include "networkd-ipv6-proxy-ndp.h"
|
||||
#include "networkd-lldp-rx.h"
|
||||
|
@ -25,24 +26,6 @@
|
|||
#include "ordered-set.h"
|
||||
#include "resolve-util.h"
|
||||
|
||||
#define DHCP_ROUTE_METRIC 1024
|
||||
#define IPV4LL_ROUTE_METRIC 2048
|
||||
|
||||
#define BRIDGE_VLAN_BITMAP_MAX 4096
|
||||
#define BRIDGE_VLAN_BITMAP_LEN (BRIDGE_VLAN_BITMAP_MAX / 32)
|
||||
|
||||
typedef enum DHCPClientIdentifier {
|
||||
DHCP_CLIENT_ID_MAC,
|
||||
DHCP_CLIENT_ID_DUID,
|
||||
/* The following option may not be good for RFC regarding DHCP (3315 and 4361).
|
||||
* But some setups require this. E.g., Sky Broadband, the second largest provider in the UK
|
||||
* requires the client id to be set to a custom string, reported at
|
||||
* https://github.com/systemd/systemd/issues/7828 */
|
||||
DHCP_CLIENT_ID_DUID_ONLY,
|
||||
_DHCP_CLIENT_ID_MAX,
|
||||
_DHCP_CLIENT_ID_INVALID = -1,
|
||||
} DHCPClientIdentifier;
|
||||
|
||||
typedef enum IPv6PrivacyExtensions {
|
||||
/* The values map to the kernel's /proc/sys/net/ipv6/conf/xxx/use_tempaddr values */
|
||||
IPV6_PRIVACY_EXTENSIONS_NO,
|
||||
|
@ -52,32 +35,6 @@ typedef enum IPv6PrivacyExtensions {
|
|||
_IPV6_PRIVACY_EXTENSIONS_INVALID = -1,
|
||||
} IPv6PrivacyExtensions;
|
||||
|
||||
typedef enum DHCPUseDomains {
|
||||
DHCP_USE_DOMAINS_NO,
|
||||
DHCP_USE_DOMAINS_YES,
|
||||
DHCP_USE_DOMAINS_ROUTE,
|
||||
_DHCP_USE_DOMAINS_MAX,
|
||||
_DHCP_USE_DOMAINS_INVALID = -1,
|
||||
} DHCPUseDomains;
|
||||
|
||||
typedef struct DUID {
|
||||
/* Value of Type in [DHCP] section */
|
||||
DUIDType type;
|
||||
|
||||
uint8_t raw_data_len;
|
||||
uint8_t raw_data[MAX_DUID_LEN];
|
||||
usec_t llt_time;
|
||||
} DUID;
|
||||
|
||||
typedef enum RADVPrefixDelegation {
|
||||
RADV_PREFIX_DELEGATION_NONE,
|
||||
RADV_PREFIX_DELEGATION_STATIC,
|
||||
RADV_PREFIX_DELEGATION_DHCP6,
|
||||
RADV_PREFIX_DELEGATION_BOTH,
|
||||
_RADV_PREFIX_DELEGATION_MAX,
|
||||
_RADV_PREFIX_DELEGATION_INVALID = -1,
|
||||
} RADVPrefixDelegation;
|
||||
|
||||
typedef enum KeepConfiguration {
|
||||
KEEP_CONFIGURATION_NO = 0,
|
||||
KEEP_CONFIGURATION_DHCP_ON_START = 1 << 0,
|
||||
|
@ -308,31 +265,19 @@ void network_apply_anonymize_if_set(Network *network);
|
|||
bool network_has_static_ipv6_addresses(Network *network);
|
||||
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_stacked_netdev);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_domains);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_tunnel);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dns);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_client_identifier);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_ipv6token);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_ipv6_privacy_extensions);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_dns);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_ntp);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_domains);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dns);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_hostname);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_timezone);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_dns);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_black_listed_ip_address);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_radv_dns);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_radv_search_domains);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_ntp);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dnssec_negative_trust_anchors);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_use_domains);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_section_route_table);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_user_class);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_ntp);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_iaid);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_required_for_online);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_max_attempts);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_keep_configuration);
|
||||
/* Legacy IPv4LL support */
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_ipv4ll);
|
||||
|
||||
const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
|
||||
|
||||
|
@ -344,11 +289,5 @@ int network_object_find(sd_bus *bus, const char *path, const char *interface, vo
|
|||
const char* ipv6_privacy_extensions_to_string(IPv6PrivacyExtensions i) _const_;
|
||||
IPv6PrivacyExtensions ipv6_privacy_extensions_from_string(const char *s) _pure_;
|
||||
|
||||
const char* dhcp_use_domains_to_string(DHCPUseDomains p) _const_;
|
||||
DHCPUseDomains dhcp_use_domains_from_string(const char *s) _pure_;
|
||||
|
||||
const char* radv_prefix_delegation_to_string(RADVPrefixDelegation i) _const_;
|
||||
RADVPrefixDelegation radv_prefix_delegation_from_string(const char *s) _pure_;
|
||||
|
||||
const char* keep_configuration_to_string(KeepConfiguration i) _const_;
|
||||
KeepConfiguration keep_configuration_from_string(const char *s) _pure_;
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <netinet/icmp6.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "dns-domain.h"
|
||||
#include "networkd-address.h"
|
||||
#include "networkd-manager.h"
|
||||
#include "networkd-radv.h"
|
||||
|
@ -15,80 +16,6 @@
|
|||
#include "string-table.h"
|
||||
#include "strv.h"
|
||||
|
||||
static const char * const radv_prefix_delegation_table[_RADV_PREFIX_DELEGATION_MAX] = {
|
||||
[RADV_PREFIX_DELEGATION_NONE] = "no",
|
||||
[RADV_PREFIX_DELEGATION_STATIC] = "static",
|
||||
[RADV_PREFIX_DELEGATION_DHCP6] = "dhcpv6",
|
||||
[RADV_PREFIX_DELEGATION_BOTH] = "yes",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(
|
||||
radv_prefix_delegation,
|
||||
RADVPrefixDelegation,
|
||||
RADV_PREFIX_DELEGATION_BOTH);
|
||||
|
||||
int config_parse_router_prefix_delegation(
|
||||
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) {
|
||||
|
||||
Network *network = userdata;
|
||||
RADVPrefixDelegation d;
|
||||
|
||||
assert(filename);
|
||||
assert(section);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
d = radv_prefix_delegation_from_string(rvalue);
|
||||
if (d < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, -EINVAL, "Invalid router prefix delegation '%s', ignoring assignment.", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
network->router_prefix_delegation = d;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_router_preference(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) {
|
||||
Network *network = userdata;
|
||||
|
||||
assert(filename);
|
||||
assert(section);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
if (streq(rvalue, "high"))
|
||||
network->router_preference = SD_NDISC_PREFERENCE_HIGH;
|
||||
else if (STR_IN_SET(rvalue, "medium", "normal", "default"))
|
||||
network->router_preference = SD_NDISC_PREFERENCE_MEDIUM;
|
||||
else if (streq(rvalue, "low"))
|
||||
network->router_preference = SD_NDISC_PREFERENCE_LOW;
|
||||
else
|
||||
log_syntax(unit, LOG_ERR, filename, line, -EINVAL, "Router preference '%s' is invalid, ignoring assignment: %m", rvalue);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void prefix_free(Prefix *prefix) {
|
||||
if (!prefix)
|
||||
return;
|
||||
|
@ -515,3 +442,185 @@ int radv_configure(Link *link) {
|
|||
|
||||
return radv_emit_dns(link);
|
||||
}
|
||||
|
||||
int config_parse_radv_dns(
|
||||
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) {
|
||||
|
||||
Network *n = data;
|
||||
const char *p = rvalue;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
|
||||
for (;;) {
|
||||
_cleanup_free_ char *w = NULL;
|
||||
union in_addr_union a;
|
||||
|
||||
r = extract_first_word(&p, &w, NULL, 0);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to extract word, ignoring: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
if (in_addr_from_string(AF_INET6, w, &a) >= 0) {
|
||||
struct in6_addr *m;
|
||||
|
||||
m = reallocarray(n->router_dns, n->n_router_dns + 1, sizeof(struct in6_addr));
|
||||
if (!m)
|
||||
return log_oom();
|
||||
|
||||
m[n->n_router_dns++] = a.in6;
|
||||
n->router_dns = m;
|
||||
|
||||
} else
|
||||
log_syntax(unit, LOG_ERR, filename, line, 0,
|
||||
"Failed to parse DNS server address, ignoring: %s", w);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_radv_search_domains(
|
||||
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) {
|
||||
|
||||
Network *n = data;
|
||||
const char *p = rvalue;
|
||||
int r;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
|
||||
for (;;) {
|
||||
_cleanup_free_ char *w = NULL, *idna = NULL;
|
||||
|
||||
r = extract_first_word(&p, &w, NULL, 0);
|
||||
if (r == -ENOMEM)
|
||||
return log_oom();
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to extract word, ignoring: %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
r = dns_name_apply_idna(w, &idna);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Failed to apply IDNA to domain name '%s', ignoring: %m", w);
|
||||
continue;
|
||||
} else if (r == 0)
|
||||
/* transfer ownership to simplify subsequent operations */
|
||||
idna = TAKE_PTR(w);
|
||||
|
||||
r = ordered_set_ensure_allocated(&n->router_search_domains, &string_hash_ops);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = ordered_set_consume(n->router_search_domains, TAKE_PTR(idna));
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char * const radv_prefix_delegation_table[_RADV_PREFIX_DELEGATION_MAX] = {
|
||||
[RADV_PREFIX_DELEGATION_NONE] = "no",
|
||||
[RADV_PREFIX_DELEGATION_STATIC] = "static",
|
||||
[RADV_PREFIX_DELEGATION_DHCP6] = "dhcpv6",
|
||||
[RADV_PREFIX_DELEGATION_BOTH] = "yes",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(
|
||||
radv_prefix_delegation,
|
||||
RADVPrefixDelegation,
|
||||
RADV_PREFIX_DELEGATION_BOTH);
|
||||
|
||||
int config_parse_router_prefix_delegation(
|
||||
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) {
|
||||
|
||||
Network *network = userdata;
|
||||
RADVPrefixDelegation d;
|
||||
|
||||
assert(filename);
|
||||
assert(section);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
d = radv_prefix_delegation_from_string(rvalue);
|
||||
if (d < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, -EINVAL, "Invalid router prefix delegation '%s', ignoring assignment.", rvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
network->router_prefix_delegation = d;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_router_preference(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) {
|
||||
Network *network = userdata;
|
||||
|
||||
assert(filename);
|
||||
assert(section);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
assert(data);
|
||||
|
||||
if (streq(rvalue, "high"))
|
||||
network->router_preference = SD_NDISC_PREFERENCE_HIGH;
|
||||
else if (STR_IN_SET(rvalue, "medium", "normal", "default"))
|
||||
network->router_preference = SD_NDISC_PREFERENCE_MEDIUM;
|
||||
else if (streq(rvalue, "low"))
|
||||
network->router_preference = SD_NDISC_PREFERENCE_LOW;
|
||||
else
|
||||
log_syntax(unit, LOG_ERR, filename, line, -EINVAL, "Router preference '%s' is invalid, ignoring assignment: %m", rvalue);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,15 @@
|
|||
|
||||
typedef struct Prefix Prefix;
|
||||
|
||||
typedef enum RADVPrefixDelegation {
|
||||
RADV_PREFIX_DELEGATION_NONE,
|
||||
RADV_PREFIX_DELEGATION_STATIC,
|
||||
RADV_PREFIX_DELEGATION_DHCP6,
|
||||
RADV_PREFIX_DELEGATION_BOTH,
|
||||
_RADV_PREFIX_DELEGATION_MAX,
|
||||
_RADV_PREFIX_DELEGATION_INVALID = -1,
|
||||
} RADVPrefixDelegation;
|
||||
|
||||
struct Prefix {
|
||||
Network *network;
|
||||
NetworkConfigSection *section;
|
||||
|
@ -26,11 +35,16 @@ void prefix_free(Prefix *prefix);
|
|||
|
||||
DEFINE_NETWORK_SECTION_FUNCTIONS(Prefix, prefix_free);
|
||||
|
||||
int radv_emit_dns(Link *link);
|
||||
int radv_configure(Link *link);
|
||||
|
||||
const char* radv_prefix_delegation_to_string(RADVPrefixDelegation i) _const_;
|
||||
RADVPrefixDelegation radv_prefix_delegation_from_string(const char *s) _pure_;
|
||||
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_router_prefix_delegation);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_router_preference);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_prefix);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_prefix_flags);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_prefix_lifetime);
|
||||
|
||||
int radv_emit_dns(Link *link);
|
||||
int radv_configure(Link *link);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_radv_dns);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_radv_search_domains);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "in-addr-util.h"
|
||||
#include "missing_network.h"
|
||||
#include "netlink-util.h"
|
||||
#include "networkd-ipv4ll.h"
|
||||
#include "networkd-manager.h"
|
||||
#include "networkd-route.h"
|
||||
#include "parse-util.h"
|
||||
|
|
Loading…
Reference in New Issue