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

パスワード:


パスワード紛失

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

2024/03/20より398/1409
人気モジュール
No.1: フォーラム 2
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット2

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

日曜日からの合計
メイン
   Link (MAC) Layer Settings
     MAC層でセグメントのシーケンス番号を出力させる方法について
投稿するにはまず登録を

題名 投稿者 日時
   MAC層でセグメントのシーケンス番号を出力させる方法について musen 2007/6/24 20:29
     Re: MAC層でセグメントのシーケンス番号を出力させる方法について hiro 2007/6/24 21:05
       Re: MAC層でセグメントのシーケンス番号を出力させる方法について musen 2007/6/24 22:44
       » Re: MAC層でセグメントのシーケンス番号を出力させる方法について mast 2007/6/25 12:14
           Re: MAC層でセグメントのシーケンス番号を出力させる方法について musen 2007/6/27 10:35
             Re: MAC層でセグメントのシーケンス番号を出力させる方法について mast 2007/6/27 10:58
               Re: MAC層でセグメントのシーケンス番号を出力させる方法について musen 2007/6/27 13:07
                 Re: MAC層でセグメントのシーケンス番号を出力させる方法について mast 2007/6/27 18:52
                   Re: MAC層でセグメントのシーケンス番号を出力させる方法について musen 2007/6/28 1:30
                     Re: MAC層でセグメントのシーケンス番号を出力させる方法について mast 2007/6/29 10:44
                       Re: MAC層でセグメントのシーケンス番号を出力させる方法について musen 2007/6/29 15:51
                         Re: MAC層でセグメントのシーケンス番号を出力させる方法について mast 2007/6/29 17:19
                           Re: MAC層でセグメントのシーケンス番号を出力させる方法について mast 2007/6/29 17:25
                             Re: MAC層でセグメントのシーケンス番号を出力させる方法について musen 2007/6/30 0:49
フラット表示 前のトピック | 次のトピック
投稿者 スレッド
mast
投稿日時: 2007/6/25 12:14
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: MAC層でセグメントのシーケンス番号を出力させる方法について
私ならこんな風にやるかなー、という程度ですが、以下、参考までに…
(改造を加えて動かしたわけではないのでちゃんと動作するかどうかは知りません)

クロスレイヤ的な処理をする(他のレイヤの情報を使って特定レイヤの処理をする)には、まずはMessage構造体にレイヤ毎のヘッダ位置を保持するフィールドを持たせるのが一番手っ取り早いのではないかと思います。Linuxのパケットデータ構造であるソケットバッファ(struct sk_buff@include/linux/skbuff.h)がそんな感じになってるので、本気で実装する場合には参考になるかもしれません。例えば以下のような感じで出来そうな気がしないでもないです…

■1 message.hで、
Message構造体に各レイヤのプロトコルタイプ/ヘッダポインタを格納するフィールドを追加
struct message_str
{
    Message*  next; // For kernel use only.
    ...
    // Users should not modify anything above this line.
    int mac_protocol_type       // Newly added
    void *mac_hdr               // Newly added
    int network_protocol_type   // Newly added
    void *network_hdr           // Newly added
    int transport_protocol_type // Newly added
    void *transport_hdr         // Newly added
};



■2 message.h/message.cppに以下の関数宣言/定義を追加
// Retrun the ProtocolType of a specific layer
int MESSAGE_GetMacProtocolType(Node* node, Message* msg)
{
	return msg->mac_protocol_type;
}

int MESSAGE_GetNetworkProtocolType(Node* node, Message* msg)
{
	return msg->network_protocol_type;
}

int MESSAGE_GetTransportProtocolType(Node* node, Message* msg)
{
	return msg->transport_protocol_type;
}

// Retrun the pointer to the ProtocolHeader for a specific layer of this packet
void* MESSAGE_GetMacHeader(Node* node, Message* msg)
{
	return msg->mac_hdr;
}

void* MESSAGE_GetNetworkHeader(Node* node, Message* msg)
{
	return msg->network_hdr;
}

void* MESSAGE_GetTransportHeader(Node* node, Message* msg)
{
	return msg->transport_hdr;
}


■3 各プロトコルが自身のヘッダをパケットに追加する(MESSAGE_AddHeader()等を呼び出す)箇所で、上記で新たにMessage構造体に追加したプロトコルタイプ/ヘッダポインタフィールドを設定
(以下はTCPの場合の例:TCPはMESSAGE_AddHeader()の呼び出しでヘッダを付けるのではないので注意)
void tcp_output(
    Node *node,
    struct tcpcb *tp,
    UInt32 tcp_now,
    struct tcpstat *tcp_stat)
{
    ...
    // Send the packet to the IP model.
    // Remove the ipovly pseudo-header beforehand.
    {
        ...
        anEcnCapablePacket = TransportTcpSetEcnCapablePacket(node, tp, ti);
        TransportTcpSetEcnEchoAndCWR(node, tp, ti);

        TransportTcpTrace(node, tp, ti, "output");
        if (anEcnCapablePacket) {
            TransportTcpTrace(node, 0, 0, "ECT");
        }
        TransportTcpTrace(node, tp, ti, "variables");

        MESSAGE_RemoveHeader(node, msg, sizeof(struct ipovly), TRACE_TCP);

        memcpy(
            MESSAGE_ReturnPacket(msg),
            &ti->ti_t,
            sizeof (struct tcphdr));

        memcpy(
            MESSAGE_ReturnPacket(msg) + sizeof (struct tcphdr),
            (ti + 1), optlen);

        msg->transport_protocol_type = TransportProtocol_TCP; // Newly added
        msg->transport_hdr = MESSAGE_ReturnPacket(msg);       // Newly added

        // Hack solution for TCP trace.
        msg->headerSizes[msg->numberOfHeaders] -= sizeof(struct ipovly);
        msg->numberOfHeaders++;
        ...
    }
    ...
}


■4 クロスレイヤ処理したい箇所で以下のようにして他レイヤのプロトコルヘッダを取得
    ...
    switch (MESSAGE_GetTransportProtocolType(node, msg))
    {
        case TransportProtocol_UDP:
        {
            TransportUdpHeader* udphdr = (TransportUdpHeader *) MESSAGE_GetTransportHeader(node, msg);
             ...
        }
        case TransportProtocol_TCP:
        {
            struct tcphdr* tcphdr = (struct tcphdr *) MESSAGE_GetTransportHeader(node, msg);
            ...
        }
        case TransportProtocol_RSVP:
        default:
        {
            // NOOP
            break;
        }
    }
    ...

フラット表示 前のトピック | 次のトピック
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT