* the primary one expires it relies on the kernel to promote the
* secondary IP. See also https://github.com/systemd/systemd/issues/7163
*/
-int dhcp4_set_promote_secondaries(Link *link) {
+static int dhcp4_set_promote_secondaries(Link *link) {
int r;
assert(link);
- assert(link->network);
- assert(link->network->dhcp & ADDRESS_FAMILY_IPV4);
/* check if the kernel has promote_secondaries enabled for our
* interface. If it is not globally enabled or enabled for the
assert(link);
assert(link->network);
- assert(link->network->dhcp & ADDRESS_FAMILY_IPV4);
+
+ if (!link_dhcp4_enabled(link))
+ return 0;
+
+ r = dhcp4_set_promote_secondaries(link);
+ if (r < 0)
+ return r;
r = dhcp4_init(link);
if (r < 0)
int dhcp4_configure(Link *link);
int dhcp4_update_mac(Link *link);
-int dhcp4_set_promote_secondaries(Link *link);
int link_deserialize_dhcp4(Link *link, const char *dhcp4_address);
#include "radv-internal.h"
#include "web-util.h"
+bool link_dhcp6_pd_is_enabled(Link *link) {
+ assert(link);
+
+ if (!link->network)
+ return false;
+
+ return link->network->router_prefix_delegation & RADV_PREFIX_DELEGATION_DHCP6;
+}
+
static bool dhcp6_lease_has_pd_prefix(sd_dhcp6_lease *lease) {
uint32_t lifetime_preferred, lifetime_valid;
union in_addr_union pd_prefix;
assert(link);
assert(link->manager);
+ if (!link_dhcp6_pd_is_enabled(link))
+ return 0;
+
link->dhcp6_pd_address_configured = false;
link->dhcp6_pd_route_configured = false;
return 0;
}
-bool link_dhcp6_pd_is_enabled(Link *link) {
- if (!link->network)
- return false;
-
- return link->network->router_prefix_delegation & RADV_PREFIX_DELEGATION_DHCP6;
-}
-
static bool link_has_preferred_subnet_id(Link *link) {
if (!link->network)
return false;
if (link == dhcp6_link)
continue;
- if (!link_dhcp6_pd_is_enabled(link))
- continue;
-
r = dhcp6_pd_remove(link);
if (r < 0)
link_enter_failed(link);
assert(link);
assert(link->network);
+ if (!link_dhcp6_enabled(link) && !link_ipv6_accept_ra_enabled(link))
+ return 0;
+
if (link->dhcp6_client)
return 0;
int r;
assert(link);
- assert(link->network);
- assert(link->network->link_local & (ADDRESS_FAMILY_IPV4 | ADDRESS_FAMILY_FALLBACK_IPV4));
+
+ if (!link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4 | ADDRESS_FAMILY_FALLBACK_IPV4))
+ return 0;
r = ipv4ll_init(link);
if (r < 0)
r = log_link_warning_errno(link, k, "Could not stop DHCPv6 client: %m");
}
- if (link_dhcp6_pd_is_enabled(link)) {
- k = dhcp6_pd_remove(link);
- if (k < 0)
- r = log_link_warning_errno(link, k, "Could not remove DHCPv6 PD addresses and routes: %m");
- }
+ k = dhcp6_pd_remove(link);
+ if (k < 0)
+ r = log_link_warning_errno(link, k, "Could not remove DHCPv6 PD addresses and routes: %m");
if (link->ndisc) {
k = sd_ndisc_stop(link->ndisc);
assert(link);
- if (link_ipv6_accept_ra_enabled(link)) {
- assert(link->ndisc);
-
+ if (link->ndisc) {
log_link_debug(link, "Discovering IPv6 routers");
r = sd_ndisc_start(link->ndisc);
return log_link_warning_errno(link, r, "Could not acquire IPv4 link-local address: %m");
}
- if (link_dhcp4_enabled(link)) {
- assert(link->dhcp_client);
-
+ if (link->dhcp_client) {
log_link_debug(link, "Acquiring DHCPv4 lease");
r = sd_dhcp_client_start(link->dhcp_client);
return r;
}
- if (link_lldp_emit_enabled(link)) {
- r = link_lldp_emit_start(link);
- if (r < 0)
- return log_link_warning_errno(link, r, "Failed to start LLDP transmission: %m");
- }
+ r = link_lldp_emit_start(link);
+ if (r < 0)
+ return log_link_warning_errno(link, r, "Failed to start LLDP transmission: %m");
return 0;
}
if (r < 0)
return r;
- if (link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4 | ADDRESS_FAMILY_FALLBACK_IPV4)) {
- r = ipv4ll_configure(link);
- if (r < 0)
- return r;
- }
-
- if (link_dhcp4_enabled(link)) {
- r = dhcp4_set_promote_secondaries(link);
- if (r < 0)
- return r;
+ r = ipv4ll_configure(link);
+ if (r < 0)
+ return r;
- r = dhcp4_configure(link);
- if (r < 0)
- return r;
- }
+ r = dhcp4_configure(link);
+ if (r < 0)
+ return r;
- if (link_dhcp6_enabled(link) ||
- link_ipv6_accept_ra_enabled(link)) {
- r = dhcp6_configure(link);
- if (r < 0)
- return r;
- }
+ r = dhcp6_configure(link);
+ if (r < 0)
+ return r;
- if (link_ipv6_accept_ra_enabled(link)) {
- r = ndisc_configure(link);
- if (r < 0)
- return r;
- }
+ r = ndisc_configure(link);
+ if (r < 0)
+ return r;
r = radv_configure(link);
if (r < 0)
return r;
- if (link_lldp_rx_enabled(link)) {
- r = link_lldp_rx_configure(link);
- if (r < 0)
- return r;
- }
+ r = link_lldp_rx_configure(link);
+ if (r < 0)
+ return r;
r = link_configure_mtu(link);
if (r < 0)
DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(lldp_mode, LLDPMode, LLDP_MODE_YES);
-bool link_lldp_rx_enabled(Link *link) {
+static bool link_lldp_rx_enabled(Link *link) {
assert(link);
if (link->flags & IFF_LOOPBACK)
int link_lldp_rx_configure(Link *link) {
int r;
- r = sd_lldp_new(&link->lldp);
- if (r < 0)
- return r;
+ if (!link_lldp_rx_enabled(link))
+ return 0;
+
+ if (!link->lldp) {
+ r = sd_lldp_new(&link->lldp);
+ if (r < 0)
+ return r;
+
+ r = sd_lldp_attach_event(link->lldp, NULL, 0);
+ if (r < 0)
+ return r;
+ }
r = sd_lldp_set_ifindex(link->lldp, link->ifindex);
if (r < 0)
if (r < 0)
return r;
- r = sd_lldp_attach_event(link->lldp, NULL, 0);
- if (r < 0)
- return r;
-
r = sd_lldp_set_callback(link->lldp, lldp_handler, link);
if (r < 0)
return r;
/* SPDX-License-Identifier: LGPL-2.1+ */
#pragma once
-#include <stdbool.h>
-
#include "conf-parser.h"
typedef struct Link Link;
_LLDP_MODE_INVALID = -1,
} LLDPMode;
-bool link_lldp_rx_enabled(Link *link);
int link_lldp_rx_configure(Link *link);
int link_update_lldp(Link *link);
int link_lldp_save(Link *link);
assert(link);
- if (!link->network || link->network->lldp_emit == LLDP_EMIT_NO) {
+ if (!link_lldp_emit_enabled(link)) {
link_lldp_emit_stop(link);
return 0;
}
assert(link);
- r = sd_ndisc_new(&link->ndisc);
- if (r < 0)
- return r;
+ if (!link_ipv6_accept_ra_enabled(link))
+ return 0;
- r = sd_ndisc_attach_event(link->ndisc, NULL, 0);
- if (r < 0)
- return r;
+ if (!link->ndisc) {
+ r = sd_ndisc_new(&link->ndisc);
+ if (r < 0)
+ return r;
+
+ r = sd_ndisc_attach_event(link->ndisc, NULL, 0);
+ if (r < 0)
+ return r;
+ }
r = sd_ndisc_set_mac(link->ndisc, &link->mac);
if (r < 0)