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 get_active_data_calls_cb(struct ril_msg *message, gpointer user_data) { struct ofono_gprs *gprs = user_data; struct ril_gprs_data *gd = ofono_gprs_get_data(gprs); struct ril_data_call_list *call_list = NULL; GSList *iterator; struct ril_data_call *call; if (message->error != RIL_E_SUCCESS) { ofono_error("%s: RIL error %s", __func__, ril_error_to_string(message->error)); goto end; } /* reply can be NULL when there are no existing data calls */ call_list = g_ril_unsol_parse_data_call_list(gd->ril, message); if (call_list == NULL) goto end; /* * We disconnect from previous calls here, which might be needed * because of a previous ofono abort, as some rild implementations do * not disconnect the calls even after the ril socket is closed. */ for (iterator = call_list->calls; iterator; iterator = iterator->next) { call = iterator->data; DBG("Standing data call with cid %d", call->cid); if (drop_data_call(gprs, call->cid) == 0) ++(gd->pending_deact_req); } g_ril_unsol_free_data_call_list(call_list); end: if (gd->pending_deact_req == 0) ril_gprs_registration_status(gprs, NULL, NULL); }
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); }