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

パスワード:


パスワード紛失

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

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

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

日曜日からの合計
メイン
   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は正常に終了します。

とりあえず、ここまでを確認してみて下さい。
フラット表示 前のトピック | 次のトピック
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT