在 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 (将#修改为@)