Skip to contentSkip to conversation

RFC: add LTE atom

PATCH Applied Dragos Tatulea 2 participants 15 messages Nov 9, 2016 Kbuild

v1 of 4 Applied Latest is v4 →

lore
Share & tools
lore
#0 lore raw

cover RFC: add LTE atom

This patchset adds a simple LTE atom. It can only set the default APN. But it's meant to be easily extensible in the future.

The atom exposes a per modem D-Bus interface. It also uses the oFono persistent configuration store.

The patchset contains:
* lte atom implementation
* U-Blox Toby L2 lte driver implementation
* script for setting the lte properties

The last patches contain the implementation of the TobyL2 driver. They might sit better in a different patchset maybe.

What is not here:
* Atom is always shown, regardles of technology. This should be filtered out.
* No provisioning support yet.

Dragos Tatulea (9):
include: add header file for lte atom
src: ofono.h: add LTE atom define
lte: add implementation for LTE atom
build: add lte atom support
test: add script for setting lte atom properties
doc: add lte atom documentation
ubloxmodem: add lte atom driver
build: add support for ublox lte atom driver
plugins: ublox: enable lte driver for tobyl2

 Makefile.am                     |   8 +-
 doc/lte-api.txt                 |  35 +++++
 drivers/ubloxmodem/lte.c        | 125 +++++++++++++++
 drivers/ubloxmodem/ubloxmodem.c |   3 +
 drivers/ubloxmodem/ubloxmodem.h |   5 +
 include/lte.h                   |  69 ++++++++
 plugins/ublox.c                 |   3 +
 src/lte.c                       | 341 ++++++++++++++++++++++++++++++++++++++++
 src/ofono.h                     |   1 +
 test/set-lte-property           |  25 +++
 10 files changed, 612 insertions(+), 3 deletions(-)
 create mode 100644 doc/lte-api.txt
 create mode 100644 drivers/ubloxmodem/lte.c
 create mode 100644 include/lte.h
 create mode 100644 src/lte.c
 create mode 100755 test/set-lte-property
Signature · 1 line
2.7.4
#1 lore raw

PATCH 1/9 include: add header file for lte atom

---
 include/lte.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)
 create mode 100644 include/lte.h
include/lte.h new file +69 -0
new file mode 100644
index 0000000..8d73079
@@ -0,0 +1,69 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2016  Endocode AG. All rights reserved.
+ *
+ *  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_LTE_H
+#define __OFONO_LTE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ofono/types.h>
+
+struct ofono_lte;
+
+struct ofono_lte_context_config {
+	char apn[OFONO_GPRS_MAX_APN_LENGTH + 1];
+	enum ofono_gprs_proto proto;
+};
+
+typedef void (*ofono_lte_cb_t)(const struct ofono_error *error, void *data);
+
+struct ofono_lte_driver {
+	const char *name;
+	int (*probe)(struct ofono_lte *lte, void *data);
+	void (*remove)(struct ofono_lte *lte);
+	int (*config)(struct ofono_lte *lte,
+			struct ofono_lte_context_config *config,
+			ofono_lte_cb_t cb, void *data);
+
+};
+
+int ofono_lte_driver_register(const struct ofono_lte_driver *d);
+
+void ofono_lte_driver_unregister(const struct ofono_lte_driver *d);
+
+struct ofono_lte *ofono_lte_create(struct ofono_modem *modem,
+					const char *driver, void *data);
+
+void ofono_lte_register(struct ofono_lte *lte);
+
+void ofono_lte_remove(struct ofono_lte *lte);
+
+void ofono_lte_set_data(struct ofono_lte *lte, void *data);
+
+void *ofono_lte_get_data(struct ofono_lte *lte);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Signature · 1 line
2.7.4
#2 lore raw

Re: [PATCH 1/9] include: add header file for lte atom

Hi Dragos,

Quoted 37 lines · Dragos Tatulea
---
  include/lte.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1 file changed, 69 insertions(+)

create mode 100644 include/lte.h

