summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2024-03-18 16:34:10 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2024-03-18 17:19:56 +0100
commit39f6642c42993b57c1ffa6027133cc7f2453ba2b (patch)
tree466038b5a1d792ac590fc6620233ec51d8fba54d
parentb699de9d4ac37969e6b12dd8ce165edf405696ec (diff)
device: move helper functions to a separate filebg/device-utils
-rw-r--r--src/core/devices/nm-device-utils.c622
-rw-r--r--src/core/devices/nm-device-utils.h28
-rw-r--r--src/core/devices/nm-device.c674
3 files changed, 682 insertions, 642 deletions
diff --git a/src/core/devices/nm-device-utils.c b/src/core/devices/nm-device-utils.c
index ed0a27382a..83d5fe7289 100644
--- a/src/core/devices/nm-device-utils.c
+++ b/src/core/devices/nm-device-utils.c
@@ -1,11 +1,22 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
+#include <linux/if_ether.h>
+
#include "src/core/nm-default-daemon.h"
#include "src/core/dns/nm-dns-manager.h"
#include "src/core/dns/nm-dns-systemd-resolved.h"
-#include "nm-device-utils.h"
+#include "libnm-core-intern/nm-core-internal.h"
+#include "libnm-core-aux-intern/nm-common-macros.h"
+#include "libnm-systemd-shared/nm-sd-utils-shared.h"
+
+#include "nm-config.h"
#include "nm-core-utils.h"
+#include "nm-device-utils.h"
+#include "nm-device-loopback.h"
+#include "nm-device.h"
+#include "nm-device-logging.h"
+#include "ndisc/nm-ndisc.h"
/*****************************************************************************/
@@ -366,3 +377,612 @@ nm_device_resolve_address_finish(GAsyncResult *result, GError **error)
return g_task_propagate_pointer(task, error);
}
+
+const char *
+nm_device_prop_get_connection_mud_url(NMDevice *self)
+{
+ NMSettingConnection *s_con;
+ const char *mud_url;
+ const char *s;
+
+ s_con = nm_device_get_applied_setting(self, NM_TYPE_SETTING_IP4_CONFIG);
+ nm_assert(s_con);
+ mud_url = nm_setting_connection_get_mud_url(s_con);
+
+ if (mud_url) {
+ if (nm_streq(mud_url, NM_CONNECTION_MUD_URL_NONE))
+ return NULL;
+ return mud_url;
+ }
+
+ s = nm_config_data_get_connection_default(NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("connection.mud-url"),
+ self);
+ if (s) {
+ if (nm_streq(s, NM_CONNECTION_MUD_URL_NONE))
+ return NULL;
+ if (nm_sd_http_url_is_valid_https(s))
+ return s;
+ }
+
+ return NULL;
+}
+
+guint32
+nm_device_prop_get_ipv4_dad_timeout(NMDevice *self)
+{
+ NMConnection *connection;
+ NMSettingIPConfig *s_ip4 = NULL;
+ int timeout = -1;
+
+ connection = nm_device_get_applied_connection(self);
+ if (connection)
+ s_ip4 = nm_connection_get_setting_ip4_config(connection);
+ if (s_ip4)
+ timeout = nm_setting_ip_config_get_dad_timeout(s_ip4);
+
+ nm_assert(timeout >= -1 && timeout <= NM_SETTING_IP_CONFIG_DAD_TIMEOUT_MAX);
+
+ if (timeout >= 0)
+ return timeout;
+
+ return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("ipv4.dad-timeout"),
+ self,
+ 0,
+ NM_SETTING_IP_CONFIG_DAD_TIMEOUT_MAX,
+ 200);
+}
+
+guint32
+nm_device_prop_get_ipv6_ra_timeout(NMDevice *self)
+{
+ NMConnection *connection;
+ gint32 timeout;
+
+ G_STATIC_ASSERT_EXPR(NM_RA_TIMEOUT_DEFAULT == 0);
+ G_STATIC_ASSERT_EXPR(NM_RA_TIMEOUT_INFINITY == G_MAXINT32);
+
+ connection = nm_device_get_applied_connection(self);
+
+ timeout = nm_setting_ip6_config_get_ra_timeout(
+ NM_SETTING_IP6_CONFIG(nm_connection_get_setting_ip6_config(connection)));
+ if (timeout > 0)
+ return timeout;
+ nm_assert(timeout == 0);
+
+ return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("ipv6.ra-timeout"),
+ self,
+ 0,
+ G_MAXINT32,
+ 0);
+}
+
+NMSettingConnectionMdns
+nm_device_prop_get_connection_mdns(NMDevice *self)
+{
+ NMConnection *connection;
+ NMSettingConnectionMdns mdns = NM_SETTING_CONNECTION_MDNS_DEFAULT;
+
+ g_return_val_if_fail(NM_IS_DEVICE(self), NM_SETTING_CONNECTION_MDNS_DEFAULT);
+
+ connection = nm_device_get_applied_connection(self);
+ if (connection)
+ mdns = nm_setting_connection_get_mdns(nm_connection_get_setting_connection(connection));
+ if (mdns != NM_SETTING_CONNECTION_MDNS_DEFAULT)
+ return mdns;
+
+ return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("connection.mdns"),
+ self,
+ NM_SETTING_CONNECTION_MDNS_NO,
+ NM_SETTING_CONNECTION_MDNS_YES,
+ NM_SETTING_CONNECTION_MDNS_DEFAULT);
+}
+
+NMSettingConnectionLlmnr
+nm_device_prop_get_connection_llmnr(NMDevice *self)
+{
+ NMConnection *connection;
+ NMSettingConnectionLlmnr llmnr = NM_SETTING_CONNECTION_LLMNR_DEFAULT;
+
+ g_return_val_if_fail(NM_IS_DEVICE(self), NM_SETTING_CONNECTION_LLMNR_DEFAULT);
+
+ connection = nm_device_get_applied_connection(self);
+ if (connection)
+ llmnr = nm_setting_connection_get_llmnr(nm_connection_get_setting_connection(connection));
+ if (llmnr != NM_SETTING_CONNECTION_LLMNR_DEFAULT)
+ return llmnr;
+
+ return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("connection.llmnr"),
+ self,
+ NM_SETTING_CONNECTION_LLMNR_NO,
+ NM_SETTING_CONNECTION_LLMNR_YES,
+ NM_SETTING_CONNECTION_LLMNR_DEFAULT);
+}
+
+NMSettingConnectionDnsOverTls
+nm_device_prop_get_connection_dns_over_tls(NMDevice *self)
+{
+ NMConnection *connection;
+ NMSettingConnectionDnsOverTls dns_over_tls = NM_SETTING_CONNECTION_DNS_OVER_TLS_DEFAULT;
+
+ g_return_val_if_fail(NM_IS_DEVICE(self), NM_SETTING_CONNECTION_DNS_OVER_TLS_DEFAULT);
+
+ connection = nm_device_get_applied_connection(self);
+ if (connection)
+ dns_over_tls = nm_setting_connection_get_dns_over_tls(
+ nm_connection_get_setting_connection(connection));
+ if (dns_over_tls != NM_SETTING_CONNECTION_DNS_OVER_TLS_DEFAULT)
+ return dns_over_tls;
+
+ return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("connection.dns-over-tls"),
+ self,
+ NM_SETTING_CONNECTION_DNS_OVER_TLS_NO,
+ NM_SETTING_CONNECTION_DNS_OVER_TLS_YES,
+ NM_SETTING_CONNECTION_DNS_OVER_TLS_DEFAULT);
+}
+
+NMMptcpFlags
+nm_device_prop_get_connection_mptcp_flags(NMDevice *self)
+{
+ NMConnection *connection;
+ NMMptcpFlags mptcp_flags = NM_MPTCP_FLAGS_NONE;
+
+ g_return_val_if_fail(NM_IS_DEVICE(self), NM_MPTCP_FLAGS_DISABLED);
+
+ connection = nm_device_get_applied_connection(self);
+ if (connection) {
+ mptcp_flags =
+ nm_setting_connection_get_mptcp_flags(nm_connection_get_setting_connection(connection));
+ }
+
+ if (mptcp_flags == NM_MPTCP_FLAGS_NONE) {
+ guint64 v;
+
+ v = nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("connection.mptcp-flags"),
+ self,
+ 0,
+ G_MAXINT64,
+ NM_MPTCP_FLAGS_NONE);
+ if (v != NM_MPTCP_FLAGS_NONE) {
+ /* We silently ignore all invalid flags (and will normalize them away below). */
+ mptcp_flags = (NMMptcpFlags) v;
+ if (mptcp_flags == NM_MPTCP_FLAGS_NONE)
+ mptcp_flags = NM_MPTCP_FLAGS_ENABLED;
+ }
+ }
+
+ if (mptcp_flags == NM_MPTCP_FLAGS_NONE)
+ mptcp_flags = _NM_MPTCP_FLAGS_DEFAULT;
+
+ mptcp_flags = nm_mptcp_flags_normalize(mptcp_flags);
+
+ if (!NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_DISABLED)) {
+ if (!NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_ALSO_WITHOUT_SYSCTL)) {
+ guint32 v;
+
+ /* If enabled, but without "also-without-sysctl", then MPTCP is still
+ * disabled, if the sysctl says so...
+ *
+ * We evaluate this here. The point is that the decision is then cached
+ * until deactivation/reapply. The user can toggle the sysctl any time,
+ * but we only pick it up at certain moments (now). */
+ v = nm_platform_sysctl_get_int32(
+ nm_device_get_platform(self),
+ NMP_SYSCTL_PATHID_ABSOLUTE("/proc/sys/net/mptcp/enabled"),
+ -1);
+ if (v <= 0)
+ mptcp_flags = NM_MPTCP_FLAGS_DISABLED;
+ } else
+ mptcp_flags = NM_FLAGS_UNSET(mptcp_flags, NM_MPTCP_FLAGS_ALSO_WITHOUT_SYSCTL);
+ }
+
+ return mptcp_flags;
+}
+
+gboolean
+nm_device_prop_get_connection_lldp(NMDevice *self)
+{
+ NMConnection *connection;
+ NMSettingConnection *s_con;
+ NMSettingConnectionLldp lldp = NM_SETTING_CONNECTION_LLDP_DEFAULT;
+
+ connection = nm_device_get_applied_connection(self);
+ g_return_val_if_fail(connection, FALSE);
+
+ s_con = nm_connection_get_setting_connection(connection);
+ g_return_val_if_fail(s_con, FALSE);
+
+ lldp = nm_setting_connection_get_lldp(s_con);
+ if (lldp == NM_SETTING_CONNECTION_LLDP_DEFAULT) {
+ lldp = nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("connection.lldp"),
+ self,
+ NM_SETTING_CONNECTION_LLDP_DEFAULT,
+ NM_SETTING_CONNECTION_LLDP_ENABLE_RX,
+ NM_SETTING_CONNECTION_LLDP_DEFAULT);
+ if (lldp == NM_SETTING_CONNECTION_LLDP_DEFAULT)
+ lldp = NM_SETTING_CONNECTION_LLDP_DISABLE;
+ }
+ return lldp == NM_SETTING_CONNECTION_LLDP_ENABLE_RX;
+}
+
+NMSettingIP4LinkLocal
+nm_device_prop_get_ipv4_link_local(NMDevice *self)
+{
+ NMSettingIP4Config *s_ip4;
+ NMSettingIP4LinkLocal link_local;
+
+ s_ip4 = nm_device_get_applied_setting(self, NM_TYPE_SETTING_IP4_CONFIG);
+ if (!s_ip4)
+ return NM_SETTING_IP4_LL_DISABLED;
+
+ if (NM_IS_DEVICE_LOOPBACK(self))
+ return NM_SETTING_IP4_LL_DISABLED;
+
+ link_local = nm_setting_ip4_config_get_link_local(s_ip4);
+
+ if (link_local == NM_SETTING_IP4_LL_DEFAULT) {
+ /* For connections without a ipv4.link-local property configured the global configuration
+ might defines the default value for ipv4.link-local. */
+ link_local = nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("ipv4.link-local"),
+ self,
+ NM_SETTING_IP4_LL_AUTO,
+ NM_SETTING_IP4_LL_ENABLED,
+ NM_SETTING_IP4_LL_DEFAULT);
+ if (link_local == NM_SETTING_IP4_LL_DEFAULT) {
+ /* If there is no global configuration for ipv4.link-local assume auto */
+ link_local = NM_SETTING_IP4_LL_AUTO;
+ } else if (link_local == NM_SETTING_IP4_LL_ENABLED
+ && nm_streq(nm_setting_ip_config_get_method((NMSettingIPConfig *) s_ip4),
+ NM_SETTING_IP4_CONFIG_METHOD_DISABLED)) {
+ /* ipv4.method=disabled has higher priority than the global ipv4.link-local=enabled */
+ link_local = NM_SETTING_IP4_LL_DISABLED;
+ } else if (link_local == NM_SETTING_IP4_LL_DISABLED
+ && nm_streq(nm_setting_ip_config_get_method((NMSettingIPConfig *) s_ip4),
+ NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL)) {
+ /* ipv4.method=link-local has higher priority than the global ipv4.link-local=disabled */
+ link_local = NM_SETTING_IP4_LL_ENABLED;
+ }
+ }
+
+ if (link_local == NM_SETTING_IP4_LL_AUTO) {
+ link_local = nm_streq(nm_setting_ip_config_get_method((NMSettingIPConfig *) s_ip4),
+ NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL)
+ ? NM_SETTING_IP4_LL_ENABLED
+ : NM_SETTING_IP4_LL_DISABLED;
+ }
+
+ return link_local;
+}
+
+guint32
+nm_device_prop_get_ipvx_dns_priority(NMDevice *self, int addr_family)
+{
+ NMConnection *connection;
+ NMSettingIPConfig *s_ip;
+ int prio = 0;
+
+ connection = nm_device_get_applied_connection(self);
+ s_ip = nm_connection_get_setting_ip_config(connection, addr_family);
+ if (s_ip)
+ prio = nm_setting_ip_config_get_dns_priority(s_ip);
+
+ if (prio == 0) {
+ prio = nm_config_data_get_connection_default_int64(
+ NM_CONFIG_GET_DATA,
+ NM_IS_IPv4(addr_family) ? NM_CON_DEFAULT("ipv4.dns-priority")
+ : NM_CON_DEFAULT("ipv6.dns-priority"),
+ self,
+ G_MININT32,
+ G_MAXINT32,
+ 0);
+ if (prio == 0) {
+ prio = nm_device_is_vpn(self) ? NM_DNS_PRIORITY_DEFAULT_VPN
+ : NM_DNS_PRIORITY_DEFAULT_NORMAL;
+ }
+ }
+
+ nm_assert(prio != 0);
+ return prio;
+}
+
+guint32
+nm_device_prop_get_ipvx_required_timeout(NMDevice *self, int addr_family)
+{
+ NMConnection *connection;
+ NMSettingIPConfig *s_ip;
+ int timeout;
+
+ nm_assert(NM_IS_DEVICE(self));
+ nm_assert_addr_family(addr_family);
+
+ connection = nm_device_get_applied_connection(self);
+ if (!connection)
+ return 0;
+
+ s_ip = nm_connection_get_setting_ip_config(connection, addr_family);
+ if (!s_ip)
+ return 0;
+
+ timeout = nm_setting_ip_config_get_required_timeout(s_ip);
+ nm_assert(timeout >= -1);
+
+ if (timeout > -1)
+ return (guint32) timeout;
+
+ return nm_config_data_get_connection_default_int64(
+ NM_CONFIG_GET_DATA,
+ NM_IS_IPv4(addr_family) ? NM_CON_DEFAULT("ipv4.required-timeout")
+ : NM_CON_DEFAULT("ipv6.required-timeout"),
+ self,
+ 0,
+ G_MAXINT32,
+ 0);
+}
+
+gboolean
+nm_device_prop_get_ipvx_may_fail(NMDevice *self, int addr_family)
+{
+ NMConnection *connection;
+ NMSettingIPConfig *s_ip = NULL;
+
+ connection = nm_device_get_applied_connection(self);
+ if (connection)
+ s_ip = nm_connection_get_setting_ip_config(connection, addr_family);
+
+ return !s_ip || nm_setting_ip_config_get_may_fail(s_ip);
+}
+
+NMDhcpHostnameFlags
+nm_device_prop_get_ipvx_dhcp_hostname_flags(NMDevice *self, int addr_family)
+{
+ NMConnection *connection;
+ NMSettingIPConfig *s_ip;
+ NMDhcpHostnameFlags flags;
+ gs_free_error GError *error = NULL;
+
+ g_return_val_if_fail(NM_IS_DEVICE(self), NM_DHCP_HOSTNAME_FLAG_NONE);
+
+ connection = nm_device_get_applied_connection(self);
+ s_ip = nm_connection_get_setting_ip_config(connection, addr_family);
+ g_return_val_if_fail(s_ip, NM_DHCP_HOSTNAME_FLAG_NONE);
+
+ if (!nm_setting_ip_config_get_dhcp_send_hostname(s_ip))
+ return NM_DHCP_HOSTNAME_FLAG_NONE;
+
+ flags = nm_setting_ip_config_get_dhcp_hostname_flags(s_ip);
+ if (flags != NM_DHCP_HOSTNAME_FLAG_NONE)
+ return flags;
+
+ flags = nm_config_data_get_connection_default_int64(
+ NM_CONFIG_GET_DATA,
+ NM_IS_IPv4(addr_family) ? NM_CON_DEFAULT("ipv4.dhcp-hostname-flags")
+ : NM_CON_DEFAULT("ipv6.dhcp-hostname-flags"),
+ self,
+ 0,
+ NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS,
+ 0);
+
+ if (!_nm_utils_validate_dhcp_hostname_flags(flags, addr_family, &error)) {
+ _LOGW(LOGD_DEVICE,
+ "invalid global default value 0x%x for ipv%c.%s: %s",
+ (guint) flags,
+ nm_utils_addr_family_to_char(addr_family),
+ NM_SETTING_IP_CONFIG_DHCP_HOSTNAME_FLAGS,
+ error->message);
+ flags = NM_DHCP_HOSTNAME_FLAG_NONE;
+ }
+
+ if (flags != NM_DHCP_HOSTNAME_FLAG_NONE)
+ return flags;
+
+ if (NM_IS_IPv4(addr_family))
+ return NM_DHCP_HOSTNAME_FLAGS_FQDN_DEFAULT_IP4;
+ else
+ return NM_DHCP_HOSTNAME_FLAGS_FQDN_DEFAULT_IP6;
+}
+
+guint8
+nm_device_prop_get_ipv4_dhcp_dscp(NMDevice *self, gboolean *out_dscp_explicit)
+{
+ gs_free_error GError *error = NULL;
+ NMConnection *connection;
+ NMSettingIPConfig *s_ip;
+ const char *str;
+
+ connection = nm_device_get_applied_connection(self);
+ s_ip = nm_connection_get_setting_ip_config(connection, AF_INET);
+ g_return_val_if_fail(s_ip, 0);
+
+ NM_SET_OUT(out_dscp_explicit, TRUE);
+
+ str = nm_setting_ip_config_get_dhcp_dscp(s_ip);
+ if (str) {
+ nm_assert(nm_utils_validate_dhcp_dscp(str, NULL));
+ } else {
+ str = nm_config_data_get_connection_default(NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("ipv4.dhcp-dscp"),
+ self);
+ if (!str || !str[0]) {
+ str = "CS0";
+ NM_SET_OUT(out_dscp_explicit, FALSE);
+ } else if (!nm_utils_validate_dhcp_dscp(str, &error)) {
+ _LOGW(LOGD_DEVICE,
+ "invalid global default value '%s' for ipv4.%s: %s",
+ str,
+ NM_SETTING_IP_CONFIG_DHCP_DSCP,
+ error->message);
+ str = "CS0";
+ NM_SET_OUT(out_dscp_explicit, FALSE);
+ }
+ }
+
+ if (nm_streq(str, "CS0")) {
+ return 0;
+ } else if (nm_streq(str, "CS6")) {
+ return 0x30;
+ } else if (nm_streq(str, "CS4")) {
+ return 0x20;
+ };
+
+ return nm_assert_unreachable_val(0);
+}
+
+GBytes *
+nm_device_prop_get_ipv4_dhcp_vendor_class_identifier(NMDevice *self, NMSettingIP4Config *s_ip4)
+{
+ gs_free char *to_free = NULL;
+ const char *conn_prop;
+ GBytes *bytes = NULL;
+ const char *bin;
+ gsize len;
+
+ conn_prop = nm_setting_ip4_config_get_dhcp_vendor_class_identifier(s_ip4);
+
+ if (!conn_prop) {
+ /* set in NetworkManager.conf ? */
+ conn_prop = nm_config_data_get_connection_default(
+ NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("ipv4.dhcp-vendor-class-identifier"),
+ self);
+
+ if (conn_prop && !nm_utils_validate_dhcp4_vendor_class_id(conn_prop, NULL))
+ conn_prop = NULL;
+ }
+
+ if (conn_prop) {
+ bin = nm_utils_buf_utf8safe_unescape(conn_prop,
+ NM_UTILS_STR_UTF8_SAFE_FLAG_NONE,
+ &len,
+ (gpointer *) &to_free);
+ if (to_free)
+ bytes = g_bytes_new_take(g_steal_pointer(&to_free), len);
+ else
+ bytes = g_bytes_new(bin, len);
+ }
+
+ return bytes;
+}
+
+NMSettingIP6ConfigAddrGenMode
+nm_device_prop_get_ipv6_addr_gen_mode(NMDevice *self)
+{
+ NMSettingIP6ConfigAddrGenMode addr_gen_mode;
+ NMSettingIP6Config *s_ip6;
+ gint64 c;
+
+ g_return_val_if_fail(self, NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY);
+
+ s_ip6 = nm_device_get_applied_setting(self, NM_TYPE_SETTING_IP6_CONFIG);
+ if (s_ip6) {
+ addr_gen_mode = nm_setting_ip6_config_get_addr_gen_mode(s_ip6);
+ if (NM_IN_SET(addr_gen_mode,
+ NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
+ NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY))
+ return addr_gen_mode;
+ } else
+ addr_gen_mode = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT;
+
+ nm_assert(NM_IN_SET(addr_gen_mode,
+ NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT_OR_EUI64,
+ NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT));
+
+ c = nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("ipv6.addr-gen-mode"),
+ self,
+ NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
+ NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT,
+ -1);
+ if (c != -1)
+ addr_gen_mode = c;
+
+ if (addr_gen_mode == NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT)
+ addr_gen_mode = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY;
+ else if (addr_gen_mode == NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT_OR_EUI64)
+ addr_gen_mode = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64;
+
+ nm_assert(NM_IN_SET(addr_gen_mode,
+ NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
+ NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY));
+
+ return addr_gen_mode;
+}
+
+const char *
+nm_device_prop_get_x_cloned_mac_address(NMDevice *self, NMConnection *connection, gboolean is_wifi)
+{
+ NMSetting *setting;
+ const char *addr = NULL;
+
+ setting = nm_connection_get_setting(connection,
+ is_wifi ? NM_TYPE_SETTING_WIRELESS : NM_TYPE_SETTING_WIRED);
+ if (setting) {
+ addr = is_wifi ? nm_setting_wireless_get_cloned_mac_address((NMSettingWireless *) setting)
+ : nm_setting_wired_get_cloned_mac_address((NMSettingWired *) setting);
+ }
+
+ if (!addr) {
+ const char *a;
+
+ a = nm_config_data_get_connection_default(
+ NM_CONFIG_GET_DATA,
+ is_wifi ? NM_CON_DEFAULT("wifi.cloned-mac-address")
+ : NM_CON_DEFAULT("ethernet.cloned-mac-address"),
+ self);
+
+ addr = NM_CLONED_MAC_PRESERVE;
+
+ if (!a) {
+ if (is_wifi) {
+ NMSettingMacRandomization v;
+
+ /* for backward compatibility, read the deprecated wifi.mac-address-randomization setting. */
+ v = nm_config_data_get_connection_default_int64(
+ NM_CONFIG_GET_DATA,
+ NM_CON_DEFAULT("wifi.mac-address-randomization"),
+ self,
+ NM_SETTING_MAC_RANDOMIZATION_DEFAULT,
+ NM_SETTING_MAC_RANDOMIZATION_ALWAYS,
+ NM_SETTING_MAC_RANDOMIZATION_DEFAULT);
+ if (v == NM_SETTING_MAC_RANDOMIZATION_ALWAYS)
+ addr = NM_CLONED_MAC_RANDOM;
+ }
+ } else if (NM_CLONED_MAC_IS_SPECIAL(a, is_wifi) || nm_utils_hwaddr_valid(a, ETH_ALEN))
+ addr = a;
+ }
+
+ return addr;
+}
+
+const char *
+nm_device_prop_get_x_generate_mac_address_mask(NMDevice *self,
+ NMConnection *connection,
+ gboolean is_wifi)
+{
+ NMSetting *setting;
+ const char *value;
+
+ setting = nm_connection_get_setting(connection,
+ is_wifi ? NM_TYPE_SETTING_WIRELESS : NM_TYPE_SETTING_WIRED);
+ if (setting) {
+ value =
+ is_wifi
+ ? nm_setting_wireless_get_generate_mac_address_mask((NMSettingWireless *) setting)
+ : nm_setting_wired_get_generate_mac_address_mask((NMSettingWired *) setting);
+ if (value)
+ return value;
+ }
+
+ return nm_config_data_get_connection_default(
+ NM_CONFIG_GET_DATA,
+ is_wifi ? NM_CON_DEFAULT("wifi.generate-mac-address-mask")
+ : NM_CON_DEFAULT("ethernet.generate-mac-address-mask"),
+ self);
+}
diff --git a/src/core/devices/nm-device-utils.h b/src/core/devices/nm-device-utils.h
index 7b879c9074..fd62886ffe 100644
--- a/src/core/devices/nm-device-utils.h
+++ b/src/core/devices/nm-device-utils.h
@@ -3,6 +3,9 @@
#ifndef __DEVICES_NM_DEVICE_UTILS_H__
#define __DEVICES_NM_DEVICE_UTILS_H__
+#include "nm-setting-connection.h"
+#include "nm-setting-ip4-config.h"
+
/*****************************************************************************/
const char *nm_device_state_to_string(NMDeviceState state);
@@ -92,4 +95,29 @@ void nm_device_resolve_address(int addr_family,
char *nm_device_resolve_address_finish(GAsyncResult *result, GError **error);
+/*****************************************************************************/
+
+NMSettingConnectionDnsOverTls nm_device_prop_get_connection_dns_over_tls(NMDevice *self);
+gboolean nm_device_prop_get_connection_lldp(NMDevice *self);
+NMSettingConnectionLlmnr nm_device_prop_get_connection_llmnr(NMDevice *self);
+NMSettingConnectionMdns nm_device_prop_get_connection_mdns(NMDevice *self);
+NMMptcpFlags nm_device_prop_get_connection_mptcp_flags(NMDevice *self);
+const char *nm_device_prop_get_connection_mud_url(NMDevice *self);
+guint32 nm_device_prop_get_ipv4_dad_timeout(NMDevice *self);
+guint8 nm_device_prop_get_ipv4_dhcp_dscp(NMDevice *self, gboolean *out_exp);
+GBytes *nm_device_prop_get_ipv4_dhcp_vendor_class_identifier(NMDevice *self,
+ NMSettingIP4Config *s_ip4);
+NMSettingIP4LinkLocal nm_device_prop_get_ipv4_link_local(NMDevice *self);
+guint32 nm_device_prop_get_ipv6_ra_timeout(NMDevice *self);
+NMSettingIP6ConfigAddrGenMode nm_device_prop_get_ipv6_addr_gen_mode(NMDevice *self);
+NMDhcpHostnameFlags nm_device_prop_get_ipvx_dhcp_hostname_flags(NMDevice *self, int af);
+guint32 nm_device_prop_get_ipvx_dns_priority(NMDevice *self, int af);
+gboolean nm_device_prop_get_ipvx_may_fail(NMDevice *self, int af);
+guint32 nm_device_prop_get_ipvx_required_timeout(NMDevice *self, int af);
+const char *nm_device_prop_get_x_generate_mac_address_mask(NMDevice *self,
+ NMConnection *connection,
+ gboolean is_wifi);
+const char *
+nm_device_prop_get_x_cloned_mac_address(NMDevice *self, NMConnection *connection, gboolean is_wifi);
+
#endif /* __DEVICES_NM_DEVICE_UTILS_H__ */
diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c
index aaba79c02e..103ba1a5cc 100644
--- a/src/core/devices/nm-device.c
+++ b/src/core/devices/nm-device.c
@@ -28,7 +28,6 @@
#include "libnm-glib-aux/nm-uuid.h"
#include "libnm-glib-aux/nm-dedup-multi.h"
#include "libnm-glib-aux/nm-random-utils.h"
-#include "libnm-systemd-shared/nm-sd-utils-shared.h"
#include "libnm-base/nm-ethtool-base.h"
#include "libnm-core-aux-intern/nm-common-macros.h"
@@ -799,16 +798,9 @@ static void _dev_ipac6_ndisc_set_router_config(NMDevice *self);
static guint32 _dev_default_route_metric_penalty_get(NMDevice *self, int addr_family);
-static guint32 _prop_get_ipv4_dad_timeout(NMDevice *self);
-
static void _carrier_wait_check_queued_act_request(NMDevice *self);
static gint64 _get_carrier_wait_ms(NMDevice *self);
-static GBytes *_prop_get_ipv6_dhcp_duid(NMDevice *self,
- NMConnection *connection,
- GBytes *hwaddr,
- gboolean *out_enforce);
-
static const char *_activation_func_to_string(ActivationHandleFunc func);
static void
@@ -1008,6 +1000,12 @@ _ip6_privacy_clamp(NMSettingIP6ConfigPrivacy use_tempaddr)
/*****************************************************************************/
+/*
+ * All _prop_get_<setting>_<property>() helpers should be in nm-device-utils.c.
+ * However, the following helpers need access to device internals and need to
+ * stay here.
+ */
+
static const char *
_prop_get_connection_stable_id(NMDevice *self,
NMConnection *connection,
@@ -1323,157 +1321,6 @@ out_good:
}
static guint32
-_prop_get_ipv6_ra_timeout(NMDevice *self)
-{
- NMConnection *connection;
- gint32 timeout;
-
- G_STATIC_ASSERT_EXPR(NM_RA_TIMEOUT_DEFAULT == 0);
- G_STATIC_ASSERT_EXPR(NM_RA_TIMEOUT_INFINITY == G_MAXINT32);
-
- connection = nm_device_get_applied_connection(self);
-
- timeout = nm_setting_ip6_config_get_ra_timeout(
- NM_SETTING_IP6_CONFIG(nm_connection_get_setting_ip6_config(connection)));
- if (timeout > 0)
- return timeout;
- nm_assert(timeout == 0);
-
- return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("ipv6.ra-timeout"),
- self,
- 0,
- G_MAXINT32,
- 0);
-}
-
-static NMSettingConnectionMdns
-_prop_get_connection_mdns(NMDevice *self)
-{
- NMConnection *connection;
- NMSettingConnectionMdns mdns = NM_SETTING_CONNECTION_MDNS_DEFAULT;
-
- g_return_val_if_fail(NM_IS_DEVICE(self), NM_SETTING_CONNECTION_MDNS_DEFAULT);
-
- connection = nm_device_get_applied_connection(self);
- if (connection)
- mdns = nm_setting_connection_get_mdns(nm_connection_get_setting_connection(connection));
- if (mdns != NM_SETTING_CONNECTION_MDNS_DEFAULT)
- return mdns;
-
- return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("connection.mdns"),
- self,
- NM_SETTING_CONNECTION_MDNS_NO,
- NM_SETTING_CONNECTION_MDNS_YES,
- NM_SETTING_CONNECTION_MDNS_DEFAULT);
-}
-
-static NMSettingConnectionLlmnr
-_prop_get_connection_llmnr(NMDevice *self)
-{
- NMConnection *connection;
- NMSettingConnectionLlmnr llmnr = NM_SETTING_CONNECTION_LLMNR_DEFAULT;
-
- g_return_val_if_fail(NM_IS_DEVICE(self), NM_SETTING_CONNECTION_LLMNR_DEFAULT);
-
- connection = nm_device_get_applied_connection(self);
- if (connection)
- llmnr = nm_setting_connection_get_llmnr(nm_connection_get_setting_connection(connection));
- if (llmnr != NM_SETTING_CONNECTION_LLMNR_DEFAULT)
- return llmnr;
-
- return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("connection.llmnr"),
- self,
- NM_SETTING_CONNECTION_LLMNR_NO,
- NM_SETTING_CONNECTION_LLMNR_YES,
- NM_SETTING_CONNECTION_LLMNR_DEFAULT);
-}
-
-static NMSettingConnectionDnsOverTls
-_prop_get_connection_dns_over_tls(NMDevice *self)
-{
- NMConnection *connection;
- NMSettingConnectionDnsOverTls dns_over_tls = NM_SETTING_CONNECTION_DNS_OVER_TLS_DEFAULT;
-
- g_return_val_if_fail(NM_IS_DEVICE(self), NM_SETTING_CONNECTION_DNS_OVER_TLS_DEFAULT);
-
- connection = nm_device_get_applied_connection(self);
- if (connection)
- dns_over_tls = nm_setting_connection_get_dns_over_tls(
- nm_connection_get_setting_connection(connection));
- if (dns_over_tls != NM_SETTING_CONNECTION_DNS_OVER_TLS_DEFAULT)
- return dns_over_tls;
-
- return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("connection.dns-over-tls"),
- self,
- NM_SETTING_CONNECTION_DNS_OVER_TLS_NO,
- NM_SETTING_CONNECTION_DNS_OVER_TLS_YES,
- NM_SETTING_CONNECTION_DNS_OVER_TLS_DEFAULT);
-}
-
-static NMMptcpFlags
-_prop_get_connection_mptcp_flags(NMDevice *self)
-{
- NMConnection *connection;
- NMMptcpFlags mptcp_flags = NM_MPTCP_FLAGS_NONE;
-
- g_return_val_if_fail(NM_IS_DEVICE(self), NM_MPTCP_FLAGS_DISABLED);
-
- connection = nm_device_get_applied_connection(self);
- if (connection) {
- mptcp_flags =
- nm_setting_connection_get_mptcp_flags(nm_connection_get_setting_connection(connection));
- }
-
- if (mptcp_flags == NM_MPTCP_FLAGS_NONE) {
- guint64 v;
-
- v = nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("connection.mptcp-flags"),
- self,
- 0,
- G_MAXINT64,
- NM_MPTCP_FLAGS_NONE);
- if (v != NM_MPTCP_FLAGS_NONE) {
- /* We silently ignore all invalid flags (and will normalize them away below). */
- mptcp_flags = (NMMptcpFlags) v;
- if (mptcp_flags == NM_MPTCP_FLAGS_NONE)
- mptcp_flags = NM_MPTCP_FLAGS_ENABLED;
- }
- }
-
- if (mptcp_flags == NM_MPTCP_FLAGS_NONE)
- mptcp_flags = _NM_MPTCP_FLAGS_DEFAULT;
-
- mptcp_flags = nm_mptcp_flags_normalize(mptcp_flags);
-
- if (!NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_DISABLED)) {
- if (!NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_ALSO_WITHOUT_SYSCTL)) {
- guint32 v;
-
- /* If enabled, but without "also-without-sysctl", then MPTCP is still
- * disabled, if the sysctl says so...
- *
- * We evaluate this here. The point is that the decision is then cached
- * until deactivation/reapply. The user can toggle the sysctl any time,
- * but we only pick it up at certain moments (now). */
- v = nm_platform_sysctl_get_int32(
- nm_device_get_platform(self),
- NMP_SYSCTL_PATHID_ABSOLUTE("/proc/sys/net/mptcp/enabled"),
- -1);
- if (v <= 0)
- mptcp_flags = NM_MPTCP_FLAGS_DISABLED;
- } else
- mptcp_flags = NM_FLAGS_UNSET(mptcp_flags, NM_MPTCP_FLAGS_ALSO_WITHOUT_SYSCTL);
- }
-
- return mptcp_flags;
-}
-
-static guint32
_prop_get_ipvx_route_table(NMDevice *self, int addr_family)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self);
@@ -1561,109 +1408,6 @@ _prop_get_ipvx_route_table(NMDevice *self, int addr_family)
return route_table;
}
-static gboolean
-_prop_get_connection_lldp(NMDevice *self)
-{
- NMConnection *connection;
- NMSettingConnection *s_con;
- NMSettingConnectionLldp lldp = NM_SETTING_CONNECTION_LLDP_DEFAULT;
-
- connection = nm_device_get_applied_connection(self);
- g_return_val_if_fail(connection, FALSE);
-
- s_con = nm_connection_get_setting_connection(connection);
- g_return_val_if_fail(s_con, FALSE);
-
- lldp = nm_setting_connection_get_lldp(s_con);
- if (lldp == NM_SETTING_CONNECTION_LLDP_DEFAULT) {
- lldp = nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("connection.lldp"),
- self,
- NM_SETTING_CONNECTION_LLDP_DEFAULT,
- NM_SETTING_CONNECTION_LLDP_ENABLE_RX,
- NM_SETTING_CONNECTION_LLDP_DEFAULT);
- if (lldp == NM_SETTING_CONNECTION_LLDP_DEFAULT)
- lldp = NM_SETTING_CONNECTION_LLDP_DISABLE;
- }
- return lldp == NM_SETTING_CONNECTION_LLDP_ENABLE_RX;
-}
-
-static NMSettingIP4LinkLocal
-_prop_get_ipv4_link_local(NMDevice *self)
-{
- NMSettingIP4Config *s_ip4;
- NMSettingIP4LinkLocal link_local;
-
- s_ip4 = nm_device_get_applied_setting(self, NM_TYPE_SETTING_IP4_CONFIG);
- if (!s_ip4)
- return NM_SETTING_IP4_LL_DISABLED;
-
- if (NM_IS_DEVICE_LOOPBACK(self))
- return NM_SETTING_IP4_LL_DISABLED;
-
- link_local = nm_setting_ip4_config_get_link_local(s_ip4);
-
- if (link_local == NM_SETTING_IP4_LL_DEFAULT) {
- /* For connections without a ipv4.link-local property configured the global configuration
- might defines the default value for ipv4.link-local. */
- link_local = nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("ipv4.link-local"),
- self,
- NM_SETTING_IP4_LL_AUTO,
- NM_SETTING_IP4_LL_ENABLED,
- NM_SETTING_IP4_LL_DEFAULT);
- if (link_local == NM_SETTING_IP4_LL_DEFAULT) {
- /* If there is no global configuration for ipv4.link-local assume auto */
- link_local = NM_SETTING_IP4_LL_AUTO;
- } else if (link_local == NM_SETTING_IP4_LL_ENABLED
- && nm_streq(nm_setting_ip_config_get_method((NMSettingIPConfig *) s_ip4),
- NM_SETTING_IP4_CONFIG_METHOD_DISABLED)) {
- /* ipv4.method=disabled has higher priority than the global ipv4.link-local=enabled */
- link_local = NM_SETTING_IP4_LL_DISABLED;
- } else if (link_local == NM_SETTING_IP4_LL_DISABLED
- && nm_streq(nm_setting_ip_config_get_method((NMSettingIPConfig *) s_ip4),
- NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL)) {
- /* ipv4.method=link-local has higher priority than the global ipv4.link-local=disabled */
- link_local = NM_SETTING_IP4_LL_ENABLED;
- }
- }
-
- if (link_local == NM_SETTING_IP4_LL_AUTO) {
- link_local = nm_streq(nm_setting_ip_config_get_method((NMSettingIPConfig *) s_ip4),
- NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL)
- ? NM_SETTING_IP4_LL_ENABLED
- : NM_SETTING_IP4_LL_DISABLED;
- }
-
- return link_local;
-}
-
-static guint32
-_prop_get_ipv4_dad_timeout(NMDevice *self)
-{
- NMConnection *connection;
- NMSettingIPConfig *s_ip4 = NULL;
- int timeout = -1;
-
- connection = nm_device_get_applied_connection(self);
- if (connection)
- s_ip4 = nm_connection_get_setting_ip4_config(connection);
- if (s_ip4)
- timeout = nm_setting_ip_config_get_dad_timeout(s_ip4);
-
- nm_assert(timeout >= -1 && timeout <= NM_SETTING_IP_CONFIG_DAD_TIMEOUT_MAX);
-
- if (timeout >= 0)
- return timeout;
-
- return nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("ipv4.dad-timeout"),
- self,
- 0,
- NM_SETTING_IP_CONFIG_DAD_TIMEOUT_MAX,
- 200);
-}
-
static guint32
_prop_get_ipvx_dhcp_timeout(NMDevice *self, int addr_family)
{
@@ -1712,88 +1456,10 @@ out:
return timeout;
}
-static guint32
-_prop_get_ipvx_dns_priority(NMDevice *self, int addr_family)
-{
- NMConnection *connection;
- NMSettingIPConfig *s_ip;
- int prio = 0;
-
- connection = nm_device_get_applied_connection(self);
- s_ip = nm_connection_get_setting_ip_config(connection, addr_family);
- if (s_ip)
- prio = nm_setting_ip_config_get_dns_priority(s_ip);
-
- if (prio == 0) {
- prio = nm_config_data_get_connection_default_int64(
- NM_CONFIG_GET_DATA,
- NM_IS_IPv4(addr_family) ? NM_CON_DEFAULT("ipv4.dns-priority")
- : NM_CON_DEFAULT("ipv6.dns-priority"),
- self,
- G_MININT32,
- G_MAXINT32,
- 0);
- if (prio == 0) {
- prio = nm_device_is_vpn(self) ? NM_DNS_PRIORITY_DEFAULT_VPN
- : NM_DNS_PRIORITY_DEFAULT_NORMAL;
- }
- }
-
- nm_assert(prio != 0);
- return prio;
-}
-
-static guint32
-_prop_get_ipvx_required_timeout(NMDevice *self, int addr_family)
-{
- NMConnection *connection;
- NMSettingIPConfig *s_ip;
- int timeout;
-
- nm_assert(NM_IS_DEVICE(self));
- nm_assert_addr_family(addr_family);
-
- connection = nm_device_get_applied_connection(self);
- if (!connection)
- return 0;
-
- s_ip = nm_connection_get_setting_ip_config(connection, addr_family);
- if (!s_ip)
- return 0;
-
- timeout = nm_setting_ip_config_get_required_timeout(s_ip);
- nm_assert(timeout >= -1);
-
- if (timeout > -1)
- return (guint32) timeout;
-
- return nm_config_data_get_connection_default_int64(
- NM_CONFIG_GET_DATA,
- NM_IS_IPv4(addr_family) ? NM_CON_DEFAULT("ipv4.required-timeout")
- : NM_CON_DEFAULT("ipv6.required-timeout"),
- self,
- 0,
- G_MAXINT32,
- 0);
-}
-
-static gboolean
-_prop_get_ipvx_may_fail(NMDevice *self, int addr_family)
-{
- NMConnection *connection;
- NMSettingIPConfig *s_ip = NULL;
-
- connection = nm_device_get_applied_connection(self);
- if (connection)
- s_ip = nm_connection_get_setting_ip_config(connection, addr_family);
-
- return !s_ip || nm_setting_ip_config_get_may_fail(s_ip);
-}
-
static gboolean
_prop_get_ipvx_may_fail_cached(NMDevice *self, int addr_family, NMTernary *cache)
{
- return _CACHED_BOOL(cache, _prop_get_ipvx_may_fail(self, addr_family));
+ return _CACHED_BOOL(cache, nm_device_prop_get_ipvx_may_fail(self, addr_family));
}
/**
@@ -1946,82 +1612,6 @@ out_good:
return iaid;
}
-static NMDhcpHostnameFlags
-_prop_get_ipvx_dhcp_hostname_flags(NMDevice *self, int addr_family)
-{
- NMConnection *connection;
- NMSettingIPConfig *s_ip;
- NMDhcpHostnameFlags flags;
- gs_free_error GError *error = NULL;
-
- g_return_val_if_fail(NM_IS_DEVICE(self), NM_DHCP_HOSTNAME_FLAG_NONE);
-
- connection = nm_device_get_applied_connection(self);
- s_ip = nm_connection_get_setting_ip_config(connection, addr_family);
- g_return_val_if_fail(s_ip, NM_DHCP_HOSTNAME_FLAG_NONE);
-
- if (!nm_setting_ip_config_get_dhcp_send_hostname(s_ip))
- return NM_DHCP_HOSTNAME_FLAG_NONE;
-
- flags = nm_setting_ip_config_get_dhcp_hostname_flags(s_ip);
- if (flags != NM_DHCP_HOSTNAME_FLAG_NONE)
- return flags;
-
- flags = nm_config_data_get_connection_default_int64(
- NM_CONFIG_GET_DATA,
- NM_IS_IPv4(addr_family) ? NM_CON_DEFAULT("ipv4.dhcp-hostname-flags")
- : NM_CON_DEFAULT("ipv6.dhcp-hostname-flags"),
- self,
- 0,
- NM_DHCP_HOSTNAME_FLAG_FQDN_CLEAR_FLAGS,
- 0);
-
- if (!_nm_utils_validate_dhcp_hostname_flags(flags, addr_family, &error)) {
- _LOGW(LOGD_DEVICE,
- "invalid global default value 0x%x for ipv%c.%s: %s",
- (guint) flags,
- nm_utils_addr_family_to_char(addr_family),
- NM_SETTING_IP_CONFIG_DHCP_HOSTNAME_FLAGS,
- error->message);
- flags = NM_DHCP_HOSTNAME_FLAG_NONE;
- }
-
- if (flags != NM_DHCP_HOSTNAME_FLAG_NONE)
- return flags;
-
- if (NM_IS_IPv4(addr_family))
- return NM_DHCP_HOSTNAME_FLAGS_FQDN_DEFAULT_IP4;
- else
- return NM_DHCP_HOSTNAME_FLAGS_FQDN_DEFAULT_IP6;
-}
-
-static const char *
-_prop_get_connection_mud_url(NMDevice *self, NMSettingConnection *s_con)
-{
- const char *mud_url;
- const char *s;
-
- mud_url = nm_setting_connection_get_mud_url(s_con);
-
- if (mud_url) {
- if (nm_streq(mud_url, NM_CONNECTION_MUD_URL_NONE))
- return NULL;
- return mud_url;
- }
-
- s = nm_config_data_get_connection_default(NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("connection.mud-url"),
- self);
- if (s) {
- if (nm_streq(s, NM_CONNECTION_MUD_URL_NONE))
- return NULL;
- if (nm_sd_http_url_is_valid_https(s))
- return s;
- }
-
- return NULL;
-}
-
static GBytes *
_prop_get_ipv4_dhcp_client_id(NMDevice *self,
NMConnection *connection,
@@ -2185,88 +1775,6 @@ out_good:
return result;
}
-static guint8
-_prop_get_ipv4_dhcp_dscp(NMDevice *self, gboolean *out_dscp_explicit)
-{
- gs_free_error GError *error = NULL;
- NMConnection *connection;
- NMSettingIPConfig *s_ip;
- const char *str;
-
- connection = nm_device_get_applied_connection(self);
- s_ip = nm_connection_get_setting_ip_config(connection, AF_INET);
- g_return_val_if_fail(s_ip, 0);
-
- NM_SET_OUT(out_dscp_explicit, TRUE);
-
- str = nm_setting_ip_config_get_dhcp_dscp(s_ip);
- if (str) {
- nm_assert(nm_utils_validate_dhcp_dscp(str, NULL));
- } else {
- str = nm_config_data_get_connection_default(NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("ipv4.dhcp-dscp"),
- self);
- if (!str || !str[0]) {
- str = "CS0";
- NM_SET_OUT(out_dscp_explicit, FALSE);
- } else if (!nm_utils_validate_dhcp_dscp(str, &error)) {
- _LOGW(LOGD_DEVICE,
- "invalid global default value '%s' for ipv4.%s: %s",
- str,
- NM_SETTING_IP_CONFIG_DHCP_DSCP,
- error->message);
- str = "CS0";
- NM_SET_OUT(out_dscp_explicit, FALSE);
- }
- }
-
- if (nm_streq(str, "CS0")) {
- return 0;
- } else if (nm_streq(str, "CS6")) {
- return 0x30;
- } else if (nm_streq(str, "CS4")) {
- return 0x20;
- };
-
- return nm_assert_unreachable_val(0);
-}
-
-static GBytes *
-_prop_get_ipv4_dhcp_vendor_class_identifier(NMDevice *self, NMSettingIP4Config *s_ip4)
-{
- gs_free char *to_free = NULL;
- const char *conn_prop;
- GBytes *bytes = NULL;
- const char *bin;
- gsize len;
-
- conn_prop = nm_setting_ip4_config_get_dhcp_vendor_class_identifier(s_ip4);
-
- if (!conn_prop) {
- /* set in NetworkManager.conf ? */
- conn_prop = nm_config_data_get_connection_default(
- NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("ipv4.dhcp-vendor-class-identifier"),
- self);
-
- if (conn_prop && !nm_utils_validate_dhcp4_vendor_class_id(conn_prop, NULL))
- conn_prop = NULL;
- }
-
- if (conn_prop) {
- bin = nm_utils_buf_utf8safe_unescape(conn_prop,
- NM_UTILS_STR_UTF8_SAFE_FLAG_NONE,
- &len,
- (gpointer *) &to_free);
- if (to_free)
- bytes = g_bytes_new_take(g_steal_pointer(&to_free), len);
- else
- bytes = g_bytes_new(bin, len);
- }
-
- return bytes;
-}
-
static NMSettingIP6ConfigPrivacy
_prop_get_ipv6_ip6_privacy(NMDevice *self)
{
@@ -2315,120 +1823,6 @@ _prop_get_ipv6_ip6_privacy(NMDevice *self)
return _ip6_privacy_clamp(ip6_privacy);
}
-static NMSettingIP6ConfigAddrGenMode
-_prop_get_ipv6_addr_gen_mode(NMDevice *self)
-{
- NMSettingIP6ConfigAddrGenMode addr_gen_mode;
- NMSettingIP6Config *s_ip6;
- gint64 c;
-
- g_return_val_if_fail(self, NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY);
-
- s_ip6 = nm_device_get_applied_setting(self, NM_TYPE_SETTING_IP6_CONFIG);
- if (s_ip6) {
- addr_gen_mode = nm_setting_ip6_config_get_addr_gen_mode(s_ip6);
- if (NM_IN_SET(addr_gen_mode,
- NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
- NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY))
- return addr_gen_mode;
- } else
- addr_gen_mode = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT;
-
- nm_assert(NM_IN_SET(addr_gen_mode,
- NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT_OR_EUI64,
- NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT));
-
- c = nm_config_data_get_connection_default_int64(NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("ipv6.addr-gen-mode"),
- self,
- NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
- NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT,
- -1);
- if (c != -1)
- addr_gen_mode = c;
-
- if (addr_gen_mode == NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT)
- addr_gen_mode = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY;
- else if (addr_gen_mode == NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_DEFAULT_OR_EUI64)
- addr_gen_mode = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64;
-
- nm_assert(NM_IN_SET(addr_gen_mode,
- NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
- NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY));
-
- return addr_gen_mode;
-}
-
-static const char *
-_prop_get_x_cloned_mac_address(NMDevice *self, NMConnection *connection, gboolean is_wifi)
-{
- NMSetting *setting;
- const char *addr = NULL;
-
- setting = nm_connection_get_setting(connection,
- is_wifi ? NM_TYPE_SETTING_WIRELESS : NM_TYPE_SETTING_WIRED);
- if (setting) {
- addr = is_wifi ? nm_setting_wireless_get_cloned_mac_address((NMSettingWireless *) setting)
- : nm_setting_wired_get_cloned_mac_address((NMSettingWired *) setting);
- }
-
- if (!addr) {
- const char *a;
-
- a = nm_config_data_get_connection_default(
- NM_CONFIG_GET_DATA,
- is_wifi ? NM_CON_DEFAULT("wifi.cloned-mac-address")
- : NM_CON_DEFAULT("ethernet.cloned-mac-address"),
- self);
-
- addr = NM_CLONED_MAC_PRESERVE;
-
- if (!a) {
- if (is_wifi) {
- NMSettingMacRandomization v;
-
- /* for backward compatibility, read the deprecated wifi.mac-address-randomization setting. */
- v = nm_config_data_get_connection_default_int64(
- NM_CONFIG_GET_DATA,
- NM_CON_DEFAULT("wifi.mac-address-randomization"),
- self,
- NM_SETTING_MAC_RANDOMIZATION_DEFAULT,
- NM_SETTING_MAC_RANDOMIZATION_ALWAYS,
- NM_SETTING_MAC_RANDOMIZATION_DEFAULT);
- if (v == NM_SETTING_MAC_RANDOMIZATION_ALWAYS)
- addr = NM_CLONED_MAC_RANDOM;
- }
- } else if (NM_CLONED_MAC_IS_SPECIAL(a, is_wifi) || nm_utils_hwaddr_valid(a, ETH_ALEN))
- addr = a;
- }
-
- return addr;
-}
-
-static const char *
-_prop_get_x_generate_mac_address_mask(NMDevice *self, NMConnection *connection, gboolean is_wifi)
-{
- NMSetting *setting;
- const char *value;
-
- setting = nm_connection_get_setting(connection,
- is_wifi ? NM_TYPE_SETTING_WIRELESS : NM_TYPE_SETTING_WIRED);
- if (setting) {
- value =
- is_wifi
- ? nm_setting_wireless_get_generate_mac_address_mask((NMSettingWireless *) setting)
- : nm_setting_wired_get_generate_mac_address_mask((NMSettingWired *) setting);
- if (value)
- return value;
- }
-
- return nm_config_data_get_connection_default(
- NM_CONFIG_GET_DATA,
- is_wifi ? NM_CON_DEFAULT("wifi.generate-mac-address-mask")
- : NM_CON_DEFAULT("ethernet.generate-mac-address-mask"),
- self);
-}
-
/*****************************************************************************/
static void
@@ -3241,11 +2635,11 @@ nm_device_create_l3_config_data_from_connection(NMDevice *self, NMConnection *co
l3cd =
nm_l3_config_data_new_from_connection(nm_device_get_multi_index(self), ifindex, connection);
- nm_l3_config_data_set_mdns(l3cd, _prop_get_connection_mdns(self));
- nm_l3_config_data_set_llmnr(l3cd, _prop_get_connection_llmnr(self));
- nm_l3_config_data_set_dns_over_tls(l3cd, _prop_get_connection_dns_over_tls(self));
+ nm_l3_config_data_set_mdns(l3cd, nm_device_prop_get_connection_mdns(self));
+ nm_l3_config_data_set_llmnr(l3cd, nm_device_prop_get_connection_llmnr(self));
+ nm_l3_config_data_set_dns_over_tls(l3cd, nm_device_prop_get_connection_dns_over_tls(self));
nm_l3_config_data_set_ip6_privacy(l3cd, _prop_get_ipv6_ip6_privacy(self));
- nm_l3_config_data_set_mptcp_flags(l3cd, _prop_get_connection_mptcp_flags(self));
+ nm_l3_config_data_set_mptcp_flags(l3cd, nm_device_prop_get_connection_mptcp_flags(self));
return l3cd;
}
@@ -3569,7 +2963,7 @@ _dev_ip_state_req_timeout_schedule(NMDevice *self, int addr_family)
nm_assert(!priv->ip_data_x[IS_IPv4].req_timeout_source);
- timeout_msec = _prop_get_ipvx_required_timeout(self, addr_family);
+ timeout_msec = nm_device_prop_get_ipvx_required_timeout(self, addr_family);
if (timeout_msec == 0) {
_LOGD_ip(addr_family, "required-timeout: disabled");
return;
@@ -4158,7 +3552,7 @@ _dev_l3_get_config_settings(NMDevice *self,
case L3_CONFIG_DATA_TYPE_AC_6:
case L3_CONFIG_DATA_TYPE_DHCP_6:
case L3_CONFIG_DATA_TYPE_DEVIP_6:
- *out_acd_timeout_msec = _prop_get_ipv4_dad_timeout(self);
+ *out_acd_timeout_msec = nm_device_prop_get_ipv4_dad_timeout(self);
goto after_acd_timeout;
case L3_CONFIG_DATA_TYPE_DHCP_4:
@@ -4253,8 +3647,8 @@ _dev_l3_register_l3cds_add_config(NMDevice *self, L3ConfigDataType l3cd_type)
nm_device_get_route_metric(self, AF_INET6),
_dev_default_route_metric_penalty_get(self, AF_INET),
_dev_default_route_metric_penalty_get(self, AF_INET6),
- _prop_get_ipvx_dns_priority(self, AF_INET),
- _prop_get_ipvx_dns_priority(self, AF_INET6),
+ nm_device_prop_get_ipvx_dns_priority(self, AF_INET),
+ nm_device_prop_get_ipvx_dns_priority(self, AF_INET6),
acd_defend_type,
acd_timeout_msec,
NM_L3CFG_CONFIG_FLAGS_NONE,
@@ -10150,7 +9544,7 @@ lldp_setup(NMDevice *self, NMTernary enabled)
if (ifindex <= 0)
enabled = FALSE;
else if (enabled == NM_TERNARY_DEFAULT)
- enabled = _prop_get_connection_lldp(self);
+ enabled = nm_device_prop_get_connection_lldp(self);
if (priv->lldp_listener) {
if (!enabled || nm_lldp_listener_get_ifindex(priv->lldp_listener) != ifindex) {
@@ -10525,7 +9919,7 @@ _dev_ipll4_start(NMDevice *self)
_dev_ipllx_set_state(self, AF_INET, NM_DEVICE_IP_STATE_PENDING);
- timeout_msec = _prop_get_ipv4_dad_timeout(self);
+ timeout_msec = nm_device_prop_get_ipv4_dad_timeout(self);
if (timeout_msec == 0)
timeout_msec = NM_ACD_TIMEOUT_RFC5227_MSEC;
@@ -10999,7 +10393,6 @@ _dev_ipdhcpx_start(NMDevice *self, int addr_family)
const int IS_IPv4 = NM_IS_IPv4(addr_family);
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self);
NMConnection *connection;
- NMSettingConnection *s_con;
NMSettingIPConfig *s_ip;
const NML3ConfigData *previous_lease;
gs_unref_bytes GBytes *hwaddr = NULL;
@@ -11033,9 +10426,7 @@ _dev_ipdhcpx_start(NMDevice *self, int addr_family)
goto out_fail;
}
- s_con = nm_connection_get_setting_connection(connection);
- s_ip = nm_connection_get_setting_ip_config(connection, addr_family);
- nm_assert(s_con);
+ s_ip = nm_connection_get_setting_ip_config(connection, addr_family);
nm_assert(s_ip);
ifindex = 0;
@@ -11088,10 +10479,10 @@ _dev_ipdhcpx_start(NMDevice *self, int addr_family)
gboolean dscp_explicit = FALSE;
client_id = _prop_get_ipv4_dhcp_client_id(self, connection, hwaddr, &send_client_id);
- dscp = _prop_get_ipv4_dhcp_dscp(self, &dscp_explicit);
+ dscp = nm_device_prop_get_ipv4_dhcp_dscp(self, &dscp_explicit);
vendor_class_identifier =
- _prop_get_ipv4_dhcp_vendor_class_identifier(self, NM_SETTING_IP4_CONFIG(s_ip));
+ nm_device_prop_get_ipv4_dhcp_vendor_class_identifier(self, NM_SETTING_IP4_CONFIG(s_ip));
reject_servers = nm_setting_ip_config_get_dhcp_reject_servers(s_ip, NULL);
bcast_hwaddr = nmp_link_address_get_as_bytes(&pllink->l_broadcast);
@@ -11114,9 +10505,9 @@ _dev_ipdhcpx_start(NMDevice *self, int addr_family)
.bcast_hwaddr = bcast_hwaddr,
.send_hostname = nm_setting_ip_config_get_dhcp_send_hostname(s_ip),
.hostname = hostname,
- .hostname_flags = _prop_get_ipvx_dhcp_hostname_flags(self, AF_INET),
+ .hostname_flags = nm_device_prop_get_ipvx_dhcp_hostname_flags(self, AF_INET),
.client_id = client_id,
- .mud_url = _prop_get_connection_mud_url(self, s_con),
+ .mud_url = nm_device_prop_get_connection_mud_url(self),
.timeout = no_lease_timeout_sec,
.anycast_address = _device_get_dhcp_anycast_address(self),
.vendor_class_identifier = vendor_class_identifier,
@@ -11125,7 +10516,7 @@ _dev_ipdhcpx_start(NMDevice *self, int addr_family)
.v4 =
{
.request_broadcast = request_broadcast,
- .acd_timeout_msec = _prop_get_ipv4_dad_timeout(self),
+ .acd_timeout_msec = nm_device_prop_get_ipv4_dad_timeout(self),
.send_client_id = send_client_id,
.dscp = dscp,
.dscp_explicit = dscp_explicit,
@@ -11153,9 +10544,9 @@ _dev_ipdhcpx_start(NMDevice *self, int addr_family)
.uuid = nm_connection_get_uuid(connection),
.send_hostname = nm_setting_ip_config_get_dhcp_send_hostname(s_ip),
.hostname = nm_setting_ip_config_get_dhcp_hostname(s_ip),
- .hostname_flags = _prop_get_ipvx_dhcp_hostname_flags(self, AF_INET6),
+ .hostname_flags = nm_device_prop_get_ipvx_dhcp_hostname_flags(self, AF_INET6),
.client_id = duid,
- .mud_url = _prop_get_connection_mud_url(self, s_con),
+ .mud_url = nm_device_prop_get_connection_mud_url(self),
.timeout = no_lease_timeout_sec,
.anycast_address = _device_get_dhcp_anycast_address(self),
.v6 =
@@ -11633,7 +11024,8 @@ _dev_ipll6_start(NMDevice *self)
assume = nm_device_sys_iface_state_is_external_or_assume(self);
- if (_prop_get_ipv6_addr_gen_mode(self) == NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY) {
+ if (nm_device_prop_get_ipv6_addr_gen_mode(self)
+ == NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY) {
NMUtilsStableType stable_type;
const char *stable_id;
@@ -12304,7 +11696,7 @@ _dev_ipac6_start(NMDevice *self)
if (node_type == NM_NDISC_NODE_TYPE_ROUTER)
ra_timeout = 0u;
else {
- ra_timeout = _prop_get_ipv6_ra_timeout(self);
+ ra_timeout = nm_device_prop_get_ipv6_ra_timeout(self);
if (ra_timeout == 0u)
ra_timeout = default_ra_timeout;
}
@@ -12317,7 +11709,7 @@ _dev_ipac6_start(NMDevice *self)
.ifname = nm_device_get_ip_iface(self),
.stable_type = stable_type,
.network_id = stable_id,
- .addr_gen_mode = _prop_get_ipv6_addr_gen_mode(self),
+ .addr_gen_mode = nm_device_prop_get_ipv6_addr_gen_mode(self),
.node_type = node_type,
.max_addresses = max_addresses,
.router_solicitations = router_solicitations,
@@ -12618,7 +12010,7 @@ activate_stage3_ip_config_for_addr_family(NMDevice *self, int addr_family, const
goto out_devip;
if (IS_IPv4) {
- if (_prop_get_ipv4_link_local(self) == NM_SETTING_IP4_LL_ENABLED)
+ if (nm_device_prop_get_ipv4_link_local(self) == NM_SETTING_IP4_LL_ENABLED)
_dev_ipll4_start(self);
if (nm_streq(method, NM_SETTING_IP4_CONFIG_METHOD_AUTO))
@@ -17522,7 +16914,7 @@ _hw_addr_get_cloned(NMDevice *self,
if (!connection)
g_return_val_if_reached(FALSE);
- addr_setting = _prop_get_x_cloned_mac_address(self, connection, is_wifi);
+ addr_setting = nm_device_prop_get_x_cloned_mac_address(self, connection, is_wifi);
addr = addr_setting;
@@ -17564,7 +16956,7 @@ _hw_addr_get_cloned(NMDevice *self,
}
hw_addr_generated = nm_utils_hw_addr_gen_random_eth(
nm_device_get_initial_hw_address(self),
- _prop_get_x_generate_mac_address_mask(self, connection, is_wifi));
+ nm_device_prop_get_x_generate_mac_address_mask(self, connection, is_wifi));
if (!hw_addr_generated) {
g_set_error(error,
NM_DEVICE_ERROR,
@@ -17616,7 +17008,7 @@ _hw_addr_get_cloned(NMDevice *self,
stable_id,
nm_device_get_ip_iface(self),
nm_device_get_initial_hw_address(self),
- _prop_get_x_generate_mac_address_mask(self, connection, is_wifi));
+ nm_device_prop_get_x_generate_mac_address_mask(self, connection, is_wifi));
if (!hw_addr_generated) {
g_set_error(error,
NM_DEVICE_ERROR,