Android KitKat 4.4 Wifi移植AP模式和网络共享的调试日志
Tethering技术在移动平台上已经运用的越来越广泛了。它能够把移动设备当做一个接入点,其它的设备能够通过Wi-Fi。USB或是Bluetooth等方式连接到此移动设备。在Android中能够将Wifi设为AP模式作为WLAN接入点。从而与其它设备共享Android的互联网连接。Android成为接入点后。就无法通过WLAN连接使用Android的应用程序訪问互联网,但能够通过其它方式如以太网或移动网络訪问互联网。
此时以太网或移动网络在网络共享(Tethering)中是作为upstream的角色。
近期在Atmel的SAMA5D3-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 refs=setTetherCountingRules&project=system">setTetherCountingRules refs=proc_path&project=system">proc_path refs=quota_fd&project=system"> defs=asprintf&project=system"> defs=intIface&project=system"> defs=extIface&project=system"> defs=asprintf&project=system"> path=/proc/">proc path=/proc/net/xt_quota">xt_quota defs=open&project=system"> defs=O_RDONLY&project=system"> defs=free&project=system"> refs=cmd2b&project=system">cmd2b defs=extIface&project=system"> defs=ARRAY_SIZE&project=system">ARRAY_SIZE defs=asprintf&project=system"> defs=asprintf&project=system"> path=/proc/">proc defs=free&project=system">
NatController::
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,
*
263 int
quota_fd
264
asprintf
"%s_%s",
intIface
extIface
265
266
asprintf
"/
quota_name);
267
quota_fd =
open
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
276
277 const char *
= {
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(
cmd2b) && add) {
295
free(quota_name);
296 return -;
297 }
298
free(quota_name);
299
300
asprintf
"%s_%s", extIface, intIface);
301
asprintf
"/
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
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,制作补丁
将这些补丁应用到厂商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支持。
Android KitKat 4.4 Wifi移植AP模式和网络共享的调试日志的更多相关文章
- Android KitKat 4.4 Wifi移植之Wifi driver
本文讲述在Linux 3.10下Realek RTL8723A Linux Wifi 驱动的移植. Prerequisites 硬件平台:Atmel SAMA5 软件平台:Linux 3.10 + A ...
- 简单易懂的Ubuntu生存战略:开启无线网卡的wifi热点,ap模式
在ubuntu下如何把无线网卡设置成可供wifi设备上网的接入点 因为某些移动设备对wifi热点的要求有些苛刻,p2p模式的无线连接方式虽然易设置,但是实用性不高. 相对而言,创建一个虚拟无线路由器成 ...
- 关于WIFI的工作模式--AP MODE/STATION MODE
wifi的concurrent mode 所谓wifi的共存模式,有以下几种: station mode + station mode station mode + ap mode station m ...
- MT7601 AP模式移植
MT7601 的 STA 模式和 AP 模式的驱动,是不一样的. 所以,需要另外移植驱动 驱动源码位置 https://github.com/eywalink/mt7601u 下载之后,先修改 Mak ...
- Marvell w8782 sdio wifi AP模式设置
http://blog.csdn.net/junllee/article/details/8895908 w8782工作在station模式一切正常,于是想试试AP模式(master mode): A ...
- WIFI的AP/Sta模式简单介绍
AP模式: Access Point,提供无线接入服务,允许其它无线设备接入,提供数据访问,一般的无线路由/网桥工作在该模式下.AP和AP之间允许相互连接 Sta模式: Station, 类似于无线终 ...
- ubuntu设置WPA2-PSK的wifi热点(AP)——hostapd+dhcpd
在ubuntu 12.04中,默认可以设置的wifi热点是只能用WEP加密,毫无疑问,这样的加密方式,安全性低,现在可以在10几秒的时间内破解,并且只能添加ad-hoc模式的热点,不支持添加AP模式, ...
- 关于 RTL8723BS 同时开启 STA/AP 模式
最近接到一个调试 wifi 驱动的任务,使用的是 rtl8723bs 芯片组.要求是让无线设备工作在 station 模式的时候同时开启一个 ap 热点.简单来讲就是连接其他 wifi 的同时发出一个 ...
- 树莓派配置AP模式
所需硬件:树莓派.无线网卡 1.查看无线网卡是否被识别 pi@raspberrypi ~ $ sudo lsusb Bus Device : ID : Standard Microsystems Co ...
随机推荐
- jquery学习之AJAX
1,关于AJAX的简单介绍 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准 ...
- objective-c 中数据类型之六 数值类(NSValue)
// NSValue能够将c类型转换为Objective-C对象,如NSRange,CGPoint.CGSize,CGRect,CGVector,UIEdgeInsets,UIOffset NSRan ...
- Java生成文件
Java生成文件 1.说明 以文件路径作为參数,推断该文件是否存在,若不存在就创建文件.并输出文件路径 2.实现源代码 /** * @Title:BuildFile.java * @Package:c ...
- [c++语法]类
什么是类 类 是 面向对象的基础.c里面是没有对象的,只有数据,即静态的死物. 从面向过程升级到面向对象后,有了对象的概念,对象是数据与方法的合体,是动态的活物. 类代表着一类事物的特征.而对象,是类 ...
- IOS中的id与nil
1 id id和void *并非完全一样.在上面的代码中,id是指向struct objc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject) ...
- HDU 3571 N-dimensional Sphere(高斯消元 数论题)
这道题算是比较综合的了,要用到扩展欧几里得,乘法二分,高斯消元. 看了题解才做出来orz 基本思路是这样,建一个n*(n-1)的行列式,然后高斯消元. 关键就是在建行列式时会暴long long,所以 ...
- C语言笔记之结构体
结构的本质是C语言的一种数据抽象,通俗的说,是基本数据类型的重组. 为什么要重组呢?由于基本数据类型不够用了.为什么不够用了呢?由于须要的信息类型太多了. 这是一个非常大的话题.信息本来是没有什么类型 ...
- 南阳OJ 16 矩形嵌套
描写叙述 有n个矩形,每个矩形能够用a,b来描写叙述,表示长和宽. 矩形X(a,b)能够嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度). ...
- c++ stl algorithm: std::fill, std::fill_n
std::fill 在[first, last)范围内填充值 #include <iostream> #include <vector> #include <algori ...
- UltraEdit破解方法最强收录
作为一个能够满足你一切编辑需求的强大文本编辑器.ultraedit在IT届有着非常高的人气.只是它正版的价钱也是不廉价滴,没记错的话是要好几十刀. 那么对于我们来说,破解UltraEdit就是一项必备 ...