summaryrefslogtreecommitdiff
path: root/libnm-util
diff options
context:
space:
mode:
Diffstat (limited to 'libnm-util')
-rw-r--r--libnm-util/nm-connection.c42
-rw-r--r--libnm-util/nm-connection.h12
-rw-r--r--libnm-util/nm-setting-cdma.c34
-rw-r--r--libnm-util/nm-setting-gsm.c34
-rw-r--r--libnm-util/nm-setting-ip4-config.c49
-rw-r--r--libnm-util/nm-setting-ip4-config.h39
-rw-r--r--libnm-util/nm-setting-vpn.c17
-rw-r--r--libnm-util/nm-setting-vpn.h2
-rw-r--r--libnm-util/nm-utils.c52
-rw-r--r--libnm-util/nm-utils.h3
10 files changed, 229 insertions, 55 deletions
diff --git a/libnm-util/nm-connection.c b/libnm-util/nm-connection.c
index 870fea5177..f8e7a71d62 100644
--- a/libnm-util/nm-connection.c
+++ b/libnm-util/nm-connection.c
@@ -45,6 +45,37 @@
#include "nm-setting-gsm.h"
#include "nm-setting-cdma.h"
+GQuark
+nm_connection_error_quark (void)
+{
+ static GQuark quark;
+
+ if (G_UNLIKELY (!quark))
+ quark = g_quark_from_static_string ("nm-connection-error-quark");
+ return quark;
+}
+
+/* This should really be standard. */
+#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
+
+GType
+nm_connection_error_get_type (void)
+{
+ static GType etype = 0;
+
+ if (etype == 0) {
+ static const GEnumValue values[] = {
+ /* Unknown error. */
+ ENUM_ENTRY (NM_CONNECTION_ERROR_UNKNOWN, "UnknownError"),
+ /* The required 'connection' setting was not found. */
+ ENUM_ENTRY (NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND, "ConnectionSettingNotFound"),
+ { 0, 0, 0 }
+ };
+ etype = g_enum_register_static ("NMConnectionError", values);
+ }
+ return etype;
+}
+
typedef struct {
GHashTable *settings;
@@ -430,7 +461,7 @@ gboolean
nm_connection_verify (NMConnection *connection, GError **error)
{
NMConnectionPrivate *priv;
- NMSetting *connection_setting;
+ NMSetting *s_con;
VerifySettingsInfo info;
g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE);
@@ -440,9 +471,12 @@ nm_connection_verify (NMConnection *connection, GError **error)
priv = NM_CONNECTION_GET_PRIVATE (connection);
/* First, make sure there's at least 'connection' setting */
- connection_setting = nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
- if (!connection_setting) {
- g_warning ("'connection' setting not present.");
+ s_con = nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
+ if (!s_con) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND,
+ "connection setting not found");
return FALSE;
}
diff --git a/libnm-util/nm-connection.h b/libnm-util/nm-connection.h
index 24e6d700b4..27229356ba 100644
--- a/libnm-util/nm-connection.h
+++ b/libnm-util/nm-connection.h
@@ -45,6 +45,18 @@ typedef enum {
NM_CONNECTION_SCOPE_USER
} NMConnectionScope;
+typedef enum
+{
+ NM_CONNECTION_ERROR_UNKNOWN = 0,
+ NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND
+} NMConnectionError;
+
+#define NM_TYPE_CONNECTION_ERROR (nm_connection_error_get_type ())
+GType nm_connection_error_get_type (void);
+
+#define NM_CONNECTION_ERROR nm_connection_error_quark ()
+GQuark nm_connection_error_quark (void);
+
#define NM_CONNECTION_SCOPE "scope"
#define NM_CONNECTION_PATH "path"
diff --git a/libnm-util/nm-setting-cdma.c b/libnm-util/nm-setting-cdma.c
index 3ca41bedb1..5955963c7c 100644
--- a/libnm-util/nm-setting-cdma.c
+++ b/libnm-util/nm-setting-cdma.c
@@ -117,9 +117,42 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
return FALSE;
}
+ if (self->username && !strlen (self->username)) {
+ g_set_error (error,
+ NM_SETTING_CDMA_ERROR,
+ NM_SETTING_CDMA_ERROR_INVALID_PROPERTY,
+ NM_SETTING_CDMA_USERNAME);
+ return FALSE;
+ }
+
+ if (self->password && !strlen (self->password)) {
+ g_set_error (error,
+ NM_SETTING_CDMA_ERROR,
+ NM_SETTING_CDMA_ERROR_INVALID_PROPERTY,
+ NM_SETTING_CDMA_PASSWORD);
+ return FALSE;
+ }
+
return TRUE;
}
+static GPtrArray *
+need_secrets (NMSetting *setting)
+{
+ NMSettingCdma *self = NM_SETTING_CDMA (setting);
+ GPtrArray *secrets = NULL;
+
+ if (self->password)
+ return NULL;
+
+ if (self->username) {
+ secrets = g_ptr_array_sized_new (1);
+ g_ptr_array_add (secrets, NM_SETTING_CDMA_PASSWORD);
+ }
+
+ return secrets;
+}
+
static void
nm_setting_cdma_init (NMSettingCdma *setting)
{
@@ -196,6 +229,7 @@ nm_setting_cdma_class_init (NMSettingCdmaClass *setting_class)
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
+ parent_class->need_secrets = need_secrets;
/* Properties */
g_object_class_install_property
diff --git a/libnm-util/nm-setting-gsm.c b/libnm-util/nm-setting-gsm.c
index 97bc3ea2ca..b65fa65a22 100644
--- a/libnm-util/nm-setting-gsm.c
+++ b/libnm-util/nm-setting-gsm.c
@@ -133,9 +133,42 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
return FALSE;
}
+ if (self->username && !strlen (self->username)) {
+ g_set_error (error,
+ NM_SETTING_GSM_ERROR,
+ NM_SETTING_GSM_ERROR_INVALID_PROPERTY,
+ NM_SETTING_GSM_USERNAME);
+ return FALSE;
+ }
+
+ if (self->password && !strlen (self->password)) {
+ g_set_error (error,
+ NM_SETTING_GSM_ERROR,
+ NM_SETTING_GSM_ERROR_INVALID_PROPERTY,
+ NM_SETTING_GSM_USERNAME);
+ return FALSE;
+ }
+
return TRUE;
}
+static GPtrArray *
+need_secrets (NMSetting *setting)
+{
+ NMSettingGsm *self = NM_SETTING_GSM (setting);
+ GPtrArray *secrets = NULL;
+
+ if (self->password)
+ return NULL;
+
+ if (self->username) {
+ secrets = g_ptr_array_sized_new (1);
+ g_ptr_array_add (secrets, NM_SETTING_GSM_PASSWORD);
+ }
+
+ return secrets;
+}
+
static void
nm_setting_gsm_init (NMSettingGsm *setting)
{
@@ -256,6 +289,7 @@ nm_setting_gsm_class_init (NMSettingGsmClass *setting_class)
object_class->get_property = get_property;
object_class->finalize = finalize;
parent_class->verify = verify;
+ parent_class->need_secrets = need_secrets;
/* Properties */
g_object_class_install_property
diff --git a/libnm-util/nm-setting-ip4-config.c b/libnm-util/nm-setting-ip4-config.c
index d452c46ecc..2e3873d509 100644
--- a/libnm-util/nm-setting-ip4-config.c
+++ b/libnm-util/nm-setting-ip4-config.c
@@ -76,7 +76,8 @@ enum {
PROP_DNS_SEARCH,
PROP_ADDRESSES,
PROP_ROUTES,
- PROP_IGNORE_DHCP_DNS,
+ PROP_IGNORE_AUTO_ROUTES,
+ PROP_IGNORE_AUTO_DNS,
PROP_DHCP_CLIENT_ID,
PROP_DHCP_HOSTNAME,
@@ -112,7 +113,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
NM_SETTING_IP4_CONFIG_ADDRESSES);
return FALSE;
}
- } else if ( !strcmp (self->method, NM_SETTING_IP4_CONFIG_METHOD_AUTOIP)
+ } else if ( !strcmp (self->method, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL)
|| !strcmp (self->method, NM_SETTING_IP4_CONFIG_METHOD_SHARED)) {
if (self->dns && self->dns->len) {
g_set_error (error,
@@ -137,7 +138,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
NM_SETTING_IP4_CONFIG_ADDRESSES);
return FALSE;
}
- } else if (!strcmp (self->method, NM_SETTING_IP4_CONFIG_METHOD_DHCP)) {
+ } else if (!strcmp (self->method, NM_SETTING_IP4_CONFIG_METHOD_AUTO)) {
/* nothing to do */
} else {
g_set_error (error,
@@ -186,9 +187,9 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
/* Validate routes */
for (iter = self->routes, i = 0; iter; iter = g_slist_next (iter), i++) {
- NMSettingIP4Address *addr = (NMSettingIP4Address *) iter->data;
+ NMSettingIP4Route *route = (NMSettingIP4Route *) iter->data;
- if (!addr->address) {
+ if (!route->address) {
g_set_error (error,
NM_SETTING_IP4_CONFIG_ERROR,
NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY,
@@ -196,7 +197,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
return FALSE;
}
- if (!addr->prefix || addr->prefix > 32) {
+ if (!route->prefix || route->prefix > 32) {
g_set_error (error,
NM_SETTING_IP4_CONFIG_ERROR,
NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY,
@@ -258,10 +259,13 @@ set_property (GObject *object, guint prop_id,
break;
case PROP_ROUTES:
nm_utils_slist_free (setting->routes, g_free);
- setting->routes = nm_utils_ip4_addresses_from_gvalue (value);
+ setting->routes = nm_utils_ip4_routes_from_gvalue (value);
break;
- case PROP_IGNORE_DHCP_DNS:
- setting->ignore_dhcp_dns = g_value_get_boolean (value);
+ case PROP_IGNORE_AUTO_ROUTES:
+ setting->ignore_auto_routes = g_value_get_boolean (value);
+ break;
+ case PROP_IGNORE_AUTO_DNS:
+ setting->ignore_auto_dns = g_value_get_boolean (value);
break;
case PROP_DHCP_CLIENT_ID:
g_free (setting->dhcp_client_id);
@@ -297,10 +301,13 @@ get_property (GObject *object, guint prop_id,
nm_utils_ip4_addresses_to_gvalue (setting->addresses, value);
break;
case PROP_ROUTES:
- nm_utils_ip4_addresses_to_gvalue (setting->routes, value);
+ nm_utils_ip4_routes_to_gvalue (setting->routes, value);
+ break;
+ case PROP_IGNORE_AUTO_ROUTES:
+ g_value_set_boolean (value, setting->ignore_auto_routes);
break;
- case PROP_IGNORE_DHCP_DNS:
- g_value_set_boolean (value, setting->ignore_dhcp_dns);
+ case PROP_IGNORE_AUTO_DNS:
+ g_value_set_boolean (value, setting->ignore_auto_dns);
break;
case PROP_DHCP_CLIENT_ID:
g_value_set_string (value, setting->dhcp_client_id);
@@ -363,15 +370,23 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class)
(object_class, PROP_ROUTES,
nm_param_spec_specialized (NM_SETTING_IP4_CONFIG_ROUTES,
"Routes",
- "List of NMSettingIP4Addresses",
+ "List of NMSettingIP4Routes",
DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT,
G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE));
g_object_class_install_property
- (object_class, PROP_IGNORE_DHCP_DNS,
- g_param_spec_boolean (NM_SETTING_IP4_CONFIG_IGNORE_DHCP_DNS,
- "Ignore DHCP DNS",
- "Ignore DHCP DNS",
+ (object_class, PROP_IGNORE_AUTO_ROUTES,
+ g_param_spec_boolean (NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES,
+ "Ignore automatic routes",
+ "Ignore automatic routes",
+ FALSE,
+ G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE));
+
+ g_object_class_install_property
+ (object_class, PROP_IGNORE_AUTO_DNS,
+ g_param_spec_boolean (NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS,
+ "Ignore automatic DNS",
+ "Ignore automatic DNS",
FALSE,
G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE));
diff --git a/libnm-util/nm-setting-ip4-config.h b/libnm-util/nm-setting-ip4-config.h
index 173c9ef55c..119b09c147 100644
--- a/libnm-util/nm-setting-ip4-config.h
+++ b/libnm-util/nm-setting-ip4-config.h
@@ -53,19 +53,20 @@ GType nm_setting_ip4_config_error_get_type (void);
#define NM_SETTING_IP4_CONFIG_ERROR nm_setting_ip4_config_error_quark ()
GQuark nm_setting_ip4_config_error_quark (void);
-#define NM_SETTING_IP4_CONFIG_METHOD "method"
-#define NM_SETTING_IP4_CONFIG_DNS "dns"
-#define NM_SETTING_IP4_CONFIG_DNS_SEARCH "dns-search"
-#define NM_SETTING_IP4_CONFIG_ADDRESSES "addresses"
-#define NM_SETTING_IP4_CONFIG_ROUTES "routes"
-#define NM_SETTING_IP4_CONFIG_IGNORE_DHCP_DNS "ignore-dhcp-dns"
-#define NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID "dhcp-client-id"
-#define NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME "dhcp-hostname"
-
-#define NM_SETTING_IP4_CONFIG_METHOD_DHCP "dhcp"
-#define NM_SETTING_IP4_CONFIG_METHOD_AUTOIP "autoip"
-#define NM_SETTING_IP4_CONFIG_METHOD_MANUAL "manual"
-#define NM_SETTING_IP4_CONFIG_METHOD_SHARED "shared"
+#define NM_SETTING_IP4_CONFIG_METHOD "method"
+#define NM_SETTING_IP4_CONFIG_DNS "dns"
+#define NM_SETTING_IP4_CONFIG_DNS_SEARCH "dns-search"
+#define NM_SETTING_IP4_CONFIG_ADDRESSES "addresses"
+#define NM_SETTING_IP4_CONFIG_ROUTES "routes"
+#define NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES "ignore-auto-routes"
+#define NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS "ignore-auto-dns"
+#define NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID "dhcp-client-id"
+#define NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME "dhcp-hostname"
+
+#define NM_SETTING_IP4_CONFIG_METHOD_AUTO "auto"
+#define NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL "link-local"
+#define NM_SETTING_IP4_CONFIG_METHOD_MANUAL "manual"
+#define NM_SETTING_IP4_CONFIG_METHOD_SHARED "shared"
typedef struct {
guint32 address; /* network byte order */
@@ -74,14 +75,22 @@ typedef struct {
} NMSettingIP4Address;
typedef struct {
+ guint32 address; /* network byte order */
+ guint32 prefix;
+ guint32 next_hop; /* network byte order */
+ guint32 metric; /* lower metric == more preferred */
+} NMSettingIP4Route;
+
+typedef struct {
NMSetting parent;
char *method;
GArray *dns; /* array of guint32; elements in network byte order */
GSList *dns_search; /* list of strings */
GSList *addresses; /* array of NMSettingIP4Address */
- GSList *routes; /* array of NMSettingIP4Address */
- gboolean ignore_dhcp_dns;
+ GSList *routes; /* array of NMSettingIP4Route */
+ gboolean ignore_auto_routes;
+ gboolean ignore_auto_dns;
char *dhcp_client_id;
char *dhcp_hostname;
} NMSettingIP4Config;
diff --git a/libnm-util/nm-setting-vpn.c b/libnm-util/nm-setting-vpn.c
index 4c4b54d4da..9a8258b847 100644
--- a/libnm-util/nm-setting-vpn.c
+++ b/libnm-util/nm-setting-vpn.c
@@ -70,7 +70,6 @@ enum {
PROP_0,
PROP_SERVICE_TYPE,
PROP_USER_NAME,
- PROP_ROUTES,
LAST_PROP
};
@@ -127,7 +126,6 @@ finalize (GObject *object)
g_free (self->service_type);
g_free (self->user_name);
- nm_utils_slist_free (self->routes, g_free);
G_OBJECT_CLASS (nm_setting_vpn_parent_class)->finalize (object);
}
@@ -147,10 +145,6 @@ set_property (GObject *object, guint prop_id,
g_free (setting->user_name);
setting->user_name = g_value_dup_string (value);
break;
- case PROP_ROUTES:
- nm_utils_slist_free (setting->routes, g_free);
- setting->routes = g_value_dup_boxed (value);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -170,9 +164,6 @@ get_property (GObject *object, guint prop_id,
case PROP_USER_NAME:
g_value_set_string (value, setting->user_name);
break;
- case PROP_ROUTES:
- g_value_set_boxed (value, setting->routes);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -207,12 +198,4 @@ nm_setting_vpn_class_init (NMSettingVPNClass *setting_class)
"User name",
NULL,
G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE));
-
- g_object_class_install_property
- (object_class, PROP_ROUTES,
- nm_param_spec_specialized (NM_SETTING_VPN_ROUTES,
- "Routes",
- "Routes",
- DBUS_TYPE_G_LIST_OF_STRING,
- G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE));
}
diff --git a/libnm-util/nm-setting-vpn.h b/libnm-util/nm-setting-vpn.h
index 7048ce96f9..a52627ae9f 100644
--- a/libnm-util/nm-setting-vpn.h
+++ b/libnm-util/nm-setting-vpn.h
@@ -54,14 +54,12 @@ GQuark nm_setting_vpn_error_quark (void);
#define NM_SETTING_VPN_SERVICE_TYPE "service-type"
#define NM_SETTING_VPN_USER_NAME "user-name"
-#define NM_SETTING_VPN_ROUTES "routes"
typedef struct {
NMSetting parent;
char *service_type;
char *user_name;
- GSList *routes;
} NMSettingVPN;
typedef struct {
diff --git a/libnm-util/nm-utils.c b/libnm-util/nm-utils.c
index 0f9ba3d948..3171660b05 100644
--- a/libnm-util/nm-utils.c
+++ b/libnm-util/nm-utils.c
@@ -859,6 +859,58 @@ nm_utils_ip4_addresses_to_gvalue (GSList *list, GValue *value)
g_value_take_boxed (value, addresses);
}
+GSList *
+nm_utils_ip4_routes_from_gvalue (const GValue *value)
+{
+ GPtrArray *routes;
+ int i;
+ GSList *list = NULL;
+
+ routes = (GPtrArray *) g_value_get_boxed (value);
+ for (i = 0; routes && (i < routes->len); i++) {
+ GArray *array = (GArray *) g_ptr_array_index (routes, i);
+ NMSettingIP4Route *route;
+
+ if (array->len != 4) {
+ nm_warning ("Ignoring invalid IP4 route");
+ continue;
+ }
+
+ route = g_malloc0 (sizeof (NMSettingIP4Route));
+ route->address = g_array_index (array, guint32, 0);
+ route->prefix = g_array_index (array, guint32, 1);
+ route->next_hop = g_array_index (array, guint32, 2);
+ route->metric = g_array_index (array, guint32, 3);
+ list = g_slist_prepend (list, route);
+ }
+
+ return g_slist_reverse (list);
+}
+
+void
+nm_utils_ip4_routes_to_gvalue (GSList *list, GValue *value)
+{
+ GPtrArray *routes;
+ GSList *iter;
+
+ routes = g_ptr_array_new ();
+
+ for (iter = list; iter; iter = iter->next) {
+ NMSettingIP4Route *route = (NMSettingIP4Route *) iter->data;
+ GArray *array;
+
+ array = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 3);
+
+ g_array_append_val (array, route->address);
+ g_array_append_val (array, route->prefix);
+ g_array_append_val (array, route->next_hop);
+ g_array_append_val (array, route->metric);
+ g_ptr_array_add (routes, array);
+ }
+
+ g_value_take_boxed (value, routes);
+}
+
/*
* nm_utils_ip4_netmask_to_prefix
*
diff --git a/libnm-util/nm-utils.h b/libnm-util/nm-utils.h
index e573ac4442..394988fab6 100644
--- a/libnm-util/nm-utils.h
+++ b/libnm-util/nm-utils.h
@@ -187,6 +187,9 @@ gboolean nm_utils_security_valid (NMUtilsSecurityType type,
GSList *nm_utils_ip4_addresses_from_gvalue (const GValue *value);
void nm_utils_ip4_addresses_to_gvalue (GSList *list, GValue *value);
+GSList *nm_utils_ip4_routes_from_gvalue (const GValue *value);
+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);