Hi Denis, Actually right now xmm modem is returning "0xFFFFFFFF" for most of the cell id for neighbouring cells. I am following this issue with my modem team. I had changed it not realising netmon is being used by ril modem also. I have changed it back to UINT32.
Regards Antara -----Original Message----- From: Denis Kenzior [mailto:[email protected]] Sent: Friday, June 7, 2019 12:06 AM To: Borwankar, Antara <[email protected]>; [email protected] Subject: Re: [PATCH] netmon: adding get functionality for neighbouring cell information Hi Antara, On 06/06/2019 04:02 AM, Antara Borwankar wrote: > Handled the get neighbouring cell information function which returns > an array of signal strength of all neighbouring cells. > --- > src/netmon.c | 258 > +++++++++++++++++++++++++++++++++++++++++++---------------- > 1 file changed, 188 insertions(+), 70 deletions(-) > > diff --git a/src/netmon.c b/src/netmon.c index 6c19df5..4596450 100644 > --- a/src/netmon.c > +++ b/src/netmon.c > @@ -50,6 +50,8 @@ struct ofono_netmon { > const struct ofono_netmon_driver *driver; > DBusMessage *pending; > DBusMessage *reply; > + DBusMessageIter iter; > + DBusMessageIter arr; > void *driver_data; > struct ofono_atom *atom; > struct netmon_agent *agent; > @@ -69,174 +71,148 @@ static const char *cell_type_to_tech_name(enum > ofono_netmon_cell_type type) > return NULL; > } > > -void ofono_netmon_serving_cell_notify(struct ofono_netmon *netmon, > - enum ofono_netmon_cell_type type, > - int info_type, ...) > +static void netmon_cell_info_dict_append(DBusMessageIter *dict, > + va_list *arglist, int info_type) > { > - va_list arglist; > - DBusMessage *agent_notify = NULL; > - DBusMessageIter iter; > - DBusMessageIter dict; > - enum ofono_netmon_info next_info_type = info_type; > - const char *technology = cell_type_to_tech_name(type); > char *mcc; > char *mnc; > + char *cell_id; > int intval; > - > - if (netmon->pending != NULL) { > - netmon->reply = dbus_message_new_method_return(netmon->pending); > - dbus_message_iter_init_append(netmon->reply, &iter); > - } else if (netmon->agent != NULL) { > - agent_notify = netmon_agent_new_method_call(netmon->agent, > - "ServingCellInformationChanged"); > - > - dbus_message_iter_init_append(agent_notify, &iter); > - } else > - return; > - > - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, > - OFONO_PROPERTIES_ARRAY_SIGNATURE, > - &dict); > - > - va_start(arglist, info_type); > - > - if (technology == NULL) > - goto done; > - > - ofono_dbus_dict_append(&dict, "Technology", > - DBUS_TYPE_STRING, &technology); > + enum ofono_netmon_info next_info_type = info_type; > > while (next_info_type != OFONO_NETMON_INFO_INVALID) { > switch (next_info_type) { > case OFONO_NETMON_INFO_MCC: > - mcc = va_arg(arglist, char *); > + mcc = va_arg(*arglist, char *); > > if (mcc && strlen(mcc)) > - ofono_dbus_dict_append(&dict, > + ofono_dbus_dict_append(dict, > "MobileCountryCode", > DBUS_TYPE_STRING, &mcc); > break; > > case OFONO_NETMON_INFO_MNC: > - mnc = va_arg(arglist, char *); > + mnc = va_arg(*arglist, char *); > > if (mnc && strlen(mnc)) > - ofono_dbus_dict_append(&dict, > + ofono_dbus_dict_append(dict, > "MobileNetworkCode", > DBUS_TYPE_STRING, &mnc); > break; > > case OFONO_NETMON_INFO_LAC: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, "LocationAreaCode", > + CELL_INFO_DICT_APPEND(dict, "LocationAreaCode", > intval, uint16_t, DBUS_TYPE_UINT16); > break; > > case OFONO_NETMON_INFO_CI: > - intval = va_arg(arglist, int); > + cell_id = va_arg(*arglist, char *); > > - CELL_INFO_DICT_APPEND(&dict, "CellId", > - intval, uint32_t, DBUS_TYPE_UINT32); > + if (cell_id && strlen(cell_id)) > + ofono_dbus_dict_append(dict, > + "CellId", > + DBUS_TYPE_STRING, &cell_id); Is there a particular reason you're changing this from UINT32 to a STRING? Do note that doc/networkmonitor-api.txt specifies CellId as a UINT32 type. > break; > > case OFONO_NETMON_INFO_ARFCN: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, "ARFCN", > + CELL_INFO_DICT_APPEND(dict, "ARFCN", > intval, uint16_t, DBUS_TYPE_UINT16); > break; > > case OFONO_NETMON_INFO_BSIC: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); Indentation seems to be wrong here > > - CELL_INFO_DICT_APPEND(&dict, "BSIC", > + CELL_INFO_DICT_APPEND(dict, "BSIC", > intval, uint8_t, DBUS_TYPE_BYTE); > break; > > case OFONO_NETMON_INFO_RXLEV: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); And here > > - CELL_INFO_DICT_APPEND(&dict, "ReceivedSignalStrength", > + CELL_INFO_DICT_APPEND(dict, "ReceivedSignalStrength", > intval, uint8_t, DBUS_TYPE_BYTE); > break; > > case OFONO_NETMON_INFO_TIMING_ADVANCE: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, "TimingAdvance", > + CELL_INFO_DICT_APPEND(dict, "TimingAdvance", > intval, uint8_t, DBUS_TYPE_BYTE); > break; > > case OFONO_NETMON_INFO_PSC: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, "PrimaryScramblingCode", > + CELL_INFO_DICT_APPEND(dict, "PrimaryScramblingCode", > intval, uint16_t, DBUS_TYPE_UINT16); > break; > > case OFONO_NETMON_INFO_BER: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, "BitErrorRate", > + CELL_INFO_DICT_APPEND(dict, "BitErrorRate", > intval, uint8_t, DBUS_TYPE_BYTE); > break; > > case OFONO_NETMON_INFO_RSSI: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, "Strength", > + CELL_INFO_DICT_APPEND(dict, "Strength", > intval, uint8_t, DBUS_TYPE_BYTE); > break; > > case OFONO_NETMON_INFO_RSCP: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, "ReceivedSignalCodePower", > + CELL_INFO_DICT_APPEND(dict, "ReceivedSignalCodePower", > intval, uint8_t, DBUS_TYPE_BYTE); > break; > > case OFONO_NETMON_INFO_ECN0: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, "ReceivedEnergyRatio", > + CELL_INFO_DICT_APPEND(dict, "ReceivedEnergyRatio", > intval, uint8_t, DBUS_TYPE_BYTE); > break; > > case OFONO_NETMON_INFO_RSRQ: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, > + CELL_INFO_DICT_APPEND(dict, > "ReferenceSignalReceivedQuality", > intval, uint8_t, DBUS_TYPE_BYTE); > break; > > case OFONO_NETMON_INFO_RSRP: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, > + CELL_INFO_DICT_APPEND(dict, > "ReferenceSignalReceivedPower", > intval, uint8_t, DBUS_TYPE_BYTE); > break; > > case OFONO_NETMON_INFO_EARFCN: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, "EARFCN", > + CELL_INFO_DICT_APPEND(dict, "EARFCN", > intval, uint16_t, DBUS_TYPE_UINT16); > break; > > case OFONO_NETMON_INFO_EBAND: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, "EBand", > + CELL_INFO_DICT_APPEND(dict, "EBand", > intval, uint8_t, DBUS_TYPE_BYTE); > break; > > case OFONO_NETMON_INFO_CQI: > - intval = va_arg(arglist, int); > + intval = va_arg(*arglist, int); > > - CELL_INFO_DICT_APPEND(&dict, "ChannelQualityIndicator", > + CELL_INFO_DICT_APPEND(dict, "ChannelQualityIndicator", > intval, uint8_t, DBUS_TYPE_BYTE); > break; > > @@ -244,8 +220,44 @@ void ofono_netmon_serving_cell_notify(struct > ofono_netmon *netmon, > break; > } > > - next_info_type = va_arg(arglist, int); > + next_info_type = va_arg(*arglist, int); > } > +} > + > +void ofono_netmon_serving_cell_notify(struct ofono_netmon *netmon, > + enum ofono_netmon_cell_type type, > + int info_type, ...) > +{ > + va_list arglist; > + DBusMessage *agent_notify = NULL; > + DBusMessageIter iter; > + DBusMessageIter dict; > + const char *technology = cell_type_to_tech_name(type); > + > + if (netmon->pending != NULL) { > + netmon->reply = dbus_message_new_method_return(netmon->pending); > + dbus_message_iter_init_append(netmon->reply, &iter); > + } else if (netmon->agent != NULL) { > + agent_notify = netmon_agent_new_method_call(netmon->agent, > + "ServingCellInformationChanged"); > + > + dbus_message_iter_init_append(agent_notify, &iter); > + } else > + return; > + > + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, > + OFONO_PROPERTIES_ARRAY_SIGNATURE, > + &dict); > + > + va_start(arglist, info_type); > + > + if (technology == NULL) > + goto done; > + > + ofono_dbus_dict_append(&dict, "Technology", > + DBUS_TYPE_STRING, &technology); > + > + netmon_cell_info_dict_append(&dict, &arglist, info_type); > > done: > va_end(arglist); > @@ -403,6 +415,109 @@ static DBusMessage > *netmon_unregister_agent(DBusConnection *conn, > return dbus_message_new_method_return(msg); > } > > + > +void ofono_netmon_neighbouring_cell_notify(struct ofono_netmon *netmon, > + enum ofono_netmon_cell_type type, > + int info_type, ...) > +{ > + va_list arglist; > + DBusMessageIter dict; > + DBusMessageIter strct; > + const char *tech = cell_type_to_tech_name(type); > + > + if (netmon->pending == NULL) > + return; > + > + if (!netmon->reply) { > + netmon->reply = dbus_message_new_method_return(netmon->pending); > + dbus_message_iter_init_append(netmon->reply, &netmon->iter); > + > + dbus_message_iter_open_container(&netmon->iter, DBUS_TYPE_ARRAY, > + DBUS_STRUCT_BEGIN_CHAR_AS_STRING > + DBUS_TYPE_ARRAY_AS_STRING > + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING > + DBUS_TYPE_STRING_AS_STRING > + DBUS_TYPE_VARIANT_AS_STRING > + DBUS_DICT_ENTRY_END_CHAR_AS_STRING > + DBUS_STRUCT_END_CHAR_AS_STRING, > + &netmon->arr); > + } > + > + tech = cell_type_to_tech_name(type); > + > + dbus_message_iter_open_container(&netmon->arr, DBUS_TYPE_STRUCT, > + NULL, &strct); > + dbus_message_iter_open_container(&strct, DBUS_TYPE_ARRAY, > + OFONO_PROPERTIES_ARRAY_SIGNATURE, > + &dict); > + > + va_start(arglist, info_type); > + > + if (tech == NULL) > + goto done; > + > + ofono_dbus_dict_append(&dict, "Technology", > + DBUS_TYPE_STRING, &tech); > + > + netmon_cell_info_dict_append(&dict, &arglist, info_type); > + > +done: > + va_end(arglist); > + > + dbus_message_iter_close_container(&strct, &dict); > + dbus_message_iter_close_container(&netmon->arr, &strct); } > + > +static void neighbouring_cell_info_callback(const struct ofono_error *error, > + void *data) > +{ > + struct ofono_netmon *netmon = data; > + DBusMessage *reply = netmon->reply; > + > + DBG(""); > + > + if (error->type != OFONO_ERROR_TYPE_NO_ERROR) { > + if (reply) > + dbus_message_unref(reply); > + > + reply = __ofono_error_failed(netmon->pending); > + } else if (!reply) { > + DBusMessageIter iter; > + DBusMessageIter dict; > + > + reply = dbus_message_new_method_return(netmon->pending); > + dbus_message_iter_init_append(reply, &iter); > + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, > + OFONO_PROPERTIES_ARRAY_SIGNATURE, > + &dict); > + dbus_message_iter_close_container(&iter, &dict); > + } else { > + dbus_message_iter_close_container(&netmon->iter, &netmon->arr); > + } > + > + netmon->reply = NULL; > + __ofono_dbus_pending_reply(&netmon->pending, reply); } > + > +static DBusMessage *netmon_get_neighbouring_cell_info(DBusConnection *conn, > + DBusMessage *msg, void *data) > +{ > + struct ofono_netmon *netmon = data; > + > + if (!netmon->driver->neighbouring_cell_update) > + return __ofono_error_not_implemented(msg); > + > + if (netmon->pending) > + return __ofono_error_busy(msg); > + > + netmon->pending = dbus_message_ref(msg); > + > + netmon->driver->neighbouring_cell_update(netmon, > + neighbouring_cell_info_callback, netmon); > + > + return NULL; > +} > + > static const GDBusMethodTable netmon_methods[] = { > { GDBUS_ASYNC_METHOD("GetServingCellInformation", > NULL, GDBUS_ARGS({ "cellinfo", "a{sv}" }), @@ -413,6 > +528,9 @@ > static const GDBusMethodTable netmon_methods[] = { > { GDBUS_METHOD("UnregisterAgent", > GDBUS_ARGS({ "agent", "o" }), NULL, > netmon_unregister_agent) }, > + { GDBUS_ASYNC_METHOD("GetNeighbouringCellInformation", > + NULL, GDBUS_ARGS({ "cellinfo", "a(a{sv})" }), > + netmon_get_neighbouring_cell_info) }, > { } > }; > > Regards, -Denis _______________________________________________ ofono mailing list [email protected] https://lists.ofono.org/mailman/listinfo/ofono
