Compare commits

..

No commits in common. "93a59b1ae5d3bcb0ec1488ebc13d0d1ff4d1729a" and "1008f5b069d574ce1ebe18572fda30ac964ba147" have entirely different histories.

15 changed files with 85 additions and 147 deletions

View File

@ -1283,8 +1283,9 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
<term><varname>Gateway=</varname></term>
<listitem>
<para>Takes the gateway address or the special values <literal>_dhcp4</literal> and
<literal>_ipv6ra</literal>. If <literal>_dhcp4</literal> or <literal>_ipv6ra</literal> is
set, then the gateway address provided by DHCPv4 or IPv6 RA is used.</para>
<literal>_dhcp6</literal>. If <literal>_dhcp4</literal> or <literal>_dhcp6</literal> is
set, then the gateway address provided by DHCP (or in the IPv6 case, provided by IPv6 RA)
is used.</para>
</listitem>
</varlistentry>
<varlistentry>

View File

@ -2120,13 +2120,12 @@ int bus_ensure_running(sd_bus *bus) {
assert(bus);
if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
return -ENOTCONN;
if (bus->state == BUS_RUNNING)
return 1;
for (;;) {
if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
return -ENOTCONN;
r = sd_bus_process(bus, NULL);
if (r < 0)
return r;

View File

@ -26,38 +26,18 @@ bool link_dhcp_enabled(Link *link, int family) {
if (link->flags & IFF_LOOPBACK)
return false;
if (link->iftype == ARPHRD_CAN)
return false;
if (!link->network)
return false;
if (link->network->bond)
return false;
if (link->iftype == ARPHRD_CAN)
return false;
return link->network->dhcp & (family == AF_INET ? ADDRESS_FAMILY_IPV4 : ADDRESS_FAMILY_IPV6);
}
void network_adjust_dhcp(Network *network) {
assert(network);
assert(network->dhcp >= 0);
if (network->dhcp == ADDRESS_FAMILY_NO)
return;
/* Bonding slave does not support addressing. */
if (network->bond) {
log_warning("%s: Cannot enable DHCP= when Bond= is specified, disabling DHCP=.",
network->filename);
network->dhcp = ADDRESS_FAMILY_NO;
return;
}
if (!FLAGS_SET(network->link_local, ADDRESS_FAMILY_IPV6) &&
FLAGS_SET(network->dhcp, ADDRESS_FAMILY_IPV6)) {
log_warning("%s: DHCPv6 client is enabled but IPv6 link local addressing is disabled. "
"Disabling DHCPv6 client.", network->filename);
SET_FLAG(network->dhcp, ADDRESS_FAMILY_IPV6, false);
}
}
DUID* link_get_duid(Link *link) {
if (link->network->duid.type != _DUID_TYPE_INVALID)
return &link->network->duid;

View File

@ -9,7 +9,6 @@
typedef struct Link Link;
typedef struct Manager Manager;
typedef struct Network Network;
typedef enum DHCPUseDomains {
DHCP_USE_DOMAINS_NO,
@ -47,8 +46,6 @@ static inline bool link_dhcp6_enabled(Link *link) {
return link_dhcp_enabled(link, AF_INET6);
}
void network_adjust_dhcp(Network *network);
DUID* link_get_duid(Link *link);
int link_configure_duid(Link *link);
int manager_request_product_uuid(Manager *m, Link *link);

View File

@ -388,21 +388,14 @@ static int link_set_dhcp_routes(Link *link) {
return log_link_error_errno(link, r, "Could not set router: %m");
HASHMAP_FOREACH(rt, link->network->routes_by_section) {
if (!rt->gateway_from_dhcp_or_ra)
if (!rt->gateway_from_dhcp)
continue;
if (rt->gw_family != AF_INET)
if (rt->family != AF_INET)
continue;
rt->gw_family = AF_INET;
rt->gw.in = router[0];
if (!rt->protocol_set)
rt->protocol = RTPROT_DHCP;
if (!rt->priority_set)
rt->priority = link->network->dhcp_route_metric;
if (!rt->table_set)
rt->table = table;
if (rt->mtu == 0)
rt->mtu = link->network->dhcp_route_mtu;
r = dhcp_route_configure(rt, link);
if (r < 0)

View File

@ -14,6 +14,7 @@
#include "networkd-dhcp6.h"
#include "networkd-manager.h"
#include "networkd-ndisc.h"
#include "networkd-sysctl.h"
#include "string-table.h"
#include "string-util.h"
#include "strv.h"
@ -51,23 +52,19 @@ bool link_ipv6_accept_ra_enabled(Link *link) {
if (!link_ipv6ll_enabled(link))
return false;
assert(link->network->ipv6_accept_ra >= 0);
return link->network->ipv6_accept_ra;
}
void network_adjust_ipv6_accept_ra(Network *network) {
assert(network);
if (!FLAGS_SET(network->link_local, ADDRESS_FAMILY_IPV6)) {
if (network->ipv6_accept_ra > 0)
log_warning("%s: IPv6AcceptRA= is enabled but IPv6 link local addressing is disabled or not supported. "
"Disabling IPv6AcceptRA=.", network->filename);
network->ipv6_accept_ra = false;
}
if (network->ipv6_accept_ra < 0)
/* If unset use system default (enabled if local forwarding is disabled.
* disabled if local forwarding is enabled).
* If set, ignore or enforce RA independent of local forwarding state.
*/
if (link->network->ipv6_accept_ra < 0)
/* default to accept RA if ip_forward is disabled and ignore RA if ip_forward is enabled */
network->ipv6_accept_ra = !FLAGS_SET(network->ip_forward, ADDRESS_FAMILY_IPV6);
return !link_ip_forward_enabled(link, AF_INET6);
else if (link->network->ipv6_accept_ra > 0)
/* accept RA even if ip_forward is enabled */
return true;
else
/* ignore RA */
return false;
}
static int ndisc_remove_old_one(Link *link, const struct in6_addr *router, bool force);
@ -464,7 +461,7 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
union in_addr_union gateway;
uint16_t lifetime;
unsigned preference;
uint32_t table, mtu;
uint32_t mtu;
usec_t time_now;
int r;
@ -507,14 +504,12 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
else if (r < 0)
return log_link_error_errno(link, r, "Failed to get default router MTU from RA: %m");
table = link_get_ipv6_accept_ra_route_table(link);
r = route_new(&route);
if (r < 0)
return log_oom();
route->family = AF_INET6;
route->table = table;
route->table = link_get_ipv6_accept_ra_route_table(link);
route->priority = link->network->dhcp6_route_metric;
route->protocol = RTPROT_RA;
route->pref = preference;
@ -529,24 +524,14 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
Route *route_gw;
HASHMAP_FOREACH(route_gw, link->network->routes_by_section) {
if (!route_gw->gateway_from_dhcp_or_ra)
if (!route_gw->gateway_from_dhcp)
continue;
if (route_gw->gw_family != AF_INET6)
if (route_gw->family != AF_INET6)
continue;
route_gw->gw = gateway;
if (!route_gw->table_set)
route_gw->table = table;
if (!route_gw->priority_set)
route_gw->priority = link->network->dhcp6_route_metric;
if (!route_gw->protocol_set)
route_gw->protocol = RTPROT_RA;
if (!route_gw->pref_set)
route->pref = preference;
route_gw->lifetime = time_now + lifetime * USEC_PER_SEC;
if (route_gw->mtu == 0)
route_gw->mtu = mtu;
route_gw->gw_family = AF_INET6;
r = ndisc_route_configure(route_gw, link, rt);
if (r < 0)

View File

@ -71,8 +71,6 @@ static inline char* NDISC_DNSSL_DOMAIN(const NDiscDNSSL *n) {
bool link_ipv6_accept_ra_enabled(Link *link);
void network_adjust_ipv6_accept_ra(Network *network);
int ndisc_configure(Link *link);
void ndisc_vacuum(Link *link);
void ndisc_flush(Link *link);

View File

@ -16,11 +16,9 @@
#include "network-internal.h"
#include "networkd-address-label.h"
#include "networkd-address.h"
#include "networkd-dhcp-common.h"
#include "networkd-fdb.h"
#include "networkd-manager.h"
#include "networkd-mdb.h"
#include "networkd-ndisc.h"
#include "networkd-neighbor.h"
#include "networkd-network.h"
#include "networkd-nexthop.h"
@ -190,11 +188,21 @@ int network_verify(Network *network) {
if (network->bond) {
/* Bonding slave does not support addressing. */
if (network->ipv6_accept_ra > 0) {
log_warning("%s: Cannot enable IPv6AcceptRA= when Bond= is specified, disabling IPv6AcceptRA=.",
network->filename);
network->ipv6_accept_ra = 0;
}
if (network->link_local >= 0 && network->link_local != ADDRESS_FAMILY_NO) {
log_warning("%s: Cannot enable LinkLocalAddressing= when Bond= is specified, disabling LinkLocalAddressing=.",
network->filename);
network->link_local = ADDRESS_FAMILY_NO;
}
if (network->dhcp != ADDRESS_FAMILY_NO) {
log_warning("%s: Cannot enable DHCP= when Bond= is specified, disabling DHCP=.",
network->filename);
network->dhcp = ADDRESS_FAMILY_NO;
}
if (network->dhcp_server) {
log_warning("%s: Cannot enable DHCPServer= when Bond= is specified, disabling DHCPServer=.",
network->filename);
@ -215,6 +223,18 @@ int network_verify(Network *network) {
network->link_local = network->bridge ? ADDRESS_FAMILY_NO : ADDRESS_FAMILY_IPV6;
if (!FLAGS_SET(network->link_local, ADDRESS_FAMILY_IPV6)) {
if (network->ipv6_accept_ra > 0) {
log_warning("%s: IPv6AcceptRA= is enabled by the .network file but IPv6 link local addressing is disabled. "
"Disabling IPv6AcceptRA=.", network->filename);
network->ipv6_accept_ra = false;
}
if (FLAGS_SET(network->dhcp, ADDRESS_FAMILY_IPV6)) {
log_warning("%s: DHCPv6 client is enabled by the .network file but IPv6 link local addressing is disabled. "
"Disabling DHCPv6 client.", network->filename);
SET_FLAG(network->dhcp, ADDRESS_FAMILY_IPV6, false);
}
if (network->router_prefix_delegation != RADV_PREFIX_DELEGATION_NONE) {
log_warning("%s: IPv6PrefixDelegation= is enabled but IPv6 link local addressing is disabled. "
"Disabling IPv6PrefixDelegation=.", network->filename);
@ -229,13 +249,13 @@ int network_verify(Network *network) {
SET_FLAG(network->link_local, ADDRESS_FAMILY_FALLBACK_IPV4, false);
}
if (network->ipv6_accept_ra < 0 && network->bridge)
network->ipv6_accept_ra = false;
/* IPMasquerade=yes implies IPForward=yes */
if (network->ip_masquerade)
network->ip_forward |= ADDRESS_FAMILY_IPV4;
network_adjust_ipv6_accept_ra(network);
network_adjust_dhcp(network);
if (network->mtu > 0 && network->dhcp_use_mtu) {
log_warning("%s: MTUBytes= in [Link] section and UseMTU= in [DHCP] section are set. "
"Disabling UseMTU=.", network->filename);

View File

@ -1192,7 +1192,7 @@ int link_set_routes(Link *link) {
/* First add the routes that enable us to talk to gateways, then add in the others that need a gateway. */
for (phase = 0; phase < _PHASE_MAX; phase++)
HASHMAP_FOREACH(rt, link->network->routes_by_section) {
if (rt->gateway_from_dhcp_or_ra)
if (rt->gateway_from_dhcp)
continue;
if ((in_addr_is_null(rt->gw_family, &rt->gw) && ordered_set_isempty(rt->multipath_routes)) != (phase == PHASE_NON_GATEWAY))
@ -1723,7 +1723,7 @@ int config_parse_gateway(
}
if (isempty(rvalue)) {
n->gateway_from_dhcp_or_ra = false;
n->gateway_from_dhcp = false;
n->gw_family = AF_UNSPEC;
n->gw = IN_ADDR_NULL;
TAKE_PTR(n);
@ -1731,21 +1731,21 @@ int config_parse_gateway(
}
if (streq(rvalue, "_dhcp")) {
n->gateway_from_dhcp_or_ra = true;
n->gateway_from_dhcp = true;
TAKE_PTR(n);
return 0;
}
if (streq(rvalue, "_dhcp4")) {
n->gw_family = AF_INET;
n->gateway_from_dhcp_or_ra = true;
n->gateway_from_dhcp = true;
TAKE_PTR(n);
return 0;
}
if (streq(rvalue, "_ipv6ra")) {
if (streq(rvalue, "_dhcp6")) {
n->gw_family = AF_INET6;
n->gateway_from_dhcp_or_ra = true;
n->gateway_from_dhcp = true;
TAKE_PTR(n);
return 0;
}
@ -1758,7 +1758,7 @@ int config_parse_gateway(
return 0;
}
n->gateway_from_dhcp_or_ra = false;
n->gateway_from_dhcp = false;
TAKE_PTR(n);
return 0;
}
@ -1902,7 +1902,6 @@ int config_parse_route_priority(
return 0;
}
n->priority_set = true;
TAKE_PTR(n);
return 0;
}
@ -2087,7 +2086,6 @@ int config_parse_ipv6_route_preference(
return 0;
}
n->pref_set = true;
TAKE_PTR(n);
return 0;
}
@ -2382,50 +2380,20 @@ static int route_section_verify(Route *route, Network *network) {
if (section_is_invalid(route->section))
return -EINVAL;
if (route->gateway_from_dhcp_or_ra) {
if (route->gw_family == AF_UNSPEC) {
/* When deprecated Gateway=_dhcp is set, then assume gateway family based on other settings. */
switch (route->family) {
case AF_UNSPEC:
log_warning("%s: Deprecated value \"_dhcp\" is specified for Gateway= in [Route] section from line %u. "
"Please use \"_dhcp4\" or \"_ipv6ra\" instead. Assuming \"_dhcp4\".",
route->section->filename, route->section->line);
route->family = AF_INET;
break;
case AF_INET:
case AF_INET6:
log_warning("%s: Deprecated value \"_dhcp\" is specified for Gateway= in [Route] section from line %u. "
"Assuming \"%s\" based on Destination=, Source=, or PreferredSource= setting.",
route->section->filename, route->section->line, route->family == AF_INET ? "_dhcp4" : "_ipv6ra");
break;
default:
return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
"%s: Invalid route family. Ignoring [Route] section from line %u.",
route->section->filename, route->section->line);
}
route->gw_family = route->family;
}
if (route->gw_family == AF_INET && !FLAGS_SET(network->dhcp, ADDRESS_FAMILY_IPV4))
return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
"%s: Gateway=\"_dhcp4\" is specified but DHCPv4 client is disabled. "
"Ignoring [Route] section from line %u.",
route->section->filename, route->section->line);
if (route->gw_family == AF_INET6 && !network->ipv6_accept_ra)
return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
"%s: Gateway=\"_ipv6ra\" is specified but IPv6AcceptRA= is disabled. "
"Ignoring [Route] section from line %u.",
route->section->filename, route->section->line);
}
/* When only Gateway= is specified, assume the route family based on the Gateway address. */
if (route->family == AF_UNSPEC)
route->family = route->gw_family;
if (route->family == AF_UNSPEC) {
assert(route->section);
if (route->gateway_from_dhcp) {
log_warning("%s: Deprecated value \"_dhcp\" is specified for Gateway= in [Route] section from line %u. "
"Please use \"_dhcp4\" or \"_dhcp6\" instead. Assuming \"_dhcp4\".",
route->section->filename, route->section->line);
route->family = AF_INET;
route->gw_family = AF_INET;
} else
return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
"%s: Route section without Gateway=, Destination=, Source=, "
"or PreferredSource= field configured. "

View File

@ -32,24 +32,20 @@ typedef struct Route {
unsigned char dst_prefixlen;
unsigned char src_prefixlen;
unsigned char scope;
bool scope_set;
unsigned char protocol; /* RTPROT_* */
unsigned char type; /* RTN_* */
unsigned char tos;
uint32_t priority; /* note that ip(8) calls this 'metric' */
uint32_t table;
bool table_set;
uint32_t mtu;
uint32_t initcwnd;
uint32_t initrwnd;
unsigned char pref;
unsigned flags;
int gateway_onlink;
bool scope_set:1;
bool table_set:1;
bool priority_set:1;
bool protocol_set:1;
bool pref_set:1;
bool gateway_from_dhcp_or_ra:1;
bool gateway_from_dhcp;
union in_addr_union gw;
union in_addr_union dst;

View File

@ -38,7 +38,7 @@ static int link_set_proxy_arp(Link *link) {
return sysctl_write_ip_property_boolean(AF_INET, link->ifname, "proxy_arp", link->network->proxy_arp > 0);
}
static bool link_ip_forward_enabled(Link *link, int family) {
bool link_ip_forward_enabled(Link *link, int family) {
assert(link);
assert(IN_SET(family, AF_INET, AF_INET6));

View File

@ -16,6 +16,7 @@ typedef enum IPv6PrivacyExtensions {
_IPV6_PRIVACY_EXTENSIONS_INVALID = -1,
} IPv6PrivacyExtensions;
bool link_ip_forward_enabled(Link *link, int family);
int link_set_sysctl(Link *link);
int link_set_ipv6_mtu(Link *link);

View File

@ -6,5 +6,5 @@ DHCP=ipv4
IPv6AcceptRA=no
[Route]
Gateway=_dhcp4
Gateway=_dhcp
Destination=10.0.0.0/8

View File

@ -5,5 +5,5 @@ Name=veth99
DHCP=ipv6
[Route]
Gateway=_ipv6ra
Gateway=_dhcp
Destination=2001:1234:5:9fff:ff:ff:ff:ff/128

View File

@ -3899,7 +3899,7 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities):
output = check_output('ip route list dev veth99 10.0.0.0/8')
print(output)
self.assertRegex(output, '10.0.0.0/8 via 192.168.5.1 proto dhcp')
self.assertRegex(output, '10.0.0.0/8 via 192.168.5.1 proto static')
def test_dhcp_client_gateway_ipv6(self):
copy_unit_to_networkd_unit_path('25-veth.netdev', 'dhcp-server-veth-peer.network',