2016-03-22 5 views
1

私の複合モジュールは、添付の図に示すように複数のレイヤーです。ここで enter image description hereOMNet ++の別のモジュールにパケットを直接注入する方法

レイヤ2はcPacketQueueバッファを持っており、私はレイヤー1のモジュールは、直接レイヤ2のこのcPacketQueueにパケットを挿入します。レイヤー1とレイヤー2のゲートは、図のように片方向に接続されています。 UPDATED

Layer1Gate --> Layer2Gate 

Layer 1

は異なる優先度(0-7)持つパケットを作成し、priorityBuffers[i]と命名Layer28異なるcPacketQueues、(iはインデックスである)に注入します。

Layer2は、intervals of 10nsで自己メッセージを送信して、それぞれiterationsendのパケットをすべてポーリングします。

これはすべて私が今やっていることです。それはうまく動作します。しかし、私は10nsのポーリングがこれを行いQoSを達成する効率的な方法ではないことを知っています。だから、より良い選択肢を求めている。

+0

実際に質問したい質問が見つからないようです。マニュアルの[this](https://omnetpp.org/doc/omnetpp/manual/usman.html#sec161)の部分を探しているように私には聞こえるし、 [cPacketQueue.insert](https://omnetpp.org/doc/omnetpp/api/classcPacketQueue.html#a9ecf782bfd8f5c5f3749a945d040bafd)を使用して、ゲートからキューにイベントを移動するだけです。 –

+0

@ user3243499:「直接」とはどういう意味ですか? 'Layer1'と' Layer2'の間に遅延なしでチャンネルを定義すれば、 'send()'メソッドを使うことができます。 'Layer1'のパケットは' Layer2'で遅れなく受信されます。それは送られた)。そして、 'Layer2'の' handleMessage() 'では、受け取ったメッセージを' cPacket'オブジェクトにキャストして、あなたのキューに挿入するべきです。 'cPacket * packet = check_and_cast (msg); yourqueue-> insert(パケット); ' –

+0

@JerzyD。はい、それは遅れなく提供されます。しかし、問題は、レイヤ2で複数のバッファを使用してQoS(複数のバッファを使用する優先度)をサポートすることです。そして、私はレイヤ2で自己メッセージタイマーをスケジューリングする必要があります。これで、このバッファのポーリング間隔を 'scheduleAt()'を使って6nsと非常に小さく設定すると、シミュレーションは非常に遅くなり、パケットは最後に待機して見えます宛先モジュールに実際にパケットを配信することなく、 – user3243499

答えて

2

私は、send()コマンドを使用してパケットを送信する、Layer1からすべてのパケットを優先してControlInfoオブジェクトを追加し、その後Layer2で受信したパケットのControlInfoをチェックして、特定のキューにパケットを挿入示唆しています。
まず、一つはcommon.hで、例えば、ControlInfoのクラスを定義する必要があり:

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

を次にLayer1単純なモジュールのC++コードで:Layer2

#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"); 

そして最後:

#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()でこのアクション(関数)を呼び出します。

上記の両方の変形では、自己メッセージを使用する必要はありません。

+0

ありがとうございます。今私は考えを得た。 Jerzy、自己メッセージに関しては、パケットの優先順位をシミュレートしたいだけです。例えば、プライオリティ7パケットはプライオリティ6の前に送信され、プライオリティ6はプライオリティ5パケットの前に送信されるべきである。 'self messages'を全く使わずにこれを達成する方法を提案してください。 – user3243499

+0

解決策は、「レイヤ3」伝送手順に依存します。少なくとも2つの可能性があります:** 1。** 'Layer3'がフレーム(パケット)を送信したいとき、' Layer3'は要求を 'Layer2'に送ります。この要求を受信した直後に、「Layer2」はpriorityBuffers [7]にパケットがあるかどうかをチェックし、そうであればこのパケットをとり、Layer3に送ります。そうでない場合、 'Layer2'はpriorityBuffers [6]などをチェックします。このように' Layer2'は常に 'Layer3'からの要求を待っています。要求は、通常の 'cMessage'オブジェクトとしてモデル化することができます。 –

+0

** 2 ** ** Layer2は、一定期間(例えば、1ms)ごとにいくつかの数のパケットを「Layer3」に送信しなければならないことを知っている。その状況では、自己のメッセージを使用する必要があります。 'Layer2'は' priorityBuffers [7] 'にパケットがあるかどうかを確認する必要があります。はいの場合、このパケットを受け取り、レイヤ3に送信します。そうでない場合、 'Layer2'は' priorityBuffers [6] 'をチェックします。このように、自己メッセージをトリガする期間は' Layer3'での送信の概念に依存します。私は、 'Layer3'はさらに制限された量のバイトを送ることができ、この期間はこの制限を反映していると思います。 –

関連する問題