/*-------------------------------------------------------------------------- Project: HorizonSDK File: rdt_Segment.h Copyright 2009 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Date:: 2010-09-14#$ $Rev: 25753 $ $Author: hiratsu_daisuke $ *-------------------------------------------------------------------------*/ #include "stdafx.h" #ifndef NN_RDT_SEGMENT_H_ #define NN_RDT_SEGMENT_H_ #include "rdt_Header.h" namespace nn { namespace rdt { namespace CTR { /*! @brief これはセグメント(送受信されるデータの固まり)を表現するための構造体です。 */ struct Segment{ public: // uds_Api.hには、 // @param[in] bufferSize バッファのサイズです。受信したいデータ + 10Byte が必要になります。 // という記載があったので、その分マイナスしている。10ではなく、12なのは、パディングの問題。 static const size_t PAYLOAD_SIZE = 1476 - sizeof(Header) - 12; /*! @brief 初期化します。 */ Segment(void){} /*! @brief このパケットは本当にRDSのフォーマットに従ったパケットか? を判定する。 */ bool IsValid(void) const { return header.magicNum==Header::MAGIC_NUMBER; } /*! @brief コントロールビットを参照する。 Visual Studio 2008の警告を避けるために、!=0のような書き方をしている。 */ bool IsAck(void) const { return (header.controlBit & Header::BIT_ACK)!=0; } bool IsSyn(void) const { return (header.controlBit & Header::BIT_SYN)!=0; } bool IsFin(void) const { return (header.controlBit & Header::BIT_FIN)!=0; } bool IsRst(void) const { return (header.controlBit & Header::BIT_RST)!=0; } /*! @brief コントロールビットをセットする。 */ void SetSyn(void) { header.controlBit |= Header::BIT_SYN; } void SetFin(void) { header.controlBit |= Header::BIT_FIN; } void SetRst(void) { header.controlBit |= Header::BIT_RST; } void SetSrv(void) { header.controlBit |= Header::BIT_SRV; } void SetCli(void) { header.controlBit |= Header::BIT_CLI; } /*! @brief ACK番号の取得。 */ u32 GetAckNumber(void) const { return header.ackNum; } /*! @brief ACK番号の設定。ACKビットもセットする。 */ void SetAckNumber(u32 ack) { header.ackNum = ack; header.controlBit |= Header::BIT_ACK;} /*! @brief (先頭)シーケンス番号の取得。 */ u32 GetSeqNumber(void) const { return header.seqNum; } /*! @brief 末尾のシーケンス番号の取得。 */ u32 GetLastSeqNumber(void) const; /*! @brief シーケンス番号の設定。 */ void SetSeqNumber(u32 seq) { header.seqNum = seq; } /*! @brief セグメントに実データをセットします。 */ void SetData(const void *pBuf, u32 len); /*! @brief セグメントから実データを取り出します。 取得できたデータのバイト数が返ります。 */ u32 GetData( void *pBuf, u32 len) const; /*! @brief 実データが含まれたセグメントかどうか */ bool IsData(void) const { return header.dataLength > 0; } /*! @brief パケットに含まれる実データの長さを取得 */ u32 GetDataLength(void) const { return header.dataLength; } /*! @brief セグメント長を取得(SYNとFINが勘定に入っている) */ u32 GetSegmentLength(void) const; /*! @brief ウィンドウサイズを設定します。こちらの受信バッファの 空き状況を伝えるのに用いられます。 */ void SetWindowSize(u16 n) { header.windowSize = n; } /*! @brief ウィンドウサイズを取得します。 */ u16 GetWindowSize(void) const { return header.windowSize; } /*! @brief セグメントの内容を完全にクリアします。 */ void Clear(void); /*! @brief セグメントのヘッダの部分だけをクリアします。 */ void ClearHeader(void); /*! @brief 再送の準備をしておかなければならない内容のセグメントであるかどうかを判定します。 */ bool IsResendRequired(void) const; /*! @brief デバッグ用です。セグメントの情報をプリントします。 */ void PrintDebugInfo(void) const; Header header; u8 payload[PAYLOAD_SIZE]; }; }}} // namespace nn::rdt::CTR #endif // end of NN_RDT_SEGMENT_H_