メイン Link (MAC) Layer Protocol Implementation & Model Development PHY_SetTransmissionChannelの使い方について | 投稿するにはまず登録を |
題名 | 投稿者 | 日時 |
---|---|---|
PHY_SetTransmissionChannelの使い方について | C2913 | 2013/6/24 15:39 |
Re: PHY_SetTransmissionChannelの使い方について | hiro | 2013/6/30 16:28 |
Re: PHY_SetTransmissionChannelの使い方について | C2913 | 2013/7/1 21:34 |
Re: PHY_SetTransmissionChannelの使い方について | hiro | 2013/7/2 11:24 |
Re: PHY_SetTransmissionChannelの使い方について | C2913 | 2013/7/2 11:40 |
» Re: PHY_SetTransmissionChannelの使い方について | hiro | 2013/7/2 16:12 |
フラット表示 | 前のトピック | 次のトピック |
投稿者 | スレッド |
---|---|
hiro | 投稿日時: 2013/7/2 16:12 |
長老 登録日: 2005/7/16 居住地: 投稿: 452 |
Re: PHY_SetTransmissionChannelの使い方について 具体的に実装したい内容とは別に、
QualNetが異常終了する原因とその見かけ上の対処です。 見かけ上と言うのはソースコードを修正せずに、 シナリオ設定で回避しているからです。 ソースコードの妥当性は確認していません。 ちょっと長いので、じっくり読んでください。 なお、Linux環境を前提としています。 ./snt/qualnet/5.2/main/Makefile の以下の部分を修正して下さい。 旧 #DEBUG = -g OPT = -O3 新 DEBUG = -ggdb OPT = -O0 この設定でgdbが使えるようになります。 gdbがインストールされていなければ、使用しているLinuxの ディストリビューション手順に従いインストールして下さい。 make clean で一旦全てのオブジェクトを削除します。 make all でQualNetを作り直します。 シナリオフォルダに移動して、 gdb ~/snt/qualnet/5.2/bin/qualnet としてgdbを起動します。 gdbが起動すると、プロンプトが(gdb) になるので、 (gdb) run testByc2913.config でQualNetを実行します。 すると、以下の表示が出てQualNetの実行が止まるはずです。 qualnet: ../addons/kernel/phy_private.cpp:170: void PHY_StartListeningToChannel(Node*, int, int): Assertion `node->phyData[phyIndex]->channelListenable[channelIndex] == (1)' failed. Program received signal SIGABRT, Aborted. これは、QualNet内部で異常を検出してQualNetが中断したことを示します。 ちなみに、Makefileを変更しない状態で実行しても、下記の表示でQualNetが 止まりませんでしたか? qualnet: ../addons/kernel/phy_private.cpp:170: void PHY_StartListeningToChannel(Node*, int, int): Assertion `node->phyData[phyIndex]->channelListenable[channelIndex] == (1)' failed. アボート (coreを出力しました) 実は、最初に確認したかったのは、どのようにQualNetが終了したのか、でした。 上記のAssertionメッセージを最初に教えて頂くだけで、かなり手間が省けました。 このメッセージが表示されるという事は、 node->phyData[phyIndex]->channelListenable[channelIndex] の値が1ではない、という事です。 さて、(gdb) に戻ります。 where とコマンドを入力すると、以下のような表示になるはずです。 具体的な数値は若干異なると思います。 (gdb) where #0 0x0000003d77635935 in raise () from /lib64/libc.so.6 #1 0x0000003d776370e8 in abort () from /lib64/libc.so.6 #2 0x0000003d7762e6a2 in __assert_fail_base () from /lib64/libc.so.6 #3 0x0000003d7762e752 in __assert_fail () from /lib64/libc.so.6 #4 0x0000000000b5b529 in PHY_StartListeningToChannel(Node*, int, int) () #5 0x000000000092d8a7 in MacDot11ProcessMyFrame (node=0x129b0f0, dot11=0x12bf0d0, msg=0x1301d90) at ../libraries/wireless/src/mac_dot11.cpp:1478 #6 0x000000000092e8f9 in MacDot11ReceivePacketFromPhy (node=0x129b0f0, dot11=0x12bf0d0, msg=0x1301d90) at ../libraries/wireless/src/mac_dot11.cpp:1978 #7 0x00000000004a7a2a in MAC_ReceivePacketFromPhy (node=0x129b0f0, interfaceIndex=0, packet=0x1301d90, phyNum=0) at ../main/mac.cpp:7622 #8 0x0000000000a42776 in Phy802_11SignalEndFromChannel (node=0x129b0f0, phyIndex=0, channelIndex=0, propRxInfo=0x1304aa0) at ../libraries/wireless/src/phy_802_11.cpp:1588 #9 0x0000000000a285ac in PHY_SignalEndFromChannel (node=0x129b0f0, phyIndex=0, channelIndex=0, propRxInfo=0x1304aa0) at ../libraries/wireless/src/phy.cpp:2919 #10 0x0000000000b5f6ae in PROP_ProcessEvent(Node*, Message*) () #11 0x000000000047d482 in NODE_ProcessEvent (node=0x129b0f0, msg=0x12d2790) at ../main/node.cpp:276 #12 0x0000000000b4e839 in PARTITION_RunPartition(PartitionData*) () #13 0x0000000000b4ecfa in PARTITION_ProcessPartition(PartitionData*) () #14 0x0000000000b91cec in main () (gdb) これを見ると、#5 の部分で、 ../libraries/wireless/src/mac_dot11.cppファイルの1478行目で PHY_StartListeningToChannel関数を呼び出し、その関数から __assert_fail が呼び出されていることがわかります。 PHY_StartListeningToChannelの呼び出し部分は、 PHY_StartListeningToChannel( node, dot11->myMacData->interfaceIndex, dot11->sltch); なので、引数の値が正しくない、と推察されます。 なお、PHY_StartListeningToChannelの引数は、 ./include/phy.h によれば、 // API :: PHY_StopListeningToChannel // LAYER :: Physical // PURPOSE :: // PARAMETERS :: // + node : Node* : Node that is being // instantiated in // + phyIndex : int : interface number // + channelIndex : int : channel index // RETURN :: void : です。 ここで、以下の2つの値を確認します。ついでにnode->nodeIdの値も。 dot11->myMacData->interfaceIndex dot11->sltch gdbで止めても良いのですが、場所が特定できているので デバッグログを入れて確認すると、 node-nodeId は 1 dot11->myMacData->interfaceIndex は 0 dot11->sltch は 2 でした。 シナリオを見ると、nodeは2つ、interfaceは1つですが、 channelが1つしか定義されていません。 という事で3番目の引数(channel index)の値が正しくないことになります。 channel indexは0から開始するので、2 と指定するためには、 3チャネル 指定する必要があります。 シナリオ設定でチャネルを1つから3つにすると、結果の是非はともかくとして QualNetは正常に終了します。 とりあえず、ここまでを確認してみて下さい。 |
フラット表示 | 前のトピック | 次のトピック |