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 1)智能硬件的WiFi模块通电,进入混杂模式(sniff mode),开始监听信号覆盖范围内的所有WiFi数据帧; 2)手机APP端发送包含AP SSID和密码的UDP广播包或者组播包; 3)智能硬件的WiFi芯片接收到该UDP包(利用WiFi UDP报文未加密的2字节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=<triple>. # If CROSS_COMPILE is not specified, # the --target=<triple> is inferred from ARCH. # Android clang target = # Android gcc compiler prefix PREFIX=/path/to/android KDIR=$(PREFIX)/out/target/product/<ppp>/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/<ppp>/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 <module_name> dyndbg==p
echo "module <module_name> +p" > \ /sys/kernel/debug/dynamic_debug/control
get module_name from lsmod
4.1.4 rmmod refcnt // rmmod: sys_delete_module() # include <linux/init.h> # include <linux/list.h> # include <linux/module.h>
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 <command> 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 <your_service_name> \ <1-based index number at which the function appears in your_service_name.aidl> \ <type of the argument like i32 or i64> <argument>
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
|