mirror of git://git.sysmocom.de/ofono
gprs,gprs-provision: add SPN to provisioning API
This commit is contained in:
parent
ef37b3fe42
commit
7243af46fa
|
@ -48,7 +48,7 @@ void __ofono_gprs_provision_free_settings(
|
||||||
}
|
}
|
||||||
|
|
||||||
ofono_bool_t __ofono_gprs_provision_get_settings(const char *mcc,
|
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,
|
struct ofono_gprs_provision_data **settings,
|
||||||
int *count)
|
int *count)
|
||||||
{
|
{
|
||||||
|
@ -65,7 +65,7 @@ ofono_bool_t __ofono_gprs_provision_get_settings(const char *mcc,
|
||||||
|
|
||||||
DBG("Calling provisioning plugin '%s'", driver->name);
|
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;
|
continue;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
87
src/gprs.c
87
src/gprs.c
|
@ -97,6 +97,7 @@ struct ofono_gprs {
|
||||||
const struct ofono_gprs_driver *driver;
|
const struct ofono_gprs_driver *driver;
|
||||||
void *driver_data;
|
void *driver_data;
|
||||||
struct ofono_atom *atom;
|
struct ofono_atom *atom;
|
||||||
|
struct ofono_sim_context *sim_context;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ofono_gprs_context {
|
struct ofono_gprs_context {
|
||||||
|
@ -2291,6 +2292,9 @@ static void gprs_remove(struct ofono_atom *atom)
|
||||||
if (gprs->driver && gprs->driver->remove)
|
if (gprs->driver && gprs->driver->remove)
|
||||||
gprs->driver->remove(gprs);
|
gprs->driver->remove(gprs);
|
||||||
|
|
||||||
|
if (gprs->sim_context)
|
||||||
|
ofono_sim_context_free(gprs->sim_context);
|
||||||
|
|
||||||
g_free(gprs);
|
g_free(gprs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2629,14 +2633,14 @@ static void provision_context(const struct ofono_gprs_provision_data *ap,
|
||||||
gprs->contexts = g_slist_append(gprs->contexts, context);
|
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;
|
struct ofono_gprs_provision_data *settings;
|
||||||
int count;
|
int count;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (__ofono_gprs_provision_get_settings(ofono_sim_get_mcc(sim),
|
if (__ofono_gprs_provision_get_settings(mcc, mnc, spn,
|
||||||
ofono_sim_get_mnc(sim),
|
|
||||||
&settings, &count) == FALSE) {
|
&settings, &count) == FALSE) {
|
||||||
ofono_warn("Provisioning failed");
|
ofono_warn("Provisioning failed");
|
||||||
return;
|
return;
|
||||||
|
@ -2648,13 +2652,15 @@ static void provision_contexts(struct ofono_gprs *gprs, struct ofono_sim *sim)
|
||||||
__ofono_gprs_provision_free_settings(settings, count);
|
__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();
|
DBusConnection *conn = ofono_dbus_get_connection();
|
||||||
struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
|
struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
|
||||||
const char *path = __ofono_atom_get_path(gprs->atom);
|
const char *path = __ofono_atom_get_path(gprs->atom);
|
||||||
struct ofono_atom *netreg_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,
|
if (!g_dbus_register_interface(conn, path,
|
||||||
OFONO_CONNECTION_MANAGER_INTERFACE,
|
OFONO_CONNECTION_MANAGER_INTERFACE,
|
||||||
|
@ -2663,29 +2669,13 @@ void ofono_gprs_register(struct ofono_gprs *gprs)
|
||||||
ofono_error("Could not create %s interface",
|
ofono_error("Could not create %s interface",
|
||||||
OFONO_CONNECTION_MANAGER_INTERFACE);
|
OFONO_CONNECTION_MANAGER_INTERFACE);
|
||||||
|
|
||||||
|
gprs_unregister(gprs->atom);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ofono_modem_add_interface(modem,
|
ofono_modem_add_interface(modem,
|
||||||
OFONO_CONNECTION_MANAGER_INTERFACE);
|
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,
|
gprs->netreg_watch = __ofono_modem_add_atom_watch(modem,
|
||||||
OFONO_ATOM_TYPE_NETREG,
|
OFONO_ATOM_TYPE_NETREG,
|
||||||
netreg_watch, gprs, NULL);
|
netreg_watch, gprs, NULL);
|
||||||
|
@ -2699,6 +2689,59 @@ void ofono_gprs_register(struct ofono_gprs *gprs)
|
||||||
__ofono_atom_register(gprs->atom, gprs_unregister);
|
__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)
|
void ofono_gprs_remove(struct ofono_gprs *gprs)
|
||||||
{
|
{
|
||||||
__ofono_atom_free(gprs->atom);
|
__ofono_atom_free(gprs->atom);
|
||||||
|
|
|
@ -429,7 +429,7 @@ void __ofono_nettime_info_received(struct ofono_modem *modem,
|
||||||
|
|
||||||
#include <ofono/gprs-provision.h>
|
#include <ofono/gprs-provision.h>
|
||||||
ofono_bool_t __ofono_gprs_provision_get_settings(const char *mcc,
|
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,
|
struct ofono_gprs_provision_data **settings,
|
||||||
int *count);
|
int *count);
|
||||||
void __ofono_gprs_provision_free_settings(
|
void __ofono_gprs_provision_free_settings(
|
||||||
|
|
Loading…
Reference in New Issue