---
src/gprs.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/src/gprs.c b/src/gprs.c
index 344915c..116074a 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -177,6 +177,8 @@ 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_IA:
+ return "IA";
}
return NULL;
@@ -196,6 +198,8 @@ static const char *gprs_context_type_to_string(
return "wap";
case OFONO_GPRS_CONTEXT_TYPE_IMS:
return "ims";
+ case OFONO_GPRS_CONTEXT_TYPE_IA:
+ return "ia";
}
return NULL;
@@ -216,6 +220,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, "ia")) {
+ *out = OFONO_GPRS_CONTEXT_TYPE_IA;
+ return TRUE;
}
return FALSE;
@@ -3159,6 +3166,60 @@ remove:
storage_sync(imsi, SETTINGS_STORE, gprs->settings);
}
+static struct pri_context *gprs_context_for_ia(struct ofono_gprs *gprs)
+{
+ GSList *l;
+ struct pri_context *ctx_inet = NULL;
+
+ for (l = gprs->contexts; l; l = l->next) {
+ struct pri_context *ctx = l->data;
+
+ if (ctx->type == OFONO_GPRS_CONTEXT_TYPE_IA)
+ return ctx;
+ else if (ctx->type == OFONO_GPRS_CONTEXT_TYPE_INTERNET
+ && ctx_inet == NULL)
+ ctx_inet = ctx;
+ }
+
+ if (ctx_inet != NULL)
+ return ctx_inet;
+
+ if (gprs->contexts == NULL)
+ return NULL;
+
+ return gprs->contexts->data;
+}
+
+static void set_ia_apn_cb(const struct ofono_error *error, void *data)
+{
+ if (error->type != OFONO_ERROR_TYPE_NO_ERROR)
+ ofono_error("Could not set IA APN");
+}
+
+static void set_ia_apn(struct ofono_gprs *gprs)
+{
+ struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
+ struct ofono_sim *sim = __ofono_atom_find(OFONO_ATOM_TYPE_SIM, modem);
+ struct pri_context *ctx = gprs_context_for_ia(gprs);
+ struct ofono_gprs_primary_context *ofono_ctx;
+ char mccmnc[OFONO_MAX_MCC_LENGTH + OFONO_MAX_MNC_LENGTH + 1];
+ const char *mcc = ofono_sim_get_mcc(sim);
+ const char *mnc = ofono_sim_get_mnc(sim);
+
+ if (ctx == NULL)
+ return;
+
+ ofono_ctx = &ctx->context;
+
+ strcpy(mccmnc, mcc);
+ strcpy(mccmnc + strlen(mcc), mnc);
+
+ gprs->driver->set_ia_apn(gprs, ofono_ctx->apn, ofono_ctx->proto,
+ ofono_ctx->username,
+ ofono_ctx->password, mccmnc,
+ set_ia_apn_cb, gprs);
+}
+
static void ofono_gprs_finish_register(struct ofono_gprs *gprs)
{
DBusConnection *conn = ofono_dbus_get_connection();
@@ -3168,6 +3229,9 @@ static void ofono_gprs_finish_register(struct ofono_gprs *gprs)
if (gprs->contexts == NULL) /* Automatic provisioning failed */
add_context(gprs, NULL, OFONO_GPRS_CONTEXT_TYPE_INTERNET);
+ if (gprs->driver->set_ia_apn)
+ set_ia_apn(gprs);
+
if (!g_dbus_register_interface(conn, path,
OFONO_CONNECTION_MANAGER_INTERFACE,
manager_methods, manager_signals, NULL,
--
2.5.0