From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [PATCH 2/7] extended support for LTE and NR. Some minor fixes. part 2 of 7
Date: Wed, 19 Sep 2018 10:04:37 -0500 [thread overview]
Message-ID: <e56297a0-e44e-d9d2-5fef-b5d60c773a60@gmail.com> (raw)
In-Reply-To: <1537335453-21498-2-git-send-email-gciofono@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 20795 bytes --]
Hi Giacinto,
On 09/19/2018 12:37 AM, Giacinto Cifelli wrote:
> ---
> src/gprs.c | 13 ++-
> src/lte.c | 372 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
> src/main.c | 5 -
> 3 files changed, 341 insertions(+), 49 deletions(-)
So you seem to have 3 completely unrelated things going on here... At
the very minimum this should be 3 commits.
Also, you're adding LTE D-Bus implementation without updating or
proposing changes to doc/lte-api.txt.
>
> diff --git a/src/gprs.c b/src/gprs.c
> index 377eced..40f43e3 100644
> --- a/src/gprs.c
> +++ b/src/gprs.c
> @@ -261,6 +261,10 @@ static const char *gprs_auth_method_to_string(enum ofono_gprs_auth_method auth)
> return "chap";
> case OFONO_GPRS_AUTH_METHOD_PAP:
> return "pap";
> + case OFONO_GPRS_AUTH_METHOD_NONE:
> + return "none";
> + default:
> + return NULL;
> };
Okay, but this patch likely needs to also ensure that username /
password are not settable if method is NONE. And follow up with an
update of all things that depend on OFONO_GPRS_AUTH_METHOD usage. E.g.
drivers, provisioning plugins, etc.
>
> return NULL;
> @@ -275,6 +279,9 @@ static gboolean gprs_auth_method_from_string(const char *str,
> } else if (g_str_equal(str, "pap")) {
> *auth = OFONO_GPRS_AUTH_METHOD_PAP;
> return TRUE;
> + } else if (g_str_equal(str, "none")) {
> + *auth = OFONO_GPRS_AUTH_METHOD_NONE;
> + return TRUE;
> }
>
> return FALSE;
> @@ -1008,7 +1015,7 @@ static void pri_read_settings_callback(const struct ofono_error *error,
>
> value = pri_ctx->active;
>
> - gprs->flags &= !GPRS_FLAG_ATTACHING;
> + gprs->flags &= ~GPRS_FLAG_ATTACHING;
Okay, but this is a separate fix and should be documented properly.
>
> gprs->driver_attached = TRUE;
> gprs_set_attached_property(gprs, TRUE);
> @@ -1635,6 +1642,9 @@ static void release_active_contexts(struct ofono_gprs *gprs)
>
> if (gc->driver->detach_shutdown != NULL)
> gc->driver->detach_shutdown(gc, ctx->context.cid);
> +
> + /* Make sure the context is properly cleared */
> + release_context(ctx);
As above, seems to be an unrelated fix.
> }
> }
>
> @@ -2234,6 +2244,7 @@ static DBusMessage *gprs_remove_context(DBusConnection *conn,
> }
>
> DBG("Unregistering context: %s", ctx->path);
> + release_context(ctx);
As above. You can't just lump these changes into something unrelated.
You need to submit these fixes separately and describe what each one is
fixing and why.
> context_dbus_unregister(ctx);
> gprs->contexts = g_slist_remove(gprs->contexts, ctx);
>
> diff --git a/src/lte.c b/src/lte.c
> index a6d26b3..21b6a19 100644
> --- a/src/lte.c
> +++ b/src/lte.c
> @@ -3,6 +3,7 @@
> * oFono - Open Source Telephony
> *
> * Copyright (C) 2016 Endocode AG. All rights reserved.
> + * Copyright (C) 2018 Gemalto M2M
> *
> * 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
> @@ -39,7 +40,11 @@
>
> #define SETTINGS_STORE "lte"
> #define SETTINGS_GROUP "Settings"
> -#define DEFAULT_APN_KEY "DefaultAccessPointName"
> +#define LTE_APN "AccessPointName"
No. You can't do that. The D-Bus API is stable and cannot be changed.
This is why you propose D-Bus API changes first, so that they can be
reviewed separately for any impacts.
> +#define LTE_PROTO "Protocol"
> +#define LTE_USERNAME "Username"
> +#define LTE_PASSWORD "Password"
> +#define LTE_AUTH_METHOD "AuthenticationMethod"
>
> struct ofono_lte {
> const struct ofono_lte_driver *driver;
> @@ -50,13 +55,82 @@ struct ofono_lte {
> DBusMessage *pending;
> struct ofono_lte_default_attach_info pending_info;
> struct ofono_lte_default_attach_info info;
> + const char *prop_changed;
?? What memory location is this const char pointing to?
Why don't you just use an enum. Or even better, don't do this at all
and simply compare pending_info & info to generate the right signal.
> };
>
> static GSList *g_drivers = NULL;
>
> +static const char *gprs_proto_to_string(enum ofono_gprs_proto proto)
> +{
> + switch (proto) {
> + case OFONO_GPRS_PROTO_IP:
> + return "ip";
> + case OFONO_GPRS_PROTO_IPV6:
> + return "ipv6";
> + case OFONO_GPRS_PROTO_IPV4V6:
> + return "dual";
> + };
> +
> + return NULL;
> +}
This needs to be moved to common.c
> +
> +static gboolean gprs_proto_from_string(const char *str,
> + enum ofono_gprs_proto *proto)
> +{
> + if (g_str_equal(str, "ip")) {
> + *proto = OFONO_GPRS_PROTO_IP;
> + return TRUE;
> + } else if (g_str_equal(str, "ipv6")) {
> + *proto = OFONO_GPRS_PROTO_IPV6;
> + return TRUE;
> + } else if (g_str_equal(str, "dual")) {
> + *proto = OFONO_GPRS_PROTO_IPV4V6;
> + return TRUE;
> + }
> +
> + return FALSE;
> +}
> +
> +static const char *gprs_auth_method_to_string(enum ofono_gprs_auth_method auth)
> +{
> + switch (auth) {
> + case OFONO_GPRS_AUTH_METHOD_CHAP:
> + return "chap";
> + case OFONO_GPRS_AUTH_METHOD_PAP:
> + return "pap";
> + case OFONO_GPRS_AUTH_METHOD_NONE:
> + return "none";
> + default:
> + return NULL;
> + };
> +
> + return NULL;
> +}
> +
> +static gboolean gprs_auth_method_from_string(const char *str,
> + enum ofono_gprs_auth_method *auth)
> +{
> + if (g_str_equal(str, "chap")) {
> + *auth = OFONO_GPRS_AUTH_METHOD_CHAP;
> + return TRUE;
> + } else if (g_str_equal(str, "pap")) {
> + *auth = OFONO_GPRS_AUTH_METHOD_PAP;
> + return TRUE;
> + } else if (g_str_equal(str, "none")) {
> + *auth = OFONO_GPRS_AUTH_METHOD_NONE;
> + return TRUE;
> + }
> +
> + return FALSE;
> +}
> +
And all these as well
> static void lte_load_settings(struct ofono_lte *lte)
> {
> + char *proto_str;
> char *apn;
> + char *auth_method_str;
> + char *username;
> + char *password;
>
> if (lte->imsi == NULL)
> return;
> @@ -69,114 +143,276 @@ static void lte_load_settings(struct ofono_lte *lte)
> return;
> }
>
> - apn = g_key_file_get_string(lte->settings, SETTINGS_GROUP ,
> - DEFAULT_APN_KEY, NULL);
> - if (apn) {
> + proto_str = g_key_file_get_string(lte->settings, SETTINGS_GROUP,
> + LTE_PROTO, NULL);
> + apn = g_key_file_get_string(lte->settings, SETTINGS_GROUP,
> + LTE_APN, NULL);
And now you broke the default attach APN setting of every existing oFono
user. No, you cannot do that.
> + auth_method_str = g_key_file_get_string(lte->settings, SETTINGS_GROUP,
> + LTE_AUTH_METHOD, NULL);
> + username = g_key_file_get_string(lte->settings, SETTINGS_GROUP,
> + LTE_USERNAME, NULL);
> + password = g_key_file_get_string(lte->settings, SETTINGS_GROUP,
> + LTE_PASSWORD, NULL);
> + if (proto_str == NULL)
> + proto_str = g_strdup("ip");
> +
> + /* this must have a valid default */
> + if (!gprs_proto_from_string(proto_str, <e->info.proto))
> + lte->info.proto = OFONO_GPRS_PROTO_IP;
> +
> + if (apn)
> strcpy(lte->info.apn, apn);
> - g_free(apn);
> - }
> +
> + if (auth_method_str == NULL)
> + auth_method_str = g_strdup("none");
> +
> + /* this must have a valid default */
> + if (!gprs_auth_method_from_string(auth_method_str,
> + <e->info.auth_method))
> + lte->info.auth_method = OFONO_GPRS_AUTH_METHOD_NONE;
> +
> + if (username)
> + strcpy(lte->info.username, username);
> +
> + if (password)
> + strcpy(lte->info.password, password);
> +
> + g_free(proto_str);
> + g_free(apn);
> + g_free(auth_method_str);
> + g_free(username);
> + g_free(password);
> }
>
> static DBusMessage *lte_get_properties(DBusConnection *conn,
> DBusMessage *msg, void *data)
> {
> struct ofono_lte *lte = data;
> + const char *proto = gprs_proto_to_string(lte->info.proto);
> const char *apn = lte->info.apn;
> + const char* auth_method =
> + gprs_auth_method_to_string(lte->info.auth_method);
> + const char *username = lte->info.username;
> + const char *password = lte->info.password;
> DBusMessage *reply;
> DBusMessageIter iter;
> DBusMessageIter dict;
>
> reply = dbus_message_new_method_return(msg);
> +
Don't change random code that doesn't need to be changed. You should be
keeping your changes minimal and on-point. Any changes unrelated to the
purpose of the patch need to be submitted separately.
> 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);
> - ofono_dbus_dict_append(&dict, DEFAULT_APN_KEY, DBUS_TYPE_STRING, &apn);
> + ofono_dbus_dict_append(&dict, LTE_PROTO, DBUS_TYPE_STRING, &proto);
> + ofono_dbus_dict_append(&dict, LTE_APN, DBUS_TYPE_STRING, &apn);
> + ofono_dbus_dict_append(&dict, LTE_AUTH_METHOD, DBUS_TYPE_STRING,
> + &auth_method);
> + ofono_dbus_dict_append(&dict, LTE_USERNAME, DBUS_TYPE_STRING,
> + &username);
> + ofono_dbus_dict_append(&dict, LTE_PASSWORD, DBUS_TYPE_STRING,
> + &password);
> dbus_message_iter_close_container(&iter, &dict);
> -
> return reply;
> }
>
> static void lte_set_default_attach_info_cb(const struct ofono_error *error,
> - void *data)
> + void *data)
> {
> struct ofono_lte *lte = data;
> const char *path = __ofono_atom_get_path(lte->atom);
> DBusConnection *conn = ofono_dbus_get_connection();
> DBusMessage *reply;
> - const char *apn = lte->info.apn;
> + const char *propstr;
>
> - DBG("%s error %d", path, error->type);
> + if (error != NULL) {
> + DBG("%s error %d", path, error->type);
Why? Error should never be NULL. If you're faking a call to this
function, why don't you just pass a proper error structure in instead of
messing with this? And even then I would think it would be much cleaner
not to do this in the first place...
>
> - if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
> - __ofono_dbus_pending_reply(<e->pending,
> - __ofono_error_failed(lte->pending));
> - return;
> + if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
> + __ofono_dbus_pending_reply(<e->pending,
> + __ofono_error_failed(lte->pending));
> + return;
> + }
This change is non-sense.
> }
>
> - g_strlcpy(lte->info.apn, lte->pending_info.apn,
> - OFONO_GPRS_MAX_APN_LENGTH + 1);
> + if (g_str_equal(lte->prop_changed, LTE_PROTO)) {
> + lte->info.proto = lte->pending_info.proto;
> + propstr = gprs_proto_to_string(lte->info.proto);
>
> - if (lte->settings) {
> - if (strlen(lte->info.apn) == 0)
> - /* Clear entry on empty APN. */
> - g_key_file_remove_key(lte->settings, SETTINGS_GROUP,
> - DEFAULT_APN_KEY, NULL);
> - else
> + if (lte->settings)
> g_key_file_set_string(lte->settings, SETTINGS_GROUP,
> - DEFAULT_APN_KEY, lte->info.apn);
> + LTE_PROTO, propstr);
>
> - storage_sync(lte->imsi, SETTINGS_STORE, lte->settings);
> + } else if (g_str_equal(lte->prop_changed, LTE_APN)) {
> + g_strlcpy(lte->info.apn, lte->pending_info.apn,
> + OFONO_GPRS_MAX_APN_LENGTH + 1);
> + propstr = lte->info.apn;
> +
> + if (lte->settings) {
> +
> + if (!*lte->info.apn)
> + /* Clear entry on empty APN. */
> + g_key_file_remove_key(lte->settings,
> + SETTINGS_GROUP, LTE_APN, NULL);
> + else
> + g_key_file_set_string(lte->settings,
> + SETTINGS_GROUP, LTE_APN, lte->info.apn);
> + }
> +
> + } else if (g_str_equal(lte->prop_changed, LTE_AUTH_METHOD)) {
> + lte->info.auth_method = lte->pending_info.auth_method;
> + propstr = gprs_auth_method_to_string(lte->info.auth_method);
> +
> + if (lte->settings)
> + g_key_file_set_string(lte->settings, SETTINGS_GROUP,
> + LTE_AUTH_METHOD, propstr);
> +
> + } else if (g_str_equal(lte->prop_changed, LTE_USERNAME)) {
> + g_strlcpy(lte->info.username, lte->pending_info.username,
> + OFONO_GPRS_MAX_USERNAME_LENGTH + 1);
> + propstr = lte->info.username;
> +
> + if (lte->settings) {
> +
> + if (!*lte->info.username)
> + /* Clear entry on empty Username. */
> + g_key_file_remove_key(lte->settings,
> + SETTINGS_GROUP, LTE_USERNAME, NULL);
> + else
> + g_key_file_set_string(lte->settings,
> + SETTINGS_GROUP,
> + LTE_USERNAME, lte->info.username);
> + }
> +
You have boiler-plate code for nearly all of these settings. Why don't
you actually use a function for this?
> + } else if (g_str_equal(lte->prop_changed, LTE_PASSWORD)) {
> + g_strlcpy(lte->info.password, lte->pending_info.password,
> + OFONO_GPRS_MAX_PASSWORD_LENGTH + 1);
> + propstr = lte->info.password;
> +
> + if (lte->settings) {
> +
> + if (strlen(lte->info.password) == 0)
> + /* Clear entry on empty Password. */
> + g_key_file_remove_key(lte->settings,
> + SETTINGS_GROUP, LTE_PASSWORD, NULL);
> + else
> + g_key_file_set_string(lte->settings,
> + SETTINGS_GROUP,
> + LTE_PASSWORD, lte->info.password);
> + }
> +
> + } else {
> + return;
You have a dbus message pending, you can't do that...
> }
>
> + if (lte->settings)
> + storage_sync(lte->imsi, SETTINGS_STORE, lte->settings);
> +
> reply = dbus_message_new_method_return(lte->pending);
> __ofono_dbus_pending_reply(<e->pending, reply);
> -
> ofono_dbus_signal_property_changed(conn, path,
> OFONO_CONNECTION_CONTEXT_INTERFACE,
> - DEFAULT_APN_KEY,
> - DBUS_TYPE_STRING, &apn);
> + lte->prop_changed,
> + DBUS_TYPE_STRING, &propstr);
> }
>
> -static DBusMessage *lte_set_default_apn(struct ofono_lte *lte,
> +static DBusMessage *lte_set_proto(struct ofono_lte *lte,
> DBusConnection *conn, DBusMessage *msg,
> - const char *apn)
> + enum ofono_gprs_proto proto)
> {
> - if (lte->driver->set_default_attach_info == NULL)
> - return __ofono_error_not_implemented(msg);
> -
> - if (lte->pending)
> - return __ofono_error_busy(msg);
> + void *data = lte;
>
> - if (g_str_equal(apn, lte->info.apn))
> + if (proto == lte->info.proto)
> return dbus_message_new_method_return(msg);
>
> + lte->pending = dbus_message_ref(msg);
> + lte->pending_info.proto = proto;
> + lte_set_default_attach_info_cb(NULL, data);
> + return dbus_message_ref(msg);;
I have no idea what is happening here. Whatever it is, it is wrong.
> +}
> +
> +static DBusMessage *lte_set_default_apn(struct ofono_lte *lte,
> + DBusConnection *conn, DBusMessage *msg,
> + const char *apn)
> +{
> /* 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);
>
> lte->pending = dbus_message_ref(msg);
> + g_strlcpy(lte->info.apn, apn, OFONO_GPRS_MAX_APN_LENGTH + 1);
> + lte->driver->set_default_attach_info(lte, <e->info,
> + lte_set_default_attach_info_cb, lte);
> + return dbus_message_ref(msg);
> +}
>
> - g_strlcpy(lte->pending_info.apn, apn, OFONO_GPRS_MAX_APN_LENGTH + 1);
> +static DBusMessage *lte_set_auth_method(struct ofono_lte *lte,
> + DBusConnection *conn, DBusMessage *msg,
> + enum ofono_gprs_auth_method auth_method)
> +{
> + void *data = lte;
>
> - lte->driver->set_default_attach_info(lte, <e->pending_info,
> - lte_set_default_attach_info_cb, lte);
> + if (auth_method == lte->info.auth_method)
> + return dbus_message_new_method_return(msg);
>
> - return NULL;
> + lte->pending = dbus_message_ref(msg);
> + lte->pending_info.auth_method = auth_method;
> + lte_set_default_attach_info_cb(NULL, data);
> + return dbus_message_ref(msg);;
> +}
> +
> +static DBusMessage *lte_set_username(struct ofono_lte *lte,
> + DBusConnection *conn, DBusMessage *msg,
> + const char *username)
> +{
> + void *data = lte;
> +
> + if (g_str_equal(username, lte->info.username))
> + return dbus_message_new_method_return(msg);
> +
> + lte->pending = dbus_message_ref(msg);
> + g_strlcpy(lte->pending_info.username, username,
> + OFONO_GPRS_MAX_USERNAME_LENGTH + 1);
> + lte_set_default_attach_info_cb(NULL, data);
> + return dbus_message_ref(msg);;
> +}
> +
> +static DBusMessage *lte_set_password(struct ofono_lte *lte,
> + DBusConnection *conn, DBusMessage *msg,
> + const char *password)
> +{
> + void *data = lte;
> +
> + if (g_str_equal(password, lte->info.password))
> + return dbus_message_new_method_return(msg);
> +
> + lte->pending = dbus_message_ref(msg);
> + g_strlcpy(lte->pending_info.password, password,
> + OFONO_GPRS_MAX_PASSWORD_LENGTH + 1);
> + lte_set_default_attach_info_cb(NULL, data);
> +
You do realize you're never actually calling into the driver method,
right? So none of these changes actually go out to the modem. Have you
actually tested any of this?
> + return dbus_message_ref(msg);;
> }
>
> static DBusMessage *lte_set_property(DBusConnection *conn,
> - DBusMessage *msg, void *data)
> + DBusMessage *msg, void *data)
> {
> struct ofono_lte *lte = data;
> DBusMessageIter iter;
> DBusMessageIter var;
> const char *property;
> const char *str;
> + enum ofono_gprs_auth_method auth_method;
> + enum ofono_gprs_proto proto;
> +
> + if (lte->driver->set_default_attach_info == NULL)
> + return __ofono_error_not_implemented(msg);
> +
> + if (lte->pending)
> + return __ofono_error_busy(msg);
>
> if (!dbus_message_iter_init(msg, &iter))
> return __ofono_error_invalid_args(msg);
> @@ -192,13 +428,58 @@ static DBusMessage *lte_set_property(DBusConnection *conn,
>
> dbus_message_iter_recurse(&iter, &var);
>
> - if (!strcmp(property, DEFAULT_APN_KEY)) {
> + lte->prop_changed=property;
> +
> + if (!strcmp(property, LTE_PROTO)) {
> +
> + if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_STRING)
> + return __ofono_error_invalid_args(msg);
> +
> + dbus_message_iter_get_basic(&var, &str);
> +
> + if (gprs_proto_from_string(str, &proto))
> + return lte_set_proto(lte, conn, msg, proto);
The return from this callback is always supposed to be a method_return
or NULL if the method_return will be done asynchronously (in your case
always) You're somehow returning the method_call itself...
> + else
> + return __ofono_error_invalid_format(msg);
> +
> + } else if (!strcmp(property, LTE_APN)) {
> +
> 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);
> +
> + } else if (!strcmp(property, LTE_AUTH_METHOD)) {
> +
> + if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_STRING)
> + return __ofono_error_invalid_args(msg);
> +
> + dbus_message_iter_get_basic(&var, &str);
> +
> + if (gprs_auth_method_from_string(str, &auth_method))
> + return lte_set_auth_method(lte, conn, msg, auth_method);
> + else
> + return __ofono_error_invalid_format(msg);
> +
> + } else if (!strcmp(property, LTE_USERNAME)) {
> +
> + 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_username(lte, conn, msg, str);
> +
> + } else if (!strcmp(property, LTE_PASSWORD)) {
> +
> + 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_password(lte, conn, msg, str);
> }
>
> return __ofono_error_invalid_args(msg);
> @@ -373,3 +654,8 @@ void *ofono_lte_get_data(const struct ofono_lte *lte)
> {
> return lte->driver_data;
> }
> +
> +struct ofono_modem *ofono_lte_get_modem(const struct ofono_lte *lte)
> +{
> + return __ofono_atom_get_modem(lte->atom);
> +}
> \ No newline at end of file
Fix this.
> diff --git a/src/main.c b/src/main.c
> index 2d359dd..d8a06ba 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -211,11 +211,6 @@ int main(int argc, char **argv)
> struct ell_event_source *source;
> #endif
>
> -#ifdef NEED_THREADS
> - if (g_thread_supported() == FALSE)
> - g_thread_init(NULL);
> -#endif
> -
Why? This is completely unrelated and can be turned off via configure.
> context = g_option_context_new(NULL);
> g_option_context_add_main_entries(context, options, NULL);
>
>
Regards,
-Denis
next prev parent reply other threads:[~2018-09-19 15:04 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-19 5:37 [PATCH 1/7] extended support for LTE and NR. Some minor fixes. part 1 of 7 Giacinto Cifelli
2018-09-19 5:37 ` [PATCH 2/7] extended support for LTE and NR. Some minor fixes. part 2 " Giacinto Cifelli
2018-09-19 15:04 ` Denis Kenzior [this message]
2018-09-19 16:07 ` Giacinto Cifelli
2018-09-19 16:30 ` Denis Kenzior
2018-09-19 17:53 ` Giacinto Cifelli
2018-09-19 18:23 ` Denis Kenzior
2018-09-20 7:57 ` Giacinto Cifelli
2018-09-20 16:02 ` Denis Kenzior
2018-09-20 16:07 ` Giacinto Cifelli
2018-09-20 16:31 ` Denis Kenzior
2018-09-20 17:03 ` Giacinto Cifelli
2018-09-20 17:18 ` Denis Kenzior
2018-09-20 17:25 ` Giacinto Cifelli
2018-09-19 5:37 ` [PATCH 3/7] extended support for LTE and NR. Some minor fixes. part 3 " Giacinto Cifelli
2018-09-19 15:05 ` Denis Kenzior
2018-09-19 5:37 ` [PATCH 4/7] extended support for LTE and NR. Some minor fixes. part 4 " Giacinto Cifelli
2018-09-19 5:37 ` [PATCH 5/7] extended support for LTE and NR. Some minor fixes. part 5 " Giacinto Cifelli
2018-09-19 5:37 ` [PATCH 6/7] extended support for LTE and NR. Some minor fixes. part 6 " Giacinto Cifelli
2018-09-19 5:37 ` [PATCH 7/7] extended support for LTE and NR. Some minor fixes. part 7 " Giacinto Cifelli
2018-09-19 8:35 ` [PATCH 1/7] extended support for LTE and NR. Some minor fixes. part 1 " Slava Monich
2018-09-19 9:24 ` Giacinto Cifelli
2018-09-19 15:21 ` Denis Kenzior
2018-09-19 16:28 ` Slava Monich
2018-09-19 16:32 ` Denis Kenzior
2018-09-19 16:54 ` Slava Monich
2018-09-19 16:58 ` Giacinto Cifelli
2018-09-19 20:48 ` Slava Monich
2018-09-19 21:45 ` Denis Kenzior
2018-09-19 23:14 ` Slava Monich
2018-09-20 2:31 ` Denis Kenzior
2018-09-19 15:19 ` Denis Kenzior
2018-09-19 14:09 ` Denis Kenzior
2018-09-19 15:42 ` Giacinto Cifelli
2018-09-19 15:59 ` Denis Kenzior
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e56297a0-e44e-d9d2-5fef-b5d60c773a60@gmail.com \
--to=denkenz@gmail.com \
--cc=ofono@ofono.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox