if (!link_ipv6ll_enabled(link))
return false;
- return link->network->router_prefix_delegation;
+ return (link->network->router_prefix_delegation != RADV_PREFIX_DELEGATION_NONE);
}
static bool link_lldp_rx_enabled(Link *link) {
BridgeVLAN.PVID, config_parse_brvlan_pvid, 0, 0
BridgeVLAN.VLAN, config_parse_brvlan_vlan, 0, 0
BridgeVLAN.EgressUntagged, config_parse_brvlan_untagged, 0, 0
-Network.IPv6PrefixDelegation, config_parse_bool, 0, offsetof(Network, router_prefix_delegation)
+Network.IPv6PrefixDelegation, config_parse_router_prefix_delegation, 0, 0
IPv6PrefixDelegation.RouterLifetimeSec, config_parse_sec, 0, offsetof(Network, router_lifetime_usec)
IPv6PrefixDelegation.Managed, config_parse_bool, 0, offsetof(Network, router_managed)
IPv6PrefixDelegation.OtherInformation, config_parse_bool, 0, offsetof(Network, router_other_information)
uint8_t raw_data[MAX_DUID_LEN];
} DUID;
+typedef enum RADVPrefixDelegation {
+ RADV_PREFIX_DELEGATION_NONE,
+ RADV_PREFIX_DELEGATION_STATIC,
+ RADV_PREFIX_DELEGATION_DHCP6,
+ RADV_PREFIX_DELEGATION_BOTH,
+} RADVPrefixDelegation;
+
typedef struct NetworkConfigSection {
unsigned line;
char filename[];
bool ipv4ll_route;
/* IPv6 prefix delegation support */
- bool router_prefix_delegation;
+ RADVPrefixDelegation router_prefix_delegation;
usec_t router_lifetime_usec;
uint8_t router_preference;
bool router_managed;
#include "sd-radv.h"
#include "string-util.h"
+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;
+ int d;
+
+ assert(filename);
+ assert(section);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ if (streq(rvalue, "static"))
+ network->router_prefix_delegation = RADV_PREFIX_DELEGATION_STATIC;
+ else if (streq(rvalue, "dhcpv6"))
+ network->router_prefix_delegation = RADV_PREFIX_DELEGATION_DHCP6;
+ else {
+ d = parse_boolean(rvalue);
+ if (d > 0)
+ network->router_prefix_delegation = RADV_PREFIX_DELEGATION_BOTH;
+ else
+ network->router_prefix_delegation = RADV_PREFIX_DELEGATION_NONE;
+
+ if (d < 0)
+ log_syntax(unit, LOG_ERR, filename, line, -EINVAL, "Router prefix delegation '%s' is invalid, ignoring assignment: %m", rvalue);
+ }
+
+ return 0;
+}
+
int config_parse_router_preference(const char *unit,
const char *filename,
unsigned line,
return r;
}
- LIST_FOREACH(prefixes, p, link->network->static_prefixes) {
- r = sd_radv_add_prefix(link->radv, p->radv_prefix);
- if (r != -EEXIST && r < 0)
- return r;
+ if (IN_SET(link->network->router_prefix_delegation,
+ RADV_PREFIX_DELEGATION_STATIC,
+ RADV_PREFIX_DELEGATION_BOTH)) {
+ LIST_FOREACH(prefixes, p, link->network->static_prefixes) {
+ r = sd_radv_add_prefix(link->radv, p->radv_prefix);
+ if (r != -EEXIST && r < 0)
+ return r;
+ }
}
return radv_emit_dns(link);
DEFINE_TRIVIAL_CLEANUP_FUNC(Prefix*, prefix_free);
#define _cleanup_prefix_free_ _cleanup_(prefix_freep)
+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);
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);
int config_parse_prefix(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_prefix_flags(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);