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

パスワード:


パスワード紛失

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

2024/03/16より390/1402
人気モジュール
No.1: フォーラム 69
No.2: ニュース 2
No.3: QualNet概要 1
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット51
No.2:Unknown OS1

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

日曜日からの合計
メイン
   Routing Protocols Implementation & Model Development
     DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
you
投稿日時: 2008/7/10 13:53
新米
登録日: 2007/12/25
居住地:
投稿: 11
DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について
いつもフォーラムのお世話になっております。

タイトルにあるようにDSRにおいて
パケットを中継するノードの持つ情報を
パケットに追加する方法について質問があります。

DSRは元々、経路探索時において、
受信したRoute Requestパケットに
自身のアドレスを経路情報として追加して、
再度Route Requestパケットを送信するという動作を行っているため、
DsrInitiateRREQ、DsrRelayRREQ、DsrHandleRequest等を参考にして、
データパケット送信時において、
パケットを中継するノードの持つ情報を
パケットに追加しようと試みており、
DsrTransmitDataWithSrcRoute、
DsrHandleProtocolPacketWithIPHeader、
DsrHandlePacketWithSrcRoute等を見ています。

しかし、Route Requestの際、
どの部分で自身のアドレスをパケットに追加しているのか
正確に理解できておらず、参照する部分の確定に戸惑っています。

どなたかもしよろしければ、
DSRに限らずパケットにおける情報のやり取りについて
解説、アドバイスしていただけないでしょうか?
よろしくお願い致します。
mast
投稿日時: 2008/7/10 14:39
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について
引用:
どなたかもしよろしければ、
DSRに限らずパケットにおける情報のやり取りについて
解説、アドバイスしていただけないでしょうか?
よろしくお願い致します。

パケットにおける情報のやり取りというのが何を意味しているのかわかりませんが、、、

引用:
経路探索時において、
受信したRoute Requestパケットに
自身のアドレスを経路情報として追加して、
再度Route Requestパケットを送信するという動作

というのは、DsrRelayRREQ()関数がまんまその動作を表しているようにみえます。
で、DsrRelayRREQ()のコメント行だけを抜き出すと以下のようになっています。

// Calculate number of bytes before the request.
// That portion of the message will go as it is

// Copy the portion of previous message, that is before route request
// option.

// Header Payload size should be incremented by 4 for allocating
// a new node in path.

// copy previous nodes route request part

// OptDataLen in Dsr Route Request should be changed

// Copy the path fields

// Copy other contents of Data

// Update statistical variable for number of request relayed

// Done with packet copying

で、問題の「自身のアドレスをパケットに追加している」箇所は、以下のコメントが書かれているところじゃないかと思うのですが、どうでしょうか?

// Copy the path fields

you
投稿日時: 2008/7/14 17:30
新米
登録日: 2007/12/25
居住地:
投稿: 11
Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について
mastさん

ご回答ありがとうございます。

パケットにおける情報のやり取りという表現が非常に曖昧だったため、
訂正致します。

〜mastさんから頂いたご指摘に対するコメント〜

mastさんにご指摘頂いたようにDsrRelayRREQ()のコメントを見る限り、
「自身のアドレスをパケットに追加している」箇所は
// Copy the path fieldsの部分であると思われます。

焦ってコメントをしっかり読む事を怠っていました。
ご指摘頂きありがとうございます。

〜パケットにおける情報のやり取りという表現の訂正〜

mastさんのご指摘により、
「自身のアドレスをパケットに追加している」箇所の
見当はつける事ができました。

しかし、お恥ずかしながら、
私のQualNet及びC++に関する知識が不足しており、
Message構造体を含む各種構造体の理解に苦しんでいる状態です。
そのため、DsrRelayRREQ()に限らず、
各関数の冒頭に記述されている一連の動作の流れが
いまひとつ理解できておりません。

この部分をパケットにおける情報のやり取りという
曖昧な解釈による曖昧な表現で示してしまいました。

一応、一通り以下のページも目を通し、各APIの理解に努めています。

http://simweb.kke.co.jp/qualnet/forum/modules/pukiwiki/index.php?cmd=read&page=QualNetWikiTop%2FMessageStructure&word=%B9%BD%C2%A4%C2%CE

しかし、どうしても一連の動作の流れを掴む事ができていません。

そこで、もしよろしければ、
上記の部分の解説、アドバイスをしていただけないでしょうか?
または、ドキュメンテーションでMessage構造体を利用した
一連の動作を解説をしている部分を教えていただけないでしょうか?

以上、よろしくお願い致します。
hiro
投稿日時: 2008/7/14 20:45
長老
登録日: 2005/7/16
居住地:
投稿: 452
Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について
> ドキュメンテーションでMessage構造体を利用した
> 一連の動作を解説をしている部分を教えていただけないでしょうか?

取っ掛かりとしては、QualNet-4.5-ProgrammersGuide.pdf の中の、
3.3.1 Events and Messages あたりでしょうか。

一連の、となると QualNet-4.5-ProgrammersGuide.pdf の、
CHAPTER 1,3,4 が該当すると思います。
you
投稿日時: 2008/7/16 0:56
新米
登録日: 2007/12/25
居住地:
投稿: 11
Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について
hiroさん

ご回答ありがとうございます。

まだドキュメンテーションをしっかり読めておらず恐縮ですが、
追加で気になる事が生じたため、質問させて頂きます。

mastさんのご回答により、
「自身のアドレスをパケットに追加している」箇所の
おおよその見当をつける事ができました。

しかし、DsrRelayRREQ()の// Copy the path fieldsにおいて
CopyされたnewPktPtrはDsrRelayRREQ()の最下部にある

    // Done with packet copying
    NetworkIpSendRawMessageToMacLayerWithDelay(
        node,
        newMsg,
        srcAddr,
        ANY_DEST,
        IPTOS_PREC_INTERNETCONTROL,
        IPPROTO_DSR,
        ttl,
        DEFAULT_INTERFACE,
        ANY_DEST,
        (clocktype) (RANDOM_erand(dsr->seed) * DSR_BROADCAST_JITTER));


において利用されていません。

    newPktSize = recvPktSize + sizeof(NodeAddress);

    newMsg = MESSAGE_Alloc(node, MAC_LAYER, 0, MSG_MAC_FromNetwork);

    MESSAGE_PacketAlloc(node, newMsg, newPktSize, TRACE_DSR);

    newPktPtr = (unsigned char *) MESSAGE_ReturnPacket(newMsg);


これは上記の一連のプログラムにおいて、
newMsgのパケットへのポインタが返却された事により、
newPktPtrにおいてnewMsgに対するcopy等の操作が可能になり、
最終的にNetworkIpSendRawMessageToMacLayerWithDelay()の
newMsgにおいてcopy完了後のものが利用されているという
解釈でよろしいでしょうか?

=================================================================

もうひとつ質問があります。

