* [PATCH 0/5 v4] Neighbor Cell Info Atom
@ 2011-02-14 14:56 Antti Paila
2011-02-14 14:56 ` [PATCH 1/5] cell-info: CellInfo DBUS interface definition Antti Paila
` (5 more replies)
0 siblings, 6 replies; 8+ messages in thread
From: Antti Paila @ 2011-02-14 14:56 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1171 bytes --]
This series of patches implements an interface for client
applications to fetch the ECID information of neighboring
cells using DBUS. Since the 1st version the DBUS api has
been refactored to use new naming for method and to use
flat data format for the cell information. Also, the
internal datatypes have been optimized. Since the 2nd
version MNC and MCC are converted to strings and CPICH-RSCP
re-typed. Since 3rd version multiradio support is added and
interfaces are renamed.
Antti Paila (5):
cell-info: CellInfo DBUS interface definition
cell-info: Header files for neighbor cell info
cell-info: Atom for neighbor cell info
cell-info: New files included in compilation
cell-info: Documentation
Makefile.am | 9 +-
doc/cell-info.txt | 122 +++++++++++++
include/cell-info.h | 126 ++++++++++++++
include/dbus.h | 1 +
src/cell-info.c | 475 +++++++++++++++++++++++++++++++++++++++++++++++++++
src/ofono.h | 1 +
6 files changed, 731 insertions(+), 3 deletions(-)
create mode 100644 doc/cell-info.txt
create mode 100644 include/cell-info.h
create mode 100644 src/cell-info.c
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH 1/5] cell-info: CellInfo DBUS interface definition 2011-02-14 14:56 [PATCH 0/5 v4] Neighbor Cell Info Atom Antti Paila @ 2011-02-14 14:56 ` Antti Paila 2011-02-14 14:56 ` [PATCH 2/5] cell-info: Header files for neighbor cell info Antti Paila ` (4 subsequent siblings) 5 siblings, 0 replies; 8+ messages in thread From: Antti Paila @ 2011-02-14 14:56 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 741 bytes --] --- include/dbus.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/include/dbus.h b/include/dbus.h index 19a138a..52514bb 100644 --- a/include/dbus.h +++ b/include/dbus.h @@ -46,6 +46,7 @@ extern "C" { #define OFONO_SUPPLEMENTARY_SERVICES_INTERFACE "org.ofono.SupplementaryServices" #define OFONO_NETWORK_REGISTRATION_INTERFACE "org.ofono.NetworkRegistration" #define OFONO_NETWORK_OPERATOR_INTERFACE "org.ofono.NetworkOperator" +#define OFONO_CELL_INFO_INTERFACE "org.ofono.NeighborCellInfo" #define OFONO_PHONEBOOK_INTERFACE "org.ofono.Phonebook" #define OFONO_RADIO_SETTINGS_INTERFACE "org.ofono.RadioSettings" #define OFONO_AUDIO_SETTINGS_INTERFACE "org.ofono.AudioSettings" -- 1.7.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/5] cell-info: Header files for neighbor cell info 2011-02-14 14:56 [PATCH 0/5 v4] Neighbor Cell Info Atom Antti Paila 2011-02-14 14:56 ` [PATCH 1/5] cell-info: CellInfo DBUS interface definition Antti Paila @ 2011-02-14 14:56 ` Antti Paila 2011-02-14 14:56 ` [PATCH 3/5] cell-info: Atom " Antti Paila ` (3 subsequent siblings) 5 siblings, 0 replies; 8+ messages in thread From: Antti Paila @ 2011-02-14 14:56 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 4185 bytes --] --- include/cell-info.h | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/ofono.h | 1 + 2 files changed, 127 insertions(+), 0 deletions(-) create mode 100644 include/cell-info.h diff --git a/include/cell-info.h b/include/cell-info.h new file mode 100644 index 0000000..fed5cbd --- /dev/null +++ b/include/cell-info.h @@ -0,0 +1,126 @@ +/* + * + * oFono - Open Source Telephony + * + * Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#ifndef __OFONO_CELL_INFO_H +#define __OFONO_CELL_INFO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <ofono/types.h> +#include <stdint.h> + +struct ofono_cell_info; + + +#define OFONO_CI_FIELD_TA_UNDEFINED 0xFF +#define OFONO_CI_FIELD_UCID_UNDEFINED 0xFFFFFFFF +#define OFONO_CI_FIELD_ECN0_UNDEFINED 0xFF +#define OFONO_CI_FIELD_RSCP_UNDEFINED -127 +#define OFONO_CI_FIELD_PATHLOSS_UNDEFINED 0xFF +#define OFONO_CI_FIELD_FREQ_UNDEFINED 0xFFFF + +#define OFONO_MAX_NMR_COUNT 15 +#define OFONO_MAX_MEASURED_CELL_COUNT 32 +#define OFONO_MAX_MEAS_RES_LIST_COUNT 8 + +struct geran { + uint16_t lac; + uint16_t ci; + uint8_t ta; + uint8_t no_cells; + struct geran_neigh_cell { + uint16_t arfcn; + uint8_t bsic; + uint8_t rxlev; + } nmr[OFONO_MAX_NMR_COUNT]; +}; + +struct cell_measured_results { + uint32_t ucid; + uint16_t sc; + uint8_t ecn0; + int16_t rscp; + uint8_t pathloss; +}; + +struct measured_results_list { + uint16_t dl_freq; + uint16_t ul_freq; + uint8_t rssi; + uint8_t no_cells; + struct cell_measured_results cmr[OFONO_MAX_MEASURED_CELL_COUNT]; +}; + +struct utran { + uint32_t ucid; + uint16_t dl_freq; + uint16_t ul_freq; + uint16_t sc; + uint8_t no_freq; + struct measured_results_list mrl[OFONO_MAX_MEAS_RES_LIST_COUNT]; +}; + +struct ofono_cell_info_results { + + char mcc[OFONO_MAX_MCC_LENGTH + 1]; + char mnc[OFONO_MAX_MNC_LENGTH + 1]; + + gboolean has_geran_cells; + gboolean has_utran_cells; + + struct geran geran; + struct utran utran; + +}; + + +typedef void (*ofono_cell_info_query_cb_t)(const struct ofono_error *error, + struct ofono_cell_info_results *results, void *data); + +struct ofono_cell_info_driver { + const char *name; + int (*probe)(struct ofono_cell_info *ci, + unsigned int vendor, + void *data); + void (*remove)(struct ofono_cell_info *ci); + void (*query)(struct ofono_cell_info *ci, + ofono_cell_info_query_cb_t cb, + void *data); +}; + +struct ofono_cell_info *ofono_cell_info_create(struct ofono_modem *modem, + unsigned int vendor, + const char *driver, + void *data); + +void ofono_cell_info_register(struct ofono_cell_info *ci); +void ofono_cell_info_remove(struct ofono_cell_info *ci); +int ofono_cell_info_driver_register(struct ofono_cell_info_driver *driver); +void ofono_cell_info_driver_unregister(struct ofono_cell_info_driver *driver); +void *ofono_cell_info_get_data(struct ofono_cell_info *ci); +void ofono_cell_info_set_data(struct ofono_cell_info *ci, void *cid); + +#ifdef __cplusplus +} +#endif + +#endif /* __OFONO_CELL_INFO_H */ diff --git a/src/ofono.h b/src/ofono.h index dbe1862..cb33b82 100644 --- a/src/ofono.h +++ b/src/ofono.h @@ -129,6 +129,7 @@ enum ofono_atom_type { OFONO_ATOM_TYPE_CDMA_VOICECALL_MANAGER, OFONO_ATOM_TYPE_SIM_AUTH, OFONO_ATOM_TYPE_EMULATOR_DUN, + OFONO_ATOM_TYPE_CELL_INFO, }; enum ofono_atom_watch_condition { -- 1.7.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/5] cell-info: Atom for neighbor cell info 2011-02-14 14:56 [PATCH 0/5 v4] Neighbor Cell Info Atom Antti Paila 2011-02-14 14:56 ` [PATCH 1/5] cell-info: CellInfo DBUS interface definition Antti Paila 2011-02-14 14:56 ` [PATCH 2/5] cell-info: Header files for neighbor cell info Antti Paila @ 2011-02-14 14:56 ` Antti Paila 2011-03-03 20:30 ` Aki Niemi 2011-02-14 14:56 ` [PATCH 4/5] cell-info: New files included in compilation Antti Paila ` (2 subsequent siblings) 5 siblings, 1 reply; 8+ messages in thread From: Antti Paila @ 2011-02-14 14:56 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 11920 bytes --] --- src/cell-info.c | 475 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 475 insertions(+), 0 deletions(-) create mode 100644 src/cell-info.c diff --git a/src/cell-info.c b/src/cell-info.c new file mode 100644 index 0000000..6e70202 --- /dev/null +++ b/src/cell-info.c @@ -0,0 +1,475 @@ +/* + * + * oFono - Open Source Telephony + * + * Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <errno.h> + +#include <glib.h> +#include <gdbus.h> + +#include "ofono.h" + +#include "common.h" +#include "ofono/cell-info.h" + + +struct ofono_cell_info { + DBusMessage *pending; + struct ofono_atom *atom; + const struct ofono_cell_info_driver *driver; + void *driver_data; +}; + + +static DBusMessage *ci_get_cells(DBusConnection *, DBusMessage *, void *); + +static GSList *g_drivers = NULL; + +static GDBusMethodTable ci_methods[] = { + { "AquireMeasurement", "", "aa{sv}", ci_get_cells, + G_DBUS_METHOD_FLAG_ASYNC }, + { } +}; + +static GDBusSignalTable ci_signals[] = { + { } +}; + +int ofono_cell_info_driver_register(struct ofono_cell_info_driver *driver) +{ + DBG("driver: %p, name: %s", driver, driver->name); + + if (driver->probe == NULL) + return -EINVAL; + + g_drivers = g_slist_prepend(g_drivers, (void *) driver); + + return 0; +} + +void ofono_cell_info_driver_unregister(struct ofono_cell_info_driver *driver) +{ + DBG("driver: %p, name: %s", driver, driver->name); + + g_drivers = g_slist_remove(g_drivers, (void *) driver); +} + +void ofono_cell_info_remove(struct ofono_cell_info *ci) +{ + __ofono_atom_free(ci->atom); +} + +static void cell_info_unregister(struct ofono_atom *atom) +{ + struct ofono_cell_info *ci = __ofono_atom_get_data(atom); + const char *path = __ofono_atom_get_path(ci->atom); + DBusConnection *conn = ofono_dbus_get_connection(); + struct ofono_modem *modem = __ofono_atom_get_modem(ci->atom); + + ofono_modem_remove_interface(modem, OFONO_CELL_INFO_INTERFACE); + + if (!g_dbus_unregister_interface(conn, path, OFONO_CELL_INFO_INTERFACE)) + ofono_error("Failed to unregister interface %s", + OFONO_CELL_INFO_INTERFACE); +} + +static void cell_info_remove(struct ofono_atom *atom) +{ + struct ofono_cell_info *ci = __ofono_atom_get_data(atom); + DBG("atom: %p", atom); + + if (ci == NULL) + return; + + if (ci->driver && ci->driver->remove) + ci->driver->remove(ci); + + g_free(ci); +} + +void ofono_cell_info_register(struct ofono_cell_info *ci) +{ + DBusConnection *conn = ofono_dbus_get_connection(); + struct ofono_modem *modem = __ofono_atom_get_modem(ci->atom); + const char *path = __ofono_atom_get_path(ci->atom); + + DBG("Modem: %p", modem); + + if (!g_dbus_register_interface(conn, path, + OFONO_CELL_INFO_INTERFACE, + ci_methods, ci_signals, NULL, + ci, NULL)) { + ofono_error("Could not create %s interface", + OFONO_CELL_INFO_INTERFACE); + + return; + } + + ofono_modem_add_interface(modem, OFONO_CELL_INFO_INTERFACE); + + __ofono_atom_register(ci->atom, cell_info_unregister); +} + +struct ofono_cell_info *ofono_cell_info_create(struct ofono_modem *modem, + unsigned int vendor, + const char *driver, + void *data) +{ + struct ofono_cell_info *ci; + GSList *l; + + if (driver == NULL) + return NULL; + + ci = g_try_new0(struct ofono_cell_info, 1); + if (ci == NULL) + return NULL; + + ci->atom = __ofono_modem_add_atom(modem, + OFONO_ATOM_TYPE_CELL_INFO, + cell_info_remove, ci); + + for (l = g_drivers; l; l = l->next) { + const struct ofono_cell_info_driver *drv = l->data; + + if (g_strcmp0(drv->name, driver)) + continue; + + if (drv->probe(ci, vendor, data) < 0) + continue; + + ci->driver = drv; + break; + } + + return ci; +} + +void *ofono_cell_info_get_data(struct ofono_cell_info *ci) +{ + return ci->driver_data; +} + +void ofono_cell_info_set_data(struct ofono_cell_info *ci, void *cid) +{ + ci->driver_data = cid; +} + +static int append_geran_meta_data(DBusMessageIter *iter, + struct ofono_cell_info_results *ci) +{ + DBusMessageIter iter_array; + const char *type = "GERAN"; + const char *mcc = ci->mcc; + const char *mnc = ci->mnc; + + dbus_message_iter_open_container(iter, + DBUS_TYPE_ARRAY, + "{sv}", + &iter_array); + + ofono_dbus_dict_append(&iter_array, + "Type", + DBUS_TYPE_STRING, + &type); + ofono_dbus_dict_append(&iter_array, + "MobileNetworkCode", + DBUS_TYPE_STRING, + &mnc); + ofono_dbus_dict_append(&iter_array, + "MobileCountryCode", + DBUS_TYPE_STRING, + &mcc); + ofono_dbus_dict_append(&iter_array, + "LocationAreaCode", + DBUS_TYPE_UINT16, + &ci->geran.lac); + ofono_dbus_dict_append(&iter_array, + "CellId", + DBUS_TYPE_UINT16, + &ci->geran.ci); + + if (ci->geran.ta != OFONO_CI_FIELD_TA_UNDEFINED) + ofono_dbus_dict_append(&iter_array, + "TimingAdvance", + DBUS_TYPE_BYTE, + &ci->geran.ta); + + dbus_message_iter_close_container(iter, &iter_array); + + return 0; + +} + +static void add_geran_neighbor(DBusMessageIter *iter, + struct geran_neigh_cell *cell) +{ + DBusMessageIter iter_array; + + dbus_message_iter_open_container(iter, + DBUS_TYPE_ARRAY, + "{sv}", + &iter_array); + ofono_dbus_dict_append(&iter_array, + "AbsoluteRadioFrequencyChannelNumber", + DBUS_TYPE_UINT16, + &cell->arfcn); + ofono_dbus_dict_append(&iter_array, + "BaseStationIdentityCode", + DBUS_TYPE_BYTE, + &cell->bsic); + ofono_dbus_dict_append(&iter_array, + "RXLEV", + DBUS_TYPE_BYTE, + &cell->rxlev); + + dbus_message_iter_close_container(iter, &iter_array); +} + +static int fill_geran_ci(DBusMessageIter *iter, + struct ofono_cell_info_results *ci) +{ + int i; + + append_geran_meta_data(iter, ci); + + for (i = 0; i < ci->geran.no_cells; ++i) + add_geran_neighbor(iter, &ci->geran.nmr[i]); + + return 0; +} + +static int append_utra_neigh_cell_data(DBusMessageIter *iter, + struct cell_measured_results *cmr) +{ + ofono_dbus_dict_append(iter, + "ScramblingCode", + DBUS_TYPE_UINT16, + &cmr->sc); + + if (cmr->ucid != OFONO_CI_FIELD_UCID_UNDEFINED) + ofono_dbus_dict_append(iter, + "UniqueCellId", + DBUS_TYPE_UINT32, + &cmr->ucid); + + if (cmr->ecn0 != OFONO_CI_FIELD_ECN0_UNDEFINED) + ofono_dbus_dict_append(iter, + "CPICH-ECN0", + DBUS_TYPE_BYTE, + &cmr->ecn0); + + if (cmr->rscp != OFONO_CI_FIELD_RSCP_UNDEFINED) + ofono_dbus_dict_append(iter, + "CPICH-RSCP", + DBUS_TYPE_INT16, + &cmr->rscp); + + if (cmr->pathloss != OFONO_CI_FIELD_PATHLOSS_UNDEFINED) + ofono_dbus_dict_append(iter, + "Pathloss", + DBUS_TYPE_BYTE, + &cmr->pathloss); + + return 0; +} + +static int append_utra_neigh_freq_data(DBusMessageIter *iter, + struct measured_results_list *mrl) +{ + ofono_dbus_dict_append(iter, + "ReceivedSignalStrengthIndicator", + DBUS_TYPE_BYTE, + &mrl->rssi); + + ofono_dbus_dict_append(iter, + "UARFCN-DL", + DBUS_TYPE_UINT16, + &mrl->dl_freq); + + if (mrl->ul_freq != OFONO_CI_FIELD_FREQ_UNDEFINED) + ofono_dbus_dict_append(iter, + "UARFCN-UL", + DBUS_TYPE_UINT16, + &mrl->ul_freq); + + return 0; +} + +static int append_utra_neighbors(DBusMessageIter *iter, + struct utran *utran) +{ + DBusMessageIter iter_array; + int i, j; + + + for (i = 0; i < utran->no_freq; ++i) { + + for (j = 0; j < utran->mrl[i].no_cells; ++j) { + dbus_message_iter_open_container(iter, + DBUS_TYPE_ARRAY, + "{sv}", + &iter_array); + append_utra_neigh_freq_data(&iter_array, + &utran->mrl[i]); + append_utra_neigh_cell_data(&iter_array, + &utran->mrl[i].cmr[j]); + + dbus_message_iter_close_container(iter, + &iter_array); + } + } + + return 0; +} + +static void append_utran_meta_data(DBusMessageIter *iter, + struct ofono_cell_info_results *ci) +{ + DBusMessageIter iter_array; + const char *type = "UTRA-FDD"; + const char *mcc = ci->mcc; + const char *mnc = ci->mnc; + + dbus_message_iter_open_container(iter, + DBUS_TYPE_ARRAY, + "{sv}", + &iter_array); + + ofono_dbus_dict_append(&iter_array, + "Type", + DBUS_TYPE_STRING, + &type); + ofono_dbus_dict_append(&iter_array, + "MobileNetworkCode", + DBUS_TYPE_STRING, + &mnc); + ofono_dbus_dict_append(&iter_array, + "MobileCountryCode", + DBUS_TYPE_STRING, + &mcc); + ofono_dbus_dict_append(&iter_array, + "UniqueCellId", + DBUS_TYPE_UINT32, + &ci->utran.ucid); + ofono_dbus_dict_append(&iter_array, + "ScramblingCode", + DBUS_TYPE_UINT16, + &ci->utran.sc); + ofono_dbus_dict_append(&iter_array, + "UARFCN-DL", + DBUS_TYPE_UINT16, + &ci->utran.dl_freq); + + if (ci->utran.ul_freq != OFONO_CI_FIELD_FREQ_UNDEFINED) { + ofono_dbus_dict_append(&iter_array, + "UARFCN-UL", + DBUS_TYPE_UINT16, + &ci->utran.ul_freq); + } + + dbus_message_iter_close_container(iter, &iter_array); +} + +static int fill_utra_ci(DBusMessageIter *iter, + struct ofono_cell_info_results *ci) +{ + + append_utran_meta_data(iter, ci); + append_utra_neighbors(iter, &ci->utran); + + return 0; +} + +static void ofono_neigh_cell_info_query_cb(const struct ofono_error *error, + struct ofono_cell_info_results *ci_results, void *data) +{ + struct ofono_cell_info *ci = data; + DBusMessage *msg = ci->pending; + DBusMessage *reply; + DBusMessageIter iter, iter_array; + int status; + + DBG(""); + + if (error->type != OFONO_ERROR_TYPE_NO_ERROR) { + ofono_error("Neighbor cell info query failed"); + goto error; + } + + reply = dbus_message_new_method_return(msg); + if (reply == NULL) { + ofono_error("Failed to create response"); + goto error; + } + + dbus_message_iter_init_append(reply, &iter); + dbus_message_iter_open_container(&iter, + DBUS_TYPE_ARRAY, + "a{sv}", + &iter_array); + + if (ci_results->has_geran_cells == TRUE) { + DBG("Geran cell info received"); + + status = fill_geran_ci(&iter_array, ci_results); + if (status != 0) { + ofono_error("Failed to fill geran info"); + goto error; + } + + } + + if (ci_results->has_utran_cells) { + DBG("Utran cell info received"); + + status = fill_utra_ci(&iter_array, ci_results); + if (status != 0) { + ofono_error("Failed to fill utran info"); + goto error; + } + + } + dbus_message_iter_close_container(&iter, &iter_array); + __ofono_dbus_pending_reply(&msg, reply); + return; + +error: + reply = __ofono_error_failed(msg); + __ofono_dbus_pending_reply(&msg, reply); + return; + +} + +static DBusMessage *ci_get_cells(DBusConnection *conn, DBusMessage *msg, + void *data) +{ + struct ofono_cell_info *ci = data; + DBG(""); + + ci->pending = dbus_message_ref(msg); + ci->driver->query(ci, ofono_neigh_cell_info_query_cb, ci->driver_data); + + return NULL; +} -- 1.7.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 3/5] cell-info: Atom for neighbor cell info 2011-02-14 14:56 ` [PATCH 3/5] cell-info: Atom " Antti Paila @ 2011-03-03 20:30 ` Aki Niemi 0 siblings, 0 replies; 8+ messages in thread From: Aki Niemi @ 2011-03-03 20:30 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 21394 bytes --] Hi Antti, 2011/2/14 Antti Paila <antti.paila@nokia.com>: > --- > src/cell-info.c | 475 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 475 insertions(+), 0 deletions(-) > create mode 100644 src/cell-info.c > > diff --git a/src/cell-info.c b/src/cell-info.c > new file mode 100644 > index 0000000..6e70202 > --- /dev/null > +++ b/src/cell-info.c > @@ -0,0 +1,475 @@ > +/* > + * > + * oFono - Open Source Telephony > + * > + * Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > + * > + */ > + > +#ifdef HAVE_CONFIG_H > +#include <config.h> > +#endif > + > +#include <errno.h> > + > +#include <glib.h> > +#include <gdbus.h> > + > +#include "ofono.h" > + > +#include "common.h" > +#include "ofono/cell-info.h" This doesn't belong here; you need to add an include statement for cell-info.h into src/ofono.h. > + > + Extra empty line here. > +struct ofono_cell_info { > + DBusMessage *pending; > + struct ofono_atom *atom; > + const struct ofono_cell_info_driver *driver; > + void *driver_data; > +}; > + > + Extra empty line here. > +static DBusMessage *ci_get_cells(DBusConnection *, DBusMessage *, void *); Can this forward declaration be avoided? > + > +static GSList *g_drivers = NULL; > + > +static GDBusMethodTable ci_methods[] = { > + { "AquireMeasurement", "", "aa{sv}", ci_get_cells, > + G_DBUS_METHOD_FLAG_ASYNC }, > + { } > +}; > + > +static GDBusSignalTable ci_signals[] = { > + { } > +}; > + > +int ofono_cell_info_driver_register(struct ofono_cell_info_driver *driver) > +{ > + DBG("driver: %p, name: %s", driver, driver->name); > + > + if (driver->probe == NULL) > + return -EINVAL; > + > + g_drivers = g_slist_prepend(g_drivers, (void *) driver); > + > + return 0; > +} > + > +void ofono_cell_info_driver_unregister(struct ofono_cell_info_driver *driver) > +{ > + DBG("driver: %p, name: %s", driver, driver->name); > + > + g_drivers = g_slist_remove(g_drivers, (void *) driver); > +} > + > +void ofono_cell_info_remove(struct ofono_cell_info *ci) > +{ > + __ofono_atom_free(ci->atom); > +} > + > +static void cell_info_unregister(struct ofono_atom *atom) > +{ > + struct ofono_cell_info *ci = __ofono_atom_get_data(atom); > + const char *path = __ofono_atom_get_path(ci->atom); > + DBusConnection *conn = ofono_dbus_get_connection(); > + struct ofono_modem *modem = __ofono_atom_get_modem(ci->atom); > + > + ofono_modem_remove_interface(modem, OFONO_CELL_INFO_INTERFACE); > + > + if (!g_dbus_unregister_interface(conn, path, OFONO_CELL_INFO_INTERFACE)) > + ofono_error("Failed to unregister interface %s", > + OFONO_CELL_INFO_INTERFACE); > +} > + > +static void cell_info_remove(struct ofono_atom *atom) > +{ > + struct ofono_cell_info *ci = __ofono_atom_get_data(atom); > + DBG("atom: %p", atom); > + > + if (ci == NULL) > + return; > + > + if (ci->driver && ci->driver->remove) > + ci->driver->remove(ci); > + > + g_free(ci); > +} > + > +void ofono_cell_info_register(struct ofono_cell_info *ci) > +{ > + DBusConnection *conn = ofono_dbus_get_connection(); > + struct ofono_modem *modem = __ofono_atom_get_modem(ci->atom); > + const char *path = __ofono_atom_get_path(ci->atom); > + > + DBG("Modem: %p", modem); > + > + if (!g_dbus_register_interface(conn, path, > + OFONO_CELL_INFO_INTERFACE, > + ci_methods, ci_signals, NULL, > + ci, NULL)) { > + ofono_error("Could not create %s interface", > + OFONO_CELL_INFO_INTERFACE); One too many tabs here. > + > + return; > + } > + > + ofono_modem_add_interface(modem, OFONO_CELL_INFO_INTERFACE); > + > + __ofono_atom_register(ci->atom, cell_info_unregister); > +} > + > +struct ofono_cell_info *ofono_cell_info_create(struct ofono_modem *modem, > + unsigned int vendor, > + const char *driver, > + void *data) > +{ Coding style, M4. > + struct ofono_cell_info *ci; > + GSList *l; > + > + if (driver == NULL) > + return NULL; > + > + ci = g_try_new0(struct ofono_cell_info, 1); > + if (ci == NULL) > + return NULL; > + > + ci->atom = __ofono_modem_add_atom(modem, > + OFONO_ATOM_TYPE_CELL_INFO, > + cell_info_remove, ci); No need to wrap the line here after modem; the next argument will still keep it under 80 chars wide. > + for (l = g_drivers; l; l = l->next) { > + const struct ofono_cell_info_driver *drv = l->data; > + > + if (g_strcmp0(drv->name, driver)) > + continue; > + > + if (drv->probe(ci, vendor, data) < 0) > + continue; > + > + ci->driver = drv; > + break; > + } > + > + return ci; > +} > + > +void *ofono_cell_info_get_data(struct ofono_cell_info *ci) > +{ > + return ci->driver_data; > +} > + > +void ofono_cell_info_set_data(struct ofono_cell_info *ci, void *cid) > +{ > + ci->driver_data = cid; > +} > + > +static int append_geran_meta_data(DBusMessageIter *iter, > + struct ofono_cell_info_results *ci) Coding style, M4. > +{ > + DBusMessageIter iter_array; > + const char *type = "GERAN"; > + const char *mcc = ci->mcc; > + const char *mnc = ci->mnc; > + > + dbus_message_iter_open_container(iter, > + DBUS_TYPE_ARRAY, > + "{sv}", > + &iter_array); > + > + ofono_dbus_dict_append(&iter_array, > + "Type", > + DBUS_TYPE_STRING, > + &type); > + ofono_dbus_dict_append(&iter_array, > + "MobileNetworkCode", > + DBUS_TYPE_STRING, > + &mnc); > + ofono_dbus_dict_append(&iter_array, > + "MobileCountryCode", > + DBUS_TYPE_STRING, > + &mcc); > + ofono_dbus_dict_append(&iter_array, > + "LocationAreaCode", > + DBUS_TYPE_UINT16, > + &ci->geran.lac); > + ofono_dbus_dict_append(&iter_array, > + "CellId", > + DBUS_TYPE_UINT16, > + &ci->geran.ci); > + > + if (ci->geran.ta != OFONO_CI_FIELD_TA_UNDEFINED) > + ofono_dbus_dict_append(&iter_array, > + "TimingAdvance", > + DBUS_TYPE_BYTE, > + &ci->geran.ta); > + I think you're being way too aggressive with line wrapping here, just fill up as much as 80 chars as you can. > + dbus_message_iter_close_container(iter, &iter_array); > + > + return 0; > + Extra empty line here. > +} > + > +static void add_geran_neighbor(DBusMessageIter *iter, > + struct geran_neigh_cell *cell) Coding style, M4. > +{ > + DBusMessageIter iter_array; > + > + dbus_message_iter_open_container(iter, > + DBUS_TYPE_ARRAY, > + "{sv}", > + &iter_array); > + ofono_dbus_dict_append(&iter_array, > + "AbsoluteRadioFrequencyChannelNumber", > + DBUS_TYPE_UINT16, > + &cell->arfcn); > + ofono_dbus_dict_append(&iter_array, > + "BaseStationIdentityCode", > + DBUS_TYPE_BYTE, > + &cell->bsic); > + ofono_dbus_dict_append(&iter_array, > + "RXLEV", > + DBUS_TYPE_BYTE, > + &cell->rxlev); > + Same as above, too aggressive line wraps. > + dbus_message_iter_close_container(iter, &iter_array); > +} > + > +static int fill_geran_ci(DBusMessageIter *iter, > + struct ofono_cell_info_results *ci) Coding style, M4. > +{ > + int i; > + > + append_geran_meta_data(iter, ci); > + > + for (i = 0; i < ci->geran.no_cells; ++i) > + add_geran_neighbor(iter, &ci->geran.nmr[i]); > + > + return 0; > +} > + > +static int append_utra_neigh_cell_data(DBusMessageIter *iter, > + struct cell_measured_results *cmr) Coding style, M4. > +{ > + ofono_dbus_dict_append(iter, > + "ScramblingCode", > + DBUS_TYPE_UINT16, > + &cmr->sc); > + > + if (cmr->ucid != OFONO_CI_FIELD_UCID_UNDEFINED) > + ofono_dbus_dict_append(iter, > + "UniqueCellId", > + DBUS_TYPE_UINT32, > + &cmr->ucid); > + > + if (cmr->ecn0 != OFONO_CI_FIELD_ECN0_UNDEFINED) > + ofono_dbus_dict_append(iter, > + "CPICH-ECN0", > + DBUS_TYPE_BYTE, > + &cmr->ecn0); > + > + if (cmr->rscp != OFONO_CI_FIELD_RSCP_UNDEFINED) > + ofono_dbus_dict_append(iter, > + "CPICH-RSCP", > + DBUS_TYPE_INT16, > + &cmr->rscp); > + > + if (cmr->pathloss != OFONO_CI_FIELD_PATHLOSS_UNDEFINED) > + ofono_dbus_dict_append(iter, > + "Pathloss", > + DBUS_TYPE_BYTE, > + &cmr->pathloss); > + Same as above about line wrapping. Also, these block's indentation is one level too deep. > + return 0; > +} > + > +static int append_utra_neigh_freq_data(DBusMessageIter *iter, > + struct measured_results_list *mrl) Coding style, M4. > +{ > + ofono_dbus_dict_append(iter, > + "ReceivedSignalStrengthIndicator", > + DBUS_TYPE_BYTE, > + &mrl->rssi); > + > + ofono_dbus_dict_append(iter, > + "UARFCN-DL", > + DBUS_TYPE_UINT16, > + &mrl->dl_freq); > + > + if (mrl->ul_freq != OFONO_CI_FIELD_FREQ_UNDEFINED) > + ofono_dbus_dict_append(iter, > + "UARFCN-UL", > + DBUS_TYPE_UINT16, > + &mrl->ul_freq); > + Same as above. > + return 0; > +} > + > +static int append_utra_neighbors(DBusMessageIter *iter, > + struct utran *utran) > +{ > + DBusMessageIter iter_array; > + int i, j; > + > + Extra empty line. > + for (i = 0; i < utran->no_freq; ++i) { > + > + for (j = 0; j < utran->mrl[i].no_cells; ++j) { > + dbus_message_iter_open_container(iter, > + DBUS_TYPE_ARRAY, > + "{sv}", > + &iter_array); > + append_utra_neigh_freq_data(&iter_array, > + &utran->mrl[i]); > + append_utra_neigh_cell_data(&iter_array, > + &utran->mrl[i].cmr[j]); > + > + dbus_message_iter_close_container(iter, > + &iter_array); Same as above about line wraps. > + } > + } > + > + return 0; > +} > + > +static void append_utran_meta_data(DBusMessageIter *iter, > + struct ofono_cell_info_results *ci) Coding style, M4. > +{ > + DBusMessageIter iter_array; > + const char *type = "UTRA-FDD"; > + const char *mcc = ci->mcc; > + const char *mnc = ci->mnc; > + > + dbus_message_iter_open_container(iter, > + DBUS_TYPE_ARRAY, > + "{sv}", > + &iter_array); > + > + ofono_dbus_dict_append(&iter_array, > + "Type", > + DBUS_TYPE_STRING, > + &type); > + ofono_dbus_dict_append(&iter_array, > + "MobileNetworkCode", > + DBUS_TYPE_STRING, > + &mnc); > + ofono_dbus_dict_append(&iter_array, > + "MobileCountryCode", > + DBUS_TYPE_STRING, > + &mcc); > + ofono_dbus_dict_append(&iter_array, > + "UniqueCellId", > + DBUS_TYPE_UINT32, > + &ci->utran.ucid); > + ofono_dbus_dict_append(&iter_array, > + "ScramblingCode", > + DBUS_TYPE_UINT16, > + &ci->utran.sc); > + ofono_dbus_dict_append(&iter_array, > + "UARFCN-DL", > + DBUS_TYPE_UINT16, > + &ci->utran.dl_freq); > + > + if (ci->utran.ul_freq != OFONO_CI_FIELD_FREQ_UNDEFINED) { > + ofono_dbus_dict_append(&iter_array, > + "UARFCN-UL", > + DBUS_TYPE_UINT16, > + &ci->utran.ul_freq); > + } > + And line wrapping, as above. > + dbus_message_iter_close_container(iter, &iter_array); > +} > + > +static int fill_utra_ci(DBusMessageIter *iter, > + struct ofono_cell_info_results *ci) > +{ > + Extra empty line. > + append_utran_meta_data(iter, ci); > + append_utra_neighbors(iter, &ci->utran); > + > + return 0; > +} > + > +static void ofono_neigh_cell_info_query_cb(const struct ofono_error *error, > + struct ofono_cell_info_results *ci_results, void *data) > +{ Coding style, M4. Not completely applicable here, but you could still fit at least 4 tabs there. > + struct ofono_cell_info *ci = data; > + DBusMessage *msg = ci->pending; > + DBusMessage *reply; > + DBusMessageIter iter, iter_array; > + int status; > + > + DBG(""); > + > + if (error->type != OFONO_ERROR_TYPE_NO_ERROR) { > + ofono_error("Neighbor cell info query failed"); > + goto error; > + } > + > + reply = dbus_message_new_method_return(msg); > + if (reply == NULL) { > + ofono_error("Failed to create response"); > + goto error; > + } > + > + dbus_message_iter_init_append(reply, &iter); > + dbus_message_iter_open_container(&iter, > + DBUS_TYPE_ARRAY, > + "a{sv}", > + &iter_array); > + > + if (ci_results->has_geran_cells == TRUE) { No need to explicitly call out a boolean. > + DBG("Geran cell info received"); > + > + status = fill_geran_ci(&iter_array, ci_results); > + if (status != 0) { > + ofono_error("Failed to fill geran info"); > + goto error; > + } > + > + } > + > + if (ci_results->has_utran_cells) { > + DBG("Utran cell info received"); > + > + status = fill_utra_ci(&iter_array, ci_results); > + if (status != 0) { > + ofono_error("Failed to fill utran info"); > + goto error; > + } > + > + } Add empty line here. > + dbus_message_iter_close_container(&iter, &iter_array); > + __ofono_dbus_pending_reply(&msg, reply); > + return; > + > +error: > + reply = __ofono_error_failed(msg); > + __ofono_dbus_pending_reply(&msg, reply); > + return; > + Extra empty line here. > +} > + > +static DBusMessage *ci_get_cells(DBusConnection *conn, DBusMessage *msg, > + void *data) > +{ > + struct ofono_cell_info *ci = data; > + DBG(""); > + > + ci->pending = dbus_message_ref(msg); > + ci->driver->query(ci, ofono_neigh_cell_info_query_cb, ci->driver_data); > + > + return NULL; > +} Cheers, Aki ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 4/5] cell-info: New files included in compilation 2011-02-14 14:56 [PATCH 0/5 v4] Neighbor Cell Info Atom Antti Paila ` (2 preceding siblings ...) 2011-02-14 14:56 ` [PATCH 3/5] cell-info: Atom " Antti Paila @ 2011-02-14 14:56 ` Antti Paila 2011-02-14 14:56 ` [PATCH 5/5] cell-info: Documentation Antti Paila 2011-03-01 8:25 ` [PATCH 0/5 v4] Neighbor Cell Info Atom Jarkko Tulla 5 siblings, 0 replies; 8+ messages in thread From: Antti Paila @ 2011-02-14 14:56 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 1420 bytes --] --- Makefile.am | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index 42ad86f..785640b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,7 +14,8 @@ pkginclude_HEADERS = include/log.h include/plugin.h include/history.h \ include/audio-settings.h include/nettime.h \ include/ctm.h include/cdma-voicecall.h \ include/cdma-sms.h include/sim-auth.h \ - include/gprs-provision.h include/emulator.h + include/gprs-provision.h include/emulator.h \ + include/cell-info.h nodist_pkginclude_HEADERS = include/version.h @@ -367,7 +368,8 @@ src_ofonod_SOURCES = $(gdbus_sources) $(builtin_sources) src/ofono.ver \ src/smsagent.c src/smsagent.h src/ctm.c \ src/cdma-voicecall.c src/sim-auth.c \ src/message.h src/message.c src/gprs-provision.c \ - src/emulator.c + src/emulator.c \ + src/cell-info.c src_ofonod_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ @CAPNG_LIBS@ -ldl @@ -409,7 +411,8 @@ doc_files = doc/overview.txt doc/ofono-paper.txt doc/release-faq.txt \ doc/phonebook-api.txt doc/radio-settings-api.txt \ doc/sim-api.txt doc/stk-api.txt \ doc/audio-settings-api.txt doc/text-telephony-api.txt \ - doc/calypso-modem.txt doc/message-api.txt + doc/calypso-modem.txt doc/message-api.txt \ + doc/cell-info.txt test_scripts = test/backtrace \ -- 1.7.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/5] cell-info: Documentation 2011-02-14 14:56 [PATCH 0/5 v4] Neighbor Cell Info Atom Antti Paila ` (3 preceding siblings ...) 2011-02-14 14:56 ` [PATCH 4/5] cell-info: New files included in compilation Antti Paila @ 2011-02-14 14:56 ` Antti Paila 2011-03-01 8:25 ` [PATCH 0/5 v4] Neighbor Cell Info Atom Jarkko Tulla 5 siblings, 0 replies; 8+ messages in thread From: Antti Paila @ 2011-02-14 14:56 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 3740 bytes --] --- doc/cell-info.txt | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 122 insertions(+), 0 deletions(-) create mode 100644 doc/cell-info.txt diff --git a/doc/cell-info.txt b/doc/cell-info.txt new file mode 100644 index 0000000..b8a4136 --- /dev/null +++ b/doc/cell-info.txt @@ -0,0 +1,122 @@ +Cell Info hierarchy +=================== + +Service org.ofono +Interface org.ofono.NeighborCellInfo +Object path [variable prefix]/{modem0,modem1,...} + +Methods aa{sv} AquireMeasurement() + + Calling this procedure returns properties of serving + and neighbouring cells in GSM, WCDMA and LTE networks. + This information can be used to determine current + location using triangulation over neighbouring cell + tower locations and estimated distances. + + This method returns an array that consists of two + types of cells: 1) first type contains a dictionary of + common information about network and serving cell for + a certain radio access type 2) following entries + contain the measurement results of neighboring cells of + the same RAT. The contents of the dictionaries + follow the specification OMA-TS-ULP-V2_0-20100816-C + for user plane Location and is described in properties + section. + + Possible errors: org.ofono.Error.Failed + +Properties + +Serving cell + string Type + Radio access network type of neighbor cell information. + The possible values are: + "geran" Measurement results are for the GSM EDGE Radio + Access Network. + "utran" Measurement results are for UMTS Radio Access + Network. + + uint16 MobileCountryCode + Mobile Country Code of serving cell. Possible values: + Values: 0...999" + + uint16 MobileNetworkCode + Mobile Network Code of serving cell. + Values: 0...999" + + uint16 LocationAreaCode [GERAN] + Location area code of serving cell. + Values: 0...65535 + + uint16 CellId [GERAN] + Cell Id of serving cell. + Values: 0...65535 + + byte TimingAdvance [GERAN, optional] + Timing advance. + Values: 0...63 + + uint32 UniqueCellId [UTRA-FDD] + Serving WCDMA unique cell ID. + Values: 0...268435455 + + uint16 ScramblingCode [UTRA-FDD] + Primary scrambling code. + Values: 0...511 + + uint16 UARFCN-DL [UTRA-FDD] + Downlink UTRA Absolute Radio Frequency Channel Number + of serving cell. + Values: 0...16383 + + uint16 UARFCN-UL [UTRA-FDD, optional] + Uplink UTRA Absolute Radio Frequency Channel Number. + Values: 0...16383 + + +Neighbor cell measurement results + + uint16 AbsoluteRadioFrequencyChannelNumber [GERAN] + Absolute radio frequency channel number. + Values: 0...1023 + + byte BaseStationIdentityCode [GERAN] + Base station identity code. + Values: 0...63. + + byte RXLEV [GERAN] + Measured power of the channel. + Values: 0...63 + + byte ReceivedSignalStrengthIndicator [UTRA-FDD] + RX power level. + Values: 0...127 + + uint16 UARFCN-DL [UTRA-FDD] + Downlink UARFCN. + Values: 0...16383 + + uint16 UARFCN-UL [UTRA-FDD, optional] + Uplink UARFCN. + Values: 0...16383 + + uint16 ScramblingCode [UTRA-FDD] + Primary scrambling code. + Values: 0...511 + + uint32 UniqueCellId [UTRA-FDD, optional] + Unique cell ID. + Values: 0...268435455 + + byte CPICH-ECN0 [UTRA-FDD, optional] + Common pilot channel RX energy per chip over noise + density in dB. + Values: 0...63 + + int16 CPICH-RSCP [UTRA-FDD, optional] + Common pilot channel RX carrier power in dBm + Values: -4...127 + + byte Pathloss [UTRA-FDD, optional] + Measured path loss in dB. + Values: 46...173 -- 1.7.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 0/5 v4] Neighbor Cell Info Atom 2011-02-14 14:56 [PATCH 0/5 v4] Neighbor Cell Info Atom Antti Paila ` (4 preceding siblings ...) 2011-02-14 14:56 ` [PATCH 5/5] cell-info: Documentation Antti Paila @ 2011-03-01 8:25 ` Jarkko Tulla 5 siblings, 0 replies; 8+ messages in thread From: Jarkko Tulla @ 2011-03-01 8:25 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 1613 bytes --] On 02/14/2011 04:56 PM, Antti Paila wrote: > This series of patches implements an interface for client > applications to fetch the ECID information of neighboring > cells using DBUS. Since the 1st version the DBUS api has > been refactored to use new naming for method and to use > flat data format for the cell information. Also, the > internal datatypes have been optimized. Since the 2nd > version MNC and MCC are converted to strings and CPICH-RSCP > re-typed. Since 3rd version multiradio support is added and > interfaces are renamed. > > Antti Paila (5): > cell-info: CellInfo DBUS interface definition > cell-info: Header files for neighbor cell info > cell-info: Atom for neighbor cell info > cell-info: New files included in compilation > cell-info: Documentation > > Makefile.am | 9 +- > doc/cell-info.txt | 122 +++++++++++++ > include/cell-info.h | 126 ++++++++++++++ > include/dbus.h | 1 + > src/cell-info.c | 475 +++++++++++++++++++++++++++++++++++++++++++++++++++ > src/ofono.h | 1 + > 6 files changed, 731 insertions(+), 3 deletions(-) > create mode 100644 doc/cell-info.txt > create mode 100644 include/cell-info.h > create mode 100644 src/cell-info.c > > _______________________________________________ > ofono mailing list > ofono(a)ofono.org > http://lists.ofono.org/listinfo/ofono Hi, is there any timetable for getting this Anttis' patch to core? I am asking because I have almost ready STE modem implementation for getting cell information. BR, Jarkko ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2011-03-03 20:30 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-02-14 14:56 [PATCH 0/5 v4] Neighbor Cell Info Atom Antti Paila 2011-02-14 14:56 ` [PATCH 1/5] cell-info: CellInfo DBUS interface definition Antti Paila 2011-02-14 14:56 ` [PATCH 2/5] cell-info: Header files for neighbor cell info Antti Paila 2011-02-14 14:56 ` [PATCH 3/5] cell-info: Atom " Antti Paila 2011-03-03 20:30 ` Aki Niemi 2011-02-14 14:56 ` [PATCH 4/5] cell-info: New files included in compilation Antti Paila 2011-02-14 14:56 ` [PATCH 5/5] cell-info: Documentation Antti Paila 2011-03-01 8:25 ` [PATCH 0/5 v4] Neighbor Cell Info Atom Jarkko Tulla
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.