如何解决在 omnet++ INET 模型的 EthernetSwitch
我正在使用 omnet++ 6.0 和 INET 4.3,遇到了与 PacketGate-Scheduler 模块相关的运行时错误。
在模拟配置中,两台以太网主机(inet/node/ethernet/EthernetHost2.ned)与一台以太网交换机(inet/node/EthernetSwitch.ned)相连。对于EthernetMAC(inet/linklayer/ethernet/basic/)的队列,首先使用EthernetSwitch的EthernetInterface(inet/linklayer/ethernet/)模块的子模块EthernetQoSQueue(inet/linklayer/ethernet/common/)模块。这个EthernetQoSQueue由classifier-queue-scheduler组成。在这种情况下,没有问题。
配置如下。 hdc_switch 除了一些参数外,与 EthernetSwitch 相同。
import inet.node.ethernet.EthernetHost2;
import inet.node.ethernet.EthernetSwitch;
import ned.DatarateChannel;
network hdc
{
types:
channel ethernetline extends DatarateChannel
{
parameters:
delay = 0.1us;
datarate = 1Gbps;
}
submodules:
hostA: EthernetHost2 {
parameters:
@display("p=250,100");
}
hostB: EthernetHost2 {
parameters:
@display("p=401,233");
}
switch: hdc_switch { //EthernetSwitch {
parameters:
@display("p=250,200");
gates:
ethg[2]; // @loose;
}
connections:
switch.ethg[0] <--> ethernetline <--> hostA.ethg;
switch.ethg[1] <--> ethernetline <--> hostB.ethg;
}
后来我在 EthernetQoSQueue 添加了一个 gate 子模块 (inet/queueing/gate/PacketGate.ned),它变成了一种 GatingPriorityQueue(inet/queueing/queue/)。 PacketGate 设置为从模拟开始就保持始终开启状态。
没有门模块,模拟运行没有问题。但是添加门模块后,仿真会因运行时错误而停止。下面的模拟日志显示第一个数据包 pk-9-1 成功通过了 GatingPriorityQueue 模块。但是在下一个数据包到达并被交换机的子模块(例如中继模块..)处理之前,GatingPriorityQueue 的调度程序试图过早地从门子模块中拉出数据包并因运行时错误而中止,因为还没有数据包通过门子模块。
下面是模拟日志消息的一部分。一些日志消息被添加到默认调度程序日志消息中。 在日志消息的上半部分,我们可以看到第一个数据包 pk-9-1 通过 Classifier 插入到 Queue,然后 Scheduler 检查 Queue。然而,日志消息的最后一部分显示没有数据包通过分类器进入队列,但调度程序检查队列被调用导致错误。
这个错误似乎是由于在数据包源(队列)为空时调用了 PacketSchedulerBase::pullPacket()。那么问题来了,如何保证pullPacket()只在包源不为空的情况下才被调用。
INFO:Processing packet from network,incomingInterface = eth0 ID:100 MTU:1500 UP broADCAST CARRIER MULTICAST macAddr:0A-AA-00-00-00-03,incomingPacket = (Packet)pk-9-1 (1287 B) [EthernetPhyHeader | EthernetMacHeader,typeOrLength = 1269 | Ieee8022LlcHeader,dsap = -1,ssap = -1,control = 3 | ByteCountChunk,length = 1266 B,data = 63 | EthernetFcs,fcs = 3222126605,fcsMode = 1 (FCS_DECLARED_CORRECT)].
INFO:Learning peer address,sourceAddress = 0A-AA-00-00-00-01,incomingInterface = eth0 ID:100 MTU:1500 UP broADCAST CARRIER MULTICAST macAddr:0A-AA-00-00-00-03.
INFO (MacAddresstable)hdc.switch.macTable:Adding entry to Address Table: 0A-AA-00-00-00-01 --> interfaceId 100
INFO:broadcasting packet to all interfaces except incoming interface,destinationAddress = 0A-AA-00-00-00-02,outgoingPacket = (Packet)pk-9-1 (1287 B) [EthernetMacHeader,fcsMode = 1 (FCS_DECLARED_CORRECT)].
INFO:Sending packet to peer,outgoingInterface = eth1 ID:101 MTU:1500 UP broADCAST CARRIER MULTICAST macAddr:0A-AA-00-00-00-04,packet = (Packet)pk-9-1 (1287 B) [EthernetMacHeader,fcsMode = 1 (FCS_DECLARED_CORRECT)].
** Event #9 t=0.007969205046 hdc.switch.eth[1].mac (EthernetMac,id=63) on pk-9-1 (inet::Packet,id=50)
INFO:Received (inet::Packet)pk-9-1 (1287 B) (inet::SequenceChunk) length = 1287 B from upper layer.
DETAIL:Frame (inet::Packet)pk-9-1 (1287 B) (inet::SequenceChunk) length = 1287 B arrived from higher layer,enqueueing
INFO (SimpleClassifier)hdc.switch.eth[1].mac.queue.classifier:Classifying packet,fcsMode = 1 (FCS_DECLARED_CORRECT)].
INFO (PacketQueue)hdc.switch.eth[1].mac.queue.queue[0]:Pushing packet,fcsMode = 1 (FCS_DECLARED_CORRECT)].
INFO (PriorityBuffer)hdc.switch.eth[1].mac.queue.buffer:Adding packet,fcsMode = 1 (FCS_DECLARED_CORRECT)].
INFO (PriorityScheduler)hdc.switch.eth[1].mac.queue.scheduler: PacketSchedulerBase::handleCanPullPacketChanged() with callSchedulePacket() PacketSchedulerBase::pullPacket() with callSchedulePacket()
INFO (PriorityScheduler)hdc.switch.eth[1].mac.queue.scheduler: !! 1 PacketSchedulerBase::callSchedulePacket() executed !! !!!!PriorityScheduler::schedulePacket(),providers size is 1 !!!!!!! inputIndex = 0 inProgressGateIndex = -1 canPullSomePacket value is 1
INFO (PacketQueue)hdc.switch.eth[1].mac.queue.queue[0]: !! 2 PacketSchedulerBase::callSchedulePacket() executed !! Pulling packet,fcsMode = 1 (FCS_DECLARED_CORRECT)].
INFO (PriorityBuffer)hdc.switch.eth[1].mac.queue.buffer:Removing packet,fcsMode = 1 (FCS_DECLARED_CORRECT)].
INFO (PacketGate)hdc.switch.eth[1].mac.queue.gate[0]:Passing through packet,fcsMode = 1 (FCS_DECLARED_CORRECT)].
INFO (PriorityScheduler)hdc.switch.eth[1].mac.queue.scheduler:PacketSchedulerBase::pullPacket,Scheduling packet,fcsMode = 1 (FCS_DECLARED_CORRECT)].
DETAIL:Transmitting a copy of frame (inet::Packet)pk-9-1 (1287 B) (inet::SequenceChunk) length = 1287 B
INFO:Transmission of (inet::Packet)pk-9-1 (1295 B) (inet::SequenceChunk) length = 1295 B started.
** Event #10 t=0.007979565046 hdc.switch.eth[1].mac (EthernetMac,id=63) on selfmsg EndTransmission (omnetpp::cmessage,id=36)
INFO:Transmission of (inet::Packet)pk-9-1 (1287 B) (inet::SequenceChunk) length = 1287 B successfully completed.
DETAIL:Start IFG period
** Event #11 t=0.007979661046 hdc.switch.eth[1].mac (EthernetMac,id=63) on selfmsg EndIFG (omnetpp::cmessage,id=37)
DETAIL:IFG elapsed
INFO (PriorityScheduler)hdc.switch.eth[1].mac.queue.scheduler: PacketSchedulerBase::pullPacket() with callSchedulePacket()
INFO (PriorityScheduler)hdc.switch.eth[1].mac.queue.scheduler: !! 1 PacketSchedulerBase::callSchedulePacket() executed !! !!!!PriorityScheduler::schedulePacket(),providers size is 1 !!!!!!! inputIndex = 0 inProgressGateIndex = -1 canPullSomePacket value is 0
<!> PacketSchedulerBase::callSchedulePacket(),Scheduled packet from invalid input gate: -1 with inputGates_size = 1 -- in module (inet::queueing::PriorityScheduler) hdc.switch.eth[1].mac.queue.scheduler (id=73),at t=0.007979661046s,event #11
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。