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

パスワード:


パスワード紛失

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

2024/03/20より397/1411
人気モジュール
No.1: フォーラム 16
No.2: QualNet概要 1
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット17

No.1:どっかの巡回ロボット14
No.2:Google巡回ロボット2
No.3:Baidu巡回ロボット1

日曜日からの合計
メイン
   Routing Protocols Implementation & Model Development
     ipHeaderはNULL
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
dsen
投稿日時: 2008/11/13 17:58
新米
登録日: 2008/1/9
居住地:
投稿: 6
ipHeaderはNULL
はじめまして、お世話になります。

現在、指向性アンテナを用いた大規模なアドホックネットワークでの実験を行っています。次のエラーで止まりました。
Assertion(ipHeader!=NULL)failed in file ....mac_dot11-sta.h:2587
ipHeadはNULLということは分かりますが、なぜこのエラーでるのか、どこの設定悪いのか、を教えていただけたらと思います。
実験環境:
Qualnet4.0/WindowsXP
802.11b/11M/TransmitPower25dbm
steerable antenna/pattern file:steerable.antenna-azimuth
dot11/direction antenna mode
routing protocol:Bellmanford
CBR:30本/0.2Mbps/1S-11S
node数:60/シミュレーション時間11S

また、configfileを添付しました。よろしくお願いします。

60.zip

60.zip
ipoten
投稿日時: 2008/11/17 18:59
一人前
登録日: 2005/7/12
居住地:
投稿: 102
Re: ipHeaderはNULL
こんにちは

試しに添付されたシナリオを実行してみましたが、同じ箇所でアサーションストップしました。
私の環境は4.0.1のためか、若干行数は違いますが、以下のようになっています。
Assertion (ipHeader != NULL) failed in file c:\qualnet\4.0\libraries\wireless\src\mac_dot11-sta.h:2581
MacDot11StationSetCurrentMessageVariables:Message pointer is currpted
デバッガでとめてみたところ、これの発生の時点で dot11->currentMessage->packet が NULL になっています。
dot11->currentMessage は、IPからの送信パケットが発生した時点(関数MacDot11NetworkLayerHasPacketToSend())でセットされますが、
NAVやバックオフを待っている間に、破棄されているような雰囲気です。

デバッガで該当アドレスのメッセージ生成と解放を追ったところ、
下記の場所(l.3996)で最後に解放され、それ以降ほかの処理にメッセージ領域が使用されていることが分かりました。
ファイルmac_dot11-sta.h / 関数MacDot11StationStartTransmittingPacket()
3980|//--------------------HCCA-Updates Start---------------------------------//
3981|//Station should send Ack even if NAV is set so that stations can
3982|// receive data from HC in delivery mode.
・・・中略・・・
3990|    else{
3991|        canTx = MacDot11StationCanTransmit(node, dot11);
3992|    }
3993|    if(!canTx){
3994|        MacDot11Trace(node, dot11, NULL,
3995|            "Frame delayed - unable to transmit.");
3996|        MESSAGE_Free(node, packet);	// ←ここ!
3997|        return;
3998|    }
3999|//--------------------HCCA-Updates End-----------------------------------//
ここの処理は、「パケットを送ろうとしたんだけど、PHYのステータスがIDLEじゃないので送信を遅らせる」ということなのですが、
この MESSAGE_Free() で解放しているメッセージはブロードキャストパケットで、dot11->currentMessage そのものです(コピーではない)。
しかし前後の処理で dot11->currentMessage がクリアされている箇所が見当たりません。
ソースコメントをみると、ここの処理はHCCA関連で変更されたソースコードのようですが、
ここでブロードキャストパケットを MESSAGE_Free() するのは妙な気がします。

ちなみにQualNet3.9.5では上記の箇所で MESSAGE_Free() はしていません。
QualNet4.5では上記に該当するコード自体が大きく書き換わっています。
QualNet4.5(.1)のReleaseNotesには、BugFixのそれらしい記述は見つけられませんでしたが、どうも4.0の不具合のような気がします。

サポートに問い合せるか、ほかのバージョンを利用してみてはいかがでしょうか。
dsen
投稿日時: 2008/11/20 17:50
新米
登録日: 2008/1/9
居住地:
投稿: 6
Re: ipHeaderはNULL
ipotenさん
こんにちは
ご指摘の通り、ブロードキャストを出そうとする時、チャンネルがビジーになって、結局出せませんでした。なので、3996行目のMESSAGE_Free(node, packet)が呼び出されました。しかし、このMESSAGE_Free(node, packet)はメッセージの中身だけ解放し、メッセージそのものまだ残っている感じです。ですから、空のメッセージがもう一度送信され、ipHeaderがNULLになってしまいました。
MESSAGE_Free(node, packet)を検索した結果、MacDot11StationResetCurrentMessageVariables(node, dot11)といつもペアで出てくるみたいですね。MacDot11StationResetCurrentMessageVariables(node, dot11)を読んだところ、この関数はメッセージのアドレスを解放(dot11->currentMessage = NULL)します。つまり、メッセージそのもの全部消します。
そして、3996行目のMESSAGE_Free(node, packet)の後ろにMacDot11StationResetCurrentMessageVariables(node, dot11)を追加しました。悪い影響あるかどうか分かりませんが、とりあえず、いまシミュレータが正常に動いています。
ipotenさん、ありがとうございました。
ipoten
投稿日時: 2008/11/20 18:39
一人前
登録日: 2005/7/12
居住地:
投稿: 102
Re: ipHeaderはNULL
こんにちはdsenさん

引用:
>そして、3996行目のMESSAGE_Free(node, packet)の後ろに
>MacDot11StationResetCurrentMessageVariables(node, dot11)を追加しました。悪い
>影響あるかどうか分かりませんが、とりあえず、いまシミュレータが正常に動いてい
>ます。
もしかしたら、ユニキャスト送信時にこのシーケンスを通ると、メモリリークするかもしれません。
というのも、この関数MacDot11StationStartTransmittingPacket()に渡される引数packetは、
ユニキャストの場合dot11->currentMessageのコピー
4534|        Message* pktToPhy = MESSAGE_Duplicate(node, dot11->currentMessage);
だからです。
ユニキャストでは再送のためにdot11->currentMessageが保持されていますが、
勝手にMacDot11StationResetCurrentMessageVariables()でdot11->currentMessageをNULLクリアしてしまうと、
パケットメッセージ本体(コピー元)をMESSAGE_Free()するひとがいなくなります。

ブロードキャストの場合のみMacDot11StationResetCurrentMessageVariables()を呼び出すような処理が必要かもしれませんね。
もし、現状のdsenさんの修正で不安定(シミュレーション期間中に使用メモリが増えていくとか)であれば、
試してみてもよいと思います。
あ、こちらで確認したわけではないので、あくまでもご参考&自己責任で、あしからず。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT