1. 程式人生 > >Linux 802.11n CSI Tools常見問題,故障排除

Linux 802.11n CSI Tools常見問題,故障排除

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行對應於雙流傳輸天線的天線ABAC,或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