#include "dhcp-lease-internal.h"
+static bool link_dhcp6_enabled(Link *link) {
+ if (link->flags & IFF_LOOPBACK)
+ return false;
+
+ if (!link->network)
+ return false;
+
+ return IN_SET(link->network->dhcp, DHCP_SUPPORT_V6, DHCP_SUPPORT_BOTH);
+}
+
+static bool link_dhcp4_enabled(Link *link) {
+ if (link->flags & IFF_LOOPBACK)
+ return false;
+
+ if (!link->network)
+ return false;
+
+ return IN_SET(link->network->dhcp, DHCP_SUPPORT_V4, DHCP_SUPPORT_BOTH);
+}
+
+static bool link_dhcp4_server_enabled(Link *link) {
+ if (link->flags & IFF_LOOPBACK)
+ return false;
+
+ if (!link->network)
+ return false;
+
+ return link->network->dhcp_server;
+}
+
+static bool link_ipv4ll_enabled(Link *link) {
+ if (link->flags & IFF_LOOPBACK)
+ return false;
+
+ if (!link->network)
+ return false;
+
+ return link->network->ipv4ll;
+}
+
#define FLAG_STRING(string, flag, old, new) \
(((old ^ new) & flag) \
? ((old & flag) ? (" -" string) : (" +" string)) \
if (r < 0)
return -ENOMEM;
- r = hashmap_ensure_allocated(&manager->links, NULL, NULL);
+ r = hashmap_ensure_allocated(&manager->links, NULL);
if (r < 0)
return r;
assert(link->network);
assert(link->state == LINK_STATE_SETTING_ROUTES);
- if (link->network->dhcp_server &&
+ if (link_dhcp4_server_enabled(link) &&
!sd_dhcp_server_is_running(link->dhcp_server)) {
struct in_addr pool_start;
Address *address;
if (!link->static_configured)
return;
- if (link->network->ipv4ll)
+ if (link_ipv4ll_enabled(link))
if (!link->ipv4ll_address ||
!link->ipv4ll_route)
return;
- if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4))
- if (!link->dhcp4_configured)
+ if (link_dhcp4_enabled(link) && !link->dhcp4_configured)
return;
if (link->state != LINK_STATE_CONFIGURED)
return 1;
r = sd_bus_message_get_errno(m);
- if (r < 0)
- r = -r;
if (r > 0)
log_warning_link(link, "Could not set hostname: %s",
strerror(r));
return;
}
- r = sd_dhcp6_client_set_mac(link->dhcp6_client, &link->mac);
+ r = sd_dhcp6_client_set_mac(link->dhcp6_client,
+ (const uint8_t *) &link->mac,
+ sizeof (link->mac), ARPHRD_ETHER);
if (r < 0) {
link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
return;
assert(link->manager);
assert(link->manager->event);
- if (link->network->ipv4ll) {
+ if (link_ipv4ll_enabled(link)) {
assert(link->ipv4ll);
log_debug_link(link, "acquiring IPv4 link-local address");
}
}
- if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
+ if (link_dhcp4_enabled(link)) {
assert(link->dhcp_client);
log_debug_link(link, "acquiring DHCPv4 lease");
}
}
- if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
+ if (link_dhcp6_enabled(link)) {
assert(link->icmp6_router_discovery);
log_debug_link(link, "discovering IPv6 routers");
assert(link->network);
assert(link->state == LINK_STATE_PENDING);
- if (link->network->ipv4ll) {
+ if (link_ipv4ll_enabled(link)) {
r = ipv4ll_configure(link);
if (r < 0)
return r;
}
- if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
+ if (link_dhcp4_enabled(link)) {
r = dhcp4_configure(link);
if (r < 0)
return r;
}
- if (link->network->dhcp_server) {
+ if (link_dhcp4_server_enabled(link)) {
r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
if (r < 0)
return r;
return r;
}
- if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
+ if (link_dhcp6_enabled(link)) {
r = sd_icmp6_nd_new(&link->icmp6_router_discovery);
if (r < 0)
return r;
} else if (r < 0)
return r;
+ if (link->flags & IFF_LOOPBACK) {
+ if (network->ipv4ll)
+ log_debug_link(link, "ignoring IPv4LL for loopback link");
+
+ if (network->dhcp != DHCP_SUPPORT_NONE)
+ log_debug_link(link, "ignoring DHCP clients for loopback link");
+
+ if (network->dhcp_server)
+ log_debug_link(link, "ignoring DHCP server for loopback link");
+ }
+
r = network_apply(link->manager, network, link);
if (r < 0)
return r;
} else {
r = link_get(m, ifindex, &link);
if (r < 0 || !link) {
- log_warning("rtnl: received address for a nonexistent link, ignoring");
+ log_warning("rtnl: received address for a nonexistent link (%d), ignoring", ifindex);
return 0;
}
}
case RTM_NEWADDR:
if (!address_dropped)
log_debug_link(link, "added address: %s/%u (valid for %s)",
- buf, address->prefixlen,
- strna(valid_str));
+ buf, address->prefixlen, valid_str);
else
log_debug_link(link, "updated address: %s/%u (valid for %s)",
- buf, address->prefixlen,
- strna(valid_str));
+ buf, address->prefixlen, valid_str);
LIST_PREPEND(addresses, link->addresses, address);
address = NULL;
case RTM_DELADDR:
if (address_dropped) {
log_debug_link(link, "removed address: %s/%u (valid for %s)",
- buf, address->prefixlen,
- strna(valid_str));
+ buf, address->prefixlen, valid_str);
link_save(link);
} else
log_warning_link(link,
"removing non-existent address: %s/%u (valid for %s)",
- buf, address->prefixlen,
- strna(valid_str));
+ buf, address->prefixlen, valid_str);
break;
default:
if (link->dhcp_client) {
r = sd_dhcp_client_set_mac(link->dhcp_client,
- &link->mac);
+ (const uint8_t *) &link->mac,
+ sizeof (link->mac),
+ ARPHRD_ETHER);
if (r < 0) {
log_warning_link(link,
"Could not update MAC address in DHCP client: %s",
if (link->dhcp6_client) {
r = sd_dhcp6_client_set_mac(link->dhcp6_client,
- &link->mac);
+ (const uint8_t *) &link->mac,
+ sizeof (link->mac),
+ ARPHRD_ETHER);
if (r < 0) {
log_warning_link(link,
"Could not update MAC address in DHCPv6 client: %s",
char **address, **domain;
bool space;
+ fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
+
fputs("DNS=", f);
space = false;
STRV_FOREACH(address, link->network->dns) {