首页 > 系统相关 >Linux下USB抓包工具UsbMon的使用和包数据格式解析

Linux下USB抓包工具UsbMon的使用和包数据格式解析

时间:2023-10-10 11:13:52浏览次数:51  
标签:usb URB urb Bi Linux 数据格式 009 usbmon USB

ux下USB抓包工具UsbMon的使用和包数据格式解析

一、UsbMon的使用步骤
1、挂载debugfs
2、加载usbmon模块
3、确认usbmon是否可用
4、确认usb设备挂在哪条总线
5、使用usbmon抓取通讯数据包

二、UsbMon抓取的数据包格式解析
一、UsbMon的使用步骤
一般linux内核提供了usbmon这个工具,想要启用UsbnMon,必须挂载debugfs并加载usbmon模块;之后确认usbmon是否可用及USB设备所在总线分支,最后使用usbmon抓包并分析;
对应步骤命令如下:

1、挂载debugfs
# mount -t debugfs none_debugs /sys/kernel/debug (这个也可以在内核配置中直接使能挂载);

2、加载usbmon模块
# modprobe usbmon (如果usbmon已编译到内核,本步骤可以忽略,至于modprobe的作用,请参见该博客

3、确认usbmon是否可用
# ls /sys/kernel/debug/usb/usbmon
# 0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u
说明:
①、数字后面的s/t/u表示抓包保存的数据格式;我们使用u格式,其他2项忽略即可;
②、数字1/2/3分别表示所在的当前平台所拥有的USB总线,调试的usb设备挂在哪条总线下,就用哪个; 那么0数字表示什么含义呢?它表示抓所有总线上的包;

4、确认usb设备挂在哪条总线
运行”cat /proc/bus/usb/devices”, 就会发现设备T开头的行.T行有1个bus字段, Bus=03 说明它在bus3口上;如下所示:
T: Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0557 ProdID=2004 Rev= 1.00
S: Manufacturer=ATEN
S: Product=UC100KM V2.00

5、使用usbmon抓取通讯数据包
# cat /sys/kernel/debug/usb/usbmon/3u > /tmp/usbmon_log.txt
(将抓取到的数据保存在 /tmp/usbmon_log.txt中)

二、UsbMon抓取的数据包格式解析
可以参见这篇文章详解usbmon抓取的log各字段的含义

类似: ffff9bbbaf235b00 1482700625 C Ii:3:001:1 0:2048 1 = 04的字段解析以及Co/Ci / Ii/Io等含义参见以下网址: USB抓包usbmon

---
URB传输异常
urb传输异常就有很多种了,下面列举一下常见的错误对应的status:

注:下面的usb status状态码在 linux-x.x.x/Documentation/usb/error-codes.txt 这个文件中有详细的说明,可以参考一下。

-EINPROGRESS (-115)
这个字段前面已经说过了,它出现在URB submission的时候,表示这个URB的控制权交给了usb控制器,将由usb控制器处理,这个并不是真正的错误。

-EPROTO (-71)
有两种原因会导致这个错误:
A bitstuff error happened during the transfer
No response packet was received in time by the hardware
这个错误经常发生在usb设备枚举失败时,下图就是EC25模块在客户树莓派上枚举失败对应的log,URB的status字段为-71

-EILSEQ (-84)
这个错误不太常见,具体可以参考error-codes.txt

-ECOMM (-70)
对于IN URB,在数据传输中,接收USB设备数据的速度 > 将数据写入内存中的速度

-ENOSR (-63)
在OUT URB数据传输中,数据不能从系统内存中获取的足够快,以便可以跟上请求的usb的数据速率

-EPIPE (-32)
这个表明usb管道"不通",批量端点可能会设置了halt条件,设置了这种条件的端点必然会堵塞管道,可以使用usb_clear_halt()清除halt

-EOVERFLOW (-75)
当发送给端点的数据包长度大于端点特定的数据包长度时会出现这个错误,从错误码也能看出来,数据“溢出了“

ENODEV (-19)
usb设备已经从系统中移除,但是hub没有及时检测到usb设备的断开,驱动仍然提交URB,就会导致这个错误发生。

Note: -EPROTO、-EILSEQ、-EOVERFLOW一般是由于usb设备、设备固件或usb数据线出问题导致的。

URB从usb控制器中"unlinked"
"unlinked"发生下下面的场景下:

(1)驱动中调用 usb_unlink_urb( ) 或 usb_kill_urb( ) 主动取消一个已经提交给usb控制器的URB
调用 usb_unlink_urb( ) 之后,URB的status值为-104(ECONNRESET)
调用 usb_kill_urb( ) 之后,URB的status值为-2(ENOENT)
(2)当URB已经提交给某个usb设备,但该设备被remove了,硬件断开了,比如将模块从主机上拔掉,这种情况下URB的status字段就为-108(ESHUTDOWN)

下面举几个例子:
使用 busybox microcom /dev/ttyUSB2 命令打开模块的AT口(open /dev/ttyUSB2),什么都不输入,然后 ctrl+x 退出 microcom(close /dev/ttyUSB2),相应的usbmon log如下:

可以看到,当主动退出microcom时,相应的URB的status字段值为-2,对应到串口驱动中就是调用了usb_wwan_close()中的usb_kill_urb()

对应的E(submission error)是在回调函数重新提交URB产生的,此时串口已经close,再去提交就产生了错误。

后面URB的status字段为-1(EPERM),这里分析usb_submit_urb() 的代码,可以看到-1是 usb_submit_urb()的返回值
usb_submit_urb
return usb_hcd_submit_urb;
同样使用 busybox microcom /dev/ttyUSB2 命令打开模块的AT口,然后此时拔掉EVB板,断开usb设备,对应的usbmon log如下,可以比较和前面的区别:
-108(ESHUTDOWN)是usb物理层断开URB对应的status
下面再看一下模块autosuspend过程中的usbmon log:

echo auto > /sys/bus/usb/devices/3-2.1/power/control 使用模块的autosuspend

ffff8800ba722240 2220899617 S Ci:3:009:0 s 80 00 0000 0000 0002 2 <
ffff8800ba722240 2220901604 C Ci:3:009:0 0 2 = 0000
ffff8800b7da3a40 2220901706 S Ii:3:009:5 -115:256 10 <
ffff8800b7da2180 2220901759 S Bi:3:009:4 -115 4096 <
ffff8800b7da2240 2220901798 S Bi:3:009:4 -115 4096 <
ffff8800b7da2f00 2220901824 S Bi:3:009:4 -115 4096 <
ffff8800b7da2d80 2220901850 S Bi:3:009:4 -115 4096 <
ffff8800ba722240 2220901891 S Co:3:009:0 s 21 22 0003 0002 0000 0
ffff8800ba722240 2220902834 C Co:3:009:0 0 0
ffff8800b7da3a40 2220905343 C Ii:3:009:5 0:256 10 = a1200000 02000200 0000
ffff8800b7da3a40 2220905360 S Ii:3:009:5 -115:256 10 <
ffff8800b7da2180 2223569116 C Bi:3:009:4 -2 0 // ① 这里等待了2s(2223, 569116 - 2220, 905360),然后进入了autosuspend ② -2是这个URB在suspend函数中被usb_kill_urb()取消了

ffff8800b7da2180 2223569160 S Bi:3:009:4 -115 4096 <
ffff8800b7da2180 2223569172 E Bi:3:009:4 -1 0 // 这里和前面出现的原因相同,模块已经进入autosuspend,回调函数中又去提交这个URB
ffff8800b7da2240 2223569519 C Bi:3:009:4 -2 0
ffff8800b7da2240 2223569523 S Bi:3:009:4 -115 4096 <
ffff8800b7da2240 2223569528 E Bi:3:009:4 -1 0
ffff8800b7da2f00 2223569776 C Bi:3:009:4 -2 0
ffff8800b7da2f00 2223569810 S Bi:3:009:4 -115 4096 <
ffff8800b7da2f00 2223569815 E Bi:3:009:4 -1 0
ffff8800b7da2d80 2223570119 C Bi:3:009:4 -2 0
ffff8800b7da2d80 2223570159 S Bi:3:009:4 -115 4096 <
ffff8800b7da2d80 2223570167 E Bi:3:009:4 -1 0
ffff8800b7da3a40 2223571635 C Ii:3:009:5 -2:256 0
ffff8800ba722540 2223571783 S Co:3:009:0 s 00 03 0001 0000 0000 0
ffff8800ba722540 2223572943 C Co:3:009:0 0 0

ffff8800ba722540 2223573179 S Co:3:003:0 s 23 03 0002 0001 0000 0 // 这里是hub发出的,Port1:PORT_SUSPEND
ffff8800ba722540 2223574608 C Co:3:003:0 0 0

原文链接:https://blog.csdn.net/weijuban5324/article/details/105817537
---

原文链接:https://blog.csdn.net/hdmsfhfg1/article/details/106187648/

标签:usb,URB,urb,Bi,Linux,数据格式,009,usbmon,USB
From: https://www.cnblogs.com/qiynet/p/17754131.html

相关文章

  • USB延长线太长(30米)还能正常用吗
    绝对不能正常了,我用秋叶原的网线,自己做的USB延长线,最长15米,但大多数的外设都不认了,只有个无线网卡还能用。----------------理论上可以,但是过长,会影响传输效率,最好不要太长----------------一般延长线都是连接电脑手机或充电器,电压就四五伏,那么长的延长线,电阻肯定会比常规的大很多,......
  • Linux--防火墙
    一、前言    很多时候在配置Linux系统程序的时候需要指定端口,在进行设置时会有报错:firewalldisnotrunning,即防火墙没有开启。二。解决办法---开启防火墙    2.1、检查防火墙状态        命令:systemctlstatusfirewalld       ......
  • linux 中删除文本中第一个.号之前的内容
     001、方法1利用cut[root@pc1test01]#lsa.txt[root@pc1test01]#cata.txt##测试数据001.002.003.004.005006.007.008.009.010011.012.013.014.015016.017.018.019.020021.022.023.024.025026.027.028.029.030[root@pc1test01]#cut-d".&q......
  • Linux-文件管理命令
    绝对路径:从根目录开始描述的路径pwd输入即为绝对路径,开头一定是“/”,因为一定是从根目录开始走相对路径:从当前路径开始描述的路径,开头不一定是“/”,因为不一定是从根目录开始走的.:是当前目录。。:是上层目录~/:家目录家目录:/home常用文件命令1、删除命令并且换行ctrl+c......
  • Linux系统调优
    Linux系统调优是一项重要的任务,通过调整系统参数可以提高系统性能和稳定性。下面是一些常见的Linux系统调优参数的详解:vm.swappiness:该参数控制内核对页面交换(Swap)的倾向程度。取值范围为0到100,默认值为60。较低的值(如10)表示内核更倾向于使用物理内存而非Swap空间,而较高的值(如90)则......
  • 七张图看懂 Linux profiling 机制
    1图1Linuxprofiling手段一览软件埋点:手动埋点:主动调用trace函数来实现埋点。Androidsystrace即是这样一个例子,如图2和图3所示自动埋点:借助工具链,自动埋点,对函数的entry和return进行hook。Linuxftrace即是这样一个例子,图4简示了其实现原理动态埋......
  • Linux_JXNUSevenWeek_vi编辑器
    frompixivVI编辑器入门使用案例移动编辑文本编辑这里o的作用是回到原来光标的位置,其一个作用如:当我选择了灰色这一段内容,现在我的光标在其下面,现在我想要还要选择其上面一段内容,这个时候可以按o,然后光标回到原来的地方,现在可以按k,选择上面一段内容其......
  • Linux 基金会分叉 Terraform,正式推出 OpenTofu
    Linux 基金会宣布推出OpenTofu,这是一个Terraform的开源替代方案,并且分叉自Terraform。OpenTofu原名OpenTF,为所有人提供了一个在中立治理模式下的可靠的开源替代方案。Terraform是HashiCorp开源的一个安全和高效的用来构建、更改和合并基础设施的工具。Terraform......
  • linux基础的知识
    Linux基础知识一:yum管理软件包1:了解yumyum是linux安装一些服务或者软件的rpm包的一个工具,因为解决了软件的依赖关系,就不需要安装了这个软件又要去安装另外的软件,所以非常的方便。2:yum仓库的配置文件/etc/yum.repos.d是yum仓库的配置的文件,文件必须以.repo结尾,否则不生效,repo......
  • linux默认设置默认JDK(ubuntu)
    sudoupdate-alternatives--install/usr/bin/javajava/tmp/jdk1.8.0/bin/java300sudoupdate-alternatives--install/usr/bin/javacjavac/tmp/jdk1.8.0/bin/javac300 设置:#setjavaenvironmentexportJAVA_HOME=/tmp/jdk1.8.0exportJRE_HOME=${JAVA_HOME}/jree......