summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2015-03-26 08:57:02 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2015-05-13 17:15:34 +0200
commit019943bb5d9efea52392610b207dececafa6fdb3 (patch)
treec3225902f9220e333540d407da8750a5a75fb0ad
parentf628d0ad5a7b6cd2d6dd084704fac294826be784 (diff)
downloadNetworkManager-019943bb5d9efea52392610b207dececafa6fdb3.tar.gz
libnm-core: add dns-options property to NMSettingIPConfig
-rw-r--r--libnm-core/nm-setting-ip-config.c227
-rw-r--r--libnm-core/nm-setting-ip-config.h37
-rw-r--r--libnm-core/nm-utils-private.h6
-rw-r--r--libnm-core/nm-utils.c127
-rw-r--r--libnm-core/tests/test-general.c8
-rw-r--r--libnm/libnm.ver6
6 files changed, 411 insertions, 0 deletions
diff --git a/libnm-core/nm-setting-ip-config.c b/libnm-core/nm-setting-ip-config.c
index a01f4409d1..0b20293ec5 100644
--- a/libnm-core/nm-setting-ip-config.c
+++ b/libnm-core/nm-setting-ip-config.c
@@ -46,6 +46,24 @@
* related to IP addressing, routing, and Domain Name Service.
**/
+const DNSOptionDesc dns_option_descs[] = {
+ { NM_SETTING_DNS_OPTION_DEBUG, FALSE, FALSE },
+ { NM_SETTING_DNS_OPTION_NDOTS, TRUE, FALSE },
+ { NM_SETTING_DNS_OPTION_TIMEOUT, TRUE, FALSE },
+ { NM_SETTING_DNS_OPTION_ATTEMPTS, TRUE, FALSE },
+ { NM_SETTING_DNS_OPTION_ROTATE, FALSE, FALSE },
+ { NM_SETTING_DNS_OPTION_NO_CHECK_NAMES, FALSE, FALSE },
+ { NM_SETTING_DNS_OPTION_INET6, FALSE, TRUE },
+ { NM_SETTING_DNS_OPTION_IP6_BYTESTRING, FALSE, TRUE },
+ { NM_SETTING_DNS_OPTION_IP6_DOTINT, FALSE, TRUE },
+ { NM_SETTING_DNS_OPTION_NO_IP6_DOTINT, FALSE, TRUE },
+ { NM_SETTING_DNS_OPTION_EDNS0, FALSE, FALSE },
+ { NM_SETTING_DNS_OPTION_SINGLE_REQUEST, FALSE, FALSE },
+ { NM_SETTING_DNS_OPTION_SINGLE_REQUEST_REOPEN, FALSE, FALSE },
+ { NM_SETTING_DNS_OPTION_NO_TLD_QUERY, FALSE, FALSE },
+ { NULL, FALSE, FALSE }
+};
+
static char *
canonicalize_ip (int family, const char *ip, gboolean null_any)
{
@@ -1062,6 +1080,7 @@ typedef struct {
char *method;
GPtrArray *dns; /* array of IP address strings */
GPtrArray *dns_search; /* array of domain name strings */
+ GPtrArray *dns_options;/* array of DNS options */
GPtrArray *addresses; /* array of NMIPAddress */
GPtrArray *routes; /* array of NMIPRoute */
gint64 route_metric;
@@ -1079,6 +1098,7 @@ enum {
PROP_METHOD,
PROP_DNS,
PROP_DNS_SEARCH,
+ PROP_DNS_OPTIONS,
PROP_ADDRESSES,
PROP_GATEWAY,
PROP_ROUTES,
@@ -1394,6 +1414,182 @@ nm_setting_ip_config_clear_dns_searches (NMSettingIPConfig *setting)
}
/**
+ * nm_setting_ip_config_get_num_dns_options:
+ * @setting: the #NMSettingIPConfig
+ *
+ * Returns: the number of configured DNS options
+ *
+ * Since: 1.2
+ **/
+guint
+nm_setting_ip_config_get_num_dns_options (NMSettingIPConfig *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_IP_CONFIG (setting), 0);
+
+ return NM_SETTING_IP_CONFIG_GET_PRIVATE (setting)->dns_options->len;
+}
+
+/**
+ * nm_setting_ip_config_get_dns_option:
+ * @setting: the #NMSettingIPConfig
+ * @i: index number of the DNS option
+ *
+ * Returns: the DNS option at index @i
+ *
+ * Since: 1.2
+ **/
+const char *
+nm_setting_ip_config_get_dns_option (NMSettingIPConfig *setting, guint i)
+{
+ NMSettingIPConfigPrivate *priv;
+
+ g_return_val_if_fail (NM_IS_SETTING_IP_CONFIG (setting), NULL);
+
+ priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting);
+ g_return_val_if_fail (i < priv->dns_options->len, NULL);
+
+ return priv->dns_options->pdata[i];
+}
+
+/**
+ * nm_setting_ip_config_next_valid_dns_option
+ * @setting: the #NMSettingIPConfig
+ * @i: index to start the search from
+ *
+ * Returns: the index, greater or equal than @i, of the first valid
+ * DNS option, or -1 if no valid option is found
+ *
+ * Since: 1.2
+ **/
+gint
+nm_setting_ip_config_next_valid_dns_option (NMSettingIPConfig *setting, guint i)
+{
+ NMSettingIPConfigPrivate *priv;
+
+ g_return_val_if_fail (NM_IS_SETTING_IP_CONFIG (setting), -1);
+
+ priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting);
+
+ for (; i < priv->dns_options->len; i++) {
+ if (_nm_utils_dns_option_validate (priv->dns_options->pdata[i], NULL, NULL,
+ NM_IS_SETTING_IP6_CONFIG (setting),
+ dns_option_descs))
+ return i;
+ }
+
+ return -1;
+}
+
+/**
+ * nm_setting_ip_config_add_dns_option:
+ * @setting: the #NMSettingIPConfig
+ * @dns_option: the DNS option to add
+ *
+ * Adds a new DNS option to the setting.
+ *
+ * Returns: %TRUE if the DNS option was added; %FALSE otherwise
+ *
+ * Since: 1.2
+ **/
+gboolean
+nm_setting_ip_config_add_dns_option (NMSettingIPConfig *setting,
+ const char *dns_option)
+{
+ NMSettingIPConfigPrivate *priv;
+
+ g_return_val_if_fail (NM_IS_SETTING_IP_CONFIG (setting), FALSE);
+ g_return_val_if_fail (dns_option != NULL, FALSE);
+ g_return_val_if_fail (dns_option[0] != '\0', FALSE);
+
+ if (!_nm_utils_dns_option_validate (dns_option, NULL, NULL, FALSE, NULL))
+ return FALSE;
+
+ priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting);
+ if (_nm_utils_dns_option_find_idx (priv->dns_options, dns_option) >= 0)
+ return FALSE;
+
+ g_ptr_array_add (priv->dns_options, g_strdup (dns_option));
+ g_object_notify (G_OBJECT (setting), NM_SETTING_IP_CONFIG_DNS_OPTIONS);
+ return TRUE;
+}
+
+/**
+ * nm_setting_ip_config_remove_dns_option:
+ * @setting: the #NMSettingIPConfig
+ * @i: index number of the DNS option
+ *
+ * Removes the DNS option at index @i.
+ *
+ * Since: 1.2
+ **/
+void
+nm_setting_ip_config_remove_dns_option (NMSettingIPConfig *setting, int i)
+{
+ NMSettingIPConfigPrivate *priv;
+
+ g_return_if_fail (NM_IS_SETTING_IP_CONFIG (setting));
+
+ priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting);
+ g_return_if_fail (i < priv->dns_options->len);
+
+ g_ptr_array_remove_index (priv->dns_options, i);
+ g_object_notify (G_OBJECT (setting), NM_SETTING_IP_CONFIG_DNS_OPTIONS);
+}
+
+/**
+ * nm_setting_ip_config_remove_dns_option_by_value:
+ * @setting: the #NMSettingIPConfig
+ * @dns_option: the DNS option to remove
+ *
+ * Removes the DNS option @dns_option.
+ *
+ * Returns: %TRUE if the DNS option was found and removed; %FALSE if it was not.
+ *
+ * Since: 1.2
+ **/
+gboolean
+nm_setting_ip_config_remove_dns_option_by_value (NMSettingIPConfig *setting,
+ const char *dns_option)
+{
+ NMSettingIPConfigPrivate *priv;
+ int i;
+
+ g_return_val_if_fail (NM_IS_SETTING_IP_CONFIG (setting), FALSE);
+ g_return_val_if_fail (dns_option != NULL, FALSE);
+ g_return_val_if_fail (dns_option[0] != '\0', FALSE);
+
+ priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting);
+ i = _nm_utils_dns_option_find_idx (priv->dns_options, dns_option);
+ if (i >= 0) {
+ g_ptr_array_remove_index (priv->dns_options, i);
+ g_object_notify (G_OBJECT (setting), NM_SETTING_IP_CONFIG_DNS_OPTIONS);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * nm_setting_ip_config_clear_dns_options:
+ * @setting: the #NMSettingIPConfig
+ *
+ * Removes all configured DNS options.
+ *
+ * Since: 1.2
+ **/
+void
+nm_setting_ip_config_clear_dns_options (NMSettingIPConfig *setting)
+{
+ NMSettingIPConfigPrivate *priv;
+
+ g_return_if_fail (NM_IS_SETTING_IP_CONFIG (setting));
+
+ priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting);
+ g_ptr_array_set_size (priv->dns_options, 0);
+ g_object_notify (G_OBJECT (setting), NM_SETTING_IP_CONFIG_DNS_OPTIONS);
+}
+
+/**
* nm_setting_ip_config_get_num_addresses:
* @setting: the #NMSettingIPConfig
*
@@ -1959,6 +2155,7 @@ nm_setting_ip_config_init (NMSettingIPConfig *setting)
priv->dns = g_ptr_array_new_with_free_func (g_free);
priv->dns_search = g_ptr_array_new_with_free_func (g_free);
+ priv->dns_options = g_ptr_array_new_with_free_func (g_free);
priv->addresses = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_address_unref);
priv->routes = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_route_unref);
}
@@ -1975,6 +2172,7 @@ finalize (GObject *object)
g_ptr_array_unref (priv->dns);
g_ptr_array_unref (priv->dns_search);
+ g_ptr_array_unref (priv->dns_options);
g_ptr_array_unref (priv->addresses);
g_ptr_array_unref (priv->routes);
@@ -1988,6 +2186,8 @@ set_property (GObject *object, guint prop_id,
NMSettingIPConfig *setting = NM_SETTING_IP_CONFIG (object);
NMSettingIPConfigPrivate *priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting);
const char *gateway;
+ char **strv;
+ int i;
switch (prop_id) {
case PROP_METHOD:
@@ -2002,6 +2202,16 @@ set_property (GObject *object, guint prop_id,
g_ptr_array_unref (priv->dns_search);
priv->dns_search = _nm_utils_strv_to_ptrarray (g_value_get_boxed (value));
break;
+ case PROP_DNS_OPTIONS:
+ strv = g_value_get_boxed (value);
+ g_ptr_array_unref (priv->dns_options);
+ priv->dns_options = g_ptr_array_new_with_free_func (g_free);
+ for (i = 0; strv && strv[i]; i++) {
+ if ( _nm_utils_dns_option_validate (strv[i], NULL, NULL, FALSE, NULL)
+ && _nm_utils_dns_option_find_idx (priv->dns_options, strv[i]) < 0)
+ g_ptr_array_add (priv->dns_options, g_strdup (strv[i]));
+ }
+ break;
case PROP_ADDRESSES:
g_ptr_array_unref (priv->addresses);
priv->addresses = _nm_utils_copy_array (g_value_get_boxed (value),
@@ -2065,6 +2275,9 @@ get_property (GObject *object, guint prop_id,
case PROP_DNS_SEARCH:
g_value_take_boxed (value, _nm_utils_ptrarray_to_strv (priv->dns_search));
break;
+ case PROP_DNS_OPTIONS:
+ g_value_take_boxed (value, _nm_utils_ptrarray_to_strv (priv->dns_options));
+ break;
case PROP_ADDRESSES:
g_value_take_boxed (value, _nm_utils_copy_array (priv->addresses,
(NMUtilsCopyFunc) nm_ip_address_dup,
@@ -2185,6 +2398,20 @@ nm_setting_ip_config_class_init (NMSettingIPConfigClass *setting_class)
G_PARAM_STATIC_STRINGS));
/**
+ * NMSettingIPConfig:dns-options:
+ *
+ * Array of DNS options.
+ *
+ * Since: 1.2
+ **/
+ g_object_class_install_property
+ (object_class, PROP_DNS_OPTIONS,
+ g_param_spec_boxed (NM_SETTING_IP_CONFIG_DNS_OPTIONS, "", "",
+ G_TYPE_STRV,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
* NMSettingIPConfig:addresses:
*
* Array of IP addresses.
diff --git a/libnm-core/nm-setting-ip-config.h b/libnm-core/nm-setting-ip-config.h
index 12763fa857..6fa51aecb0 100644
--- a/libnm-core/nm-setting-ip-config.h
+++ b/libnm-core/nm-setting-ip-config.h
@@ -133,6 +133,7 @@ void nm_ip_route_set_attribute (NMIPRoute *route,
#define NM_SETTING_IP_CONFIG_METHOD "method"
#define NM_SETTING_IP_CONFIG_DNS "dns"
#define NM_SETTING_IP_CONFIG_DNS_SEARCH "dns-search"
+#define NM_SETTING_IP_CONFIG_DNS_OPTIONS "dns-options"
#define NM_SETTING_IP_CONFIG_ADDRESSES "addresses"
#define NM_SETTING_IP_CONFIG_GATEWAY "gateway"
#define NM_SETTING_IP_CONFIG_ROUTES "routes"
@@ -144,6 +145,29 @@ void nm_ip_route_set_attribute (NMIPRoute *route,
#define NM_SETTING_IP_CONFIG_NEVER_DEFAULT "never-default"
#define NM_SETTING_IP_CONFIG_MAY_FAIL "may-fail"
+typedef struct {
+ const char *name;
+ gboolean numeric;
+ gboolean ipv6_only;
+} DNSOptionDesc;
+
+extern const DNSOptionDesc dns_option_descs[];
+
+#define NM_SETTING_DNS_OPTION_DEBUG "debug"
+#define NM_SETTING_DNS_OPTION_NDOTS "ndots"
+#define NM_SETTING_DNS_OPTION_TIMEOUT "timeout"
+#define NM_SETTING_DNS_OPTION_ATTEMPTS "attempts"
+#define NM_SETTING_DNS_OPTION_ROTATE "rotate"
+#define NM_SETTING_DNS_OPTION_NO_CHECK_NAMES "no-check-names"
+#define NM_SETTING_DNS_OPTION_INET6 "inet6"
+#define NM_SETTING_DNS_OPTION_IP6_BYTESTRING "ip6-bytestring"
+#define NM_SETTING_DNS_OPTION_IP6_DOTINT "ip6-dotint"
+#define NM_SETTING_DNS_OPTION_NO_IP6_DOTINT "no-ip6-dotint"
+#define NM_SETTING_DNS_OPTION_EDNS0 "edns0"
+#define NM_SETTING_DNS_OPTION_SINGLE_REQUEST "single-request"
+#define NM_SETTING_DNS_OPTION_SINGLE_REQUEST_REOPEN "single-request-reopen"
+#define NM_SETTING_DNS_OPTION_NO_TLD_QUERY "no-tld-query"
+
struct _NMSettingIPConfig {
NMSetting parent;
};
@@ -181,6 +205,19 @@ gboolean nm_setting_ip_config_remove_dns_search_by_value (NMSettingIPConfig
const char *dns_search);
void nm_setting_ip_config_clear_dns_searches (NMSettingIPConfig *setting);
+guint nm_setting_ip_config_get_num_dns_options (NMSettingIPConfig *setting);
+const char *nm_setting_ip_config_get_dns_option (NMSettingIPConfig *setting,
+ guint i);
+gint nm_setting_ip_config_next_valid_dns_option (NMSettingIPConfig *setting,
+ guint i);
+gboolean nm_setting_ip_config_add_dns_option (NMSettingIPConfig *setting,
+ const char *dns_option);
+void nm_setting_ip_config_remove_dns_option (NMSettingIPConfig *setting,
+ int i);
+gboolean nm_setting_ip_config_remove_dns_option_by_value (NMSettingIPConfig *setting,
+ const char *dns_option);
+void nm_setting_ip_config_clear_dns_options (NMSettingIPConfig *setting);
+
guint nm_setting_ip_config_get_num_addresses (NMSettingIPConfig *setting);
NMIPAddress *nm_setting_ip_config_get_address (NMSettingIPConfig *setting,
int i);
diff --git a/libnm-core/nm-utils-private.h b/libnm-core/nm-utils-private.h
index 3854d67951..74e48dbee1 100644
--- a/libnm-core/nm-utils-private.h
+++ b/libnm-core/nm-utils-private.h
@@ -22,10 +22,16 @@
#define __NM_UTILS_PRIVATE_H__
#include "nm-setting-private.h"
+#include "nm-setting-ip-config.h"
gboolean _nm_utils_string_slist_validate (GSList *list,
const char **valid_values);
+gboolean _nm_utils_dns_option_validate (const char *option, char **out_name,
+ long *out_value, gboolean ipv6,
+ const DNSOptionDesc *option_descs);
+int _nm_utils_dns_option_find_idx (GPtrArray *array, const char *option);
+
/* D-Bus transform funcs */
GVariant * _nm_utils_hwaddr_to_dbus (const GValue *prop_value);
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c
index 80fed00e9f..ad71e95b30 100644
--- a/libnm-core/nm-utils.c
+++ b/libnm-core/nm-utils.c
@@ -3404,3 +3404,130 @@ _nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 ma
return v;
}
+static gboolean
+validate_dns_option (const char *name, gboolean numeric, gboolean ipv6,
+ const DNSOptionDesc *option_descs)
+{
+ const DNSOptionDesc *desc;
+
+ if (!option_descs)
+ return !!*name;
+
+ for (desc = option_descs; desc->name; desc++) {
+ if (!strcmp (name, desc->name) &&
+ numeric == desc->numeric &&
+ (!desc->ipv6_only || ipv6))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * _nm_utils_dns_option_validate
+ * @option: option string
+ * @out_name: (out) (allow-none) the option name
+ * @out_value: (out) (allow-none) the option value
+ * @ipv6: whether the option refers to a IPv6 configuration
+ * @option_descs: (allow-none) an array of DNSOptionDesc which describes the
+ * valid options
+ *
+ * Parses a DNS option in the form "name" or "name:number" and, if
+ * @option_descs is not NULL, checks that the option conforms to one
+ * of the provided descriptors. If @option_descs is NULL @ipv6 is
+ * not considered.
+ *
+ * Returns: %TRUE when the parsing was successful and the option is valid,
+ * %FALSE otherwise
+ */
+gboolean
+_nm_utils_dns_option_validate (const char *option, char **out_name,
+ long *out_value, gboolean ipv6,
+ const DNSOptionDesc *option_descs)
+{
+ char **tokens, *ptr;
+ gboolean ret = FALSE;
+
+ g_return_val_if_fail (option != NULL, FALSE);
+
+ if (out_name)
+ *out_name = NULL;
+ if (out_value)
+ *out_value = -1;
+
+ if (!option[0])
+ return FALSE;
+
+ tokens = g_strsplit (option, ":", 2);
+
+ if (g_strv_length (tokens) == 1) {
+ ret = validate_dns_option (tokens[0], FALSE, ipv6, option_descs);
+ if (ret && out_name)
+ *out_name = g_strdup (tokens[0]);
+ goto out;
+ }
+
+ if (!tokens[1][0]) {
+ ret = FALSE;
+ goto out;
+ }
+
+ for (ptr = tokens[1]; *ptr; ptr++) {
+ if (!g_ascii_isdigit (*ptr)) {
+ ret = FALSE;
+ goto out;
+ }
+ }
+
+ ret = FALSE;
+ if (validate_dns_option (tokens[0], TRUE, ipv6, option_descs)) {
+ int value = _nm_utils_ascii_str_to_int64 (tokens[1], 10, 0, G_MAXINT32, -1);
+ if (value >= 0) {
+ if (out_name)
+ *out_name = g_strdup (tokens[0]);
+ if (out_value)
+ *out_value = value;
+ ret = TRUE;
+ }
+ }
+out:
+ g_strfreev (tokens);
+ return ret;
+}
+
+/**
+ * _nm_utils_dns_option_find_idx
+ * @array: an array of strings
+ * @option: a dns option string
+ *
+ * Searches for an option in an array of strings. The match is
+ * performed only the option name; the option value is ignored.
+ *
+ * Returns: the index of the option in the array or -1 if was not
+ * found.
+ */
+int _nm_utils_dns_option_find_idx (GPtrArray *array, const char *option)
+{
+ gboolean ret;
+ char *option_name, *tmp_name;
+ int i;
+
+ if (!_nm_utils_dns_option_validate (option, &option_name, NULL, FALSE, NULL))
+ return -1;
+
+ for (i = 0; i < array->len; i++) {
+ if (_nm_utils_dns_option_validate (array->pdata[i], &tmp_name, NULL, FALSE, NULL)) {
+ ret = strcmp (tmp_name, option_name);
+ g_free (tmp_name);
+ if (!ret) {
+ g_free (option_name);
+ return i;
+ }
+ }
+
+ }
+
+ g_free (option_name);
+ return -1;
+}
+
diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c
index a417d3fe31..f56a95c697 100644
--- a/libnm-core/tests/test-general.c
+++ b/libnm-core/tests/test-general.c
@@ -1985,6 +1985,7 @@ test_connection_diff_a_only (void)
{ NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_IP_CONFIG_DNS, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_IP_CONFIG_DNS_SEARCH, NM_SETTING_DIFF_RESULT_IN_A },
+ { NM_SETTING_IP_CONFIG_DNS_OPTIONS, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_IP_CONFIG_ADDRESSES, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_IP_CONFIG_GATEWAY, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_IP_CONFIG_ROUTES, NM_SETTING_DIFF_RESULT_IN_A },
@@ -2884,6 +2885,13 @@ test_setting_ip4_changed_signal (void)
nm_setting_ip_config_add_route (s_ip4, route);
ASSERT_CHANGED (nm_setting_ip_config_clear_routes (s_ip4));
+ ASSERT_CHANGED (nm_setting_ip_config_add_dns_option (s_ip4, "debug"));
+ ASSERT_CHANGED (nm_setting_ip_config_remove_dns_option (s_ip4, 0));
+
+ g_test_expect_message ("libnm", G_LOG_LEVEL_CRITICAL, "*i < priv->dns_options->len*");
+ ASSERT_UNCHANGED (nm_setting_ip_config_remove_dns_option (s_ip4, 1));
+ g_test_assert_expected_messages ();
+
nm_ip_address_unref (addr);
nm_ip_route_unref (route);
g_object_unref (connection);
diff --git a/libnm/libnm.ver b/libnm/libnm.ver
index 1fe8e30d53..3c70c43840 100644
--- a/libnm/libnm.ver
+++ b/libnm/libnm.ver
@@ -552,16 +552,19 @@ global:
nm_setting_ip6_config_privacy_get_type;
nm_setting_ip_config_add_address;
nm_setting_ip_config_add_dns;
+ nm_setting_ip_config_add_dns_option;
nm_setting_ip_config_add_dns_search;
nm_setting_ip_config_add_route;
nm_setting_ip_config_clear_addresses;
nm_setting_ip_config_clear_dns;
+ nm_setting_ip_config_clear_dns_options;
nm_setting_ip_config_clear_dns_searches;
nm_setting_ip_config_clear_routes;
nm_setting_ip_config_get_address;
nm_setting_ip_config_get_dhcp_hostname;
nm_setting_ip_config_get_dhcp_send_hostname;
nm_setting_ip_config_get_dns;
+ nm_setting_ip_config_get_dns_option;
nm_setting_ip_config_get_dns_search;
nm_setting_ip_config_get_gateway;
nm_setting_ip_config_get_ignore_auto_dns;
@@ -571,6 +574,7 @@ global:
nm_setting_ip_config_get_never_default;
nm_setting_ip_config_get_num_addresses;
nm_setting_ip_config_get_num_dns;
+ nm_setting_ip_config_get_num_dns_options;
nm_setting_ip_config_get_num_dns_searches;
nm_setting_ip_config_get_num_routes;
nm_setting_ip_config_get_route;
@@ -580,6 +584,8 @@ global:
nm_setting_ip_config_remove_address_by_value;
nm_setting_ip_config_remove_dns;
nm_setting_ip_config_remove_dns_by_value;
+ nm_setting_ip_config_remove_dns_option;
+ nm_setting_ip_config_remove_dns_option_by_value;
nm_setting_ip_config_remove_dns_search;
nm_setting_ip_config_remove_dns_search_by_value;
nm_setting_ip_config_remove_route;