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



im试图构建一个节点使用以太网进行通信的网络。我的计划是创建一条消息,该消息将在节点内的多个简单模块中使用,并将该信息传递给inet::Packet,然后在节点之间发送。因此,我首先试图通过实现一个简单的网络来理解如何使用通信协议,其中一个节点创建一个数据包,另一个节点接收它。我试图创建数据包,但在接收到它时,节点通知协议未知并将其丢弃。我遵循EtherTrafficGen.cc的示例,inet文件夹中的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(。您应该看看例如EtherAppClient是如何实现的。您的代码几乎是正确的,但您应该使用Ieee8022LlcSocket将数据包从应用程序直接发送到链接层。

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

主机内部的ISO层使用协议ID来正确路由数据包。协议注册由Ieee8022LlcSocket处理。如果使用send直接发送数据包,则协议id将不会被填充,并且会发生各种问题。

通常,应用程序应始终使用套接字与较低OSI层通信。

最新更新