diff options
author | Antara Borwankar <antara.borwankar@intel.com> | 2019-06-07 11:18:10 +0530 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2019-06-07 11:41:37 -0500 |
commit | 686e3fba835fbd43e49d1b0351796990fe6e62e0 (patch) | |
tree | 639ae12056d1ff8f333acf0e5c4499f4b588143a /drivers | |
parent | 90c312484f9ff1fcf22f1e12e65fd0a62ec2c163 (diff) | |
download | ofono-686e3fba835fbd43e49d1b0351796990fe6e62e0.tar.gz |
xmm7modem: adding netmon changes for reporting neighbouring cell
Added netmon changes for xmm7modem driver to fetch neighbouring
cell information.
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/xmm7modem/netmon.c | 102 |
1 files 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 <MCC>,<MNC>,<LAC>,<CI>,<BSIC> */ - g_at_result_iter_skip_next(&iter); - g_at_result_iter_skip_next(&iter); - g_at_result_iter_skip_next(&iter); + /* <MCC>,<MNC>,<LAC>,<CI>,<BSIC> */ + 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 <MCC>,<MNC>,<LAC>,<CI><PSC>,<DLUARFNC>, + * <MCC>,<MNC>,<LAC>,<CI><PSC>,<DLUARFNC>, * <ULUARFCN>,<PATHLOSS>,<RSSI> */ + 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 <MCC>,<MNC>,<TAC>,<CI>,<PCI>,<DLUARFNC>, + * <MCC>,<MNC>,<TAC>,<CI>,<PCI>,<DLUARFNC>, * <ULUARFCN>,<PATHLOSS_LTE> */ + 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,8 +196,15 @@ 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, @@ -183,10 +212,25 @@ 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; + } 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, + OFONO_NETMON_INFO_RSCP, rscp, + OFONO_NETMON_INFO_ECN0, ecn0, + OFONO_NETMON_INFO_RSRQ, rsrq, + OFONO_NETMON_INFO_RSRP, rsrp, + OFONO_NETMON_INFO_INVALID); + 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) |