メイン Miscellaneous: Architecture & Generic Development Questions 特定ノードのソース改良 | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
junpei | 投稿日時: 2005/12/14 11:05 |
新米 登録日: 2005/10/15 居住地: 投稿: 19 |
特定ノードのソース改良 MANET環境で、ノードが10個横一線に配置されていて、Sender(ノード1)からReceiver(ノード10)まで、TCPによって通信を行う際に、途中のノード1つ(例えば、ノード5)になにか特別なソースの改良を行いたい場合にはどのように行えばよろしいのでしょうか?
よろしくおねがいします。 |
forum_support | 投稿日時: 2005/12/14 20:03 |
モデレータ 登録日: 2005/5/17 居住地: 東京都中野区中央4-5-3 ?構造計画研究所 投稿: 322 |
Re: 特定ノードのソース改良 まず、仰られているケースでは、ノードに関するソースコードを改造する
のではなく、"特別な処理を行わせたい箇所"つまり"改造対象の処理"を行 っているプロトコル、に関するコードを改造することになるはずです。 例えば途中ノードのIPフォワーディング処理をちょっと変えてみたい、と いう場合、network/ip.cppあたりを触ることになります。 以下は、とりあえず抽象的な説明をさせていただきます。 ここで、プロトコルに関するソースコードはノード毎に用意されてい るわけではなく、プロトコル毎にしか用意されていません。それではソー スコードを改造してしまったら、その改造の影響が全てのノードに反映 されてしまうではないか、という話になりますが、それは、そのプロトコ ルに新たなパラメータを追加し、シナリオ作成時のノード毎の設定でその パラメータの値を設定できるようにすることで対応します。ここで、プロ トコルのソースコードは1つですが、実際にシミュレーションが実行され るときには、そのプロトコルコードの実体(インスタンス)は各ノード毎に 存在し、それぞれのインスタンスは、自身に設定されたパラメータの値に 応じた動作をします。 パラメータは、各インスタンスの個性だと思ってもらえれば分かりやすい かと思われます。各インスタンスの個性は設定により変化させることがで きますが、あくまで、そのプロトコルのソースコードで定義された個性の 中からしか選ぶことはできません。仰られているようなケースを実現させ るためには、既存の個性の定義は残しつつ新たな個性の定義を追加してや る、ということになります。 改造の仕方ですが、まず、該当プロトコルの構造体にフラグ変数をひとつ 追加します。仮にint型のmyflagという変数だとします。そして、仮に上 記追加パラメータの名前がMYPARAMだとすると、configファイル読込時に MYPARAMで始まる行を読込んでそれを解析し、その値に応じて、当該ノー ドの当該プロトコルのmyflagの値を設定できるようにします。その上で、 実際の改造コード部分は、例えば、 if (myflag == 0) { 改造前処理; } else { 改造後処理; } というようにして書いていけばよいです。 IP層に関するパラメータを追加したいのであれば、 ・network/ip.cpp, NetworkIpAddNewInterface関数付近を改造する。 大体においてIO_Readxxxx など IO_Read系のAPIが使われている関数が 各プロトコルソースにあります。通常プロトコルインスタンスをシナリ オファイルに設定してあるパラメータをIO_Readxxxxで読み込み、値をイ ンスタンスに設定しています。 ・シナリオファイル(*.config)に当該ノードのパラメータを設定する たとえばノード 3 だけ、追加したパラメータを設定したいなら [3] MYPARAM <設定値> としておきます。 ※GUIで設定する場合にはGUIの設定ファイルを変更する必要があります。 分かりましたか? |
junpei | 投稿日時: 2005/12/20 19:08 |
新米 登録日: 2005/10/15 居住地: 投稿: 19 |
Re: 特定ノードのソース改良 詳細な説明ありがとうございます。
では、TCPプロトコルを改良して、特別な動作をさせる(例えば、データをバッファに貯めたり、再送を行う)ためには、flagを用いて、どのように行えばいいのでしょうか? よろしくお願いします。 |
forum_support | 投稿日時: 2005/12/23 20:03 |
モデレータ 登録日: 2005/5/17 居住地: 東京都中野区中央4-5-3 ?構造計画研究所 投稿: 322 |
Re: 特定ノードのソース改良 前回は IPを例としてお答えいたしましたが、TCPの
場合も同様です。 if (myflag == 1) {bufferに溜める;} else {通常のTCPの処理;} といったコードや if (myflag == 1) {再送Timerをscheduleする;} else {通常のTCPの処理;} といったコードを TCPのソースのどこかに埋め込めば 良いわけです。 で、どこに埋め込むべきなのか、また {bufferに溜める;} や {再送Timerをscheduleする;} といったコードは junpeiさんがお考えになっている、プロトコルの 仕様に関する問題であり、この点に関しては junpeiさんにしかわか らない部分だと思います。 どこに埋め込むべきか分からないのであれば、既存のTCPに おいて、xxxxxxxxを行っている箇所を修正したいという 具体的な範囲を教えていもらうと何かしらアドバイスは可能 かも知れません。 |
junpei | 投稿日時: 2005/12/24 16:12 |
新米 登録日: 2005/10/15 居住地: 投稿: 19 |
Re: 特定ノードのソース改良 返信ありがとうございます。
どこに埋め込むべきかわからないので、質問させていただきます。 Senderからデータを受け取ったときに、その中継ノードはバッファにデータを溜めさせたいとおもっています。再送については、ReceiverからACKを受け取ったときに、パケットロスがあれば、中継ノードがSenderのかわりに再送をさせたいとおもっています。 ソースのどこに埋め込めばよいのでしょうか? |
forum_support | 投稿日時: 2005/12/27 21:27 |
モデレータ 登録日: 2005/5/17 居住地: 東京都中野区中央4-5-3 ?構造計画研究所 投稿: 322 |
Re: 特定ノードのソース改良 これまでの話から、TCPを修正し、MANET環境で中継ノード
にバッファを持たせて、再送の代理処理を起こさせたいと いったニュアンスであることは分かるのですが・・ ご存知のとおり、通常ルーティングはIPレイヤで行われます よね・・ TCPは End-End のプロトコルですから、中継パケットは Transport レイヤまでは上がってこないと思いますので、 そもそもTCPを修正する前に、まずは、TCPに無理やりパ ケットを上げるところからはじめなければいけないのでは ないかと思います。 MSG_TRANSPORT_FromNetwork というイベントが IPレイヤ から Transport レイヤに Message(Packet)を上げる ときのイベントになります。 これで、とりあえず中継パケットを上位に上げてしまう ことはできます。ただ、このパケットを tcp_input の 関数に読み込ませても、自分宛のパケットでないわけ ですから、Dropされてしまうと思います。このあたり を改良された中継のためのTransportレイヤプロトコル お考えのようですが、この範囲はjunpeiさんのご研究 の詳細をご存知の方で無い限り、頂いた情報からだけで すと、我々にもどこに何を埋め込むべきかはわかりません。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |