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

パスワード:


パスワード紛失

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

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

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

日曜日からの合計
メイン
   Link (MAC) Layer Protocol Implementation & Model Development
     RTS/CTSフレームの判別
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
U1
投稿日時: 2007/12/20 14:32
新米
登録日: 2007/12/7
居住地:
投稿: 5
RTS/CTSフレームの判別
RTS/CTSはフレームタイプとして
M802_11_RTS,M802_11_CTSが格納されますが、
この情報をPHY層から参照して判別したいのです。
どのような方法を使えば出来るのか、わからない
ためご教授お願いします。
mast
投稿日時: 2007/12/20 19:14
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: RTS/CTSフレームの判別
対象のMACプロトコルはMAC_DOT11でなくMAC_802_11ですか?
であれば、phy_802_11.cppに
#include "mac_802_11.h"

を追加して、さらにそのファイル内のPhy802_11SignalEndFromChannel()関数の以下の箇所で
01430         if (!receiveErrorOccurred) {
01431             newMsg = MESSAGE_Duplicate(node, propRxInfo->txMsg);
01432 
01433             MESSAGE_RemoveHeader(
01434                 node, newMsg, sizeof(Phy802_11PlcpHeader), TRACE_802_11);
01435 
01436             MESSAGE_SetInstanceId(newMsg, (short) phyIndex);
01437             MAC_ReceivePacketFromPhy(
01438                 node,
01439                 node->phyData[phyIndex]->macInterfaceIndex,
01440                 newMsg);
01441 
01442             phy802_11->stats.totalRxSignalsToMac++;
01443         }
01444         else {
01445             Phy802_11ReportStatusToMac(
01446                 node,
01447                 phyIndex,
01448                 phy802_11->mode);
01449 
01450             phy802_11->stats.totalSignalsWithErrors++;
01451         }//if//

以下のようなことをやれば出来るんじゃないかと思います。
01430         if (!receiveErrorOccurred) {
01431             newMsg = MESSAGE_Duplicate(node, propRxInfo->txMsg);
01432 
01433             MESSAGE_RemoveHeader(
01434                 node, newMsg, sizeof(Phy802_11PlcpHeader), TRACE_802_11);
01435 
01436             MESSAGE_SetInstanceId(newMsg, (short) phyIndex);
*****
*****             int macInterfaceIndex = node->phyData[phyIndex]->macInterfaceIndex;
*****
*****             switch (node->macData[macInterfaceIndex]->macProtocol)
*****             {
*****                 case MAC_PROTOCOL_802_11:
*****                 {
*****                     MacData802_11* M802 = (MacData802_11*)node->macData[macInterfaceIndex]->macVar;
*****                     M802_11ShortControlFrame* hdr = (M802_11ShortControlFrame*) MESSAGE_ReturnPacket(newMsg);
*****
*****                     if (M802->selfAddr == hdr->destAddr) {
*****                         switch (hdr->frameType) {
*****                             case M802_11_RTS: {
*****                                 //
*****                                 // Write your own code
*****                                 //
*****                                 break;
*****                             }
*****                             case M802_11_CTS: {
*****                                 //
*****                                 // Write your own code
*****                                 //
*****                                 break;
*****                             }
*****                             default: {
*****                                 //
*****                                 // Write your own code
*****                                 //
*****                                 break;
*****                             }
*****                         }//switch//
*****                     }
*****                 }
*****                 default:
*****                 {
*****                     break;
*****                 }
*****             }
01437             MAC_ReceivePacketFromPhy(
01438                 node,
01439                 node->phyData[phyIndex]->macInterfaceIndex,
01440                 newMsg);
01441 
01442             phy802_11->stats.totalRxSignalsToMac++;
01443         }
01444         else {
01445             Phy802_11ReportStatusToMac(
01446                 node,
01447                 phyIndex,
01448                 phy802_11->mode);
01449 
01450             phy802_11->stats.totalSignalsWithErrors++;
01451         }//if//


対象のMACプロトコルがMAC_DOT11の場合も、まぁ同じようにやればできるんじゃないかと思います。。
U1
投稿日時: 2007/12/20 21:53
新米
登録日: 2007/12/7
居住地:
投稿: 5
Re: RTS/CTSフレームの判別
>mast さん
とてもわかりやすい回答ありがとうございます。

自分の説明が悪かったのですが、
PHY層は送信前の方で、フレーム情報を知りたいのです。
上の返答を応用できないか考えたのですが、
MESSAGE_RemoveHeader()処理のことを考えると
うまくいきません。

それとも中身を見るためだけに、MESSAGE_RemoveHeader()
を行うことは可能なのでしょうか?

質問が適切でないかもしれませんが、よろしくお願いします。
mast
投稿日時: 2007/12/21 11:07
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: RTS/CTSフレームの判別
MESSAGE_AddHeader()でPLCPヘッダを付加する前だとダメということでしょうか?

であれば、
以前、「TCPヘッダの内容をMAC層でみるためには」という質問への回答をしたときに、他レイヤで付加されたヘッダの情報を見るための実装例を示したのを思い出しました。こちらが参考になると思います。

http://simweb.kke.co.jp/qualnet/forum/modules/newbb/viewtopic.php?viewmode=thread&topic_id=360&forum=29&post_id=1351#1351
mast
投稿日時: 2007/12/21 11:30
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: RTS/CTSフレームの判別
それか単純に

    Phy802_11PlcpHeader* plcp = (Phy802_11PlcpHeader*)MESSAGE_ReturnPacket(packet);
    M802_11ShortControlFrame* m80211hdr = (M802_11ShortControlFrame*) ((char*)MESSAGE_ReturnPacket(packet) + sizeof(Phy802_11PlcpHeader));
    switch (m80211hdr->frameType) {
        case M802_11_RTS: {
            //
            // Write your own code
            //
            break;
        }
        case M802_11_CTS: {
            //
            // Write your own code
            //
            break;
        }
        default: {
            //
            // Write your own code
            //
            break;
        }
    }

ではどうでしょうか?・・・無理?
U1
投稿日時: 2007/12/21 11:44
新米
登録日: 2007/12/7
居住地:
投稿: 5
Re: RTS/CTSフレームの判別
>mast さん

様々な方法を提示していただき、ありがとうございます。
PHY層で、MESSAGE_AddHeader()の前に分岐させても
所望の動作をすることが確認できました。

とても勉強になりました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT