我有必要添加对我们设计中的 FPGA 在 MAC 头和有效负载之间的传入以太网帧中插入的专有头的支持。显然必须挖掘 tcpdump 源代码和 libpcap,但是任何人都可以给出一些关于从哪里开始的提示,以便我可以节省时间吗?
1 回答
您需要做的第一件事是为您的专有标头获取DLT_
/LINKTYPE_
值。请参阅tcpdump.org 网站上的链接层标头类型页面,了解现有的 DLT_/LINKTYPE_ 链接层标头类型值以及有关如何在内部使用DLT_USER
n 个值之一或获取分配的新值(如果您打算让组织以外的人使用它。
一旦你分配了值,你就必须在 libpcap 上做一些工作:
如果您被分配了一个DLT_
值,则必须修改pcap/pcap.h
文件以添加该链接层类型(并更改该DLT_MATCHING_MAX
头文件和LINKTYPE_MATCHING_MAX
中的值pcap-common.c
,以便它们> =您的DLT_
值),或等待tcpdump.org 的任何人(可能是我)分配您的DLT_
值并更新 libpcap Git 存储库(此时您可以使用 top-of-trunk libpcap)。
如果您打算进行实时捕获,您可能需要向 libpcap 添加一个模块以支持硬件上的实时捕获,或者,如果您的设备看起来像操作系统的常规网络设备,以便您可以使用其本机捕获机制,修改该操作系统的模块以将操作系统使用的任何链路层标头类型值(例如,DLT_
*BSD/OS X 上的ARPHRD_
值或 Linux 上的值)映射到DLT_
您用于链路层标头类型的任何值。
您必须进行修改gencode.c
才能为您的DLT_
值编译捕获过滤器。
完成后,libpcap 现在应该可以工作了。
现在,对于 tcpdump:
添加一个if_print
处理专有标头的例程(无论是跳过它们还是为它们打印内容),调用ether_print()
,然后返回专有标头和以太网标头的长度之和(ETHER_HDRLEN
如 定义ether.h
)。参见示例ether_if_print()
。print-ether.c
将该例程的声明添加到interface.h
and netdissect.h
,并为它添加一个条目,带有例程名称 and DLT_
,ndo_printers[]
如果你复制ether_if_print()
(你应该)或者printers[]
如果你没有(如果你没有,你将不得不&gndo
作为第一个参数传递给ether_print()
)。这些数组在tcpdump.c
.