2018年5月15日 星期二

How to get MBIM log

原文 http://soflen.blogspot.tw/2015/05/driver-how-to-get-mbim-log.html

[Driver] How to get MBIM log

背景

3G/LTE (WWAN)上網功能在Windows OS上得仰賴OS內建的MBIM以及溝通上網等driver的幫忙。微軟提供一些方式方便工程師取得WWAN相關的log。因工作需求,最近研究這些WWAN debugging的方法,順便紀錄在此。


何謂MBIM


MBIM (Mobile Broadband Interface Model) 是專為走USB界面的3G/LTE網卡所建立的協定,可以把整個3G/LTE上網功能所用到的軟體大略可拆成3部份:
  1. 使用者控制界面。如顯示目前電信商名稱、網路連線狀態、訊號強度等...
  2. 流程控制。也就是MBIM,MBIM對上提供API讓使用者界面呼叫,對下與3G/LTE網卡溝通,設定參數、控制網卡、或處理網卡通知的事件
  3. 溝通橋樑。將MBIM控制命令包裝成USB界面所使用的封包,或是反過來將從網卡進來的封包轉換成上層看得懂的內容



使用內建的Netsh收集debug訊息


微軟特地為網路相關功能提供便於除錯的工具:Netsh。此工具可在命令提示字元下使用。這裡介紹與3G/LTE除錯相關常用的指令

  1. 開始紀錄除錯訊息(執行後即可開始複製問題)
    netsh trace start scenario=MBN globallevel=0xff persist=yes overwrite=yes
  2. 停止紀錄(問題成功複製後即可停止紀錄)
    netsh trace stop
  3. 將除錯訊息轉成文字
    netsh trace convert input=[xxx.etl] output=[xxx.txt]
  4. 顯示scenario mbn包含哪些provider(為了檢查是否支援Win8之後所新增的除錯訊息種類)
    netsh trace show scenario mbn

如何分析debug訊息


想分析有用的Netsh MBIM訊息必須先具備一些基本MBIM溝通原理,可以從這裡下載規格書。系統依照MBIM透過USB與3G/LTE網卡溝通的方式被定義了兩條邏輯通道,一條是給控制用的訊息往來用的;另一條是給資料傳遞用的。而這兩條邏輯通道又可再細分,控制通道可劃分出預設(Default)與中斷(Interrupt)管道;資料則根據方向劃分出輸入(Bulk-In)與輸出(Bulk-Out)。下方列表中的MBIM指的是3G/LTE網卡。

接著,考量到3G/LTE網卡算是週邊裝置的一種,其工作與運算效能一定沒有CPU(這裡稱Host)優秀,因此當Host與網卡交換訊息或資料時,如果要求Host發呆等待網卡處理完畢將會帶來極度系統資源的浪費。因此溝通方式會如下圖A,當Host有資料要給網卡(這裡稱為USB MBIM Function)時,只會要求網卡第一時間確認是否有正確收到訊息,接著CPU資源就會挪去處理其他工作,並且給予網卡時間慢慢處理此訊息或執行被要求的任務。待網卡處理完畢要通知Host的時候,網卡會先將訊息放在buffer中準備好並送出中斷訊息給Host,當Host找網卡領取buffer中訊息時,網卡就能夠第一時間把訊息傳遞給Host而不會耽誤系統資源。
圖A、Encapsulated command response sequence

那麼反過來,如果是網卡有事情要知會Host,其作法亦會類似圖A的最後四個步驟,圖B就是由網卡送訊息給Host的步驟。
圖B、Unsolicited event sequence 

回到Netsh,此工具在Win7和Win8之後的OS版本有很大的差異,使用netsh trace show scenario mbn可以發現Win8之後內建的netsh的mbn scenario包含了一個名為Microsoft-Windows-wmbclass的provider。有了它,你才能看到MBIM控制訊息。依照上一節所提供的步驟,應該可以抓到長的像下圖的log。

將log裡的訊息一步步分析可以得到與上圖A、Encapsulated command response的步驟一樣的流程,下圖畫出WWAN miniport driver初始化的溝通流程。將其中一個訊息的來回步驟再拆分就可以得到右邊與圖A相似的流程。

值得注意的是上圖左邊看到的CID。CID(Command Identifier)用來代表每個Host與網卡之間溝通的命令。搭配不同的UUID(在log裡面標示為Service Id)相同的CID會有不同的意思。舉例來說,當UUID為{a289cc33-bcbb-8b4f-b6b0-133ec2aae6df}代表UUID_BASIC_CONNECT,這時CID=1的命令是MBIM_CID_DEVICE_CAPS,用於在初始化過程中取得網卡能力資訊。當UUID為{533fbeeb-14fe-4467-9f90-33a223e56c3f},這時候的CID=1則作為寫入或讀取SMS設定用的MBIM_CID_SMS_CONFIGURATION。

所以除錯的方式可以看訊息交換的流程是否正確,訊息往來之間的延遲時間是否超過規格要求而被判定timeout等...

沒有留言: