メイン Routing Protocols Implementation & Model Development OLSRのハローメッセージに新たな情報を持たせる方法 | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
shiba | 投稿日時: 2011/1/3 22:10 |
半人前 登録日: 2010/11/4 居住地: 投稿: 23 |
OLSRのハローメッセージに新たな情報を持たせる方法 こんばんは。olsr-inriaのハローメッセージについて質問です。
ハローメッセージに新たな情報を持たせたいと思い、テストとしてrouting_olsr-inria.h内の構造体hl_messageとhellomsgのhtimeを参考に、speedという新たな値を設けました。 それをrouting_olsr-inria.cppの関数OlsrSendHello内でしきい値以上のスピードならspeed=2、以下ならspeed=1としました。 しかし、ノードがハローを受信したときの処理OlsrProcessReceivedHello内でspeedをprintfしたところ、代入した値と全く違う値が出てきてしまい、値を渡せていませんでした。(OlsrHelloChgeStruct内で確認しても同じ結果でした。) speedの定義や代入の仕方はhtimeを参考にしているのでこのようなことになってしまった原因がわかりません・・・ どなたかお分かりの方、よろしくお願いします。 |
hiro | 投稿日時: 2011/1/4 12:30 |
長老 登録日: 2005/7/16 居住地: 投稿: 452 |
Re: OLSRのハローメッセージに新たな情報を持たせる方法 具体的にどのような改造を加えたのかわかりませんが、
ためしに自分でもやってみました。 QualNet 4.5.1 です。 routing_olsr-inria.h は2か所追加。 diff routing_olsr-inria.h-org routing_olsr-inria.h-hiro 799a800,802 > #ifdef HIRO > unsigned char speed; > #endif // HIRO 904a908,910 > #ifdef HIRO > unsigned char speed; > #endif // HIRO routing_olsr-inria.cpp には色々と追加。 diff routing_olsr-inria.cpp-org routing_olsr-inria.cpp-hiro | wc -l 61 長くなるので詳細は省略。 61行の差分の内訳は半分以上がデバッグ出力。 speed の意味がよくわからないので、 とりあえずnodeIdを代入。 > #ifdef HIRO > message->speed = node->nodeId; > #endif // HIRO 以下のシナリオで実行してみる。 ./qualnet/4.5/scenarios/wireless/olsr-inria/ipv4/hna 結果は、こんな感じです。 Node 4 receives HELLO message from 192.0.1.2 on interface 0 at 6077636383 HELLO Message Content:: ここから7行はデバッグ用に追加したもの。 message->vtime = 135 2me message->htime = 5 2me message->packet_seq_number = 4 message->hop_count = 0 message->ttl = 0 message->willingness = 3 message->speed = 5 (192.0.1.2 was 5) 多分、いけてるんじゃないかと思います。 改造した内容を、じっくり見直せば動くと思いますよ。 |
shiba | 投稿日時: 2011/1/4 14:54 |
半人前 登録日: 2010/11/4 居住地: 投稿: 23 |
Re: OLSRのハローメッセージに新たな情報を持たせる方法 返信ありがとうございます。
説明が不足しているところがあり、申し訳ありません。 私はQualNet5.02です。 私もrouting_olsr-inria.hにはhiroさんと同様にunsigned char型で2箇所Speedという値を追加しています。 routing_olsr-inria.cpp内のOlsrSendHelloの7500行目でh->htimeをセットしたあとに、 speedThreshold=5.0; MOBILITY_ReturnInstantaneousSpeed(node, &node->nodeSpeed); if(node->nodeSpeed > speedThreshold){ h->Speed=2; }else{ h->Speed=1; } printf("node:%d speed:%d\n",node->nodeId,h->Speed); を追加して自身が秒速5mより早いかどうかの情報をハロー経由で相手に届けようと考えています。この段階ではh->Speedの値はちゃんと格納されていました。 ハローを受信したときの処理は OlsrHelloChgeStruct内8152行目でhtimeをゲットしたあとに hmsg->Speed=h->Speed; printf("speed:%d",hmsg->Speed); としたのですが、送るときには格納できてた値が、この段階ですでに違う値になっていました。 単純にこれだけの処理でハローに新しい情報を追加させることはできないのでしょうか?プログラミングに慣れてなくとまどっているのが現状です。 ちなみに ./qualnet/4.5/scenarios/wireless/olsr-inria/ipv4/hna でも試したところ結果は同じでした。 |
hiro | 投稿日時: 2011/1/6 17:53 |
長老 登録日: 2005/7/16 居住地: 投稿: 452 |
Re: OLSRのハローメッセージに新たな情報を持たせる方法 > 私もrouting_olsr-inria.hにはhiroさんと同様に
> unsigned char型で2箇所Speedという値を追加しています。 具体的な追加の場所がわからないのですが、
上のstructのどの場所に以下の行を追加してます?
もし、
であれば、
にして下さい。 最後に追加してはダメです。 サイズ1の配列に要注意!! |
shiba | 投稿日時: 2011/1/8 16:35 |
半人前 登録日: 2010/11/4 居住地: 投稿: 23 |
Re: OLSRのハローメッセージに新たな情報を持たせる方法 返信が遅くなってしまい、申し訳ありません。
hiroさん、ありがとうございます。 helloに新たな情報を組み込むことができました。 ちなみになぜ配列の下ではダメなのでしょうか? |
hiro | 投稿日時: 2011/1/9 11:05 |
長老 登録日: 2005/7/16 居住地: 投稿: 452 |
Re: OLSRのハローメッセージに新たな情報を持たせる方法 動きましたか、それは良かったです。
これって、 構造体(struct)や共用体(union)の最後のメンバは不完全配列型でも よいことになっていて。正式には『フレキシブル配列メンバ』と呼ぶのですが、 まあ、難しいC言語のことは興味あれば調べて見て下さい。 で、今回の構造体の最後にある配列hell_info[1]は1固定ではなく、 プログラム実行中に配列の要素数を変更することができるのです。 というか、わざわざ[1]と定義するのは変更したいからです。 この場合、 HELLOパケットで送信する内容はその時のNodeが持っている情報に 応じて変化するため、実行時でないと配列の要素数が決まらないのです。 しかも、hellmsg全体を連続したメモリで処理した方が便利です。 連続領域で使いたいから、 hellinfo *hell_info; hell_info = (hellinfo *)malloc ((sizeof hellinfo) * n); という使い方ではなくって、 hellinfo hell_info[1]; にしているわけです。 具体的には、 定義時にはhell_info[1]ですが、実行時にはhell_info[2]だったり hell_info[3]するわけです。 したがって、hell_info[1]の次にSpeedを定義すると、hell_info[2]に なる時にSpeed部分が上書きされ、設定した値がなくなったわけです。 なお、今回のOLSRの場合は配列要素数という使い方はしておらず、
と処理していますが、説明を簡単にするために配列要素数で 説明しました。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |