詳解usbmon抓取的log各字段的含義


詳解 usbmon 抓取的 log 各字段的含義

在上篇文章中,我們已經介紹了如何在 linux 下使用 usbmon 抓取 usb 總線上數據的方法。(https://www.cnblogs.com/shiwenjie/p/8467057.html

數據抓取到了,但是放眼一看,密密麻麻的全是數字,它們代表什么含義呢?本文將為你揭曉答案。

1. 預備知識

  在解讀 usbmon 抓取的數據包的含義之前,我們需要了解一下與 usb 傳輸有關的基礎知識,這樣才能更好的理解數據包的各個字段所代表的含義。

  務必要明確一點:usb 總線上傳輸的數據是以包為基本單位的,但是不能隨意的使用包來傳輸數據,必須按照一定的關系把這些不同的包組織成事務(transaction)進行傳輸。

1.1 usb 包的種類

  介紹一下 usb 包的種類,總體上分為四類:令牌包、數據包、握手包、特殊包。

1)令牌包

  令牌包用來發起一次 usb 傳輸,因為 usb 是主從結構的拓撲結構,所有的數據傳輸都是由主機發起的,設備只能被動的響應,這就需要主機發送一個令牌包來通知哪個設備進行響應,如何響應。

  令牌包有 4 種,分別為輸出(OUT)、輸入(IN)、建立(SETUP)和幀起始(SOF)。各個包的功能見下表:

      

2)數據包:顧名思義,數據包就是用來傳輸數據的,可以從主機到設備,也可以從設備到主機,方向由令牌包來指定。

3)握手包:握手包的發送者一般為數據接收者,用來表示一個傳輸是否被對方確認。在傳輸正常的情況下,主機/設備會發送一個表示傳輸正確的 ACK 握手包。

4)特殊包:特殊包用在一些特殊的場合,這里就不介紹了。

1.2 usb 的事務

  介紹了 usb 包的分類,下面就要着重介紹 usb 的事務(transaction)及傳輸類型。前面已經說了,我們不能隨意的使用 usb 包來傳輸數據,必須按照一定的關系把這些不同的包組織成事務才能傳輸數據。

  那么事務是什么呢? 事務通常由三個包組成:令牌包、數據包和握手包。

        

  ※注意:usbmon 只抓取事務(transaction)中的數據包,不會抓取令牌包和握手包。

  usb 協議規定了 4 種傳輸類型:批量傳輸、等時傳輸、中斷傳輸和控制傳輸。其中,批量傳輸、等時傳輸、中斷傳輸每傳輸一次數據都是一個事務;控制傳輸包括三個過程,建立過程和狀態過程分別是一個事務,數據過程可能包含多個事務。

1.3 usb 的四種傳輸類型

  下面用圖來簡單的表示這四種傳輸的過程

1)批量傳輸

  

2)等時傳輸

  

3)中斷傳輸

  

4)控制傳輸

     

2. 分析 usbmon 抓取的 log

  前面介紹了 usb 協議的一些基礎知識,下面就開始分析 usbmon 抓取的 log。

  貼一張在 ubuntu 下抓取的 4G 模塊撥號上網的 log。

    

下面從左到右分析這些字段代表的含義:

1)URB Tag - URB 標簽

  該字段表示驅動中定義的struct urb 結構體變量在內核空間的地址,可以使用該字段區分不同的 URB 數據包。

  下面兩張圖分別是在 64 位和 32 位 系統上抓取的數據包。可以看到 URB Tag 字段的長度和系統的位數相同。

  

2)Timestamp - 時間戳

  該字段表示的是時間戳,單位是微秒。1微秒 = 10^(-6)秒。

  該時間是由下面的 mon_get_timestamp() 函數獲取的,使用 do_gettimeofday() 獲取的時間 位與(&) 上了0xFFF,因此usbmon log顯示的秒數范圍為0 ~ 4096s

        

                // 2773就是當前URB的時間戳

3)Event Type - 事件的類型

  S - submission,向 usb controller 提交 URB

  C - callback,URB 提交完成后的回調

  E - submission error,向 usb controller 提交 URB 發生錯誤

4)Address word - 地址字段

  這個字段包含 4 部分,各個部分之間使用分號隔開,這 4 部分分別是 URB 類型及傳輸方向usb 總線號usb 設備地址端點號

  

  URB 類型及傳輸方向:usb 有四種傳輸方式,分別是控制傳輸(Control)、批量傳輸(Bulk)、等時傳輸(Isochronous)和中斷傳輸(Interrupt)。usb 數據的傳輸方向是以 Host 端為參考對象的,Host 向 usb 設備發送數據那么傳輸方向就是 Output,Host 讀取 usb 設備的數據那么傳輸方向就是 Input。

  usb 總線號:該字段表示 usb 總線號,Host 端一般有多個usb controller,每個usb controller 都有一條對應的 usb 總線,使用 usb 總線號區分它們,usb 設備可以掛接到某條總線上。

  usb 設備地址:該字段表示 usb 設備的地址,每一個 usb 設備經過枚舉后在 Host 端都有一個唯一的地址。

  端點號:表明該次數據傳輸是 Input/Output 到設備的哪個端點。上圖中該字段是 0,就表示這次數據傳輸使用的是設備的端點 0(控制端點)。

5)URB Status word - URB 的狀態

  這個字段有兩種表示形式: 

  ① s + 一串數字

  ② 一串以分號間隔的數字(或單個數字)構成的,這串數字包含下面幾個部分:URB status、interval、start frame 和 error count。特別注意一點,該字段不同於 "Address word" 字段,對於不同的傳輸方式這幾部分是可選的,並非所有部分都是必須的,下圖是不同的傳輸方式包含的信息。

    

  下面分析不同的傳輸方式所包含的信息:

  批量傳輸:只包含 URB status 這個字段,它對應着 struct urb 結構體中的 status 成員變量,表示 URB 的狀態。URB status 僅僅對 Event Type 中的 Callback 有意義,對於 Submission 是無意義的,之所以這么做是為了統一格式,方便使用腳本分析 usbmon 的 log。URB status 的具體含義見內核對於該成員變量的注釋。

     

  中斷傳輸:URB status 和 Interval,URB status 見前面的分析,Interval 表示該 URB 對端點輪詢的間隔時間。
  等時傳輸:URB status、Interval、start frame 和 error count。等時傳輸包含了所有部分,start frame 和 error count 是等時傳輸所特有的字段,但因為我們的驅動程序中不使用等時傳輸這種方式,因此這里不做過多的分析。
  控制傳輸:控制傳輸在提交時(S:submission)這個字段是 s,這里的 s 后面緊跟的數據是控制傳輸的建立過程主機發送的數據包,可以參考前面控制傳輸的示意圖。控制傳輸在回調時(C:callback),這個字段代表的是 URB status。

6)Setup packet - 控制傳輸建立階段的數據包

  如果是控制傳輸,這個字段表示控制傳輸建立階段主機發給設備的數據包。

    

  該字段從左到右的格式如下,括號中的數字表示該部分占用的字節大小:

    bmRequestType(1) + bRequest(1) + wvalue(2) + wIndex(2) + wLength(2)

  每個字段的含義可以在 usb2.0 規范中找到,這部分與 usb 的標准請求等相關。

7)Data Length - 數據包的長度

  對於 S(Submission),Data Length 字段是主機請求發送/讀取的數據長度,但是設備並不一定能夠接收/發送主機請求的數據長度。實際接收/發送的數據長度在 C(Callback)中的 Data Length 字段。

  

  

8)Data tag - 數據標簽

  ”=” 后面緊跟數據流
  “>” 表示這是一次 Output 數據傳輸
  “<” 表示這是一次 Input 數據傳輸

9)Data words follow - 數據流

  這個字段就是一個事務(transaction)中的數據包,我們平時分析 usbmon 的 log 定位問題,也主要是看這個字段。注意一點,這個字段實際顯示的數據 <= Data Length 的值。

3. 使用 usbmon 分析解決問題

  下面舉一個使用 usbmon 定位問題的小例子:
  客戶由於沒有正確的根據文檔移植驅動,可能在 qmi_wwan 驅動中沒有剝除以太網頭,就導致 quectel-CM 在通過 dhcp 獲取 IP 地址階段失敗,可以通過抓取的 usbmon 的 log 快速的定位問題。
  下圖是 usbmon 抓取的 log,可以看到在 dhcp 階段,主機發送的數據包是以太網包而非 IP 包,從而導致獲取 IP 失敗,進而定位到是驅動沒有正確的移植。

    

 

參考資料:

【1】linux內核自帶的官方文檔:https://www.kernel.org/doc/Documentation/usb/usbmon.txt

【2】《圈圈教你玩USB》

【3】《Linux那些事之我是USB》 

   上面兩本書的百度網盤資源(僅供學習,不可商用!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM