ofono.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/4] core: Remove unused declarations from ofono.h
@ 2024-01-24 21:12 Denis Kenzior
  2024-01-24 21:13 ` [PATCH 2/4] provision: Remove use of ofono_gprs_provision_data Denis Kenzior
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Denis Kenzior @ 2024-01-24 21:12 UTC (permalink / raw)
  To: ofono; +Cc: Denis Kenzior

Fixes: 36a11599 ("gprs-provision: Remove no longer used atom/driver")
---
 src/ofono.h | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/src/ofono.h b/src/ofono.h
index 6a8c53a1..42298e43 100644
--- a/src/ofono.h
+++ b/src/ofono.h
@@ -587,14 +587,6 @@ bool __ofono_provision_get_settings(const char *mcc,
 				struct ofono_gprs_provision_data **settings,
 				size_t *count);
 
-ofono_bool_t __ofono_gprs_provision_get_settings(const char *mcc,
-				const char *mnc, const char *spn,
-				struct ofono_gprs_provision_data **settings,
-				int *count);
-void __ofono_gprs_provision_free_settings(
-				struct ofono_gprs_provision_data *settings,
-				int count);
-
 #include <ofono/emulator.h>
 
 enum ofono_emulator_slc_condition {
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/4] provision: Remove use of ofono_gprs_provision_data
  2024-01-24 21:12 [PATCH 1/4] core: Remove unused declarations from ofono.h Denis Kenzior
@ 2024-01-24 21:13 ` Denis Kenzior
  2024-01-24 21:13 ` [PATCH 3/4] gprs: Add some additional context types Denis Kenzior
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Denis Kenzior @ 2024-01-24 21:13 UTC (permalink / raw)
  To: ofono; +Cc: Denis Kenzior

Switch to using struct provisiondb_entry instead of struct
ofono_gprs_provision_data.  For now, mark all string attributes of this
structure as const.  Strings are currently not allocated and instead
point to loations in the provisiondb memory mapped region.  Since the
provisioning database is only opened at startup and never unmapped
during oFono's runtime, returning const pointers to such strings is
safe.

While here, mark __get_string() as returning a pointer to a const char.
---
 Makefile.am              |  2 +-
 include/gprs-provision.h | 49 ----------------------------------------
 src/gprs.c               |  5 ++--
 src/ofono.h              |  4 ++--
 src/provision.c          | 10 ++++----
 src/provisiondb.c        | 16 ++++++-------
 src/provisiondb.h        | 17 ++++++++++++--
 tools/lookup-apn.c       |  8 +++----
 8 files changed, 38 insertions(+), 73 deletions(-)
 delete mode 100644 include/gprs-provision.h

diff --git a/Makefile.am b/Makefile.am
index 15d220f7..280653f3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -144,7 +144,7 @@ pkginclude_HEADERS = include/log.h include/plugin.h include/history.h \
 			include/audio-settings.h include/nettime.h \
 			include/ctm.h \
 			include/sim-auth.h \
-			include/gprs-provision.h include/emulator.h \
+			include/emulator.h \
 			include/location-reporting.h \
 			include/gnss.h \
 			include/private-network.h \
diff --git a/include/gprs-provision.h b/include/gprs-provision.h
deleted file mode 100644
index ac0f5905..00000000
--- a/include/gprs-provision.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *
- *  oFono - Open Telephony stack for Linux
- *
- *  Copyright (C) 2011  Nokia Corporation and/or its subsidiary(-ies).
- *
- *  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_GPRS_PROVISION_H
-#define __OFONO_GPRS_PROVISION_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdint.h>
-
-#include "gprs-context.h"
-
-struct ofono_gprs_provision_data {
-	uint32_t type; /* Multiple types can be set in a bitmap */
-	enum ofono_gprs_proto proto;
-	char *name;
-	char *apn;
-	char *username;
-	char *password;
-	enum ofono_gprs_auth_method auth_method;
-	char *message_proxy;
-	char *message_center;
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __OFONO_GPRS_PROVISION_H */
diff --git a/src/gprs.c b/src/gprs.c
index 40642324..f8b6fd3c 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -43,6 +43,7 @@
 #include "ofono.h"
 
 #include "common.h"
+#include "provisiondb.h"
 #include "storage.h"
 #include "simutil.h"
 #include "util.h"
@@ -2371,7 +2372,7 @@ static DBusMessage *gprs_get_contexts(DBusConnection *conn,
 	return reply;
 }
 
-static void provision_context(const struct ofono_gprs_provision_data *ap,
+static void provision_context(const struct provision_db_entry *ap,
 				struct ofono_gprs *gprs)
 {
 	unsigned int id;
@@ -2463,7 +2464,7 @@ static void provision_context(const struct ofono_gprs_provision_data *ap,
 static void provision_contexts(struct ofono_gprs *gprs, const char *mcc,
 				const char *mnc, const char *spn)
 {
-	struct ofono_gprs_provision_data *settings;
+	struct provision_db_entry *settings;
 	size_t count;
 	size_t i;
 
diff --git a/src/ofono.h b/src/ofono.h
index 42298e43..a243d3fb 100644
--- a/src/ofono.h
+++ b/src/ofono.h
@@ -581,10 +581,10 @@ void __ofono_nettime_info_received(struct ofono_modem *modem,
 
 #include <ofono/sim-auth.h>
 
-#include <ofono/gprs-provision.h>
+struct provision_db_entry;
 bool __ofono_provision_get_settings(const char *mcc,
 				const char *mnc, const char *spn,
-				struct ofono_gprs_provision_data **settings,
+				struct provision_db_entry **settings,
 				size_t *count);
 
 #include <ofono/emulator.h>
diff --git a/src/provision.c b/src/provision.c
index cd5cf569..a2dfcf6c 100644
--- a/src/provision.c
+++ b/src/provision.c
@@ -11,6 +11,8 @@
 
 #include <stddef.h>
 
+#include <ofono/gprs-context.h>
+
 #include "provisiondb.h"
 #include "ofono.h"
 
@@ -18,11 +20,11 @@ static struct provision_db *pdb;
 
 bool __ofono_provision_get_settings(const char *mcc,
 				const char *mnc, const char *spn,
-				struct ofono_gprs_provision_data **settings,
+				struct provision_db_entry **settings,
 				size_t *count)
 {
 	size_t n_contexts;
-	struct ofono_gprs_provision_data *contexts;
+	struct provision_db_entry *contexts;
 	int r;
 	size_t i;
 	uint32_t type;
@@ -38,7 +40,7 @@ bool __ofono_provision_get_settings(const char *mcc,
 			n_contexts, mcc, mnc, spn);
 
 	for (i = 0; i < n_contexts; i++) {
-		struct ofono_gprs_provision_data *ap = contexts + i;
+		struct provision_db_entry *ap = contexts + i;
 
 		DBG("APN: %s, Type: %x, Proto: %x",
 				ap->apn, ap->type, ap->proto);
@@ -50,7 +52,7 @@ bool __ofono_provision_get_settings(const char *mcc,
 
 	/* Make sure there are no duplicates */
 	for (i = 0, type = 0; i < n_contexts; i++) {
-		struct ofono_gprs_provision_data *ap = contexts + i;
+		struct provision_db_entry *ap = contexts + i;
 
 		if (type & ap->type) {
 			ofono_warn("Duplicate detected for %s%s, spn: %s",
diff --git a/src/provisiondb.c b/src/provisiondb.c
index 6b864dec..53305eab 100644
--- a/src/provisiondb.c
+++ b/src/provisiondb.c
@@ -21,8 +21,7 @@
 #include <ell/ell.h>
 
 #define OFONO_API_SUBJECT_TO_CHANGE
-#include <ofono/modem.h>
-#include <ofono/gprs-provision.h>
+#include <ofono/gprs-context.h>
 
 #include "provisiondb.h"
 
@@ -205,7 +204,7 @@ static struct provision_data *__get_provision_data(struct node *node)
 }
 
 static int __get_string(struct provision_db *pdb, uint64_t offset,
-				char **out_str)
+				const char **out_str)
 {
 	if (!offset) {
 		*out_str = NULL;
@@ -220,13 +219,13 @@ static int __get_string(struct provision_db *pdb, uint64_t offset,
 }
 
 static int __get_contexts(struct provision_db *pdb, uint64_t offset,
-				struct ofono_gprs_provision_data **contexts,
+				struct provision_db_entry **contexts,
 				size_t *n_contexts)
 {
 	void *start = pdb->addr + pdb->contexts_offset;
 	uint64_t num;
 	uint64_t i;
-	struct ofono_gprs_provision_data *ret;
+	struct provision_db_entry *ret;
 	int r;
 
 	if (offset + sizeof(__le64) >= pdb->contexts_size)
@@ -238,7 +237,7 @@ static int __get_contexts(struct provision_db *pdb, uint64_t offset,
 	if (offset + num * sizeof(struct context) > pdb->contexts_size)
 		return -EPROTO;
 
-	ret = l_new(struct ofono_gprs_provision_data, num);
+	ret = l_new(struct provision_db_entry, num);
 
 	for (i = 0; i < num; i++, offset += sizeof(struct context)) {
 		struct context *context = start + offset;
@@ -375,8 +374,7 @@ static int key_from_mcc_mnc(const char *mcc, const char *mnc, uint32_t *key)
 
 int provision_db_lookup(struct provision_db *pdb,
 			const char *mcc, const char *mnc, const char *match_spn,
-			struct ofono_gprs_provision_data **items,
-			size_t *n_items)
+			struct provision_db_entry **items, size_t *n_items)
 {
 	int r;
 	uint32_t key;
@@ -422,7 +420,7 @@ int provision_db_lookup(struct provision_db *pdb,
 	}
 
 	for (i = 0; i < count; i++) {
-		char *spn;
+		const char *spn;
 
 		r = __get_string(pdb, L_LE64_TO_CPU(data[i].spn_offset), &spn);
 		if (r < 0)
diff --git a/src/provisiondb.h b/src/provisiondb.h
index d7381b94..ee203c61 100644
--- a/src/provisiondb.h
+++ b/src/provisiondb.h
@@ -5,14 +5,27 @@
  * SPDX-License-Identifier: LGPL-2.1-or-later
  */
 
-struct ofono_gprs_provision_data;
+#include <stdint.h>
+
 struct provision_db;
 
+struct provision_db_entry {
+	uint32_t type; /* Multiple types can be set in a bitmap */
+	enum ofono_gprs_proto proto;
+	const char *name;
+	const char *apn;
+	const char *username;
+	const char *password;
+	enum ofono_gprs_auth_method auth_method;
+	const char *message_proxy;
+	const char *message_center;
+};
+
 struct provision_db *provision_db_new(const char *pathname);
 struct provision_db *provision_db_new_default(void);
 void provision_db_free(struct provision_db *pdb);
 
 int provision_db_lookup(struct provision_db *pdb,
 			const char *mcc, const char *mnc, const char *spn,
-			struct ofono_gprs_provision_data **items,
+			struct provision_db_entry **items,
 			size_t *n_items);
diff --git a/tools/lookup-apn.c b/tools/lookup-apn.c
index ff791993..34d689a4 100644
--- a/tools/lookup-apn.c
+++ b/tools/lookup-apn.c
@@ -18,8 +18,8 @@
 #include <ell/ell.h>
 
 #define OFONO_API_SUBJECT_TO_CHANGE
-#include <ofono/modem.h>
-#include <ofono/gprs-provision.h>
+#include <ofono/types.h>
+#include <ofono/gprs-context.h>
 
 #include "provisiondb.h"
 
@@ -29,7 +29,7 @@ static int lookup_apn(const char *match_mcc, const char *match_mnc,
 							const char *match_spn)
 {
 	struct provision_db *pdb;
-	struct ofono_gprs_provision_data *contexts;
+	struct provision_db_entry *contexts;
 	size_t n_contexts;
 	int r;
 	size_t i;
@@ -58,7 +58,7 @@ static int lookup_apn(const char *match_mcc, const char *match_mnc,
 	}
 
 	for (i = 0; i < n_contexts; i++) {
-		struct ofono_gprs_provision_data *ap = contexts + i;
+		struct provision_db_entry *ap = contexts + i;
 
 		fprintf(stdout, "\nName: %s\n", ap->name);
 		fprintf(stdout, "APN: %s\n", ap->apn);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/4] gprs: Add some additional context types
  2024-01-24 21:12 [PATCH 1/4] core: Remove unused declarations from ofono.h Denis Kenzior
  2024-01-24 21:13 ` [PATCH 2/4] provision: Remove use of ofono_gprs_provision_data Denis Kenzior
