在我正在测试的系统中,它有几个虚拟的L2设备链接在一起,在Eth头和IP头之间添加我们自己的L2.5头。现在当我使用
tcpdump -xx -i vir_device_1
,它实际上显示了带有IP标头的SLL标头。如何捕获实际流出vir_device_1的完整数据包,即在ndo_start_xmit()设备调用之后?
答案 0 :(得分:1)
如何捕获实际流出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的修改版本,等等,如果您使用其中一个值而不是分配官方值。
答案 1 :(得分:1)
感谢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()
中所做的任何更改之前的状态。