<div dir="ltr"><div>Some modems with multiple PDN connection support (for example, Sierra Wireless MC7304) seem to require the usage of 3GPP(2) Configured Profile Identifier in order to successfully establish more than one active PDN connection. Trying to start a second connection with --wds-start-network="apn=xxx" typically leads to the termination of the first connection. Multiple connections are established as expected when using profile indexes, e.g.:</div><div><br></div><div># qmicli -d /dev/cdc-wdm0 --wds-start-network="3gpp-profile=1"</div><div><div># qmicli -d /dev/cdc-wdm1 --wds-start-network="3gpp-profile=2"</div></div><div><br></div><div>Note that  pre-configured profile indexes can be obtained using --wds-get-profile-list command or using 'AT+CGCONT?' AT command.</div><div><br></div><div>---</div><div> src/qmicli/qmicli-wds.c | 38 +++++++++++++++++++++++++++++++-------</div><div> 1 file changed, 31 insertions(+), 7 deletions(-)</div><div><br></div><div>diff --git a/src/qmicli/qmicli-wds.c b/src/qmicli/qmicli-wds.c</div><div>index 5e6979d..94835f9 100644</div><div>--- a/src/qmicli/qmicli-wds.c</div><div>+++ b/src/qmicli/qmicli-wds.c</div><div>@@ -67,7 +67,7 @@ static gboolean noop_flag;</div><div> </div><div> static GOptionEntry entries[] = {</div><div>     { "wds-start-network", 0, 0, G_OPTION_ARG_STRING, &start_network_str,</div><div>-      "Start network (allowed keys: apn, auth (PAP|CHAP|BOTH), username, password, autoconnect=yes)",</div><div>+      "Start network (allowed keys: apn, 3gpp-profile, 3gpp2-profile, auth (PAP|CHAP|BOTH), username, password, autoconnect=yes)",</div><div>       "[\"key=value,...\"]"</div><div>     },</div><div>     { "wds-follow-network", 0, 0, G_OPTION_ARG_NONE, &follow_network_flag,</div><div>@@ -332,6 +332,8 @@ packet_status_timeout (void)</div><div> </div><div> typedef struct {</div><div>     gchar                *apn;</div><div>+    guint8                profile_index_3gpp;</div><div>+    guint8                profile_index_3gpp2;</div><div>     QmiWdsAuthentication  auth;</div><div>     gboolean              auth_set;</div><div>     gchar                *username;</div><div>@@ -362,6 +364,16 @@ start_network_properties_handle (const gchar  *key,</div><div>         return TRUE;</div><div>     }</div><div> </div><div>+    if (g_ascii_strcasecmp (key, "3gpp_profile") == 0 && !props->profile_index_3gpp) {</div><div>+        props->profile_index_3gpp = atoi (value);</div><div>+        return TRUE;</div><div>+    }</div><div>+</div><div>+    if (g_ascii_strcasecmp (key, "3gpp_profile2") == 0 && !props->profile_index_3gpp2) {</div><div>+        props->profile_index_3gpp2 = atoi (value);</div><div>+        return TRUE;</div><div>+    }</div><div>+</div><div>     if (g_ascii_strcasecmp (key, "auth") == 0 && !props->auth_set) {</div><div>         if (!qmicli_read_authentication_from_string (value, &(props->auth))) {</div><div>             g_set_error (error,</div><div>@@ -413,11 +425,13 @@ start_network_input_create (const gchar *str)</div><div>     gchar **split = NULL;</div><div>     QmiMessageWdsStartNetworkInput *input = NULL;</div><div>     StartNetworkProperties props = {</div><div>-        .apn      = NULL,</div><div>-        .auth     = QMI_WDS_AUTHENTICATION_NONE,</div><div>-        .auth_set = FALSE,</div><div>-        .username = NULL,</div><div>-        .password = NULL,</div><div>+        .apn                 = NULL,</div><div>+        .profile_index_3gpp  = 0,</div><div>+        .profile_index_3gpp2 = 0,</div><div>+        .auth                = QMI_WDS_AUTHENTICATION_NONE,</div><div>+        .auth_set            = FALSE,</div><div>+        .username            = NULL,</div><div>+        .password            = NULL,</div><div>     };</div><div> </div><div>     /* An empty string is totally valid (i.e. no TLVs) */</div><div>@@ -465,6 +479,14 @@ start_network_input_create (const gchar *str)</div><div>     if (props.apn)</div><div>         qmi_message_wds_start_network_input_set_apn (input, props.apn, NULL);</div><div> </div><div>+    /* Set 3GPP profile */</div><div>+    if (props.profile_index_3gpp > 0)</div><div>+        qmi_message_wds_start_network_input_set_profile_index_3gpp (input, props.profile_index_3gpp, NULL);</div><div>+</div><div>+    /* Set 3GPP2 profile */</div><div>+    if (props.profile_index_3gpp2 > 0)</div><div>+        qmi_message_wds_start_network_input_set_profile_index_3gpp2 (input, props.profile_index_3gpp2, NULL);</div><div>+</div><div>     /* Set authentication method */</div><div>     if (props.auth_set) {</div><div>         aux_auth_str = qmi_wds_authentication_build_string_from_mask (props.auth);</div><div>@@ -483,8 +505,10 @@ start_network_input_create (const gchar *str)</div><div>     if (props.autoconnect_set)</div><div>         qmi_message_wds_start_network_input_set_enable_autoconnect (input, props.autoconnect, NULL);</div><div> </div><div>-    g_debug ("Network start parameters set (apn: '%s', auth: '%s', username: '%s', password: '%s', autoconnect: '%s')",</div><div>+    g_debug ("Network start parameters set (apn: '%s', 3gpp_profile: '%u', 3gpp2_profile: '%u', auth: '%s', username: '%s', password: '%s', autoconnect: '%s')",</div><div>              props.apn                             ? props.apn                          : "unspecified",</div><div>+             props.profile_index_3gpp,</div><div>+             props.profile_index_3gpp2,</div><div>              aux_auth_str                          ? aux_auth_str                       : "unspecified",</div><div>              (props.username && props.username[0]) ? props.username                     : "unspecified",</div><div>              (props.password && props.password[0]) ? props.password                     : "unspecified",</div><div>-- </div><div>2.1.0</div><div><br></div></div>