broadband-bearer: don't create PDP context when using an existing one (bgo #701151)

If the context is already defined, then we can just use it instead
of calling +CGDCONT to create it again.  Modems don't like this,
plus it's pointless.

https://bugzilla.gnome.org/show_bug.cgi?id=701151
This commit is contained in:
Dan Williams
2013-05-28 15:06:59 -05:00
committed by Aleksander Morgado
parent ba14d15df3
commit 67d3ed11d3

View File

@@ -85,6 +85,7 @@ typedef struct {
/* 3GPP-specific */
guint cid;
guint max_cid;
gboolean use_existing_cid;
MMBearerIpFamily ip_family;
} DetailedConnectContext;
@@ -724,6 +725,21 @@ dial_3gpp_ready (MMBroadbandModem *modem,
g_object_unref (config);
}
static void
start_3gpp_dial (DetailedConnectContext *ctx)
{
/* Keep CID around after initializing the PDP context in order to
* handle corresponding unsolicited PDP activation responses. */
ctx->self->priv->cid = ctx->cid;
MM_BROADBAND_BEARER_GET_CLASS (ctx->self)->dial_3gpp (ctx->self,
ctx->modem,
ctx->primary,
ctx->cid,
ctx->cancellable,
(GAsyncReadyCallback)dial_3gpp_ready,
ctx);
}
static void
initialize_pdp_context_ready (MMBaseModem *modem,
GAsyncResult *res,
@@ -744,16 +760,7 @@ initialize_pdp_context_ready (MMBaseModem *modem,
return;
}
/* Keep CID around after initializing the PDP context in order to
* handle corresponding unsolicited PDP activation responses. */
ctx->self->priv->cid = ctx->cid;
MM_BROADBAND_BEARER_GET_CLASS (ctx->self)->dial_3gpp (ctx->self,
ctx->modem,
ctx->primary,
ctx->cid,
ctx->cancellable,
(GAsyncReadyCallback)dial_3gpp_ready,
ctx);
start_3gpp_dial (ctx);
}
static void
@@ -780,7 +787,6 @@ find_cid_ready (MMBaseModem *modem,
if (detailed_connect_context_complete_and_free_if_cancelled (ctx))
return;
/* Initialize PDP context with our APN */
pdp_type = mm_3gpp_get_pdp_type_from_ip_family (ctx->ip_family);
if (!pdp_type) {
g_simple_async_result_set_error (ctx->result,
@@ -790,8 +796,15 @@ find_cid_ready (MMBaseModem *modem,
detailed_connect_context_complete_and_free (ctx);
return;
}
ctx->cid = g_variant_get_uint32 (result);
/* If there's already a PDP context defined, just use it */
if (ctx->use_existing_cid) {
start_3gpp_dial (ctx);
return;
}
/* Otherwise, initialize a new PDP context with our APN */
apn = mm_at_serial_port_quote_string (mm_bearer_properties_get_apn (mm_bearer_peek_config (MM_BEARER (ctx->self))));
command = g_strdup_printf ("+CGDCONT=%u,\"%s\",%s",
ctx->cid,
@@ -966,6 +979,7 @@ parse_pdp_list (MMBaseModem *modem,
mm_dbg ("Found PDP context with CID %u and PDP type %s for APN '%s'",
pdp->cid, mm_bearer_ip_family_get_string (pdp->pdp_type), pdp->apn);
cid = pdp->cid;
ctx->use_existing_cid = TRUE;
/* In this case, stop searching */
break;
}