@ 2024-01-24 21:13 ` Denis Kenzior
  2024-01-24 21:13 ` [PATCH 4/4] unit: Add provisioning database tests Denis Kenzior
  2024-01-25 22:40 ` [PATCH 1/4] core: Remove unused declarations from ofono.h patchwork-bot+ofono
  3 siblings, 0 replies; 5+ messages in thread
From: Denis Kenzior @ 2024-01-24 21:13 UTC (permalink / raw)
  To: ofono; +Cc: Denis Kenzior

These context types are currently unused, but supported by the
provisioning database.  Add them to the enumeration and update some
utility functions to handle them.

In the case of SUPL, the context type can now be set via D-Bus API.  IA
context types will be handled specially by lte atom.
---
 include/gprs-context.h |  2 ++
 src/gprs.c             | 11 +++++++++++
 2 files changed, 13 insertions(+)

diff --git a/include/gprs-context.h b/include/gprs-context.h
index 81055d89..5d5f0be1 100644
--- a/include/gprs-context.h
+++ b/include/gprs-context.h
@@ -37,6 +37,8 @@ enum ofono_gprs_context_type {
 	OFONO_GPRS_CONTEXT_TYPE_MMS		= 0x0002,
 	OFONO_GPRS_CONTEXT_TYPE_WAP		= 0x0004,
 	OFONO_GPRS_CONTEXT_TYPE_IMS		= 0x0008,
+	OFONO_GPRS_CONTEXT_TYPE_SUPL		= 0x0010,
+	OFONO_GPRS_CONTEXT_TYPE_IA		= 0x0020,
 };
 
 struct ofono_gprs_primary_context {
diff --git a/src/gprs.c b/src/gprs.c
index f8b6fd3c..7b681d85 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -177,6 +177,10 @@ static const char *gprs_context_default_name(enum ofono_gprs_context_type type)
 		return "WAP";
 	case OFONO_GPRS_CONTEXT_TYPE_IMS:
 		return "IMS";
+	case OFONO_GPRS_CONTEXT_TYPE_SUPL:
+		return "SUPL";
+	case OFONO_GPRS_CONTEXT_TYPE_IA:
+		return "Initial Attach";
 	}
 
 	return NULL;
@@ -196,6 +200,10 @@ static const char *gprs_context_type_to_string(
 		return "wap";
 	case OFONO_GPRS_CONTEXT_TYPE_IMS:
 		return "ims";
+	case OFONO_GPRS_CONTEXT_TYPE_SUPL:
+		return "supl";
+	case OFONO_GPRS_CONTEXT_TYPE_IA:
+		return "ia";
 	}
 
 	return NULL;
@@ -216,6 +224,9 @@ static gboolean gprs_context_string_to_type(const char *str,
 	} else if (g_str_equal(str, "ims")) {
 		*out = OFONO_GPRS_CONTEXT_TYPE_IMS;
 		return TRUE;
+	} else if (g_str_equal(str, "supl")) {
+		*out = OFONO_GPRS_CONTEXT_TYPE_SUPL;
+		return TRUE;
 	}
 
 	return FALSE;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 4/4] unit: Add provisioning database tests
  2024-01-24 21:12 [PATCH 1/4] core: Remove unused declarations from ofono.h Denis Kenzior
  2024-01-24 21:13 ` [PATCH 2/4] provision: Remove use of ofono_gprs_provision_data Denis Kenzior
  2024-01-24 21:13 ` [PATCH 3/4] gprs: Add some additional context types Denis Kenzior
@ 2024-01-24 21:13 ` Denis Kenzior
  2024-01-25 22:40 ` [PATCH 1/4] core: Remove unused declarations from ofono.h patchwork-bot+ofono
  3 siblings, 0 replies; 5+ messages in thread
From: Denis Kenzior @ 2024-01-24 21:13 UTC (permalink / raw)
  To: ofono; +Cc: Denis Kenzior

---
 .gitignore               |   2 +
 Makefile.am              |  25 +++-
 unit/test-provision.c    | 280 +++++++++++++++++++++++++++++++++++++++
 unit/test-provision.json |  92 +++++++++++++
 4 files changed, 395 insertions(+), 4 deletions(-)
 create mode 100644 unit/test-provision.c
 create mode 100644 unit/test-provision.json

diff --git a/.gitignore b/.gitignore
index 87405231..0cfe5283 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,6 +47,8 @@ unit/test-rilmodem-cs
 unit/test-rilmodem-gprs
 unit/test-rilmodem-sms
 unit/test-mbim
+unit/test-provision
+unit/test-provision.db
 unit/test-*.log
 unit/test-*.trs
 test-driver
diff --git a/Makefile.am b/Makefile.am
index 280653f3..79645e76 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -8,10 +8,12 @@ noinst_LTLIBRARIES =
 if EXTERNAL_ELL
 ell_cflags = @ELL_CFLAGS@
 ell_ldadd = @ELL_LIBS@
+ell_dependencies =
 ell_built_sources = ell/shared
 else
 ell_cflags =
 ell_ldadd = ell/libell-internal.la
+ell_dependencies = $(ell_ldadd)
 ell_built_sources = ell/shared ell/internal ell/ell.h
 
 noinst_LTLIBRARIES += ell/libell-internal.la
@@ -736,7 +738,8 @@ endif
 
 AM_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ $(ell_cflags) $(builtin_cflags) \
 					-DOFONO_PLUGIN_BUILTIN \
-					-DPLUGINDIR=\""$(build_plugindir)"\"
+					-DPLUGINDIR=\""$(build_plugindir)"\" \
+					-DUNITDIR=\""$(top_builddir)/unit/"\"
 
 AM_CPPFLAGS = -I$(builddir)/include -I$(builddir)/src -I$(srcdir)/src \
 			-I$(srcdir)/gdbus -I$(srcdir)/gisi -I$(srcdir)/gatchat \
@@ -876,7 +879,9 @@ test_SCRIPTS = $(test_scripts)
 endif
 
 EXTRA_DIST = src/genbuiltin plugins/ofono.rules plugins/ofono-speedup.rules \
-				$(doc_files) $(test_scripts)
+		tools/provisiontool \
+		unit/test-provision.json \
+		$(doc_files) $(test_scripts)
 
 dist_man_MANS = doc/ofonod.8
 
@@ -890,7 +895,8 @@ unit_tests = unit/test-common unit/test-util \
 				unit/test-rilmodem-cs \
 				unit/test-rilmodem-sms \
 				unit/test-rilmodem-cb \
-				unit/test-rilmodem-gprs
+				unit/test-rilmodem-gprs \
+				unit/test-provision
 
 noinst_PROGRAMS = $(unit_tests) \
 			unit/test-sms-root unit/test-mux unit/test-caif
@@ -981,6 +987,17 @@ unit_test_mbim_SOURCES = unit/test-mbim.c \
 unit_test_mbim_LDADD = $(ell_ldadd)
 unit_objects += $(unit_test_mbim_OBJECTS)
 
+unit/test-provision.db: unit/test-provision.json
+	$(AM_V_GEN)$(srcdir)/tools/provisiontool generate \
+		--infile $< --outfile $@
+
+unit_test_provision_SOURCES = unit/test-provision.c \
+				src/provisiondb.h src/provisiondb.c
+unit_test_provision_LDADD = $(ell_ldadd)
+unit_test_provision_DEPENDENCIES = $(ell_dependencies) \
+					unit/test-provision.db
+unit_objects += $(unit_test_provision_OBJECTS)
+
 TESTS = $(unit_tests)
 
 if TOOLS
@@ -1103,4 +1120,4 @@ maintainer-clean-local:
 	-rm -rf build-aux ell
 
 clean-local:
-	@$(RM) -rf include/ofono
+	@$(RM) -rf include/ofono unit/test-provision.db
diff --git a/unit/test-provision.c b/unit/test-provision.c
new file mode 100644
index 00000000..9c3dfad4
--- /dev/null
+++ b/unit/test-provision.c
@@ -0,0 +1,280 @@
+/*
+ *  oFono - Open Source Telephony
+ *  Copyright (C) 2023  Cruise, LLC
+ *
+ *  SPDX-License-Identifier: GPL-2.0-only
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stddef.h>
+#include <assert.h>
+#include <errno.h>
+#include <ell/ell.h>
+
+#include <ofono/types.h>
+#include <ofono/gprs-context.h>
+
+#include "provisiondb.h"
+
+static struct provision_db *pdb;
+
+static void null_provision_db(const void *data)
+{
+	struct provision_db_entry *items;
+	size_t n_items;
+	int r;
+
+	r = provision_db_lookup(NULL, "123", "345", NULL, &items, &n_items);
+	assert(r == -EBADF);
+}
+
+static void invalid_mcc_mnc(const void *data)
+{
+	struct provision_db_entry *items;
+	size_t n_items;
+	int r;
+
+	r = provision_db_lookup(pdb, "3444", "33", NULL, &items, &n_items);
+	assert(r == -EINVAL);
+
+	r = provision_db_lookup(pdb, "3ab", "33", NULL, &items, &n_items);
+	assert(r == -EINVAL);
+
+	r = provision_db_lookup(pdb, "333", "3", NULL, &items, &n_items);
+	assert(r == -EINVAL);
+
+	r = provision_db_lookup(pdb, "333", "3334", NULL, &items, &n_items);
+	assert(r == -EINVAL);
+}
+
+struct provision_test {
+	const char *mcc;
+	const char *mnc;
+	const char *spn;
+	int result;
+	size_t n_items;
+	const struct provision_db_entry *items;
+};
+
+static const struct provision_db_entry alpha_contexts[] = {
+	{
+		.name = "Internet",
+		.type = OFONO_GPRS_CONTEXT_TYPE_INTERNET,
+		.proto = OFONO_GPRS_PROTO_IP,
+		.apn = "internet",
+		.auth_method = OFONO_GPRS_AUTH_METHOD_NONE,
+	},
+	{
+		.name = "IMS+MMS",
+		.type = OFONO_GPRS_CONTEXT_TYPE_IMS |
+			OFONO_GPRS_CONTEXT_TYPE_MMS |
+			OFONO_GPRS_CONTEXT_TYPE_IA,
+		.apn = "imsmms",
+		.proto = OFONO_GPRS_PROTO_IPV6,
+		.auth_method = OFONO_GPRS_AUTH_METHOD_PAP,
+		.message_center = "foobar.mmsc:80",
+		.message_proxy = "mms.proxy.net",
+	},
+};
+
+static const struct provision_db_entry zyx_contexts[] = {
+	{
+		.name = "ZYX",
+		.apn = "zyx",
+		.type = OFONO_GPRS_CONTEXT_TYPE_INTERNET |
+			OFONO_GPRS_CONTEXT_TYPE_IA,
+		.auth_method = OFONO_GPRS_AUTH_METHOD_NONE,
+		.proto = OFONO_GPRS_PROTO_IP,
+	},
+};
+
+static const struct provision_db_entry beta_contexts[] = {
+	{
+		.type = OFONO_GPRS_CONTEXT_TYPE_INTERNET |
+			OFONO_GPRS_CONTEXT_TYPE_IA,
+		.proto = OFONO_GPRS_PROTO_IPV4V6,
+		.apn = "beta.internet",
+		.auth_method = OFONO_GPRS_AUTH_METHOD_CHAP,
+	},
+};
+
+static const struct provision_db_entry charlie_contexts[] = {
+	{
+		.type = OFONO_GPRS_CONTEXT_TYPE_INTERNET |
+			OFONO_GPRS_CONTEXT_TYPE_IA,
+		.proto = OFONO_GPRS_PROTO_IPV4V6,
+		.apn = "charlie.internet",
+		.auth_method = OFONO_GPRS_AUTH_METHOD_CHAP,
+	},
+};
+
+static const struct provision_db_entry xyz_contexts[] = {
+	{
+		.type = OFONO_GPRS_CONTEXT_TYPE_INTERNET |
+			OFONO_GPRS_CONTEXT_TYPE_IA,
+		.proto = OFONO_GPRS_PROTO_IPV4V6,
+		.apn = "xyz",
+		.auth_method = OFONO_GPRS_AUTH_METHOD_CHAP,
+	}
+};
+
+/* Make sure mccmnc not in the database isn't found */
+static const struct provision_test unknown_mcc_mnc = {
+	.mcc = "994",
+	.mnc = "42",
+	.result = -ENOENT,
+};
+
+/* Successful lookup of 'Operator Beta' settings */
+static const struct provision_test lookup_beta = {
+	.mcc = "999",
+	.mnc = "006",
+	.result = 0,
+	.n_items = L_ARRAY_SIZE(beta_contexts),
+	.items = beta_contexts,
+};
+
+/* Make sure two digit mnc is treated as != to 3 digit mnc */
+static const struct provision_test two_digit_mnc = {
+	.mcc = "999",
+	.mnc = "06",
+	.result = -ENOENT,
+};
+
+/*
+ * Fallback to non-MVNO settings in case SPN doesn't match and an operator with
+ * no SPN is found.  This follows legacy oFono behavior and allows provisioning
+ * to work on modem drivers that do not support EFspn reading.
+ */
+static const struct provision_test fallback_no_spn = {
+	.mcc = "999",
+	.mnc = "005",
+	.spn = "Bogus",
+	.result = 0,
+	.n_items = L_ARRAY_SIZE(beta_contexts),
+	.items = beta_contexts,
+};
+
+/* Same as above, but with an MVNO entry for the same mcc/mnc */
+static const struct provision_test fallback_no_spn_2 = {
+	.mcc = "999",
+	.mnc = "002",
+	.spn = "Bogus",
+	.result = 0,
+	.n_items = L_ARRAY_SIZE(alpha_contexts),
+	.items = alpha_contexts,
+};
+
+/* Successful lookup of Operator Alpha */
+static const struct provision_test lookup_alpha = {
+	.mcc = "999",
+	.mnc = "001",
+	.result = 0,
+	.n_items = L_ARRAY_SIZE(alpha_contexts),
+	.items = alpha_contexts,
+};
+
+/* Successful lookup of ZYX (MVNO on Alpha) */
+static const struct provision_test lookup_zyx = {
+	.mcc = "999",
+	.mnc = "01",
+	.spn = "ZYX",
+	.result = 0,
+	.n_items = L_ARRAY_SIZE(zyx_contexts),
+	.items = zyx_contexts,
+};
+
+/*
+ * Successful lookup of Charlie.  This has to be an exact SPN match since
+ * no wildcard value is available
+ */
+static const struct provision_test lookup_charlie = {
+	.mcc = "999",
+	.mnc = "10",
+	.spn = "Charlie",
+	.result = 0,
+	.n_items = L_ARRAY_SIZE(charlie_contexts),
+	.items = charlie_contexts,
+};
+
+/* Successful lookup of XYZ (MVNO on Charlie) */
+static const struct provision_test lookup_xyz = {
+	.mcc = "999",
+	.mnc = "11",
+	.spn = "XYZ",
+	.result = 0,
+	.n_items = L_ARRAY_SIZE(xyz_contexts),
+	.items = xyz_contexts,
+};
+
+/* No match with for an MCC/MNC present in the DB, but no wildcard entry */
+static const struct provision_test lookup_no_match = {
+	.mcc = "999",
+	.mnc = "11",
+	.result = -ENOENT,
+};
+
+static void provision_lookup(const void *data)
+{
+	const struct provision_test *test = data;
+	struct provision_db_entry *items;
+	size_t n_items;
+	size_t i;
+	int r;
+
+	r = provision_db_lookup(pdb, test->mcc, test->mnc, test->spn,
+					&items, &n_items);
+	assert(r == test->result);
+
+	if (r < 0)
+		return;
+
+	assert(n_items == test->n_items);
+	for (i = 0; i < n_items; i++) {
+		const struct provision_db_entry *a = items + i;
+		const struct provision_db_entry *b = test->items + i;
+
+		assert(b->type == a->type);
+		assert(b->proto == a->proto);
+		assert(l_streq0(b->apn, a->apn));
+		assert(l_streq0(b->name, a->name));
+		assert(l_streq0(b->username, a->username));
+		assert(l_streq0(b->password, a->password));
+		assert(b->auth_method == a->auth_method);
+		assert(l_streq0(b->message_proxy, a->message_proxy));
+		assert(l_streq0(b->message_center, a->message_center));
+	}
+
+	l_free(items);
+}
+
+int main(int argc, char **argv)
+{
+	int r;
+
+	l_test_init(&argc, &argv);
+
+	l_test_add("Lookup on NULL provision db", null_provision_db, NULL);
+	l_test_add("MCC/MNC input validation", invalid_mcc_mnc, NULL);
+	l_test_add("Unknown MCC/MNC", provision_lookup, &unknown_mcc_mnc);
+	l_test_add("Successful Lookup (Beta)", provision_lookup, &lookup_beta);
+	l_test_add("Two digit MNC", provision_lookup, &two_digit_mnc);
+	l_test_add("Fallback no-SPN", provision_lookup, &fallback_no_spn);
+	l_test_add("Fallback no-SPN#2", provision_lookup, &fallback_no_spn_2);
+	l_test_add("Successful lookup (Alpha)", provision_lookup, &lookup_alpha);
+	l_test_add("Successful lookup (ZYX)", provision_lookup, &lookup_zyx);
+	l_test_add("Exact match (Charlie)", provision_lookup, &lookup_charlie);
+	l_test_add("Exact match (XYZ)", provision_lookup, &lookup_xyz);
+	l_test_add("Exact math (no match)", provision_lookup, &lookup_no_match);
+
+	pdb = provision_db_new(UNITDIR "test-provision.db");
+	assert(pdb);
+
+	r = l_test_run();
+	provision_db_free(pdb);
+
+	return r;
+}
diff --git a/unit/test-provision.json b/unit/test-provision.json
new file mode 100644
index 00000000..61d060ad
--- /dev/null
+++ b/unit/test-provision.json
@@ -0,0 +1,92 @@
+[
+  {
+    "name": "Operator Alpha",
+    "ids": [
+      "99955", "99956", "99901", "99902", "999001", "999002", "999056", "999055"
+    ],
+    "apns": [
+      {
+        "name": "Internet",
+        "apn": "internet",
+        "type": [
+          "internet"
+        ],
+        "authentication": "none",
+        "protocol": "ipv4"
+      },
+      {
+        "name": "IMS+MMS",
+        "apn": "imsmms",
+        "type": [
+          "ims", "mms", "ia"
+        ],
+        "mmsc": "foobar.mmsc:80",
+        "mmsproxy": "mms.proxy.net",
+        "authentication": "pap",
+        "protocol": "ipv6"
+      }
+    ]
+  },
+  {
+    "name": "ZYX (MVNO on Alpha)",
+    "ids": [
+      "999001", "999002", "99901", "99902"
+    ],
+    "spn": "ZYX",
+    "apns": [
+      {
+        "name": "ZYX",
+        "apn": "zyx",
+        "type": [
+          "internet", "ia"
+        ],
+        "authentication": "none",
+        "protocol": "ipv4"
+      }
+    ]
+  },
+  {
+    "name": "Operator Beta",
+    "ids": [
+      "999005", "999006"
+    ],
+    "apns": [
+      {
+        "apn": "beta.internet",
+        "type": [
+          "internet", "ia"
+        ]
+      }
+    ]
+  },
+  {
+    "name": "Operator Charlie",
+    "ids": [
+      "99910", "99911"
+    ],
+    "spn": "Charlie",
+    "apns": [
+      {
+        "apn": "charlie.internet",
+        "type": [
+          "internet", "ia"
+        ]
+      }
+    ]
+  },
+  {
+    "name": "XYZ (MVNO on Charlie)",
+    "ids": [
+      "99911"
+    ],
+    "spn": "XYZ",
+    "apns": [
+      {
+        "apn": "xyz",
+        "type": [
+          "internet", "ia"
+        ]
+      }
+    ]
+  }
+]
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/4] core: Remove unused declarations from ofono.h
  2024-01-24 21:12 [PATCH 1/4] core: Remove unused declarations from ofono.h Denis Kenzior
                   ` (2 preceding siblings ...)
  2024-01-24 21:13 ` [PATCH 4/4] unit: Add provisioning database tests Denis Kenzior
@ 2024-01-25 22:40 ` patchwork-bot+ofono
  3 siblings, 0 replies; 5+ messages in thread
