Android WiFi开发总结

Android WiFi开发总结,第1张

1 WiFi物理层
1.1 电磁波的波段命名
1)HF:0.003 to 0.03 GHz,High Frequency
2)VHF:0.03 to 0.3 GHz,Very High Frequency
3)UHF:0.3 to 1 GHz,Ultra High Frequency
4)L:1 to 2 GHz,Long wave
5)S:2 to 4 GHz,Short wave
6)C:4 to 8 GHz,S和X的折中,妥协(Compromise)
7)X:8 to 12 GHz,火控雷达,X代表准心(Crosshair)
8)Ku:12 to 18 GHz,Kurz-under,表示短以下
9)K:18 to 27 GHz,Kurz,德语表示短
10)Ka:27 to 40 GHz,Kurz-above,表示短以上
11)mm or G:110 to 300 GHz,Millimeter,毫米波(其实一般包含30 - 300 GHz)

1.2 物理层的组成
PLCP:Physical Layer Convergence Procedure,物理层汇聚子层
PMD:Physical Medium Dependent,物理媒介相关层;调制解调就是这一层

1.3 信号RSSI
WPS key: press key within 3 seconds.
路由器有效信号范围:-20dB ~-90dB
一个房间的话,在-40dB左右;隔一堵墙,就会在-50dB左右。
-20dB一般很少,要靠得很近才有。
the smaller abs(rssi), the better.

1.4 WiFi信号通道设置多少最合适
- 建议选择1,6,11或13这些互相不冲突的信道。
- 无线AP无线信号覆盖范围内有两个以上的AP时,需要为每个AP设定不同的频段,以免共用信道发生冲突。而很多用户使用的无线设备的默认设置都是Channel为1,当两个以上的这样的无线AP设备相“遇”时冲突就在所难免。
- 无论是IEEE802.11b还是IEEE802.11g标准其都只支持3个不重叠的传输信道信道,只有信道1、6、11或13是不冲突的,但使用信道3的设备会干扰1和6,使用信道9的设备会干扰6和13。

1.5 MRMC Concurrency
1)MRMC是multi-role multi-channel operation的缩写。
2)The WiLink8.0 supports the multi-channel operation as time division multiplexing (TDM)-based concurrency. Each role gets a portion of the air time. The core of the multi-role operation is the scheduler that decides on each given time what role should be activated, and protects the role that should be suspended before moving to a new role.
3)TI AP+SoftAP是单信道TDM并发。
4)Cypress WLAN+P2P采用不同的信道实现TDM并发。
5)Linux中每一个role叫做vif。

2 RT3070
2.1 基本概念
1)CAST 8051 and USB core come from Poland Evatronix SA(OTG 3.0 spec),Evatronix SA was acquired by Cadence in 2013。
2)MT7620中的WiFi模块和CAST CUSB2来自于RT3070,并且保持了同样的寄存器映射。
3)CUSB2中的PDMA(Packet DMA)硬件上支持Bulk Out WiFi报文聚合加速。
4)集成了8051单片机。

2.2 WCID
WCID全称为Wireless Client Index,范围从0到254,255表示无效的Client,WiFi AP使用这个值去索引存在于SRAM中的table,包括MAC Search Table和Pairwise Key Table(保存PTK)等。

2.3 SRAM Table
1)WiFi AP MAC Search Table
- RT3070有256个entry,每个entry占用8个字节,保存一个Client的MAC地址和2个字节的属性。
- 256个entry保存256个Wireless Client MAC地址。
- 256个entry保存128个Wireless Client MAC地址和128个WCIDn_TX_RATE(仅仅占用每个entry的2个字节,高6个字节未使用)。
2)WiFi AP Beacon Table
- Linux kernel中每创建一个带有AP功能的vif(Multi BSSID Mode),驱动就会在Beacon Table中增加一个entry。
- 包括Beacon在内的管理帧通过3个发送队列之一的TX0Q发送。

2.4 2个MAC地址
1) STA的MAC地址(MAC_ADDR)
2) AP的MAC地址(MAC_BSSID)

