![]() ![]() ![]() | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
kazuki | 投稿日時: 2011/7/12 16:22 |
新米 ![]() ![]() 登録日: 2011/3/24 居住地: 投稿: 8 |
パケット保存用のキュー作成 こんにちは,
お世話になっております. 現在,ネットワーク層にて送受信したパケットを保持しておくための キューを作成したいと思っております. 無線環境でプロミスキャスモードを使用し,中継するものも含めて すべてのパケット保持しておきたいと考えております. (保持したパケットはネットワークコーディングに利用) このような保持用のキューの作成についてなにかご教授いただけ ないでしょうか. ソースコードを見ながらMACレイヤから上がってきたパケットなどを MESSAGE_Duplicate(node, msg); で複製しておき, void NetworkIpCreateQueues で新しいキャッシュ用のQueueを宣言して,その中に入れれないのか. という感じに考えていたのですが,実装に関して知識が乏しく うまくいきません. アドバイスをいただければ嬉しいです. よろしくお願い致します. |
gp | 投稿日時: 2011/7/13 16:02 |
新米 ![]() ![]() 登録日: 2005/12/2 居住地: 投稿: 13 |
Re: パケット保存用のキュー作成 こんにちは。
kazukiさんの方針でいけると思います。 たとえばですが、 ・キューをノード毎に作成するなら、struct NetworkDataIpに、 インタフェース毎に作成するなら、struct IpInterfaceInfoTypeに、 保持用キューのメンバを追加しておきます。 ※元々存在するキューはスケジューラが持っていますが、その必要がなければ上記のような持ち方でよいかと思います。 ・NetworkIpCreateQueues()内などで、保持用キューのオブジェクトを生成しておきます。(newしてQueue::SetupQueue()を呼び出す) ・MACレイヤからのパケットをNetworkIpReceivePacket()内などで、複製し、保持用キューにQueue::insert()でキューイングします。 それでは、もう少し試してみてください。参考になれば幸いです。 |
kazuki | 投稿日時: 2011/7/14 13:23 |
新米 ![]() ![]() 登録日: 2011/3/24 居住地: 投稿: 8 |
Re: パケット保存用のキュー作成 こんにちは.
gpさん, お返事ありがとうございます. キューはノード毎に作成するのが望ましいのでstruct NetworkDataIpに 手を加えようとおもいます. しかし,保持用キューのメンバーというのがよくわからないのですが, よろしければ教えていただけないでしょうか. また, void NetworkIpCreateQueues(…){ のなかで自分のキャッシュ用のキューとして NetworkIpInitCacheQueueConfiguration(node,nodeInput,interfaceIndex); を作り, NetworkIpInitInputQueueConfiguration(node,nodeInput,interfaceIndex); と同じように(というかほぼコピペで)初期化の処理(cachequeueをnewしてcachequeue->SetupQueue(…))を行いました. しかし,疑問なのですが void NetworkIpQueueInsert(…)では (*scheduler).insert(msg, queueIsFull, queueIndex, NULL, //const void* infoField, getSimTime(node)); といった感じにキューに入れられているのですが,この時どのキューに キューイングするなどはどこで見分けられるのでしょうか. queueIndexだとしても,Queue::insert(…)の方にqueueIndexについての 表記がないように思うのですが. Queue::insert(…)についての使用法や理解自体が間違っているので しょうか. よろしければ教えていただけないでしょうか. 質問ばかりで,すみません. 基本的なことを聞いているかもしれませんんがよろしくお願いいたします. |
gp | 投稿日時: 2011/7/14 14:27 |
新米 ![]() ![]() 登録日: 2005/12/2 居住地: 投稿: 13 |
Re: パケット保存用のキュー作成 スケジューラの中に保持用のキューを持たせる必要はない、という前提で記述しています。
保持用のキューとして、便利なのでQueueクラスを利用しているだけと思ってもらえればよいです。(スケジューラの処理は使っていません。) 引用: しかし,保持用キューのメンバーというのがよくわからないのですが, struct NetworkDataIpの一番後ろにこんな感じでメンバを追加するという意味です。
引用: NetworkIpInitInputQueueConfiguration(node,nodeInput,interfaceIndex); と同じように(というかほぼコピペで)初期化の処理(cachequeueをnewしてcachequeue->SetupQueue(…))を行いました. NetworkIpInitInputQueueConfiguration()は、スケジューラを作成し、その中にキューを作成する処理ですが、 スケジューラの中にキューを持つ必要がなければ、シンプルに追加したメンバの初期化を行うのみでよいと思います。
引用: しかし,疑問なのですが void NetworkIpQueueInsert(…)では (*scheduler).insert(msg, queueIsFull, queueIndex, NULL, //const void* infoField, getSimTime(node)); といった感じにキューに入れられているのですが,この時どのキューに キューイングするなどはどこで見分けられるのでしょうか. これも初期化の場合と同様、NetworkIpQueueInsert()はスケジューラが保持するキューに対する処理なので、このAPIを使用する必要はないと思っています。 追加したメンバにキューイングしたい場合は、直接Queue::insert()を呼べばよいですね。 |
kazuki | 投稿日時: 2011/7/14 19:22 |
新米 ![]() ![]() 登録日: 2011/3/24 居住地: 投稿: 8 |
Re: パケット保存用のキュー作成 gpさん,
ありがとうございます. 教えていただいた通りにするとcacheQueueへのキューイングができました.
ただ,numPacketsの変動によりキューイングがなされていることは わかるのですが,キューイングされたパケットを参照することは できないのでしょうか. VisualStadioのデバックで見たところ ip->cacheQueue->packetArrayに一応msgがあるのですが, 値が入っていないようです. 重ねての質問で申し訳ありませんが,よろしくお願い致します. |
gp | 投稿日時: 2011/7/15 15:39 |
新米 ![]() ![]() 登録日: 2005/12/2 居住地: 投稿: 13 |
Re: パケット保存用のキュー作成 おそらく、ip->cacheQueue->packetArray[0]を見ているのだと思います。
Queue::insert()の処理を見ると、packetArrayのIndexが0からではなく、1から設定されることが分かります。 ですので、ip->cacheQueue->packetArray[1]を見ると、キューイングしたパケットが入っていると思います。 |
kazuki | 投稿日時: 2011/7/22 12:40 |
新米 ![]() ![]() 登録日: 2011/3/24 居住地: 投稿: 8 |
Re: パケット保存用のキュー作成 gpさん,
お返事が遅れてしまい申し訳ありませんでした. ご指摘通り,packetArray[0]を見ていたようです. 長々と質問したにも関わらず,丁寧に答えていただきありがとうございます. 引き続き実装を進めていきたいと思います. また,質問したときはよろしくお願い致します. |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |