这里Layer2有一个cPacketQueue
缓冲区,我希望Layer1模块直接将数据包插入到Layer2的cPacketQueue
中。 Layer1和Layer2门是单向连接的,如图所示。
Layer1Gate --> Layer2Gate
更新:
Layer 1
创建具有不同优先级(0-7)
的数据包,并在名为8
的{{1}}中注入cPacketQueues
个Layer2
,(我是索引)。
priorityBuffers[i]
然后在Layer2
中发送自我消息,以轮询每个intervals of 10ns
和iteration
数据包中的所有缓冲区。
这就是我现在所做的一切。它工作正常。但我知道10ns轮询肯定不是一种有效的方法来实现这一目标并实现QoS。所以要求更好的替代方案。
答案 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;
}
}
}
根据自我消息的使用:我不清楚你的意图是什么。
Layer2
收到后会立即发送数据包吗吗?如果是,为什么要使用缓冲区?在这种情况下,Layer2
应该将数据包发送到Layer3
而不是将数据包插入缓冲区。Layer2
是否应该执行其他操作?如果是,请在上面的handleMessage()
。在上述两种变体中,不需要使用自我消息。