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

パスワード:


パスワード紛失

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

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

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

日曜日からの合計
メイン
   Network Layer Protocol Implementation & Model Development
     1つ前のノードの送信元IPアドレスの取得方法について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
DCT
投稿日時: 2010/4/23 19:19
新米
登録日: 2009/7/16
居住地:
投稿: 6
1つ前のノードの送信元IPアドレスの取得方法について
network_ip.cppのRouteThePacketUsingLookupTable()において
1つ前のノードの送信元IPアドレス情報を利用したいと思っています。

NetworkDataIp *ip = (NetworkDataIp *) node->networkData.networkVar;
IpHeaderType *ipHeader = (IpHeaderType *) msg->packet;

の『ipHeader->ip_src』ではTRAFFIC-GENでパケットを生成/送出したノードのIPが取得されてしまいます。

Forwardingを経て、当該ノードでRouteThePacketUsingLookupTable()をする際に1つ前のノードのsrcIP情報を取得するにはどのようにしたらよいでしょうか?

宜しくお願いいたします。
mast
投稿日時: 2010/4/23 19:41
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: 1つ前のノードの送信元IPアドレスの取得方法について
こんな感じでMessage構造体(struct message_str)の最後に、
秘密のフィールドを設けておいて、各ノードが転送する際に
自身のIPアドレスでこのフィールドを上書きするようにして
おけば、取得できるようになるんじゃないかと思います。


struct message_str
{
    Message*  next; // For kernel use only.

~~~途中省略~~~

    int headerProtocols[MAX_HEADERS];
    int headerSizes[MAX_HEADERS];

    // Users should not modify anything above this line.

    // 転送時に自身のIPアドレスを設定するためのフィールド
    NodeAddress last_forwarder_ip;
};
DCT
投稿日時: 2010/4/23 20:11
新米
登録日: 2009/7/16
居住地:
投稿: 6
Re: 1つ前のノードの送信元IPアドレスの取得方法について
ご回答ありがとうございます。

例えばRIPのコードを見ると『RipProcessResponse(Node* node,Message* msg) 』において、

UdpToAppRecv* info = (UdpToAppRecv*) MESSAGE_ReturnInfo(msg);
NodeAddress sourceAddress = GetIPv4Address(info->sourceAddr);

として「sourceAddress」が1つ前の送信元アドレスとして取得できているのですが、同様なことをnetwork_ip.cppの「RouteThePacketUsingLookupTable()」部で行えないかと考えています。

頂いたご回答のような方法で、独自に情報を付加しなければ取得できないものでしょうか?
(上記例ですが、RIPの情報の場合は1つ前のノードが送信元であるから取得できているということであって、1つ前の情報はそう簡単には取得できないでしょうか?)

実はもしくは、転送処理するパケットの入力I/F番号が「RouteThePacketUsingLookupTable()」で分かれば1つ前のIPアドレスが取れなくても問題が解決しそうなのですが、こちらの方が簡単な解があるでしょうか?
mast
投稿日時: 2010/4/23 20:40
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: 1つ前のノードの送信元IPアドレスの取得方法について
引用:

頂いたご回答のような方法で、独自に情報を付加しなければ取得できないものでしょうか?
(上記例ですが、RIPの情報の場合は1つ前のノードが送信元であるから取得できているということであって、1つ前の情報はそう簡単には取得できないでしょうか?)


普通のIPパケットには前のノードの情報はどこにも乗ってないはずなので、何もせずに取得することはできないと思います。



引用:

実はもしくは、転送処理するパケットの入力I/F番号が「RouteThePacketUsingLookupTable()」で分かれば1つ前のIPアドレスが取れなくても問題が解決しそうなのですが、こちらの方が簡単な解があるでしょうか?


RouteThePacketUsingLookupTable()の第3引数がそれに相当すると思いますが・・・

RouteThePacketUsingLookupTable(Node *node, Message *msg, int incomingInterface)

DCT
投稿日時: 2010/4/23 20:52
新米
登録日: 2009/7/16
居住地:
投稿: 6
Re: 1つ前のノードの送信元IPアドレスの取得方法について
ご回答ありがとうございます。

> RouteThePacketUsingLookupTable()の第3引数がそれに相当すると思いますが・・・

なのですが、出力して確認しているのですが、全て0となっています。
この関数の呼び出しは「RoutePacketAndSendToMac()」ですが、これを見ると、

// int incomingInterface
Index of interface on which packet arrived.
[This is different if the packet originated from the network or transport layers. This value is only for multicast packets, currently.]

ということでユニキャストパケットの転送時には利用できないようなのです。
書き忘れておりましたが、Versionは4.5.1になります。
mast
投稿日時: 2010/4/24 2:00
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: 1つ前のノードの送信元IPアドレスの取得方法について
>> RouteThePacketUsingLookupTable()の第3引数がそれに相当すると思いますが・・・
>
> なのですが、出力して確認しているのですが、全て0となっています。
> この関数の呼び出しは「RoutePacketAndSendToMac()」ですが、これを見ると、
>
> // int incomingInterface
> Index of interface on which packet arrived.
> [This is different if the packet originated from the network or transport layers. This value is only for multicast packets, currently.]
>
> ということでユニキャストパケットの転送時には利用できないようなのです。
> 書き忘れておりましたが、Versionは4.5.1になります。

そうでしたか・・・・

では、かなりイレギュラーな気もしますが、
例えば以下のようなことをしてみるというのはどうでしょうか?


12817 void
12818 RouteThePacketUsingLookupTable(Node *node, Message *msg, int incomingInterface)
12819 {
12820     NetworkDataIp *ip = (NetworkDataIp *) node->networkData.networkVar;
12821     IpHeaderType *ipHeader = (IpHeaderType *) msg->packet;
12822 
12823     int outgoingInterface;
12824     NodeAddress nextHop;
+++++     int testIncomingInterface;
+++++     NodeAddress testPreviousHop;
12825 
12826     NetworkGetInterfaceAndNextHopFromForwardingTable(
12827         node, ipHeader->ip_dst, &outgoingInterface, &nextHop);
+++++     NetworkGetInterfaceAndNextHopFromForwardingTable(
+++++         node, ipHeader->ip_src, &testIncomingInterface, &testPreviousHop);
DCT
投稿日時: 2010/4/26 10:53
新米
登録日: 2009/7/16
居住地:
投稿: 6
Re: 1つ前のノードの送信元IPアドレスの取得方法について
解決のご連絡と訂正です。

【解決】
ForwardPacket(Node *node, Message *msg, int incomingInterface, NodeAddress previousHopAddress)

の「previousHopAddress」が前HOPのアドレスで、これを利用することで大きく手を加えることなく実現できました。

【訂正】
int incomingInterface
ですが、入力I/F番号を正常に利用できました。(私の出力ミスでした)

何度もご回答いただいた「一人前」様、ありがとうございました。
mast
投稿日時: 2010/4/26 15:45
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: 1つ前のノードの送信元IPアドレスの取得方法について
previousHopAddressというのは、NETWORK_ReceivePacketFromMacLayer()でMacHWAddressToIpv4Address()というのを呼び出すことで、MACアドレスから引っ張ってきているみたいですね。

・・・そういうのがあったとは知りませんでした。


ともかく無事ご解決したようで、おめでとうございます。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT