RFC: add LTE atom
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
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
@@ -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
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.hinclude/lte.h new file +26
-0@@ -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
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
@@ -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
Denis Kenzior
AppliedRe: [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
PATCH 3/9 lte: add implementation for LTE atom
In reply to Dragos TatuleaThis 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
@@ -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; +}
Signature · 1 line
2.7.4
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.csrc/lte.c new file +66
-0@@ -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, <e->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, <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".
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
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
@@ -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
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
@@ -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
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
@@ -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
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.txtdoc/lte-api.txt new file +0
-0
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
PATCH 7/9 ubloxmodem: add lte atom driver
In reply to Dragos TatuleaAdds 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
@@ -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
@@ -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
@@ -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
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.cdrivers/ubloxmodem/lte.c new file +52
-0@@ -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@@ -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
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
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
@@ -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
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
@@ -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