Re: [RFC PATCH 1/4] drivers: gemalto: add gprs-context driver

2020-08-17 Thread Denis Kenzior

Hi Sergey,

On 8/15/20 4:43 PM, Sergey Matyukevich wrote:

Some gemalto modems provide USB ethernet interfaces for data path.
Implement gprs-context driver for such modems to send data via
USB ethernet rather than fallback to PPP.

Signed-off-by: Sergey Matyukevich 
---
  Makefile.am |   3 +-
  drivers/gemaltomodem/gemaltomodem.c |   4 +-
  drivers/gemaltomodem/gemaltomodem.h |   3 +
  drivers/gemaltomodem/gprs-context.c | 280 
  4 files changed, 288 insertions(+), 2 deletions(-)
  create mode 100644 drivers/gemaltomodem/gprs-context.c



This looks fine to me.  My only 2 nitpicks are:

1. We do not use S-o-B, so feel free to drop those in the future or I will just 
drop them when applying.



+
+static int gemalto_gprs_context_probe(struct ofono_gprs_context *gc,
+   unsigned int vendor, void *data)
+{
+   GAtChat *chat = data;
+   struct gprs_context_data *gcd;
+
+   DBG("");
+
+   gcd = g_try_new0(struct gprs_context_data, 1);
+   if (gcd == NULL)
+   return -ENOMEM;
+


2. We now prefer to use g_new0 for small structure allocations as these can't 
really fail on Linux userspace in practice.  Keeps the code shorter as well.



+   gcd->chat = g_at_chat_clone(chat);
+


Regards,
-Denis
___
ofono mailing list -- ofono@ofono.org
To unsubscribe send an email to ofono-le...@ofono.org


[RFC PATCH 1/4] drivers: gemalto: add gprs-context driver

2020-08-15 Thread Sergey Matyukevich
Some gemalto modems provide USB ethernet interfaces for data path.
Implement gprs-context driver for such modems to send data via
USB ethernet rather than fallback to PPP.

Signed-off-by: Sergey Matyukevich 
---
 Makefile.am |   3 +-
 drivers/gemaltomodem/gemaltomodem.c |   4 +-
 drivers/gemaltomodem/gemaltomodem.h |   3 +
 drivers/gemaltomodem/gprs-context.c | 280 
 4 files changed, 288 insertions(+), 2 deletions(-)
 create mode 100644 drivers/gemaltomodem/gprs-context.c

diff --git a/Makefile.am b/Makefile.am
index fbb0eff4..67c3bcbf 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -482,7 +482,8 @@ builtin_sources += drivers/atmodem/atutil.h \
drivers/gemaltomodem/gemaltomodem.h \
drivers/gemaltomodem/gemaltomodem.c \
drivers/gemaltomodem/location-reporting.c \
-   drivers/gemaltomodem/voicecall.c
+   drivers/gemaltomodem/voicecall.c \
+   drivers/gemaltomodem/gprs-context.c
 
 builtin_modules += xmm7modem
 builtin_sources += drivers/atmodem/atutil.h \
diff --git a/drivers/gemaltomodem/gemaltomodem.c 
b/drivers/gemaltomodem/gemaltomodem.c
index 4818ac66..4b20dd1b 100644
--- a/drivers/gemaltomodem/gemaltomodem.c
+++ b/drivers/gemaltomodem/gemaltomodem.c
@@ -36,6 +36,7 @@
 static int gemaltomodem_init(void)
 {
gemalto_location_reporting_init();
+   gemalto_gprs_context_init();
gemalto_voicecall_init();
 
return 0;
@@ -43,8 +44,9 @@ static int gemaltomodem_init(void)
 
 static void gemaltomodem_exit(void)
 {
-   gemalto_voicecall_exit();
gemalto_location_reporting_exit();
+   gemalto_gprs_context_exit();
+   gemalto_voicecall_exit();
 }
 
 OFONO_PLUGIN_DEFINE(gemaltomodem, "Gemalto modem driver", VERSION,
diff --git a/drivers/gemaltomodem/gemaltomodem.h 
b/drivers/gemaltomodem/gemaltomodem.h
index 27b1460e..dc0d346b 100644
--- a/drivers/gemaltomodem/gemaltomodem.h
+++ b/drivers/gemaltomodem/gemaltomodem.h
@@ -27,3 +27,6 @@ extern void gemalto_location_reporting_exit();
 
 extern void gemalto_voicecall_init();
 extern void gemalto_voicecall_exit();
+
+extern void gemalto_gprs_context_init();
+extern void gemalto_gprs_context_exit();
diff --git a/drivers/gemaltomodem/gprs-context.c 
b/drivers/gemaltomodem/gprs-context.c
new file mode 100644
index ..be3de537
--- /dev/null
+++ b/drivers/gemaltomodem/gprs-context.c
@@ -0,0 +1,280 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2020 Sergey Matyukevich. 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 
+#endif
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+#include 
+#include 
+#include 
+
+#include "gatchat.h"
+#include "gatresult.h"
+#include "gattty.h"
+
+#include "gemaltomodem.h"
+
+static const char *none_prefix[] = { NULL };
+
+struct gprs_context_data {
+   GAtChat *chat;
+   unsigned int active_context;
+   ofono_gprs_context_cb_t cb;
+   void *cb_data;
+};
+
+static void cgact_enable_cb(gboolean ok, GAtResult *result,
+   gpointer user_data)
+{
+   struct ofono_gprs_context *gc = user_data;
+   struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+   struct ofono_modem *modem;
+   const char *interface;
+   char buf[64];
+
+   DBG("ok %d", ok);
+
+   if (!ok) {
+   struct ofono_error error;
+
+   gcd->active_context = 0;
+
+   decode_at_error(, g_at_result_final_response(result));
+   gcd->cb(, gcd->cb_data);
+
+   return;
+   }
+
+   snprintf(buf, sizeof(buf), "AT^SWWAN=1,%u", gcd->active_context);
+   g_at_chat_send(gcd->chat, buf, none_prefix, NULL, NULL, NULL);
+
+   modem = ofono_gprs_context_get_modem(gc);
+   interface = ofono_modem_get_string(modem, "NetworkInterface");
+   ofono_gprs_context_set_interface(gc, interface);
+
+   /* Use DHCP */
+   ofono_gprs_context_set_ipv4_address(gc, NULL, 0);
+
+   CALLBACK_WITH_SUCCESS(gcd->cb, gcd->cb_data);
+}
+
+static void cgdcont_enable_cb(gboolean ok, GAtResult *result,
+   gpointer user_data)
+{
+   struct ofono_gprs_context *gc =