summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2023-06-12 16:34:40 +0200
committerThomas Haller <thaller@redhat.com>2023-06-14 11:15:46 +0200
commit2b09512481d6553631d6c9f43d84e9accaa3ebe1 (patch)
tree309108a4109815352c8d48ff73425d35ecbc1003
parent13690f445aff140b44c4c7f83ae5eb78e3f547fb (diff)
core: add nm_config_data_get_ignore_carrier_for_port() helper
Will be used later.
-rw-r--r--src/core/nm-config-data.c54
-rw-r--r--src/core/nm-config-data.h4
2 files changed, 58 insertions, 0 deletions
diff --git a/src/core/nm-config-data.c b/src/core/nm-config-data.c
index 2fa49ae7aa..fe21308005 100644
--- a/src/core/nm-config-data.c
+++ b/src/core/nm-config-data.c
@@ -130,6 +130,12 @@ G_DEFINE_TYPE(NMConfigData, nm_config_data, G_TYPE_OBJECT)
static const char *
_match_section_info_get_str(const MatchSectionInfo *m, GKeyFile *keyfile, const char *property);
+static const char *_config_data_get_device_config(const NMConfigData *self,
+ const char *property,
+ const NMMatchSpecDeviceData *match_data,
+ NMDevice *device,
+ gboolean *has_match);
+
/*****************************************************************************/
const char *
@@ -366,6 +372,54 @@ nm_config_data_get_iwd_config_path(const NMConfigData *self)
}
gboolean
+nm_config_data_get_ignore_carrier_for_port(const NMConfigData *self,
+ const char *master,
+ const char *slave_type)
+{
+ const char *value;
+ gboolean has_match;
+ int m;
+ NMMatchSpecDeviceData match_data;
+
+ g_return_val_if_fail(NM_IS_CONFIG_DATA(self), FALSE);
+
+ if (!master || !slave_type)
+ goto out_default;
+
+ if (!nm_utils_ifname_valid_kernel(master, NULL))
+ goto out_default;
+
+ match_data = (NMMatchSpecDeviceData){
+ .interface_name = master,
+ .device_type = slave_type,
+ };
+
+ value = _config_data_get_device_config(self,
+ NM_CONFIG_KEYFILE_KEY_DEVICE_IGNORE_CARRIER,
+ &match_data,
+ NULL,
+ &has_match);
+ if (has_match)
+ m = nm_config_parse_boolean(value, -1);
+ else {
+ NMMatchSpecMatchType x;
+
+ x = nm_match_spec_device(NM_CONFIG_DATA_GET_PRIVATE(self)->ignore_carrier, &match_data);
+ m = nm_match_spec_match_type_to_bool(x, -1);
+ }
+
+ if (NM_IN_SET(m, TRUE, FALSE))
+ return m;
+
+out_default:
+ /* if ignore-carrier is not explicitly or detected for the master, then we assume it's
+ * enabled. This is in line with nm_config_data_get_ignore_carrier_by_device(), where
+ * ignore-carrier is enabled based on nm_device_ignore_carrier_by_default().
+ */
+ return TRUE;
+}
+
+gboolean
nm_config_data_get_ignore_carrier_by_device(const NMConfigData *self, NMDevice *device)
{
const char *value;
diff --git a/src/core/nm-config-data.h b/src/core/nm-config-data.h
index acc968d69a..9e7a50fc24 100644
--- a/src/core/nm-config-data.h
+++ b/src/core/nm-config-data.h
@@ -185,6 +185,10 @@ const char *nm_config_data_get_dns_mode(const NMConfigData *self);
const char *nm_config_data_get_rc_manager(const NMConfigData *self);
gboolean nm_config_data_get_systemd_resolved(const NMConfigData *self);
+gboolean nm_config_data_get_ignore_carrier_for_port(const NMConfigData *self,
+ const char *master,
+ const char *slave_type);
+
gboolean nm_config_data_get_ignore_carrier_by_device(const NMConfigData *self, NMDevice *device);
gboolean nm_config_data_get_assume_ipv6ll_only(const NMConfigData *self, NMDevice *device);
int nm_config_data_get_sriov_num_vfs(const NMConfigData *self, NMDevice *device);