在我现在正在测试的系统中,它有几个链接在一起的虚拟 L2 设备,以在 Eth 标头和 IP 标头之间添加我们自己的 L2.5 标头。现在当我使用
tcpdump -xx -i vir_device_1
,它实际上显示了带有 IP 标头的 SLL 标头。如何捕获实际从 vir_device_1 发出的完整数据包,即在 ndo_start_xmit() 设备调用之后?
如何捕获实际从 vir_device_1 发出的完整数据包,即在 ndo_start_xmit() 设备调用之后?
通过编写自己的代码直接使用 PF_PACKET/SOCK_RAW 套接字(你说“SLL 标头”,所以这可能是 Linux),或者通过:
ARPHRD_
为你的虚拟接口分配了一个特殊的值;DLT_USER
n 个值之一,或向 tcpdump-workers@lists.tcpdump.org 要求DLT_
为它们分配一个官方值;ARPHRD_
值映射到DLT_
您正在使用的值;DLT_
值;请注意,DLT_USER
n值是专门为私人使用而保留的,并且任何官方版本的 libpcap、tcpdump 或 Wireshark 都不会将它们分配给自己使用(即,如果您使用DLT_USER
n值,请不要费心提供补丁来分配它对您的标头类型的价值,因为它们不会被接受;其他人可能已经将它用于他们自己的特殊标头,并且必须继续支持),因此您必须维护 libpcap 的修改版本, tcpdump 等,如果您使用其中一个值而不是获得指定的官方值。
感谢 Guy Harris 为我最初的问题提供了非常有用的答案!
我将此添加为我在评论中提出的后续问题的答案/注释。基本上我的问题是 PF_PACKET/SOCK_RAW 收到的数据包的状态是什么。
对于软件设备(无队列),dev_queue_xmit()
将调用dev_hard_start_xmit(skb, dev)
开始传输 skb 缓冲区。该函数在调用dev_queue_xmit_nit()
之前调用dev->ops->ndo_start_xmit(skb,dev)
,这意味着 PF_PACKET 看到的数据包处于进行任何更改之前的状态ndo_start_xmit()
。