主页 > 开发文档 > Android4.4实现PPPOE拨号上网具体流程

Android4.4实现PPPOE拨号上网具体流程

硬件环境:RK3288开发板
软件环境:Ubuntu12 + Android 4.4.* + linux-2.6.*
所需资源:rp-pppoe-3.11.tar.gz http://www.roaringpenguin.com/products/pppoe
 
1、编译内核支持ppp
 
  android本身自带pppd,所以只需要移植pppoe就行了。首先cd kernel,在内核中执行make menuconfig,选择-> Device Drivers -> Network device support ,选中所有ppp选项,退出,保存配置,重新执行make zImage.
 

2、编译得到pppoe
 
把下载到的rp-pppoe-3.11.tar.gz解压到android目录下的external下:
 
# tar zxvf /home/qyh/rp-pppoe-3.11.tar.gz 
 
新建Android.mk并加入以下内容:
 
    1 LOCAL_PATH:= $(call my-dir)
    2 include $(CLEAR_VARS)
    3
    4 LOCAL_SRC_FILES:=\
    5 src/pppoe.c \
    6 src/if.c \
    7 src/debug.c \
    8 src/common.c \
    9 src/ppp.c \
   10 src/discovery.c
   11
   12 
   13 LOCAL_MODULE_PATH := $(LOCAL_PATH)
   14 LOCAL_MODULE_TAGS := eng
   15 LOCAL_MODULE := pppoe
   16 LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
   17
   18 include $(BUILD_EXECUTABLE)
   19
   20 include $(call all-makefiles-under,$(LOCAL_PATH))
 
需要修改rp-pppoe-3.11/src/config.h(否则编译中会出现错误):
a)如果提示 if.c:34:26: error: net/ethernet.h: No such file or directory
   注释掉 #define HAVE_NET_ETHERNET_H 1
 
b)注释掉 #define HAVE_SYS_UIO_H 1 要不然会提示重定义的警告
 
c)添加 #define VERSION 3.11 否则会提示VERSION未定义
 
编译android,会在rp-pppoe-3.11目录下得到pppoe,放到开发板的system/bin目录下。
 
3、进行拨号测试
 
(1)拨号
进入设备终端后,输入
pppoe -d
就会发起Discorvery,在广播域内广播PADI报文,成功的话会返回发现的pppoe-server的MAC地址,并且在PC端抓包eth0的话,使用ppp||pppoed进行过滤,能够收到终端的广播报文。这样就能说明已经实现pppoe通路。接着:
pppd pty "pppoe -I eth0" user user_xxx password my_xxx
这样就会发起pppoe链接,经过Discovery,认证,LCP,最终建立其ppp链接。在PC端会看到新建立起来的ppp0,Client端也会看到。
通过命令netcfg可以看到:
lo UP 127.0.0.1 255.0.0.0 0x00000049
dummy0 DOWN 0.0.0.0 0.0.0.0 0x00000082
eth0 UP 192.168.1.113 255.255.255.0 0x00001003
ppp0 UP 192.168.2.101 255.255.255.255 0x000010d1
 
(2)测试
如果要通过pppoe上网还需要增加路由表项目。
ip route //查看路由表项 
ip route del default //删除掉全部default,需要操作多遍 
ip route add default dev ppp0 //将默认路由设为ppp0 
ip route                //再次查看
3)配置dns
这样操作的话是不需要设置dns的,因为链接wlan的时候,使用的dns-server与现在的是完全一样的,如果经过上述操作,能够pinginternet但是不能够正常上网的话,一定就是dns的问题了。
 getprop net.dns1                  //查看默认路由1
getprop net.dns2                  //查看默认路由2
 
setprop net.dns1 110.112.120.115  //设置默认路由1
setprop net.dns2 110.112.120.114  //设置默认路由2
 
#ping baidu.com
PING baidu.com (220.181.111.85) 56(84) bytes of data.
64 bytes from 220.181.111.85: icmp_seq=1 ttl=54 time=38.1 ms
64 bytes from 220.181.111.85: icmp_seq=2 ttl=54 time=37.4 ms
64 bytes from 220.181.111.85: icmp_seq=3 ttl=54 time=35.8 ms
64 bytes from 220.181.111.85: icmp_seq=4 ttl=54 time=39.1 ms
64 bytes from 220.181.111.85: icmp_seq=5 ttl=54 time=39.0 ms
64 bytes from 220.181.111.85: icmp_seq=6 ttl=54 time=38.8 ms
64 bytes from 220.181.111.85: icmp_seq=7 ttl=54 time=36.8 ms
64 bytes from 220.181.111.85: icmp_seq=8 ttl=54 time=38.3 ms
64 bytes from 220.181.111.85: icmp_seq=9 ttl=54 time=35.8 ms
64 bytes from 220.181.111.85: icmp_seq=10 ttl=54 time=37.6 ms
64 bytes from 220.181.111.85: icmp_seq=11 ttl=54 time=37.0 ms
64 bytes from 220.181.111.85: icmp_seq=12 ttl=54 time=36.1 ms
64 bytes from 220.181.111.85: icmp_seq=13 ttl=54 time=38.6 ms
 
OK,成功了!