gpt4 book ai didi

c++ - Omnet++ : Adding parameters to the Frame's type/Length Field

转载 作者:太空宇宙 更新时间:2023-11-04 13:07:24 26 4
gpt4 key购买 nike

我在 EtherIIFrame 中添加了一个参数,其中 etherType 和 Length 为 vlanID

奇怪的是,当我对 etherType 采取相同的步骤只是命名不同时,它的工作方式却不同。

// Omnetpp.ini
**.Host1.app.etherType = 0x3E8
**.Host1.app.vlanID = 1

// TraffGen.ned
int etherType = default(0);
int vlanID = default(0);

// Etherframe.msg
enum EtherType;
enum VlanID;

packet EthernetIIFrame extends EtherFrame
{
byteLength = ETHER_MAC_FRAME_BYTES;
int etherType @enum(EtherType);
int vlanID @enum (VlanID);
}

// Ieee802Ctrl.msg
enum EtherType
{
Ether1 = 0x3E8;
Ether2 = 0x3E9;
Ether3 = 0x3EA;
Ether4 = 0x3EB;
Ether5 = 0x3EC;
Ether6 = 0x3ED;
Ether7 = 0x3EF;
}

enum VlanID
{
priority1 = 1;
priority2 = 2;
priority3 = 3;
priority4 = 4;
priority5 = 5;
priority6 = 6;
priority7 = 7;
priority8 = 8;
}

// FrameTypeclassifer.cc
if (pframe->getEtherType() == Ether1)
send(msg, "queue1in");

// Framevlanvlassifier.cc
if (pframe->getVlanID() == priority1)
send(msg, "queue1in");

在两种情况下,通过在分类器的条件之前添加这一行,分类器会发生差异

EV_DETAIL << "THE CLASSIFIER READ THE VLAN = " << pframe->getVlanID() << endl;
EV_DETAIL << "THE CLASSIFIER READ THE VLAN = " << pframe->getEtherType() << endl;

我得到以下结果,在 VlanID 的情况下,值永远不会从 0 改变,没有检测到我从 ini 文件中提供的输入

DETAIL (FrameVIDClassifier)Mysimulation.switch.eth[2].queue.classifier: THE CLASSIFIER READ THE VLAN = 0

而在以太网类型的情况下,它会正确检测每个帧中的以太网类型

DETAIL (FrameTypeClassifier)Mysimulation.switch.eth[2].queue.classifier: THE CLASSIFIER READ THE VLAN = 1000

我尝试在 .msg 文件中使用十六进制,但还是一样,所以这不是问题所在。

知道会有什么不同吗?

最佳答案

我注意到我没有使用 set 函数将输入值设置到框架。所以分类器正在读取构造函数设置的值。

void EtherTrafGen::sendBurstPackets()
{
etherctrl->setEtherType(etherType);
etherctrl->setVlanID(vlanID);
}

void EtherEncap::processPacketFromHigherLayer(cPacket *msg)
{
if (etherctrl)
eth2Frame->setEtherType(etherctrl->getEtherType());
eth2Frame->setVlanID(etherctrl->getVlanID());
frame = eth2Frame;
}

void EtherEncap::processFrameFromMAC(EtherFrame *frame)
{
if (dynamic_cast<EthernetIIFrame *>(frame) != nullptr)
{
etherctrl->setEtherType(((EthernetIIFrame *)frame)->getEtherType());
etherctrl->setVlanID(((EthernetIIFrame *)frame)->getVlanID());
}
}

// constructor setting the values to zeros if no values are found
EthernetIIFrame::EthernetIIFrame(const char *name, int kind) : ::inet::EtherFrame(name,kind)
{
this->setByteLength(ETHER_MAC_FRAME_BYTES);

this->etherType = 0;
this->vlanID = 0;
}

为了让 etherctrl 调用它应该在 IeeeCtrl.msg 中的函数

class Ieee802Ctrl
{
int etherType @enum(EtherType); // used with ~EthernetIIFrame
int vlanID @enum(VlanID);
}

关于c++ - Omnet++ : Adding parameters to the Frame's type/Length Field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41597319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com