Japan QualNet Community Forums Japan QualNet Community Forums
Welcome Guest 
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
検索
メインメニュー
アクセスカウンター
2024/05/18:15/19
2024/05/17:19/24

2024/03/19より398/1409
人気モジュール
No.1: フォーラム 119
No.2: QualNet概要 4
No.3: ニュース 2
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット92
No.2:Unknown OS1
No.3:Windows NT1

No.1:どっかの巡回ロボット82
No.2:Majestic-12巡回ロボット7
No.3:Google巡回ロボット3

日曜日からの合計
メイン
   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      :: hellomsg
// DESCRIPTION :: Hello packet related information
// **/
typedef struct _hellomsg
{
    UInt16         reserved;
    unsigned char  htime;
    unsigned char  willingness;
    hellinfo       hell_info[1];
} hellomsg;

上のstructのどの場所に以下の行を追加してます?
    unsigned char  Speed;

もし、
{
    UInt16         reserved;
    unsigned char  htime;
    unsigned char  willingness;
    hellinfo       hell_info[1];
    unsigned char  Speed;
} hellomsg;

であれば、
{
    UInt16         reserved;
    unsigned char  htime;
    unsigned char  willingness;
    unsigned char  Speed;
    hellinfo       hell_info[1];
} hellomsg;

にして下さい。
最後に追加してはダメです。
サイズ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の場合は配列要素数という使い方はしておらず、
for (hinf = hinfo; (char *)hinf < (char *)m + m->olsr_msg_size;
         hinf = (hellinfo *)((char *)hinf + hinf->link_msg_size))

と処理していますが、説明を簡単にするために配列要素数で
説明しました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT