[PATCH] ubloxmodem: fix maybe-unitialized error
by Martin Hundebøll
Fixes:
../git/drivers/ubloxmodem/gprs-context.c: In function ‘ublox_gprs_activate_primary’:
../git/drivers/ubloxmodem/gprs-context.c:339:2: error: ‘auth’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
snprintf(buf, sizeof(buf), "AT+UAUTHREQ=%u,%u,\"%s\",\"%s\"",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gcd->active_context, auth, username, password);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../git/drivers/ubloxmodem/gprs-context.c:324:11: note: ‘auth’ was declared here
unsigned auth;
^~~~
---
drivers/ubloxmodem/gprs-context.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/ubloxmodem/gprs-context.c b/drivers/ubloxmodem/gprs-context.c
index 489f31e8..c5b789b6 100644
--- a/drivers/ubloxmodem/gprs-context.c
+++ b/drivers/ubloxmodem/gprs-context.c
@@ -321,7 +321,7 @@ static void ublox_send_uauthreq(struct ofono_gprs_context *gc,
{
struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
char buf[UBLOX_MAX_USER_LEN + UBLOX_MAX_PASS_LEN + 32];
- unsigned auth;
+ unsigned auth = 0;
switch (auth_method) {
case OFONO_GPRS_AUTH_METHOD_PAP:
--
2.22.0
3 years
[PATCH] xmm7modem: disabling reporting of intermediate results for CGDATA
by Antara Borwankar
Setting <connect_flag> in AT+XDATACHANNEL set command to 0. This will
disable intermediate result reporting of "CONNECT" and "NO CARRIER"
on control channel.
This resolves the issue of getting failure response for offline-modem
since "NO CARRIER" is received as result of AT+CFUN operation instead
of "OK".
---
drivers/ifxmodem/gprs-context.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/ifxmodem/gprs-context.c b/drivers/ifxmodem/gprs-context.c
index 2de6b4f..7bacb73 100644
--- a/drivers/ifxmodem/gprs-context.c
+++ b/drivers/ifxmodem/gprs-context.c
@@ -406,7 +406,7 @@ static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer user_data)
interface = ofono_gprs_context_get_interface(gc);
datapath = get_datapath(modem, interface);
- snprintf(buf, sizeof(buf), "AT+XDATACHANNEL=1,1,\"%s\",\"%s\",2,%u",
+ snprintf(buf, sizeof(buf), "AT+XDATACHANNEL=1,1,\"%s\",\"%s\",0,%u",
ctrlpath, datapath, gcd->active_context);
g_at_chat_send(gcd->chat, buf, none_prefix, NULL, NULL, NULL);
snprintf(buf, sizeof(buf), "AT+CGDATA=\"M-RAW_IP\",%u",
--
1.9.1
3 years
[PATCH] udev: Adding PCIe as a subsystem in udev
by Varun Gargi
Adding support for enumerating PCIe types of modems in ofono
---
plugins/udevng.c | 190 ++++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 168 insertions(+), 22 deletions(-)
mode change 100644 => 100755 plugins/udevng.c
diff --git a/plugins/udevng.c b/plugins/udevng.c
old mode 100644
new mode 100755
index 4b420dc..79eec42
--- a/plugins/udevng.c
+++ b/plugins/udevng.c
@@ -41,6 +41,7 @@
enum modem_type {
MODEM_TYPE_USB,
MODEM_TYPE_SERIAL,
+ MODEM_TYPE_PCIE,
};
struct modem_info {
@@ -1198,26 +1199,39 @@ static gboolean setup_xmm7xxx(struct modem_info *modem)
info->interface, info->number, info->label,
info->sysattr, info->subsystem);
- if (g_strcmp0(modem->model,"095a") == 0) {
- if (g_strcmp0(info->subsystem, "tty") == 0) {
- if (g_strcmp0(info->number, "00") == 0)
- mdm = info->devnode;
- } else if (g_strcmp0(info->subsystem, "net") == 0) {
- if (g_strcmp0(info->number, "06") == 0)
- net = info->devnode;
- if (g_strcmp0(info->number, "08") == 0)
- net2 = info->devnode;
- if (g_strcmp0(info->number, "0a") == 0)
- net3 = info->devnode;
- }
- } else {
- if (g_strcmp0(info->subsystem, "tty") == 0) {
- if (g_strcmp0(info->number, "02") == 0)
- mdm = info->devnode;
- } else if (g_strcmp0(info->subsystem, "net") == 0) {
- if (g_strcmp0(info->number, "00") == 0)
- net = info->devnode;
+ if (g_strcmp0(info->subsystem, "pci") == 0) {
+ mdm = "/dev/iat";
+ net = "/dev/inm0";
+ net2 = "/dev/inm1";
+ net3 = "/dev/inm2";
+ ofono_modem_set_string(modem->modem,
+ "CtrlPath", "/PCIE/IOSM/CTRL/1");
+ ofono_modem_set_string(modem->modem, "DataPath",
+ "/PCIE/IOSM/IPS/");
+ } else { /* For USB */
+ if (g_strcmp0(modem->model,"095a") == 0) {
+ if (g_strcmp0(info->subsystem, "tty") == 0) {
+ if (g_strcmp0(info->number, "00") == 0)
+ mdm = info->devnode;
+ } else if (g_strcmp0(info->subsystem, "net") == 0) {
+ if (g_strcmp0(info->number, "06") == 0)
+ net = info->devnode;
+ if (g_strcmp0(info->number, "08") == 0)
+ net2 = info->devnode;
+ if (g_strcmp0(info->number, "0a") == 0)
+ net3 = info->devnode;
+ }
+ } else {
+ if (g_strcmp0(info->subsystem, "tty") == 0) {
+ if (g_strcmp0(info->number, "02") == 0)
+ mdm = info->devnode;
+ } else if (g_strcmp0(info->subsystem, "net") == 0) {
+ if (g_strcmp0(info->number, "00") == 0)
+ net = info->devnode;
+ }
}
+ ofono_modem_set_string(modem->modem, "CtrlPath", "/USBCDC/0");
+ ofono_modem_set_string(modem->modem, "DataPath", "/USBHS/NCM/");
}
}
@@ -1235,9 +1249,6 @@ static gboolean setup_xmm7xxx(struct modem_info *modem)
if (net3)
ofono_modem_set_string(modem->modem, "NetworkInterface3", net3);
- ofono_modem_set_string(modem->modem, "CtrlPath", "/USBCDC/0");
- ofono_modem_set_string(modem->modem, "DataPath", "/USBHS/NCM/");
-
return TRUE;
}
@@ -1406,6 +1417,7 @@ static void destroy_modem(gpointer data)
switch (modem->type) {
case MODEM_TYPE_USB:
+ case MODEM_TYPE_PCIE:
for (list = modem->devices; list; list = list->next) {
struct device_info *info = list->data;
@@ -1436,6 +1448,7 @@ static gboolean check_remove(gpointer key, gpointer value, gpointer user_data)
switch (modem->type) {
case MODEM_TYPE_USB:
+ case MODEM_TYPE_PCIE:
for (list = modem->devices; list; list = list->next) {
struct device_info *info = list->data;
@@ -1565,6 +1578,86 @@ static void add_serial_device(struct udev_device *dev)
modem->serial = info;
}
+static void add_pci_device(const char *syspath, const char *devname,
+ const char *driver, const char *vendor,
+ const char *model, struct udev_device *device)
+{
+ const char *devpath, *devnode , *interface , *number;
+ const char *label, *sysattr, *subsystem;
+ struct modem_info *modem;
+ struct device_info *info;
+ struct udev_device *parent;
+
+ devpath = udev_device_get_syspath(device);
+
+ if (devpath == NULL)
+ return;
+
+ devnode = udev_device_get_devnode(device);
+
+ if (devnode == NULL) {
+ devnode = udev_device_get_property_value(device, "INTERFACE");
+ DBG("devnode = %s", devnode );
+ }
+
+ modem = g_hash_table_lookup(modem_list, syspath);
+
+ if (modem == NULL) {
+ modem = g_try_new0(struct modem_info, 1);
+
+ if (modem == NULL)
+ return;
+
+ modem->type = MODEM_TYPE_PCIE;
+ modem->syspath = g_strdup(syspath);
+ modem->devname = g_strdup(devname);
+ modem->driver = g_strdup(driver);
+ modem->vendor = g_strdup(vendor);
+ modem->model = g_strdup(model);
+ modem->sysattr = get_sysattr(driver);
+
+ g_hash_table_replace(modem_list, modem->syspath, modem);
+ }
+
+ interface = udev_device_get_property_value(device, "INTERFACE");
+ /* If environment variable is not set, get value from attributes (or parent's ones) */
+ number = udev_device_get_sysattr_value(device, "bInterfaceNumber");
+
+ if (number == NULL) {
+ parent = udev_device_get_parent(device);
+ number = udev_device_get_sysattr_value(parent, "bInterfaceNumber");
+ }
+
+ label = udev_device_get_property_value(device, "OFONO_LABEL");
+
+ if (!label)
+ label = udev_device_get_property_value(device, "OFONO_LABEL");
+
+ subsystem = udev_device_get_subsystem(device);
+
+ if (modem->sysattr != NULL)
+ sysattr = udev_device_get_sysattr_value(device, modem->sysattr);
+ else
+ sysattr = NULL;
+
+ DBG("%s (%s) %s [%s] ==> %s %s", devnode, driver,
+ interface, number, label, sysattr);
+ info = g_try_new0(struct device_info, 1);
+
+ if (info == NULL)
+ return;
+
+ info->devpath = g_strdup(devpath);
+ info->devnode = g_strdup(devnode);
+ info->interface = g_strdup(interface);
+ info->number = g_strdup(number);
+ info->label = g_strdup(label);
+ info->sysattr = g_strdup(sysattr);
+ info->subsystem = g_strdup(subsystem);
+
+ modem->devices = g_slist_insert_sorted(modem->devices, info,
+ compare_device);
+}
static void add_device(const char *syspath, const char *devname,
const char *driver, const char *vendor,
@@ -1594,8 +1687,10 @@ static void add_device(const char *syspath, const char *devname,
return;
modem = g_hash_table_lookup(modem_list, syspath);
+
if (modem == NULL) {
modem = g_try_new0(struct modem_info, 1);
+
if (modem == NULL)
return;
@@ -1739,6 +1834,7 @@ static struct {
{ "telit", "cdc_acm", "1bc7", "0036" },
{ "xmm7xxx", "cdc_acm", "8087" },
{ "xmm7xxx", "cdc_ncm", "8087" },
+ { "xmm7xxx", "imc_ipc", "0x8086", "0x7560"},
{ }
};
@@ -1825,6 +1921,53 @@ static void check_usb_device(struct udev_device *device)
add_device(syspath, devname, driver, vendor, model, device);
}
+static void check_pci_device(struct udev_device *device)
+{
+ const char *syspath, *devname , *driver;
+ const char *vendor = NULL, *model = NULL, *drv = NULL;
+ unsigned int i;
+
+ syspath = udev_device_get_syspath(device);
+
+ if (syspath == NULL)
+ return;
+
+ devname = udev_device_get_devnode(device);
+ vendor = udev_device_get_sysattr_value(device, "vendor");
+ model = udev_device_get_sysattr_value(device, "device");
+ driver = udev_device_get_property_value(device, "OFONO_DRIVER");
+ drv = udev_device_get_property_value(device, "DRIVER");
+ DBG("%s [%s:%s]", drv, vendor, model);
+
+ if (vendor == NULL || model == NULL)
+ return;
+
+ for (i = 0; vendor_list[i].driver; i++) {
+ if (( drv != NULL) && (g_str_equal(vendor_list[i].drv, drv) == TRUE)) {
+ DBG("vendor_list[%d].drv = %s",i, vendor_list[i].drv );
+ } else {
+ continue;
+ }
+
+ if (vendor_list[i].vid) {
+ if (!g_str_equal(vendor_list[i].vid, vendor))
+ continue;
+ }
+
+ if (vendor_list[i].pid) {
+ if (!g_str_equal(vendor_list[i].pid, model))
+ continue;
+ }
+ driver = vendor_list[i].driver;
+ }
+
+ if (driver == NULL)
+ return;
+ else
+ DBG("Driver Found %s", driver);
+
+ add_pci_device(syspath, devname, driver, vendor, model, device);
+}
static void check_device(struct udev_device *device)
{
const char *bus;
@@ -1839,6 +1982,8 @@ static void check_device(struct udev_device *device)
if ((g_str_equal(bus, "usb") == TRUE) ||
(g_str_equal(bus, "usbmisc") == TRUE))
check_usb_device(device);
+ else if (g_str_equal(bus, "pci") == TRUE)
+ check_pci_device(device);
else
add_serial_device(device);
@@ -1899,6 +2044,7 @@ static void enumerate_devices(struct udev *context)
udev_enumerate_add_match_subsystem(enumerate, "usbmisc");
udev_enumerate_add_match_subsystem(enumerate, "net");
udev_enumerate_add_match_subsystem(enumerate, "hsi");
+ udev_enumerate_add_match_subsystem(enumerate, "pci");
udev_enumerate_scan_devices(enumerate);
--
1.9.1
3 years
[PATCH 1/2] isimodem: gprs-context: properly null terminate cd->password
by James Prestwood
It looks like a previous line was copied and cd->username was re-terminated
instead of password. This also fixes a compiler error when using GCC 9:
In function ‘strncpy’,
inlined from ‘isi_gprs_activate_primary’ at drivers/isimodem/gprs-context.c:546:3:
/usr/include/bits/string_fortified.h:106:10: error: ‘__builtin_strncpy’ output may be truncated copying 53 bytes from a string of length 255 [-Werror=stringop-truncation]
106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
drivers/isimodem/gprs-context.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/isimodem/gprs-context.c b/drivers/isimodem/gprs-context.c
index 9ccc7f15..4076ed8b 100644
--- a/drivers/isimodem/gprs-context.c
+++ b/drivers/isimodem/gprs-context.c
@@ -544,7 +544,7 @@ static void isi_gprs_activate_primary(struct ofono_gprs_context *gc,
strncpy(cd->username, ctx->username, GPDS_MAX_USERNAME_LENGTH);
cd->username[GPDS_MAX_USERNAME_LENGTH] = '\0';
strncpy(cd->password, ctx->password, GPDS_MAX_PASSWORD_LENGTH);
- cd->username[GPDS_MAX_PASSWORD_LENGTH] = '\0';
+ cd->password[GPDS_MAX_PASSWORD_LENGTH] = '\0';
}
cd->pep = g_isi_pep_create(cd->idx, NULL, NULL);
--
2.21.0
3 years
[PATCH] xmm7modem: fix to activate context with cid zero
by Antara Borwankar
xmm7modem returns 0 as cid for default pdp context. Thus
initializing last_auto_context_id to -1 to indicate a deactivated
context.
---
drivers/atmodem/gprs.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/atmodem/gprs.c b/drivers/atmodem/gprs.c
index dd73458..fbee5c9 100644
--- a/drivers/atmodem/gprs.c
+++ b/drivers/atmodem/gprs.c
@@ -48,7 +48,7 @@ static const char *none_prefix[] = { NULL };
struct gprs_data {
GAtChat *chat;
unsigned int vendor;
- unsigned int last_auto_context_id;
+ int last_auto_context_id;
gboolean telit_try_reattach;
int attached;
};
@@ -161,7 +161,7 @@ static void at_cgdcont_read_cb(gboolean ok, GAtResult *result,
return;
}
- if (gd->last_auto_context_id == 0) {
+ if (gd->last_auto_context_id == -1) {
DBG("Context got deactivated while calling CGDCONT");
return;
}
@@ -257,11 +257,11 @@ static void cgev_notify(GAtResult *result, gpointer user_data)
g_at_chat_send(gd->chat, "AT+CGDCONT?", cgdcont_prefix,
at_cgdcont_read_cb, gprs, NULL);
} else if (g_str_has_prefix(event, "ME PDN DEACT")) {
- unsigned int context_id;
+ int context_id;
sscanf(event, "%*s %*s %*s %u", &context_id);
/* Indicate that this cid is not activated anymore */
if (gd->last_auto_context_id == context_id)
- gd->last_auto_context_id = 0;
+ gd->last_auto_context_id = -1;
}
}
@@ -632,6 +632,7 @@ static int at_gprs_probe(struct ofono_gprs *gprs,
gd->chat = g_at_chat_clone(chat);
gd->vendor = vendor;
+ gd->last_auto_context_id = -1;
ofono_gprs_set_data(gprs, gd);
--
1.9.1
3 years
[PATCH 1/2] xmm7modem: fix to activate context with cid zero
by Antara Borwankar
xmm7modem returns 0 as cid for default pdp context. Thus removing
check for last_auto_context_id so that context actvation can be
successful.
---
drivers/atmodem/gprs.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/drivers/atmodem/gprs.c b/drivers/atmodem/gprs.c
index dd73458..d9192b3 100644
--- a/drivers/atmodem/gprs.c
+++ b/drivers/atmodem/gprs.c
@@ -161,9 +161,11 @@ static void at_cgdcont_read_cb(gboolean ok, GAtResult *result,
return;
}
- if (gd->last_auto_context_id == 0) {
- DBG("Context got deactivated while calling CGDCONT");
- return;
+ if (gd->vendor != OFONO_VENDOR_XMM) {
+ if (gd->last_auto_context_id == 0) {
+ DBG("Context got deactivated while calling CGDCONT");
+ return;
+ }
}
g_at_result_iter_init(&iter, result);
@@ -259,9 +261,12 @@ static void cgev_notify(GAtResult *result, gpointer user_data)
} else if (g_str_has_prefix(event, "ME PDN DEACT")) {
unsigned int context_id;
sscanf(event, "%*s %*s %*s %u", &context_id);
- /* Indicate that this cid is not activated anymore */
- if (gd->last_auto_context_id == context_id)
- gd->last_auto_context_id = 0;
+
+ if(gd->vendor != OFONO_VENDOR_XMM) {
+ /* Indicate that this cid is not activated anymore */
+ if (gd->last_auto_context_id == context_id)
+ gd->last_auto_context_id = 0;
+ }
}
}
@@ -487,6 +492,7 @@ static void gprs_initialized(gboolean ok, GAtResult *result, gpointer user_data)
switch (gd->vendor) {
case OFONO_VENDOR_IFX:
+ case OFONO_VENDOR_XMM:
/* Register for GPRS suspend notifications */
g_at_chat_register(gd->chat, "+XDATASTAT:", xdatastat_notify,
FALSE, gprs, NULL);
--
1.9.1
3 years
[PATCH 2/2] xmm7modem: changed gprs driver vendor for xmm7modem
by Antara Borwankar
Changed gprs driver vendor from "OFONO_VENDOR_IFX" to
"OFONO_VENDOR_XMM" for xmm7modem specific behavior.
---
plugins/xmm7xxx.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/xmm7xxx.c b/plugins/xmm7xxx.c
index a544798..aade18f 100644
--- a/plugins/xmm7xxx.c
+++ b/plugins/xmm7xxx.c
@@ -1243,7 +1243,7 @@ static void xmm7xxx_post_online(struct ofono_modem *modem)
ofono_netreg_create(modem, OFONO_VENDOR_IFX, "atmodem", data->chat);
- gprs = ofono_gprs_create(modem, OFONO_VENDOR_IFX, "atmodem",
+ gprs = ofono_gprs_create(modem, OFONO_VENDOR_XMM, "atmodem",
data->chat);
interface = ofono_modem_get_string(modem, "NetworkInterface");
--
1.9.1
3 years
Query related to calling via ofono api's
by swathika kesavan
Hi Team,
I have got few clarification related to ofono and connection manager.
We are using connection manager to bring the cellular interface up and its
successful.
We have got some application to make calls (which uses dbus ofono api's
like Dial).
When the cellular is under enabled state(connmanctl enable cellular) then
upon running ofono in debug mode ,I could see those ATD (dial commands)
been received by ofono and calling is successful.
But we are facing some issues,when I disable the cellular option in
connection manager using (connmanctl disable cellular).I couldn't see any
AT commands been received by ofono used for calling(via dbus)
*Note: *
Upon disabling ,instead of pushing the module to airplane mode (default
behavior),we have modified it in such a way they are not pushed to airplane
mode(instead we tried by disabling gprs alone(AT+CGATT=0)).
Here are my queries,
If Ofono is independent application ,which means disabling cellular in
connection manager shouldn't affect the call related api's which is been
used in my third application correct?
else ofono is dependent application on connman?
Kindly help me ,am stuck at the above case.
3 years
[PATCH 3/3] xmm7modem: adding netmon changes for reporting neighbouring cell
by Antara Borwankar
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 ba70e2b..0e958ab 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)
--
1.9.1
3 years
[PATCH 2/3] netmon: adding get functionality for neighbouring cell information
by Antara Borwankar
Handled the get neighbouring cell information function which returns
an array of signal strength of all neighbouring cells.
---
src/netmon.c | 253 +++++++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 184 insertions(+), 69 deletions(-)
diff --git a/src/netmon.c b/src/netmon.c
index 6c19df5..f383911 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,145 @@ 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;
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);
+ intval = va_arg(*arglist, int);
- CELL_INFO_DICT_APPEND(&dict, "CellId",
+ CELL_INFO_DICT_APPEND(dict, "CellId",
intval, uint32_t, DBUS_TYPE_UINT32);
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);
- 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);
- 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 +217,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 +412,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 +525,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) },
{ }
};
--
1.9.1
3 years