如何在OMNet ++中直接将数据包注入另一个模块

时间:2016-03-22 06:11:23

标签: omnet++

我的复合模块是多层,如附图所示。 enter image description here

这里Layer2有一个cPacketQueue缓冲区,我希望Layer1模块直接将数据包插入到Layer2的cPacketQueue中。 Layer1和Layer2门是单向连接的,如图所示。

Layer1Gate --> Layer2Gate

更新:

Layer 1创建具有不同优先级(0-7)的数据包,并在名为8的{​​{1}}中注入cPacketQueuesLayer2,(我是索引)。

priorityBuffers[i]然后在Layer2中发送自我消息,以轮询每个intervals of 10nsiteration数据包中的所有缓冲区。

这就是我现在所做的一切。它工作正常。但我知道10ns轮询肯定不是一种有效的方法来实现这一目标并实现QoS。所以要求更好的替代方案。

1 个答案:

答案 0 :(得分:2)

我建议为Layer1的每个数据包添加一个send()对象,使用ControlInfo命令发送数据包,然后在{{1}中检查收到的数据包的Layer2然后,将数据包插入特定队列。
首先,应该为ControlInfo定义一个类,例如common.h

// common.h
class PriorityControlInfo : public cObject {
public:
    int priority;
};

然后在Layer1简单模块的C ++代码中:

#include "common.h"
// ...
// in the method where packet is created
cPacket * packet = new cPacket();
PriorityControlInfo * info = new PriorityControlInfo();
info->priority = 2;  // 2 is desired queue number
packet->setControlInfo(info);
send (packet, "out");

最后在Layer2

#include "common.h"
// ...
void Layer2::handleMessage(cMessage *msg) {
    cPacket *packet = dynamic_cast<cPacket *>(msg);
    if (packet) {
        cObject * ci = packet->removeControlInfo();
        if (ci) {
            PriorityControlInfo * info = check_and_cast<PriorityControlInfo*>(ci);
            int queue = info->priority;
            EV << "Received packet to " << static_cast<int> (queue) << " queue.\n";
            priorityBuffers[queue].insert(packet);
            EV << priorityBuffers[queue].info() << endl;
        }
    }
}

根据自我消息的使用:我不清楚你的意图是什么。

  1. Layer2收到后会立即发送数据包吗吗?如果是,为什么要使用缓冲区?在这种情况下,Layer2应该将数据包发送到Layer3而不是将数据包插入缓冲区。
  2. 收到数据包并将其插入缓冲区后,Layer2是否应该执行其他操作?如果是,请在上面的handleMessage()
  3. 中调用此操作(功能)

    在上述两种变体中,不需要使用自我消息。