diff --git a/ChangeLog b/ChangeLog index 9de35fcd11..5b58c847d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2008-10-30 Dan Williams + + * libnm-util/libnm-util.ver + libnm-util/nm-setting-ip6-config.c + libnm-util/nm-setting-ip6-config.h + libnm-util/Makefile.am + - Make properties private and add accessor functions + - Hide IPv6 stuff from public API, it's incomplete and completely unused + + * libnm-util/nm-connection.c + libnm-util/nm-utils.c + libnm-util/nm-utils.h + - Ignore IPv6 stuff for now + 2008-10-30 Dan Williams * libnm-util/libnm-util.ver diff --git a/libnm-util/Makefile.am b/libnm-util/Makefile.am index a68b396290..77acdf8198 100644 --- a/libnm-util/Makefile.am +++ b/libnm-util/Makefile.am @@ -15,7 +15,6 @@ libnm_util_include_HEADERS = \ nm-setting-8021x.h \ nm-setting-connection.h \ nm-setting-ip4-config.h \ - nm-setting-ip6-config.h \ nm-setting-ppp.h \ nm-setting-pppoe.h \ nm-setting-serial.h \ @@ -91,5 +90,5 @@ pkgconfig_DATA = libnm-util.pc DISTCLEANFILES = libnm-util.pc -EXTRA_DIST = libnm-util.pc.in libnm-util.ver +EXTRA_DIST = libnm-util.pc.in libnm-util.ver nm-setting-ip6-config.h diff --git a/libnm-util/libnm-util.ver b/libnm-util/libnm-util.ver index bd2f88a30c..e706a92ca9 100644 --- a/libnm-util/libnm-util.ver +++ b/libnm-util/libnm-util.ver @@ -125,10 +125,6 @@ global: nm_setting_ip4_config_get_ignore_auto_dns; nm_setting_ip4_config_get_dhcp_client_id; nm_setting_ip4_config_get_dhcp_hostname; - nm_setting_ip6_config_error_get_type; - nm_setting_ip6_config_error_quark; - nm_setting_ip6_config_get_type; - nm_setting_ip6_config_new; nm_setting_need_secrets; nm_setting_ppp_error_get_type; nm_setting_ppp_error_quark; @@ -253,10 +249,6 @@ global: nm_utils_ip4_prefix_to_netmask; nm_utils_ip4_routes_from_gvalue; nm_utils_ip4_routes_to_gvalue; - nm_utils_ip6_addresses_from_gvalue; - nm_utils_ip6_addresses_to_gvalue; - nm_utils_ip6_dns_from_gvalue; - nm_utils_ip6_dns_to_gvalue; nm_utils_is_empty_ssid; nm_utils_register_value_transformations; nm_utils_same_ssid; diff --git a/libnm-util/nm-connection.c b/libnm-util/nm-connection.c index 7ec48e6697..04590b0d7d 100644 --- a/libnm-util/nm-connection.c +++ b/libnm-util/nm-connection.c @@ -107,7 +107,7 @@ static guint signals[LAST_SIGNAL] = { 0 }; static GHashTable *registered_settings = NULL; -#define DEFAULT_MAP_SIZE 14 +#define DEFAULT_MAP_SIZE 13 static struct SettingInfo { const char *name; @@ -201,11 +201,6 @@ register_default_settings (void) NM_SETTING_IP4_CONFIG_ERROR, 6); - register_one_setting (NM_SETTING_IP6_CONFIG_SETTING_NAME, - NM_TYPE_SETTING_IP6_CONFIG, - NM_SETTING_IP6_CONFIG_ERROR, - 7); - /* Be sure to update DEFAULT_MAP_SIZE if you add another setting!! */ } diff --git a/libnm-util/nm-setting-ip6-config.c b/libnm-util/nm-setting-ip6-config.c index 79cba289e2..8492da7ab5 100644 --- a/libnm-util/nm-setting-ip6-config.c +++ b/libnm-util/nm-setting-ip6-config.c @@ -30,6 +30,13 @@ #include "nm-utils.h" #include "nm-dbus-glib-types.h" +GSList *nm_utils_ip6_addresses_from_gvalue (const GValue *value); +void nm_utils_ip6_addresses_to_gvalue (GSList *list, GValue *value); + +GSList *nm_utils_ip6_dns_from_gvalue (const GValue *value); +void nm_utils_ip6_dns_to_gvalue (GSList *list, GValue *value); + + GQuark nm_setting_ip6_config_error_quark (void) { @@ -68,6 +75,20 @@ nm_setting_ip6_config_error_get_type (void) G_DEFINE_TYPE (NMSettingIP6Config, nm_setting_ip6_config, NM_TYPE_SETTING) +#define NM_SETTING_IP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP6_CONFIG, NMSettingIP6ConfigPrivate)) + +typedef struct { + char *method; + GSList *dns; /* array of struct in6_addr */ + GSList *dns_search; /* list of strings */ + GSList *addresses; /* array of NMIP6Address */ + GSList *routes; /* array of NMIP6Route */ + gboolean ignore_auto_dns; + gboolean ignore_ra; + char *dhcp_mode; +} NMSettingIP6ConfigPrivate; + + enum { PROP_0, PROP_METHOD, @@ -75,9 +96,9 @@ enum { PROP_DNS_SEARCH, PROP_ADDRESSES, PROP_ROUTES, - PROP_IGNORE_DHCPV6_DNS, - PROP_DISABLE_RA, - PROP_DHCPV6_MODE, + PROP_IGNORE_AUTO_DNS, + PROP_IGNORE_ROUTER_ADV, + PROP_DHCP_MODE, LAST_PROP }; @@ -88,12 +109,324 @@ nm_setting_ip6_config_new (void) return (NMSetting *) g_object_new (NM_TYPE_SETTING_IP6_CONFIG, NULL); } +const char * +nm_setting_ip6_config_get_method (NMSettingIP6Config *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL); + + return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->method; +} + +guint32 +nm_setting_ip6_config_get_num_dns (NMSettingIP6Config *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), 0); + + return g_slist_length (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns); +} + +const struct in6_addr * +nm_setting_ip6_config_get_dns (NMSettingIP6Config *setting, guint32 i) +{ + NMSettingIP6ConfigPrivate *priv; + + + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), 0); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + g_return_val_if_fail (i <= g_slist_length (priv->dns), NULL); + + return (const struct in6_addr *) g_slist_nth_data (priv->dns, i); +} + +gboolean +nm_setting_ip6_config_add_dns (NMSettingIP6Config *setting, const struct in6_addr *addr) +{ + NMSettingIP6ConfigPrivate *priv; + struct in6_addr *copy; + GSList *iter; + + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + for (iter = priv->dns; iter; iter = g_slist_next (iter)) { + if (!memcmp (addr, (struct in6_addr *) iter->data, sizeof (struct in6_addr))) + return FALSE; + } + + copy = g_malloc0 (sizeof (struct in6_addr)); + memcpy (copy, addr, sizeof (struct in6_addr)); + priv->dns = g_slist_append (priv->dns, copy); + + return TRUE; +} + +void +nm_setting_ip6_config_remove_dns (NMSettingIP6Config *setting, guint32 i) +{ + NMSettingIP6ConfigPrivate *priv; + GSList *elt; + + g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + elt = g_slist_nth (priv->dns, i); + g_return_if_fail (elt != NULL); + + g_free (elt->data); + priv->dns = g_slist_delete_link (priv->dns, elt); +} + +void +nm_setting_ip6_config_clear_dns (NMSettingIP6Config *setting) +{ + g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); + + nm_utils_slist_free (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns, g_free); + NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns = NULL; +} + +guint32 +nm_setting_ip6_config_get_num_dns_searches (NMSettingIP6Config *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), 0); + + return g_slist_length (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns_search); +} + +const char * +nm_setting_ip6_config_get_dns_search (NMSettingIP6Config *setting, guint32 i) +{ + NMSettingIP6ConfigPrivate *priv; + + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + g_return_val_if_fail (i <= g_slist_length (priv->dns_search), NULL); + + return (const char *) g_slist_nth_data (priv->dns_search, i); +} + +gboolean +nm_setting_ip6_config_add_dns_search (NMSettingIP6Config *setting, + const char *dns_search) +{ + NMSettingIP6ConfigPrivate *priv; + GSList *iter; + + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); + g_return_val_if_fail (dns_search != NULL, FALSE); + g_return_val_if_fail (dns_search[0] != '\0', FALSE); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + for (iter = priv->dns_search; iter; iter = g_slist_next (iter)) { + if (!strcmp (dns_search, (char *) iter->data)) + return FALSE; + } + + priv->dns_search = g_slist_append (priv->dns_search, g_strdup (dns_search)); + return TRUE; +} + +void +nm_setting_ip6_config_remove_dns_search (NMSettingIP6Config *setting, guint32 i) +{ + NMSettingIP6ConfigPrivate *priv; + GSList *elt; + + g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + elt = g_slist_nth (priv->dns_search, i); + g_return_if_fail (elt != NULL); + + g_free (elt->data); + priv->dns_search = g_slist_delete_link (priv->dns_search, elt); +} + +void +nm_setting_ip6_config_clear_dns_searches (NMSettingIP6Config *setting) +{ + g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); + + nm_utils_slist_free (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns_search, g_free); + NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dns_search = NULL; +} + +guint32 +nm_setting_ip6_config_get_num_addresses (NMSettingIP6Config *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), 0); + + return g_slist_length (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->addresses); +} + +NMIP6Address * +nm_setting_ip6_config_get_address (NMSettingIP6Config *setting, guint32 i) +{ + NMSettingIP6ConfigPrivate *priv; + + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + g_return_val_if_fail (i <= g_slist_length (priv->addresses), NULL); + + return (NMIP6Address *) g_slist_nth_data (priv->addresses, i); +} + +gboolean +nm_setting_ip6_config_add_address (NMSettingIP6Config *setting, + NMIP6Address *address) +{ + NMSettingIP6ConfigPrivate *priv; + NMIP6Address *copy; + GSList *iter; + + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); + g_return_val_if_fail (address != NULL, FALSE); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + for (iter = priv->addresses; iter; iter = g_slist_next (iter)) { + if (nm_ip6_address_compare ((NMIP6Address *) iter->data, address)) + return FALSE; + } + + copy = nm_ip6_address_dup (address); + g_return_val_if_fail (copy != NULL, FALSE); + + priv->addresses = g_slist_append (priv->addresses, copy); + return TRUE; +} + +void +nm_setting_ip6_config_remove_address (NMSettingIP6Config *setting, guint32 i) +{ + NMSettingIP6ConfigPrivate *priv; + GSList *elt; + + g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + elt = g_slist_nth (priv->addresses, i); + g_return_if_fail (elt != NULL); + + nm_ip6_address_unref ((NMIP6Address *) elt->data); + priv->addresses = g_slist_delete_link (priv->addresses, elt); +} + +void +nm_setting_ip6_config_clear_addresses (NMSettingIP6Config *setting) +{ + NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + + g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); + + nm_utils_slist_free (priv->addresses, (GDestroyNotify) nm_ip6_address_unref); + priv->addresses = NULL; +} + +guint32 +nm_setting_ip6_config_get_num_routes (NMSettingIP6Config *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), 0); + + return g_slist_length (NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->routes); +} + +NMIP6Route * +nm_setting_ip6_config_get_route (NMSettingIP6Config *setting, guint32 i) +{ + NMSettingIP6ConfigPrivate *priv; + + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), NULL); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + g_return_val_if_fail (i <= g_slist_length (priv->routes), NULL); + + return (NMIP6Route *) g_slist_nth_data (priv->routes, i); +} + +gboolean +nm_setting_ip6_config_add_route (NMSettingIP6Config *setting, + NMIP6Route *route) +{ + NMSettingIP6ConfigPrivate *priv; + NMIP6Route *copy; + GSList *iter; + + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); + g_return_val_if_fail (route != NULL, FALSE); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + for (iter = priv->routes; iter; iter = g_slist_next (iter)) { + if (nm_ip6_route_compare ((NMIP6Route *) iter->data, route)) + return FALSE; + } + + copy = nm_ip6_route_dup (route); + g_return_val_if_fail (copy != NULL, FALSE); + + priv->routes = g_slist_append (priv->routes, copy); + return TRUE; +} + +void +nm_setting_ip6_config_remove_route (NMSettingIP6Config *setting, guint32 i) +{ + NMSettingIP6ConfigPrivate *priv; + GSList *elt; + + g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); + + priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + elt = g_slist_nth (priv->routes, i); + g_return_if_fail (elt != NULL); + + nm_ip6_route_unref ((NMIP6Route *) elt->data); + priv->routes = g_slist_delete_link (priv->routes, elt); +} + +void +nm_setting_ip6_config_clear_routes (NMSettingIP6Config *setting) +{ + NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); + + g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); + + nm_utils_slist_free (priv->routes, (GDestroyNotify) nm_ip6_route_unref); + priv->routes = NULL; +} + +gboolean +nm_setting_ip6_config_get_ignore_auto_dns (NMSettingIP6Config *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); + + return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->ignore_auto_dns; +} + +gboolean +nm_setting_ip6_config_get_ignore_router_adv (NMSettingIP6Config *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); + + return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->ignore_ra; +} + +const char * +nm_setting_ip6_config_get_dhcp_mode (NMSettingIP6Config *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); + + return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->dhcp_mode; +} + static gboolean verify (NMSetting *setting, GSList *all_settings, GError **error) { - NMSettingIP6Config *self = NM_SETTING_IP6_CONFIG (setting); + NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); - if (!self->method) { + if (!priv->method) { g_set_error (error, NM_SETTING_IP6_CONFIG_ERROR, NM_SETTING_IP6_CONFIG_ERROR_MISSING_PROPERTY, @@ -101,18 +434,18 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) return FALSE; } - if (!strcmp (self->method, NM_SETTING_IP6_CONFIG_METHOD_MANUAL)) { - if (!self->addresses) { + if (!strcmp (priv->method, NM_SETTING_IP6_CONFIG_METHOD_MANUAL)) { + if (!priv->addresses) { g_set_error (error, NM_SETTING_IP6_CONFIG_ERROR, NM_SETTING_IP6_CONFIG_ERROR_MISSING_PROPERTY, NM_SETTING_IP6_CONFIG_ADDRESSES); return FALSE; } - } else if ( !strcmp (self->method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) - || !strcmp (self->method, NM_SETTING_IP6_CONFIG_METHOD_SHARED)) { - if (!self->ignore_dhcpv6_dns) { - if (self->dns && g_slist_length (self->dns)) { + } else if ( !strcmp (priv->method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) + || !strcmp (priv->method, NM_SETTING_IP6_CONFIG_METHOD_SHARED)) { + if (!priv->ignore_auto_dns) { + if (priv->dns && g_slist_length (priv->dns)) { g_set_error (error, NM_SETTING_IP6_CONFIG_ERROR, NM_SETTING_IP6_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD, @@ -120,7 +453,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) return FALSE; } - if (g_slist_length (self->dns_search)) { + if (g_slist_length (priv->dns_search)) { g_set_error (error, NM_SETTING_IP6_CONFIG_ERROR, NM_SETTING_IP6_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD, @@ -129,7 +462,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) } } - if (g_slist_length (self->addresses)) { + if (g_slist_length (priv->addresses)) { g_set_error (error, NM_SETTING_IP6_CONFIG_ERROR, NM_SETTING_IP6_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD, @@ -140,11 +473,11 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) /* if router advertisement autoconf is disabled, dhcpv6 mode must * be SOMETHING as long as the user has selected the auto method */ - if (self->disable_ra && (self->dhcpv6_mode == NULL)) { + if (priv->ignore_ra && (priv->dhcp_mode == NULL)) { g_set_error (error, NM_SETTING_IP6_CONFIG_ERROR, NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY, - NM_SETTING_IP6_CONFIG_DHCPV6_MODE); + NM_SETTING_IP6_CONFIG_DHCP_MODE); return FALSE; } } else { @@ -168,16 +501,16 @@ nm_setting_ip6_config_init (NMSettingIP6Config *setting) static void finalize (GObject *object) { - NMSettingIP6Config *self = NM_SETTING_IP6_CONFIG (object); + NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (object); - g_free (self->method); + g_free (priv->method); - if (self->dns) - g_slist_free (self->dns); + if (priv->dns) + g_slist_free (priv->dns); - nm_utils_slist_free (self->dns_search, g_free); - nm_utils_slist_free (self->addresses, g_free); - nm_utils_slist_free (self->routes, g_free); + nm_utils_slist_free (priv->dns_search, g_free); + nm_utils_slist_free (priv->addresses, g_free); + nm_utils_slist_free (priv->routes, g_free); G_OBJECT_CLASS (nm_setting_ip6_config_parent_class)->finalize (object); } @@ -186,38 +519,38 @@ static void set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { - NMSettingIP6Config *setting = NM_SETTING_IP6_CONFIG (object); + NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (object); switch (prop_id) { case PROP_METHOD: - g_free (setting->method); - setting->method = g_value_dup_string (value); + g_free (priv->method); + priv->method = g_value_dup_string (value); break; case PROP_DNS: - nm_utils_slist_free (setting->dns, g_free); - setting->dns = nm_utils_ip6_dns_from_gvalue (value); + nm_utils_slist_free (priv->dns, g_free); + priv->dns = nm_utils_ip6_dns_from_gvalue (value); break; case PROP_DNS_SEARCH: - nm_utils_slist_free (setting->dns_search, g_free); - setting->dns_search = g_value_dup_boxed (value); + nm_utils_slist_free (priv->dns_search, g_free); + priv->dns_search = g_value_dup_boxed (value); break; case PROP_ADDRESSES: - nm_utils_slist_free (setting->addresses, g_free); - setting->addresses = nm_utils_ip6_addresses_from_gvalue (value); + nm_utils_slist_free (priv->addresses, g_free); + priv->addresses = nm_utils_ip6_addresses_from_gvalue (value); break; case PROP_ROUTES: - nm_utils_slist_free (setting->routes, g_free); - setting->routes = nm_utils_ip6_addresses_from_gvalue (value); + nm_utils_slist_free (priv->routes, g_free); + priv->routes = nm_utils_ip6_addresses_from_gvalue (value); break; - case PROP_IGNORE_DHCPV6_DNS: - setting->ignore_dhcpv6_dns = g_value_get_boolean (value); + case PROP_IGNORE_AUTO_DNS: + priv->ignore_auto_dns = g_value_get_boolean (value); break; - case PROP_DISABLE_RA: - setting->disable_ra = g_value_get_boolean (value); + case PROP_IGNORE_ROUTER_ADV: + priv->ignore_ra = g_value_get_boolean (value); break; - case PROP_DHCPV6_MODE: - g_free (setting->dhcpv6_mode); - setting->dhcpv6_mode = g_value_dup_string (value); + case PROP_DHCP_MODE: + g_free (priv->dhcp_mode); + priv->dhcp_mode = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -229,32 +562,32 @@ static void get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { - NMSettingIP6Config *setting = NM_SETTING_IP6_CONFIG (object); + NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (object); switch (prop_id) { case PROP_METHOD: - g_value_set_string (value, setting->method); + g_value_set_string (value, priv->method); break; case PROP_DNS: - nm_utils_ip6_dns_to_gvalue (setting->dns, value); + nm_utils_ip6_dns_to_gvalue (priv->dns, value); break; case PROP_DNS_SEARCH: - g_value_set_boxed (value, setting->dns_search); + g_value_set_boxed (value, priv->dns_search); break; case PROP_ADDRESSES: - nm_utils_ip6_addresses_to_gvalue (setting->addresses, value); + nm_utils_ip6_addresses_to_gvalue (priv->addresses, value); break; case PROP_ROUTES: - nm_utils_ip6_addresses_to_gvalue (setting->routes, value); + nm_utils_ip6_addresses_to_gvalue (priv->routes, value); break; - case PROP_IGNORE_DHCPV6_DNS: - g_value_set_boolean (value, setting->ignore_dhcpv6_dns); + case PROP_IGNORE_AUTO_DNS: + g_value_set_boolean (value, priv->ignore_auto_dns); break; - case PROP_DISABLE_RA: - g_value_set_boolean (value, setting->disable_ra); + case PROP_IGNORE_ROUTER_ADV: + g_value_set_boolean (value, priv->ignore_ra); break; - case PROP_DHCPV6_MODE: - g_value_set_string (value, setting->dhcpv6_mode); + case PROP_DHCP_MODE: + g_value_set_string (value, priv->dhcp_mode); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -316,26 +649,344 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *setting_class) G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE)); g_object_class_install_property - (object_class, PROP_IGNORE_DHCPV6_DNS, - g_param_spec_boolean (NM_SETTING_IP6_CONFIG_IGNORE_DHCPV6_DNS, + (object_class, PROP_IGNORE_AUTO_DNS, + g_param_spec_boolean (NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS, "Ignore DHCPv6 DNS", "Ignore DHCPv6 DNS", FALSE, G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE)); g_object_class_install_property - (object_class, PROP_DISABLE_RA, - g_param_spec_boolean (NM_SETTING_IP6_CONFIG_DISABLE_RA, + (object_class, PROP_IGNORE_ROUTER_ADV, + g_param_spec_boolean (NM_SETTING_IP6_CONFIG_IGNORE_ROUTER_ADV, "Ignore Router Advertisements", "Ignore Router Advertisements", FALSE, G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE)); g_object_class_install_property - (object_class, PROP_DHCPV6_MODE, - g_param_spec_string (NM_SETTING_IP6_CONFIG_DHCPV6_MODE, + (object_class, PROP_DHCP_MODE, + g_param_spec_string (NM_SETTING_IP6_CONFIG_DHCP_MODE, "DHCPv6 Client Mode", "DHCPv6 Client Mode", NULL, G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE)); } + +struct NMIP6Address { + guint32 refcount; + struct in6_addr *address; /* network byte order */ + guint32 prefix; + struct in6_addr *gateway; /* network byte order */ +}; + +NMIP6Address * +nm_ip6_address_new (void) +{ + NMIP6Address *address; + + address = g_malloc0 (sizeof (NMIP6Address)); + address->refcount = 1; + return address; +} + +NMIP6Address * +nm_ip6_address_dup (NMIP6Address *source) +{ + NMIP6Address *address; + + g_return_val_if_fail (source != NULL, NULL); + g_return_val_if_fail (source->refcount > 0, NULL); + + address = nm_ip6_address_new (); + address->prefix = source->prefix; + + if (source->address) { + address->address = g_malloc0 (sizeof (struct in6_addr)); + memcpy (address->address, source->address, sizeof (struct in6_addr)); + } + + if (source->gateway) { + address->gateway = g_malloc0 (sizeof (struct in6_addr)); + memcpy (address->gateway, source->gateway, sizeof (struct in6_addr)); + } + + return address; +} + +void +nm_ip6_address_ref (NMIP6Address *address) +{ + g_return_if_fail (address != NULL); + g_return_if_fail (address->refcount > 0); + + address->refcount++; +} + +void +nm_ip6_address_unref (NMIP6Address *address) +{ + g_return_if_fail (address != NULL); + g_return_if_fail (address->refcount > 0); + + address->refcount--; + if (address->refcount == 0) { + g_free (address->address); + g_free (address->gateway); + memset (address, 0, sizeof (NMIP6Address)); + g_free (address); + } +} + +gboolean +nm_ip6_address_compare (NMIP6Address *address, NMIP6Address *other) +{ + g_return_val_if_fail (address != NULL, FALSE); + g_return_val_if_fail (address->refcount > 0, FALSE); + + g_return_val_if_fail (other != NULL, FALSE); + g_return_val_if_fail (other->refcount > 0, FALSE); + + if ( memcmp (address->address, other->address, sizeof (struct in6_addr)) + || address->prefix != other->prefix + || memcmp (address->gateway, other->gateway, sizeof (struct in6_addr))) + return FALSE; + return TRUE; +} + +const struct in6_addr * +nm_ip6_address_get_address (NMIP6Address *address) +{ + g_return_val_if_fail (address != NULL, 0); + g_return_val_if_fail (address->refcount > 0, 0); + + return address->address; +} + +void +nm_ip6_address_set_address (NMIP6Address *address, const struct in6_addr *addr) +{ + g_return_if_fail (address != NULL); + g_return_if_fail (address->refcount > 0); + + g_free (address->address); + address->address = NULL; + + if (addr) { + address->address = g_malloc0 (sizeof (struct in6_addr)); + memcpy (address->address, addr, sizeof (struct in6_addr)); + } +} + +guint32 +nm_ip6_address_get_prefix (NMIP6Address *address) +{ + g_return_val_if_fail (address != NULL, 0); + g_return_val_if_fail (address->refcount > 0, 0); + + return address->prefix; +} + +void +nm_ip6_address_set_prefix (NMIP6Address *address, guint32 prefix) +{ + g_return_if_fail (address != NULL); + g_return_if_fail (address->refcount > 0); + + address->prefix = prefix; +} + +const struct in6_addr * +nm_ip6_address_get_gateway (NMIP6Address *address) +{ + g_return_val_if_fail (address != NULL, 0); + g_return_val_if_fail (address->refcount > 0, 0); + + return address->gateway; +} + +void +nm_ip6_address_set_gateway (NMIP6Address *address, const struct in6_addr *gateway) +{ + g_return_if_fail (address != NULL); + g_return_if_fail (address->refcount > 0); + + g_free (address->gateway); + address->gateway = NULL; + + if (gateway) { + address->gateway = g_malloc0 (sizeof (struct in6_addr)); + memcpy (address->gateway, gateway, sizeof (struct in6_addr)); + } +} + + +struct NMIP6Route { + guint32 refcount; + + struct in6_addr *dest; /* network byte order */ + guint32 prefix; + struct in6_addr *next_hop; /* network byte order */ + guint32 metric; /* lower metric == more preferred */ +}; + +NMIP6Route * +nm_ip6_route_new (void) +{ + NMIP6Route *route; + + route = g_malloc0 (sizeof (NMIP6Route)); + route->refcount = 1; + return route; +} + +NMIP6Route * +nm_ip6_route_dup (NMIP6Route *source) +{ + NMIP6Route *route; + + g_return_val_if_fail (source != NULL, NULL); + g_return_val_if_fail (source->refcount > 0, NULL); + + route = nm_ip6_route_new (); + route->prefix = source->prefix; + route->metric = source->metric; + + if (source->dest) { + route->dest = g_malloc0 (sizeof (struct in6_addr)); + memcpy (route->dest, source->dest, sizeof (struct in6_addr)); + } + + if (source->next_hop) { + route->next_hop = g_malloc0 (sizeof (struct in6_addr)); + memcpy (route->next_hop, source->next_hop, sizeof (struct in6_addr)); + } + + return route; +} + +void +nm_ip6_route_ref (NMIP6Route *route) +{ + g_return_if_fail (route != NULL); + g_return_if_fail (route->refcount > 0); + + route->refcount++; +} + +void +nm_ip6_route_unref (NMIP6Route *route) +{ + g_return_if_fail (route != NULL); + g_return_if_fail (route->refcount > 0); + + route->refcount--; + if (route->refcount == 0) { + g_free (route->dest); + g_free (route->next_hop); + memset (route, 0, sizeof (NMIP6Route)); + g_free (route); + } +} + +gboolean +nm_ip6_route_compare (NMIP6Route *route, NMIP6Route *other) +{ + g_return_val_if_fail (route != NULL, FALSE); + g_return_val_if_fail (route->refcount > 0, FALSE); + + g_return_val_if_fail (other != NULL, FALSE); + g_return_val_if_fail (other->refcount > 0, FALSE); + + if ( memcmp (route->dest, other->dest, sizeof (struct in6_addr)) + || route->prefix != other->prefix + || memcmp (route->next_hop, other->next_hop, sizeof (struct in6_addr)) + || route->metric != other->metric) + return FALSE; + return TRUE; +} + +const struct in6_addr * +nm_ip6_route_get_dest (NMIP6Route *route) +{ + g_return_val_if_fail (route != NULL, 0); + g_return_val_if_fail (route->refcount > 0, 0); + + return route->dest; +} + +void +nm_ip6_route_set_dest (NMIP6Route *route, const struct in6_addr *dest) +{ + g_return_if_fail (route != NULL); + g_return_if_fail (route->refcount > 0); + + g_free (route->dest); + route->dest = NULL; + + if (dest) { + route->dest = g_malloc0 (sizeof (struct in6_addr)); + memcpy (route->dest, dest, sizeof (struct in6_addr)); + } +} + +guint32 +nm_ip6_route_get_prefix (NMIP6Route *route) +{ + g_return_val_if_fail (route != NULL, 0); + g_return_val_if_fail (route->refcount > 0, 0); + + return route->prefix; +} + +void +nm_ip6_route_set_prefix (NMIP6Route *route, guint32 prefix) +{ + g_return_if_fail (route != NULL); + g_return_if_fail (route->refcount > 0); + + route->prefix = prefix; +} + +const struct in6_addr * +nm_ip6_route_get_next_hop (NMIP6Route *route) +{ + g_return_val_if_fail (route != NULL, 0); + g_return_val_if_fail (route->refcount > 0, 0); + + return route->next_hop; +} + +void +nm_ip6_route_set_next_hop (NMIP6Route *route, const struct in6_addr *next_hop) +{ + g_return_if_fail (route != NULL); + g_return_if_fail (route->refcount > 0); + + g_free (route->next_hop); + route->next_hop = NULL; + + if (next_hop) { + route->next_hop = g_malloc0 (sizeof (struct in6_addr)); + memcpy (route->next_hop, next_hop, sizeof (struct in6_addr)); + } +} + +guint32 +nm_ip6_route_get_metric (NMIP6Route *route) +{ + g_return_val_if_fail (route != NULL, 0); + g_return_val_if_fail (route->refcount > 0, 0); + + return route->metric; +} + +void +nm_ip6_route_set_metric (NMIP6Route *route, guint32 metric) +{ + g_return_if_fail (route != NULL); + g_return_if_fail (route->refcount > 0); + + route->metric = metric; +} + diff --git a/libnm-util/nm-setting-ip6-config.h b/libnm-util/nm-setting-ip6-config.h index b613f96cca..879d82e0cb 100644 --- a/libnm-util/nm-setting-ip6-config.h +++ b/libnm-util/nm-setting-ip6-config.h @@ -59,9 +59,9 @@ GQuark nm_setting_ip6_config_error_quark (void); #define NM_SETTING_IP6_CONFIG_DNS_SEARCH "dns-search" #define NM_SETTING_IP6_CONFIG_ADDRESSES "addresses" #define NM_SETTING_IP6_CONFIG_ROUTES "routes" -#define NM_SETTING_IP6_CONFIG_IGNORE_DHCPV6_DNS "ignore-dhcpv6-dns" -#define NM_SETTING_IP6_CONFIG_DISABLE_RA "disable-ra" -#define NM_SETTING_IP6_CONFIG_DHCPV6_MODE "dhcpv6-mode" +#define NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS "ignore-auto-dns" +#define NM_SETTING_IP6_CONFIG_IGNORE_ROUTER_ADV "ignore-router-adv" +#define NM_SETTING_IP6_CONFIG_DHCP_MODE "dhcp-mode" #define NM_SETTING_IP6_CONFIG_METHOD_AUTO "auto" #define NM_SETTING_IP6_CONFIG_METHOD_MANUAL "manual" @@ -70,32 +70,95 @@ GQuark nm_setting_ip6_config_error_quark (void); #define NM_SETTING_IP6_CONFIG_DHCPV6_MODE_INFO "info" #define NM_SETTING_IP6_CONFIG_DHCPV6_MODE_REQUEST "request" -typedef struct { - struct in6_addr address; - guint32 prefix; - struct in6_addr gateway; -} NMSettingIP6Address; + +typedef struct NMIP6Address NMIP6Address; + +NMIP6Address * nm_ip6_address_new (void); +NMIP6Address * nm_ip6_address_dup (NMIP6Address *source); +void nm_ip6_address_ref (NMIP6Address *address); +void nm_ip6_address_unref (NMIP6Address *address); +/* Return TRUE if addresses are identical */ +gboolean nm_ip6_address_compare (NMIP6Address *address, NMIP6Address *other); + +const struct in6_addr *nm_ip6_address_get_address (NMIP6Address *address); +void nm_ip6_address_set_address (NMIP6Address *address, + const struct in6_addr *addr); /* network byte order */ + +guint32 nm_ip6_address_get_prefix (NMIP6Address *address); +void nm_ip6_address_set_prefix (NMIP6Address *address, + guint32 prefix); + +const struct in6_addr *nm_ip6_address_get_gateway (NMIP6Address *address); +void nm_ip6_address_set_gateway (NMIP6Address *address, + const struct in6_addr *addr); /* network byte order */ + +typedef struct NMIP6Route NMIP6Route; + +NMIP6Route * nm_ip6_route_new (void); +NMIP6Route * nm_ip6_route_dup (NMIP6Route *route); +void nm_ip6_route_ref (NMIP6Route *route); +void nm_ip6_route_unref (NMIP6Route *route); +/* Return TRUE if routes are identical */ +gboolean nm_ip6_route_compare (NMIP6Route *route, NMIP6Route *other); + +const struct in6_addr *nm_ip6_route_get_dest (NMIP6Route *route); +void nm_ip6_route_set_dest (NMIP6Route *route, + const struct in6_addr *dest); /* network byte order */ + +guint32 nm_ip6_route_get_prefix (NMIP6Route *route); +void nm_ip6_route_set_prefix (NMIP6Route *route, + guint32 prefix); + +const struct in6_addr *nm_ip6_route_get_next_hop (NMIP6Route *route); +void nm_ip6_route_set_next_hop (NMIP6Route *route, + const struct in6_addr *next_hop); /* network byte order */ + +guint32 nm_ip6_route_get_metric (NMIP6Route *route); +void nm_ip6_route_set_metric (NMIP6Route *route, + guint32 metric); typedef struct { NMSetting parent; - - char *method; - GSList *dns; /* array of struct in6_addr */ - GSList *dns_search; /* list of strings */ - GSList *addresses; /* array of NMSettingIP6Address */ - GSList *routes; /* array of NMSettingIP6Address */ - gboolean ignore_dhcpv6_dns; - gboolean disable_ra; - char *dhcpv6_mode; } NMSettingIP6Config; typedef struct { NMSettingClass parent; } NMSettingIP6ConfigClass; +/* IPv6 support is currently incomplete. Do not use. */ + GType nm_setting_ip6_config_get_type (void); -NMSetting *nm_setting_ip6_config_new (void); +NMSetting * nm_setting_ip6_config_new (void); +const char * nm_setting_ip6_config_get_method (NMSettingIP6Config *setting); + +guint32 nm_setting_ip6_config_get_num_dns (NMSettingIP6Config *setting); +const struct in6_addr *nm_setting_ip6_config_get_dns (NMSettingIP6Config *setting, guint32 i); +gboolean nm_setting_ip6_config_add_dns (NMSettingIP6Config *setting, const struct in6_addr *dns); +void nm_setting_ip6_config_remove_dns (NMSettingIP6Config *setting, guint32 i); +void nm_setting_ip6_config_clear_dns (NMSettingIP6Config *setting); + +guint32 nm_setting_ip6_config_get_num_dns_searches (NMSettingIP6Config *setting); +const char * nm_setting_ip6_config_get_dns_search (NMSettingIP6Config *setting, guint32 i); +gboolean nm_setting_ip6_config_add_dns_search (NMSettingIP6Config *setting, const char *dns_search); +void nm_setting_ip6_config_remove_dns_search (NMSettingIP6Config *setting, guint32 i); +void nm_setting_ip6_config_clear_dns_searches (NMSettingIP6Config *setting); + +guint32 nm_setting_ip6_config_get_num_addresses (NMSettingIP6Config *setting); +NMIP6Address * nm_setting_ip6_config_get_address (NMSettingIP6Config *setting, guint32 i); +gboolean nm_setting_ip6_config_add_address (NMSettingIP6Config *setting, NMIP6Address *address); +void nm_setting_ip6_config_remove_address (NMSettingIP6Config *setting, guint32 i); +void nm_setting_ip6_config_clear_addresses (NMSettingIP6Config *setting); + +guint32 nm_setting_ip6_config_get_num_routes (NMSettingIP6Config *setting); +NMIP6Route * nm_setting_ip6_config_get_route (NMSettingIP6Config *setting, guint32 i); +gboolean nm_setting_ip6_config_add_route (NMSettingIP6Config *setting, NMIP6Route *route); +void nm_setting_ip6_config_remove_route (NMSettingIP6Config *setting, guint32 i); +void nm_setting_ip6_config_clear_routes (NMSettingIP6Config *setting); + +gboolean nm_setting_ip6_config_get_ignore_auto_dns (NMSettingIP6Config *setting); +gboolean nm_setting_ip6_config_get_ignore_router_adv (NMSettingIP6Config *setting); +const char * nm_setting_ip6_config_get_dhcp_mode (NMSettingIP6Config *setting); G_END_DECLS diff --git a/libnm-util/nm-utils.c b/libnm-util/nm-utils.c index f95ebae078..e82f5201a2 100644 --- a/libnm-util/nm-utils.c +++ b/libnm-util/nm-utils.c @@ -44,6 +44,14 @@ #include "nm-setting-ip6-config.h" #include "crypto.h" +/* IP6 currently incomplete */ +GSList *nm_utils_ip6_addresses_from_gvalue (const GValue *value); +void nm_utils_ip6_addresses_to_gvalue (GSList *list, GValue *value); + +GSList *nm_utils_ip6_dns_from_gvalue (const GValue *value); +void nm_utils_ip6_dns_to_gvalue (GSList *list, GValue *value); + + struct EncodingTriplet { const char *encoding1; @@ -1027,7 +1035,7 @@ nm_utils_ip6_addresses_from_gvalue (const GValue *value) GValueArray *elements = (GValueArray *) g_ptr_array_index (addresses, i); GValue *tmp; GByteArray *ba_addr, *ba_gw; - NMSettingIP6Address *addr; + NMIP6Address *addr; guint32 prefix; if ( (elements->n_values != 3) @@ -1061,11 +1069,11 @@ nm_utils_ip6_addresses_from_gvalue (const GValue *value) __func__, ba_gw->len); continue; } - - addr = g_malloc0 (sizeof (NMSettingIP6Address)); - addr->prefix = prefix; - memcpy (addr->address.s6_addr, ba_addr->data, 16); - memcpy (addr->gateway.s6_addr, ba_gw->data, 16); + + addr = nm_ip6_address_new (); + nm_ip6_address_set_prefix (addr, prefix); + nm_ip6_address_set_address (addr, (const struct in6_addr *) ba_addr->data); + nm_ip6_address_set_gateway (addr, (const struct in6_addr *) ba_gw->data); list = g_slist_prepend (list, addr); } @@ -1081,7 +1089,7 @@ nm_utils_ip6_addresses_to_gvalue (GSList *list, GValue *value) addresses = g_ptr_array_new (); for (iter = list; iter; iter = iter->next) { - NMSettingIP6Address *addr = (NMSettingIP6Address *) iter->data; + NMIP6Address *addr = (NMIP6Address *) iter->data; GValue element = { 0, }; GByteArray *ba_addr, *ba_gw; @@ -1089,14 +1097,14 @@ nm_utils_ip6_addresses_to_gvalue (GSList *list, GValue *value) g_value_take_boxed (&element, dbus_g_type_specialized_construct (DBUS_TYPE_G_IP6_ADDRESS)); ba_addr = g_byte_array_sized_new (16); - g_byte_array_append (ba_addr, (guint8 *) addr->address.s6_addr, 16); + g_byte_array_append (ba_addr, (guint8 *) nm_ip6_address_get_address (addr), 16); ba_gw = g_byte_array_sized_new (16); - g_byte_array_append (ba_gw, (guint8 *) addr->gateway.s6_addr, 16); + g_byte_array_append (ba_gw, (guint8 *) nm_ip6_address_get_gateway (addr), 16); dbus_g_type_struct_set (&element, 0, ba_addr, - 1, addr->prefix, + 1, nm_ip6_address_get_prefix (addr), 2, ba_gw, G_MAXUINT); diff --git a/libnm-util/nm-utils.h b/libnm-util/nm-utils.h index 7e66c58baa..90702647ff 100644 --- a/libnm-util/nm-utils.h +++ b/libnm-util/nm-utils.h @@ -194,12 +194,6 @@ void nm_utils_ip4_routes_to_gvalue (GSList *list, GValue *value); guint32 nm_utils_ip4_netmask_to_prefix (guint32 ip4_netmask); guint32 nm_utils_ip4_prefix_to_netmask (guint32 ip4_prefix); -GSList *nm_utils_ip6_addresses_from_gvalue (const GValue *value); -void nm_utils_ip6_addresses_to_gvalue (GSList *list, GValue *value); - -GSList *nm_utils_ip6_dns_from_gvalue (const GValue *value); -void nm_utils_ip6_dns_to_gvalue (GSList *list, GValue *value); - char *nm_utils_uuid_generate (void); char *nm_utils_uuid_generate_from_string (const char *s); diff --git a/src/nm-device-wifi.c b/src/nm-device-wifi.c index b1f546a372..7f9f641488 100644 --- a/src/nm-device-wifi.c +++ b/src/nm-device-wifi.c @@ -1658,7 +1658,6 @@ can_scan (NMDeviceWifi *self) if (req) { NMConnection *connection; NMSettingIP4Config *s_ip4; - NMSettingIP6Config *s_ip6; const char *ip4_method = NULL; connection = nm_act_request_get_connection (req); @@ -1668,10 +1667,6 @@ can_scan (NMDeviceWifi *self) if (s_ip4 && !strcmp (ip4_method, NM_SETTING_IP4_CONFIG_METHOD_SHARED)) return FALSE; - - s_ip6 = (NMSettingIP6Config *) nm_connection_get_setting (connection, NM_TYPE_SETTING_IP6_CONFIG); - if (s_ip6 && !strcmp (s_ip6->method, NM_SETTING_IP6_CONFIG_METHOD_SHARED)) - return FALSE; } return TRUE;