1. 前言
前段时间给mini主机买了块3天线的网卡,QCA9880自带收发功放,开AP的效果比普通网卡好很多。于是对机箱做了些硬件改造,装上了三根天线。大概是下面这个样子:
但是在折腾AP的时候,还是遇到了一些问题。
2. 使用 5G 频段建立 AP
首先,我们需要安装非自由的firmware来使这块网卡正确工作
1 2 |
apt install firmware-atheros |
因为监管要求,各地区可用的wifi频段是不同的,5G频段的限制比2.4G严格许多。参考:Dynamic Frequency Selection (DFS)
大多数网卡都在芯片(EEPROM)里面存储了DFS设置,开源社区也为了做个遵纪守法的好青年,驱动程序也选择尊重DFS配置。 但是代码终究是人写的,我们可以patch内核,来实现忽略DFS配置的目的。
下面是一份细致的操作步骤,不需要重新编译整个内核,注释里提供了相应的说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/bin/bash # 首先下载和你当前内核版本对应的源码、头文件以及基本编译工具 apt install linux-source-4.18 build-essential linux-headers-`uname -r` # 解压源码 cd /usr/src/ tar xvf linux-source-4.18.tar.xz cd linux-source-4.18 # 下载ath10k的驱动patch(patch来源openwrt仓库,下面的链接是经过适配后的版本) wget https://gist.github.com/renaudcerrato/02de8b2e8dc013bc71326defd2ef062c/raw/a2db325e520e6442c8c12f7599d64ac1b7596a3e/402-ath_regd_optional.patch # patch代码 patch -p1 < 402-ath_regd_optional.patch # 拷贝内核配置文件及一些符号文件 cp /boot/config-`uname -r` .config cp /usr/src/linux-headers-`uname -r`/Module.symvers ./ # 开始编译(仅编译ath内核模块) make oldconfig && make prepare && make scripts make -j4 M=drivers/net/wireless/ath # 复制编译好的ko文件 cp drivers/net/wireless/ath/ath.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless/ath/ath.ko # 卸载旧内核模块,加载新模块,Done depmod -a modprobe -r ath && modprobe ath # you may need to unload ath10k_pci, ath10k_core..。etc. |
3. hostapd 的参数配置
作为一款3x3的网卡,一堆牛逼的特性如果不开启的话,开AP的效果也是很糟糕的。在网络上搜索了半天,并各种参数搭配测试之后,这里给出一个QCA9880可用的hostapd配置文件。更多技术细节建议参考example文件里面的注释:zless /usr/share/doc/hostapd/examples/hostapd.conf.gz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
interface=wlp1s0 driver=nl80211 hw_mode=a channel=0 # 根据无线电环境自动选取合适的频道, 这里有试过指定channel,一直失败,暂未得解 max_num_sta=255 #Details for Connecting Clients via WPA2 TKIP ssid=Test-AP auth_algs=1 wpa=2 wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP rsn_pairwise=CCMP wpa_passphrase=[your secret password] #802.11d Regulatory Restrictions Designations for Which Frequencies and Channels are Legal ieee80211d=1 country_code=US #802.11n Configurations ieee80211n=1 ht_capab=[LDPC][HT40+][SHORT-GI-20][SHORT-GI-40][TX-STBC][DSSS_CCK-40] #802.11ac Configurations ieee80211ac=1 vht_capab=[SHORT-GI-80][MAX-MPDU-11454][RXLDPC][TX-STBC-2BY1][MAX-A-MPDU-LEN-EXP3][RX-ANTENNA-PATTERN][TX-ANTENNA-PATTERN] vht_oper_chwidth=1 #How Many Units of Time Between Beacon Transmissions beacon_int=100 #Multiplier of How Many Units of Time Between Beacon Transmissions dtim_period=2 #(e.g. 100 milliseconds(ms) * 2 = 200 ms between beacons) #Something About WMM Clients Needing this wmm_enabled=1 ###To Be Completely Honest-- I'm Not Entirely Certain What the Rest of this file does #QoS Type of Traffic Management Based on Traffic Type #Background wmm_ac_bk_cwmin=4 wmm_ac_bk_cwmax=10 wmm_ac_bk_aifs=7 wmm_ac_bk_txop_limit=0 wmm_ac_bk_acm=0 #Best Effort wmm_ac_be_aifs=3 wmm_ac_be_cwmin=4 wmm_ac_be_cwmax=10 wmm_ac_be_txop_limit=0 wmm_ac_be_acm=0 #Video wmm_ac_vi_aifs=2 wmm_ac_vi_cwmin=3 wmm_ac_vi_cwmax=4 wmm_ac_vi_txop_limit=94 wmm_ac_vi_acm=0 #Voice wmm_ac_vo_aifs=2 wmm_ac_vo_cwmin=2 wmm_ac_vo_cwmax=3 wmm_ac_vo_txop_limit=47 wmm_ac_vo_acm=0 |
4. ath10k 驱动的 TCP 速率控制问题
在上面的步骤都完成之后,成功开启了5G频段的wifi。 通过iperf3进行网速测试,结果如下:
1 2 3 4 5 6 7 8 |
AP ==> Client: TCP: <20Mbps UDP: 300~500 Mbps Client ==> AP: TCP: 400~500 Mbps UDP: > 300 Mbps |
(测试机为笔记本电脑自带的两天线Intel 8265)
这个问题困扰了我很久,只有AP向外发送TCP数据的时候,速度慢得不可理喻。然而将AP用作NAT网关,Client和“外网”设备的TCP连接速度双向均能达到较高的速度。仔细查看 iperf3 的输出,发现AP向外发送TCP数据包的时候,TCP窗口(window)非常小,怀疑是TCP拥塞控制算法的问题。但是换成BBR,或者使用iperf3指定windows大小都无功而返。
在不知道过了多少天之后,再次捡起了这个问题,在 Google 的帮助下找到了以下三资料:
Poor performance of Atheros QCA6174 802.11ac
mac80211: Adjust TSQ pacing shift
Throughput regression with 'tcp: refine TSO autosizing'
很显然,问题出在mac80211部分的代码上,而这个patch第一次出现在4.16-rc5的代码中,因此只需要简单地升级一下内核就完事了。(我使用的是debian stretch, 安装了backports里面4.18版本的内核后确实解决了这个问题。 至于上面第三个链接,作者在最后给出了另一种解决办法,我并没有仔细查阅并测试,不做更多讨论)
博主你好,你买的这个QCA9880 标准大小代功放的卡, 当ap信号怎么样呢?
我就跑着玩玩的,性能测试ok了,我就扔一边吃灰了,至于信号覆盖,没有测。。。(这个我觉得主要靠天线,因为QCA9880毕竟有功放
你好,请问一下,这个网卡在lede/openrt里面测试过吗,可不可以用。
可以用的,最后测试性能达到预期