NetworkManager r3527 - in trunk: . src
- From: dcbw svn gnome org
- To: svn-commits-list gnome org
- Subject: NetworkManager r3527 - in trunk: . src
- Date: Wed, 2 Apr 2008 18:44:52 +0100 (BST)
Author: dcbw
Date: Wed Apr 2 18:44:52 2008
New Revision: 3527
URL: http://svn.gnome.org/viewvc/NetworkManager?rev=3527&view=rev
Log:
2008-04-02 Dan Williams <dcbw redhat com>
* src/nm-device-interface.c
src/nm-device-interface.h
src/nm-device.c
src/nm-device.h
- Rename check_connection_conflicts() to check_connection_compatible()
* src/nm-device-802-11-wireless.c
- (real_check_connection_conflicts): remove
- (real_check_connection_compatible): implement; match MAC address
* src/nm-device-802-3-ethernet.c
- (real_check_connection_conflicts): remove
- (real_check_connection_compatible): implement; match MAC address
- (real_get_best_auto_connection): correctly handle PPPoE cases
* src/nm-manager.c
- (check_connection_allowed): remove; unused until PolicyKit integration
- (internal_activate_device): check whether the connection is compatible
with the device before trying to activate it
Modified:
trunk/ChangeLog
trunk/src/nm-device-802-11-wireless.c
trunk/src/nm-device-802-3-ethernet.c
trunk/src/nm-device-interface.c
trunk/src/nm-device-interface.h
trunk/src/nm-device.c
trunk/src/nm-device.h
trunk/src/nm-manager.c
Modified: trunk/src/nm-device-802-11-wireless.c
==============================================================================
--- trunk/src/nm-device-802-11-wireless.c (original)
+++ trunk/src/nm-device-802-11-wireless.c Wed Apr 2 18:44:52 2008
@@ -99,6 +99,17 @@
static guint signals[LAST_SIGNAL] = { 0 };
+typedef enum
+{
+ NM_WIFI_ERROR_CONNECTION_NOT_WIRELESS = 0,
+ NM_WIFI_ERROR_CONNECTION_INVALID,
+ NM_WIFI_ERROR_CONNECTION_INCOMPATIBLE,
+} NMWifiError;
+
+#define NM_WIFI_ERROR (nm_wifi_error_quark ())
+#define NM_TYPE_WIFI_ERROR (nm_wifi_error_get_type ())
+
+
typedef struct Supplicant {
NMSupplicantManager * mgr;
NMSupplicantInterface * iface;
@@ -195,6 +206,38 @@
static guint32 nm_device_802_11_wireless_get_bitrate (NMDevice80211Wireless *self);
+static GQuark
+nm_wifi_error_quark (void)
+{
+ static GQuark quark = 0;
+ if (!quark)
+ quark = g_quark_from_static_string ("nm-wifi-error");
+ return quark;
+}
+
+/* This should really be standard. */
+#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
+
+static GType
+nm_wifi_error_get_type (void)
+{
+ static GType etype = 0;
+
+ if (etype == 0) {
+ static const GEnumValue values[] = {
+ /* Connection was not a wireless connection. */
+ ENUM_ENTRY (NM_WIFI_ERROR_CONNECTION_NOT_WIRELESS, "ConnectionNotWireless"),
+ /* Connection was not a valid wireless connection. */
+ ENUM_ENTRY (NM_WIFI_ERROR_CONNECTION_INVALID, "ConnectionInvalid"),
+ /* Connection does not apply to this device. */
+ ENUM_ENTRY (NM_WIFI_ERROR_CONNECTION_INCOMPATIBLE, "ConnectionIncompatible"),
+ { 0, 0, 0 }
+ };
+ etype = g_enum_register_static ("NMWifiError", values);
+ }
+ return etype;
+}
+
static void
access_point_removed (NMDevice80211Wireless *device, NMAccessPoint *ap)
{
@@ -788,52 +831,46 @@
}
static gboolean
-real_check_connection_conflicts (NMDevice *device,
- NMConnection *connection,
- NMConnection *system_connection)
+real_check_connection_compatible (NMDevice *device,
+ NMConnection *connection,
+ GError **error)
{
NMDevice80211Wireless *self = NM_DEVICE_802_11_WIRELESS (device);
NMDevice80211WirelessPrivate *priv = NM_DEVICE_802_11_WIRELESS_GET_PRIVATE (self);
NMSettingConnection *s_con;
- NMSettingConnection *system_s_con;
NMSettingWireless *s_wireless;
- NMSettingWireless *system_s_wireless;
s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
g_assert (s_con);
- system_s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (system_connection, NM_TYPE_SETTING_CONNECTION));
- g_assert (system_s_con);
-
- s_wireless = NM_SETTING_WIRELESS (nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS));
- if (!s_wireless)
+ if (strcmp (s_con->type, NM_SETTING_WIRELESS_SETTING_NAME)) {
+ g_set_error (error,
+ NM_WIFI_ERROR, NM_WIFI_ERROR_CONNECTION_NOT_WIRELESS,
+ "The connection was not a WiFi connection.");
return FALSE;
+ }
- system_s_wireless = NM_SETTING_WIRELESS (nm_connection_get_setting (system_connection, NM_TYPE_SETTING_WIRELESS));
- if (!system_s_wireless)
+ s_wireless = NM_SETTING_WIRELESS (nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS));
+ if (!s_wireless) {
+ g_set_error (error,
+ NM_WIFI_ERROR, NM_WIFI_ERROR_CONNECTION_INVALID,
+ "The connection was not a valid WiFi connection.");
return FALSE;
+ }
- if (!system_s_con->lockdown)
+ if ( s_wireless->mac_address
+ && memcmp (s_wireless->mac_address->data, &(priv->hw_addr.ether_addr_octet), ETH_ALEN)) {
+ g_set_error (error,
+ NM_WIFI_ERROR, NM_WIFI_ERROR_CONNECTION_INCOMPATIBLE,
+ "The connection's MAC address did not match this device.");
return FALSE;
-
- if (!strcmp (system_s_con->lockdown, "device")) {
- /* If the system connection has a MAC address and the MAC address
- * matches this device, the activation request conflicts.
- */
- if ( system_s_wireless->mac_address
- && !memcmp (system_s_wireless->mac_address->data, &(priv->hw_addr.ether_addr_octet), ETH_ALEN))
- return TRUE;
- } else if (!strcmp (system_s_con->lockdown, "connection")) {
- /* If the system connection has an SSID and it matches the SSID of the
- * connection being activated, the connection being activated conflicts.
- */
- g_assert (system_s_wireless->ssid);
- g_assert (s_wireless->ssid);
- if (nm_utils_same_ssid (system_s_wireless->ssid, s_wireless->ssid, TRUE))
- return TRUE;
}
- return FALSE;
+ // FIXME: check channel/freq/band against bands the hardware supports
+ // FIXME: check encryption against device capabilities
+ // FIXME: check bitrate against device capabilities
+
+ return TRUE;
}
static gboolean
@@ -2996,7 +3033,7 @@
parent_class->get_best_auto_connection = real_get_best_auto_connection;
parent_class->can_activate = real_can_activate;
parent_class->connection_secrets_updated = real_connection_secrets_updated;
- parent_class->check_connection_conflicts = real_check_connection_conflicts;
+ parent_class->check_connection_compatible = real_check_connection_compatible;
parent_class->act_stage1_prepare = real_act_stage1_prepare;
parent_class->act_stage2_config = real_act_stage2_config;
@@ -3080,8 +3117,9 @@
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
&dbus_glib_nm_device_802_11_wireless_object_info);
-}
+ dbus_g_error_domain_register (NM_WIFI_ERROR, NULL, NM_TYPE_WIFI_ERROR);
+}
static void
state_changed_cb (NMDevice *device, NMDeviceState state, gpointer user_data)
Modified: trunk/src/nm-device-802-3-ethernet.c
==============================================================================
--- trunk/src/nm-device-802-3-ethernet.c (original)
+++ trunk/src/nm-device-802-3-ethernet.c Wed Apr 2 18:44:52 2008
@@ -61,6 +61,16 @@
#define WIRED_SECRETS_TRIES "wired-secrets-tries"
+typedef enum
+{
+ NM_ETHERNET_ERROR_CONNECTION_NOT_WIRED = 0,
+ NM_ETHERNET_ERROR_CONNECTION_INVALID,
+ NM_ETHERNET_ERROR_CONNECTION_INCOMPATIBLE,
+} NMEthernetError;
+
+#define NM_ETHERNET_ERROR (nm_ethernet_error_quark ())
+#define NM_TYPE_ETHERNET_ERROR (nm_ethernet_error_get_type ())
+
typedef struct Supplicant {
NMSupplicantManager *mgr;
NMSupplicantInterface *iface;
@@ -115,6 +125,38 @@
static gboolean supports_mii_carrier_detect (NMDevice8023Ethernet *dev);
static gboolean supports_ethtool_carrier_detect (NMDevice8023Ethernet *dev);
+static GQuark
+nm_ethernet_error_quark (void)
+{
+ static GQuark quark = 0;
+ if (!quark)
+ quark = g_quark_from_static_string ("nm-ethernet-error");
+ return quark;
+}
+
+/* This should really be standard. */
+#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
+
+static GType
+nm_ethernet_error_get_type (void)
+{
+ static GType etype = 0;
+
+ if (etype == 0) {
+ static const GEnumValue values[] = {
+ /* Connection was not a wired connection. */
+ ENUM_ENTRY (NM_ETHERNET_ERROR_CONNECTION_NOT_WIRED, "ConnectionNotWired"),
+ /* Connection was not a valid wired connection. */
+ ENUM_ENTRY (NM_ETHERNET_ERROR_CONNECTION_INVALID, "ConnectionInvalid"),
+ /* Connection does not apply to this device. */
+ ENUM_ENTRY (NM_ETHERNET_ERROR_CONNECTION_INCOMPATIBLE, "ConnectionIncompatible"),
+ { 0, 0, 0 }
+ };
+ etype = g_enum_register_static ("NMEthernetError", values);
+ }
+ return etype;
+}
+
static void
nm_device_802_3_ethernet_carrier_on (NMNetlinkMonitor *monitor,
int idx,
@@ -443,22 +485,27 @@
NMConnection *connection = NM_CONNECTION (iter->data);
NMSettingConnection *s_con;
NMSettingWired *s_wired;
+ gboolean is_pppoe = FALSE;
s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
g_assert (s_con);
- if ( strcmp (s_con->type, NM_SETTING_WIRED_SETTING_NAME)
- && strcmp (s_con->type, NM_SETTING_PPPOE_SETTING_NAME))
+ if (!strcmp (s_con->type, NM_SETTING_PPPOE_SETTING_NAME))
+ is_pppoe = TRUE;
+
+ if (!is_pppoe && strcmp (s_con->type, NM_SETTING_WIRED_SETTING_NAME))
continue;
if (!s_con->autoconnect)
continue;
s_wired = (NMSettingWired *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRED);
- if (!s_wired)
+ /* Wired setting optional for PPPoE */
+ if (!is_pppoe && !s_wired)
continue;
- if (s_wired->mac_address) {
- if (memcmp (s_wired->mac_address->data, priv->hw_addr.ether_addr_octet, ETH_ALEN))
+ if (s_wired) {
+ if ( s_wired->mac_address
+ && memcmp (s_wired->mac_address->data, priv->hw_addr.ether_addr_octet, ETH_ALEN))
continue;
}
@@ -1160,6 +1207,55 @@
supplicant_interface_clean (NM_DEVICE_802_3_ETHERNET (device));
}
+static gboolean
+real_check_connection_compatible (NMDevice *device,
+ NMConnection *connection,
+ GError **error)
+{
+ NMDevice8023Ethernet *self = NM_DEVICE_802_3_ETHERNET (device);
+ NMDevice8023EthernetPrivate *priv = NM_DEVICE_802_3_ETHERNET_GET_PRIVATE (self);
+ NMSettingConnection *s_con;
+ NMSettingWired *s_wired;
+ gboolean is_pppoe = FALSE;
+
+ s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+ g_assert (s_con);
+
+ if ( strcmp (s_con->type, NM_SETTING_WIRED_SETTING_NAME)
+ && strcmp (s_con->type, NM_SETTING_PPPOE_SETTING_NAME)) {
+ g_set_error (error,
+ NM_ETHERNET_ERROR, NM_ETHERNET_ERROR_CONNECTION_NOT_WIRED,
+ "The connection was not a wired or PPPoE connection.");
+ return FALSE;
+ }
+
+ if (!strcmp (s_con->type, NM_SETTING_PPPOE_SETTING_NAME))
+ is_pppoe = TRUE;
+
+ s_wired = (NMSettingWired *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRED);
+ /* Wired setting is optional for PPPoE */
+ if (!is_pppoe && !s_wired) {
+ g_set_error (error,
+ NM_ETHERNET_ERROR, NM_ETHERNET_ERROR_CONNECTION_INVALID,
+ "The connection was not a valid wired connection.");
+ return FALSE;
+ }
+
+ if (s_wired) {
+ if ( s_wired->mac_address
+ && memcmp (s_wired->mac_address->data, &(priv->hw_addr.ether_addr_octet), ETH_ALEN)) {
+ g_set_error (error,
+ NM_ETHERNET_ERROR, NM_ETHERNET_ERROR_CONNECTION_INCOMPATIBLE,
+ "The connection's MAC address did not match this device.");
+ return FALSE;
+ }
+ }
+
+ // FIXME: check bitrate against device capabilities
+
+ return TRUE;
+}
+
static void
nm_device_802_3_ethernet_dispose (GObject *object)
{
@@ -1245,6 +1341,7 @@
parent_class->get_best_auto_connection = real_get_best_auto_connection;
parent_class->can_activate = real_can_activate;
parent_class->connection_secrets_updated = real_connection_secrets_updated;
+ parent_class->check_connection_compatible = real_check_connection_compatible;
parent_class->act_stage2_config = real_act_stage2_config;
parent_class->act_stage4_get_ip4_config = real_act_stage4_get_ip4_config;
@@ -1282,6 +1379,8 @@
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
&dbus_glib_nm_device_802_3_ethernet_object_info);
+
+ dbus_g_error_domain_register (NM_ETHERNET_ERROR, NULL, NM_TYPE_ETHERNET_ERROR);
}
Modified: trunk/src/nm-device-interface.c
==============================================================================
--- trunk/src/nm-device-interface.c (original)
+++ trunk/src/nm-device-interface.c Wed Apr 2 18:44:52 2008
@@ -175,18 +175,18 @@
}
gboolean
-nm_device_interface_check_connection_conflicts (NMDeviceInterface *device,
- NMConnection *connection,
- NMConnection *system_connection)
+nm_device_interface_check_connection_compatible (NMDeviceInterface *device,
+ NMConnection *connection,
+ GError **error)
{
g_return_val_if_fail (NM_IS_DEVICE_INTERFACE (device), FALSE);
g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE);
- g_return_val_if_fail (NM_IS_CONNECTION (system_connection), FALSE);
+ g_return_val_if_fail (error != NULL, FALSE);
+ g_return_val_if_fail (*error == NULL, FALSE);
- if (!NM_DEVICE_INTERFACE_GET_INTERFACE (device)->check_connection_conflicts)
- return FALSE;
-
- return NM_DEVICE_INTERFACE_GET_INTERFACE (device)->check_connection_conflicts (device, connection, system_connection);
+ if (NM_DEVICE_INTERFACE_GET_INTERFACE (device)->check_connection_compatible)
+ return NM_DEVICE_INTERFACE_GET_INTERFACE (device)->check_connection_compatible (device, connection, error);
+ return TRUE;
}
gboolean
Modified: trunk/src/nm-device-interface.h
==============================================================================
--- trunk/src/nm-device-interface.h (original)
+++ trunk/src/nm-device-interface.h Wed Apr 2 18:44:52 2008
@@ -50,9 +50,9 @@
GTypeInterface g_iface;
/* Methods */
- gboolean (*check_connection_conflicts) (NMDeviceInterface *device,
- NMConnection *connection,
- NMConnection *system_connection);
+ gboolean (*check_connection_compatible) (NMDeviceInterface *device,
+ NMConnection *connection,
+ GError **error);
gboolean (*activate) (NMDeviceInterface *device,
NMActRequest *req,
@@ -69,9 +69,9 @@
GType nm_device_interface_get_type (void);
-gboolean nm_device_interface_check_connection_conflicts (NMDeviceInterface *device,
- NMConnection *connection,
- NMConnection *system_connection);
+gboolean nm_device_interface_check_connection_compatible (NMDeviceInterface *device,
+ NMConnection *connection,
+ GError **error);
gboolean nm_device_interface_activate (NMDeviceInterface *device,
NMActRequest *req,
Modified: trunk/src/nm-device.c
==============================================================================
--- trunk/src/nm-device.c (original)
+++ trunk/src/nm-device.c Wed Apr 2 18:44:52 2008
@@ -86,9 +86,9 @@
gulong dhcp_timeout_sigid;
};
-static gboolean nm_device_check_connection_conflicts (NMDeviceInterface *device,
- NMConnection *connection,
- NMConnection *system_connection);
+static gboolean check_connection_compatible (NMDeviceInterface *device,
+ NMConnection *connection,
+ GError **error);
static gboolean nm_device_activate (NMDeviceInterface *device,
NMActRequest *req,
@@ -108,7 +108,7 @@
device_interface_init (NMDeviceInterface *device_interface_class)
{
/* interface implementation */
- device_interface_class->check_connection_conflicts = nm_device_check_connection_conflicts;
+ device_interface_class->check_connection_compatible = check_connection_compatible;
device_interface_class->activate = nm_device_activate;
device_interface_class->deactivate = nm_device_deactivate;
}
@@ -1063,16 +1063,16 @@
}
static gboolean
-nm_device_check_connection_conflicts (NMDeviceInterface *dev_iface,
- NMConnection *connection,
- NMConnection *system_connection)
+check_connection_compatible (NMDeviceInterface *dev_iface,
+ NMConnection *connection,
+ GError **error)
{
NMDeviceClass *klass = NM_DEVICE_GET_CLASS (NM_DEVICE (dev_iface));
- if (klass->check_connection_conflicts)
- return klass->check_connection_conflicts (NM_DEVICE (dev_iface), connection, system_connection);
+ if (klass->check_connection_compatible)
+ return klass->check_connection_compatible (NM_DEVICE (dev_iface), connection, error);
- return FALSE;
+ return TRUE;
}
static void
Modified: trunk/src/nm-device.h
==============================================================================
--- trunk/src/nm-device.h (original)
+++ trunk/src/nm-device.h Wed Apr 2 18:44:52 2008
@@ -85,9 +85,9 @@
NMConnection *connection,
GSList *updated_settings);
- gboolean (* check_connection_conflicts) (NMDevice *self,
- NMConnection *connection,
- NMConnection *system_connection);
+ gboolean (* check_connection_compatible) (NMDevice *self,
+ NMConnection *connection,
+ GError **error);
NMActStageReturn (* act_stage1_prepare) (NMDevice *self);
NMActStageReturn (* act_stage2_config) (NMDevice *self);
Modified: trunk/src/nm-manager.c
==============================================================================
--- trunk/src/nm-manager.c (original)
+++ trunk/src/nm-manager.c Wed Apr 2 18:44:52 2008
@@ -1340,41 +1340,6 @@
return NULL;
}
-static gboolean
-check_connection_allowed (NMManager *manager,
- NMDeviceInterface *dev_iface,
- NMConnection *connection,
- const char *specific_object,
- GError **error)
-{
- NMSettingConnection *s_con;
- GSList *system_connections;
- GSList *iter;
- gboolean allowed = TRUE;
-
- s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
- g_return_val_if_fail (s_con != NULL, FALSE);
-
- system_connections = nm_manager_get_connections (manager, NM_CONNECTION_SCOPE_SYSTEM);
- for (iter = system_connections; iter; iter = g_slist_next (iter)) {
- NMConnection *system_connection = NM_CONNECTION (iter->data);
-
- if (connection == system_connection)
- continue;
-
- if (nm_device_interface_check_connection_conflicts (dev_iface,
- connection,
- system_connection)) {
- allowed = FALSE;
- break;
- }
- }
-
- g_slist_foreach (system_connections, (GFunc) g_object_unref, NULL);
-
- return allowed;
-}
-
static const char *
internal_activate_device (NMManager *manager,
NMDevice *device,
@@ -1393,8 +1358,8 @@
dev_iface = NM_DEVICE_INTERFACE (device);
- /* Ensure the requested connection is allowed to be activated */
- if (!check_connection_allowed (manager, dev_iface, connection, specific_object, error))
+ /* Ensure the requested connection is compatible with the device */
+ if (!nm_device_interface_check_connection_compatible (dev_iface, connection, error))
return NULL;
if (nm_device_get_act_request (device)) {
@@ -1406,7 +1371,7 @@
success = nm_device_interface_activate (dev_iface, req, error);
g_object_unref (req);
- return nm_act_request_get_active_connection_path (req);
+ return success ? nm_act_request_get_active_connection_path (req) : NULL;
}
gboolean
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]