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