From: patchwork-bot+ofono @ 2024-01-25 22:40 UTC (permalink / raw)
  To: Denis Kenzior; +Cc: ofono

Hello:

This series was applied to ofono.git (master)
by Denis Kenzior <denkenz@gmail.com>:

On Wed, 24 Jan 2024 15:12:59 -0600 you wrote:
> Fixes: 36a11599 ("gprs-provision: Remove no longer used atom/driver")
> ---
>  src/ofono.h | 8 --------
>  1 file changed, 8 deletions(-)

Here is the summary with links:
  - [1/4] core: Remove unused declarations from ofono.h
    https://git.kernel.org/pub/scm/network/ofono/ofono.git/?id=aaff4978a495
  - [2/4] provision: Remove use of ofono_gprs_provision_data
    https://git.kernel.org/pub/scm/network/ofono/ofono.git/?id=b4cf3298dea2
  - [3/4] gprs: Add some additional context types
    https://git.kernel.org/pub/scm/network/ofono/ofono.git/?id=e6a08a1098b0
  - [4/4] unit: Add provisioning database tests
    https://git.kernel.org/pub/scm/network/ofono/ofono.git/?id=f1999cff1c7e

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-01-25 22:40 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-24 21:12 [PATCH 1/4] core: Remove unused declarations from ofono.h Denis Kenzior
2024-01-24 21:13 ` [PATCH 2/4] provision: Remove use of ofono_gprs_provision_data Denis Kenzior
2024-01-24 21:13 ` [PATCH 3/4] gprs: Add some additional context types Denis Kenzior
2024-01-24 21:13 ` [PATCH 4/4] unit: Add provisioning database tests Denis Kenzior
2024-01-25 22:40 ` [PATCH 1/4] core: Remove unused declarations from ofono.h patchwork-bot+ofono

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).