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, |