Blame libnm-core/nm-setting-ip6-config.c

Packit Service b23acc
// SPDX-License-Identifier: LGPL-2.1+
Packit Service b23acc
/*
Packit Service b23acc
 * Copyright (C) 2007 - 2014 Red Hat, Inc.
Packit Service b23acc
 */
Packit Service b23acc
Packit Service b23acc
#include "nm-default.h"
Packit Service b23acc
Packit Service b23acc
#include "nm-setting-ip6-config.h"
Packit Service b23acc
Packit Service b23acc
#include <arpa/inet.h>
Packit Service b23acc
Packit Service b23acc
#include "nm-setting-private.h"
Packit Service b23acc
#include "nm-core-enum-types.h"
Packit Service b23acc
#include "nm-core-internal.h"
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * SECTION:nm-setting-ip6-config
Packit Service b23acc
 * @short_description: Describes IPv6 addressing, routing, and name service properties
Packit Service b23acc
 *
Packit Service b23acc
 * The #NMSettingIP6Config object is a #NMSetting subclass that describes
Packit Service b23acc
 * properties related to IPv6 addressing, routing, and Domain Name Service
Packit Service b23acc
 *
Packit Service b23acc
 * #NMSettingIP6Config has few properties or methods of its own; it inherits
Packit Service b23acc
 * almost everything from #NMSettingIPConfig.
Packit Service b23acc
 *
Packit Service b23acc
 * NetworkManager supports 7 values for the #NMSettingIPConfig:method property
Packit Service b23acc
 * for IPv6.  If "auto" is specified then the appropriate automatic method (PPP,
Packit Service b23acc
 * router advertisement, etc) is used for the device and most other properties
Packit Service b23acc
 * can be left unset.  To force the use of DHCP only, specify "dhcp"; this
Packit Service b23acc
 * method is only valid for Ethernet- based hardware.  If "link-local" is
Packit Service b23acc
 * specified, then an IPv6 link-local address will be assigned to the interface.
Packit Service b23acc
 * If "manual" is specified, static IP addressing is used and at least one IP
Packit Service b23acc
 * address must be given in the "addresses" property.  If "ignore" is specified,
Packit Service b23acc
 * IPv6 configuration is not done. Note: the "shared" method is not yet
Packit Service b23acc
 * supported. If "disabled" is specified, IPv6 is disabled completely for the
Packit Service b23acc
 * interface.
Packit Service b23acc
 **/
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
NM_GOBJECT_PROPERTIES_DEFINE_BASE (
Packit Service b23acc
	PROP_IP6_PRIVACY,
Packit Service b23acc
	PROP_ADDR_GEN_MODE,
Packit Service b23acc
	PROP_TOKEN,
Packit Service b23acc
	PROP_DHCP_DUID,
Packit Service b23acc
	PROP_RA_TIMEOUT,
Packit Service b23acc
);
Packit Service b23acc
Packit Service b23acc
typedef struct {
Packit Service b23acc
	char *token;
Packit Service b23acc
	char *dhcp_duid;
Packit Service b23acc
	NMSettingIP6ConfigPrivacy ip6_privacy;
Packit Service b23acc
	NMSettingIP6ConfigAddrGenMode addr_gen_mode;
Packit Service b23acc
	gint32 ra_timeout;
Packit Service b23acc
} NMSettingIP6ConfigPrivate;
Packit Service b23acc
Packit Service b23acc
G_DEFINE_TYPE (NMSettingIP6Config, nm_setting_ip6_config, NM_TYPE_SETTING_IP_CONFIG)
Packit Service b23acc
Packit Service b23acc
#define NM_SETTING_IP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP6_CONFIG, NMSettingIP6ConfigPrivate))
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * nm_setting_ip6_config_get_ip6_privacy:
Packit Service b23acc
 * @setting: the #NMSettingIP6Config
Packit Service b23acc
 *
Packit Service b23acc
 * Returns the value contained in the #NMSettingIP6Config:ip6-privacy
Packit Service b23acc
 * property.
Packit Service b23acc
 *
Packit Service b23acc
 * Returns: IPv6 Privacy Extensions configuration value (#NMSettingIP6ConfigPrivacy).
Packit Service b23acc
 **/
Packit Service b23acc
NMSettingIP6ConfigPrivacy
Packit Service b23acc
nm_setting_ip6_config_get_ip6_privacy (NMSettingIP6Config *setting)
Packit Service b23acc
{
Packit Service b23acc
	g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN);
Packit Service b23acc
Packit Service b23acc
	return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->ip6_privacy;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * nm_setting_ip6_config_get_addr_gen_mode:
Packit Service b23acc
 * @setting: the #NMSettingIP6Config
Packit Service b23acc
 *
Packit Service b23acc
 * Returns the value contained in the #NMSettingIP6Config:addr-gen-mode
Packit Service b23acc
 * property.
Packit Service b23acc
 *
Packit Service b23acc
 * Returns: IPv6 Address Generation Mode.
Packit Service b23acc
 *
Packit Service b23acc
 * Since: 1.2
Packit Service b23acc
 **/
Packit Service b23acc
NMSettingIP6ConfigAddrGenMode
Packit Service b23acc
nm_setting_ip6_config_get_addr_gen_mode (NMSettingIP6Config *setting)
Packit Service b23acc
{
Packit Service b23acc
	g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting),
Packit Service b23acc
	                      NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY);
Packit Service b23acc
Packit Service b23acc
	return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->addr_gen_mode;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * nm_setting_ip6_config_get_token:
Packit Service b23acc
 * @setting: the #NMSettingIP6Config
Packit Service b23acc
 *
Packit Service b23acc
 * Returns the value contained in the #NMSettingIP6Config:token
Packit Service b23acc
 * property.
Packit Service b23acc
 *
Packit Service b23acc
 * Returns: A string.
Packit Service b23acc
 *
Packit Service b23acc
 * Since: 1.4
Packit Service b23acc
 **/
Packit Service b23acc
const char *
Packit Service b23acc
nm_setting_ip6_config_get_token (NMSettingIP6Config *setting)
Packit Service b23acc
{
Packit Service b23acc
	g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL);
Packit Service b23acc
Packit Service b23acc
	return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->token;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * nm_setting_ip6_config_get_dhcp_duid:
Packit Service b23acc
 * @setting: the #NMSettingIP6Config
Packit Service b23acc
 *
Packit Service b23acc
 * Returns the value contained in the #NMSettingIP6Config:dhcp-duid
Packit Service b23acc
 * property.
Packit Service b23acc
 *
Packit Service b23acc
 * Returns: The configured DUID value to be included in the DHCPv6 requests
Packit Service b23acc
 * sent to the DHCPv6 servers.
Packit Service b23acc
 *
Packit Service b23acc
 * Since: 1.12
Packit Service b23acc
 **/
Packit Service b23acc
const char *
Packit Service b23acc
nm_setting_ip6_config_get_dhcp_duid (NMSettingIP6Config *setting)
Packit Service b23acc
{
Packit Service b23acc
	g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL);
Packit Service b23acc
Packit Service b23acc
	return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dhcp_duid;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * nm_setting_ip6_config_get_ra_timeout:
Packit Service b23acc
 * @setting: the #NMSettingIP6Config
Packit Service b23acc
 *
Packit Service b23acc
 * Returns: The configured %NM_SETTING_IP6_CONFIG_RA_TIMEOUT value with the
Packit Service b23acc
 * timeout for router advertisements in seconds.
Packit Service b23acc
 *
Packit Service b23acc
 * Since: 1.24
Packit Service b23acc
 **/
Packit Service b23acc
gint32
Packit Service b23acc
nm_setting_ip6_config_get_ra_timeout (NMSettingIP6Config *setting)
Packit Service b23acc
{
Packit Service b23acc
	g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), 0);
Packit Service b23acc
Packit Service b23acc
	return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->ra_timeout;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static gboolean
Packit Service b23acc
verify (NMSetting *setting, NMConnection *connection, GError **error)
Packit Service b23acc
{
Packit Service b23acc
	NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting);
Packit Service b23acc
	NMSettingIPConfig *s_ip = NM_SETTING_IP_CONFIG (setting);
Packit Service b23acc
	NMSettingVerifyResult ret;
Packit Service b23acc
	const char *method;
Packit Service b23acc
	gboolean token_needs_normalization = FALSE;
Packit Service b23acc
Packit Service b23acc
	ret = NM_SETTING_CLASS (nm_setting_ip6_config_parent_class)->verify (setting, connection, error);
Packit Service b23acc
	if (ret != NM_SETTING_VERIFY_SUCCESS)
Packit Service b23acc
		return ret;
Packit Service b23acc
Packit Service b23acc
	method = nm_setting_ip_config_get_method (s_ip);
Packit Service b23acc
	/* Base class already checked that it exists */
Packit Service b23acc
	g_assert (method);
Packit Service b23acc
Packit Service b23acc
	if (nm_streq (method, NM_SETTING_IP6_CONFIG_METHOD_MANUAL)) {
Packit Service b23acc
		if (nm_setting_ip_config_get_num_addresses (s_ip) == 0) {
Packit Service b23acc
			g_set_error (error,
Packit Service b23acc
			             NM_CONNECTION_ERROR,
Packit Service b23acc
			             NM_CONNECTION_ERROR_MISSING_PROPERTY,
Packit Service b23acc
			             _("this property cannot be empty for '%s=%s'"),
Packit Service b23acc
			             NM_SETTING_IP_CONFIG_METHOD, method);
Packit Service b23acc
			g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP_CONFIG_ADDRESSES);
Packit Service b23acc
			return FALSE;
Packit Service b23acc
		}
Packit Service b23acc
	} else if (NM_IN_STRSET (method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
Packit Service b23acc
	                                 NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL,
Packit Service b23acc
	                                 NM_SETTING_IP6_CONFIG_METHOD_SHARED,
Packit Service b23acc
	                                 NM_SETTING_IP6_CONFIG_METHOD_DISABLED)) {
Packit Service b23acc
		/* Shared allows IP addresses and DNS; other methods do not */
Packit Service b23acc
		if (!nm_streq (method, NM_SETTING_IP6_CONFIG_METHOD_SHARED)) {
Packit Service b23acc
			if (nm_setting_ip_config_get_num_dns (s_ip) > 0) {
Packit Service b23acc
				g_set_error (error,
Packit Service b23acc
				             NM_CONNECTION_ERROR,
Packit Service b23acc
				             NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
				             _("this property is not allowed for '%s=%s'"),
Packit Service b23acc
				             NM_SETTING_IP_CONFIG_METHOD, method);
Packit Service b23acc
				g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP_CONFIG_DNS);
Packit Service b23acc
				return FALSE;
Packit Service b23acc
			}
Packit Service b23acc
Packit Service b23acc
			if (nm_setting_ip_config_get_num_dns_searches (s_ip) > 0) {
Packit Service b23acc
				g_set_error (error,
Packit Service b23acc
				             NM_CONNECTION_ERROR,
Packit Service b23acc
				             NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
				             _("this property is not allowed for '%s=%s'"),
Packit Service b23acc
				             NM_SETTING_IP_CONFIG_METHOD, method);
Packit Service b23acc
				g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP_CONFIG_DNS_SEARCH);
Packit Service b23acc
				return FALSE;
Packit Service b23acc
			}
Packit Service b23acc
Packit Service b23acc
			if (nm_setting_ip_config_get_num_addresses (s_ip) > 0) {
Packit Service b23acc
				g_set_error (error,
Packit Service b23acc
				             NM_CONNECTION_ERROR,
Packit Service b23acc
				             NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
				             _("this property is not allowed for '%s=%s'"),
Packit Service b23acc
				             NM_SETTING_IP_CONFIG_METHOD, method);
Packit Service b23acc
				g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP_CONFIG_ADDRESSES);
Packit Service b23acc
				return FALSE;
Packit Service b23acc
			}
Packit Service b23acc
		}
Packit Service b23acc
	} else if (NM_IN_STRSET (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO,
Packit Service b23acc
	                                 NM_SETTING_IP6_CONFIG_METHOD_DHCP)) {
Packit Service b23acc
		/* nothing to do */
Packit Service b23acc
	} else {
Packit Service b23acc
		g_set_error_literal (error,
Packit Service b23acc
		                     NM_CONNECTION_ERROR,
Packit Service b23acc
		                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
		                     _("property is invalid"));
Packit Service b23acc
		g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP_CONFIG_METHOD);
Packit Service b23acc
		return FALSE;
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	if (!NM_IN_SET (priv->addr_gen_mode,
Packit Service b23acc
	                NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64,
Packit Service b23acc
	                NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY)) {
Packit Service b23acc
		g_set_error_literal (error,
Packit Service b23acc
		                     NM_CONNECTION_ERROR,
Packit Service b23acc
		                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
		                      _("property is invalid"));
Packit Service b23acc
		g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE);
Packit Service b23acc
		return FALSE;
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	if (priv->token) {
Packit Service b23acc
		if (priv->addr_gen_mode == NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64) {
Packit Service b23acc
			struct in6_addr i6_token;
Packit Service b23acc
			char s_token[NM_UTILS_INET_ADDRSTRLEN];
Packit Service b23acc
Packit Service b23acc
			if (   inet_pton (AF_INET6, priv->token, &i6_token) != 1
Packit Service b23acc
			    || !_nm_utils_inet6_is_token (&i6_token)) {
Packit Service b23acc
				g_set_error_literal (error,
Packit Service b23acc
				                     NM_CONNECTION_ERROR,
Packit Service b23acc
				                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
				                      _("value is not a valid token"));
Packit Service b23acc
				g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_TOKEN);
Packit Service b23acc
				return FALSE;
Packit Service b23acc
			}
Packit Service b23acc
Packit Service b23acc
			if (g_strcmp0 (priv->token, _nm_utils_inet6_ntop (&i6_token, s_token)))
Packit Service b23acc
				token_needs_normalization = TRUE;
Packit Service b23acc
		} else {
Packit Service b23acc
			g_set_error_literal (error,
Packit Service b23acc
			                     NM_CONNECTION_ERROR,
Packit Service b23acc
			                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
			                      _("only makes sense with EUI64 address generation mode"));
Packit Service b23acc
			g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_TOKEN);
Packit Service b23acc
			return FALSE;
Packit Service b23acc
		}
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	if (priv->dhcp_duid) {
Packit Service b23acc
		if (!_nm_utils_dhcp_duid_valid (priv->dhcp_duid, NULL)) {
Packit Service b23acc
			g_set_error_literal (error,
Packit Service b23acc
			                     NM_CONNECTION_ERROR,
Packit Service b23acc
			                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
			                     _("invalid DUID"));
Packit Service b23acc
			g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_DHCP_DUID);
Packit Service b23acc
			return FALSE;
Packit Service b23acc
		}
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	/* Failures from here on, are NORMALIZABLE_ERROR... */
Packit Service b23acc
Packit Service b23acc
	if (token_needs_normalization) {
Packit Service b23acc
		g_set_error_literal (error,
Packit Service b23acc
		                     NM_CONNECTION_ERROR,
Packit Service b23acc
		                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
		                     _("token is not in canonical form"));
Packit Service b23acc
		g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP6_CONFIG_TOKEN);
Packit Service b23acc
		return NM_SETTING_VERIFY_NORMALIZABLE_ERROR;
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	/* Failures from here on are NORMALIZABLE... */
Packit Service b23acc
Packit Service b23acc
	if (   NM_IN_STRSET (method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
Packit Service b23acc
	                             NM_SETTING_IP6_CONFIG_METHOD_DISABLED)
Packit Service b23acc
	    && !nm_setting_ip_config_get_may_fail (s_ip)) {
Packit Service b23acc
		g_set_error_literal (error,
Packit Service b23acc
		                     NM_CONNECTION_ERROR,
Packit Service b23acc
		                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
		                     _("property should be TRUE when method is set to ignore or disabled"));
Packit Service b23acc
		g_prefix_error (error, "%s.%s: ", NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_SETTING_IP_CONFIG_MAY_FAIL);
Packit Service b23acc
		return NM_SETTING_VERIFY_NORMALIZABLE;
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	return TRUE;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static GVariant *
Packit Service b23acc
ip6_dns_to_dbus (const GValue *prop_value)
Packit Service b23acc
{
Packit Service b23acc
	return nm_utils_ip6_dns_to_variant (g_value_get_boxed (prop_value));
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
ip6_dns_from_dbus (GVariant *dbus_value,
Packit Service b23acc
                   GValue *prop_value)
Packit Service b23acc
{
Packit Service b23acc
	g_value_take_boxed (prop_value, nm_utils_ip6_dns_from_variant (dbus_value));
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static GVariant *
Packit Service b23acc
ip6_addresses_get (const NMSettInfoSetting *sett_info,
Packit Service b23acc
                   guint property_idx,
Packit Service b23acc
                   NMConnection *connection,
Packit Service b23acc
                   NMSetting *setting,
Packit Service b23acc
                   NMConnectionSerializationFlags flags,
Packit Service b23acc
                   const NMConnectionSerializationOptions *options)
Packit Service b23acc
{
Packit Service b23acc
	gs_unref_ptrarray GPtrArray *addrs = NULL;
Packit Service b23acc
	const char *gateway;
Packit Service b23acc
Packit Service b23acc
	g_object_get (setting, NM_SETTING_IP_CONFIG_ADDRESSES, &addrs, NULL);
Packit Service b23acc
	gateway = nm_setting_ip_config_get_gateway (NM_SETTING_IP_CONFIG (setting));
Packit Service b23acc
	return nm_utils_ip6_addresses_to_variant (addrs, gateway);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static gboolean
Packit Service b23acc
ip6_addresses_set (NMSetting  *setting,
Packit Service b23acc
                   GVariant   *connection_dict,
Packit Service b23acc
                   const char *property,
Packit Service b23acc
                   GVariant   *value,
Packit Service b23acc
                   NMSettingParseFlags parse_flags,
Packit Service b23acc
                   GError    **error)
Packit Service b23acc
{
Packit Service b23acc
	GPtrArray *addrs;
Packit Service b23acc
	char *gateway = NULL;
Packit Service b23acc
Packit Service b23acc
	/* FIXME: properly handle errors */
Packit Service b23acc
Packit Service b23acc
	if (!_nm_setting_use_legacy_property (setting, connection_dict, "addresses", "address-data"))
Packit Service b23acc
		return TRUE;
Packit Service b23acc
Packit Service b23acc
	addrs = nm_utils_ip6_addresses_from_variant (value, &gateway);
Packit Service b23acc
Packit Service b23acc
	g_object_set (setting,
Packit Service b23acc
	              NM_SETTING_IP_CONFIG_ADDRESSES, addrs,
Packit Service b23acc
	              NM_SETTING_IP_CONFIG_GATEWAY, gateway,
Packit Service b23acc
	              NULL);
Packit Service b23acc
	g_ptr_array_unref (addrs);
Packit Service b23acc
	g_free (gateway);
Packit Service b23acc
	return TRUE;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static GVariant *
Packit Service b23acc
ip6_address_data_get (const NMSettInfoSetting *sett_info,
Packit Service b23acc
                      guint property_idx,
Packit Service b23acc
                      NMConnection *connection,
Packit Service b23acc
                      NMSetting *setting,
Packit Service b23acc
                      NMConnectionSerializationFlags flags,
Packit Service b23acc
                      const NMConnectionSerializationOptions *options)
Packit Service b23acc
{
Packit Service b23acc
	gs_unref_ptrarray GPtrArray *addrs = NULL;
Packit Service b23acc
Packit Service b23acc
	if (flags & NM_CONNECTION_SERIALIZE_ONLY_SECRETS)
Packit Service b23acc
		return NULL;
Packit Service b23acc
Packit Service b23acc
	g_object_get (setting, NM_SETTING_IP_CONFIG_ADDRESSES, &addrs, NULL);
Packit Service b23acc
	return nm_utils_ip_addresses_to_variant (addrs);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static gboolean
Packit Service b23acc
ip6_address_data_set (NMSetting  *setting,
Packit Service b23acc
                      GVariant   *connection_dict,
Packit Service b23acc
                      const char *property,
Packit Service b23acc
                      GVariant   *value,
Packit Service b23acc
                      NMSettingParseFlags parse_flags,
Packit Service b23acc
                      GError    **error)
Packit Service b23acc
{
Packit Service b23acc
	GPtrArray *addrs;
Packit Service b23acc
Packit Service b23acc
	/* FIXME: properly handle errors */
Packit Service b23acc
Packit Service b23acc
	/* Ignore 'address-data' if we're going to process 'addresses' */
Packit Service b23acc
	if (_nm_setting_use_legacy_property (setting, connection_dict, "addresses", "address-data"))
Packit Service b23acc
		return TRUE;
Packit Service b23acc
Packit Service b23acc
	addrs = nm_utils_ip_addresses_from_variant (value, AF_INET6);
Packit Service b23acc
	g_object_set (setting, NM_SETTING_IP_CONFIG_ADDRESSES, addrs, NULL);
Packit Service b23acc
	g_ptr_array_unref (addrs);
Packit Service b23acc
	return TRUE;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static GVariant *
Packit Service b23acc
ip6_routes_get (const NMSettInfoSetting *sett_info,
Packit Service b23acc
                guint property_idx,
Packit Service b23acc
                NMConnection *connection,
Packit Service b23acc
                NMSetting *setting,
Packit Service b23acc
                NMConnectionSerializationFlags flags,
Packit Service b23acc
                const NMConnectionSerializationOptions *options)
Packit Service b23acc
{
Packit Service b23acc
	gs_unref_ptrarray GPtrArray *routes = NULL;
Packit Service b23acc
Packit Service b23acc
	g_object_get (setting, NM_SETTING_IP_CONFIG_ROUTES, &routes, NULL);
Packit Service b23acc
	return nm_utils_ip6_routes_to_variant (routes);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static gboolean
Packit Service b23acc
ip6_routes_set (NMSetting  *setting,
Packit Service b23acc
                GVariant   *connection_dict,
Packit Service b23acc
                const char *property,
Packit Service b23acc
                GVariant   *value,
Packit Service b23acc
                NMSettingParseFlags parse_flags,
Packit Service b23acc
                GError    **error)
Packit Service b23acc
{
Packit Service b23acc
	GPtrArray *routes;
Packit Service b23acc
Packit Service b23acc
	/* FIXME: properly handle errors */
Packit Service b23acc
Packit Service b23acc
	if (!_nm_setting_use_legacy_property (setting, connection_dict, "routes", "route-data"))
Packit Service b23acc
		return TRUE;
Packit Service b23acc
Packit Service b23acc
	routes = nm_utils_ip6_routes_from_variant (value);
Packit Service b23acc
	g_object_set (setting, property, routes, NULL);
Packit Service b23acc
	g_ptr_array_unref (routes);
Packit Service b23acc
	return TRUE;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static GVariant *
Packit Service b23acc
ip6_route_data_get (const NMSettInfoSetting *sett_info,
Packit Service b23acc
                    guint property_idx,
Packit Service b23acc
                    NMConnection *connection,
Packit Service b23acc
                    NMSetting *setting,
Packit Service b23acc
                    NMConnectionSerializationFlags flags,
Packit Service b23acc
                    const NMConnectionSerializationOptions *options)
Packit Service b23acc
{
Packit Service b23acc
	gs_unref_ptrarray GPtrArray *routes = NULL;
Packit Service b23acc
Packit Service b23acc
	if (flags & NM_CONNECTION_SERIALIZE_ONLY_SECRETS)
Packit Service b23acc
		return NULL;
Packit Service b23acc
Packit Service b23acc
	g_object_get (setting, NM_SETTING_IP_CONFIG_ROUTES, &routes, NULL);
Packit Service b23acc
	return nm_utils_ip_routes_to_variant (routes);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static gboolean
Packit Service b23acc
ip6_route_data_set (NMSetting  *setting,
Packit Service b23acc
                    GVariant   *connection_dict,
Packit Service b23acc
                    const char *property,
Packit Service b23acc
                    GVariant   *value,
Packit Service b23acc
                    NMSettingParseFlags parse_flags,
Packit Service b23acc
                    GError    **error)
Packit Service b23acc
{
Packit Service b23acc
	GPtrArray *routes;
Packit Service b23acc
Packit Service b23acc
	/* FIXME: properly handle errors */
Packit Service b23acc
Packit Service b23acc
	/* Ignore 'route-data' if we're going to process 'routes' */
Packit Service b23acc
	if (_nm_setting_use_legacy_property (setting, connection_dict, "routes", "route-data"))
Packit Service b23acc
		return TRUE;
Packit Service b23acc
Packit Service b23acc
	routes = nm_utils_ip_routes_from_variant (value, AF_INET6);
Packit Service b23acc
	g_object_set (setting, NM_SETTING_IP_CONFIG_ROUTES, routes, NULL);
Packit Service b23acc
	g_ptr_array_unref (routes);
Packit Service b23acc
	return TRUE;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
get_property (GObject *object, guint prop_id,
Packit Service b23acc
              GValue *value, GParamSpec *pspec)
Packit Service b23acc
{
Packit Service b23acc
	NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (object);
Packit Service b23acc
Packit Service b23acc
	switch (prop_id) {
Packit Service b23acc
	case PROP_IP6_PRIVACY:
Packit Service b23acc
		g_value_set_enum (value, priv->ip6_privacy);
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_ADDR_GEN_MODE:
Packit Service b23acc
		g_value_set_int (value, priv->addr_gen_mode);
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_TOKEN:
Packit Service b23acc
		g_value_set_string (value, priv->token);
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_DHCP_DUID:
Packit Service b23acc
		g_value_set_string (value, priv->dhcp_duid);
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_RA_TIMEOUT:
Packit Service b23acc
		g_value_set_int (value, priv->ra_timeout);
Packit Service b23acc
		break;
Packit Service b23acc
	default:
Packit Service b23acc
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service b23acc
		break;
Packit Service b23acc
	}
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
set_property (GObject *object, guint prop_id,
Packit Service b23acc
              const GValue *value, GParamSpec *pspec)
Packit Service b23acc
{
Packit Service b23acc
	NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (object);
Packit Service b23acc
Packit Service b23acc
	switch (prop_id) {
Packit Service b23acc
	case PROP_IP6_PRIVACY:
Packit Service b23acc
		priv->ip6_privacy = g_value_get_enum (value);
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_ADDR_GEN_MODE:
Packit Service b23acc
		priv->addr_gen_mode = g_value_get_int (value);
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_TOKEN:
Packit Service b23acc
		g_free (priv->token);
Packit Service b23acc
		priv->token = g_value_dup_string (value);
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_DHCP_DUID:
Packit Service b23acc
		g_free (priv->dhcp_duid);
Packit Service b23acc
		priv->dhcp_duid = g_value_dup_string (value);
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_RA_TIMEOUT:
Packit Service b23acc
		priv->ra_timeout = g_value_get_int (value);
Packit Service b23acc
		break;
Packit Service b23acc
	default:
Packit Service b23acc
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service b23acc
		break;
Packit Service b23acc
	}
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
nm_setting_ip6_config_init (NMSettingIP6Config *setting)
Packit Service b23acc
{
Packit Service b23acc
	NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting);
Packit Service b23acc
Packit Service b23acc
	priv->ip6_privacy   = NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN;
Packit Service b23acc
	priv->addr_gen_mode = NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * nm_setting_ip6_config_new:
Packit Service b23acc
 *
Packit Service b23acc
 * Creates a new #NMSettingIP6Config object with default values.
Packit Service b23acc
 *
Packit Service b23acc
 * Returns: (transfer full): the new empty #NMSettingIP6Config object
Packit Service b23acc
 **/
Packit Service b23acc
NMSetting *
Packit Service b23acc
nm_setting_ip6_config_new (void)
Packit Service b23acc
{
Packit Service b23acc
	return (NMSetting *) g_object_new (NM_TYPE_SETTING_IP6_CONFIG, NULL);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
finalize (GObject *object)
Packit Service b23acc
{
Packit Service b23acc
	NMSettingIP6Config *self = NM_SETTING_IP6_CONFIG (object);
Packit Service b23acc
	NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (self);
Packit Service b23acc
Packit Service b23acc
	g_free (priv->token);
Packit Service b23acc
	g_free (priv->dhcp_duid);
Packit Service b23acc
Packit Service b23acc
	G_OBJECT_CLASS (nm_setting_ip6_config_parent_class)->finalize (object);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *klass)
Packit Service b23acc
{
Packit Service b23acc
	GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit Service b23acc
	NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
Packit Service b23acc
	GArray *properties_override = _nm_sett_info_property_override_create_array_ip_config ();
Packit Service b23acc
Packit Service b23acc
	g_type_class_add_private (klass, sizeof (NMSettingIP6ConfigPrivate));
Packit Service b23acc
Packit Service b23acc
	object_class->get_property = get_property;
Packit Service b23acc
	object_class->set_property = set_property;
Packit Service b23acc
	object_class->finalize     = finalize;
Packit Service b23acc
Packit Service b23acc
	setting_class->verify = verify;
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: method
Packit Service b23acc
	 * variable: IPV6INIT, IPV6FORWARDING, IPV6_AUTOCONF, DHCPV6C, IPV6_DISABLED
Packit Service b23acc
	 * default:  IPV6INIT=yes; IPV6FORWARDING=no; IPV6_AUTOCONF=!IPV6FORWARDING, DHCPV6=no
Packit Service b23acc
	 * description: Method used for IPv6 protocol configuration.
Packit Service b23acc
	 *   ignore ~ IPV6INIT=no; auto ~ IPV6_AUTOCONF=yes; dhcp ~ IPV6_AUTOCONF=no and DHCPV6C=yes;
Packit Service b23acc
	 *   disabled ~ IPV6_DISABLED=yes
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---keyfile---
Packit Service b23acc
	 * property: dns
Packit Service b23acc
	 * format: list of DNS IP addresses
Packit Service b23acc
	 * description: List of DNS servers.
Packit Service b23acc
	 * example: dns=2001:4860:4860::8888;2001:4860:4860::8844;
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 * ---ifcfg-rh---
Packit Service b23acc
	 * property: dns
Packit Service b23acc
	 * variable: DNS1, DNS2, ...
Packit Service b23acc
	 * format:   string
Packit Service b23acc
	 * description: List of DNS servers. NetworkManager uses the variables both
Packit Service b23acc
	 *   for IPv4 and IPv6.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: dns-search
Packit Service b23acc
	 * variable: IPV6_DOMAIN(+)
Packit Service b23acc
	 * format:   string (space-separated domains)
Packit Service b23acc
	 * description: List of DNS search domains.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---keyfile---
Packit Service b23acc
	 * property: addresses
Packit Service b23acc
	 * variable: address1, address2, ...
Packit Service b23acc
	 * format: address/plen
Packit Service b23acc
	 * description: List of static IP addresses.
Packit Service b23acc
	 * example: address1=abbe::cafe/96 address2=2001::1234
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 * ---ifcfg-rh---
Packit Service b23acc
	 * property: addresses
Packit Service b23acc
	 * variable: IPV6ADDR, IPV6ADDR_SECONDARIES
Packit Service b23acc
	 * description: List of static IP addresses.
Packit Service b23acc
	 * example: IPV6ADDR=ab12:9876::1
Packit Service b23acc
	 *   IPV6ADDR_SECONDARIES="ab12:9876::2 ab12:9876::3"
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---keyfile---
Packit Service b23acc
	 * property: gateway
Packit Service b23acc
	 * variable: gateway
Packit Service b23acc
	 * format: string
Packit Service b23acc
	 * description: Gateway IP addresses as a string.
Packit Service b23acc
	 * example: gateway=abbe::1
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 * ---ifcfg-rh---
Packit Service b23acc
	 * property: gateway
Packit Service b23acc
	 * variable: IPV6_DEFAULTGW
Packit Service b23acc
	 * description: Gateway IP address.
Packit Service b23acc
	 * example: IPV6_DEFAULTGW=abbe::1
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---keyfile---
Packit Service b23acc
	 * property: routes
Packit Service b23acc
	 * variable: route1, route2, ...
Packit Service b23acc
	 * format: route/plen[,gateway,metric]
Packit Service b23acc
	 * description: List of IP routes.
Packit Service b23acc
	 * example: route1=2001:4860:4860::/64,2620:52:0:2219:222:68ff:fe11:5403
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 * ---ifcfg-rh---
Packit Service b23acc
	 * property: routes
Packit Service b23acc
	 * variable: (none)
Packit Service b23acc
	 * description: List of static routes. They are not stored in ifcfg-* file,
Packit Service b23acc
	 *   but in route6-* file instead in the form of command line for 'ip route add'.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: ignore-auto-routes
Packit Service b23acc
	 * variable: IPV6_PEERROUTES(+)
Packit Service b23acc
	 * default: yes
Packit Service b23acc
	 * description: IPV6_PEERROUTES has the opposite meaning as 'ignore-auto-routes' property.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: ignore-auto-dns
Packit Service b23acc
	 * variable: IPV6_PEERDNS(+)
Packit Service b23acc
	 * default: yes
Packit Service b23acc
	 * description: IPV6_PEERDNS has the opposite meaning as 'ignore-auto-dns' property.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: dhcp-hostname
Packit Service b23acc
	 * variable: DHCPV6_HOSTNAME
Packit Service b23acc
	 * description: Hostname to send the DHCP server.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: dhcp-timeout
Packit Service b23acc
	 * variable: IPV6_DHCP_TIMEOUT(+)
Packit Service b23acc
	 * description: A timeout after which the DHCP transaction fails in case of no response.
Packit Service b23acc
	 * example: IPV6_DHCP_TIMEOUT=10
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: dhcp-hostname-flags
Packit Service b23acc
	 * variable: DHCPV6_HOSTNAME_FLAGS
Packit Service b23acc
	 * description: flags for the DHCP hostname property
Packit Service b23acc
	 * example: DHCPV6_HOSTNAME_FLAGS=5
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: never-default
Packit Service b23acc
	 * variable: IPV6_DEFROUTE(+), (and IPV6_DEFAULTGW, IPV6_DEFAULTDEV in /etc/sysconfig/network)
Packit Service b23acc
	 * default: IPV6_DEFROUTE=yes (when no variable specified)
Packit Service b23acc
	 * description: IPV6_DEFROUTE=no tells NetworkManager that this connection
Packit Service b23acc
	 *   should not be assigned the default IPv6 route. IPV6_DEFROUTE has the opposite
Packit Service b23acc
	 *   meaning as 'never-default' property.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: may-fail
Packit Service b23acc
	 * variable: IPV6_FAILURE_FATAL(+)
Packit Service b23acc
	 * default: no
Packit Service b23acc
	 * description: IPV6_FAILURE_FATAL has the opposite meaning as 'may-fail' property.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: route-metric
Packit Service b23acc
	 * variable: IPV6_ROUTE_METRIC(+)
Packit Service b23acc
	 * default: -1
Packit Service b23acc
	 * description: IPV6_ROUTE_METRIC is the default IPv6 metric for routes on this connection.
Packit Service b23acc
	 *   If set to -1, a default metric based on the device type is used.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: route-table
Packit Service b23acc
	 * variable: IPV6_ROUTE_TABLE(+)
Packit Service b23acc
	 * default: 0
Packit Service b23acc
	 * description: IPV6_ROUTE_TABLE enables policy-routing and sets the default routing table.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: dns-priority
Packit Service b23acc
	 * variable: IPV6_DNS_PRIORITY(+)
Packit Service b23acc
	 * description: The priority for DNS servers of this connection. Lower values have higher priority.
Packit Service b23acc
	 *    If zero, the default value will be used (50 for VPNs, 100 for other connections).
Packit Service b23acc
	 *    A negative value prevents DNS from other connections with greater values to be used.
Packit Service b23acc
	 * default: 0
Packit Service b23acc
	 * example: IPV6_DNS_PRIORITY=20
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: dns-options
Packit Service b23acc
	 * variable: IPV6_RES_OPTIONS(+)
Packit Service b23acc
	 * description: List of DNS options to be added to /etc/resolv.conf
Packit Service b23acc
	 * example: IPV6_RES_OPTIONS=ndots:2 timeout:3
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	/**
Packit Service b23acc
	 * NMSettingIP6Config:ip6-privacy:
Packit Service b23acc
	 *
Packit Service b23acc
	 * Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941.  If
Packit Service b23acc
	 * enabled, it makes the kernel generate a temporary IPv6 address in
Packit Service b23acc
	 * addition to the public one generated from MAC address via modified
Packit Service b23acc
	 * EUI-64.  This enhances privacy, but could cause problems in some
Packit Service b23acc
	 * applications, on the other hand.  The permitted values are: -1: unknown,
Packit Service b23acc
	 * 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary
Packit Service b23acc
	 * addresses).
Packit Service b23acc
	 *
Packit Service b23acc
	 * Having a per-connection setting set to "-1" (unknown) means fallback to
Packit Service b23acc
	 * global configuration "ipv6.ip6-privacy".
Packit Service b23acc
	 *
Packit Service b23acc
	 * If also global configuration is unspecified or set to "-1", fallback to read
Packit Service b23acc
	 * "/proc/sys/net/ipv6/conf/default/use_tempaddr".
Packit Service b23acc
	 *
Packit Service b23acc
	 * Note that this setting is distinct from the Stable Privacy addresses
Packit Service b23acc
	 * that can be enabled with the "addr-gen-mode" property's "stable-privacy"
Packit Service b23acc
	 * setting as another way of avoiding host tracking with IPv6 addresses.
Packit Service b23acc
	 **/
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: ip6-privacy
Packit Service b23acc
	 * variable: IPV6_PRIVACY, IPV6_PRIVACY_PREFER_PUBLIC_IP(+)
Packit Service b23acc
	 * values: IPV6_PRIVACY: no, yes (rfc3041 or rfc4941);
Packit Service b23acc
	 *   IPV6_PRIVACY_PREFER_PUBLIC_IP: yes, no
Packit Service b23acc
	 * default: no
Packit Service b23acc
	 * description: Configure IPv6 Privacy Extensions for SLAAC (RFC4941).
Packit Service b23acc
	 * example: IPV6_PRIVACY=rfc3041 IPV6_PRIVACY_PREFER_PUBLIC_IP=yes
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	obj_properties[PROP_IP6_PRIVACY] =
Packit Service b23acc
	    g_param_spec_enum (NM_SETTING_IP6_CONFIG_IP6_PRIVACY, "", "",
Packit Service b23acc
	                       NM_TYPE_SETTING_IP6_CONFIG_PRIVACY,
Packit Service b23acc
	                       NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN,
Packit Service b23acc
	                       G_PARAM_READWRITE |
Packit Service b23acc
	                       G_PARAM_STATIC_STRINGS);
Packit Service b23acc
Packit Service b23acc
	/**
Packit Service b23acc
	 * NMSettingIP6Config:addr-gen-mode:
Packit Service b23acc
	 *
Packit Service b23acc
	 * Configure method for creating the address for use with RFC4862 IPv6
Packit Service b23acc
	 * Stateless Address Autoconfiguration. The permitted values are:
Packit Service b23acc
	 * %NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64 or
Packit Service b23acc
	 * %NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY.
Packit Service b23acc
	 *
Packit Service b23acc
	 * If the property is set to EUI64, the addresses will be generated
Packit Service b23acc
	 * using the interface tokens derived from hardware address. This makes
Packit Service b23acc
	 * the host part of the address to stay constant, making it possible
Packit Service b23acc
	 * to track host's presence when it changes networks. The address changes
Packit Service b23acc
	 * when the interface hardware is replaced.
Packit Service b23acc
	 *
Packit Service b23acc
	 * The value of stable-privacy enables use of cryptographically
Packit Service b23acc
	 * secure hash of a secret host-specific key along with the connection's
Packit Service b23acc
	 * stable-id and the network address as specified by RFC7217.
Packit Service b23acc
	 * This makes it impossible to use the address track host's presence,
Packit Service b23acc
	 * and makes the address stable when the network interface hardware is
Packit Service b23acc
	 * replaced.
Packit Service b23acc
	 *
Packit Service b23acc
	 * On D-Bus, the absence of an addr-gen-mode setting equals enabling
Packit Service b23acc
	 * stable-privacy. For keyfile plugin, the absence of the setting
Packit Service b23acc
	 * on disk means EUI64 so that the property doesn't change on upgrade
Packit Service b23acc
	 * from older versions.
Packit Service b23acc
	 *
Packit Service b23acc
	 * Note that this setting is distinct from the Privacy Extensions as
Packit Service b23acc
	 * configured by "ip6-privacy" property and it does not affect the
Packit Service b23acc
	 * temporary addresses configured with this option.
Packit Service b23acc
	 *
Packit Service b23acc
	 * Since: 1.2
Packit Service b23acc
	 **/
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: addr-gen-mode
Packit Service b23acc
	 * variable: IPV6_ADDR_GEN_MODE
Packit Service b23acc
	 * values: IPV6_ADDR_GEN_MODE: eui64, stable-privacy
Packit Service b23acc
	 * default: eui64
Packit Service b23acc
	 * description: Configure IPv6 Stable Privacy addressing for SLAAC (RFC7217).
Packit Service b23acc
	 * example: IPV6_ADDR_GEN_MODE=stable-privacy
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	obj_properties[PROP_ADDR_GEN_MODE] =
Packit Service b23acc
	    g_param_spec_int (NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE, "", "",
Packit Service b23acc
	                      G_MININT, G_MAXINT,
Packit Service b23acc
	                      NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_STABLE_PRIVACY,
Packit Service b23acc
	                      G_PARAM_READWRITE |
Packit Service b23acc
	                      G_PARAM_STATIC_STRINGS);
Packit Service b23acc
Packit Service b23acc
	/**
Packit Service b23acc
	 * NMSettingIP6Config:token:
Packit Service b23acc
	 *
Packit Service b23acc
	 * Configure the token for draft-chown-6man-tokenised-ipv6-identifiers-02
Packit Service b23acc
	 * IPv6 tokenized interface identifiers. Useful with eui64 addr-gen-mode.
Packit Service b23acc
	 *
Packit Service b23acc
	 * Since: 1.4
Packit Service b23acc
	 **/
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: token
Packit Service b23acc
	 * variable: IPV6_TOKEN
Packit Service b23acc
	 * description: The IPv6 tokenized interface identifier token
Packit Service b23acc
	 * example: IPV6_TOKEN=::53
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	obj_properties[PROP_TOKEN] =
Packit Service b23acc
	    g_param_spec_string (NM_SETTING_IP6_CONFIG_TOKEN, "", "",
Packit Service b23acc
	                         NULL,
Packit Service b23acc
	                         G_PARAM_READWRITE |
Packit Service b23acc
	                         NM_SETTING_PARAM_INFERRABLE |
Packit Service b23acc
	                         G_PARAM_STATIC_STRINGS);
Packit Service b23acc
Packit Service b23acc
	/**
Packit Service b23acc
	 * NMSettingIP6Config:ra-timeout:
Packit Service b23acc
	 *
Packit Service b23acc
	 * A timeout for waiting Router Advertisements in seconds. If zero (the default), a
Packit Service b23acc
	 * globally configured default is used. If still unspecified, the timeout depends on the
Packit Service b23acc
	 * sysctl settings of the device.
Packit Service b23acc
	 *
Packit Service b23acc
	 * Set to 2147483647 (MAXINT32) for infinity.
Packit Service b23acc
	 *
Packit Service b23acc
	 * Since: 1.24
Packit Service b23acc
	 **/
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: dhcp-timeout
Packit Service b23acc
	 * variable: IPV6_RA_TIMEOUT(+)
Packit Service b23acc
	 * description: A timeout for waiting Router Advertisements in seconds.
Packit Service b23acc
	 * example: IPV6_RA_TIMEOUT=10
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
Packit Service b23acc
	obj_properties[PROP_RA_TIMEOUT] =
Packit Service b23acc
	    g_param_spec_int (NM_SETTING_IP6_CONFIG_RA_TIMEOUT, "", "",
Packit Service b23acc
	                      0, G_MAXINT32, 0,
Packit Service b23acc
	                      G_PARAM_READWRITE |
Packit Service b23acc
	                      NM_SETTING_PARAM_FUZZY_IGNORE |
Packit Service b23acc
	                      G_PARAM_STATIC_STRINGS);
Packit Service b23acc
Packit Service b23acc
	/**
Packit Service b23acc
	 * NMSettingIP6Config:dhcp-duid:
Packit Service b23acc
	 *
Packit Service b23acc
	 * A string containing the DHCPv6 Unique Identifier (DUID) used by the dhcp
Packit Service b23acc
	 * client to identify itself to DHCPv6 servers (RFC 3315). The DUID is carried
Packit Service b23acc
	 * in the Client Identifier option.
Packit Service b23acc
	 * If the property is a hex string ('aa:bb:cc') it is interpreted as a binary
Packit Service b23acc
	 * DUID and filled as an opaque value in the Client Identifier option.
Packit Service b23acc
	 *
Packit Service b23acc
	 * The special value "lease" will retrieve the DUID previously used from the
Packit Service b23acc
	 * lease file belonging to the connection. If no DUID is found and "dhclient"
Packit Service b23acc
	 * is the configured dhcp client, the DUID is searched in the system-wide
Packit Service b23acc
	 * dhclient lease file. If still no DUID is found, or another dhcp client is
Packit Service b23acc
	 * used, a global and permanent DUID-UUID (RFC 6355) will be generated based
Packit Service b23acc
	 * on the machine-id.
Packit Service b23acc
	 *
Packit Service b23acc
	 * The special values "llt" and "ll" will generate a DUID of type LLT or LL
Packit Service b23acc
	 * (see RFC 3315) based on the current MAC address of the device. In order to
Packit Service b23acc
	 * try providing a stable DUID-LLT, the time field will contain a constant
Packit Service b23acc
	 * timestamp that is used globally (for all profiles) and persisted to disk.
Packit Service b23acc
	 *
Packit Service b23acc
	 * The special values "stable-llt", "stable-ll" and "stable-uuid" will generate
Packit Service b23acc
	 * a DUID of the corresponding type, derived from the connection's stable-id and
Packit Service b23acc
	 * a per-host unique key. You may want to include the "${DEVICE}" or "${MAC}" specifier
Packit Service b23acc
	 * in the stable-id, in case this profile gets activated on multiple devices.
Packit Service b23acc
	 * So, the link-layer address of "stable-ll" and "stable-llt" will be a generated
Packit Service b23acc
	 * address derived from the stable id. The DUID-LLT time value in the "stable-llt"
Packit Service b23acc
	 * option will be picked among a static timespan of three years (the upper bound
Packit Service b23acc
	 * of the interval is the same constant timestamp used in "llt").
Packit Service b23acc
	 *
Packit Service b23acc
	 * When the property is unset, the global value provided for "ipv6.dhcp-duid" is
Packit Service b23acc
	 * used. If no global value is provided, the default "lease" value is assumed.
Packit Service b23acc
	 *
Packit Service b23acc
	 * Since: 1.12
Packit Service b23acc
	 **/
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: dhcp-duid
Packit Service b23acc
	 * variable: DHCPV6_DUID(+)
Packit Service b23acc
	 * description: A string sent to the DHCPv6 server to identify the local machine.
Packit Service b23acc
	 *   Apart from the special values "lease", "stable-llt", "stable-ll", "stable-uuid",
Packit Service b23acc
	 *   "llt" and "ll" a binary value in hex format is expected. An hex string where
Packit Service b23acc
	 *   each octet is separated by a colon is also accepted.
Packit Service b23acc
	 * example: DHCPV6_DUID=LL; DHCPV6_DUID=0301deadbeef0001; DHCPV6_DUID=03:01:de:ad:be:ef:00:01
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	obj_properties[PROP_DHCP_DUID] =
Packit Service b23acc
	    g_param_spec_string (NM_SETTING_IP6_CONFIG_DHCP_DUID, "", "",
Packit Service b23acc
	                         NULL,
Packit Service b23acc
	                         G_PARAM_READWRITE |
Packit Service b23acc
	                         G_PARAM_STATIC_STRINGS);
Packit Service b23acc
Packit Service b23acc
	/* IP6-specific property overrides */
Packit Service b23acc
Packit Service b23acc
	/* ---dbus---
Packit Service b23acc
	 * property: dns
Packit Service b23acc
	 * format: array of byte array
Packit Service b23acc
	 * description: Array of IP addresses of DNS servers (in network byte order)
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	_nm_properties_override_gobj (properties_override,
Packit Service b23acc
	                              g_object_class_find_property (G_OBJECT_CLASS (setting_class),
Packit Service b23acc
	                                                            NM_SETTING_IP_CONFIG_DNS),
Packit Service b23acc
	                              NM_SETT_INFO_PROPERT_TYPE (
Packit Service b23acc
	                                  .dbus_type           = NM_G_VARIANT_TYPE ("aay"),
Packit Service b23acc
	                                  .gprop_to_dbus_fcn   = ip6_dns_to_dbus,
Packit Service b23acc
	                                  .gprop_from_dbus_fcn = ip6_dns_from_dbus,
Packit Service b23acc
	                              ));
Packit Service b23acc
Packit Service b23acc
	/* ---dbus---
Packit Service b23acc
	 * property: addresses
Packit Service b23acc
	 * format: array of legacy IPv6 address struct (a(ayuay))
Packit Service b23acc
	 * description: Deprecated in favor of the 'address-data' and 'gateway'
Packit Service b23acc
	 *   properties, but this can be used for backward-compatibility with older
Packit Service b23acc
	 *   daemons. Note that if you send this property the daemon will ignore
Packit Service b23acc
	 *   'address-data' and 'gateway'.
Packit Service b23acc
	 *
Packit Service b23acc
	 *   Array of IPv6 address structures.  Each IPv6 address structure is
Packit Service b23acc
	 *   composed of an IPv6 address, a prefix length (1 - 128), and an IPv6
Packit Service b23acc
	 *   gateway address. The gateway may be zeroed out if no gateway exists for
Packit Service b23acc
	 *   that subnet.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	_nm_properties_override_gobj (properties_override,
Packit Service b23acc
	                              g_object_class_find_property (G_OBJECT_CLASS (setting_class),
Packit Service b23acc
	                                                            NM_SETTING_IP_CONFIG_ADDRESSES),
Packit Service b23acc
	                              NM_SETT_INFO_PROPERT_TYPE (
Packit Service b23acc
	                                  .dbus_type     = NM_G_VARIANT_TYPE ("a(ayuay)"),
Packit Service b23acc
	                                  .to_dbus_fcn   = ip6_addresses_get,
Packit Service b23acc
	                                  .from_dbus_fcn = ip6_addresses_set,
Packit Service b23acc
	                              ));
Packit Service b23acc
Packit Service b23acc
	/* ---dbus---
Packit Service b23acc
	 * property: address-data
Packit Service b23acc
	 * format: array of vardict
Packit Service b23acc
	 * description: Array of IPv6 addresses. Each address dictionary contains at
Packit Service b23acc
	 *   least 'address' and 'prefix' entries, containing the IP address as a
Packit Service b23acc
	 *   string, and the prefix length as a uint32. Additional attributes may
Packit Service b23acc
	 *   also exist on some addresses.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	_nm_properties_override_dbus (properties_override,
Packit Service b23acc
	                              "address-data",
Packit Service b23acc
	                              NM_SETT_INFO_PROPERT_TYPE (
Packit Service b23acc
	                                  .dbus_type     = NM_G_VARIANT_TYPE ("aa{sv}"),
Packit Service b23acc
	                                  .to_dbus_fcn   = ip6_address_data_get,
Packit Service b23acc
	                                  .from_dbus_fcn = ip6_address_data_set,
Packit Service b23acc
	                              ));
Packit Service b23acc
Packit Service b23acc
	/* ---dbus---
Packit Service b23acc
	 * property: routes
Packit Service b23acc
	 * format: array of legacy IPv6 route struct (a(ayuayu))
Packit Service b23acc
	 * description: Deprecated in favor of the 'route-data' property, but this
Packit Service b23acc
	 *   can be used for backward-compatibility with older daemons. Note that if
Packit Service b23acc
	 *   you send this property the daemon will ignore 'route-data'.
Packit Service b23acc
	 *
Packit Service b23acc
	 *   Array of IPv6 route structures.  Each IPv6 route structure is
Packit Service b23acc
	 *   composed of an IPv6 address, a prefix length (1 - 128), an IPv6
Packit Service b23acc
	 *   next hop address (which may be zeroed out if there is no next hop),
Packit Service b23acc
	 *   and a metric. If the metric is 0, NM will choose an appropriate
Packit Service b23acc
	 *   default metric for the device.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	_nm_properties_override_gobj (properties_override,
Packit Service b23acc
	                              g_object_class_find_property (G_OBJECT_CLASS (setting_class),
Packit Service b23acc
	                                                            NM_SETTING_IP_CONFIG_ROUTES),
Packit Service b23acc
	                              NM_SETT_INFO_PROPERT_TYPE (
Packit Service b23acc
	                                  .dbus_type     = NM_G_VARIANT_TYPE ("a(ayuayu)"),
Packit Service b23acc
	                                  .to_dbus_fcn   = ip6_routes_get,
Packit Service b23acc
	                                  .from_dbus_fcn = ip6_routes_set,
Packit Service b23acc
	                              ));
Packit Service b23acc
Packit Service b23acc
	/* ---dbus---
Packit Service b23acc
	 * property: route-data
Packit Service b23acc
	 * format: array of vardict
Packit Service b23acc
	 * description: Array of IPv6 routes. Each route dictionary contains at
Packit Service b23acc
	 *   least 'dest' and 'prefix' entries, containing the destination IP
Packit Service b23acc
	 *   address as a string, and the prefix length as a uint32. Most routes
Packit Service b23acc
	 *   will also have a 'next-hop' entry, containing the next hop IP address as
Packit Service b23acc
	 *   a string. If the route has a 'metric' entry (containing a uint32), that
Packit Service b23acc
	 *   will be used as the metric for the route (otherwise NM will pick a
Packit Service b23acc
	 *   default value appropriate to the device). Additional attributes may
Packit Service b23acc
	 *   also exist on some routes.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	_nm_properties_override_dbus (properties_override,
Packit Service b23acc
	                              "route-data",
Packit Service b23acc
	                              NM_SETT_INFO_PROPERT_TYPE (
Packit Service b23acc
	                                  .dbus_type     = NM_G_VARIANT_TYPE ("aa{sv}"),
Packit Service b23acc
	                                  .to_dbus_fcn   = ip6_route_data_get,
Packit Service b23acc
	                                  .from_dbus_fcn = ip6_route_data_set,
Packit Service b23acc
	                              ));
Packit Service b23acc
Packit Service b23acc
	g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
Packit Service b23acc
Packit Service b23acc
	_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_IP6_CONFIG,
Packit Service b23acc
	                               NULL, properties_override);
Packit Service b23acc
}