Open Source Telephony
 help / color / mirror / Atom feed
* [PATCH 0/3] gprs-provision: Add SPN to provision API
@ 2011-02-08 10:03 Jukka Saunamaki
  2011-02-08 10:03 ` [PATCH 1/3] gprs-provision: add SPN to provisioning API header Jukka Saunamaki
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Jukka Saunamaki @ 2011-02-08 10:03 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 677 bytes --]

Hello

This patchset adds Service Provider Name (SPN) into GPRS context provisioning API.
SPN is read (asynchronously) in the middle of gprs atom registration, if provisioning is needed.

--Jukka

Jukka Saunamaki (3):
      gprs-provision: add SPN to provisioning API header
      gprs,gprs-provision: add SPN to provisioning API
      gprs-provision: update example with SPN

 examples/provision.c     |    8 +++--
 include/gprs-provision.h |    2 +-
 src/gprs-provision.c     |    4 +-
 src/gprs.c               |   87 ++++++++++++++++++++++++++++++++++-----------
 src/ofono.h              |    2 +-
 5 files changed, 74 insertions(+), 29 deletions(-)



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

* [PATCH 1/3] gprs-provision: add SPN to provisioning API header
  2011-02-08 10:03 [PATCH 0/3] gprs-provision: Add SPN to provision API Jukka Saunamaki
@ 2011-02-08 10:03 ` Jukka Saunamaki
  2011-02-08 10:03 ` [PATCH 2/3] gprs,gprs-provision: add SPN to provisioning API Jukka Saunamaki
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Jukka Saunamaki @ 2011-02-08 10:03 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 607 bytes --]

---
 include/gprs-provision.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/include/gprs-provision.h b/include/gprs-provision.h
index bc021a8..e9eec61 100644
--- a/include/gprs-provision.h
+++ b/include/gprs-provision.h
@@ -42,7 +42,7 @@ struct ofono_gprs_provision_data {
 struct ofono_gprs_provision_driver {
 	const char *name;
 	int priority;
-	int (*get_settings)(const char *mcc, const char *mnc,
+	int (*get_settings)(const char *mcc, const char *mnc, const char *spn,
 				struct ofono_gprs_provision_data **settings,
 				int *count);
 };
-- 
1.7.1


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

* [PATCH 2/3] gprs,gprs-provision: add SPN to provisioning API
  2011-02-08 10:03 [PATCH 0/3] gprs-provision: Add SPN to provision API Jukka Saunamaki
  2011-02-08 10:03 ` [PATCH 1/3] gprs-provision: add SPN to provisioning API header Jukka Saunamaki
@ 2011-02-08 10:03 ` Jukka Saunamaki
  2011-02-08 10:03 ` [PATCH 3/3] gprs-provision: update example with SPN Jukka Saunamaki
  2011-02-09  3:58 ` [PATCH 0/3] gprs-provision: Add SPN to provision API Denis Kenzior
  3 siblings, 0 replies; 5+ messages in thread
From: Jukka Saunamaki @ 2011-02-08 10:03 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 5986 bytes --]

---
 src/gprs-provision.c |    4 +-
 src/gprs.c           |   87 +++++++++++++++++++++++++++++++++++++------------
 src/ofono.h          |    2 +-
 3 files changed, 68 insertions(+), 25 deletions(-)

diff --git a/src/gprs-provision.c b/src/gprs-provision.c
index 3cd84e8..011d5a8 100644
--- a/src/gprs-provision.c
+++ b/src/gprs-provision.c
@@ -48,7 +48,7 @@ void  __ofono_gprs_provision_free_settings(
 }
 
 ofono_bool_t __ofono_gprs_provision_get_settings(const char *mcc,
-				const char *mnc,
+				const char *mnc, const char *spn,
 				struct ofono_gprs_provision_data **settings,
 				int *count)
 {
@@ -65,7 +65,7 @@ ofono_bool_t __ofono_gprs_provision_get_settings(const char *mcc,
 
 		DBG("Calling provisioning plugin '%s'", driver->name);
 
-		if (driver->get_settings(mcc, mnc, settings, count) < 0)
+		if (driver->get_settings(mcc, mnc, spn, settings, count) < 0)
 			continue;
 
 		return TRUE;
diff --git a/src/gprs.c b/src/gprs.c
index 5ea864c..bb1b173 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -97,6 +97,7 @@ struct ofono_gprs {
 	const struct ofono_gprs_driver *driver;
 	void *driver_data;
 	struct ofono_atom *atom;
+	struct ofono_sim_context *sim_context;
 };
 
 struct ofono_gprs_context {
@@ -2291,6 +2292,9 @@ static void gprs_remove(struct ofono_atom *atom)
 	if (gprs->driver && gprs->driver->remove)
 		gprs->driver->remove(gprs);
 
+	if (gprs->sim_context)
+		ofono_sim_context_free(gprs->sim_context);
+
 	g_free(gprs);
 }
 
@@ -2627,14 +2631,14 @@ static void provision_context(const struct ofono_gprs_provision_data *ap,
 	gprs->contexts = g_slist_append(gprs->contexts, context);
 }
 
-static void provision_contexts(struct ofono_gprs *gprs, struct ofono_sim *sim)
+static void provision_contexts(struct ofono_gprs *gprs, const char *mcc,
+				const char *mnc, const char *spn)
 {
 	struct ofono_gprs_provision_data *settings;
 	int count;
 	int i;
 
-	if (__ofono_gprs_provision_get_settings(ofono_sim_get_mcc(sim),
-						ofono_sim_get_mnc(sim),
+	if (__ofono_gprs_provision_get_settings(mcc, mnc, spn,
 						&settings, &count) == FALSE) {
 		ofono_warn("Provisioning failed");
 		return;
@@ -2646,13 +2650,15 @@ static void provision_contexts(struct ofono_gprs *gprs, struct ofono_sim *sim)
 	__ofono_gprs_provision_free_settings(settings, count);
 }
 
-void ofono_gprs_register(struct ofono_gprs *gprs)
+static void ofono_gprs_finish_register(struct ofono_gprs *gprs)
 {
 	DBusConnection *conn = ofono_dbus_get_connection();
 	struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
 	const char *path = __ofono_atom_get_path(gprs->atom);
 	struct ofono_atom *netreg_atom;
-	struct ofono_atom *sim_atom;
+
+	if (gprs->contexts == NULL) /* Automatic provisioning failed */
+		add_context(gprs, NULL, OFONO_GPRS_CONTEXT_TYPE_INTERNET);
 
 	if (!g_dbus_register_interface(conn, path,
 					OFONO_CONNECTION_MANAGER_INTERFACE,
@@ -2661,29 +2667,13 @@ void ofono_gprs_register(struct ofono_gprs *gprs)
 		ofono_error("Could not create %s interface",
 				OFONO_CONNECTION_MANAGER_INTERFACE);
 
+		gprs_unregister(gprs->atom);
 		return;
 	}
 
 	ofono_modem_add_interface(modem,
 				OFONO_CONNECTION_MANAGER_INTERFACE);
 
-	sim_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM);
-
-	if (sim_atom) {
-		const char *imsi;
-		struct ofono_sim *sim = __ofono_atom_get_data(sim_atom);
-
-		imsi = ofono_sim_get_imsi(sim);
-		gprs_load_settings(gprs, imsi);
-
-		if (gprs->contexts == NULL)
-			provision_contexts(gprs, sim);
-
-	}
-
-	if (gprs->contexts == NULL)
-		add_context(gprs, NULL, OFONO_GPRS_CONTEXT_TYPE_INTERNET);
-
 	gprs->netreg_watch = __ofono_modem_add_atom_watch(modem,
 					OFONO_ATOM_TYPE_NETREG,
 					netreg_watch, gprs, NULL);
@@ -2697,6 +2687,59 @@ void ofono_gprs_register(struct ofono_gprs *gprs)
 	__ofono_atom_register(gprs->atom, gprs_unregister);
 }
 
+static void sim_spn_read_cb(int ok, int length, int record,
+				const unsigned char *data,
+				int record_length, void *userdata)
+{
+	struct ofono_gprs *gprs	= userdata;
+	char *spn = NULL;
+	struct ofono_atom *sim_atom;
+	struct ofono_sim *sim = NULL;
+
+	if (ok)
+		spn = sim_string_to_utf8(data + 1, length - 1);
+
+	sim_atom = __ofono_modem_find_atom(__ofono_atom_get_modem(gprs->atom),
+						OFONO_ATOM_TYPE_SIM);
+	if (sim_atom) {
+		sim = __ofono_atom_get_data(sim_atom);
+		provision_contexts(gprs, ofono_sim_get_mcc(sim),
+					ofono_sim_get_mnc(sim), spn);
+	}
+
+	g_free(spn);
+	ofono_gprs_finish_register(gprs);
+}
+
+void ofono_gprs_register(struct ofono_gprs *gprs)
+{
+	struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
+	struct ofono_atom *sim_atom;
+	struct ofono_sim *sim = NULL;
+
+	sim_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM);
+
+	if (sim_atom) {
+		const char *imsi;
+		sim = __ofono_atom_get_data(sim_atom);
+
+		imsi = ofono_sim_get_imsi(sim);
+		gprs_load_settings(gprs, imsi);
+	}
+
+	if (gprs->contexts == NULL && sim != NULL) {
+		/* Get Service Provider Name from SIM for provisioning */
+		gprs->sim_context = ofono_sim_context_create(sim);
+
+		if (ofono_sim_read(gprs->sim_context, SIM_EFSPN_FILEID,
+				OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
+					sim_spn_read_cb, gprs) >= 0)
+			return;
+	}
+
+	ofono_gprs_finish_register(gprs);
+}
+
 void ofono_gprs_remove(struct ofono_gprs *gprs)
 {
 	__ofono_atom_free(gprs->atom);
diff --git a/src/ofono.h b/src/ofono.h
index 6ba0187..0cdebf7 100644
--- a/src/ofono.h
+++ b/src/ofono.h
@@ -424,7 +424,7 @@ void __ofono_nettime_info_received(struct ofono_modem *modem,
 
 #include <ofono/gprs-provision.h>
 ofono_bool_t __ofono_gprs_provision_get_settings(const char *mcc,
-				const char *mnc,
+				const char *mnc, const char *spn,
 				struct ofono_gprs_provision_data **settings,
 				int *count);
 void __ofono_gprs_provision_free_settings(
-- 
1.7.1


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

* [PATCH 3/3] gprs-provision: update example with SPN
  2011-02-08 10:03 [PATCH 0/3] gprs-provision: Add SPN to provision API Jukka Saunamaki
  2011-02-08 10:03 ` [PATCH 1/3] gprs-provision: add SPN to provisioning API header Jukka Saunamaki
  2011-02-08 10:03 ` [PATCH 2/3] gprs,gprs-provision: add SPN to provisioning API Jukka Saunamaki
@ 2011-02-08 10:03 ` Jukka Saunamaki
  2011-02-09  3:58 ` [PATCH 0/3] gprs-provision: Add SPN to provision API Denis Kenzior
  3 siblings, 0 replies; 5+ messages in thread
From: Jukka Saunamaki @ 2011-02-08 10:03 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 1005 bytes --]

---
 examples/provision.c |    8 +++++---
 1 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/examples/provision.c b/examples/provision.c
index 356b0b3..546a161 100644
--- a/examples/provision.c
+++ b/examples/provision.c
@@ -37,6 +37,7 @@
 #include <ofono/log.h>
 
 static int example_provision_get_settings(const char *mcc, const char *mnc,
+				const char *spn,
 				struct ofono_gprs_provision_data **settings,
 				int *count)
 {
@@ -44,10 +45,11 @@ static int example_provision_get_settings(const char *mcc, const char *mnc,
 	*count = 0;
 	*settings = NULL;
 
-	ofono_debug("Finding settings for MCC %s, MNC %s",
-			mcc, mnc);
+	ofono_debug("Finding settings for MCC %s, MNC %s, SPN '%s'",
+			mcc, mnc, spn);
 
-	if (strcmp(mcc, "246") != 0 || strcmp(mnc, "81") != 0)
+	if (strcmp(mcc, "246") != 0 || strcmp(mnc, "81") != 0 ||
+						strcmp(spn, "oFono") != 0)
 		return -ENOENT;
 
 	ofono_debug("Creating example settings for phonesim");
-- 
1.7.1


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

* Re: [PATCH 0/3] gprs-provision: Add SPN to provision API
  2011-02-08 10:03 [PATCH 0/3] gprs-provision: Add SPN to provision API Jukka Saunamaki
                   ` (2 preceding siblings ...)
  2011-02-08 10:03 ` [PATCH 3/3] gprs-provision: update example with SPN Jukka Saunamaki
@ 2011-02-09  3:58 ` Denis Kenzior
  3 siblings, 0 replies; 5+ messages in thread
