From 686e3fba835fbd43e49d1b0351796990fe6e62e0 Mon Sep 17 00:00:00 2001 From: Antara Borwankar Date: Fri, 7 Jun 2019 11:18:10 +0530 Subject: [PATCH] xmm7modem: adding netmon changes for reporting neighbouring cell Added netmon changes for xmm7modem driver to fetch neighbouring cell information. --- drivers/xmm7modem/netmon.c | 102 ++++++++++++++++++++++++++++++------- 1 file changed, 83 insertions(+), 19 deletions(-) diff --git a/drivers/xmm7modem/netmon.c b/drivers/xmm7modem/netmon.c index ba70e2bd..0e958abe 100644 --- a/drivers/xmm7modem/netmon.c +++ b/drivers/xmm7modem/netmon.c @@ -47,6 +47,7 @@ static const char *xmci_prefix[] = { "+XMCI:", NULL }; struct netmon_driver_data { GAtChat *chat; + int xmci_mode; }; enum xmci_ofono_type_info { @@ -85,6 +86,7 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; struct ofono_netmon *netmon = cbd->data; + struct netmon_driver_data *nmd = ofono_netmon_get_data(netmon); ofono_netmon_cb_t cb = cbd->cb; struct ofono_error error; GAtResultIter iter; @@ -96,6 +98,11 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data) int ecn0 = -1; int rsrq = -1; int tech = -1; + int type = -1; + int ci = -1; + const char *cell_id; + char mcc[3]; + char mnc[3]; DBG("ok %d", ok); @@ -109,18 +116,23 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data) g_at_result_iter_init(&iter, result); while (g_at_result_iter_next(&iter, "+XMCI:")) { - if (!g_at_result_iter_next_number(&iter, &number)) + if (!g_at_result_iter_next_number(&iter, &type)) break; - tech = xmm7modem_map_radio_access_technology(number); + tech = xmm7modem_map_radio_access_technology(type); - switch (number) { + switch (type) { + case XMCI_GSM_NEIGH_CELL: case XMCI_GSM_SERV_CELL: - /* skip ,,,, */ - g_at_result_iter_skip_next(&iter); - g_at_result_iter_skip_next(&iter); - g_at_result_iter_skip_next(&iter); + /* ,,,, */ + g_at_result_iter_next_number(&iter, &number); + snprintf(mcc, 3, "%d", number); + g_at_result_iter_next_number(&iter, &number); + snprintf(mnc, 3, "%d", number); g_at_result_iter_skip_next(&iter); + g_at_result_iter_next_string(&iter, &cell_id); + sscanf(&cell_id[2], "%x", &number); + ci = number != -1 ? number : 0; g_at_result_iter_skip_next(&iter); g_at_result_iter_next_number(&iter, &number); @@ -129,15 +141,20 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data) g_at_result_iter_next_number(&iter, &number); ber = number != 99 ? number : ber; break; + case XMCI_UMTS_NEIGH_CELL: case XMCI_UMTS_SERV_CELL: /* - * skip ,,,,, + * ,,,,, * ,, */ + g_at_result_iter_next_number(&iter, &number); + snprintf(mcc, 3, "%d", number); + g_at_result_iter_next_number(&iter, &number); + snprintf(mnc, 3, "%d", number); g_at_result_iter_skip_next(&iter); - g_at_result_iter_skip_next(&iter); - g_at_result_iter_skip_next(&iter); - g_at_result_iter_skip_next(&iter); + g_at_result_iter_next_string(&iter, &cell_id); + sscanf(&cell_id[2], "%x", &number); + ci = number != -1 ? number : 0; g_at_result_iter_skip_next(&iter); g_at_result_iter_skip_next(&iter); g_at_result_iter_skip_next(&iter); @@ -150,15 +167,20 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data) g_at_result_iter_next_number(&iter, &number); ecn0 = number != 255 ? number : ecn0; break; + case XMCI_LTE_NEIGH_CELL: case XMCI_LTE_SERV_CELL: /* - * skip ,,,,,, + * ,,,,,, * , */ + g_at_result_iter_next_number(&iter, &number); + snprintf(mcc, 3, "%d", number); + g_at_result_iter_next_number(&iter, &number); + snprintf(mnc, 3, "%d", number); g_at_result_iter_skip_next(&iter); - g_at_result_iter_skip_next(&iter); - g_at_result_iter_skip_next(&iter); - g_at_result_iter_skip_next(&iter); + g_at_result_iter_next_string(&iter, &cell_id); + sscanf(&cell_id[2], "%x", &number); + ci = number != -1 ? number : 0; g_at_result_iter_skip_next(&iter); g_at_result_iter_skip_next(&iter); g_at_result_iter_skip_next(&iter); @@ -174,7 +196,27 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data) break; } - ofono_netmon_serving_cell_notify(netmon, + if ((nmd->xmci_mode == 0) && + (type == XMCI_GSM_NEIGH_CELL || + type == XMCI_UMTS_NEIGH_CELL || + type == XMCI_LTE_NEIGH_CELL)) { + ofono_netmon_neighbouring_cell_notify(netmon, + tech, + OFONO_NETMON_INFO_MCC, mcc, + OFONO_NETMON_INFO_MNC, mnc, + OFONO_NETMON_INFO_CI, ci, + OFONO_NETMON_INFO_RXLEV, rxlev, + OFONO_NETMON_INFO_BER, ber, + OFONO_NETMON_INFO_RSCP, rscp, + OFONO_NETMON_INFO_ECN0, ecn0, + OFONO_NETMON_INFO_RSRQ, rsrq, + OFONO_NETMON_INFO_RSRP, rsrp, + OFONO_NETMON_INFO_INVALID); + } else if ((nmd->xmci_mode == 1) && + (type == XMCI_GSM_SERV_CELL || + type == XMCI_UMTS_SERV_CELL || + type == XMCI_LTE_SERV_CELL)) { + ofono_netmon_serving_cell_notify(netmon, tech, OFONO_NETMON_INFO_RXLEV, rxlev, OFONO_NETMON_INFO_BER, ber, @@ -183,10 +225,12 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data) OFONO_NETMON_INFO_RSRQ, rsrq, OFONO_NETMON_INFO_RSRP, rsrp, OFONO_NETMON_INFO_INVALID); - - CALLBACK_WITH_SUCCESS(cb, cbd->data); - break; + break; + } } + + CALLBACK_WITH_SUCCESS(cb, cbd->data); + nmd->xmci_mode = -1; } static void xmm7modem_netmon_request_update(struct ofono_netmon *netmon, @@ -194,6 +238,7 @@ static void xmm7modem_netmon_request_update(struct ofono_netmon *netmon, { struct netmon_driver_data *nmd = ofono_netmon_get_data(netmon); struct cb_data *cbd = cb_data_new(cb, data); + nmd->xmci_mode = 1; DBG("xmm7modem netmon request update"); @@ -205,6 +250,23 @@ static void xmm7modem_netmon_request_update(struct ofono_netmon *netmon, CALLBACK_WITH_FAILURE(cb, data); } +static void xmm7modem_neighbouring_cell_update(struct ofono_netmon *netmon, + ofono_netmon_cb_t cb, void *data) +{ + struct netmon_driver_data *nmd = ofono_netmon_get_data(netmon); + struct cb_data *cbd = cb_data_new(cb, data); + nmd->xmci_mode = 0; + + DBG("xmm7modem netmon request neighbouring cell update"); + + if (g_at_chat_send(nmd->chat, "AT+XMCI=0", xmci_prefix, + xmci_cb, cbd, g_free) > 0) + return; + + g_free(cbd); + CALLBACK_WITH_FAILURE(cb, data); +} + static gboolean ril_delayed_register(gpointer user_data) { struct ofono_netmon *netmon = user_data; @@ -224,6 +286,7 @@ static int xmm7modem_netmon_probe(struct ofono_netmon *netmon, nmd = g_new0(struct netmon_driver_data, 1); nmd->chat = g_at_chat_clone(chat); + nmd->xmci_mode = -1; ofono_netmon_set_data(netmon, nmd); @@ -250,6 +313,7 @@ static const struct ofono_netmon_driver driver = { .probe = xmm7modem_netmon_probe, .remove = xmm7modem_netmon_remove, .request_update = xmm7modem_netmon_request_update, + .neighbouring_cell_update = xmm7modem_neighbouring_cell_update, }; void xmm_netmon_init(void)