Example #1
0
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);
}
Example #2
0
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);
	}
}
Example #3
0
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;
	}
}
Example #4
0
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;
}
Example #5
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;
}
Example #6
0
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);
}
Example #7
0
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;
}
Example #8
0
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);
}