Problems with PPP on Android - Omapzoom

744 views
Skip to first unread message

Mikkel Christensen

unread,
Dec 3, 2008, 9:13:18 AM12/3/08
to android-porting, u...@ti.com
Hi all,

Sorry for the long post, but thought this might also help others
trying to get PPP over GPRS running on Android!

We are trying to get data call working on Android with the reference
RIL for Omapzoom board. We are using a 3GPP 07.10 Multiplexer that
will carry an AT command channel (for control) and a second channel
for PPP data.

We have set the property “ro.radio.use-ppp yes” and this gives
problems. We have identified four potential problem areas that we have
made work-a round’s for, but still with no success. If somebody has a
good advice it is really appreciated. We are not running iptables.


Issue 1)


In File /telephony/java/com/android/internal/telephony/gsm/
GSMPhone.java in the constructor a new DataConnectioTracker is
created.
144 mDataConnection = new DataConnectionTracker (this);


In /telephony/java/com/android/internal/telephony/gsm/
DataConnectionTracker.java the constructor calls the function
createAllPdpList.
319 createAllPdpList();


This function creates a new PdpConnection which takes a phone object
as a parameter.


1459 private void createAllPdpList() {
1460 pdpList = new ArrayList<PdpConnection>();
1461 PdpConnection pdp;
1462
1463 for (int i = 0; i < PDP_CONNECTION_POOL_SIZE; i++) {
1464 pdp = new PdpConnection(phone);
1465 pdpList.add(pdp);
1466 }
1467 }


In the file /telephony/java/com/android/internal/telephony/gsm/
PdpConnection.java the constructor has a check if the property “use-
ppp” is set to yes.


157 if (SystemProperties.get("ro.radio.use-ppp","no").equals
("yes")) {
158 dataLink = new PppLink(phone.mDataConnection);
159 dataLink.setOnLinkChange(this, EVENT_LINK_STATE_CHANGED,
null);
160 }


The problem is that a new PppLink is created which takes
phone.mDataConnection as a parameter. The problem is that this is in
fact the object that we are in the process of instantiating, so we
cannot pass it along at this moment. This results in a NULL pointer
exception when code later on tries to access the mDataConnection.

As a work around we commented out the createAllPdpList() call in the
DataConnectionTracker constructor. We also made the createAllPdpList
function public and added to GSMPhone constructor a call to this:

144 mDataConnection = new DataConnectionTracker (this);
//Workaround start
mDataConnection.createAllPdpList(this);
//Workaround end
145 mSimCard = new GsmSimCard(this);


Issue 2)


In file /telephony/java/com/android/internal/telephony/gsm/
PppLink.java we also found that the checkPPP() function never would
find the PPP link to be in up (or unknown) state if the following
statement was never true:


151 // Unfortunately, we're currently seeing operstate
152 // "unknown" where one might otherwise expect "up"
153 if (ArrayUtils.equals(mCheckPPPBuffer, UP_ASCII_STRING,
UP_ASCII_STRING.length)
154 || ArrayUtils.equals(mCheckPPPBuffer,
UNKNOWN_ASCII_STRING,
155 UNKNOWN_ASCII_STRING.length)
156 && dataConnection.state ==
State.CONNECTING) {


The problem is that in the file "/sys/class/net/ppp0/operstate “ will
only say "unknown" when the link is up and we cannot see anywhere that
dataConnection.state was set to CONNECTING.
To overcome this we set dataConnection.state = State.CONNECTING in the
connect() function in the file. This makes Android aware of the PPP
link that is established.

Issue 3)

In file /core/java/android/net/MobileDataStateTracker.java we saw
problems with the DNS servers not being set correctly if we did not
add ppp0 to the sDnsPropNames list:

53 private static final String[] sDnsPropNames = {
54 "net.rmnet0.dns1",
55 "net.rmnet0.dns2",
56 "net.eth0.dns1",
57 "net.eth0.dns2",
58 "net.eth0.dns3",
59 "net.eth0.dns4",
60 "net.gprs.dns1",
61 "net.gprs.dns2",
//Workaround start
“net.ppp0.dns1”,
“net.ppp0.dns2”,
//Workaround end
62 };



Issue 4)


In file /telephony/java/com/android/internal/telephony/gsm/
PdpConnection.java in function handleMessage() in case of
EVENT_SETUP_PDP_DONE we also found a potential problem.
This event is received when a PDP context has been established in the
Reference RIL. The reponse from from the Reference RIL contains a
context ID and the interface name. The present code will only set the
local variables like “interfaceName” and “ipAddress” if there are more
than 2 responses from the reference RIL.


