当我为 PointToPointNetDevice 使用 MacTx TraceSource 时,如何在 NS3 中获取数据包的 source/destination IP 地址?

How to get source/destination IP address of a packet in NS3 when I am using MacTx TraceSource for PointToPointNetDevice?

我正在尝试在 NS3 中模拟 fattree 网络。我有 UdpServerHelperUdpClientHelper 来生成两台主机之间的流量。然后我打电话给

TraceConnectWithoutContext ("MacTx", MakeCallback (&SinkMethod)) 

在我的一个 NetDeviceContainer 节点上,我的 SinkMethod (Ptr<const Packet> pkt) 被成功调用。我可以使用 pkt->GetSize () 查看数据包大小,但尽管我花了相当多的时间浏览解决方案,但由于 header 好像是空的。

数据包上的 Headers 可以被 Peek()ed 或 Remove()d。但是,你只能 Peek() top-most header,这里是 link-layer header,例如。 PppHeader.

要访问 higher-layer header,必须先删除前面的 header。按照这些思路应该可以解决问题:

static void
RxDrop(Ptr<const Packet> packet) {
    /* 
     * Need to copy packet since headers need to be removed
     * to be inspected. Alternatively, remove the headers,
     * and add them back.
     */
    Ptr<Packet> copy = packet->Copy();

    // Headers must be removed in the order they're present.
    PppHeader pppHeader;
    copy->RemoveHeader(pppHeader);
    Ipv4Header ipHeader;
    copy->RemoveHeader(ipHeader);

    std::cout << "Source IP: ";
    ipHeader.GetSource().Print(std::cout);
    std::cout << std::endl;

    std::cout << "Destination IP: ";
    ipHeader.GetDestination().Print(std::cout);
    std::cout << std::endl;
}