Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(623)

Unified Diff: plugins/modemmgr.c

Issue 6714023: flimflam: modemmgr: simplify activation (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/flimflam.git@0.11.257.B
Patch Set: Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: plugins/modemmgr.c
diff --git a/plugins/modemmgr.c b/plugins/modemmgr.c
index e544823d37314a4e09d8cec8deb8c0f6afa5a344..35798c75cf10d1c173d0c31a405c4206f1959717 100644
--- a/plugins/modemmgr.c
+++ b/plugins/modemmgr.c
@@ -145,8 +145,6 @@ enum modem_event {
ME_REGISTRATION_STATE_CHANGED,
ME_ENABLE_SUCCEEDED,
ME_ENABLE_FAILED,
- ME_ACTIVATE_SUCCEEDED,
- ME_ACTIVATE_FAILED,
ME_REGISTER_SUCCEEDED,
ME_REGISTER_FAILED,
ME_DISABLE_SUCCEEDED,
@@ -327,7 +325,6 @@ static int modem_task_run_new(struct modem_data *modem,
static void modem_enable_task(struct modem_data *);
static void modem_get_identifiers_task(struct modem_data *);
-static void modem_activate_task(struct modem_data *);
static void modem_disable_task(struct modem_data *);
static void modem_get_status_task(struct modem_data *);
static void modem_get_info_task(struct modem_data *);
@@ -354,12 +351,6 @@ static struct modem_task_work enable_cdma_modem_work = {
modem_get_registration_state_task,
0}};
-static struct modem_task_work activate_modem_work = {
- "activate", {
- modem_activate_task,
- modem_get_registration_state_task,
- 0}};
-
static struct modem_task_work enable_gsm_modem_work = {
"enable_gsm", {
modem_enable_task,
@@ -1120,7 +1111,6 @@ static void modem_update_activation_state(struct modem_data *modem,
}
}
-
/**
* modem_activate_reply:
* @modem: modem object
@@ -1134,54 +1124,59 @@ static void modem_update_activation_state(struct modem_data *modem,
static void modem_activate_reply(DBusPendingCall *call, void *user_data)
{
struct modem_data *modem = (struct modem_data *)user_data;
+ uint32_t status = -1;
+ DBusMessage *reply;
+ DBusError error;
- _DBG_MODEMMGR("activate_reply modem %s", modem->dbus_path);
- modem_dbus_handle_reply(__func__, call, modem,
- ME_ACTIVATE_SUCCEEDED, ME_ACTIVATE_FAILED,
- MM_MODEM_ACTIVATED_ERROR,
- DBUS_TYPE_INVALID /* no return values */);
-}
-
-
-/**
- * modem_activate_task:
- * @modem: modem object
- * @task: modem task object
- *
- * Send a DBUS message to activate a modem. As a task, all failures
- * must be reported via modem_handle_event.
- */
-static void modem_activate_task(struct modem_data *modem)
-{
- const char *carrier = ""; /* Use modem's default carrier */
- DBusMessage *message;
-
- _DBG_MODEMMGR("activate modem %s", modem->dbus_path);
+ dbus_error_init(&error);
- if (modem_dbus_build_message(modem->owner, MM_MODEM_CDMA_INTERFACE,
- modem->dbus_path, &message,
- MM_MODEM_CDMA_METHOD_ACTIVATE) < 0) {
- _DBG_MODEMMGR("activate modem %s", modem->dbus_path);
- modem_handle_event(modem, ME_ACTIVATE_FAILED);
- return;
+ reply = dbus_pending_call_steal_reply(call);
+ if (reply == NULL) {
+ CONNMAN_ERROR("%s: Failed steal reply", __func__);
+ goto done_no_reply;
}
- dbus_message_append_args(message,
- DBUS_TYPE_STRING, &carrier,
- DBUS_TYPE_INVALID);
-
- modem_update_activation_state(modem,
- CONNMAN_NETWORK_ACTIVATION_STATE_ACTIVATING,
- CONNMAN_ELEMENT_ERROR_UNKNOWN);
+ if (dbus_set_error_from_message(&error, reply)) {
+ if (g_strcmp0(error.name, MM_MODEM_INITIATED_ERROR) == 0) {
+ /*
+ * Activation can take a long while. We rely
+ * on a signal to indicate a future state
+ * change of the modem, or for the modem to
+ * disappear. Nothing to do.
+ */
+ dbus_message_unref(reply);
+ return;
+ }
+ CONNMAN_ERROR("DBus Error: %s:%s",
+ error.name, error.message);
+ goto done;
+ }
- if (modem_dbus_send_with_reply(message,
- modem,
- modem_activate_reply,
- ACTIVATE_TIMEOUT_MS) < 0) {
- _DBG_MODEMMGR("activate modem %s", modem->dbus_path);
- modem_handle_event(modem, ME_ACTIVATE_FAILED);
- return;
+ if (dbus_message_get_args(reply, &error,
+ DBUS_TYPE_UINT32,
+ &status,
+ DBUS_TYPE_INVALID) == FALSE) {
+ if (dbus_error_is_set(&error) == TRUE) {
+ CONNMAN_ERROR("Error retrieving reply argument: %s:%s",
+ error.name, error.message);
+ } else {
+ CONNMAN_ERROR("Reply argument type is not UINT32");
+ }
+ }
+done:
+ dbus_message_unref(reply);
+done_no_reply:
+ if (status != 0) {
+ modem_update_activation_state(modem,
+ /* FIXME(jglasgow): need to leave state unchanged */
+ CONNMAN_NETWORK_ACTIVATION_STATE_NOT_ACTIVATED,
+ convert_activation_error(status));
}
+ /*
+ * For the case of status == 0, we rely either on an explicit
+ * signal of the new modem state, or we expect the modem to
+ * disappear, reset itself and come back
+ */
}
@@ -2453,16 +2448,6 @@ static void modem_handle_event(struct modem_data *modem,
modem_set_powered(modem, TRUE);
modem_task_completed(&modem);
return;
- case ME_ACTIVATE_SUCCEEDED:
- /* dbus signal will update activation state later */
- modem_task_run(modem);
- return;
- case ME_ACTIVATE_FAILED:
- modem_update_activation_state(modem,
- CONNMAN_NETWORK_ACTIVATION_STATE_NOT_ACTIVATED,
- CONNMAN_ELEMENT_ERROR_ACTIVATION_FAILED);
- modem_task_run(modem);
- return;
case ME_REGISTER_SUCCEEDED:
/*
* Do not change state yet,
@@ -2559,16 +2544,6 @@ static void modem_handle_event(struct modem_data *modem,
case ME_GET_REGISTRATION_STATE_FAILED:
modem_task_completed(&modem);
return;
- case ME_ACTIVATE_SUCCEEDED:
- /* dbus signal will update activation state later */
- modem_task_run(modem);
- return;
- case ME_ACTIVATE_FAILED:
- modem_update_activation_state(modem,
- CONNMAN_NETWORK_ACTIVATION_STATE_NOT_ACTIVATED,
- CONNMAN_ELEMENT_ERROR_ACTIVATION_FAILED);
- modem_task_run(modem);
- return;
case ME_GET_SIGNALQUALITY_FAILED:
/* N.B. We can continue even without signal quality */
return;
@@ -2653,8 +2628,6 @@ static const char *eventToString(enum modem_event event)
case ME_REGISTRATION_STATE_CHANGED: return "REGISTRATION_STATE_CHANGED";
case ME_ENABLE_SUCCEEDED: return "ENABLE_SUCCEEDED";
case ME_ENABLE_FAILED: return "ENABLE_FAILED";
- case ME_ACTIVATE_SUCCEEDED: return "ACTIVATE_SUCCEEDED";
- case ME_ACTIVATE_FAILED: return "ACTIVATE_FAILED";
case ME_REGISTER_SUCCEEDED: return "REGISTER_SUCCEEDED";
case ME_REGISTER_FAILED: return "REGISTER_FAILED";
case ME_DISABLE_SUCCEEDED: return "DISABLE_SUCCEEDED";
@@ -2943,12 +2916,12 @@ static void network_remove(struct connman_network *network)
/**
* Activate the modem on the network.
*
- * We may need to bring in some upstream changes.
*/
static int modem_network_activate(struct connman_network *network,
const char *carrier)
{
struct modem_data *modem;
+ DBusMessage *message;
modem = network_get_modem(network, __func__);
if (modem == NULL) {
@@ -2967,7 +2940,31 @@ static int modem_network_activate(struct connman_network *network,
stateToString(modem->state));
return -EIO;
}
- return modem_task_run_new(modem, &activate_modem_work);
+
+ if (modem_dbus_build_message(modem->owner, MM_MODEM_CDMA_INTERFACE,
+ modem->dbus_path, &message,
+ MM_MODEM_CDMA_METHOD_ACTIVATE) < 0) {
+ _DBG_MODEMMGR("activate modem %s", modem->dbus_path);
+ return -EIO;
+ }
+
+ _DBG_MODEMMGR("activate modem %s", modem->dbus_path);
+ dbus_message_append_args(message,
+ DBUS_TYPE_STRING, &carrier,
+ DBUS_TYPE_INVALID);
+
+ if (modem_dbus_send_with_reply(message,
+ modem,
+ modem_activate_reply,
+ ACTIVATE_TIMEOUT_MS) < 0) {
+ _DBG_MODEMMGR("activate modem %s", modem->dbus_path);
+ return -EIO;
+ }
+ modem_update_activation_state(modem,
+ CONNMAN_NETWORK_ACTIVATION_STATE_ACTIVATING,
+ CONNMAN_ELEMENT_ERROR_UNKNOWN);
+
+ return 0;
}
static struct connman_network_driver network_driver = {
@@ -3264,17 +3261,6 @@ static void modem_activation_state_changed(struct modem_data *modem,
modem_update_activation_state(modem,
convert_activation_state(mm_state),
convert_activation_error(mm_error));
- /*
- * If the activate modem task is running, then the receipt of
- * the modem activation state changed signal means that we are
- * done with this step of the task. Run the next step.
- *
- * In the case of a non flimflam process communicating
- * directly with the modem it is possible that no modemmgr
- * task is running when the signal is received.
- */
- if (modem->pending_task && modem->task.work == &activate_modem_work)
- modem_task_run(modem);
}
static void mm_properties_changed(struct modem_data *modem,
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698