[Merge] lp:~phablet-team/network-manager/lp1445080 into lp:~phablet-team/network-manager/vivid-phone-overlay

Tony Espy espy at canonical.com
Wed Jun 24 14:23:33 UTC 2015


Thanks for the review.  Please take a look at my replies.  I'll address the formatting issues and re-push shortly.


Diff comments:

> === modified file 'debian/changelog'
> --- debian/changelog	2015-06-08 19:53:38 +0000
> +++ debian/changelog	2015-06-23 19:13:54 +0000
> @@ -1,3 +1,12 @@
> +network-manager (0.9.10.0-4ubuntu15.1.3) vivid; urgency=medium
> +
> +  * debian/patches/lp1445080-fix-modem-flight-mode.patch: re-work
> +    NMModemOfono's modem state logic to get rid of a race condition
> +    that can cause flight-mode to fail and leave the modem stuck
> +    with no active connections (LP: #1445080).
> +
> + -- Tony Espy <espy at canonical.com>  Tue, 23 Jun 2015 15:01:26 -0400
> +
>  network-manager (0.9.10.0-4ubuntu15.1.2) vivid; urgency=medium
>  
>    * debian/patches/lp1461593-add-modem-reconnect-delay.patch: add
> 
> === added file 'debian/patches/lp1445080-fix-modem-flight-mode.patch'
> --- debian/patches/lp1445080-fix-modem-flight-mode.patch	1970-01-01 00:00:00 +0000
> +++ debian/patches/lp1445080-fix-modem-flight-mode.patch	2015-06-23 19:13:54 +0000
> @@ -0,0 +1,633 @@
> +Index: network-manager-0.9.10.0/src/devices/wwan/nm-modem-ofono.c
> +===================================================================
> +--- network-manager-0.9.10.0.orig/src/devices/wwan/nm-modem-ofono.c
> ++++ network-manager-0.9.10.0/src/devices/wwan/nm-modem-ofono.c
> +@@ -54,14 +54,13 @@ typedef struct {
> + 
> + 	char **interfaces;
> + 	char *context_path;
> ++	char *imsi;
> + 
> + 	gboolean modem_online;
> + 	gboolean gprs_attached;
> +-	gboolean gprs_powered;
> + 
> + 	NMIP4Config *ip4_config;
> + 
> +-	gboolean enabled;
> + } NMModemOfonoPrivate;
> + 
> + #define NM_OFONO_ERROR (nm_ofono_error_quark ())
> +@@ -89,6 +88,44 @@ ip_string_to_network_address (const gcha
> + 	return TRUE;
> + }
> + 
> ++static void ofono_read_contexts (NMModemOfono *self);
> ++
> ++static void
> ++update_modem_state (NMModemOfono *self)
> ++{
> ++	NMModemOfonoPrivate *priv = NM_MODEM_OFONO_GET_PRIVATE (self);
> ++	NMModemState state = nm_modem_get_state (NM_MODEM (self));
> ++	NMModemState new_state = NM_MODEM_STATE_UNKNOWN;
> ++	const char *reason;
> ++
> ++	nm_log_info (LOGD_MB, "(%s): %s: 'Attached': %s 'Online': %s 'IMSI': %s",
> ++	             nm_modem_get_path (NM_MODEM (self)),
> ++	             __func__,
> ++	             priv->gprs_attached ? "true" : "false",
> ++	             priv->modem_online ? "true" : "false",
> ++
> ++	             priv->imsi);
> ++
> ++	if (priv->modem_online == FALSE) {
> ++		new_state =	NM_MODEM_STATE_DISABLED;
> ++		reason = "modem 'Online=false'";
> ++	} else if (priv->imsi == NULL && state != NM_MODEM_STATE_ENABLING) {
> ++		new_state =	NM_MODEM_STATE_DISABLED;
> ++		reason = "modem not ready";
> ++	} else if (priv->gprs_attached == FALSE) {
> ++		if (state >= NM_MODEM_STATE_ENABLING) {
> ++			new_state =	NM_MODEM_STATE_SEARCHING;
> ++   		    reason = "modem searching";
> ++		}
> ++	} else {
> ++		new_state =	NM_MODEM_STATE_REGISTERED;
> ++        reason = "modem ready";

OK, will do.  I really need to get a better handle on emacs tabs vs. spaces indent mode, although frankly some of this may stem from direct editing of the patch itself.

> ++	}
> ++
> ++	if (state != new_state)
> ++		nm_modem_set_state (NM_MODEM (self), new_state, reason);
> ++}
> ++
> + /* Disconnect stuff */
> + typedef struct {
> + 	NMModemOfono *self;
> +@@ -108,7 +145,6 @@ disconnect_done (DBusGProxy *proxy, DBus
> + 	SimpleDisconnectContext *ctx = (SimpleDisconnectContext*) user_data;
> + 	NMModemOfono *self = ctx->self;
> + 	NMModemOfonoPrivate *priv = NM_MODEM_OFONO_GET_PRIVATE (self);
> +-	NMModemState state;
> + 	GError *error = NULL;
> + 
> + 	nm_log_dbg (LOGD_MB, "in %s", __func__);
> +@@ -123,15 +159,7 @@ disconnect_done (DBusGProxy *proxy, DBus
> + 
> + 	simple_disconnect_context_free (ctx);
> + 
> +-	/* No need to re-read contexts in this case... */
> +-
> +-	if (priv->modem_online && priv->gprs_powered && priv->gprs_attached)
> +-		state = NM_MODEM_STATE_REGISTERED;
> +-	else
> +-		state = NM_MODEM_STATE_SEARCHING;
> +-
> +-	nm_modem_set_state (NM_MODEM (self), state,
> +-	                    nm_modem_state_to_string (state));
> ++	update_modem_state (self);
> + }
> + 
> + static void
> +@@ -141,9 +169,13 @@ disconnect (NMModem *self,
> + 	NMModemOfonoPrivate *priv = NM_MODEM_OFONO_GET_PRIVATE (self);
> + 	SimpleDisconnectContext *ctx;
> + 	GValue value = G_VALUE_INIT;
> ++	NMModemState state = nm_modem_get_state (NM_MODEM (self));
> + 
> + 	nm_log_dbg (LOGD_MB, "in %s", __func__);
> + 
> ++	if (state != NM_MODEM_STATE_CONNECTED)
> ++		return;

No, the disconnect code path ensures that the context is set to 'Active=false', so in the case where the modem_state is not CONNECTED ( which only happens when a context is active ), disconnecting wouldn't have any effect other than adding one more modem_state change into the mix.

> ++
> + 	ctx = g_slice_new (SimpleDisconnectContext);
> + 	ctx->self = g_object_ref (self);
> + 	ctx->warn = warn;
> +@@ -161,7 +193,6 @@ disconnect (NMModem *self,
> + 	                                      G_TYPE_STRING, "Active",
> + 	                                      G_TYPE_VALUE, &value,
> + 	                                      G_TYPE_INVALID);
> +-
> + }
> + 
> + static void
> +@@ -187,37 +218,25 @@ get_ofono_proxy (NMModemOfono *self, con
> + 
> + 	return proxy;
> + }
> +-
> +-static void ofono_read_contexts (NMModemOfono *self);
> +-
> + static void
> +-update_ofono_enabled (NMModemOfono *self,
> +-                      gboolean new_enabled)
> ++handle_attached (NMModemOfono *self, GValue *value)
> + {
> + 	NMModemOfonoPrivate *priv = NM_MODEM_OFONO_GET_PRIVATE (self);
> +-	NMModemState new_state;
> ++	gboolean attached = g_value_get_boolean (value);
> + 
> +-	if (new_enabled == priv->enabled)
> +-		return;
> ++	if (priv->gprs_attached != attached) {
> ++		priv->gprs_attached = attached;
> + 
> +-	if (new_enabled) {
> +-		new_state = NM_MODEM_STATE_REGISTERED;
> +-		ofono_read_contexts (self);
> +-	} else {
> +-		new_state = NM_MODEM_STATE_SEARCHING;
> +-	}
> ++		nm_log_info (LOGD_MB, "(%s): %s: new value for 'Attached': %s",
> ++    	             nm_modem_get_path (NM_MODEM (self)),
> ++		             __func__,
> ++	    	         attached ? "true" : "false");
> + 
> +-	nm_modem_set_state (NM_MODEM (self),
> +-	                    new_state,
> +-	                    nm_modem_state_to_string (new_state));
> +-
> +-	priv->enabled = new_enabled;
> +-
> +-	nm_log_info (LOGD_MB, "(%s) now in state: %s",
> +-	             nm_modem_get_path (NM_MODEM (self)),
> +-	             nm_modem_state_to_string(new_state));
> ++		update_modem_state (self);
> ++	}
> + }
> + 
> ++
> + static void
> + get_ofono_conn_manager_properties_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
> + {
> +@@ -239,58 +258,97 @@ get_ofono_conn_manager_properties_done (
> + 	}
> + 
> + 	value = g_hash_table_lookup (properties, "Attached");
> +-	if (value)
> +-		priv->gprs_attached = g_value_get_boolean (value);
> +-	else
> +-		nm_log_warn (LOGD_MB, "failed get GPRS state: unexpected reply type");
> +-	g_value_unset (value);
> ++	if (value) {
> ++		handle_attached (self, value);
> ++		g_value_unset (value);
> ++	} else
> ++		nm_log_warn (LOGD_MB, "(%s): %s: no 'Attached' property found",
> ++    	             nm_modem_get_path (NM_MODEM (self)),
> ++					 __func__);
> ++}
> + 
> +-	value = g_hash_table_lookup (properties, "Powered");
> +-	if (value)
> +-		priv->gprs_powered = g_value_get_boolean (value);
> +-	else
> +-		nm_log_warn (LOGD_MB, "failed get modem enabled state: unexpected reply type");
> +-	g_value_unset (value);
> ++static void
> ++ofono_conn_properties_changed (DBusGProxy *proxy,
> ++                               const char *key,
> ++                               GValue *value,
> ++                               gpointer user_data)
> ++{
> ++	NMModemOfono *self = NM_MODEM_OFONO (user_data);
> ++
> ++	nm_log_dbg (LOGD_MB, "in %s", __func__);
> + 
> +-	update_ofono_enabled (self, priv->modem_online
> +-	                            && priv->gprs_powered
> +-	                            && priv->gprs_attached);
> ++	if (g_strcmp0 (key, "Attached") == 0 && G_VALUE_HOLDS_BOOLEAN (value))
> ++		handle_attached (self, value);
> + }
> + 
> + static void
> +-get_ofono_conn_manager_properties (NMModemOfono *self)
> ++handle_subscriber_identity(NMModemOfono *self, GValue *value)
> + {
> + 	NMModemOfonoPrivate *priv = NM_MODEM_OFONO_GET_PRIVATE (self);
> ++	const gchar *value_str = g_value_get_string (value);
> + 
> +-	dbus_g_proxy_begin_call_with_timeout (priv->connman_proxy,
> +-	                                      "GetProperties",
> +-	                                      get_ofono_conn_manager_properties_done,
> +-	                                      self, NULL, 20000,
> +-	                                      G_TYPE_INVALID);
> ++	/* Check for empty DBus string value */
> ++	if (g_strcmp0 (value_str, "(null)") != 0) {
> ++
> ++		if (g_strcmp0 (value_str, priv->imsi) != 0) {
> ++
> ++			if (priv->imsi != NULL) {
> ++				nm_log_warn (LOGD_MB, "SimManager:'SubscriberIdentity' changed: %s", priv->imsi);
> ++				g_free(priv->imsi);
> ++			}
> ++
> ++			nm_log_info (LOGD_MB, "GetPropsDone: 'SubscriberIdentity': %s", priv->imsi);
> ++
> ++			priv->imsi = g_strdup (value_str);
> ++			ofono_read_contexts (self);
> ++			update_modem_state (self);
> ++		}
> ++	}
> + }
> + 
> ++
> + static void
> +-ofono_conn_properties_changed (DBusGProxy *proxy,
> +-                               const char *key,
> +-                               GValue *value,
> +-                               gpointer user_data)
> ++get_ofono_sim_properties_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
> + {
> + 	NMModemOfono *self = NM_MODEM_OFONO (user_data);
> + 	NMModemOfonoPrivate *priv = NM_MODEM_OFONO_GET_PRIVATE (self);
> ++	NMModemState state = nm_modem_get_state (NM_MODEM (self));
> ++	GError *error = NULL;
> ++	GHashTable *properties = NULL;
> ++	GValue *value = NULL;
> ++	const gchar *value_str;
> + 
> + 	nm_log_dbg (LOGD_MB, "in %s", __func__);
> + 
> +-	if (g_strcmp0 (key, "Powered") == 0 && G_VALUE_HOLDS_BOOLEAN (value)) {
> +-		priv->gprs_powered = g_value_get_boolean (value);
> +-	} else if (g_strcmp0 (key, "Attached") == 0 && G_VALUE_HOLDS_BOOLEAN (value)) {
> +-		priv->gprs_attached = g_value_get_boolean (value);
> +-	} else
> +-		/* No need to update enabled for other property changes */
> ++	if (!dbus_g_proxy_end_call (proxy, call_id, &error,
> ++	                            DBUS_TYPE_G_MAP_OF_VARIANT, &properties,
> ++	                            G_TYPE_INVALID)) {
> ++		nm_log_warn (LOGD_MB, "failed to get ofono SimManager properties: (%d) %s",
> ++		             error ? error->code : -1,
> ++		             error && error->message ? error->message : "(unknown)");
> + 		return;
> ++	}
> ++
> ++	value = g_hash_table_lookup (properties, "SubscriberIdentity");
> + 
> +-	update_ofono_enabled (self, priv->modem_online
> +-	                            && priv->gprs_powered
> +-	                            && priv->gprs_attached);
> ++	if (value) {
> ++		handle_subscriber_identity (self, value);
> ++		g_value_unset (value);
> ++	} else {
> ++		nm_log_warn (LOGD_MB, "failed to get SimManager:'SubscriberIdentity'; not found");
> ++	}
> ++}
> ++
> ++static void
> ++ofono_sim_properties_changed (DBusGProxy *proxy,
> ++                              const char *key,
> ++                              GValue *value,
> ++                              gpointer user_data)
> ++{
> ++	NMModemOfono *self = NM_MODEM_OFONO (user_data);
> ++
> ++	if (g_strcmp0 (key, "SubscriberIdentity") == 0 && G_VALUE_HOLDS_STRING (value))
> ++		handle_subscriber_identity (self, value);
> + }
> + 
> + static void
> +@@ -318,32 +376,15 @@ ofono_read_contexts (NMModemOfono *self)
> + 	NMModemOfonoPrivate *priv = NM_MODEM_OFONO_GET_PRIVATE (self);
> + 	DBusGConnection *bus;
> + 	DBusGProxy *settings_proxy;
> +-	GHashTable *properties;
> +-	GError *error = NULL;
> +-	const char *imsi;
> + 
> + 	nm_log_dbg (LOGD_MB, "in %s", __func__);
> +-	nm_log_info (LOGD_MB, "(%s): trying to read IMSI contexts from oFono files",
> +-	             nm_modem_get_path (NM_MODEM (self)));
> +-
> +-	bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
> + 
> +-	dbus_g_proxy_call_with_timeout (priv->simmanager_proxy,
> +-	                                "GetProperties",
> +-	                                20000,
> +-	                                &error,
> +-	                                G_TYPE_INVALID,
> +-	                                DBUS_TYPE_G_MAP_OF_VARIANT, &properties,
> +-	                                G_TYPE_INVALID);
> +-
> +-	if (error) {
> +-		nm_log_warn (LOGD_MB, "Could not get SIM properties: %s",
> +-		             error && error->message ? error->message : "(unknown)");
> +-		g_clear_error (&error);
> ++	if (priv->imsi == NULL) {
> ++		nm_log_warn (LOGD_MB, "No 'SubscriberIdentity', so can't read ofono GPRS contexts");
> ++		return;
> + 	}
> + 
> +-	imsi = g_value_get_string (g_hash_table_lookup (properties, "SubscriberIdentity"));
> +-
> ++	bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
> + 	settings_proxy = dbus_g_proxy_new_for_name (bus,
> + 	                                            "com.canonical.NMOfono",
> + 	                                            "/com/canonical/NMOfono",
> +@@ -353,7 +394,7 @@ ofono_read_contexts (NMModemOfono *self)
> + 		dbus_g_proxy_begin_call_with_timeout (settings_proxy,
> + 		                                      "ReadImsiContexts", ofono_read_imsi_contexts_done,
> + 		                                      self, NULL, 20000,
> +-		                                      G_TYPE_STRING, imsi,
> ++		                                      G_TYPE_STRING, priv->imsi,
> + 		                                      G_TYPE_INVALID);
> + 	else
> + 		nm_log_warn (LOGD_MB, "could not get proxy to the oFono Settings plugin.");
> +@@ -389,17 +430,23 @@ ofono_properties_changed (DBusGProxy *pr
> + {
> + 	NMModemOfono *self = NM_MODEM_OFONO (user_data);
> + 	NMModemOfonoPrivate *priv = NM_MODEM_OFONO_GET_PRIVATE (self);
> ++	gboolean online;
> + 
> + 	nm_log_dbg (LOGD_MB, "in %s: %s", __func__, key);
> + 
> + 	if (g_strcmp0 (key, "Online") == 0 && G_VALUE_HOLDS_BOOLEAN (value)) {
> +-		priv->modem_online = g_value_get_boolean (value);
> +-		nm_log_info (LOGD_MB, "(%s) modem is now %s",
> +-		             nm_modem_get_path (NM_MODEM (self)),
> +-		             priv->modem_online ? "Online" : "Offline");
> +-		update_ofono_enabled (self, priv->modem_online
> +-		                            && priv->gprs_powered
> +-		                            && priv->gprs_attached);
> ++
> ++		online = g_value_get_boolean (value);
> ++		if (online != priv->modem_online) {
> ++			priv->modem_online = online;
> ++
> ++			nm_log_info (LOGD_MB, "(%s) modem is now %s",
> ++			             nm_modem_get_path (NM_MODEM (self)),
> ++			             online ? "Online" : "Offline");
> ++
> ++			update_modem_state (self);
> ++		}
> ++
> + 	} else if (g_strcmp0 (key, "Interfaces") == 0 && G_VALUE_HOLDS_BOXED (value)) {
> + 		gboolean found_simmanager = FALSE;
> + 		gboolean found_conn_manager = FALSE;
> +@@ -422,26 +469,48 @@ ofono_properties_changed (DBusGProxy *pr
> + 				priv->simmanager_proxy = get_ofono_proxy (self,
> + 				                                          nm_modem_get_path (NM_MODEM (self)),
> + 				                                          OFONO_DBUS_INTERFACE_SIM_MANAGER);
> ++				dbus_g_proxy_add_signal (priv->simmanager_proxy, "PropertyChanged",
> ++				                         G_TYPE_STRING, G_TYPE_VALUE,
> ++				                         G_TYPE_INVALID);
> ++				dbus_g_proxy_connect_signal (priv->simmanager_proxy, "PropertyChanged",
> ++				                             G_CALLBACK (ofono_sim_properties_changed),
> ++				                             self,
> ++				                             NULL);
> ++
> ++				dbus_g_proxy_begin_call_with_timeout (priv->simmanager_proxy,
> ++				                                      "GetProperties",
> ++				                                      get_ofono_sim_properties_done,
> ++				                                      self, NULL, 20000,
> ++				                                      G_TYPE_INVALID);
> + 			}
> +-		} else {
> +-			if (priv->simmanager_proxy) {
> ++		} else if (priv->simmanager_proxy) {
> + 				nm_log_info (LOGD_MB, "(%s): SimManager interface disappeared",
> + 				             nm_modem_get_path (NM_MODEM (self)));
> + 				g_object_unref (priv->simmanager_proxy);
> + 				priv->simmanager_proxy = NULL;
> +-			}
> ++
> ++				g_free (priv->imsi);
> ++				priv->imsi = NULL;
> ++
> ++				update_modem_state (self);
> + 		}
> + 
> + 		if (found_conn_manager) {
> + 			if (!priv->connman_proxy) {
> + 				nm_log_info (LOGD_MB, "(%s): found new ConnectionManager interface",
> + 				             nm_modem_get_path (NM_MODEM (self)));
> ++
> + 				priv->connman_proxy = get_ofono_proxy (self,
> + 				                                       nm_modem_get_path (NM_MODEM (self)),
> + 				                                       OFONO_DBUS_INTERFACE_CONNECTION_MANAGER);
> + 
> + 				if (priv->connman_proxy) {
> +-					get_ofono_conn_manager_properties (self);
> ++
> ++					dbus_g_proxy_begin_call_with_timeout (priv->connman_proxy,
> ++					                                      "GetProperties",
> ++					                                      get_ofono_conn_manager_properties_done,
> ++					                                      self, NULL, 20000,
> ++					                                      G_TYPE_INVALID);

OK. I think I went back and forth over this and even looked at some other code inside network-manager, and I think my final conclusion was that it doesn't really matter.  If you look at the description of dbus_g_proxy_begin_call_with_timeout, the actual DBus message isn't sent till control returns to the main loop, at which point the signal listener has already been added.  If you think this really should be changed, I will, but I think it's fine as is.

> + 
> + 					dbus_g_proxy_add_signal (priv->connman_proxy, "PropertyChanged",
> + 					                         G_TYPE_STRING, G_TYPE_VALUE,
> +@@ -467,20 +536,18 @@ ofono_properties_changed (DBusGProxy *pr
> + 					                             NULL);
> + 				}
> + 			}
> +-		} else {
> +-			if (priv->connman_proxy) {
> +-				nm_log_info (LOGD_MB, "(%s): ConnectionManager interface disappeared",
> +-				             nm_modem_get_path (NM_MODEM (self)));
> +-				g_object_unref (priv->connman_proxy);
> +-				priv->connman_proxy = NULL;
> ++		} else if (priv->connman_proxy) {
> ++			nm_log_info (LOGD_MB, "(%s): ConnectionManager interface disappeared",
> ++			             nm_modem_get_path (NM_MODEM (self)));
> ++			g_object_unref (priv->connman_proxy);
> ++			priv->connman_proxy = NULL;
> ++
> ++			/* The connection manager proxy disappeared, we should
> ++			 * consider the modem disabled.
> ++			 */
> ++			priv->gprs_attached = FALSE;
> + 
> +-				/* The connection manager proxy disappeared, we should
> +-				 * consider the modem disabled.
> +-				 */
> +-				update_ofono_enabled (self, FALSE);
> +-				priv->gprs_powered = FALSE;
> +-				priv->gprs_attached = FALSE;
> +-			}
> ++			update_modem_state (self);
> + 		}
> + 	}
> + }
> +@@ -911,11 +978,8 @@ check_connection_compatible (NMModem *mo
> + 	NMModemOfonoPrivate *priv = NM_MODEM_OFONO_GET_PRIVATE (self);
> + 	NMSettingConnection *s_con;
> + 	NMSettingGsm *s_gsm;
> +-	GHashTable *properties;
> +-	GError *error = NULL;
> + 	const char *uuid;
> + 	const char *id;
> +-	const char *imsi;
> + 
> + 	s_con = nm_connection_get_setting_connection (connection);
> + 	g_assert (s_con);
> +@@ -937,27 +1001,12 @@ check_connection_compatible (NMModem *mo
> + 		return FALSE;
> + 	}
> + 
> +-	dbus_g_proxy_call_with_timeout (priv->simmanager_proxy,
> +-	                                "GetProperties",
> +-	                                20000,
> +-	                                &error,
> +-	                                G_TYPE_INVALID,
> +-	                                DBUS_TYPE_G_MAP_OF_VARIANT, &properties,
> +-	                                G_TYPE_INVALID);
> +-
> +-	if (error) {
> +-		nm_log_warn (LOGD_MB, "Could not get SIM properties to match connections: %s",
> +-		             error && error->message ? error->message : "(unknown)");
> +-		g_clear_error (&error);
> +-	}
> +-
> +-	imsi = g_value_get_string (g_hash_table_lookup (properties, "SubscriberIdentity"));
> +-	if (! g_strrstr (id, imsi)) {
> ++	if (! g_strrstr (id, priv->imsi)) {
> + 		nm_log_dbg (LOGD_MB, "%s (%s) isn't for the right SIM, skipping.", id, uuid);
> + 		return FALSE;
> + 	}
> + 
> +-	nm_log_dbg (LOGD_MB, "%s (%s) looks compatible with IMSI %s", id, uuid, imsi);
> ++	nm_log_dbg (LOGD_MB, "%s (%s) looks compatible with IMSI %s", id, uuid, priv->imsi);
> + 
> + 	return TRUE;
> + }
> +@@ -1007,27 +1056,6 @@ query_ofono_properties (NMModemOfono *se
> + }
> + 
> + static void
> +-set_ofono_enabled (NMModem *self, gboolean enabled)
> +-{
> +-	NMModemOfonoPrivate *priv = NM_MODEM_OFONO_GET_PRIVATE (self);
> +-
> +-	nm_log_info (LOGD_MB, "(%s): trying to set modem to %s",
> +-	             nm_modem_get_path (self),
> +-	             enabled ? "enabled" : "disabled");
> +-
> +-	/*
> +-	 * FIXME: this is code is a no-op; we should either make
> +-	 * work, or get rid of this function, or at least remove
> +-	 * the call to update_ofono_enabled.
> +-	 */
> +-
> +-	update_ofono_enabled (NM_MODEM_OFONO (self),
> +-	                      priv->modem_online
> +-	                      && priv->gprs_powered
> +-	                      && priv->gprs_attached);
> +-}
> +-
> +-static void
> + get_capabilities (NMModem *_self,
> +                   NMDeviceModemCapabilities *modem_caps,
> +                   NMDeviceModemCapabilities *current_caps)
> +@@ -1054,7 +1082,6 @@ nm_modem_ofono_init (NMModemOfono *self)
> + 	priv->simmanager_proxy = NULL;
> + 
> + 	priv->modem_online = FALSE;
> +-	priv->gprs_powered = FALSE;
> + 	priv->gprs_attached = FALSE;
> + 
> + 	priv->ip4_config = NULL;
> +@@ -1106,18 +1133,25 @@ dispose (GObject *object)
> + 
> + 	nm_log_dbg (LOGD_MB, "in %s", __func__);
> + 
> +-	if (priv->connect_properties)
> ++	if (priv->connect_properties) {
> + 		g_hash_table_destroy (priv->connect_properties);
> ++		priv->connect_properties = NULL;
> ++	}
> + 
> + 	if (priv->ip4_config)
> +-		g_object_unref (priv->ip4_config);
> ++		g_clear_object (&priv->ip4_config);
> + 
> + 	if (priv->modem_proxy)
> +-		g_object_unref (priv->modem_proxy);
> ++		g_clear_object (&priv->modem_proxy);
> + 	if (priv->connman_proxy)
> +-		g_object_unref (priv->connman_proxy);
> ++		g_clear_object (&priv->connman_proxy);
> + 	if (priv->context_proxy)
> +-		g_object_unref (priv->context_proxy);
> ++		g_clear_object (&priv->context_proxy);
> ++
> ++	if (priv->imsi) {
> ++		g_free (priv->imsi);
> ++		priv->imsi = NULL;
> ++	}
> + 
> + 	G_OBJECT_CLASS (nm_modem_ofono_parent_class)->dispose (object);
> + }
> +@@ -1137,11 +1171,9 @@ nm_modem_ofono_class_init (NMModemOfonoC
> + 	object_class->dispose = dispose;
> + 
> + 	modem_class->get_capabilities = get_capabilities;
> +-	modem_class->set_mm_enabled = set_ofono_enabled;
> + 	modem_class->disconnect = disconnect;
> + 	modem_class->deactivate = deactivate;
> + 	modem_class->check_connection_compatible = check_connection_compatible;
> + 	modem_class->act_stage1_prepare = act_stage1_prepare;
> + 	modem_class->static_stage3_ip4_config_start = static_stage3_ip4_config_start;
> + }
> +-
> +Index: network-manager-0.9.10.0/src/devices/wwan/nm-device-modem.c
> +===================================================================
> +--- network-manager-0.9.10.0.orig/src/devices/wwan/nm-device-modem.c
> ++++ network-manager-0.9.10.0/src/devices/wwan/nm-device-modem.c
> +@@ -340,8 +340,6 @@ check_connection_available (NMDevice *de
> + 		return FALSE;
> + 
> + 	state = nm_modem_get_state (priv->modem);
> +-	if (state <= NM_MODEM_STATE_INITIALIZING)
> +-		return FALSE;
> + 
> + 	if (state == NM_MODEM_STATE_LOCKED) {
> + 		NMSettingGsm *s_gsm = nm_connection_get_setting_gsm (connection);
> +@@ -351,6 +349,9 @@ check_connection_available (NMDevice *de
> + 			return FALSE;
> + 	}
> + 
> ++	if (state <= NM_MODEM_STATE_SEARCHING)
> ++		return FALSE;
> ++
> + 	return TRUE;
> + }
> + 
> +@@ -444,6 +445,10 @@ set_enabled (NMDevice *device, gboolean
> + 	NMDeviceModem *self = NM_DEVICE_MODEM (device);
> + 	NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE (self);
> + 
> ++	nm_log_info (LOGD_MB, "(%s): set_enabled '%s'",
> ++	             nm_device_get_iface (device),
> ++	             enabled ? "true" : "false");
> ++
> + 	/* Called only by the Manager in response to rfkill switch changes or
> + 	 * global user WWAN enable/disable preference changes.
> + 	 */
> +@@ -475,7 +480,7 @@ is_available (NMDevice *dev)
> + 
> + 	g_assert (priv->modem);
> + 	modem_state = nm_modem_get_state (priv->modem);
> +-	if (modem_state <= NM_MODEM_STATE_INITIALIZING) {
> ++	if (modem_state <= NM_MODEM_STATE_SEARCHING) {
> + 		nm_log_dbg (LOGD_MB, "(%s): not available because modem is not ready (%s)",
> + 		            nm_device_get_iface (dev),
> + 		            nm_modem_state_to_string (modem_state));
> +Index: network-manager-0.9.10.0/src/nm-policy.c
> +===================================================================
> +--- network-manager-0.9.10.0.orig/src/nm-policy.c
> ++++ network-manager-0.9.10.0/src/nm-policy.c
> +@@ -1551,8 +1551,8 @@ device_state_changed (NMDevice *device,
> + 			nm_log_info (LOGD_DEVICE, "Connection '%s' disconnected, scheduling activate_check in %u seconds.",
> + 			             nm_connection_get_id (NM_CONNECTION (connection)), delay);
> + 		else
> +-			nm_log_info (LOGD_DEVICE, "Device has no connection; scheduling activate_check in %u seconds.",
> +-			             delay);
> ++			nm_log_info (LOGD_DEVICE, "Device '%s' has no connection; scheduling activate_check in %u seconds.",
> ++			             nm_device_get_iface (device), delay);
> + 
> + 		schedule_activate_check (policy, device, delay);
> + 		break;
> 
> === modified file 'debian/patches/series'
> --- debian/patches/series	2015-06-09 17:22:01 +0000
> +++ debian/patches/series	2015-06-23 19:13:54 +0000
> @@ -71,3 +71,4 @@
>  lp1435776_rm_ofono_secret_settings.patch
>  lp1461593-add-modem-reconnect-delay.patch
>  
> +lp1445080-fix-modem-flight-mode.patch
> 


-- 
https://code.launchpad.net/~phablet-team/network-manager/lp1445080/+merge/262782
Your team Ubuntu Phablet Team is subscribed to branch lp:~phablet-team/network-manager/vivid-phone-overlay.



More information about the Ubuntu-reviews mailing list