Hi NM, I've done some little work this we in order to be able to use a Sierra A850 connected to "Bougues Telecom Entreprises" (french broadband provider provider, *98*1, a2bouygues.com). Here are the resulting patches... Since... - all of them can be implemented in better ways, - the "98 service code" which is also a standard has a few (but major) side effects on NM related packages (nn-applet, serviceprovider, libmbca, ... please forward this email to these lists if needed) - I'm not familiar with your dev/upgrade processes (and I've seen too many branches in the lauchpad and svn repositories) ...I've simply done the diffs against "ubuntu/intrepid/secutity/updates/no proposed/no backport " sources packages. Let me know what I can do to finalize the paches or if I you need my help. Best regards from the "Pyrénées" (great mountains, south of France/north of Spain), Jerome (Abonnement "Bouygues Télécom Entreprises", Linux, Sierra Wireless, INCOMS <http://www.incoms.fr/>). // //A. Patch summary : // /* 1. do_not_power_up_if_cfun_=_1.patch (network-manager-0.7~~svn20081018t105859/src/nm-gsm-device.c) */ Sending AT+CFUN=1 to a Sierra AC850 card when it is already powered up causes a "Modem hangup" in ppp session (I don't know why... but I've confimed this behavor with wvdial, maybe some kind of differed reset?). This patch gets the CFUN value (AT+CFUN?) in "power_up" and direcly calls "do_register" when its value is 1 (power_up has been changed, the AT+CFUN=1 is done in the new "do_power_up"). /* 2. gprs_ip_service_d_98_cid.patch (network-manager-0.7~~svn20081018t105859/src/nm-gsm-device.c) */ 99 is just the GPRS service code of GPRS service 'D'. 3GPP TS 07.07 V7.8.0 (2003-03) (<http://www.3gpp.org/ftp/Specs/archive/07_series/07.07/0707-780.zip>) defines an other type of "MT originated PDP context activation": GPRS IP service 'D'. The service code for this service is 88 and the number format is *98*<cid>#. My french provider (Bougues Telecom Entreprises, APN: a2bouygues.com) uses this type of number (I guess they are is not the only ones in this world...). This pach modifies "real_do_dial" to allow this type of dialing (And it doesn't change numbers when they aren't *99#/*98# shortcuts in order to simplify the use of "future" service codes/dialstring). IMHO, users knows better than NM the correct number to their provider, please read the comments included in the pach). /* 3. The following paches are all related to the non "99" service codes ("99" is not the only one "de-facto" standard). Side effecets on nn-applet, serviceprovider, libmbca ... I've check the kde/xfce/... impact. */ /* 3.1 bouygues_telecom_enterprises_dtd_number.patch (mobile-broadband-provider-info-20081015.1/ - serviceproviders.dtd, - serviceproviders.xml) */ Modify the "serviceproviders.dtd" by adding a "number" ELEMENT to the dtd (needed for "*98#" service providers). Add "Bougues Telecom Entreprises" in serviceproviders.xml. 3GPP standards are not frozen. New service codes/dialstring format may be approuved. /* 3.2 dtd_number.patch (libmbca-0.0.3~bzr42/src/ - mbca_serviceprovider.h - mbca_serviceprovider.c - serviceprovider_parser.c - test_mbca.c) */ Process the new "number" ELEMENT (Add the "number" field to the "provider" and get it). /* 3.2 no_de-facto_standard_if_number_exits.patch (network-manager-applet-0.7~~svn20081020t000444./src/connection-editor/nm-connection-list.c) */ Don't use the "de-facto" standard (*99#) when the number is defined. Use the number defined in "serviceproviders.xml" // // B. Pach details: // /* 1. do_not_power_up_if_cfun_=_1.patch */ --- network-manager-0.7~~svn20081018t105859/src/nm-gsm-device.c 2009-02-22 12:20:05.000000000 +0100 +++ network-manager-0.7~~svn20081018t105859.new/src/nm-gsm-device.c 2009-02-22 12:24:07.000000000 +0100 @@ -464,8 +464,9 @@ do_register (NM_GSM_DEVICE (device)); } +/* Was power_up */ static void -power_up (NMGsmDevice *device) +do_power_up (NMGsmDevice *device) { const char *responses[] = { "OK", "ERROR", "ERR", NULL }; @@ -474,6 +475,36 @@ } static void +get_power_response (NMSerialDevice *device, + int reply_index, + const char *reply, + gpointer user_data) +{ + switch (reply_index) { + case 0: + /* Already powered up! */ + nm_info ("(%s): already powered up!", nm_device_get_iface (NM_DEVICE (device))); + do_register (NM_GSM_DEVICE (device)); + break; + default: + /* Power up the device */ + do_power_up (NM_GSM_DEVICE (device)); + } +} + +/* New power_up */ +static void +power_up(NMGsmDevice *device) +{ + const char *responses[] = { "+CFUN: 1", NULL }; + const char *terminators[] = { "OK", "ERROR", "ERR", NULL }; + /* Sending AT+CFUN=1 to a Sierra AC850 card that is already powered up causes a "Modem hangup" in ppp session. + Check CFUN value before powering up the device*/ + nm_info ("(%s): checking CFUN...", nm_device_get_iface (NM_DEVICE (device))); + modem_wait_for_reply (device, "AT+CFUN?", 10, responses, terminators, get_power_response, NULL); +} + +static void init_full_done (NMSerialDevice *device, int reply_index, const char *reply, /* 2. gprs_ip_service_d_98_cid.patch */ --- network-manager-0.7~~svn20081018t105859/src/nm-gsm-device.c 2009-02-21 10:53:42.000000000 +0100 +++ network-manager-0.7~~svn20081018t105859.new/src/nm-gsm-device.c 2009-02-21 12:31:53.000000000 +0100 @@ -158,24 +158,55 @@ setting = NM_SETTING_GSM (gsm_device_get_setting (NM_GSM_DEVICE (device), NM_TYPE_SETTING_GSM)); - if (cid) { + /* GPRS service commands are defined in: + 3GPP TS 07.07 V7.8.0 (2003-03) + http://www.3gpp.org/ftp/Specs/archive/07_series/07.07/0707-780.zip + 0707-780.doc + 10.2.1 MT originated PDP context activation (pp 104-106) */ + + if (cid && (strlen (setting->number) < 5)) { + /* If the number is a shortcut to *99***<cid># (GPRS service 'D') + or *98*<cid># (GPRS IP service 'D') */ GString *str; - str = g_string_new ("ATD"); + nm_info ("GPRS service shortcut: %s", setting->number); + str = g_string_new (""); if (g_str_has_suffix (setting->number, "#")) str = g_string_append_len (str, setting->number, strlen (setting->number) - 1); else str = g_string_append (str, setting->number); - - g_string_append_printf (str, "***%d#", cid); + if (strcmp (str->str,"*99") == 0) { + /* 10.2.1.1 GPRS service 'D' (pp104-105) + D*<GPRS_SC>[*[<called_address>] [*[<L2P>][*[<cid>]]]]# */ + g_string_append_printf (str, "***%d#", cid); + nm_info ("GPRS service 'D': %s", str->str); + } else { + if (strcmp (str->str,"*98") == 0) { + /* 10.2.1.2 Request GPRS IP service 'D' (pp105-106) + D*<GPRS_SC_IP>[*<cid>]# + Defined Values + <GPRS_SC_IP>: (GPRS Service Code for IP) a digit string (value 98) which identifies a request to use the GPRS with IP (PDP types IP and PPP) + <cid>: a digit string which specifies a particular PDP context definition (see +CGDCONT command). + ex. Bouyges Telecom Enterprise (french provider, APN: a2bouygtel.com) requires *98*1# */ + g_string_append_printf (str, "*%d#", cid); + nm_info ("GPRS IP service 'D': %s", str->str); + } else { + g_string_append_printf (str, "***%d#", cid); + nm_warning ("Unknown \"Service Code\", using default format: %s", str->str); + } + } + g_string_prepend (str, "ATD"); command = g_string_free (str, FALSE); - } else + } else { + /* Don't change numbers when they aren't shortcuts. Consider that the user knows the right dialstring, + or that some other type of Service Code/dialstring could (one day?) be specified */ + nm_warning ("You know your GPRS service number better than us, make sure it is correct if something fails later: %s", setting->number); command = g_strconcat ("ATDT", setting->number, NULL); + } modem_wait_for_reply (device, command, 60, responses, responses, dial_done, NULL); g_free (command); } - static void set_apn_done (NMSerialDevice *device, int reply_index, /* 3.1 bouygues_telecom_enterprises_dtd_number.patch */ diff -Nur mobile-broadband-provider-info-20081015.1/serviceproviders.dtd mobile-broadband-provider-info-20081015.1.new/serviceproviders.dtd --- mobile-broadband-provider-info-20081015.1/serviceproviders.dtd 2008-10-21 15:05:05.000000000 +0200 +++ mobile-broadband-provider-info-20081015.1.new/serviceproviders.dtd 2009-02-22 15:57:10.000000000 +0100 @@ -8,6 +8,7 @@ (gsm|cdma), username?, password?, + number?, dns*, gateway?)> @@ -21,5 +22,6 @@ <!ELEMENT username (#PCDATA)> <!ELEMENT password (#PCDATA)> +<!ELEMENT number (#PCDATA)> <!ELEMENT dns (#PCDATA)> -<!ELEMENT gateway (#PCDATA)> \ No newline at end of file +<!ELEMENT gateway (#PCDATA)> diff -Nur mobile-broadband-provider-info-20081015.1/serviceproviders.xml mobile-broadband-provider-info-20081015.1.new/serviceproviders.xml --- mobile-broadband-provider-info-20081015.1/serviceproviders.xml 2008-10-21 15:05:05.000000000 +0200 +++ mobile-broadband-provider-info-20081015.1.new/serviceproviders.xml 2009-02-22 15:59:51.000000000 +0100 @@ -34,7 +34,7 @@ conceived. --> -<serviceproviders format="1.0"> +<serviceproviders format="1.0.1"> <!-- United Arab Emirates --> <country code="ae"> @@ -1127,6 +1127,13 @@ <!-- France --> <country code="fr"> <provider> + <name>Bouygues Telecom Entreprises</name> + <gsm> + <apn>a2bouygtel.com</apn> + </gsm> + <number>*98#</number> + </provider> + <provider> <name>Bouygues Telecom (B2Bouygtel)</name> <gsm> <apn>b2bouygtel.com</apn> /* 3.2 dtd_number.patch */ diff -Nur libmbca-0.0.3~bzr42/src/mbca_serviceprovider.c libmbca-0.0.3~bzr42.new/src/mbca_serviceprovider.c --- libmbca-0.0.3~bzr42/src/mbca_serviceprovider.c 2008-09-01 17:04:05.000000000 +0200 +++ libmbca-0.0.3~bzr42.new/src/mbca_serviceprovider.c 2009-02-22 11:44:23.000000000 +0100 @@ -65,6 +65,9 @@ _dupstr(newprovider->username, provider->username); _dupstr(newprovider->password, provider->password); + + _dupstr(newprovider->number, provider->number); + _dupstr(newprovider->dns1, provider->dns1); _dupstr(newprovider->dns2, provider->dns2); _dupstr(newprovider->gateway, provider->gateway); @@ -108,6 +111,9 @@ free (provider->username); free (provider->password); + + free (provider->number); + free (provider->dns1); free (provider->dns2); free (provider->gateway); diff -Nur libmbca-0.0.3~bzr42/src/mbca_serviceprovider.h libmbca-0.0.3~bzr42.new/src/mbca_serviceprovider.h --- libmbca-0.0.3~bzr42/src/mbca_serviceprovider.h 2008-09-01 17:04:05.000000000 +0200 +++ libmbca-0.0.3~bzr42.new/src/mbca_serviceprovider.h 2009-02-22 19:57:49.000000000 +0100 @@ -100,10 +100,11 @@ }; /**< union containing network specific settings. * _MBCAServiceProvider::type indicates valid * member */ - gchar* username; /**< if NULL, no authentication required */ gchar* password; /**< if NULL, no password required. */ + gchar* number; + gchar* dns1; /**< primary DNS, NULL if automatically acquired */ gchar* dns2; /**< secondary DNS, NULL if none. */ gchar* gateway; /**< gateway to use, NULL if none */ diff -Nur libmbca-0.0.3~bzr42/src/serviceprovider_parser.c libmbca-0.0.3~bzr42.new/src/serviceprovider_parser.c --- libmbca-0.0.3~bzr42/src/serviceprovider_parser.c 2008-09-01 17:04:05.000000000 +0200 +++ libmbca-0.0.3~bzr42.new/src/serviceprovider_parser.c 2009-02-22 12:03:09.000000000 +0100 @@ -221,6 +221,14 @@ provider->password = (gchar*)xmlStrdup (value); continue; } + else if (xmlStrcmp (name, BAD_CAST "number") == 0) + { + xmlTextReaderRead (reader); /* get to text */ + value = xmlTextReaderConstValue (reader); + provider->number = (gchar*)xmlStrdup (value); + g_debug("number = %s", provider->number); + continue; + } else if (xmlStrcmp (name, BAD_CAST "dns") == 0) { xmlTextReaderRead (reader); /* get to text */ diff -Nur libmbca-0.0.3~bzr42/src/test_mbca.c libmbca-0.0.3~bzr42.new/src/test_mbca.c --- libmbca-0.0.3~bzr42/src/test_mbca.c 2008-09-01 17:04:05.000000000 +0200 +++ libmbca-0.0.3~bzr42.new/src/test_mbca.c 2009-02-22 19:57:33.000000000 +0100 @@ -100,6 +100,10 @@ { g_print ("password: %s\n", conf->provider->password); } + if (conf->provider->number) + { + g_print ("number: %s\n", conf->provider->number); + } if (conf->provider->dns1) { g_print ("dns1: %s\n", conf->provider->dns1); /* 3.3 no_de-facto_standard_if_number_exits.patch */ --- network-manager-applet-0.7~~svn20081020t000444/src/connection-editor/nm-connection-list.c 2009-02-22 13:10:48.000000000 +0100 +++ network-manager-applet-0.7~~svn20081020t000444.new/src/connection-editor/nm-connection-list.c 2009-02-22 15:46:45.000000000 +0100 @@ -868,7 +868,15 @@ type_setting = nm_setting_gsm_new (); s_gsm = NM_SETTING_GSM (type_setting); - s_gsm->number = g_strdup ("*99#"); /* De-facto standard for GSM */ + + if (strlen(conf->provider->number) == 0) + s_gsm->number = g_strdup ("*99#"); /* De-facto standard for GSM */ + else { + /* De-facto standard does not seem to work for Bouygues Telecom Entreprises... and other GPRS IP Service 'D' providers? 98 service code. + Use the number "as is" when it is provided */ + s_gsm->number = g_strdup (conf->provider->number); + g_warning ("GPRS service number = %s", conf->provider->number); + } s_gsm->apn = g_strdup (conf->provider->gsm.apn);
Attachment:
do_not_power_up_if_cfun_=_1.patch
Description: Binary data
Attachment:
gprs_ip_service_d_98_cid.patch
Description: Binary data
Attachment:
bouygues_telecom_enterprises_dtd_number.patch
Description: Binary data
Attachment:
dtd_number.patch
Description: Binary data
Attachment:
no_de-facto_standard_if_number_exits.patch
Description: Binary data