* [PATCH 0/9] RFC: add LTE atom
@ 2016-11-09 17:43 Dragos Tatulea
2016-11-09 17:43 ` [PATCH 1/9] include: add header file for lte atom Dragos Tatulea
` (8 more replies)
0 siblings, 9 replies; 17+ messages in thread
From: Dragos Tatulea @ 2016-11-09 17:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1769 bytes --]
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
--
2.7.4
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 1/9] include: add header file for lte atom
2016-11-09 17:43 [PATCH 0/9] RFC: add LTE atom Dragos Tatulea
@ 2016-11-09 17:43 ` Dragos Tatulea
2016-11-09 20:19 ` Denis Kenzior
2016-11-09 17:43 ` [PATCH 2/9] src: ofono.h: add LTE atom define Dragos Tatulea
` (7 subsequent siblings)
8 siblings, 1 reply; 17+ messages in thread
From: Dragos Tatulea @ 2016-11-09 17:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 2279 bytes --]
---
include/lte.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 69 insertions(+)
create mode 100644 include/lte.h
diff --git a/include/lte.h b/include/lte.h
new file mode 100644
index 0000000..8d73079
--- /dev/null
+++ b/include/lte.h
@@ -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
--
2.7.4
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 2/9] src: ofono.h: add LTE atom define
2016-11-09 17:43 [PATCH 0/9] RFC: add LTE atom Dragos Tatulea
2016-11-09 17:43 ` [PATCH 1/9] include: add header file for lte atom Dragos Tatulea
@ 2016-11-09 17:43 ` Dragos Tatulea
2016-11-09 20:20 ` Denis Kenzior
2016-11-09 17:43 ` [PATCH 3/9] lte: add implementation for LTE atom Dragos Tatulea
` (6 subsequent siblings)
8 siblings, 1 reply; 17+ messages in thread
From: Dragos Tatulea @ 2016-11-09 17:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 377 bytes --]
---
src/ofono.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/ofono.h b/src/ofono.h
index 5b37a64..1df47d5 100644
--- a/src/ofono.h
+++ b/src/ofono.h
@@ -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 {
--
2.7.4
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 3/9] lte: add implementation for LTE atom
2016-11-09 17:43 [PATCH 0/9] RFC: add LTE atom Dragos Tatulea
2016-11-09 17:43 ` [PATCH 1/9] include: add header file for lte atom Dragos Tatulea
2016-11-09 17:43 ` [PATCH 2/9] src: ofono.h: add LTE atom define Dragos Tatulea
@ 2016-11-09 17:43 ` Dragos Tatulea
2016-11-09 20:37 ` Denis Kenzior
2016-11-09 17:43 ` [PATCH 4/9] build: add lte atom support Dragos Tatulea
` (5 subsequent siblings)
8 siblings, 1 reply; 17+ messages in thread
From: Dragos Tatulea @ 2016-11-09 17:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 9067 bytes --]
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
diff --git a/src/lte.c b/src/lte.c
new file mode 100644
index 0000000..cde0496
--- /dev/null
+++ b/src/lte.c
@@ -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, <e->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, <e->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;
+}
--
2.7.4
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 4/9] build: add lte atom support
2016-11-09 17:43 [PATCH 0/9] RFC: add LTE atom Dragos Tatulea
` (2 preceding siblings ...)
2016-11-09 17:43 ` [PATCH 3/9] lte: add implementation for LTE atom Dragos Tatulea
@ 2016-11-09 17:43 ` Dragos Tatulea
2016-11-09 17:43 ` [PATCH 5/9] test: add script for setting lte atom properties Dragos Tatulea
` (4 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Dragos Tatulea @ 2016-11-09 17:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 925 bytes --]
---
Makefile.am | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index acd5083..9d22365 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -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
--
2.7.4
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 5/9] test: add script for setting lte atom properties
2016-11-09 17:43 [PATCH 0/9] RFC: add LTE atom Dragos Tatulea
` (3 preceding siblings ...)
2016-11-09 17:43 ` [PATCH 4/9] build: add lte atom support Dragos Tatulea
@ 2016-11-09 17:43 ` Dragos Tatulea
2016-11-09 17:43 ` [PATCH 6/9] doc: add lte atom documentation Dragos Tatulea
` (3 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Dragos Tatulea @ 2016-11-09 17:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 965 bytes --]
---
test/set-lte-property | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
create mode 100755 test/set-lte-property
diff --git a/test/set-lte-property b/test/set-lte-property
new file mode 100755
index 0000000..aaf726e
--- /dev/null
+++ b/test/set-lte-property
@@ -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)
--
2.7.4
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 6/9] doc: add lte atom documentation
2016-11-09 17:43 [PATCH 0/9] RFC: add LTE atom Dragos Tatulea
` (4 preceding siblings ...)
2016-11-09 17:43 ` [PATCH 5/9] test: add script for setting lte atom properties Dragos Tatulea
@ 2016-11-09 17:43 ` Dragos Tatulea
2016-11-09 20:41 ` Denis Kenzior
2016-11-09 17:43 ` [PATCH 7/9] ubloxmodem: add lte atom driver Dragos Tatulea
` (2 subsequent siblings)
8 siblings, 1 reply; 17+ messages in thread
From: Dragos Tatulea @ 2016-11-09 17:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1286 bytes --]
---
doc/lte-api.txt | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
create mode 100644 doc/lte-api.txt
diff --git a/doc/lte-api.txt b/doc/lte-api.txt
new file mode 100644
index 0000000..dfefaf4
--- /dev/null
+++ b/doc/lte-api.txt
@@ -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.
--
2.7.4
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 7/9] ubloxmodem: add lte atom driver
2016-11-09 17:43 [PATCH 0/9] RFC: add LTE atom Dragos Tatulea
` (5 preceding siblings ...)
2016-11-09 17:43 ` [PATCH 6/9] doc: add lte atom documentation Dragos Tatulea
@ 2016-11-09 17:43 ` Dragos Tatulea
2016-11-09 20:43 ` Denis Kenzior
2016-11-09 17:43 ` [PATCH 8/9] build: add support for ublox " Dragos Tatulea
2016-11-09 17:43 ` [PATCH 9/9] plugins: ublox: enable lte driver for tobyl2 Dragos Tatulea
8 siblings, 1 reply; 17+ messages in thread
From: Dragos Tatulea @ 2016-11-09 17:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 4877 bytes --]
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
diff --git a/drivers/ubloxmodem/lte.c b/drivers/ubloxmodem/lte.c
new file mode 100644
index 0000000..8210329
--- /dev/null
+++ b/drivers/ubloxmodem/lte.c
@@ -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);
+}
diff --git a/drivers/ubloxmodem/ubloxmodem.c b/drivers/ubloxmodem/ubloxmodem.c
index 7fc671e..93cb928 100644
--- a/drivers/ubloxmodem/ubloxmodem.c
+++ b/drivers/ubloxmodem/ubloxmodem.c
@@ -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",
diff --git a/drivers/ubloxmodem/ubloxmodem.h b/drivers/ubloxmodem/ubloxmodem.h
index 0c8a621..cf66412 100644
--- a/drivers/ubloxmodem/ubloxmodem.h
+++ b/drivers/ubloxmodem/ubloxmodem.h
@@ -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);
--
2.7.4
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 8/9] build: add support for ublox lte atom driver
2016-11-09 17:43 [PATCH 0/9] RFC: add LTE atom Dragos Tatulea
` (6 preceding siblings ...)
2016-11-09 17:43 ` [PATCH 7/9] ubloxmodem: add lte atom driver Dragos Tatulea
@ 2016-11-09 17:43 ` Dragos Tatulea
2016-11-09 17:43 ` [PATCH 9/9] plugins: ublox: enable lte driver for tobyl2 Dragos Tatulea
8 siblings, 0 replies; 17+ messages in thread
From: Dragos Tatulea @ 2016-11-09 17:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 512 bytes --]
---
Makefile.am | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am
index 9d22365..08c7395 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -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
--
2.7.4
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 9/9] plugins: ublox: enable lte driver for tobyl2
2016-11-09 17:43 [PATCH 0/9] RFC: add LTE atom Dragos Tatulea
` (7 preceding siblings ...)
2016-11-09 17:43 ` [PATCH 8/9] build: add support for ublox " Dragos Tatulea
@ 2016-11-09 17:43 ` Dragos Tatulea
8 siblings, 0 replies; 17+ messages in thread
From: Dragos Tatulea @ 2016-11-09 17:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 636 bytes --]
---
plugins/ublox.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/plugins/ublox.c b/plugins/ublox.c
index 092ba64..6d77df8 100644
--- a/plugins/ublox.c
+++ b/plugins/ublox.c
@@ -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)
--
2.7.4
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 1/9] include: add header file for lte atom
2016-11-09 17:43 ` [PATCH 1/9] include: add header file for lte atom Dragos Tatulea
@ 2016-11-09 20:19 ` Denis Kenzior
0 siblings, 0 replies; 17+ messages in thread
From: Denis Kenzior @ 2016-11-09 20:19 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 2719 bytes --]
Hi Dragos,
On 11/09/2016 11:43 AM, Dragos Tatulea wrote:
> ---
> include/lte.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 69 insertions(+)
> create mode 100644 include/lte.h
>
> diff --git a/include/lte.h b/include/lte.h
> new file mode 100644
> index 0000000..8d73079
> --- /dev/null
> +++ b/include/lte.h
> @@ -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;
> +};
Lets name it ofono_lte_default_attach_info
> +
> +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?
> + struct ofono_lte_context_config *config,
const struct ofono_lte...
> + 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
>
Regards,
-Denis
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 2/9] src: ofono.h: add LTE atom define
2016-11-09 17:43 ` [PATCH 2/9] src: ofono.h: add LTE atom define Dragos Tatulea
@ 2016-11-09 20:20 ` Denis Kenzior
0 siblings, 0 replies; 17+ messages in thread
From: Denis Kenzior @ 2016-11-09 20:20 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 172 bytes --]
Hi Dragos,
On 11/09/2016 11:43 AM, Dragos Tatulea wrote:
> ---
> src/ofono.h | 1 +
> 1 file changed, 1 insertion(+)
>
Applied, thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/9] lte: add implementation for LTE atom
2016-11-09 17:43 ` [PATCH 3/9] lte: add implementation for LTE atom Dragos Tatulea
@ 2016-11-09 20:37 ` Denis Kenzior
0 siblings, 0 replies; 17+ messages in thread
From: Denis Kenzior @ 2016-11-09 20:37 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 10325 bytes --]
Hi Dragos,
On 11/09/2016 11:43 AM, Dragos Tatulea wrote:
> 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
>
> diff --git a/src/lte.c b/src/lte.c
> new file mode 100644
> index 0000000..cde0496
> --- /dev/null
> +++ b/src/lte.c
> @@ -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, <e->config, NULL, NULL);
We should only register the atom after restoring the settings succeeds.
radio-settings.c is a good example of this.
> + }
> +}
> +
> +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);
Why bother with this function? Can't we just append the properties here?
> + 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, <e->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".
> +
> + 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);
> +
> +
no double empty lines please
> + 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
> + 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);
> +}
> +
> +
Double empty line ;)
> +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;
> +}
>
Regards,
-Denis
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 6/9] doc: add lte atom documentation
2016-11-09 17:43 ` [PATCH 6/9] doc: add lte atom documentation Dragos Tatulea
@ 2016-11-09 20:41 ` Denis Kenzior
0 siblings, 0 replies; 17+ messages in thread
From: Denis Kenzior @ 2016-11-09 20:41 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1773 bytes --]
Hi Dragos,
On 11/09/2016 11:43 AM, Dragos Tatulea wrote:
> ---
> doc/lte-api.txt | 35 +++++++++++++++++++++++++++++++++++
> 1 file changed, 35 insertions(+)
> create mode 100644 doc/lte-api.txt
>
> diff --git a/doc/lte-api.txt b/doc/lte-api.txt
> new file mode 100644
> index 0000000..dfefaf4
> --- /dev/null
> +++ b/doc/lte-api.txt
> @@ -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
> +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]
To be consistent with ConnectionContext, which spells out APN as
'AccessPointName', we do something like DefaultAccessPointName
> +
> + 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
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 7/9] ubloxmodem: add lte atom driver
2016-11-09 17:43 ` [PATCH 7/9] ubloxmodem: add lte atom driver Dragos Tatulea
@ 2016-11-09 20:43 ` Denis Kenzior
0 siblings, 0 replies; 17+ messages in thread
From: Denis Kenzior @ 2016-11-09 20:43 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 5419 bytes --]
Hi Dragos,
On 11/09/2016 11:43 AM, Dragos Tatulea wrote:
> 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
>
> diff --git a/drivers/ubloxmodem/lte.c b/drivers/ubloxmodem/lte.c
> new file mode 100644
> index 0000000..8210329
> --- /dev/null
> +++ b/drivers/ubloxmodem/lte.c
> @@ -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);
Core is providing a callback, so you have to do something with it.
> +
> + 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;
> + }
No need for {}
> +
> + 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);
> +}
> diff --git a/drivers/ubloxmodem/ubloxmodem.c b/drivers/ubloxmodem/ubloxmodem.c
> index 7fc671e..93cb928 100644
> --- a/drivers/ubloxmodem/ubloxmodem.c
> +++ b/drivers/ubloxmodem/ubloxmodem.c
> @@ -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",
> diff --git a/drivers/ubloxmodem/ubloxmodem.h b/drivers/ubloxmodem/ubloxmodem.h
> index 0c8a621..cf66412 100644
> --- a/drivers/ubloxmodem/ubloxmodem.h
> +++ b/drivers/ubloxmodem/ubloxmodem.h
> @@ -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
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 7/9] ubloxmodem: add lte atom driver
2016-11-10 16:55 ` [PATCH 7/9] ubloxmodem: add lte atom driver Dragos Tatulea
@ 2016-11-11 16:58 ` Denis Kenzior
0 siblings, 0 replies; 17+ messages in thread
From: Denis Kenzior @ 2016-11-11 16:58 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 6602 bytes --]
Hi Dragos,
On 11/10/2016 10:55 AM, Dragos Tatulea wrote:
> 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 | 154 ++++++++++++++++++++++++++++++++++++++++
> drivers/ubloxmodem/ubloxmodem.c | 3 +
> drivers/ubloxmodem/ubloxmodem.h | 5 ++
> 3 files changed, 162 insertions(+)
> create mode 100644 drivers/ubloxmodem/lte.c
>
> diff --git a/drivers/ubloxmodem/lte.c b/drivers/ubloxmodem/lte.c
> new file mode 100644
> index 0000000..43c02d4
> --- /dev/null
> +++ b/drivers/ubloxmodem/lte.c
> @@ -0,0 +1,154 @@
> +/*
> + *
> + * 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"
> +
> +static const char *ucgdflt_prefix[] = { "+UCGDFLT:", NULL };
> +
> +struct lte_driver_data {
> + GAtChat *chat;
> +};
> +
> +static void ucgdflt_cb(gboolean ok, GAtResult *result, gpointer user_data)
> +{
> + struct cb_data *cbd = user_data;
> + ofono_lte_cb_t cb = cbd->cb;
> +
> + DBG("ok %d", ok);
> +
> + if (!ok) {
> + struct ofono_error error;
> +
> + decode_at_error(&error, g_at_result_final_response(result));
> + cb(&error, cbd->data);
decode_at_error works for OK responses as well, so there's no need for
this if-else statement.
> + } else {
> + CALLBACK_WITH_SUCCESS(cb, cbd->data);
> + }
> +
> + g_free(cbd);
This should not be necessary either. See below.
> +
> + return;
?? this return is pointless
> +}
> +
> +static int ublox_lte_set_default_attach_info(const struct ofono_lte *lte,
> + struct ofono_lte_default_attach_info *info,
> + 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];
> + struct cb_data *cbd = cb_data_new(cb, data);
> +
> + DBG("LTE config with APN: %s", info->apn);
> +
> + if (strlen(info->apn) > 0)
> + snprintf(buf, sizeof(buf), "AT+UCGDFLT=0,\"IP\",\"%s\"",
> + info->apn);
> + else
> + snprintf(buf, sizeof(buf), "AT+UCGDFLT=0");
> +
> + /* We can't do much in case of failure so don't check response. */
> + if (g_at_chat_send(ldd->chat, buf, ucgdflt_prefix,
> + ucgdflt_cb, cbd, NULL) == 0) {
You should be setting the last argument (e.g. GDestroyNotify) as g_free
to avoid memory leaks.
> + g_free(cbd);
> + CALLBACK_WITH_FAILURE(cb, data);
> + }
This is far easier to write as:
if (g_at_chat_send(....) > 0)
return;
CALLBACK_WITH_FAILURE();
> +
> + return 0;
Only probe() can return error values. All other methods should return
void. I pushed a fix to include/lte.h to reflect this.
> +}
> +
> +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,
> + .set_default_attach_info = ublox_lte_set_default_attach_info,
> +};
> +
> +void ublox_lte_init(void)
> +{
> + ofono_lte_driver_register(&driver);
> +}
> +
> +void ublox_lte_exit(void)
> +{
> + ofono_lte_driver_unregister(&driver);
> +}
> diff --git a/drivers/ubloxmodem/ubloxmodem.c b/drivers/ubloxmodem/ubloxmodem.c
> index 7fc671e..93cb928 100644
> --- a/drivers/ubloxmodem/ubloxmodem.c
> +++ b/drivers/ubloxmodem/ubloxmodem.c
> @@ -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",
> diff --git a/drivers/ubloxmodem/ubloxmodem.h b/drivers/ubloxmodem/ubloxmodem.h
> index 0c8a621..cf66412 100644
> --- a/drivers/ubloxmodem/ubloxmodem.h
> +++ b/drivers/ubloxmodem/ubloxmodem.h
> @@ -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
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 7/9] ubloxmodem: add lte atom driver
2016-11-10 16:55 [PATCH v2 0/9] add LTE atom Dragos Tatulea
@ 2016-11-10 16:55 ` Dragos Tatulea
2016-11-11 16:58 ` Denis Kenzior
0 siblings, 1 reply; 17+ messages in thread
From: Dragos Tatulea @ 2016-11-10 16:55 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 5561 bytes --]
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 | 154 ++++++++++++++++++++++++++++++++++++++++
drivers/ubloxmodem/ubloxmodem.c | 3 +
drivers/ubloxmodem/ubloxmodem.h | 5 ++
3 files changed, 162 insertions(+)
create mode 100644 drivers/ubloxmodem/lte.c
diff --git a/drivers/ubloxmodem/lte.c b/drivers/ubloxmodem/lte.c
new file mode 100644
index 0000000..43c02d4
--- /dev/null
+++ b/drivers/ubloxmodem/lte.c
@@ -0,0 +1,154 @@
+/*
+ *
+ * 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"
+
+static const char *ucgdflt_prefix[] = { "+UCGDFLT:", NULL };
+
+struct lte_driver_data {
+ GAtChat *chat;
+};
+
+static void ucgdflt_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_lte_cb_t cb = cbd->cb;
+
+ DBG("ok %d", ok);
+
+ if (!ok) {
+ struct ofono_error error;
+
+ decode_at_error(&error, g_at_result_final_response(result));
+ cb(&error, cbd->data);
+ } else {
+ CALLBACK_WITH_SUCCESS(cb, cbd->data);
+ }
+
+ g_free(cbd);
+
+ return;
+}
+
+static int ublox_lte_set_default_attach_info(const struct ofono_lte *lte,
+ struct ofono_lte_default_attach_info *info,
+ 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];
+ struct cb_data *cbd = cb_data_new(cb, data);
+
+ DBG("LTE config with APN: %s", info->apn);
+
+ if (strlen(info->apn) > 0)
+ snprintf(buf, sizeof(buf), "AT+UCGDFLT=0,\"IP\",\"%s\"",
+ info->apn);
+ else
+ snprintf(buf, sizeof(buf), "AT+UCGDFLT=0");
+
+ /* We can't do much in case of failure so don't check response. */
+ if (g_at_chat_send(ldd->chat, buf, ucgdflt_prefix,
+ ucgdflt_cb, cbd, NULL) == 0) {
+ g_free(cbd);
+ CALLBACK_WITH_FAILURE(cb, data);
+ }
+
+ 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,
+ .set_default_attach_info = ublox_lte_set_default_attach_info,
+};
+
+void ublox_lte_init(void)
+{
+ ofono_lte_driver_register(&driver);
+}
+
+void ublox_lte_exit(void)
+{
+ ofono_lte_driver_unregister(&driver);
+}
diff --git a/drivers/ubloxmodem/ubloxmodem.c b/drivers/ubloxmodem/ubloxmodem.c
index 7fc671e..93cb928 100644
--- a/drivers/ubloxmodem/ubloxmodem.c
+++ b/drivers/ubloxmodem/ubloxmodem.c
@@ -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",
diff --git a/drivers/ubloxmodem/ubloxmodem.h b/drivers/ubloxmodem/ubloxmodem.h
index 0c8a621..cf66412 100644
--- a/drivers/ubloxmodem/ubloxmodem.h
+++ b/drivers/ubloxmodem/ubloxmodem.h
@@ -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);
--
2.7.4
^ permalink raw reply related [flat|nested] 17+ messages in thread
end of thread, other threads:[~2016-11-11 16:58 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-09 17:43 [PATCH 0/9] RFC: add LTE atom Dragos Tatulea
2016-11-09 17:43 ` [PATCH 1/9] include: add header file for lte atom Dragos Tatulea
2016-11-09 20:19 ` Denis Kenzior
2016-11-09 17:43 ` [PATCH 2/9] src: ofono.h: add LTE atom define Dragos Tatulea
2016-11-09 20:20 ` Denis Kenzior
2016-11-09 17:43 ` [PATCH 3/9] lte: add implementation for LTE atom Dragos Tatulea
2016-11-09 20:37 ` Denis Kenzior
2016-11-09 17:43 ` [PATCH 4/9] build: add lte atom support Dragos Tatulea
2016-11-09 17:43 ` [PATCH 5/9] test: add script for setting lte atom properties Dragos Tatulea
2016-11-09 17:43 ` [PATCH 6/9] doc: add lte atom documentation Dragos Tatulea
2016-11-09 20:41 ` Denis Kenzior
2016-11-09 17:43 ` [PATCH 7/9] ubloxmodem: add lte atom driver Dragos Tatulea
2016-11-09 20:43 ` Denis Kenzior
2016-11-09 17:43 ` [PATCH 8/9] build: add support for ublox " Dragos Tatulea
2016-11-09 17:43 ` [PATCH 9/9] plugins: ublox: enable lte driver for tobyl2 Dragos Tatulea
2016-11-10 16:55 [PATCH v2 0/9] add LTE atom Dragos Tatulea
2016-11-10 16:55 ` [PATCH 7/9] ubloxmodem: add lte atom driver Dragos Tatulea
2016-11-11 16:58 ` Denis Kenzior
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.