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

パスワード:


パスワード紛失

新規登録
検索
メインメニュー
アクセスカウンター
2024/04/28:14/20
2024/04/27:21/24

2024/02/28より287/1375
人気モジュール
No.1: フォーラム 8
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット14

No.1:どっかの巡回ロボット14

日曜日からの合計
メイン
   Network Layer Settings: IP, QoS, Queuing & Scheduling
     IPアドレスの扱いに関して
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
TakaoIto
投稿日時: 2011/10/12 19:20
新米
登録日: 2010/4/23
居住地: 東京
投稿: 7
IPアドレスの扱いに関して
こんにちは

QualNet(自分が使用しているのはEXataです)におけるIPv4アドレスの扱いについてソースコードを読んでいたのですが,少々混乱してきてしまいました.
お助け頂ければ幸いです.



私は,アドホックネットワークにおいて,IPアドレスを自動で割り振るような研究をしている者です.
そのため,GUI上からアドレスを読み込まずに,シミュレーションを実行中にネットワーク状況を読んで新規の参加端末へアドレスを割り振る必要があります.

そこでまず,IPアドレスをどこでコンフィグファイルから読み込んできて,どこで割り振っているのか調べていました.
QUALNET_HOME\gui\settings\protocol_models\network_layer.prt内で定義されている
下記の行でのkey="IP-ADDRESS"をIO_~~関数で読み込んで整形して設定しているのだろうと思っていたのですが,全く見当たりませんでした.

<variable name="IPv4 Address" key="IP-ADDRESS" type="Dotted decimal" interfaceindex="true" 〜〜〜〜〜〜

おそらくアドレスを実際にnode構造体の中に設定しているのは,network_ip.cpp内の7522行目付近におけるNetworkIpAddNewInterface()関数の

ip->interfaceInfo[interfaceIndex]->ipAddress = interfaceIpAddress;

という箇所であろうと推測しております.

そこで,この関数が誰から呼ばれているのか遡っているのですが,

NetworkIpAddNewInterface():network_ip.cpp

MacAddNewInterface():mac.cpp

AddNodeToSubnet():mac.cpp

ProcessSubnetLine():mac.cpp

MAC_Initialize():mac.cpp

PARTITION_InitializeNodes():partition.cpp

今ここです

一向に終着地点が見つかりません.

どこで"IP-ADDRESS"というkeyからファイル読み込みを行っているのでしょうか?
それとも,ずっと気になっていたのですが,
ノードに関するファイル入力情報を管理しているらしいNodeInput(fileio.h)という人が何かを先にやっているのでしょうか?



それと,割り振られているアドレスを各所でprintfを使って確認していたのですが,上記でも示しましたnetwork_ip.cpp内の7522行目付近

ip->interfaceInfo[interfaceIndex]->ipAddress = interfaceIpAddress;

について,printfで出力してみました.
すると,右辺にあるinterfaceIpAddressの方は%xで出力できたのですが(見れれば良いので,16進数表記のままです)
左辺にあるip->interfaceInfo[interfaceIndex]->ipAddressの方はエラーを吐いてしまったり,中身がnullや0といった出力となっていました.

何故かと思い調べてみたのですが,右辺はNodeAddress型で左辺はD_NodeAddress型である,というくらいの違いしか分かりませんでした.
NodeAddress型はmain.hで定義されているのですが,D_NodeAddress型はどこで定義されているのでしょうか?
そもそもこのD_とは何者なのでしょうか?

以上の2点についてご教示頂けると助かります.
何卒よろしくお願いします.
mast
投稿日時: 2011/10/12 20:59
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: IPアドレスの扱いに関して
こんにちは。

■IP-ADDRESSパラメータ行の読み込み箇所について

引用:

そこで,この関数が誰から呼ばれているのか遡っているのですが,

NetworkIpAddNewInterface():network_ip.cpp

MacAddNewInterface():mac.cpp

AddNodeToSubnet():mac.cpp

ProcessSubnetLine():mac.cpp

MAC_Initialize():mac.cpp

PARTITION_InitializeNodes():partition.cpp

今ここです

一向に終着地点が見つかりません.