2.5 RT3070 4-way handshake
ap/ap_auth.c
ap/ap_assoc.c
ap/ap_wpa.c
1)AP和STA计算各自的PTK(Pairwise Transient Key),GTK(Group Temporal Key)由AP计算,并发送给STA。
2)AP和STA双方使用PTK对单播进行加密,使用GTK对组播进行加密。
3)PTK保存在Pairwise Key Table(offset 0x4000)中,GTK保存在Shared Key Table(offset 0x6C00)中。

3 其它WiFi芯片
3.1 MT6630
wmt_loader:使用文件节点/dev/wmtdetect,加载SDIO测试驱动探测chipid,成功后卸载探测驱动,然后加载标准的SDIO功能驱动
wmt_launcher:使用文件节点/dev/stpwmt,给SDIO接口MT6630上电和加载firmware;MT6630的所有功能都使用SDIO接口,UART口用来外接4G模块
shell命令:svc wifi enable

3.2 ESP8266 smartconfig
0) DA/SA/BSSID/Seq Ctl/Frame Body. MTK, Marvell, Realtek use 6-byte DA to transfer SSID and password, ESP8266 uses 2-byte Length field of 8-byte UDP header.
1)智能硬件的WiFi模块通电,进入混杂模式(sniff mode),开始监听信号覆盖范围内的所有WiFi数据帧;
2)手机APP端发送包含AP SSID和密码的UDP广播包或者组播包;
3)智能硬件的WiFi芯片接收到该UDP包(利用WiFi 8-byte UDP报文头未加密的2-byte Length字段,因为其它字段都用GTK加密了),解密出AP SSID和密码;
4)智能硬件用收到的SSID和密码连接到指定的WiFi AP上。

3.3 openwifi
https://github.com/open-sdr/openwifi
https://zhuanlan.zhihu.com/openwifi

4 WiFi driver
4.1 Android内核模块编译
4.1.1 OEM
# [RFC] kbuild: add CLANG_TRIPLE to prevent clang from compiling with wrong --target
# CROSS_COMPILE is used to set
# --target=.
# If CROSS_COMPILE is not specified,
# the --target= is inferred from ARCH.
# Android clang target =
# Android gcc compiler prefix
PREFIX=/path/to/android
KDIR=$(PREFIX)/out/target/product//obj/kernel/msm-5.4
# should not add prefix ./, otherwise fail to build
MOD_SRC=drivers/usb/dwc3

# obj-m = hello.o
all:
        make -C $(KDIR) \
        ARCH=arm64 \
        LLVM=1 \
        M=$(MOD_SRC) \
        KBUILD_EXTRA_SYMBOLS=\
        $(KDIR)/Module.symvers \
        V=1 \
        CONFIG_USB_DWC3=m \
        modules
clean:
        make -C $(KDIR) \
        M=$(MOD_SRC) \
        clean

4.1.2 module sign
PEM: Privacy Enhanced Mail
retpoline: Linux return trampoline

modinfo /path/to/dwc3.ko
zcat /proc/config.gz |grep SIG_

PREFIX=/path/to/android
KDIR=${PREFIX}/out/target/product//obj/kernel/msm-5.4
${KDIR}/scripts/sign-file sha512 \
${KDIR}/certs/signing_key.pem \
${KDIR}/certs/signing_key.x509 \
/path/to/dwc3.ko

4.1.3 module log
# p: enable pr_debug
insmod dyndbg==p

echo "module +p" > \
/sys/kernel/debug/dynamic_debug/control

get module_name from lsmod

4.1.4 rmmod refcnt
// rmmod: sys_delete_module()
# include
# include
# include

struct module *mod;

list_for_each_entry(mod,
        THIS_MODULE->list.prev,
        list) {
    if (!strcmp(mod->name,
            "xxx")) {
        atomic_set(&mod->refcnt, 1);
        break;
    }
}

4.1.5 GENIVI ko modversion
Module.symvers
.tmp_versions: rename all .mod to .xxx under .tmp_versions
vmlinux: rename vmlinux to vmlinux-bak
after the above two change, make -C will use Module.symvers to generate ko modversion.

4.2 WiFi network namespace
一个物理网络设备最多存在在一个network namespace中。

net/core/net_namespace.c
网络命名空间定义了2个链表:pernet_list和net_namespace_list。
net/core/dev.c
alloc_netdev_mqs()
{
    [...]
    // point to the default net namespace
    dev_net_set(dev, &init_net);
    [...]
}

net/wireless/core.c
wiphy_new_nm()
{
    [...]
    wiphy_net_set(&rdev->wiphy, &init_net);
    [...]
}

cfg80211_pernet_exit()
{
}

# find the WLAN PHY name
iw phy
# move to ns1 namespace
iw phy phy0 set netns ns1
# back to root namespace, 1 means root namespace
# ip netns exec ns1
ip netns exec ns1 iw phy phy0 set netns 1

5 Android WiFi Framework
5.1 WiFi State和StateMachine
State.java - 状态,其它类继承该类,产生N多状态
StateMachine.java - 管理状态,其它类继承该类,生成State管理类

5.2 STA和AP共存
在/sys/class/net下必须有2个节点:诸如p2p0(或者wds0)和wlan0。

in /etc/wifi/wifi_concurrency_cfg.txt under WifiServiceImpl.java
WifiController.java - 决定使用SoftApStateMachine.java还是WifiStateMachine.java
SoftApStateMachine.java - AP和STA并发状态机,打开AP的代码就放在该类中;而打开STA的代码在WifiStateMachine.java中
WifiStateMachine.java - AP和STA不能并发状态机,打开AP和STA的代码都放在该类中,AP和STA只能二选一

5.3 Android 8.0 WiFi Tethering
TetheringConfiguration.java
config.xml: config_tether_dhcp_range
Tethering|wificond|hostapd|CommandListener|TetherController|NatController|dnsmasq

system/connectivity/wificond - LAN
TetherController.cpp - Bridge
NatController.cpp - WAN

ndc nat enable{disable} intiface extiface
ndc ipfwd add{remove} intiface extiface
ndc nat enable wlan0 eth0
dumpsys network_management
iptables-save -c

am start -n com.android.settings/.TetherSettings
service call \
<1-based index number at which the function appears in your_service_name.aidl> \


5.4 Android captive detection
in NetworkMonitor.java
1)查看所有配置
settings list global

2)使用https
settings put global captive_portal_use_https 1
settings put global captive_portal_https_url https://www.qualcomm.cn/generate_204

3)使用http
settings put global captive_portal_use_https 0
settings put global captive_portal_http_url http://connect.rom.miui.com/generate_204

4)使用默认,即删除配置
settings delete global captive_portal_http_url
settings delete global captive_portal_https_url

5)禁用captive探测
settings put global captive_portal_mode 0

6 常用网络调试工具
- SocketTool(测试MCU和PC Socket通信非常方便)
- WireShark

7 Abbreviations
Android 8.0 wificond: Wi-Fi Connection Manager
BSS:Basic Service Set,AP或者IBSS或者STA
CentOS yum:[jʌm],Yellowdog Updater,Modified
config_tether_upstream_types:Android手机配置为ApCli(AP-Client)时,作为Client的一方
config_tether_usb_regexs:regular expressions,正则表达式
DBS:WiFi双频并发
genl:Generic Netlink
IBSS:Independent Basic Service Set,一般指ADHOC
MLME:Mac Layer Management Entity
MTK ATE: MediaTek Automatic Test Environment
netr28ux.inf:Ralink RT2870系列驱动
promiscuous: sniff mode
RTMP: Ralink Technology Miniport
RTS/CTS:Request To Send(STA发送给路由器),Clear To Send(由路由器发送给STA)
SMA:Sub Miniature version A
STA:STAtion
TAP/TUN:TUNnel
Ubuntu apt-get:Advanced Packaging Tool
vif:Virtual Interface
Wi-Fi 6E:Extended,支持 2.4GHz、5GHz和6GHz三频
WiFi AGO: Autonomous Group Owner, AGO means P2P, for CarPlay
wlp6s0: wl means Wireless LAN, pXsY means PCI BDF

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/877139.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存