403 if (response.length > 2) {


This is not the case so we added the following code:
401 cid = Integer.parseInt(response[0]);
//Workaround start
interfaceName = response[1];
{
String prefix = "net." + interfaceName + ".";
ipAddress = SystemProperties.get(prefix + "local-ip");
gatewayAddress = SystemProperties.get(prefix + "gw");
dnsServers[0] = SystemProperties.get(prefix + "dns1");
dnsServers[1] = SystemProperties.get(prefix + "dns2");
}
//Workaround end
403 if (response.length > 2) {



Unfortunately we are still not getting any data trough either trough
the web browser or trough ping. Here is a log with pppd and netcfg.
The ping never goes trough.


# logcat pppd:V *:S&
# <6>android_power: wakeup (0->0) at 18931640625 (2000-01-02
02:18:20.748687745 UTC)
android_power: wakeup (0->0) at 18931640625 (2000-01-02
02:18:20.748687745 UTC)
I/pppd ( 812): Starting pppd
D/pppd ( 813): pppd options in effect:
D/pppd ( 813): debug # (from command line)
D/pppd ( 813): nodetach # (from command line)
D/pppd ( 813): dump # (from command line)
D/pppd ( 813): noauth # (from command line)
D/pppd ( 813): /dev/pts/1 # (from command line)
D/pppd ( 813): 460800 # (from command line)
D/pppd ( 813): crtscts # (from command line)
D/pppd ( 813): novj # (from command line)
D/pppd ( 813): novjccomp # (from command line)
D/pppd ( 813): ipcp-accept-local # (from command line)
D/pppd ( 813): ipcp-accept-remote # (from command line)
D/pppd ( 813): noipdefault # (from command line)
D/pppd ( 813): defaultroute # (from command line)
D/pppd ( 813): usepeerdns # (from command line)
D/pppd ( 813): using channel 1
D/pppd ( 813): Using interface ppp0
D/pppd ( 813): Connect: ppp0 <--> /dev/pts/1
D/pppd ( 813): sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic
0x95cdd2fc> <pcomp> <accomp>]
D/pppd ( 813): rcvd [LCP ConfRej id=0x1 <magic 0x95cdd2fc>]
D/pppd ( 813): sent [LCP ConfReq id=0x2 <asyncmap 0x0> <pcomp>
<accomp>]
D/pppd ( 813): rcvd [LCP ConfAck id=0x2 <asyncmap 0x0> <pcomp>
<accomp>]
D/pppd ( 813): rcvd [LCP ConfReq id=0x1 <auth chap MD5> <pcomp>
<accomp>]
D/pppd ( 813): No auth is possible
D/pppd ( 813): sent [LCP ConfRej id=0x1 <auth chap MD5>]
D/pppd ( 813): rcvd [LCP ConfReq id=0x2 <pcomp> <accomp>]
D/pppd ( 813): sent [LCP ConfAck id=0x2 <pcomp> <accomp>]
D/pppd ( 813): sent [IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1
0.0.0.0> <ms-dns3 0.0.0.0>]
D/pppd ( 813): sent [IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1
0.0.0.0> <ms-dns3 0.0.0.0>]
D/pppd ( 813): rcvd [IPCP ConfReq id=0x1]
D/pppd ( 813): sent [IPCP ConfNak id=0x1 <addr 0.0.0.0>]
D/pppd ( 813): rcvd [IPCP ConfNak id=0x1 <addr 25.239.167.204> <ms-
dns1 66.94.9.120> <ms-dns3 66.94.25.120>]
D/pppd ( 813): sent [IPCP ConfReq id=0x2 <addr 25.239.167.204> <ms-
dns1 66.94.9.120> <ms-dns3 66.94.25.120>]
D/pppd ( 813): rcvd [IPCP ConfReq id=0x2 <addr 0.0.0.0>]
D/pppd ( 813): sent [IPCP ConfRej id=0x2 <addr 0.0.0.0>]
D/pppd ( 813): rcvd [IPCP ConfAck id=0x2 <addr 25.239.167.204> <ms-
dns1 66.94.9.120> <ms-dns3 66.94.25.120>]
D/pppd ( 813): rcvd [IPCP ConfReq id=0x3]
D/pppd ( 813): sent [IPCP ConfAck id=0x3]
D/pppd ( 813): Could not determine remote IP address: defaulting
to 10.64.64.64
D/pppd ( 813): local IP address 25.239.167.204
D/pppd ( 813): remote IP address 10.64.64.64
D/pppd ( 813): primary DNS address 66.94.9.120
D/pppd ( 813): secondary DNS address 66.94.25.120
D/pppd ( 813): Script /etc/ppp/ip-up started (pid 821)
D/pppd ( 813): Script /etc/ppp/ip-up finished (pid 821), status =
0x0
E/NetworkStateTracker( 675): net.tcp.buffersize.unknown not found in
system properties. Using defaults
E/NetworkStateTracker( 675): Can't set tcp buffer
sizes:java.io.FileNotFoundException: /sys/kernel/ipv4/tcp_rmem_min
#
#
# netcfg
lo UP 127.0.0.1 255.0.0.0 0x00000049
eth0 DOWN 0.0.0.0 0.0.0.0 0x00001002
ppp0 UP 25.239.167.204 255.255.255.255 0x000010d1
#
#
# ping www.google.com -I ppp0&


Sean McNeil

unread,
Dec 3, 2008, 11:03:21 AM12/3/08
to android...@googlegroups.com, u...@ti.com
Hi Mikkel,

For issue 1 we took a slightly different approach and used the attached
patch.

Sean
PdpConnection.java.patch
Reply all
Reply to author
Forward
0 new messages