您的位置:首页 > 运维架构 > Linux

Linux 802.11n CSI Tools常见问题,故障排除

2017-03-22 21:22 1016 查看


1、怎样设置无线数据速率(或者得到其他站点信息)?

A. 在debugs目录中发现其他站点信息

当802.11接口连接到其他的站点,在debugs下会创建一个目录,有这个站点的MAC地址。注意如果这个接口在客户端模式下,它将只会连接到一个站点AP,但是在其他的模式下,它将连接到多个站点。这些站点的信息如下:

$ sudo ls /sys/kernel/debug/ieee80211/phy0/netdev:wlan0/stations/
00:0f:34:9d:01:a0
(如果你有超过一个无线适配器,这里的phy0和wlan0可能与你系统上的不同)每个站点目录下拥有多个该站点信息的目录,例如rate_scale_table目录,如下:

$ sudo cat /sys/kernel/debug/ieee80211/phy0/netdev:wlan0/stations/00:0f:34:9d:01:a0/rate_scale_table
sta_id 0
failed=0 success=0 rate=0FFF
fixed rate 0x0
valid_tx_ant ANT_A,ANT_B,ANT_C
lq type legacy
last tx rate=0x420A
general:flags=0x0 mimo-d=0 s-ant0x1 d-ant=0x3
agg:time_limit=4000 dist_start_th=3 frame_cnt_limit=31
Start idx [0]=0x0 [1]=0x0 [2]=0x0 [3]=0x0
 rate[0] 0x420A 1mbps
 rate[1] 0x420A 1mbps
 rate[2] 0x420A 1mbps
 rate[3] 0x420A 1mbps
 rate[4] 0x420A 1mbps
 rate[5] 0x420A 1mbps
 rate[6] 0x420A 1mbps
 rate[7] 0x420A 1mbps
 rate[8] 0x420A 1mbps
 rate[9] 0x420A 1mbps
 rate[10] 0x420A 1mbps
 rate[11] 0x420A 1mbps
 rate[12] 0x420A 1mbps
 rate[13] 0x420A 1mbps
 rate[14] 0x420A 1mbps
 rate[15] 0x420A 1mbps
 
这个输出信息说明这个站点的MAC地址为 00:0f:34:9d:01:a0,

· 所有三根发射天线都能被该站点使用(有效的天线 ANT_A,ANT_B,ANT_C)

· 这不是一个高吞吐量的站点(802.11n)( lq type legacy—instead of lq type HT) 

· 最后一帧发送到本站点的传输速率为0x420A

· 16个可能用于本站的传输速率都是相同的(0x420A)

B.了解速率的含义

上面显示的速率是在rate_n_flags格式的源代码描述的32位的值。将0x420a速率值拆开分析,例如,显示:

0x420A =
           0x4000        (RATE_MCS_ANT_A_MSK)
         | 0x0200        (RATE_MCS_CCK_MSK)
         | 0x000A        (10 = 1 Mbps)
 
· 第一行表示帧在天线A上被发送

· 第二行表示帧通过CCK调制模式被发送

· 第三行表示帧以1 Mbps的速率被发送。

与上述情况不同的例子,高吞吐量站点的速率值为0x1c113,

0x1c113 =
            0x1c000      (RATE_MCS_ANT_ABC_MSK)
          | 0x00000      (! RATE_MCS_SGI_MSK)
          | 0x00000      (! RATE_MCS_HT40_MSK)
          | 0x00100      (RATE_MCS_HT_MSK)
          | 0x00013      (19)
 
· 第一行帧在天线A,B,C上被发送

· 第二行帧不带短保护间隔被发送

· 帧不在40MHz带宽信道发送

· 帧以高吞吐量调制解调方式(802.11n)被发送。

· 帧采用MCS19(3个16QAM-1/2流)

这些参数对应于一个78 Mbps的数据传输速率;参考表20-29通过20-43在IEEE 802.11n标准文档中(总结链接)。注意:适配器只支持MCS 0 - 23。

C.设置另一个站点的传输速率

驱动允许你改变站点的速率选择算法,将所有的16个可能的发射率值设置相同,通过改变站点的rate_scale_table值:

$ echo 0x4214 | sudo tee \
>     /sys/kernel/debug/ieee80211/phy0/netdev:wlan0/stations/00:0f:34:9d:01:a0/rate_scale_table
这个例子设置站点用天线A的传输速率为2Mbps,(使用注意:设置无效率可能导致固件崩溃或驱动程序停止运作。)