routing_dsr.cppにおいて、
データパケットの受信を確認する箇所として、
DsrRouterFunction()の

        // Packet is not originated in this node
        if (NetworkIpIsMyIP(node, ipHeader->ip_dst))
        {
            // source route option should be eliminated in the previous node.
            // if the packet contains only source route option then the
            // packet will not have any dsr header in it.

            // If it contains any other option that will be handled by
            // Handle protocol packet.

            // So this portion of the code will do nothing

            // update statistics for number of data packet received. If IP
            // protocol is DSR it might be a Route Reply or a Route Error.

            if (ipHeader->ip_p != IPPROTO_DSR)
            {
                dsr->stats.numDataRecved++;
            }

            return;


以外ないという事でよろしいでしょうか?
routing_dsr.cppにおいてデータパケットを受信した際の
受信処理はこの箇所で行うしかないのでしょうか?

長文になってしまい、分かりにくい説明になってしまい
申し訳ありませんが、ぜひ助言をよろしくお願い致します。
mast
投稿日時: 2008/7/16 14:18
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について
引用:
これは上記の一連のプログラムにおいて、
newMsgのパケットへのポインタが返却された事により、
newPktPtrにおいてnewMsgに対するcopy等の操作が可能になり、
最終的にNetworkIpSendRawMessageToMacLayerWithDelay()の
newMsgにおいてcopy完了後のものが利用されているという
解釈でよろしいでしょうか?

はい。そのとおりです。

引用:
routing_dsr.cppにおいて、
データパケットの受信を確認する箇所として、
DsrRouterFunction()の
        // Packet is not originated in this node
        if (NetworkIpIsMyIP(node, ipHeader->ip_dst))
        {
            // source route option should be eliminated in the previous node.
            // if the packet contains only source route option then the
            // packet will not have any dsr header in it.

            // If it contains any other option that will be handled by
            // Handle protocol packet.

            // So this portion of the code will do nothing

            // update statistics for number of data packet received. If IP
            // protocol is DSR it might be a Route Reply or a Route Error.

            if (ipHeader->ip_p != IPPROTO_DSR)
            {
                dsr->stats.numDataRecved++;
            }

            return;
以外ないという事でよろしいでしょうか?
routing_dsr.cppにおいてデータパケットを受信した際の
受信処理はこの箇所で行うしかないのでしょうか?

はい。こちらもそのとおりです。
you
投稿日時: 2008/7/24 14:41
新米
登録日: 2007/12/25
居住地:
投稿: 11
Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について
mastさん

返信ありがとうございます。

mastさん、hiroさんに頂いたアドバイスの基、
データパケット送信時において、
各ノードの持つ情報をデータパケットに追加するべく、
現在プログラムの記述を行っています。

その後、プログラムの記述を進めていく中で、
新たに生じた問題についてまたここで追加質問させてください。

現在、mastさん、hiroさんに頂いたアドバイスを参考にして、
DsrTransmitDataWithSrcRoute()において、
以下の通りにプログラムの記述を行っています。
        if (origIpHeader.ip_p == IPPROTO_DSR)
        {
            // We don't need to add DSR header. only the optional
            // fields should be added and header option size should
            // be modified as per new option length.

            unsigned short oldPayloadLen = 0;

            memcpy(&oldPayloadLen, MESSAGE_ReturnPacket(msg)
                + sizeof(unsigned short), sizeof(unsigned short));

            dataLen = DSR_SIZE_OF_SRC_ROUTE_WITHOUT_PATH
                          + (numNodesInSrcRt) * sizeof(NodeAddress)
                                  + (numNodesInSrcRtを模した任意の名称) * sizeof(int); //追加部分

            payloadLen = (unsigned short) (oldPayloadLen + dataLen);
        }
        else
        {
            // Need to add dsr header
            dataLen = DSR_SIZE_OF_HEADER
                          + DSR_SIZE_OF_SRC_ROUTE_WITHOUT_PATH
                              + (numNodesInSrcRt) * sizeof(NodeAddress)
                                  + (numNodesInSrcRtを模した任意の名称) * sizeof(int); //追加部分

            payloadLen = (unsigned short) (dataLen - DSR_SIZE_OF_HEADER);
        }

        MESSAGE_ExpandPacket(node, msg, dataLen);

        dataPtr = (unsigned char*) MESSAGE_ReturnPacket(msg);

        // Add common header
        DsrAddCommonHeader(
            dataPtr,
            origIpHeader.ip_p,
            payloadLen);

        dataPtr += DSR_SIZE_OF_HEADER;

        // Insert DSR Source Route option
        ERROR_Assert(rtPtr->destAddr == destAddr, "No route\n");

        // Add source route option
        DsrAddSrcRouteOption(
            dsr,
            dataPtr,
            (unsigned char *) rtPtr->path,
            rtPtr->hopCount - 1,
            0,
            0,
            salvage,
            rtPtr->hopCount - 1);

        dataPtr += (DSR_SIZE_OF_SRC_ROUTE_WITHOUT_PATH + (numNodesInSrcRt) * sizeof(NodeAddress)); //追加部分 

        dataPtrポインタにノードの持つ情報を追加する関数名; //追加部分

ここで、dataLenに
(numNodesInSrcRtを模した任意の名称) * sizeof(int)を追加する事で、
payloadLenが変更されているため、
DsrHandleOptions()における以下の2点
    unsigned char* options
    unsigned short optionSize

この2点において従来代入される値と異なる値が代入されてしまう事で、
        else if (*options == DSR_SRC_ROUTE)
        {
            Message* duplicateMsg = NULL;

            // If the packet is not an overheard packet then the node
            // should forward the packet keeping a copy of the original
            // message. and the node will proceed with processing the
            // original message for further optional fields

            if (!isOverheard)
            {
                duplicateMsg = MESSAGE_Duplicate(node, recvMsg);
            }
            else
            {
                duplicateMsg = recvMsg;
            }

            DsrHandlePacketWithSrcRoute(
                node,
                duplicateMsg,
                prevHop,
                isOverheard);

            optionSize = (unsigned short) (optionSize - (*(options + 1)
                + DSR_SIZE_OF_TYPE_LEN));
            options += (*(options + 1)
                + (unsigned char) DSR_SIZE_OF_TYPE_LEN);
        }

上記のoptionSize、optionsの計算にずれが生じてしまい、
最終的に、
ERROR_Assert(!optionSize, "Unknown Dsr packet type\n");において、
エラーではじかれてしてしまい、シミュレーションが実行できません。

無理矢理optionSize、optionsの計算式を変更して、
エラーではじかれないよう設定しても
決して良い結果が得られるとは思えず、悩んでおります。

ノードの持つ情報を追加する箇所に間違いがある気もするのですが、
どうにも自己解決できないため、
長文ながら数少ない私の示した情報から
修正すべき点をご指摘いただけませんでしょうか?

毎回大変分かりづらい説明で恐縮ですがよろしくお願い致します。

[追記]

当初考えていたアプローチと異なるやり方で取り組んでみたところ、
なんとか自己解決する事ができました。

アドバイス頂いたmastさん、hiroさん改めて御礼申し上げます。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT