メイン Scenario Setup & Configuration データパケットがマルチホップした経路を【Output Window】に出力させたい | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
gogotea | 投稿日時: 2012/1/20 16:04 |
新米 登録日: 2011/12/31 居住地: 投稿: 8 |
データパケットがマルチホップした経路を【Output Window】に出力させたい こんにちは。
Qualnet5.0.2 routing protocolはolsr_inria を使用しています。 routing_olsr-inria.cppの #define DEBUG_OUTPUT 0 上のソース部分を #define DEBUG_OUTPUT 1 に変更すると、GUI画面の【Output Window】にOLSRのルーティングテーブルが表示されdestinationとnexthopをたどりながら見ることで、パケットがどのような経路を通ってマルチホップしたかを確認することができます。 しかし、例えば100ノードを設置し、上記の方法でマルチホップした経路を確認しようとすると、ノードの数が多いのでマルチホップする回数も増えていき、目でルーティングテーブルを追っていく作業がとても大変になります。(実際に16hopの通信を4本追ったことがありますが、非常に大変でした。) 実際に見たいのは、ルーティングテーブルではなく、データパケットがどの経路を通ったかという情報です。 そこで今後の研究のためにも、【Output Window】にデータパケットがマルチホップした経路を出力されるように改良したいと考えているのですがどうすればいいでしょうか?(packets traceというQualnetの機能もあるそうですが、ノード数が多い環境では動作が非常に遅くオススメできないと聞きます。) 出力例: 169.0.0.1→169.0.0.2→169.0.0.3→......->169.0.0.100 (IPアドレスでなくてNode番号でも構いまえん) 私はolsr_inriaを使用していますので、経路はTCメッセージなどで構築しているはずです。しかし、それは経路を構築しているだけであって、実際にパケットのフォワーディングを行っている部分はolsrに依存しない部分で行われていると考えているので、olsrであることに特にこだわる必要はないと思っています。 マルチホップした経路を知りたいと思ったのは私が初めてだとはとても思えませんので、フォーラムユーザの中にこの疑問を解決した人がいるかもしれないと思い質問させていただきました。 以下は自分なりにとってみた行動をまとめてみました。 関連ワードとして、destination,nexthop,fowardingなどが考えられるので、これらのワードを主軸に関連深いソース部分を探してみましたが、 検索してヒットする量が多く、目星をつけるのも中々大変といった現状です。 フォワーディングを行っているソース部分なら nexthop=XXXXX このようにネクストホップを更新する部分があると予想しているので、そういった部分に目星をつけました。 見つかった中で特に関連深いと思ったのが以下の関数です。 // FUNCTION NetworkUpdateForwardingTable() // FUNCTION NetworkIpLoopbackForwardingTableReturnInterfaceAndNextHop() 前者の関数の中では forwardTable->row[i].destAddress = destAddress; forwardTable->row[i].destAddressMask = destAddressMask; forwardTable->row[i].interfaceIndex = interfaceIndex; forwardTable->row[i].nextHopAddress = nextHopAddress; このような記述が 公社の関数の中では *nextHopAddress = loopbackFwdTable->row[i].nextHopAddress; このような記述がありました。 関数の目的を自分なりに和訳したところ前者は IP routing tableにエントリーをアップデート(更新)もしくは加える関数 後者は destination IPアドレスと一緒に出力先のインターフェースとネクストホップIPアドレスを手に入れるために ルーティングテーブルを検索 どちらかといえば、後者の関数でデータパケットのフォワーディングを行っているような気がしたので、一旦、 loopbackFwdTable->row[i].nextHopAddress ↑の変数の値をprintf()関数で出力させようとしましたが、ここの行は実行されないことが分かりました。(ブレークポイントをつけてデバッグしても通らなかった。) 1つ目の関数内で挙げた4つの変数が更新される行はデバッグは通るのですが、そこにブレークポイントをつけたらデバッグが止まったので実行はされるようですが、止まった時のコマンドプロンプト画面をみると まだデバッグは序盤のようで、データパケット送信のタイミングでとまったわけではないことがわかります。 (CurrentSimtime=60からデータパケットを送信する設定でしたが、まだCurrentSimTimeという文字すらコマンドプロンプト上で出力されないのでわかります。) 中々思うようにいきません。 同じことにチャレンジしたことがある人、Qualnetにお詳しい方 アドバイスよろしくお願いします。 |
hed | 投稿日時: 2012/1/20 16:41 |
一人前 登録日: 2006/7/3 居住地: 京都 投稿: 81 |
Re: データパケットがマルチホップした経路を【Output Window】に出力させたい ぱっと思いついたのは以下の方法です。
-------------------------------------- (1) パケットに情報を追加する方法 (1-1) Transportからの受信時、転送時、Transportへの送信時に以下の情報をセットにしてパケットにMESSAGE_AddInfoなどで追加 ・時刻 ・IPアドレスやノードID (1-2) Transportへの送信時(Destinationでの受信時)に(1)で追加した情報を時系列にprintfなどする -------------------------------------- (2) 都度情報を出力する方法 (2-1) Transportからの受信時、転送時、Transportへの送信時に以下の情報をprintfなどで出力 ・データの識別子(シーケンス番号など) ・時刻 ・IPアドレスやノードID (2-2) 時系列で出力された情報を解析し、SrcからDstまでの経路を調べる -------------------------------------- (1)は出力は簡単ですがMessageに可変長の情報(何ホップになるかわからないので)を追加したりする必要があります。最大ホップ数がわかっていればその分まとめてメモリを確保しておけば済む話ではありますが。 Messageへの情報追加はProgrammersGuideに必要な情報はすべて書いてあります。あとQualNetHacksのMessage編も結構わかりやすかったです。 (2)は後から解析する際にデータの識別子などが必要になるかと思います。(1)と同様に自分で追加するかApplication等でふられている情報を覗き見て出力するかする必要があります。 プログラム的に簡単なのは(2)だと思います。 またTransportからの受信時、転送時、Transportへの送信時に該当する関数は以下の関数あたりからたどれば見つかるかと思います。 ・Transportからの受信時:NetworkIpReceivePacketFromTransportLayer ・転送時:ForwardPacket ・Transportへの送信時:SendToUdp これ以上の情報はありませんが、頑張ってください。 |
gogotea | 投稿日時: 2012/1/20 18:31 |
新米 登録日: 2011/12/31 居住地: 投稿: 8 |
Re: データパケットがマルチホップした経路を【Output Window】に出力させたい hedさん早速の回答ありがとうございました。
読んでみて、実際にできるか不安になりましたが(2)のほうで検討していこうと思います。Transport層前後でのパケットに動きに注意すればよかったんですね。 ・Transportからの受信時:NetworkIpReceivePacketFromTransportLayer ・転送時:ForwardPacket ・Transportへの送信時:SendToUdp 参考にさせて頂きます。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |