1 /*-------------------------------------------------------------------------- 2 Project: HorizonSDK 3 File: rdt_Segment.h 4 5 Copyright 2009 Nintendo. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Date:: 2010-09-14#$ 14 $Rev: 25753 $ 15 $Author: hiratsu_daisuke $ 16 *-------------------------------------------------------------------------*/ 17 18 #include "stdafx.h" 19 20 #ifndef NN_RDT_SEGMENT_H_ 21 #define NN_RDT_SEGMENT_H_ 22 23 #include "rdt_Header.h" 24 25 namespace nn { namespace rdt { namespace CTR { 26 27 /*! 28 @brief これはセグメント(送受信されるデータの固まり)を表現するための構造体です。 29 */ 30 struct Segment{ 31 public: 32 // uds_Api.hには、 33 // @param[in] bufferSize バッファのサイズです。受信したいデータ + 10Byte が必要になります。 34 // という記載があったので、その分マイナスしている。10ではなく、12なのは、パディングの問題。 35 static const size_t PAYLOAD_SIZE = 1476 - sizeof(Header) - 12; 36 /*! 37 @brief 初期化します。 38 */ SegmentSegment39 Segment(void){} 40 41 42 /*! 43 @brief このパケットは本当にRDSのフォーマットに従ったパケットか? を判定する。 44 */ IsValidSegment45 bool IsValid(void) const { return header.magicNum==Header::MAGIC_NUMBER; } 46 47 /*! 48 @brief コントロールビットを参照する。 49 Visual Studio 2008の警告を避けるために、!=0のような書き方をしている。 50 */ IsAckSegment51 bool IsAck(void) const { return (header.controlBit & Header::BIT_ACK)!=0; } IsSynSegment52 bool IsSyn(void) const { return (header.controlBit & Header::BIT_SYN)!=0; } IsFinSegment53 bool IsFin(void) const { return (header.controlBit & Header::BIT_FIN)!=0; } IsRstSegment54 bool IsRst(void) const { return (header.controlBit & Header::BIT_RST)!=0; } 55 56 /*! 57 @brief コントロールビットをセットする。 58 */ SetSynSegment59 void SetSyn(void) { header.controlBit |= Header::BIT_SYN; } SetFinSegment60 void SetFin(void) { header.controlBit |= Header::BIT_FIN; } SetRstSegment61 void SetRst(void) { header.controlBit |= Header::BIT_RST; } 62 SetSrvSegment63 void SetSrv(void) { header.controlBit |= Header::BIT_SRV; } SetCliSegment64 void SetCli(void) { header.controlBit |= Header::BIT_CLI; } 65 66 /*! 67 @brief ACK番号の取得。 68 */ GetAckNumberSegment69 u32 GetAckNumber(void) const { return header.ackNum; } 70 71 /*! 72 @brief ACK番号の設定。ACKビットもセットする。 73 */ SetAckNumberSegment74 void SetAckNumber(u32 ack) { header.ackNum = ack; header.controlBit |= Header::BIT_ACK;} 75 76 /*! 77 @brief (先頭)シーケンス番号の取得。 78 */ GetSeqNumberSegment79 u32 GetSeqNumber(void) const { return header.seqNum; } 80 81 /*! 82 @brief 末尾のシーケンス番号の取得。 83 */ 84 u32 GetLastSeqNumber(void) const; 85 86 /*! 87 @brief シーケンス番号の設定。 88 */ SetSeqNumberSegment89 void SetSeqNumber(u32 seq) { header.seqNum = seq; } 90 91 /*! 92 @brief セグメントに実データをセットします。 93 */ 94 void SetData(const void *pBuf, u32 len); 95 96 /*! 97 @brief セグメントから実データを取り出します。 98 取得できたデータのバイト数が返ります。 99 */ 100 u32 GetData( void *pBuf, u32 len) const; 101 102 /*! 103 @brief 実データが含まれたセグメントかどうか 104 */ IsDataSegment105 bool IsData(void) const { return header.dataLength > 0; } 106 107 /*! 108 @brief パケットに含まれる実データの長さを取得 109 */ GetDataLengthSegment110 u32 GetDataLength(void) const { return header.dataLength; } 111 112 /*! 113 @brief セグメント長を取得(SYNとFINが勘定に入っている) 114 */ 115 u32 GetSegmentLength(void) const; 116 117 /*! 118 @brief ウィンドウサイズを設定します。こちらの受信バッファの 119 空き状況を伝えるのに用いられます。 120 */ SetWindowSizeSegment121 void SetWindowSize(u16 n) { header.windowSize = n; } 122 123 /*! 124 @brief ウィンドウサイズを取得します。 125 */ GetWindowSizeSegment126 u16 GetWindowSize(void) const { return header.windowSize; } 127 128 /*! 129 @brief セグメントの内容を完全にクリアします。 130 */ 131 void Clear(void); 132 133 /*! 134 @brief セグメントのヘッダの部分だけをクリアします。 135 */ 136 void ClearHeader(void); 137 138 /*! 139 @brief 再送の準備をしておかなければならない内容のセグメントであるかどうかを判定します。 140 */ 141 bool IsResendRequired(void) const; 142 143 /*! 144 @brief デバッグ用です。セグメントの情報をプリントします。 145 */ 146 void PrintDebugInfo(void) const; 147 148 Header header; 149 u8 payload[PAYLOAD_SIZE]; 150 }; 151 152 }}} // namespace nn::rdt::CTR 153 154 #endif // end of NN_RDT_SEGMENT_H_ 155