include/lte.h new file +26 -0
new file mode 100644
index 0000000..8d73079
@@ -0,0 +1,69 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2016  Endocode AG. All rights reserved.
+ *
+ *  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_LTE_H
+#define __OFONO_LTE_H
+
+#ifdef __cplusplus
+extern "C" {

include/lte.h line 36

Quoted 10 lines
include/lte.h new file +10 -0
+#endif
+
+#include <ofono/types.h>
+
+struct ofono_lte;
+
+struct ofono_lte_context_config {
+	char apn[OFONO_GPRS_MAX_APN_LENGTH + 1];
+	enum ofono_gprs_proto proto;
+};

Lets name it ofono_lte_default_attach_info

include/lte.h line 44

Quoted 8 lines
include/lte.h new file +8 -0
+
+typedef void (*ofono_lte_cb_t)(const struct ofono_error *error, void *data);
+
+struct ofono_lte_driver {
+	const char *name;
+	int (*probe)(struct ofono_lte *lte, void *data);
+	void (*remove)(struct ofono_lte *lte);
+	int (*config)(struct ofono_lte *lte,

I'm not happy with the name, it is not descriptive enough

.set_default_attach_info
.set_default_context

Other ideas?

include/lte.h line 45

Quoted 1 line
include/lte.h new file +1 -0
+			struct ofono_lte_context_config *config,

const struct ofono_lte...

Quoted 15 lines
include/lte.h new file +14 -0
+			ofono_lte_cb_t cb, void *data);
+
+};
+
+int ofono_lte_driver_register(const struct ofono_lte_driver *d);
+
+void ofono_lte_driver_unregister(const struct ofono_lte_driver *d);
+
+struct ofono_lte *ofono_lte_create(struct ofono_modem *modem,
+					const char *driver, void *data);
+
+void ofono_lte_register(struct ofono_lte *lte);
+
+void ofono_lte_remove(struct ofono_lte *lte);

include/lte.h line 69

Quoted 10 lines
include/lte.h new file +10 -0
+
+void ofono_lte_set_data(struct ofono_lte *lte, void *data);
+
+void *ofono_lte_get_data(struct ofono_lte *lte);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

Regards,
-Denis

#3 lore raw

PATCH 2/9 src: ofono.h: add LTE atom define

In reply to Dragos Tatulea
---
 src/ofono.h | 1 +
 1 file changed, 1 insertion(+)
src/ofono.h +1 -0
index 5b37a64..1df47d5 100644
@@ -153,6 +153,7 @@ enum ofono_atom_type {
 	OFONO_ATOM_TYPE_HANDSFREE,
 	OFONO_ATOM_TYPE_SIRI,
 	OFONO_ATOM_TYPE_NETMON,
+	OFONO_ATOM_TYPE_LTE,
 };
 
 enum ofono_atom_watch_condition {
Signature · 1 line
2.7.4
#4 lore raw

Re: [PATCH 2/9] src: ofono.h: add LTE atom define

Hi Dragos,

Quoted 4 lines · Dragos Tatulea
---
  src/ofono.h | 1 +
  1 file changed, 1 insertion(+)

Applied, thanks.

Regards,
-Denis

#5 lore raw

PATCH 3/9 lte: add implementation for LTE atom

In reply to Dragos Tatulea

This implementation can only get/set the default APN setting. But anything expected for this atom is there:
* D-Bus interface
* sync-ing settings to/from file
* interaction with driver

---
 src/lte.c | 341 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 341 insertions(+)
 create mode 100644 src/lte.c
src/lte.c new file +341 -0
new file mode 100644
index 0000000..cde0496
@@ -0,0 +1,341 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2016  Endocode AG. All rights reserved.
+ *
+ *  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 <string.h>
+#include <errno.h>
+
+#include <glib.h>
+#include <gdbus.h>
+
+#include "ofono.h"
+
+#include "common.h"
+#include "log.h"
+#include "gprs-context.h"
+#include "storage.h"
+
+#include "lte.h"
+
+#define SETTINGS_STORE "lte"
+#define SETTINGS_GROUP "Settings"
+
+struct ofono_lte {
+	const struct ofono_lte_driver *driver;
+	void *driver_data;
+	struct ofono_atom *atom;
+	char *imsi;
+	GKeyFile *settings;
+	struct ofono_lte_context_config config;
+};
+
+static GSList *g_drivers = NULL;
+
+static void lte_load_settings(struct ofono_lte *lte)
+{
+	char *apn;
+
+	if (lte->imsi == NULL)
+		return;
+
+	lte->settings = storage_open(lte->imsi, SETTINGS_STORE);
+
+	if (lte->settings == NULL) {
+		ofono_error("LTE: Can't open settings file, "
+				"changes won't be persistent");
+		return;
+	}
+
+	apn = g_key_file_get_string(lte->settings, SETTINGS_GROUP ,
+					"DefaultAPN", NULL);
+	if (apn) {
+		strcpy(lte->config.apn, apn);
+
+		if (lte->driver)
+			lte->driver->config(lte, &lte->config, NULL, NULL);
+	}
+}
+
+static void append_lte_properties(struct ofono_lte *lte,
+					DBusMessageIter *dict)
+{
+	const char *apn = lte->config.apn;
+
+	ofono_dbus_dict_append(dict, "DefaultAPN", DBUS_TYPE_STRING, &apn);
+}
+
+static DBusMessage *lte_get_properties(DBusConnection *conn,
+					DBusMessage *msg, void *data)
+{
+	struct ofono_lte *lte = data;
+	DBusMessage *reply;
+	DBusMessageIter iter;
+	DBusMessageIter dict;
+
+	reply = dbus_message_new_method_return(msg);
+	if (reply == NULL)
+		return NULL;
+
+	dbus_message_iter_init_append(reply, &iter);
+
+	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+					OFONO_PROPERTIES_ARRAY_SIGNATURE,
+					&dict);
+	append_lte_properties(lte, &dict);
+	dbus_message_iter_close_container(&iter, &dict);
+
+	return reply;
+}
+
+static DBusMessage *lte_set_default_apn(struct ofono_lte *lte,
+				DBusConnection *conn, DBusMessage *msg,
+				const char *apn)
+{
+	const char *path = __ofono_atom_get_path(lte->atom);
+
+	if (strlen(apn) > OFONO_GPRS_MAX_APN_LENGTH)
+		return __ofono_error_invalid_format(msg);
+
+	if (g_str_equal(apn, lte->config.apn))
+		return dbus_message_new_method_return(msg);
+
+	/* We do care about empty value: it can be used for reset. */
+	if (is_valid_apn(apn) == FALSE && apn[0] != '\0')
+		return __ofono_error_invalid_format(msg);
+
+	strcpy(lte->config.apn, apn);
+
+	if (lte->settings) {
+		if (strlen(apn) == 0)
+			/* Clear entry on empty APN. */
+			g_key_file_remove_key(lte->settings, SETTINGS_GROUP,
+						"DefaultAPN", NULL);
+		else
+			g_key_file_set_string(lte->settings, SETTINGS_GROUP,
+						"DefaultAPN", lte->config.apn);
+
+		storage_sync(lte->imsi, SETTINGS_STORE, lte->settings);
+	}
+
+	if (lte->driver)
+		lte->driver->config(lte, &lte->config, NULL, NULL);
+
+	if (msg)
+		g_dbus_send_reply(conn, msg, DBUS_TYPE_INVALID);
+
+	ofono_dbus_signal_property_changed(conn, path,
+					OFONO_CONNECTION_CONTEXT_INTERFACE,
+					"DefaultAPN",
+					DBUS_TYPE_STRING, &apn);
+
+	return NULL;
+
+}
+
+static DBusMessage *lte_set_property(DBusConnection *conn,
+					DBusMessage *msg, void *data)
+{
+	struct ofono_lte *lte = data;
+	DBusMessageIter iter;
+	DBusMessageIter var;
+	const char *property;
+	const char *str;
+
+	if (!dbus_message_iter_init(msg, &iter))
+		return __ofono_error_invalid_args(msg);
+
+	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+		return __ofono_error_invalid_args(msg);
+
+	dbus_message_iter_get_basic(&iter, &property);
+	dbus_message_iter_next(&iter);
+
+	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
+		return __ofono_error_invalid_args(msg);
+
+	dbus_message_iter_recurse(&iter, &var);
+
+
+	if (!strcmp(property, "DefaultAPN")) {
+		if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_STRING)
+			return __ofono_error_invalid_args(msg);
+
+		dbus_message_iter_get_basic(&var, &str);
+
+		return lte_set_default_apn(lte, conn, msg, str);
+	}
+
+
+	return __ofono_error_invalid_args(msg);
+}
+
+static const GDBusMethodTable lte_methods[] = {
+	{ GDBUS_METHOD("GetProperties",
+			NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
+			lte_get_properties) },
+	{ GDBUS_ASYNC_METHOD("SetProperty",
+			GDBUS_ARGS({ "property", "s" }, { "value", "v" }),
+			NULL, lte_set_property) },
+	{ }
+};
+
+static const GDBusSignalTable lte_signals[] = {
+	{ GDBUS_SIGNAL("PropertyChanged",
+			GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
+	{ }
+};
+
+static void lte_atom_remove(struct ofono_atom *atom)
+{
+	struct ofono_lte *lte = __ofono_atom_get_data(atom);
+
+	DBG("atom: %p", atom);
+
+	if (lte == NULL)
+		return;
+
+	if (lte->settings) {
+		storage_close(lte->imsi, SETTINGS_STORE, lte->settings, TRUE);
+
+		g_free(lte->imsi);
+		lte->imsi = NULL;
+		lte->settings = NULL;
+	}
+
+	if (lte->driver && lte->driver->remove)
+		lte->driver->remove(lte);
+
+	g_free(lte);
+}
+
+
+struct ofono_lte *ofono_lte_create(struct ofono_modem *modem,
+					const char *driver, void *data)
+{
+	struct ofono_lte *lte;
+	GSList *l;
+
+	if (driver == NULL)
+		return NULL;
+
+	lte = g_try_new0(struct ofono_lte, 1);
+
+	if (lte == NULL)
+		return NULL;
+
+	lte->atom = __ofono_modem_add_atom(modem, OFONO_ATOM_TYPE_LTE,
+						lte_atom_remove, lte);
+
+	for (l = g_drivers; l; l = l->next) {
+		const struct ofono_lte_driver *drv = l->data;
+
+		if (g_strcmp0(drv->name, driver))
+			continue;
+
+		if (drv->probe(lte, data) < 0)
+			continue;
+
+		lte->driver = drv;
+		break;
+	}
+
+	DBG("LTE atom created");
+
+	return lte;
+}
+
+int ofono_lte_driver_register(const struct ofono_lte_driver *d)
+{
+	DBG("driver: %p, name: %s", d, d->name);
+
+	if (d->probe == NULL)
+		return -EINVAL;
+
+	g_drivers = g_slist_prepend(g_drivers, (void *) d);
+
+	return 0;
+}
+
+void ofono_lte_driver_unregister(const struct ofono_lte_driver *d)
+{
+	DBG("driver: %p, name: %s", d, d->name);
+
+	g_drivers = g_slist_remove(g_drivers, (void *) d);
+}
+
+static void lte_atom_unregister(struct ofono_atom *atom)
+{
+	DBusConnection *conn = ofono_dbus_get_connection();
+	struct ofono_modem *modem = __ofono_atom_get_modem(atom);
+	const char *path = __ofono_atom_get_path(atom);
+
+	ofono_modem_remove_interface(modem, OFONO_LTE_INTERFACE);
+	g_dbus_unregister_interface(conn, path, OFONO_LTE_INTERFACE);
+}
+
+void ofono_lte_register(struct ofono_lte *lte)
+{
+	DBusConnection *conn = ofono_dbus_get_connection();
+	struct ofono_modem *modem = __ofono_atom_get_modem(lte->atom);
+	const char *path = __ofono_atom_get_path(lte->atom);
+	struct ofono_sim *sim = __ofono_atom_find(OFONO_ATOM_TYPE_SIM, modem);
+	const char *imsi = ofono_sim_get_imsi(sim);
+
+	if (imsi == NULL) {
+		ofono_error("No sim atom required for registering LTE atom.");	
+		return;
+	}
+
+	lte->imsi = g_strdup(imsi);
+
+	lte_load_settings(lte);
+
+	if (!g_dbus_register_interface(conn, path,
+				OFONO_LTE_INTERFACE,
+				lte_methods, lte_signals, NULL,
+				lte, NULL)) {
+		ofono_error("Could not create %s interface",
+				OFONO_LTE_INTERFACE);
+		return;
+	}
+
+	ofono_modem_add_interface(modem, OFONO_LTE_INTERFACE);
+
+	__ofono_atom_register(lte->atom, lte_atom_unregister);
+}
+
+void ofono_lte_remove(struct ofono_lte *lte)
+{
+	__ofono_atom_free(lte->atom);
+}
+
+void ofono_lte_set_data(struct ofono_lte *lte, void *data)
+{
+	lte->driver_data = data;
+}
+
+void *ofono_lte_get_data(struct ofono_lte *lte)
+{
+	return lte->driver_data;
+}
Signature · 1 line
2.7.4
#6 lore raw

Re: [PATCH 3/9] lte: add implementation for LTE atom

Hi Dragos,

Quoted 82 lines · Dragos Tatulea

This implementation can only get/set the default APN setting. But anything expected for this atom is there:
* D-Bus interface
* sync-ing settings to/from file
* interaction with driver

---
  src/lte.c | 341 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1 file changed, 341 insertions(+)

create mode 100644 src/lte.c

src/lte.c new file +66 -0
new file mode 100644
index 0000000..cde0496
@@ -0,0 +1,341 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2016  Endocode AG. All rights reserved.
+ *
+ *  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 <string.h>
+#include <errno.h>
+
+#include <glib.h>
+#include <gdbus.h>
+
+#include "ofono.h"
+
+#include "common.h"
+#include "log.h"
+#include "gprs-context.h"
+#include "storage.h"
+
+#include "lte.h"
+
+#define SETTINGS_STORE "lte"
+#define SETTINGS_GROUP "Settings"
+
+struct ofono_lte {
+	const struct ofono_lte_driver *driver;
+	void *driver_data;
+	struct ofono_atom *atom;
+	char *imsi;
+	GKeyFile *settings;
+	struct ofono_lte_context_config config;
+};
+
+static GSList *g_drivers = NULL;
+
+static void lte_load_settings(struct ofono_lte *lte)
+{
+	char *apn;
+
+	if (lte->imsi == NULL)
+		return;
+
+	lte->settings = storage_open(lte->imsi, SETTINGS_STORE);
+
+	if (lte->settings == NULL) {
+		ofono_error("LTE: Can't open settings file, "
+				"changes won't be persistent");

src/lte.c line 76

Quoted 10 lines
src/lte.c new file +10 -0
+		return;
+	}
+
+	apn = g_key_file_get_string(lte->settings, SETTINGS_GROUP ,
+					"DefaultAPN", NULL);
+	if (apn) {
+		strcpy(lte->config.apn, apn);
+
+		if (lte->driver)
+			lte->driver->config(lte, &lte->config, NULL, NULL);

We should only register the atom after restoring the settings succeeds.
radio-settings.c is a good example of this.

Quoted 19 lines
src/lte.c new file +19 -0
+	}
+}
+
+static void append_lte_properties(struct ofono_lte *lte,
+					DBusMessageIter *dict)
+{
+	const char *apn = lte->config.apn;
+
+	ofono_dbus_dict_append(dict, "DefaultAPN", DBUS_TYPE_STRING, &apn);
+}
+
+static DBusMessage *lte_get_properties(DBusConnection *conn,
+					DBusMessage *msg, void *data)
+{
+	struct ofono_lte *lte = data;
+	DBusMessage *reply;
+	DBusMessageIter iter;
+	DBusMessageIter dict;
+

src/lte.c line 105

Quoted 10 lines
src/lte.c new file +10 -0
+	reply = dbus_message_new_method_return(msg);
+	if (reply == NULL)
+		return NULL;
+
+	dbus_message_iter_init_append(reply, &iter);
+
+	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+					OFONO_PROPERTIES_ARRAY_SIGNATURE,
+					&dict);
+	append_lte_properties(lte, &dict);

Why bother with this function? Can't we just append the properties here?

Quoted 30 lines
src/lte.c new file +30 -0
+	dbus_message_iter_close_container(&iter, &dict);
+
+	return reply;
+}
+
+static DBusMessage *lte_set_default_apn(struct ofono_lte *lte,
+				DBusConnection *conn, DBusMessage *msg,
+				const char *apn)
+{
+	const char *path = __ofono_atom_get_path(lte->atom);
+
+	if (strlen(apn) > OFONO_GPRS_MAX_APN_LENGTH)
+		return __ofono_error_invalid_format(msg);
+
+	if (g_str_equal(apn, lte->config.apn))
+		return dbus_message_new_method_return(msg);
+
+	/* We do care about empty value: it can be used for reset. */
+	if (is_valid_apn(apn) == FALSE && apn[0] != '\0')
+		return __ofono_error_invalid_format(msg);
+
+	strcpy(lte->config.apn, apn);
+
+	if (lte->settings) {
+		if (strlen(apn) == 0)
+			/* Clear entry on empty APN. */
+			g_key_file_remove_key(lte->settings, SETTINGS_GROUP,
+						"DefaultAPN", NULL);
+		else
+			g_key_file_set_string(lte->settings, SETTINGS_GROUP,

src/lte.c line 145

Quoted 10 lines
src/lte.c new file +10 -0
+						"DefaultAPN", lte->config.apn);
+
+		storage_sync(lte->imsi, SETTINGS_STORE, lte->settings);
+	}
+
+	if (lte->driver)
+		lte->driver->config(lte, &lte->config, NULL, NULL);
+
+	if (msg)
+		g_dbus_send_reply(conn, msg, DBUS_TYPE_INVALID);

This setup is a bit unusual from the rest of oFono design where we reply to the message & update settings from within the driver callback. e.g. look at cbs.c and how it sets "Topics".

Quoted 24 lines
src/lte.c new file +24 -0
+
+	ofono_dbus_signal_property_changed(conn, path,
+					OFONO_CONNECTION_CONTEXT_INTERFACE,
+					"DefaultAPN",
+					DBUS_TYPE_STRING, &apn);
+
+	return NULL;
+
+}
+
+static DBusMessage *lte_set_property(DBusConnection *conn,
+					DBusMessage *msg, void *data)
+{
+	struct ofono_lte *lte = data;
+	DBusMessageIter iter;
+	DBusMessageIter var;
+	const char *property;
+	const char *str;
+
+	if (!dbus_message_iter_init(msg, &iter))
+		return __ofono_error_invalid_args(msg);
+
+	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+		return __ofono_error_invalid_args(msg);

src/lte.c line 179

Quoted 10 lines
src/lte.c new file +10 -0
+
+	dbus_message_iter_get_basic(&iter, &property);
+	dbus_message_iter_next(&iter);
+
+	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
+		return __ofono_error_invalid_args(msg);
+
+	dbus_message_iter_recurse(&iter, &var);
+
+

no double empty lines please

src/lte.c line 189

Quoted 10 lines
src/lte.c new file +10 -0
+	if (!strcmp(property, "DefaultAPN")) {
+		if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_STRING)
+			return __ofono_error_invalid_args(msg);
+
+		dbus_message_iter_get_basic(&var, &str);
+
+		return lte_set_default_apn(lte, conn, msg, str);
+	}
+
+

as above

Quoted 33 lines
src/lte.c new file +33 -0
+	return __ofono_error_invalid_args(msg);
+}
+
+static const GDBusMethodTable lte_methods[] = {
+	{ GDBUS_METHOD("GetProperties",
+			NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
+			lte_get_properties) },
+	{ GDBUS_ASYNC_METHOD("SetProperty",
+			GDBUS_ARGS({ "property", "s" }, { "value", "v" }),
+			NULL, lte_set_property) },
+	{ }
+};
+
+static const GDBusSignalTable lte_signals[] = {
+	{ GDBUS_SIGNAL("PropertyChanged",
+			GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
+	{ }
+};
+
+static void lte_atom_remove(struct ofono_atom *atom)
+{
+	struct ofono_lte *lte = __ofono_atom_get_data(atom);
+
+	DBG("atom: %p", atom);
+
+	if (lte == NULL)
+		return;
+
+	if (lte->settings) {
+		storage_close(lte->imsi, SETTINGS_STORE, lte->settings, TRUE);
+
+		g_free(lte->imsi);
+		lte->imsi = NULL;

src/lte.c line 232

Quoted 10 lines
src/lte.c new file +10 -0
+		lte->settings = NULL;
+	}
+
+	if (lte->driver && lte->driver->remove)
+		lte->driver->remove(lte);
+
+	g_free(lte);
+}
+
+

Double empty line ;)

Quoted 100 lines
src/lte.c new file +99 -0
+struct ofono_lte *ofono_lte_create(struct ofono_modem *modem,
+					const char *driver, void *data)
+{
+	struct ofono_lte *lte;
+	GSList *l;
+
+	if (driver == NULL)
+		return NULL;
+
+	lte = g_try_new0(struct ofono_lte, 1);
+
+	if (lte == NULL)
+		return NULL;
+
+	lte->atom = __ofono_modem_add_atom(modem, OFONO_ATOM_TYPE_LTE,
+						lte_atom_remove, lte);
+
+	for (l = g_drivers; l; l = l->next) {
+		const struct ofono_lte_driver *drv = l->data;
+
+		if (g_strcmp0(drv->name, driver))
+			continue;
+
+		if (drv->probe(lte, data) < 0)
+			continue;
+
+		lte->driver = drv;
+		break;
+	}
+
+	DBG("LTE atom created");
+
+	return lte;
+}
+
+int ofono_lte_driver_register(const struct ofono_lte_driver *d)
+{
+	DBG("driver: %p, name: %s", d, d->name);
+
+	if (d->probe == NULL)
+		return -EINVAL;
+
+	g_drivers = g_slist_prepend(g_drivers, (void *) d);
+
+	return 0;
+}
+
+void ofono_lte_driver_unregister(const struct ofono_lte_driver *d)
+{
+	DBG("driver: %p, name: %s", d, d->name);
+
+	g_drivers = g_slist_remove(g_drivers, (void *) d);
+}
+
+static void lte_atom_unregister(struct ofono_atom *atom)
+{
+	DBusConnection *conn = ofono_dbus_get_connection();
+	struct ofono_modem *modem = __ofono_atom_get_modem(atom);
+	const char *path = __ofono_atom_get_path(atom);
+
+	ofono_modem_remove_interface(modem, OFONO_LTE_INTERFACE);
+	g_dbus_unregister_interface(conn, path, OFONO_LTE_INTERFACE);
+}
+
+void ofono_lte_register(struct ofono_lte *lte)
+{
+	DBusConnection *conn = ofono_dbus_get_connection();
+	struct ofono_modem *modem = __ofono_atom_get_modem(lte->atom);
+	const char *path = __ofono_atom_get_path(lte->atom);
+	struct ofono_sim *sim = __ofono_atom_find(OFONO_ATOM_TYPE_SIM, modem);
+	const char *imsi = ofono_sim_get_imsi(sim);
+
+	if (imsi == NULL) {
+		ofono_error("No sim atom required for registering LTE atom.");	
+		return;
+	}
+
+	lte->imsi = g_strdup(imsi);
+
+	lte_load_settings(lte);
+
+	if (!g_dbus_register_interface(conn, path,
+				OFONO_LTE_INTERFACE,
+				lte_methods, lte_signals, NULL,
+				lte, NULL)) {
+		ofono_error("Could not create %s interface",
+				OFONO_LTE_INTERFACE);
+		return;
+	}
+
+	ofono_modem_add_interface(modem, OFONO_LTE_INTERFACE);
+
+	__ofono_atom_register(lte->atom, lte_atom_unregister);
+}
+
+void ofono_lte_remove(struct ofono_lte *lte)
+{
+	__ofono_atom_free(lte->atom);
+}

src/lte.c line 341

Quoted 10 lines
src/lte.c new file +10 -0
+
+void ofono_lte_set_data(struct ofono_lte *lte, void *data)
+{
+	lte->driver_data = data;
+}
+
+void *ofono_lte_get_data(struct ofono_lte *lte)
+{
+	return lte->driver_data;
+}

Regards,
-Denis

#7 lore raw

PATCH 4/9 build: add lte atom support

In reply to Dragos Tatulea
---
 Makefile.am | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Makefile.am +2 -2
index acd5083..9d22365 100644
@@ -22,7 +22,7 @@ pkginclude_HEADERS = include/log.h include/plugin.h include/history.h \
 			include/private-network.h include/cdma-netreg.h \
 			include/cdma-provision.h include/handsfree.h \
 			include/handsfree-audio.h include/siri.h \
-			include/netmon.h
+			include/netmon.h include/lte.h
 
 nodist_pkginclude_HEADERS = include/version.h
 
@@ -605,7 +605,7 @@ src_ofonod_SOURCES = $(builtin_sources) $(gatchat_sources) src/ofono.ver \
 			src/cdma-provision.c src/handsfree.c \
 			src/handsfree-audio.c src/bluetooth.h \
 			src/hfp.h src/siri.c \
-			src/netmon.c
+			src/netmon.c src/lte.c
 
 src_ofonod_LDADD = gdbus/libgdbus-internal.la $(builtin_libadd) \
 			@GLIB_LIBS@ @DBUS_LIBS@ -ldl
Signature · 1 line
2.7.4
#8 lore raw

PATCH 5/9 test: add script for setting lte atom properties

In reply to Dragos Tatulea
---
 test/set-lte-property | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100755 test/set-lte-property
test/set-lte-property new file +25 -0
new file mode 100755
index 0000000..aaf726e
@@ -0,0 +1,25 @@
+#!/usr/bin/python3
+
+import dbus
+import sys
+
+bus = dbus.SystemBus()
+
+if len(sys.argv) == 4:
+	path = sys.argv[1]
+	name = sys.argv[2]
+	value = sys.argv[3]
+elif len(sys.argv) == 3:
+	manager = dbus.Interface(bus.get_object('org.ofono', '/'),
+					'org.ofono.Manager')
+	modems = manager.GetModems()
+	path = modems[0][0]
+	name = sys.argv[1]
+	value = sys.argv[2]
+else:
+	print("%s [PATH] name value" % (sys.argv[0]))
+	sys.exit(0)
+
+print("Setting {} as {} for modem {}..." .format(name, value, path))
+lte = dbus.Interface(bus.get_object('org.ofono', path), 'org.ofono.LTE')
+lte.SetProperty(name, value)
Signature · 1 line
2.7.4
#9 lore raw

PATCH 6/9 doc: add lte atom documentation

In reply to Dragos Tatulea
---
 doc/lte-api.txt | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 doc/lte-api.txt
doc/lte-api.txt new file +35 -0
new file mode 100644
index 0000000..dfefaf4
@@ -0,0 +1,35 @@
+LTE Hierarchy
+
+Service		org.ofono
+Interface	org.ofono.LTE
+Object path	[variable prefix]/{modem0,modem1,...}
+
+
+Methods		dict GetProperties()
+
+			Returns all LTE configuration properties.
+
+		void SetProperty(string property, variant value)
+
+			Changes the value of the specified property. Only
+			properties that are listed as readwrite are
+			changeable. On success a PropertyChanged signal
+			will be emitted.
+
+			Possible Errors: [service].Error.InProgress
+					 [service].Error.InvalidArguments
+					 [service].Error.Failed
+
+Signals		PropertyChanged(string property, variant value)
+
+			This signal indicates a changed value of the given
+			property.
+
+Properties	string DefaultAPN [readwrite]
+
+			On LTE, contexts activate automatically. This property
+			allows selection of an APN to be used on next
+			automatic activation.
+
+			Setting this property to an empty string clears the
+			default APN from the modem.
Signature · 1 line
2.7.4
#10 lore raw

Re: [PATCH 6/9] doc: add lte atom documentation

Hi Dragos,

Quoted 11 lines · Dragos Tatulea
---
  doc/lte-api.txt | 35 +++++++++++++++++++++++++++++++++++
  1 file changed, 35 insertions(+)

create mode 100644 doc/lte-api.txt

doc/lte-api.txt new file +0 -0
new file mode 100644
index 0000000..dfefaf4

doc/lte-api.txt line 4

Quoted 4 lines
doc/lte-api.txt new file +4 -0
@@ -0,0 +1,35 @@
+LTE Hierarchy
+
+Service		org.ofono
+Interface	org.ofono.LTE

So oFono tries not to use abbreviations in its API. How about we simply name this LongTermEvolution

Quoted 14 lines
doc/lte-api.txt new file +14 -0
+Object path	[variable prefix]/{modem0,modem1,...}
+
+
+Methods		dict GetProperties()
+
+			Returns all LTE configuration properties.
+
+		void SetProperty(string property, variant value)
+
+			Changes the value of the specified property. Only
+			properties that are listed as readwrite are
+			changeable. On success a PropertyChanged signal
+			will be emitted.
+

doc/lte-api.txt line 28

Quoted 10 lines
doc/lte-api.txt new file +10 -0
+			Possible Errors: [service].Error.InProgress
+					 [service].Error.InvalidArguments
+					 [service].Error.Failed
+
+Signals		PropertyChanged(string property, variant value)
+
+			This signal indicates a changed value of the given
+			property.
+
+Properties	string DefaultAPN [readwrite]

To be consistent with ConnectionContext, which spells out APN as 'AccessPointName', we do something like DefaultAccessPointName

doc/lte-api.txt line 35

Quoted 8 lines
doc/lte-api.txt new file +7 -0
+
+			On LTE, contexts activate automatically. This property
+			allows selection of an APN to be used on next
+			automatic activation.
+
+			Setting this property to an empty string clears the
+			default APN from the modem.

Why do you have the protocol in Patch 1? Do you want to include this here ?

Regards,
-Denis

#11 lore raw

PATCH 7/9 ubloxmodem: add lte atom driver

In reply to Dragos Tatulea

Adds U-Blox Toby L2 driver for setting the default APN via the +UCGDFLT command. Currently only IPv4 is supported. APN is not stored to modem's non-volatile memory. oFono will manage this default APN via it's config storage.

When receiving an empty default APN, the value is reset.

---
 drivers/ubloxmodem/lte.c        | 125 ++++++++++++++++++++++++++++++++++++++++
 drivers/ubloxmodem/ubloxmodem.c |   3 +
 drivers/ubloxmodem/ubloxmodem.h |   5 ++
 3 files changed, 133 insertions(+)
 create mode 100644 drivers/ubloxmodem/lte.c
drivers/ubloxmodem/lte.c new file +125 -0
new file mode 100644
index 0000000..8210329
@@ -0,0 +1,125 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2016  Endocode AG. All rights reserved.
+ *
+ *  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
+
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include <ofono/modem.h>
+#include <ofono/gprs-context.h>
+#include <ofono/log.h>
+#include <ofono/lte.h>
+
+#include "gatchat.h"
+#include "gatresult.h"
+
+#include "ubloxmodem.h"
+
+struct lte_driver_data {
+	GAtChat *chat;
+};
+
+static int ublox_lte_config(struct ofono_lte *lte,
+		struct ofono_lte_context_config *config,
+		ofono_lte_cb_t cb, void *data)
+{
+	struct lte_driver_data *ldd = ofono_lte_get_data(lte);
+	char buf[32 + OFONO_GPRS_MAX_APN_LENGTH + 1];
+
+	DBG("LTE config with APN: %s", config->apn);
+
+	if (strlen(config->apn) > 0)
+		snprintf(buf, sizeof(buf), "AT+UCGDFLT=0,\"IP\",\"%s\"", config->apn);
+	else
+		snprintf(buf, sizeof(buf), "AT+UCGDFLT=0");
+
+	/* We can't do much in case of failure so don't check response. */
+	g_at_chat_send(ldd->chat, buf, NULL, NULL, NULL, NULL);
+
+	return 0;
+}
+
+static gboolean lte_delayed_register(gpointer user_data)
+{
+	struct ofono_lte *lte = user_data;
+
+	ofono_lte_register(lte);
+
+	return FALSE;
+}
+
+static int ublox_lte_probe(struct ofono_lte *lte, void *data)
+{
+	GAtChat *chat = data;
+	struct lte_driver_data *ldd;
+
+	DBG("ublox lte probe");
+
+	ldd = g_try_new0(struct lte_driver_data, 1);
+	if (!ldd) {
+		return -ENOMEM;
+	}
+
+	ldd->chat = g_at_chat_clone(chat);
+
+	ofono_lte_set_data(lte, ldd);
+
+	g_idle_add(lte_delayed_register, lte);
+
+	return 0;
+}
+
+static void ublox_lte_remove(struct ofono_lte *lte)
+{
+	struct lte_driver_data *ldd = ofono_lte_get_data(lte);
+
+	DBG("ublox lte remove");
+
+	g_at_chat_unref(ldd->chat);
+
+	ofono_lte_set_data(lte, NULL);
+
+	g_free(ldd);
+}
+
+static struct ofono_lte_driver driver = {
+	.name			= UBLOXMODEM,
+	.probe			= ublox_lte_probe,
+	.remove			= ublox_lte_remove,
+	.config			= ublox_lte_config,
+};
+
+void ublox_lte_init(void)
+{
+	ofono_lte_driver_register(&driver);
+}
+
+void ublox_lte_exit(void)
+{
+	ofono_lte_driver_unregister(&driver);
+}
drivers/ubloxmodem/ubloxmodem.c +3 -0
index 7fc671e..93cb928 100644
@@ -29,12 +29,14 @@
 #define OFONO_API_SUBJECT_TO_CHANGE
 #include <ofono/plugin.h>
 #include <ofono/types.h>
+#include <ofono/modem.h>
 
 #include "ubloxmodem.h"
 
 static int ubloxmodem_init(void)
 {
 	ublox_gprs_context_init();
+	ublox_lte_init();
 
 	return 0;
 }
@@ -42,6 +44,7 @@ static int ubloxmodem_init(void)
 static void ubloxmodem_exit(void)
 {
 	ublox_gprs_context_exit();
+	ublox_lte_exit();
 }
 
 OFONO_PLUGIN_DEFINE(ubloxmodem, "U-Blox Toby L2 high speed modem driver",
drivers/ubloxmodem/ubloxmodem.h +5 -0
index 0c8a621..cf66412 100644
@@ -21,5 +21,10 @@
 
 #include <drivers/atmodem/atutil.h>
 
+#define UBLOXMODEM "ubloxmodem"
+
 extern void ublox_gprs_context_init(void);
 extern void ublox_gprs_context_exit(void);
+
+extern void ublox_lte_init(void);
+extern void ublox_lte_exit(void);
Signature · 1 line
2.7.4
#12 lore raw

Re: [PATCH 7/9] ubloxmodem: add lte atom driver

Hi Dragos,

Quoted 71 lines · Dragos Tatulea

Adds U-Blox Toby L2 driver for setting the default APN via the +UCGDFLT command. Currently only IPv4 is supported. APN is not stored to modem's non-volatile memory. oFono will manage this default APN via it's config storage.

When receiving an empty default APN, the value is reset.

---
  drivers/ubloxmodem/lte.c        | 125 ++++++++++++++++++++++++++++++++++++++++
  drivers/ubloxmodem/ubloxmodem.c |   3 +
  drivers/ubloxmodem/ubloxmodem.h |   5 ++
  3 files changed, 133 insertions(+)

create mode 100644 drivers/ubloxmodem/lte.c

drivers/ubloxmodem/lte.c new file +52 -0
new file mode 100644
index 0000000..8210329
@@ -0,0 +1,125 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2016  Endocode AG. All rights reserved.
+ *
+ *  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
+
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include <ofono/modem.h>
+#include <ofono/gprs-context.h>
+#include <ofono/log.h>
+#include <ofono/lte.h>
+
+#include "gatchat.h"
+#include "gatresult.h"
+
+#include "ubloxmodem.h"
+
+struct lte_driver_data {
+	GAtChat *chat;
+};
+
+static int ublox_lte_config(struct ofono_lte *lte,
+		struct ofono_lte_context_config *config,
+		ofono_lte_cb_t cb, void *data)
+{
+	struct lte_driver_data *ldd = ofono_lte_get_data(lte);
+	char buf[32 + OFONO_GPRS_MAX_APN_LENGTH + 1];

drivers/ubloxmodem/lte.c line 62

Quoted 10 lines
drivers/ubloxmodem/lte.c new file +10 -0
+
+	DBG("LTE config with APN: %s", config->apn);
+
+	if (strlen(config->apn) > 0)
+		snprintf(buf, sizeof(buf), "AT+UCGDFLT=0,\"IP\",\"%s\"", config->apn);
+	else
+		snprintf(buf, sizeof(buf), "AT+UCGDFLT=0");
+
+	/* We can't do much in case of failure so don't check response. */
+	g_at_chat_send(ldd->chat, buf, NULL, NULL, NULL, NULL);

Core is providing a callback, so you have to do something with it.

Quoted 14 lines
drivers/ubloxmodem/lte.c new file +14 -0
+
+	return 0;
+}
+
+static gboolean lte_delayed_register(gpointer user_data)
+{
+	struct ofono_lte *lte = user_data;
+
+	ofono_lte_register(lte);
+
+	return FALSE;
+}
+
+static int ublox_lte_probe(struct ofono_lte *lte, void *data)

drivers/ubloxmodem/lte.c line 86

Quoted 10 lines
drivers/ubloxmodem/lte.c new file +10 -0
+{
+	GAtChat *chat = data;
+	struct lte_driver_data *ldd;
+
+	DBG("ublox lte probe");
+
+	ldd = g_try_new0(struct lte_driver_data, 1);
+	if (!ldd) {
+		return -ENOMEM;
+	}

No need for {}

Quoted 72 lines
drivers/ubloxmodem/lte.c new file +39 -0
+
+	ldd->chat = g_at_chat_clone(chat);
+
+	ofono_lte_set_data(lte, ldd);
+
+	g_idle_add(lte_delayed_register, lte);
+
+	return 0;
+}
+
+static void ublox_lte_remove(struct ofono_lte *lte)
+{
+	struct lte_driver_data *ldd = ofono_lte_get_data(lte);
+
+	DBG("ublox lte remove");
+
+	g_at_chat_unref(ldd->chat);
+
+	ofono_lte_set_data(lte, NULL);
+
+	g_free(ldd);
+}
+
+static struct ofono_lte_driver driver = {
+	.name			= UBLOXMODEM,
+	.probe			= ublox_lte_probe,
+	.remove			= ublox_lte_remove,
+	.config			= ublox_lte_config,
+};
+
+void ublox_lte_init(void)
+{
+	ofono_lte_driver_register(&driver);
+}
+
+void ublox_lte_exit(void)
+{
+	ofono_lte_driver_unregister(&driver);
+}
drivers/ubloxmodem/ubloxmodem.c +3 -0
index 7fc671e..93cb928 100644
@@ -29,12 +29,14 @@
  #define OFONO_API_SUBJECT_TO_CHANGE
  #include <ofono/plugin.h>
  #include <ofono/types.h>
+#include <ofono/modem.h>
 
  #include "ubloxmodem.h"
 
  static int ubloxmodem_init(void)
  {
  	ublox_gprs_context_init();
+	ublox_lte_init();
 
  	return 0;
  }
@@ -42,6 +44,7 @@ static int ubloxmodem_init(void)
  static void ubloxmodem_exit(void)
  {
  	ublox_gprs_context_exit();
+	ublox_lte_exit();
  }
 
  OFONO_PLUGIN_DEFINE(ubloxmodem, "U-Blox Toby L2 high speed modem driver",
drivers/ubloxmodem/ubloxmodem.h +0 -0
index 0c8a621..cf66412 100644

drivers/ubloxmodem/ubloxmodem.h line 30

Quoted 10 lines
drivers/ubloxmodem/ubloxmodem.h +5 -0
@@ -21,5 +21,10 @@
 
  #include <drivers/atmodem/atutil.h>
 
+#define UBLOXMODEM "ubloxmodem"
+
  extern void ublox_gprs_context_init(void);
  extern void ublox_gprs_context_exit(void);
+
+extern void ublox_lte_init(void);
+extern void ublox_lte_exit(void);

Regards,
-Denis

#13 lore raw

PATCH 8/9 build: add support for ublox lte atom driver

In reply to Dragos Tatulea
---
 Makefile.am | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
Makefile.am +3 -1
index 9d22365..08c7395 100644
@@ -382,7 +382,9 @@ builtin_modules += ubloxmodem
 builtin_sources += drivers/atmodem/atutil.h \
 			drivers/ubloxmodem/ubloxmodem.h \
 			drivers/ubloxmodem/ubloxmodem.c \
-			drivers/ubloxmodem/gprs-context.c
+			drivers/ubloxmodem/gprs-context.c \
+			drivers/ubloxmodem/lte.c
+
 
 
 if PHONESIM
Signature · 1 line
2.7.4
#14 lore raw

PATCH 9/9 plugins: ublox: enable lte driver for tobyl2

In reply to Dragos Tatulea
---
 plugins/ublox.c | 3 +++
 1 file changed, 3 insertions(+)
plugins/ublox.c +3 -0
index 092ba64..6d77df8 100644
@@ -38,6 +38,7 @@
 #include <ofono/sim.h>
 #include <ofono/gprs.h>
 #include <ofono/gprs-context.h>
+#include <ofono/lte.h>
 
 #include <drivers/atmodem/atutil.h>
 #include <drivers/atmodem/vendor.h>
@@ -313,6 +314,8 @@ static void ublox_post_sim(struct ofono_modem *modem)
 
 		--ncontexts;
 	}
+
+	ofono_lte_create(modem, "ubloxmodem", data->aux);
 }
 
 static void ublox_post_online(struct ofono_modem *modem)
Signature · 1 line
2.7.4