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

パスワード:


パスワード紛失

新規登録
検索
メインメニュー
アクセスカウンター
2024/05/16:7/7
2024/05/15:17/23

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

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

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

題名 投稿者 日時
   DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について you 2008/7/10 13:53
     Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について mast 2008/7/10 14:39
     Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について you 2008/7/14 17:30
       Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について hiro 2008/7/14 20:45
         Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について you 2008/7/16 0:56
           Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について mast 2008/7/16 14:18
           » Re: DSRにおいてパケットを中継するノードの持つ情報をパケットに追加する方法について you 2008/7/24 14:41
フラット表示 前のトピック | 次のトピック
投稿者 スレッド
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