我需要知道我的Rx正在获取的数据包是否是ARP,以便为我的进程丢弃它们。
我已经看了ns3的手册和教程,但是我在它们中都没有发现数据包中包含哪种协议。
在ns3中有什么功能或部分让我知道我的数据包内的协议吗?或者我需要寻找报头的十六进制代码并将其与ARP代码进行比较吗?这应该是极其低效的,因为我必须对我在模拟中收到的每个数据包执行此操作。(既然我还没有完成,我不确定这是正确的方式,也不是完全可能的)。
感谢阅读
GetUid()不相关;它只是包数据结构的内部ID,与所承载的协议无关。
在ns-3中,数据包按照网络字节顺序序列化为缓冲区对象,类似于Linux内核skbuffs。检查数据包内容的一种强力方法是将数据包内容反序列化(复制)到一个单独的缓冲区中,并选取字节,正如您所提到的那样。不过,还有更好的办法。
如果您在Wifi层,并且您想了解您所拥有的数据包是否是ARP数据包,有两种主要方法可以了解这一点。首先,您可以检查数据包的报头。如果您在堆栈中只由WifiNetDevice添加了LlcSnapHeader的位置,您可以尝试查看该头并查看协议号(存储在Type字段中)。给定Ptr pkt,您可以尝试:
LlcSnapHeader llc;
pkt->PeekHeader (llc);
if (llc.GetType () == 0x0806)
{
// found an ARP packet
}
但是,请注意,如果您在堆栈中正在使用各种帧类型的地方,并不是所有的数据包都会有一个LlcSnapHeader,因此像上面这样的窥视可能并不可靠,或者您可能需要检查其他可能性。另外,如果您不够幸运,您所关心的报头位于数据包的最前面,请记住,复制数据包并从数据包副本中删除报头(实质上是将它们从堆栈中弹出)以获得所需的报头并不昂贵。
如果在模拟中启用了数据包元数据,则可以使用第二种技术。这是一个数据结构,包含关于所有已添加的头和尾的元数据,并且可以作为链表返回给客户端,可以扫描该链表以获取头信息。默认情况下,由于性能原因,它在模拟中被禁用,但可以通过在main()程序的开头调用它来启用:
Packet::EnablePrinting ();
然后使用Packet类的BeginItem()迭代器(参见ns-3 Doxygen)。据我所知,没有使用这一点的好的示例程序,但是在src/network/test中存在一个测试套件,它可能提供提示。