设为首页 收藏本站
查看: 1741|回复: 0

[经验分享] Android KitKat 4.4 Wifi移植AP模式和网络共享的调试日志

[复制链接]

尚未签到

发表于 2015-10-1 13:10:21 | 显示全部楼层 |阅读模式
  
  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&#43;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
  


  256intNatController::
  refs=setTetherCountingRules&project=system">setTetherCountingRules(booladd, 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,&quot;%s_%s&quot;,
  defs=intIface&project=system">intIface,
  defs=extIface&project=system">extIface);
265
266   
  defs=asprintf&project=system">asprintf(&proc_path,&quot;/
  path=/proc/">proc/net/
  path=/proc/net/xt_quota">xt_quota/%s&quot;,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           &quot;-A&quot;,
280           LOCAL_TETHER_COUNTERS_CHAIN,
281           &quot;-i&quot;,
282           intIface,
283           &quot;-o&quot;,
284           
  defs=extIface&project=system">extIface,
285           &quot;-m&quot;,
286           &quot;quota2&quot;,
287           &quot;--name&quot;,
288           quota_name,
289           &quot;--grow&quot;,
290           &quot;-j&quot;,
291         &quot;RETURN&quot;
292    };
293
294    if (runCmd(
  defs=ARRAY_SIZE&project=system">ARRAY_SIZE(cmd2b),cmd2b) && add) {
295       free(quota_name);
296        return -1;
297    }
298   free(quota_name);
299
300   
  defs=asprintf&project=system">asprintf(&quota_name,&quot;%s_%s&quot;, extIface, intIface);
301   
  defs=asprintf&project=system">asprintf(&proc_path,&quot;/
  path=/proc/">proc/net/xt_quota/%s&quot;,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内核网络部分的差异。发现AndroidLinux内核在主线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 &#43;1)
     It doesn't log if the module param&quot;event_num&quot; 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
  &#43;&#43;&#43;b/arch/arm/configs/sama5_android_ubifs_defconfig
  @@-623,6 &#43;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
  &#43;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支持。

  

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-121354-1-1.html 上篇帖子: win 7建WiFi路由器 下篇帖子: 关于WIFI的工作模式--AP MODE/STATION MODE
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表