From: Denis Kenzior @ 2011-02-09  3:58 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 932 bytes --]

Hi Jukka,

On 02/08/2011 04:03 AM, Jukka Saunamaki wrote:
> Hello
> 
> This patchset adds Service Provider Name (SPN) into GPRS context provisioning API.
> SPN is read (asynchronously) in the middle of gprs atom registration, if provisioning is needed.
> 
> --Jukka
> 
> Jukka Saunamaki (3):
>       gprs-provision: add SPN to provisioning API header
>       gprs,gprs-provision: add SPN to provisioning API
>       gprs-provision: update example with SPN
> 
>  examples/provision.c     |    8 +++--
>  include/gprs-provision.h |    2 +-
>  src/gprs-provision.c     |    4 +-
>  src/gprs.c               |   87 ++++++++++++++++++++++++++++++++++-----------
>  src/ofono.h              |    2 +-
>  5 files changed, 74 insertions(+), 29 deletions(-)

All patches in this series have been applied, however I made one small
fix after patch 2.  Let me know if I broke anything by any chance.

Regards,
-Denis

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

end of thread, other threads:[~2011-02-09  3:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-02-08 10:03 [PATCH 0/3] gprs-provision: Add SPN to provision API Jukka Saunamaki
2011-02-08 10:03 ` [PATCH 1/3] gprs-provision: add SPN to provisioning API header Jukka Saunamaki
2011-02-08 10:03 ` [PATCH 2/3] gprs,gprs-provision: add SPN to provisioning API Jukka Saunamaki
2011-02-08 10:03 ` [PATCH 3/3] gprs-provision: update example with SPN Jukka Saunamaki
2011-02-09  3:58 ` [PATCH 0/3] gprs-provision: Add SPN to provision API Denis Kenzior

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox