MyException - 我的异常网
当前位置:我的异常网» Android » Android KitKat 4.4 Wifi移植之AP模式与网络共享功

Android KitKat 4.4 Wifi移植之AP模式与网络共享功能调试记要

www.MyException.Cn  网友分享于:2014-06-18  浏览:3次
Android KitKat 4.4 Wifi移植之AP模式与网络共享功能调试记录

Tethering技术在移动平台上已经运用的越来越广泛了,它可以把移动设备当做一个接入点,其它的设备可以通过Wi-Fi,USB或是Bluetooth等方式连接到此移动设备。在Android中可以将Wifi设为AP模式作为WLAN接入点,从而与其他设备共享Android的互联网连接。Android成为接入点后,就无法通过WLAN连接使用Android的应用程序访问互联网,但可以通过其他方式如以太网或移动网络访问互联网。此时以太网或移动网络在网络共享(Tethering)中是作为upstream的角色。

 

最近在AtmelSAMA5D3-EK开发板上调试Wifi模块,需要在Android下实现Tethering,通过Wi-Fi的AP模式,将网络连接共享给其它设备。

 

开发板上一个有线网卡(eth0),一个无线网卡(wlan0),eth0连接到外网,wlan0作为AP共享给其他设备比如Android手机,使得Android手机可以通过开发板连接到外网。

 

硬件平台:Atmel SAMA5

软件平台:Linux 3.10 +Android 4.4

Wifi模组:RTL8723AU(USB接口)

 

因为使用的内核是厂商基于主线内核开发的,虽然主线内核中加入了Android的基本支持,但并不完全。在做Android移植时,如果发现Android上层的某些功能缺乏内核的支持,可以根据Google维护的AndroidLinux内核将相应的更改应用到厂商Linux内核中,在前文《Android KitKat 4.4平台开发-添加USBADB和MTP功能支持》中就是使用的这种方法。

 

整个Wifi移植过程,Wifi模组厂商Realtek给出了详细的过程,但内容只涉及Wifi驱动及Android部分,使用哪个Linux内核以及内核如何配置需要我们自己决定。

 

按照Realtek提供的移植文档进行AndroidWifi的移植,在测试Wifi 网络共享功能时出现如下问题:

在“设置”程序“网络共享与便携式热点”中,打开“便携式Wi-Fi热点”,并没有真正开启Wifi热点,而是相应单选框不断关开,如此反复。

 

对于在测试Android功能时出现的异常情况,一般在log中会存在相应的错误信息,虽然并不是绝对准确,但调试时应该考虑先分析log信息,尝试从中定位导致异常发生的代码位置。

经过一番分析推测,如下高亮显示的log信息很有可能是诱发异常发生的关键代码点。

V/NatController(972): enableNat(intIface=<wlan0>, extIface=<eth0>)

V/NatController(972): runCmd(/system/bin/iptables -t nat -A natctrl_nat_POSTROUTING -o eth0 -jMASQUERADE) res=0

V/NatController(972): runCmd(/system/bin/iptables -A natctrl_FORWARD -i eth0 -o wlan0 -m state--state ESTABLISHED,RELATED -g natctrl_tether_counters) res=0

D/dalvikvm(1339): GC_CONCURRENT freed 373K, 54% free 6723K/14460K, paused 44ms+14ms, total219ms

V/NatController(972): runCmd(/system/bin/iptables -A natctrl_FORWARD -i wlan0 -o eth0 -m state--state INVALID -j DROP) res=0

V/NatController(972): runCmd(/system/bin/iptables -A natctrl_FORWARD -i wlan0 -o eth0 -gnatctrl_tether_counters) res=0

V/NatController( 972): runCmd(/system/bin/iptables-A natctrl_tether_counters -i wlan0 -o eth0 -m quota2 --name wlan0_eth0 --grow-j RETURN) res=1

V/NatController(972): runCmd(/system/bin/iptables -D natctrl_FORWARD -i wlan0 -o eth0 -m state--state INVALID -j DROP) res=0

V/NatController(972): runCmd(/system/bin/iptables -D natctrl_FORWARD -i eth0 -o wlan0 -m state--state ESTABLISHED,RELATED -g natctrl_tether_counters) res=0

E/NatController( 972): Error setting forward rules

V/NatController(972): runCmd(/system/bin/iptables -F natctrl_FORWARD) res=0

V/NatController(972): runCmd(/system/bin/iptables -A natctrl_FORWARD -j DROP) res=0


http://androidxref.com/4.4.2_r1/xref/system/netd/NatController.cpp#294


256int NatController::setTetherCountingRules(bool add, const char *intIface, const char *extIface) {
257
258    /* We only ever add tethering quota rules so thatthey stick. */
259    if (!add) {
260        return 0;
261    }
262    char *quota_name, *proc_path;
263    int quota_fd;
264    asprintf(&quota_name, "%s_%s", intIface, extIface);
265
266    asprintf(&proc_path, "/proc/net/xt_quota/%s", quota_name);
267    quota_fd = open(proc_path, O_RDONLY);
268    if (quota_fd >= 0) {
269        /* quota for iface pair already exists*/
270        free(proc_path);
271        free(quota_name);
272        return 0;
273    }
274    close(quota_fd);
275    free(proc_path);
276
277    const char *cmd2b[] = {
278            IPTABLES_PATH,
279            "-A",
280            LOCAL_TETHER_COUNTERS_CHAIN,
281            "-i",
282            intIface,
283            "-o",
284            extIface,
285            "-m",
286            "quota2",
287            "--name",
288            quota_name,
289            "--grow",
290            "-j",
291          "RETURN"
292    };
293
294    if (runCmd(ARRAY_SIZE(cmd2b), cmd2b) && add) {
295        free(quota_name);
296        return -1;
297    }
298    free(quota_name);
299
300    asprintf(&quota_name, "%s_%s", extIface, intIface);
301    asprintf(&proc_path, "/proc/net/xt_quota/%s", quota_name);
302    quota_fd = open(proc_path, O_RDONLY);
303    if (quota_fd >= 0) {
304        /* quota for iface pair already exists*/
305        free(proc_path);
306        free(quota_name);
307        return 0;
308    }
309    close(quota_fd);
310    free(proc_path);
311

 

分析这个函数NatController::setTetherCountingRules及log信息,推断出异常发生的原因是执行命令

/system/bin/iptables -A natctrl_tether_counters -i wlan0 -o eth0 -mquota2 --name wlan0_eth0 --grow -j 失败。

而且还涉及到路径/proc/net/xt_quota/,但当前系统下并不存在这个路径。由此推断应该是内核缺乏与quota2或xt_quota相关的支持。

 

找到问题的可能原因,接下来就是验证了。比较Android Linux内核、厂商Linux内核以及主线Linux内核网络部分的差异,发现Android Linux内核在主线Linux内核基础上增加了quota2的支持。涉及四次提交

$git log --name-only net/netfilter/xt_quota2.cinclude/linux/netfilter/xt_quota2.h net/netfilter/Kconfignet/netfilter/Makefile

commit7d89969ad270d4c535e33830188806233bf35442

Author:Greg Hackmann <ghackmann@google.com>

Date:Mon Feb 24 09:39:46 2014 -0800

    netfilter: xt_qtaguid: 64-bit warning fixes

    Change-Id:I2adc517c0c51050ed601992fa0ea4de8f1449414

    Signed-off-by: Greg Hackmann<ghackmann@google.com>

net/netfilter/xt_quota2.c

 

commit73570fe76d3b47e669558f06f1a18e0f02dff606

Author:Arve Hjønnevåg <arve@android.com>

Date:Mon May 13 20:42:46 2013 -0700

    netfilter: xt_quota2: 3.10 fixes.

    - Stop using obsolete create_proc_entry api.

    - Use proc_set_user instead of directlyaccessing the private structure.

    Signed-off-by: Arve Hjønnevåg<arve@android.com>

net/netfilter/xt_quota2.c

 

commitea34f99edb73b67ef0a99d304887c64febd4c878

Author:JP Abgrall <jpa@google.com>

Date:Tue Jul 12 12:02:59 2011 -0700

    netfilter: fixup the quota2, and enable.

    The xt_quota2 came from

      http://sourceforge.net/projects/xtables-addons/develop

    It needed tweaking for it to compile withinthe kernel tree.

    Fixed kmalloc() and create_proc_entry()invocations within

     a non-interruptible context.

    Removed useless copying of current quotaback to the iptable's

    struct matchinfo:

      - those are per CPU: they will changerandomly based on which

        cpu gets to update the value.

      - they prevent matching a rule: e.g.

          -A chain -m quota2 --name q1 --quota 123

         can't be followed by

          -D chain -m quota2 --name q1 --quota 123

        as the 123 will be compared to the structmatchinfo's quota member.

    Use the NETLINK NETLINK_NFLOG family to loga single message

    when the quota limit is reached.

    It uses the same packet type as ipt_ULOG,but

     - never copies skb data,

     - uses 112 as the event number (ULOG's +1)

    It doesn't log if the module param"event_num" is 0.

    Change-Id:I021d3b743db3b22158cc49acb5c94d905b501492

    Signed-off-by: JP Abgrall<jpa@google.com>

net/netfilter/Kconfig

net/netfilter/Makefile

net/netfilter/xt_quota2.c

 

commit3db08b39ea752748744e9c7733ce9ef54bed9f3b

Author:JP Abgrall <jpa@google.com>

Date:Tue Jun 21 11:14:49 2011 -0700

    netfilter: adding the original quota2 fromxtables-addons

    The original xt_quota in the kernel is plainbroken:

      - counts quota at a per CPU level

        (was written back when ubiquitous SMP wasjust a dream)

      - provides no way to count across IPV4/IPV6.

    This patch is the original unaltered codefrom:

      http://sourceforge.net/projects/xtables-addons

      at commite84391ce665cef046967f796dd91026851d6bbf3

    Change-Id:I19d49858840effee9ecf6cff03c23b45a97efdeb

    Signed-off-by: JP Abgrall<jpa@google.com>

include/linux/netfilter/xt_quota2.h

net/netfilter/xt_quota2.c

 

提取quota2相关的commit,制作补丁

$ git format-patch -n4 net/netfilter/xt_quota2.c include/linux/netfilter/xt_quota2.hnet/netfilter/Kconfig net/netfilter/Makefile
0001-netfilter-adding-the-original-quota2-from-xtables-ad.patch
0002-netfilter-fixup-the-quota2-and-enable.patch
0003-netfilter-xt_quota2-3.10-fixes.patch
0004-netfilter-xt_qtaguid-64-bit-warning-fixes.patch
 


将这些补丁应用到厂商Linux内核 git am命令)

 

在内核配置中增加quota2支持

commit4e6bf851ffd340f83062d053a6a20d358def121e

Author:Max Liao <liaops@embedinfo.com>

Date:Mon Jun 16 06:08:25 2014 -0400

    ARM: at91/SAMA5: android_ubifs_defconfig:add netfilter quota2 support for sama5d3 and sama5d4

    Signed-off-by: Max Liao<liaops@embedinfo.com>

diff--git a/arch/arm/configs/sama5_android_ubifs_defconfigb/arch/arm/configs/sama5_android_ubifs_defconfig

index9881f7d..48c68a1 100644

---a/arch/arm/configs/sama5_android_ubifs_defconfig

+++b/arch/arm/configs/sama5_android_ubifs_defconfig

@@-623,6 +623,7 @@ CONFIG_NETFILTER_XT_MATCH_OSF=y

 CONFIG_NETFILTER_XT_MATCH_OWNER=y

 CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y

 CONFIG_NETFILTER_XT_MATCH_QUOTA=y

+CONFIG_NETFILTER_XT_MATCH_QUOTA2=y

 CONFIG_NETFILTER_XT_MATCH_RATEEST=y

 CONFIG_NETFILTER_XT_MATCH_REALM=y

 CONFIG_NETFILTER_XT_MATCH_RECENT=y

 

编译内核。

 

测试Wifi 络共享功能,之前的异常现象消失,功能测试正常,这说明之前的推导猜测是正确的,异常的原因的确是内核缺乏netfilter quota2支持




文章评论

编程语言是女人
编程语言是女人
程序员的鄙视链
程序员的鄙视链
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
每天工作4小时的程序员
每天工作4小时的程序员
老程序员的下场
老程序员的下场
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员必看的十大电影
程序员必看的十大电影
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
10个调试和排错的小建议
10个调试和排错的小建议
中美印日四国程序员比较
中美印日四国程序员比较
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
鲜为人知的编程真相
鲜为人知的编程真相
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
如何成为一名黑客
如何成为一名黑客
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
Java程序员必看电影
Java程序员必看电影
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
那些争议最大的编程观点
那些争议最大的编程观点
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
为什么程序员都是夜猫子
为什么程序员都是夜猫子
旅行,写作,编程
旅行,写作,编程
漫画:程序员的工作
漫画:程序员的工作
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员应该关注的一些事儿
程序员应该关注的一些事儿
 程序员的样子
程序员的样子
我的丈夫是个程序员
我的丈夫是个程序员
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员都该阅读的书
程序员都该阅读的书
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有