どこで"IP-ADDRESS"というkeyからファイル読み込みを行っているのでしょうか?
それとも,ずっと気になっていたのですが,
ノードに関するファイル入力情報を管理しているらしいNodeInput(fileio.h)という人が何かを先にやっているのでしょうか?


以下に、ProcessSubnetLine()関数のコードを一部抜粋します。
5634行目のAddNodeToSubnet()関数の第4引数が今設定されようとしているIPアドレスの値が入った変数。
その変数に値を設定しているのは5567行目。
5567行目の右辺のinterfaceAddress変数に値を代入しているのは、
5542行目のMAPPING_GetInterfaceInfoForInterface()関数。
MAPPING_GetInterfaceInfoForInterface()関数は非公開ソース。


5489     for (count = 0; count < addCount; count++)
5490     {
5491         NodeAddress interfaceAddress = (unsigned int)ANY_ADDRESS;
5492         NodeAddress subnetAddress = 0;
5493         NodeAddress subnetMask = 0;
5494         int hostBits = 0;
             ... 略 ...
5538         if (netProtoType == IPV4_ONLY || netProtoType == DUAL_IP
5539             || netProtoType == GSM_LAYER3 || netProtoType == CELLULAR)
5540         {
5541 
5542             MAPPING_GetInterfaceInfoForInterface(
5543                 firstNode,
5544                 subnetList[count].nodeId,
5545                 intfIndex,
5546                 &interfaceAddress,
5547                 &subnetAddress,
5548                 &subnetMask,
5549                 &hostBits);
5550 
5551             if (interfaceAddress == ANY_ADDRESS)
5552             {
5553                 char buff[MAX_STRING_LENGTH];
5554                 sprintf(buff,
5555                   "IPv4 address is not configured for"
5556                   "interface %d of Node %d\n",
5557                   intfIndex,
5558                   subnetList[count].nodeId);
5559                 ERROR_ReportError(buff);
5560             }
                 ... 略 ...
5567             subnetList[count].address.interfaceAddr.ipv4 = interfaceAddress;
5568             subnetList[count].address.networkType = NETWORK_IPV4;
5569         }
             ... 略 ...
5619         if (subnetList[count].node != NULL)
5620         {
                ... 略 ...
5631            if (netProtoType == IPV4_ONLY || netProtoType == DUAL_IP
5632             || netProtoType == GSM_LAYER3 || netProtoType == CELLULAR)
5633            {
5634                 AddNodeToSubnet(subnetList[count].node,
5635                                 nodeInput,
5636                                 subnetAddress,
5637                                 subnetList[count].address.interfaceAddr.ipv4,
5638                                 hostBits,
5639                                 macProtocolName,
5640                                 subnetList,
5641                                 addCount,
5642                                 count,
5643                                 isNewInterface,
5644                                 (short)subnetIndex);
5645            }

というわけで、残念ながらIP-ADDRESS行の読み込みを行っているコードに
辿り着くことはできないようです。
(読み込み処理は、恐らくご推察のとおりNodeInputさんがコッソリとやっている
と思います。そしてMAPPING_GetInterfaceInfoForInterface()関数は、単に
NodeInputから情報を取得する関数かと思われます。いずれもコードが見えない
ので推測になりますが。)


■D_NodeAddress型について

引用:

何故かと思い調べてみたのですが,右辺はNodeAddress型で左辺はD_NodeAddress型である,というくらいの違いしか分かりませんでした.
NodeAddress型はmain.hで定義されているのですが,D_NodeAddress型はどこで定義されているのでしょうか?
そもそもこのD_とは何者なのでしょうか?

D_NodeAddress型はinclude/dynamic_vars.hで定義されています。
D_*変数というのはDynamicオブジェクト変数のことで、シミュレーション実行中に外部
プログラムから動的に値を取得・変更可能な変数のことです。プログラマーズガイドの
7章のDynamic APIの冒頭に少し説明があります。QualNet5.1のGUIからも、添付画像の
ようにして実行時のこれらの変数の値を確認することができます。

DynamicParameters.PNG
TakaoIto
投稿日時: 2011/10/13 15:38
新米
登録日: 2010/4/23
居住地: 東京
投稿: 7
Re: IPアドレスの扱いに関して
引用:

■IP-ADDRESSパラメータ行の読み込み箇所について
MAPPING_GetInterfaceInfoForInterface()関数は非公開ソース。
というわけで、残念ながらIP-ADDRESS行の読み込みを行っているコードに
辿り着くことはできないようです。
(読み込み処理は、恐らくご推察のとおりNodeInputさんがコッソリとやっている
と思います。そしてMAPPING_GetInterfaceInfoForInterface()関数は、単に
NodeInputから情報を取得する関数かと思われます。いずれもコードが見えない
ので推測になりますが。)

■D_NodeAddress型について
D_NodeAddress型はinclude/dynamic_vars.hで定義されています。
D_*変数というのはDynamicオブジェクト変数のことで、シミュレーション実行中に外部
プログラムから動的に値を取得・変更可能な変数のことです。プログラマーズガイドの
7章のDynamic APIの冒頭に少し説明があります。QualNet5.1のGUIからも、添付画像の
ようにして実行時のこれらの変数の値を確認することができます。


お早い返答をありがとうございました!
物凄くスッキリ致しました!

これまでmapping.hの方も何度か見ていたのですが,具体的にどういう処理がされているのか分からず,
そもそも何の意味があってこれを介した流れになっているのか気にしないようにしていたのです^^;

ノードポインター,識別子,アドレス等のマッピング・・・そんなことをする理由があるのでしょうか?
各々のnode構造体の中で情報は管理されているのに?と思ったのです.
単にNodeInputからの情報取得であれば,
mappingさんがやらなくても他のコード内ではIO_*関数を使って取得していますし,アドレスも同様だと思うのですが?
(整合性を見てるとかそんな感じ?)



教えて頂いたDynamic_vars.hも見てみます!
クラスっぽいのがあるんですね、オブジェクト指向的な話は全然分からなくて苦労しそうですが・・・;

あと,添付画像の方を参考にシミュレーション時のRuntime Analysisを見てみたのですが,私の方では添付画像のように

Nodes
→host1
→→Interface0
Subnets

しかありませんでした.

Dynamic Parametersというのは特殊な状況でしか出てこないのでしょうか?
(外部インタフェースとの動的なやり取りがある場合だけ?)
EXata2.1,QualNet5.1双方で同一の結果となりました.

ご存じでしたら,ご教示お願い致します.
Dynamic-Analysis.PNG
mast
投稿日時: 2011/10/13 20:49
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: IPアドレスの扱いに関して
引用:

あと,添付画像の方を参考にシミュレーション時のRuntime Analysisを見てみたのですが,私の方では添付画像のように

Nodes
→host1
→→Interface0
Subnets

しかありませんでした.

Dynamic Parametersというのは特殊な状況でしか出てこないのでしょうか?
(外部インタフェースとの動的なやり取りがある場合だけ?)
EXata2.1,QualNet5.1双方で同一の結果となりました.

シナリオの設定で細かく制御できます。添付画像を参照してください。


引用:

これまでmapping.hの方も何度か見ていたのですが,具体的にどういう処理がされているのか分からず,
そもそも何の意味があってこれを介した流れになっているのか気にしないようにしていたのです^^;

ノードポインター,識別子,アドレス等のマッピング・・・そんなことをする理由があるのでしょうか?
各々のnode構造体の中で情報は管理されているのに?と思ったのです.
単にNodeInputからの情報取得であれば,
mappingさんがやらなくても他のコード内ではIO_*関数を使って取得していますし,アドレスも同様だと思うのですが?
(整合性を見てるとかそんな感じ?)

これについては、理由までは私には分かりません。

では。

DynamicParameters2.PNG
TakaoIto
投稿日時: 2011/10/17 18:12
新米
登録日: 2010/4/23
居住地: 東京
投稿: 7
Re: IPアドレスの扱いに関して
無事にDynamicParametersも表示することができました.
マッピングの理由は研究を進めながら考察してみたいと思います.

ありがとうございました!
7208op
投稿日時: 2011/10/21 18:12
新米
登録日: 2011/10/21
居住地:
投稿: 1
Re: IPアドレスの扱いに関して
ありがとうございました!
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT