0

我有必要添加对我们设计中的 FPGA 在 MAC 头和有效负载之间的传入以太网帧中插入的专有头的支持。显然必须挖掘 tcpdump 源代码和 libpcap,但是任何人都可以给出一些关于从哪里开始的提示,以便我可以节省时间吗?

4

1 回答 1

1

您需要做的第一件事是为您的专有标头获取DLT_/LINKTYPE_值。请参阅tcpdump.org 网站上的链接层标头类型页面,了解现有的 DLT_/LINKTYPE_ 链接层标头类型值以及有关如何在内部使用DLT_USERn 个值之一或获取分配的新值(如果您打算让组织以外的人使用它。

一旦你分配了值,你就必须在 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.hand netdissect.h,并为它添加一个条目,带有例程名称 and DLT_ndo_printers[]如果你复制ether_if_print()(你应该)或者printers[]如果你没有(如果你没有,你将不得不&gndo作为第一个参数传递给ether_print())。这些数组在tcpdump.c.

于 2013-04-22T20:54:09.580 回答