Omnet++ - 以太网数据包,未知协议

Omnet++ - Ethernet packet, unknow protocol

我正在尝试构建一个节点使用以太网进行通信的网络。我的计划是创建一个将在节点内的多个简单模块中使用的消息,并将该信息传递给 inet::Packet 并在节点之间发送。因此,我首先尝试通过实现一个简单的网络来了解如何使用通信协议,其中一个节点创建一个数据包,另一个节点接收它。我正在创建数据包,但在收到数据包后,节点通知协议未知并将其丢弃。我正在按照 inet 文件夹中的 EtherTrafficGen.cc、EtherAppClient.cc 和开发人员指南的示例尝试实现它,但我觉得我有点迷茫。

创建数据包的代码如下:

void masterDispatcher::initialize()
{
    // Message test that will be used in other modules
    Frame *test = new Frame;
    test->setTest(24);

    // Ethernet Packet
    inet::MacAddress destMACAddress;

    inet::Packet *datapacket = new inet::Packet("test", inet::IEEE802CTRL_DATA);

    // Data
    const auto& frame = inet::makeShared<EthernetFrame>();
    frame->setChunkLength(inet::B(1));
    frame->setTestEther(test->getTest());
    datapacket->insertAtBack(frame);

    // Header
    datapacket->addTagIfAbsent<inet::MacAddressReq>()->setDestAddress(destMACAddress.BROADCAST_ADDRESS);


    auto ieee802SapReq = datapacket->addTagIfAbsent<inet::Ieee802SapReq>();
    ieee802SapReq->setSsap(-1);
    ieee802SapReq->setDsap(-1);

    send(datapacket, "lowerLayerOut");

}

我使用的网络是图中的网络:Implemented Network。类似于INET的EtherHost,llc是EtherEncap,eth是IEthernetInterface。谁能给我一些如何使用此协议的提示?

您似乎想要实现一个使用以太网直接通信的应用程序(并且您出于任何原因不想使用 IP 或 UDP)。您应该看看 exampleEtherAppClient 是如何实现的。您的代码几乎是正确的,但是您应该使用 Ieee8022LlcSocket 将数据包从应用程序直接发送到 link 层。

https://github.com/inet-framework/inet/blob/v4.2.0/src/inet/applications/ethernet/EtherAppClient.cc#L185

主机内的 ISO 层使用协议 ID 来正确路由数据包。协议注册由 Ieee8022LlcSocket 处理。如果直接用send发包,protocol id不会填,会出现各种问题。

一般来说,应用程序应该始终使用套接字与to/from较低的OSI层通信。