CFUN=1 & "GPRS IP 98 service code" & Bouygues Telecom Enterprises/INCOMS patches



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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]