static void ppp_disconnect(GAtPPPDisconnectReason reason, gpointer user_data) { struct ofono_gprs_context *gc = user_data; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); DBG(""); g_at_ppp_unref(gcd->ppp); gcd->ppp = NULL; switch (gcd->state) { case STATE_ENABLING: CALLBACK_WITH_FAILURE(gcd->up_cb, NULL, FALSE, NULL, NULL, NULL, NULL, gcd->cb_data); break; case STATE_DISABLING: CALLBACK_WITH_SUCCESS(gcd->down_cb, gcd->cb_data); break; default: ofono_gprs_context_deactivated(gc, gcd->active_context); break; } gcd->active_context = 0; gcd->state = STATE_IDLE; /* * If the channel of gcd->chat is NULL, it might cause * gprs_context_remove get called and the gprs context will be * removed. */ g_at_chat_resume(gcd->chat); }
static void ril_deactivate_data_call_cb(struct ril_msg *message, gpointer user_data) { struct cb_data *cbd = user_data; ofono_gprs_context_cb_t cb = cbd->cb; struct ofono_gprs_context *gc = cbd->user; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); gint id = gcd->active_ctx_cid; ofono_info("deactivating data call"); /* Reply has no data... */ if (message->error == RIL_E_SUCCESS) { g_ril_print_response_no_args(gcd->ril, message); set_context_disconnected(gcd); /* If the deactivate was a result of a shutdown, * there won't be call back, so _deactivated() * needs to be called directly. */ if (cb) CALLBACK_WITH_SUCCESS(cb, cbd->data); else ofono_gprs_context_deactivated(gc, id); } else { ofono_error("%s: replay failure: %s", __func__, ril_error_to_string(message->error)); if (cb) CALLBACK_WITH_FAILURE(cb, cbd->data); } }
static void ste_cgact_read_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct ofono_gprs_context *gc = user_data; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); gint cid, state; GAtResultIter iter; if (!ok) return; g_at_result_iter_init(&iter, result); while (g_at_result_iter_next(&iter, "+CGACT:")) { if (!g_at_result_iter_next_number(&iter, &cid)) continue; if ((unsigned int) cid != gcd->active_context) continue; if (!g_at_result_iter_next_number(&iter, &state)) continue; if (state == 1) continue; ofono_gprs_context_deactivated(gc, gcd->active_context); gcd->active_context = 0; break; } }
static void cgev_notify(GAtResult *result, gpointer user_data) { struct ofono_gprs_context *gc = user_data; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); GAtResultIter iter; const char *event; gint cid; g_at_result_iter_init(&iter, result); if (!g_at_result_iter_next(&iter, "+CGEV:")) return; if (!g_at_result_iter_next_unquoted_string(&iter, &event)) return; if (g_str_has_prefix(event, "NW PDN DEACT")) sscanf(event, "%*s %*s %*s %u", &cid); else if (g_str_has_prefix(event, "NW DEACT")) sscanf(event, "%*s %*s %u", &cid); else return; DBG("cid %d", cid); if ((unsigned int) cid != gcd->active_context) return; ofono_gprs_context_deactivated(gc, gcd->active_context); gcd->active_context = 0; }
static void mbm_state_changed(struct ofono_gprs_context *gc, int state) { struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); if (gcd->active_context == 0) return; switch (state) { case MBM_E2NAP_DISCONNECTED: DBG("MBM Context: disconnected"); if (gcd->mbm_state == MBM_DISABLING) { CALLBACK_WITH_SUCCESS(gcd->down_cb, gcd->cb_data); gcd->down_cb = NULL; } else if (gcd->mbm_state == MBM_ENABLING) { CALLBACK_WITH_FAILURE(gcd->up_cb, NULL, 0, NULL, NULL, NULL, NULL, gcd->cb_data); gcd->up_cb = NULL; } else { ofono_gprs_context_deactivated(gc, gcd->active_context); } gcd->mbm_state = MBM_NONE; gcd->cb_data = NULL; gcd->active_context = 0; break; case MBM_E2NAP_CONNECTED: DBG("MBM Context: connected"); if (gcd->mbm_state == MBM_ENABLING) mbm_get_ip_details(gc); break; case MBM_E2NAP_CONNECTING: DBG("MBM Context: connecting"); break; default: break; }; gcd->enap = state; }
static void ril_gprs_context_call_list_changed(struct ril_msg *message, gpointer user_data) { struct ofono_gprs_context *gc = user_data; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); struct data_call *call = NULL; struct unsol_data_call_list *unsol; gboolean active_cid_found = FALSE; gboolean disconnect = FALSE; GSList *iterator = NULL; struct ofono_error error; unsol = g_ril_unsol_parse_data_call_list(gcd->ril, message, &error); if (error.type != OFONO_ERROR_TYPE_NO_ERROR) goto error; DBG("number of call in call_list_changed is: %d", unsol->num); for (iterator = unsol->call_list; iterator; iterator = iterator->next) { call = (struct data_call *) iterator->data; if (call->cid == gcd->active_rild_cid) { active_cid_found = TRUE; if (call->active == 0) { disconnect = TRUE; ofono_gprs_context_deactivated(gc, gcd->active_ctx_cid); } break; } } if (disconnect || active_cid_found == FALSE) { ofono_error("Clearing active context"); set_context_disconnected(gcd); } error: g_ril_unsol_free_data_call_list(unsol); }
static void owancall_notifier(GAtResult *result, gpointer user_data) { struct ofono_gprs_context *gc = user_data; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); GAtResultIter iter; int state; int cid; if (gcd->active_context == 0) return; g_at_result_iter_init(&iter, result); if (g_at_result_iter_next(&iter, "_OWANCALL:") == FALSE) return; g_at_result_iter_next_number(&iter, &cid); g_at_result_iter_next_number(&iter, &state); if (gcd->active_context != (unsigned int) cid) return; switch (state) { case HSO_DISCONNECTED: DBG("HSO Context: disconnected"); if (gcd->hso_state == HSO_DISABLING) { CALLBACK_WITH_SUCCESS(gcd->cb, gcd->cb_data); gcd->hso_state = HSO_NONE; gcd->cb = NULL; gcd->cb_data = NULL; } else { ofono_gprs_context_deactivated(gc, gcd->active_context); } gcd->active_context = 0; break; case HSO_CONNECTED: DBG("HSO Context: connected"); if (gcd->hso_state == HSO_ENABLING) { char buf[128]; snprintf(buf, sizeof(buf), "AT_OWANDATA=%u", gcd->active_context); g_at_chat_send(gcd->chat, buf, owandata_prefix, owandata_cb, gc, NULL); } break; case HSO_FAILED: DBG("HSO Context: failed"); if (gcd->hso_state == HSO_ENABLING) { CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data); gcd->hso_state = HSO_NONE; gcd->cb = NULL; gcd->cb_data = NULL; } gcd->active_context = 0; break; default: break; }; gcd->owancall = state; }
static void ril_gprs_context_call_list_changed(struct ril_msg *message, gpointer user_data) { struct ofono_gprs_context *gc = user_data; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); struct data_call *call = NULL; struct unsol_data_call_list *unsol; gboolean disconnect = FALSE; GSList *iterator = NULL; struct ofono_error error; unsol = g_ril_unsol_parse_data_call_list(gcd->ril, message, &error); if (error.type != OFONO_ERROR_TYPE_NO_ERROR) goto error; DBG("number of call in call_list_changed is: %d", unsol->num); for (iterator = unsol->call_list; iterator; iterator = iterator->next) { call = (struct data_call *) iterator->data; if (call->status != 0) ofono_info("data call status:%d", call->status); if (call->active == DATA_CALL_INACTIVE) { disconnect = TRUE; ofono_gprs_context_deactivated(gc, gcd->active_ctx_cid); break; } if (call->active == DATA_CALL_ACTIVE) { char **split_ip_addr = NULL; const char **dns_addresses; if (call->ifname) { ofono_gprs_context_set_interface(gc, call->ifname); } if (call->addresses) { ofono_gprs_context_set_ipv4_netmask(gc, ril_util_get_netmask(call->addresses)); split_ip_addr = g_strsplit(call->addresses, "/", 2); ofono_gprs_context_set_ipv4_address(gc, split_ip_addr[0], TRUE); } if (call->gateways) { ofono_gprs_context_set_ipv4_gateway(gc, call->gateways); } if (call->dnses) DBG("dnses:%s", call->dnses); dns_addresses = (const char **)(call->dnses ? g_strsplit((const gchar*)call->dnses, " ", 3) : NULL); ofono_gprs_context_set_ipv4_dns_servers(gc, dns_addresses); break; } } if (disconnect) { ofono_error("Clearing active context"); set_context_disconnected(gcd); } error: g_ril_unsol_free_data_call_list(unsol); }