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
NatController::

refs=setTetherCountingRules&project=system">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,
*

refs=proc_path&project=system">proc_path;

263    int

refs=quota_fd&project=system">
quota_fd
;

264   

defs=asprintf&project=system">
asprintf
(&quota_name,
"%s_%s",

defs=intIface&project=system">
intIface
,

defs=extIface&project=system">
extIface
);

265

266   

defs=asprintf&project=system">
asprintf
(&proc_path,
"/

path=/proc/">proc/net/

path=/proc/net/xt_quota">xt_quota/%s",
quota_name);

267   
quota_fd =

defs=open&project=system">
open
(proc_path,

defs=O_RDONLY&project=system">
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   

defs=free&project=system">
free
(proc_path);

276

277    const char *

refs=cmd2b&project=system">cmd2b[]
= {

278           
IPTABLES_PATH,

279           
"-A",

280           
LOCAL_TETHER_COUNTERS_CHAIN,

281           
"-i",

282           
intIface,

283           
"-o",

284           

defs=extIface&project=system">
extIface
,

285           
"-m",

286           
"quota2",

287           
"--name",

288           
quota_name,

289           
"--grow",

290           
"-j",

291         
"RETURN"

292    };

293

294    if (runCmd(

defs=ARRAY_SIZE&project=system">ARRAY_SIZE(cmd2b),
cmd2b) && add) {

295       
free(quota_name);

296        return -;

297    }

298   
free(quota_name);

299

300   

defs=asprintf&project=system">
asprintf
(&quota_name,
"%s_%s", extIface, intIface);

301   

defs=asprintf&project=system">
asprintf
(&proc_path,
"/

path=/proc/">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   

defs=free&project=system">
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支持。

Android KitKat 4.4 Wifi移植AP模式和网络共享的调试日志的更多相关文章

  1. Android KitKat 4.4 Wifi移植之Wifi driver

    本文讲述在Linux 3.10下Realek RTL8723A Linux Wifi 驱动的移植. Prerequisites 硬件平台:Atmel SAMA5 软件平台:Linux 3.10 + A ...

  2. 简单易懂的Ubuntu生存战略:开启无线网卡的wifi热点,ap模式

    在ubuntu下如何把无线网卡设置成可供wifi设备上网的接入点 因为某些移动设备对wifi热点的要求有些苛刻,p2p模式的无线连接方式虽然易设置,但是实用性不高. 相对而言,创建一个虚拟无线路由器成 ...

  3. 关于WIFI的工作模式--AP MODE/STATION MODE

    wifi的concurrent mode 所谓wifi的共存模式,有以下几种: station mode + station mode station mode + ap mode station m ...

  4. MT7601 AP模式移植

    MT7601 的 STA 模式和 AP 模式的驱动,是不一样的. 所以,需要另外移植驱动 驱动源码位置 https://github.com/eywalink/mt7601u 下载之后,先修改 Mak ...

  5. Marvell w8782 sdio wifi AP模式设置

    http://blog.csdn.net/junllee/article/details/8895908 w8782工作在station模式一切正常,于是想试试AP模式(master mode): A ...

  6. WIFI的AP/Sta模式简单介绍

    AP模式: Access Point,提供无线接入服务,允许其它无线设备接入,提供数据访问,一般的无线路由/网桥工作在该模式下.AP和AP之间允许相互连接 Sta模式: Station, 类似于无线终 ...

  7. ubuntu设置WPA2-PSK的wifi热点(AP)——hostapd+dhcpd

    在ubuntu 12.04中,默认可以设置的wifi热点是只能用WEP加密,毫无疑问,这样的加密方式,安全性低,现在可以在10几秒的时间内破解,并且只能添加ad-hoc模式的热点,不支持添加AP模式, ...

  8. 关于 RTL8723BS 同时开启 STA/AP 模式

    最近接到一个调试 wifi 驱动的任务,使用的是 rtl8723bs 芯片组.要求是让无线设备工作在 station 模式的时候同时开启一个 ap 热点.简单来讲就是连接其他 wifi 的同时发出一个 ...

  9. 树莓派配置AP模式

    所需硬件:树莓派.无线网卡 1.查看无线网卡是否被识别 pi@raspberrypi ~ $ sudo lsusb Bus Device : ID : Standard Microsystems Co ...

随机推荐

  1. Cocos2d-x 创建(create)动画对象CCAnimation报错分析

    本人在使用精灵表单创建动画的过程中突然遇到了一些个问题,下面进行一下分析总结. 根据在Cocos2d-iphone中的经验,我写出了如下的代码: CCSpriteFrameCache::sharedS ...

  2. cocos2d 游戏开发:Cocos2d v3 &quot;hello world&quot;+显示飞船

    V3 RC4 版本号图片 显示一个飞船 将Chapter1中 SpaceCargoShip.png 文件 加入到项目里面. 代码在 init : CCSprite *spaceCargoShip = ...

  3. MySQL HINT:Straight_JOIN

    来自生产环境的朋友.可能都会碰到:          原本运行良好的查询语句,过了一段时间后,可能会突然变得很糟糕     一个很大可能的原因就是数据分布情况发生了变化     从而导致MySQL优化 ...

  4. [C++]Hello C++

    最先进项目中需要用到C++做开发,所以开始学习C++,典型的眼高手低,刚开始觉得还算上手,之后越学越觉得复杂. 相比C#,C++确实需要开发者投入更多的精力去设计与维护. 以下是最近对C++开发的一些 ...

  5. 数据结构《17》---- 自己主动补齐之《二》----Ternary Search Tree

    一. 序言 上一篇文章中,给出了 trie 树的一个实现. 能够看到,trie 树有一个巨大的弊病,内存占用过大. 本文给出还有一种数据结构来解决上述问题---- Ternary Search Tre ...

  6. 1.VMwareTools安装

     1 选中虚拟机.右击.然后点击:安装Vmware-tool(最好是有网络的情况下安装) 2 将Vmware-tool的安装文件复制到暂时文件夹下,截图例如以下: 3 解压VMwareTools- ...

  7. OpenCV-Python教程(9、使用霍夫变换检测直线)

    相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV的霍夫变换 ...

  8. hdu2050(递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2050 (1) n条直线最多分平面问题 题目大致如:n条直线,最多可以把平面分为多少个区域. 析:可能你 ...

  9. Hama学习总结

    Hama学习笔记 1.       Hama定义 Hama是基于HDFS上的BSP模型实现,其执行不须要MapReduce. 例证例如以下: 在单点调试的Hama系统上,仅仅执行NameNode.Da ...

  10. SE 2014 年4月21日(一)

    如图配置 网络中存在四个自治系统,设备之间要求建立BGP对等体关系,发布BGP路由,使得全网BGP路由相互通讯. 要求 1. 由于AS 200中的路由信息频繁抖动,所以AS 100 和 AS 300 ...