D.设置广播帧的传输速率

另一个debugfs入口允许设置广播帧传输速率。注意,这不会在客户端模式中有任何影响,因为广播帧首先发送到AP。

$ echo 0x1c113 | sudo tee /sys/kernel/debug/ieee80211/phy0/iwlwifi/iwldvm/debug/bcast_tx_rate
(3.6之前的内核版本,从路径中删除iwldvm /组件。)

E.在监视器模式下设置注入速率

监控模式下的注入帧的选择传输率可以在debugfs的特定目录下进行设置:

$ echo 0x1c113 | sudo tee /sys/kernel/debug/ieee80211/phy0/iwlwifi/iwldvm/debug/monitor_tx_rate
(3.6之前的内核版本,从路径中删除iwldvm /组件。)

 

2. 怎样用Matlab或者Octave处理CSI

A.分析CSI追踪文件

用Matlab/Octave,切换到CSI Tools supplementary的Matlab目录中:

cd linux-80211n-csitool-supplementary/matlab
 
现在读取CSI跟踪文件。示例文件包含在supplementary文件夹中,但也可以使用安装指令最后一步生成的文件。

csi_trace = read_bf_file('sample_data/log.all_csi.6.7.6');
将csi文件读取到csi_trace中   【matlab中变量可以任意维度】
注意,使用MEX文件编译read_bfee.c打开二进制CSI格式文件。如果这不起作用,重新编译该MEX文件使用MATLAB /Octave再试一次。

B.检查CSI

在上例文件中,csi_trace是1x29的二维数组中的一个,该数组包含29个结构体。它包含了29个接收数据包中的CSI信息。结构体中的内容为:

>> csi_entry = csi_trace{1}    (Note the curly-braces {}, not parentheses ().)
 
csi_entry =
 
    timestamp_low: 4   (In the sample trace, timestamp_low is invalid and always 4.)
       bfee_count: 72
              Nrx: 3
              Ntx: 1
           rssi_a: 33
           rssi_b: 37
           rssi_c: 41
            noise: -127
              agc: 38
             perm: [3 2 1]
             rate: 256
              csi: [1x3x30 double]
 
·timestamp_low是网卡的1 MHz的时钟的低32位。它大约每4300秒,或72分钟。这一字段尚未被记录在样本跟踪中,所以所有的值都是任意的,总是等于4。

·bfee_count是一个简单的波束成形测量的计数总数被驱动记录和发送到用户空间。内核和用户空间之间的Netlink信道是有损的,所以这些可以用来检测其中的损耗。

·NRX表示用该网卡接收数据包的天线的数目,和NTX代表传输的空间/时间流数目。在样例情况下,发送者发送一个单一流数据包,并使用所有的3个天线接收它。

·rssi_a,rssi_b,和rssi_c对应RSSI网卡在接收输入到每个天线端口的测量值。此测量是在数据包前导码中进行的。这个值以分贝为单位,是相对与内部参考值;得到接收信号强度dBm的我们必须把它与以db为单位的自动增益控制(AGC)设置结合起来,也减掉一个神奇的常数。这个过程被解释如下。

·perm告诉我们在测量过程中从3个接收天线到3个射频链网卡的信号对应次序。例如:[ 3 2 1 ]意味着天线C被送到射频链A、天线B被送到射频链B,天线A对应射频链C,这些操作的实施是在网卡的天线选择模块进行,一般对应接收天线的信号强度指示值的递减顺序。

·rate数据包发送的速率,与上述定义的rate_n_flags有相同的形式。请注意,天线位被省略,因为接收者没有办法知道哪些发射天线被使用。

·CSI CSI本身,归一化到内部参考。这是一个NRX×NTX×30的三维矩阵,第三维是在30子载波的OFDM信道。对于一个20 MHz宽的通道,这相当于大约一半的OFDM子载波,和一个40 MHz宽的通道,这是大约每4个子载波。这是由IEEE 802.11n-2009载波测量标准的定义(在50页上的表格7-25f)。

现在我们已经描述了这种结构中的所有元素,我们需要把它们放在一起计算绝对单位的CSI,而不是英特尔的内部参考水平。特别的,我们需要结合RSSI和AGC值一起获取dbm的RSS,包括噪声得到信噪比。如果没有获取到噪音数据,如样本的情况下,我们使用一个硬编码的噪底- 92dbm。我们使用的脚本get_scaled_csi.m这样做:

>> csi = get_scaled_csi(csi_entry);
将绝对单位的CSI矩阵提取至csi中。
最后,CSI是一个1×3×30矩阵表示此链路的MIMO信道状态。它的单位是线性的-即不是DB电压空间。这是所看到的所有教科书中使用的格式,也就是说,我们用这样的单位噪声规范化了CSI(在教科书中,通常被称为H)。

C.画SNR图

让我们在三个不同的空间路径对1×3进行测量并绘图:

>> plot(db(abs(squeeze(csi).')))
>> legend('RX Antenna A', 'RX Antenna B', 'RX Antenna C', 'Location', 'SouthEast' );
>> xlabel('Subcarrier index');
>> ylabel('SNR [dB]');
 
画图命令中,squeeze()通过除去第一单维度将CSI变成为3×30矩阵。db()将从线性(电压)空间变为对数(以10为底,功率)空间。abs将每一个复数转换成它的幅度大小。最后,.’操作将压缩csi 从3×30矩阵变为一个30×3矩阵,并没有补充复数。综上所述,我们得到如下的图。



我们看到,这是一个基本持平的线,以相对较少的频率选择性衰落(大约3分贝对大多数天线对)。然而,有一个较差的(也许是8 dB)在最佳天线C和糟糕的天线A之间。这恰好匹配rssi_a和rssi_c之间的差异(如我们所预期的)。

D.计算有效的SNR值

最后结束讨论,通过向您展示如何

从我们的CSI矩阵的计算有效的信噪比。为此,我们使用get_eff_SNRs脚本,该脚本需要输入一个CSI矩阵,最后返回线性空间的7×4有效SNR值(功率)矩阵。这4列分别对应使用802.11四种调制方案的有效信噪比,即BPSK / QPSK/16QAM/64QAM。7行对应的7个可能的天线选择,3个天线和1,2,或3个空间流。特别是,第一个3行对应于单流传输与天线A,B,或C。下一个3行对应于双流传输天线的天线AB,AC,或BC。最后一行对应于一个采用全部传输天线的3-流传输。

>> db(get_eff_SNRs(csi), 'pow')
 
ans =
 
   22.1821   22.2698   22.9007   24.6297(有效)
 -156.5356 -156.5356 -156.5356 -156.5356(以下均无效因为单天线)
 -156.5356 -156.5356 -156.5356 -156.5356
 -156.5356 -156.5356 -156.5356 -156.5356
 -156.5356 -156.5356 -156.5356 -156.5356
 -156.5356 -156.5356 -156.5356 -156.5356
 -156.5356 -156.5356 -156.5356 -156.5356
 
好吧,这很令人失望!发生了什么事?好的,请注意,这是一个1×3链路,因此唯一有效的天线配置是单入多出使用单天线测量。其他6行对应于一个非常小的信噪比,即一个大的负分贝。

让我们看一个3X3矩阵:

>> csi_entry = csi_trace{20}
 
csi_entry =
 
    timestamp_low: 4
       bfee_count: 91
              Nrx: 3
              Ntx: 3
           rssi_a: 34
           rssi_b: 39
           rssi_c: 39
            noise: -127
              agc: 40
             perm: [2 3 1]
             rate: 272
              csi: [3x3x30 double]
 
>> csi = get_scaled_csi(csi_entry);
>> db(get_eff_SNRs(csi), 'pow')
 
ans =
 
       Inf       Inf   32.3435   32.6069
       Inf       Inf   32.4238   32.6822
       Inf       Inf   32.2353   32.5051
   25.4763   25.5262   25.8974   26.8482
   24.6893   24.7490   25.1933   26.5660
   21.9185   22.0303   22.8060   24.6483
    6.5818    8.2321   12.4185   16.2016
 
在这里,所有7行是有效的,因为有三个发射天线。我们看到,所有的单入多出流很很可能工作;事实上,BPSK和QPSK有这么几个错误,MATLAB的误差函数不能将他们与零区分,信噪比是有效的无限值。mimo2速率也可能工作,但只有部分的mimo3利率将工作。看到我们的SIGCOMM 2010文章了解更多细节。

3.为什么启动时会出现 "deauthenticating [...] by local choice (reason=3)" 这些信息?

如果安装了NetworkManager,你是否禁用了无线接口控制?如果你使用命令行工具如IW配置接口需要启用该功能。使用Ubuntu:

echo iface wlan0 inet manual | sudo tee -a /etc/network/interfaces
sudo restart network-manager

4.CSI 工具是否支持不同的Inter设备(例如IWL 6300)?

不支持。这个工具依赖我们定制的固件映像,仅支持IWL5300.

5.CSI工具会测量哪些数据包?

以下情况下的接收数据包会被测量CSI:

该数据包用802.11n“HT”速率进行传送。

接收器的逻辑配置(例如,信道类型和信道宽度是HT,)和它的物理配置(例如,正确的天线数连接,所有的天线工作在配置的频带,所有天线在固件中启用)支持传输速率。

接收器正确解码数据包,没有错误。

并根据模式:

客户端模式:数据包由所连接到的AP发送,目的地是本地地址或广播。

AP模式:数据包由连接的客户端发送。(相当于无线接入点,其他设备可以通过该设备上网)

IBSS(ad-hoc)模式:数据包被另一个连接到IBSS的站点发送,目的地是本地地址或广播。(是设计来进行点对点的接连的。一群计算机设定相同的 BSS 名称,即可自成一个 group,而此 BSS 名称,即所谓 BSSID。IBSS网络的主要优点是不存在的主设备。所有器件都具有平等的地位,任何设备可以与任何其他设备通信。Ad-hoc模式使配有无线网卡的数据发送的电脑与数据接收的电脑直接进行通讯,而无需使用无线路由器或接入点设备)

监控方式:分组寻址和硬编码,固定地址:EA:12:34:56 00:16。见injection scripts,只使用模式1。

换句话说,802.11n监听会话不会记录CSI。从所连接AP发出的非HT速率的信标帧也不会被记录CSI(例如,802.11a/g 的6 Mbps的速率)。我还注意到,每个802.11n A-MPDU只有一个CSI测量(聚合批处理)因为只有一个前导码。

客户端模式(Client)

工作在客户端模式下的无线路由器相当于一块无线网卡,如果用户的主机没有无线网卡的话,可以使用一根网线连接到一台工作在客户端模式下的无线路由器,然后就可以连接到其他无线路由器上边了,客户端模式下的网络拓扑如下图所示:

6.那些子载波会被测量?

测量的子载波集由IEEE 802.11n-2009标准(在第50页的表7-25f)中规定。 英特尔的仅实现支持测量30个子载波的版本,分别对应于20MHz的Ng = 2和40MHz的Ng = 4。

7.为什么CSI工具不能用于加密接入点? 

此设备的固件没有足够的代码空间用于波束成形软件路径(测量CSI所需)和加密软件路径(WEP / WPA / WPA2 /等网络需要)。

可能有一个解决方法,如果你可以得到内核软件栈使用内核的软件实现crypto,但我从来没有时间去尝试它。 请让我知道,如果你可以使它工作!

8.CSI工具代码所遵循的许可证? 

我们对内核代码的更改不会影响内核中的现有许可证:GPLv2。

固件的版本与Intel的固件相同。 你可以在这里找到它。

我们写的任何代码都是根据MIT许可证。

9.CSI工具不支持我想要的功能。我可以重新编写/修改固件源代码吗?

不可以.

我们是在英特尔的授权下访问专有代码,文档和工具,编写修改固件程序的。我们对这些工具不在具有访问权限,除非你在英特尔工作,否则你没有权限修改这些固件。

非常感谢英特尔慷慨地允许我们使用和分发修改二进制版本的固件!

10.我如何处理AP模式下的固件崩溃?

由于我们的工程师没有经过严格的测试,这个芯片组的接入点功能的实现相当不健全,该功能是在内部启动和放弃的。我们在CSI工具中启用这个功能作为一个hack。在我们的实验中,AP模式在客户端也安装Inter5300网卡的静止网络链路中似乎工作的很好。但用其他Wi-Fi设备有时会导致不可避免的崩溃。

在我们自己的工作中,我们发现设备在监控模式使用注入脚本时,CSI工具是最有效的。在我们的试验中,客户端模式,AP模式和ad-hoc模式工作的不是很好。

 

11.如何一次在多个链接上进行CSI测量? 

首先,请阅读#5 - “CSI工具会测量哪些数据包?”。 希望这个描述可以清楚地表明,为什么你不可能在传统的AP /客户端网络中获得很多很好的测量。

我们建议您使用注射模式进行大多数多链路测量。 请参阅这里的说明。

12.我可以记录其他信息,如有效载荷或接收数据包的序列号吗? 

首先,请阅读#5 - “CSI工具会测量哪些数据包?”。该答案为理解CSI测量和其他日志之间的关系和交错提供了有用的背景。

您可以通过查看驱动程序文件夹中的iwl-connector.h头文件来查找可能记录的信息。这些标志中的每一个都可以通过诸如log_to_file程序从内核空间传递多种信息到用户空间。

默认设置为IWL_CONN_BFEE_NOTIF_MSK - 记录波束成形信息反馈。其他选择:

··启用IWL_CONN_RX_PHY_MSK将记录其他物理信息。然而,我们已经将这个结构中最相关的信息复制到波束成形响应中(见这里的代码)。

··启用IWL_CONN_RX_MPDU_MSK将记录数据包有效载荷。该消息应包括例如IEEE 802.11序列号,当然也可以包括可用于应用或测量特定目的的分组有效载荷。

··...其他掩码记录其他信息,这将有益于用户通过阅读内核来发现。 :)

要设置记录哪些信息,请将掩码设置为要记录的所有信息的并集。例如,要记录CSI测量和分组有效载荷,掩码将为IWL_CONN_BFEE_NOTIF_MSK | IWL_CONN_RX_MPDU_MSK,或0x5。一旦你知道所需的掩码,你可以通过(重新)加载带有connector_log标志集的iwlwifi模块进行设置:

modprobe iwlwifi connector_log=0x5
 
connector_log的默认值为0,安装说明中的推荐值为0x1,仅记录波束成形信息。

13.为什么我无法在5 GHz频道的AP或IBSS(ad-hoc)模式下运行? 

这些模式需要信标,这种适配器在需要雷达检测的通道上无法执行(因为它是未实现的)。 特定信道的规定,包括是否需要雷达检测,因国家而异。

首先,确保监管域设置在内核中,这样它就不是world roaming。

适配器的EEPROM还包含每个通道的监管设置,可能或多或少比您正在操作的实际规定限制要多。固件从EEPROM直接读取并使用监管设置。 驱动程序从EEPROM读取设置,并将其与内核使用的规则数据进行组合; 检查结果:

$ iw phy
Wiphy phy0
    Band 1:
[ ... ]
        Frequencies:
            * 2412 MHz [1] (24.0 dBm)
            * 2417 MHz [2] (24.0 dBm)
            * 2422 MHz [3] (24.0 dBm)
            * 2427 MHz [4] (24.0 dBm)
            * 2432 MHz [5] (24.0 dBm)
            * 2437 MHz [6] (24.0 dBm)
            * 2442 MHz [7] (24.0 dBm)
            * 2447 MHz [8] (24.0 dBm)
            * 2452 MHz [9] (24.0 dBm)
            * 2457 MHz [10] (24.0 dBm)
            * 2462 MHz [11] (24.0 dBm)
[ ... ]
    Band 2:
[ ... ]
        Frequencies:
            * 5180 MHz [36] (14.0 dBm)
            * 5200 MHz [40] (14.0 dBm)
            * 5220 MHz [44] (14.0 dBm)
            * 5240 MHz [48] (14.0 dBm)
            * 5260 MHz [52] (17.0 dBm) (radar detection)
            * 5280 MHz [56] (17.0 dBm) (radar detection)
            * 5300 MHz [60] (17.0 dBm) (radar detection)
            * 5320 MHz [64] (17.0 dBm) (radar detection)
            * 5500 MHz [100] (17.0 dBm) (radar detection)
            * 5520 MHz [104] (17.0 dBm) (radar detection)
            * 5540 MHz [108] (17.0 dBm) (radar detection)
            * 5560 MHz [112] (17.0 dBm) (radar detection)
            * 5580 MHz [116] (17.0 dBm) (radar detection)
            * 5660 MHz [132] (17.0 dBm) (radar detection)
            * 5680 MHz [136] (17.0 dBm) (radar detection)
            * 5700 MHz [140] (17.0 dBm) (radar detection)
            * 5745 MHz [149] (27.0 dBm)
            * 5765 MHz [153] (27.0 dBm)
            * 5785 MHz [157] (27.0 dBm)
            * 5805 MHz [161] (27.0 dBm)
            * 5825 MHz [165] (27.0 dBm)
[ ... ]
 
该输出显示,在5 GHz频段,信标允许在5170-5250 MHz和5735-5835 MHz范围内的信道传输。

14.为什么“模块验证失败:签名和/或需要的密钥缺失”提示会出现? 

如果在安装期间模块未签名,并且内核被配置为执行模块签名验证,则会发生这种情况。 要解决此问题,您需要禁用Secure Boot和/或添加内核启动参数:enforcemodulesig = 0

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CSI 802.11