Hi Oleg, > +static int gprs_provision(const char *mcc, const char *mnc, > + const char *spn, > + struct ofono_gprs_provision_data **settings, > + int *count) > +{ > + int i; > + struct parser_data *data; > + *settings = NULL; > + > + DBG("Provisioning for MCC %s, MNC %s, SPN '%s'", > + mcc, mnc, spn); > + > + data = g_try_new0(struct parser_data, 1); > + if (data == NULL) > + return -ENOMEM; > + > + lookup_apn(mcc, mnc, NULL, data); What I wonder is what is the overhead of the XML parser right now (e.g. how long it takes on reasonable embedded hardware). If this takes a while, then it might be better to pre-parse the mobile-provider-info db during plugin initialization and not every time gprs_provision is called. Otherwise we run the risk of hanging the daemon while the provision settings are being looked up. > + > + *count = data->count; > + > + DBG("settings count: %d", *count); > + > + if (!*count) { > + g_free(data); > + return -ENOENT; > + } > + > + *settings = g_try_new0(struct ofono_gprs_provision_data, *count); > + if (*settings == NULL) > + return -ENOMEM; > + > + for (i = 0; i < *count; i++) { > + (*settings)[i] = *(data->settings[i]); > + > + (*settings)[i].proto = OFONO_GPRS_PROTO_IP; > + (*settings)[i].type = OFONO_GPRS_CONTEXT_TYPE_INTERNET; > + > + DBG("Name: %s", (*settings)[i].name); > + DBG("APN: %s", (*settings)[i].apn); > + DBG("Username: %s", (*settings)[i].username); > + DBG("Password: %s", (*settings)[i].password); > + } > + > + g_free(data); > + > + return 0; > +} > + Regards, -Denis