![]() ![]() ![]() | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
Akihiro | 投稿日時: 2015/6/5 15:12 |
新米 ![]() ![]() 登録日: 2014/5/30 居住地: 投稿: 10 |
マルチパス(複数経路)について お世話になります.
現在IEEE802.15.4規格を元に,複数経路を使用したマルチパスの実装を検討しております. 具体的には,1つの送信元ノードが,1つの宛先ノードに対し,複数の経路を使用し,パケット送信ができるルーティングを考えております. そこでお聞きしたいのですが, QualNetには上記機能を満たすルーティングプロトコルは備わっておりますでしょうか? または,AODVやOLSRといった規格を改良し,1から作る必要がありますでしょうか? よろしくお願い致します. |
Akihiro | 投稿日時: 2015/6/8 16:36 |
新米 ![]() ![]() 登録日: 2014/5/30 居住地: 投稿: 10 |
Re: マルチパス(複数経路)について 追記です.
どうやら複数経路を可能とするプロトコルは1から作る必要があるみたいですね.なので,AODVを基に,改良を行うことで実現したいと思います. そこでお聞きしたいのですが, 複数経路を実現するためには,ソースコードのどの部分を改変すればよろしいでしょうか? 現在目をつけていますのは, AODVでは,宛先ノードにてRREPを送信する際, ホップ数の最少である経路に対してRREPを送信するかと思われますので, 今回私は,このRREPを全経路に対して送信するように改良し,複数経路を実現したいと考えております. 具体的には,ソースコード6000行前後のFUNCTION :: AodvHandleReplyを改変すればよいと考えております. 流れとしては 1.ルートごとのホップカウントを比較 2.比較結果に順位をつける 3.全ての経路に対してRREPを返す と想定しています. ・・・がプログラミング初心者のため,中々ソースを改変できないでいます. 1.2.3.を実装するために,改変すべき場所等教えて頂けませんでしょうか? よろしくお願い致します. |
maxam | 投稿日時: 2015/6/8 19:38 |
常連 ![]() ![]() 登録日: 2006/4/11 居住地: 投稿: 58 |
Re: マルチパス(複数経路)について こんにちは
AodvHandleReplyは、PREPを受け取った時の関数なので、 RREPを全経路に対して送信だったら、AodvHandleRequestの 方じゃないかと思います。 この関数内で、AodvIpIsMyIP(宛先が自分)だったら AodvInitiateRREP()を呼んでいるので、 「RREPを全経路に対して送信」 するなら変更はこのあたりになるかと。 >ホップ数の最少である経路に対してRREPを送信する ちなみに、宛先ノードではホップ数最少ではなく、最初に来たRREQに対して 即、RREPを返していると思います。 で、その後、同じRREQが来てもAodvLookupSeenTableで ひっかかって破棄されてしまうので、そこを破棄じゃなくて 何かすれば良いのかも。 ただ、宛先ノードだけではなく、中継ノードでも 「同じRREQ」は破棄されるんじゃないかと思うので、 例えば、 A-B-C-E-F | | D----- (1:A-B-C-E-F) (2:A-D-E-F) で、AからFに送りたいとき、Eは2ルート分をFに伝えないと思いますが それでもやりたいことは実現できそうでしょうか? # それだと困るーという場合、そもそも元にするのは # AODVで良いんだろうか、という話になりそうな気も。 マルチパスが実現できれば手段はどうでも良い、のか ルーティングアルゴリズムそのものが重要なのか、で、 対応方針が変わってきそうな気もします。 |
Akihiro | 投稿日時: 2015/6/9 16:11 |
新米 ![]() ![]() 登録日: 2014/5/30 居住地: 投稿: 10 |
Re: マルチパス(複数経路)について >maxam様
素早い解答頂きありがとうございます. 引き続きお聞きしたいことがあるので,お時間に余裕がございましたら,お付き合い願います. まずは,手段についてですが, なるべく,重複した経路(多重ノード)の利用は避けたいため,現在はAODVを基に考えております.(今後方針が変わる可能性はありますが・・・) そこで,アドバイス通り,ソースを読んだところ, RREQ到着時の対応は, 1.seenTableを元に一定時間内に重複したRREQが到着していないかを見る 2,到着していない場合は,その経路にRREPを送信 3.到着していた場合は破棄 との流れになっていると認識することができました. そこで,全経路に対して.RREPを返すには, 3.到着していた場合は破棄 の部分を改変すれば良いと判断したのですが,正しいでしょうか? また,具体的には,破棄する場所にAodvInitiateRREP関数を追加するだけで,全経路に対してRREPを返すことができるようになるのでしょうか? よろしくお願い致します. |
maxam | 投稿日時: 2015/6/9 16:54 |
常連 ![]() ![]() 登録日: 2006/4/11 居住地: 投稿: 58 |
Re: マルチパス(複数経路)について 完全独立の複数経路ならAODVベースで良いかもしれないですね。
>3.到着していた場合は破棄 >の部分を改変すれば良いと判断したのですが,正しいでしょうか? はい。 >また,具体的には,破棄する場所にAodvInitiateRREP関数を追加するだけで,全経路に対してRREPを返すことができるようになるのでしょうか? ...出来そうに思います。 が、ちょっとやってみないと分かりません。 何か別の問題が発生するかもしれないですし 多分、(デバッグモード実行やデバッグ出力#define AODV_DEBUG 1 で) 動かしてみる方が早いかと。 # 誰か他に詳しい人、追加アドバイスあったらお願いしますー ![]() あと、ついでですが、AODVだと ルートが見つかるまでだんだん範囲(TTL)を広げていく筈なので、 ホップ数がだいぶ異なる複数ルートだと、ホップ数が多いルートの RREQが伝わってこなかったりすると思うのでご注意ください。 AODV-TTL-INCREMENTとかそのあたり。 また、仮に、RREPがちゃんと全経路で返ったとしても、SRC側で複数経路登録する処理や、 実際にパケットを適切に振り分ける処理は別途実装する必要はあるかと思います。 |
Akihiro | 投稿日時: 2015/7/3 20:56 |
新米 ![]() ![]() 登録日: 2014/5/30 居住地: 投稿: 10 |
Re: マルチパス(複数経路)について maxamさん
解答ありがとうございます。 ついつい熱中し、返信を忘れていました・・・申し訳ありません。 現在アドバイス通り実装を行ったところ、 無事RREPを宛先側からすべての経路に対して返す処理を 追加することができました。 その後送信側の処理で、 全経路に対する情報をrouteTableに格納を行いました。 (例) 1-2-3-4 1-5-6-4 のような2経路がある場合 <routeTable> 宛先4 次ホップ 2 宛先4 次ホップ 5 宛先2 次ホップ 2 宛先5 次ホップ 5 そこで、現在上記のrouteTableを元に 宛先4に送る場合は次ホップ2と5をパケット毎に切り替える処理を 追加しようと考えているのですが、 どうも思うように追加することができません。 そこでお聞きしたいのですが、 パケット毎にrouteTableを読み出し、 次ホップアドレスを切り替えるプログラムは ソースコードのどの処理の部分に追加すればよいのでしょうか? よろしくお願い致します。 |
maxam | 投稿日時: 2015/7/6 12:15 |
常連 ![]() ![]() 登録日: 2006/4/11 居住地: 投稿: 58 |
Re: マルチパス(複数経路)について こんにちは
>ソースコードのどの処理の部分に追加すればよいのでしょうか? 恐らくAodvCheckRouteExist関数付近だと思います。 Node 1で上位層からわたってきたパケットは、 IP層のRoutePacketAndSendToMac関数に渡され、さらに 関数ポインタrouterFunction経由で、 設定したルーティングプロトコルの関数に渡されます。 AODVの場合は、AodvRouterFunction()関数です。 この関数内で 自身がsrcNodeの場合は、 rtToDest = AodvCheckRouteExist( destAddr, &aodv->routeTable, &isValidRt); という関数が呼ばれます。 この関数内ではルーティングテーブルから適切なエントリを検索して 返しているので、ここで、「適切なエントリ」が複数あるなら どちらを選択するか切り替える処理を入れれば良いのではないでしょうか。 # ちなみにRouteRequestを出すきっかけになったパケットを含め # Routeが確立していない状態で発生したパケットは # 一旦AODV内のバッファに貯められていて(AodvInsertBuffer)、 # それらはRouteReplyが返り次第、 # AodvHandleReply関数内で送信されるので # ( // Send any buffered packets to the destination というコメントの部分ですね) # 上記の流れとは違う動きをします。ご注意ください。 というわけで、AodvCheckRouteExist関数付近を変更すれば 御希望の処理が実現可能じゃないかと思いますが、 AodvCheckRouteExist関数は何か所かから呼ばれているので、 他の処理に悪影響を及ぼさないかはチェックが必要かと。 ※一度、全AODV関数にブレークポイントはって流れを追うと理解が進む。。。かもしれません。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |