broadband-bearer: derive PDP type from the ip-type bearer property

This patch makes it possible to use MM to set up PDP contexts with
PDP types other than 'IP', which is particularly useful when trying
to use the 'IPV6' or 'IPV4V6' PDP types defined in recent 3GPP specs.

If ip-type isn't specified, 'IP' will be used by default, due to the
fact that modem support for the 'IPV4V6' type is still rather scarce.

The patch applies to Aleksander's 'bearer-properties' branch. It has
been tested using mmcli in this fashion:

mmcli -m 0 --simple-connect=apn=internet # default to 'IP'
mmcli -m 0 --simple-connect=apn=internet,ip-type=IP
mmcli -m 0 --simple-connect=apn=internet,ip-type=IPV6
mmcli -m 0 --simple-connect=apn=internet,ip-type=IPV4V6
This commit is contained in:
Tore Anderson
2012-04-13 23:29:17 +02:00
committed by Aleksander Morgado
parent caeeae2721
commit 6b9ee7c833
2 changed files with 14 additions and 7 deletions

View File

@@ -473,6 +473,13 @@ mm_bearer_properties_init (MMBearerProperties *self)
/* Some defaults */
self->priv->allow_roaming = TRUE;
self->priv->rm_protocol = MM_MODEM_CDMA_RM_PROTOCOL_UNKNOWN;
/* At some point in the future, this default should probably be changed
* to IPV4V6. However, presently support for this PDP type is rare. An
* even better approach would likely be to query which PDP types the
* modem supports (using AT+CGDCONT=?), and set the default accordingly
*/
self->priv->ip_type = g_strdup ("IP");
}
static void

View File

@@ -758,8 +758,9 @@ find_cid_ready (MMBaseModem *modem,
/* Initialize PDP context with our APN */
ctx->cid = g_variant_get_uint32 (result);
command = g_strdup_printf ("+CGDCONT=%u,\"IP\",\"%s\"",
command = g_strdup_printf ("+CGDCONT=%u,\"%s\",\"%s\"",
ctx->cid,
mm_bearer_properties_get_ip_type (mm_bearer_peek_config (MM_BEARER (ctx->self))),
mm_bearer_properties_get_apn (mm_bearer_peek_config (MM_BEARER (ctx->self))));
mm_base_modem_at_command_full (ctx->modem,
ctx->primary,
@@ -818,8 +819,7 @@ parse_cid_range (MMBaseModem *modem,
pdp_type = g_match_info_fetch (match_info, 3);
/* TODO: What about PDP contexts of type "IPV6"? */
if (g_str_equal (pdp_type, "IP")) {
if (g_str_equal (pdp_type, mm_bearer_properties_get_ip_type (mm_bearer_peek_config (MM_BEARER (ctx->self))))) {
gchar *max_cid_range_str;
guint max_cid_range;
@@ -905,7 +905,7 @@ parse_pdp_list (MMBaseModem *modem,
pdp->cid,
pdp->pdp_type ? pdp->pdp_type : "",
pdp->apn ? pdp->apn : "");
if (g_str_equal (pdp->pdp_type, "IP")) {
if (g_str_equal (pdp->pdp_type, mm_bearer_properties_get_ip_type (mm_bearer_peek_config (MM_BEARER (ctx->self))))) {
/* PDP with no APN set? we may use that one if not exact match found */
if (!pdp->apn || !pdp->apn[0]) {
mm_dbg ("Found PDP context with CID %u and no APN",
@@ -917,9 +917,9 @@ parse_pdp_list (MMBaseModem *modem,
apn = mm_bearer_properties_get_apn (mm_bearer_peek_config (MM_BEARER (ctx->self)));
if (apn &&
g_str_equal (pdp->apn, apn)) {
/* Found a PDP context with the same CID, we'll use it. */
mm_dbg ("Found PDP context with CID %u for APN '%s'",
pdp->cid, pdp->apn);
/* Found a PDP context with the same CID and PDP type, we'll use it. */
mm_dbg ("Found PDP context with CID %u and PDP type %s for APN '%s'",
pdp->cid, pdp->pdp_type, pdp->apn);
cid = pdp->cid;
/* In this case, stop searching */
break;