1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     uds_Type.h
4 
5   Copyright (C)2009-2012 Nintendo Co., Ltd.  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   $Rev: 47441 $
14  *---------------------------------------------------------------------------*/
15 
16 /* Please see man pages for details
17 
18 */
19 
20 #ifndef NN_UDS_CTR_UDS_TYPE_H_
21 #define NN_UDS_CTR_UDS_TYPE_H_
22 
23 #include <nn/cfg.h>
24 
25 namespace nn {
26 namespace uds {
27 namespace CTR {
28 
29     namespace
30     {
31         const char PORT_NAME_UDS[]    = "nwm::UDS";
32     }
33 
34 const u16 BROADCAST_NODE_ID = 0xffff;               //!< Node ID representing all node address of the network. Data sent to BROADCAST_NODE_ID can be retrieved by Spectators.
35 
36 const u8 NODE_MAX     = 16;                         //
37 const u8 ENDPOINT_MAX = 16;                         //
38 
39 
40 /* Please see man pages for details
41 
42 
43 */
44 const u8  NET_DESC_APPDATA_SIZE_MAX      = 200;     //
45 const u16 UDS_PACKET_PAYLOAD_MAX_SIZE   = 1478;     //
46 const size_t ATTACH_BUFFER_SIZE_MIN     = (UDS_PACKET_PAYLOAD_MAX_SIZE + 128); 	//
47 const size_t ATTACH_BUFFER_SIZE_DEFAULT = (UDS_PACKET_PAYLOAD_MAX_SIZE * 8);   	//
48 /*
49 
50 */
51 /* Please see man pages for details
52 
53 
54 */
55 const size_t UDS_PASSPHRASE_LENGTH_MIN = 8;         //
56 const size_t UDS_PASSPHRASE_LENGTH_MAX = 255;       //
57 /* Please see man pages for details
58 
59 */
60 
61 /* Please see man pages for details
62 
63 
64 */
65 const bit8 NO_WAIT = 0x01;         //
66 const bit8 FORCE_DIRECT_BC = 0x02; //
67 /*
68 
69 */
70 
71 const u8 MAC_ADDRESS_SIZE   = 6;
72 const u8 OUI_SIZE           = 3;
73 
74 /* Please see man pages for details
75 
76 */
77 enum State
78 {
79     STATE_NONE = 0,                 //
80     STATE_PROCESSING_INITIALIZE,    //
81     STATE_PROCESSING_FINALIZE,      //
82     STATE_DISCONNECTED,             //
83     STATE_CREATING_NETWORK,         //
84     STATE_DESTROYING_NETWORK,       //
85     STATE_MASTER,                   //
86     STATE_CONNECTING_NETWORK,       //
87     STATE_DISCONNECTING_NETWORK,    //
88     STATE_CLIENT,                   //
89     STATE_SPECTATOR,                //
90     STATE_ERROR,                    //
91     STATE_MAX,
92     STATE_MAX_BIT = (1u << 31)
93 
94 };
95 
96 const State STATE_AUDIENCE = STATE_SPECTATOR;
97 
98 /* Please see man pages for details
99 
100 */
101 enum DisconnectReason
102 {
103     BEFORE_COMMUNICATION = 0,   //
104     NETWORK_IS_AVAILABLE,       //
105     REQUEST_FROM_MYSELF,        //
106     REQUEST_FROM_SYSTEM,        //
107     DISCARDED_FROM_NETWORK,     //
108     CONNECTION_LOST,            //
109     UNKNOWN_DISCONNECT_REASON,   //
110     DISCONNECT_REASON_MAX,
111     DISCONNECT_REASON_MAX_BIT = (1u << 31)
112 };
113 
114 /* Please see man pages for details
115 
116 */
117 enum ConnectType
118 {
119     CONNECT_AS_CLIENT = 1,          //
120     CONNECT_AS_SPECTATOR,           //
121     CONNECT_AS_MASTER               //
122 };
123 
124 const ConnectType CONNECT_AS_AUDIENCE  = CONNECT_AS_SPECTATOR ;
125 
126 /* Please see man pages for details
127 
128 */
129 enum PowerSaveMode
130 {
131     ALWAYS_ACTIVE,      //
132     POWERSAVE_NORMAL,   //
133     POWERSAVE_HIGH,      //
134     POWERSAVE_MODE_MAX
135 };
136 
137 /* Please see man pages for details
138 
139 */
140 enum LinkLevel
141 {
142     LINK_LEVEL_0 = 0,   //
143     LINK_LEVEL_1,       //
144     LINK_LEVEL_2,       //
145     LINK_LEVEL_3        //
146 };
147 
148 
149 
150 /* Please see man pages for details
151 
152 */
153 struct ConnectionStatus
154 {
155     State               nowState;                   //
156     DisconnectReason    disconnectReason;           //
157     u16                 myNodeId;                   //
158     bit16               updateNodeBitmap;           //
159     u16                 nodeIdList[NODE_MAX];       //
160     u8                  nowEntry;                   //
161     u8                  maxEntry;                   //
162     bit16               slotBitmap;                 //
163 };
164 
165 /* Please see man pages for details
166 
167 
168 */
169 enum DataFrameIndex
170 {
171     UNICAST_DATAFRAME = 0,      //
172     BROADCAST_DATAFRAME,        //
173     NUM_OF_DATAFRAME
174 };
175 
176 static const size_t SCRAMBLED_LOCAL_FRINED_CODE_SIZE = 12; //
177 
178 /* Please see man pages for details
179 
180 
181 
182 
183 
184 
185 
186 
187 
188 */
189 struct ScrambledLocalFriendCode
190 {
191         bit16 value[SCRAMBLED_LOCAL_FRINED_CODE_SIZE/sizeof(bit16)];    //
192 };
193 
194 /* Please see man pages for details
195 
196 */
197 struct NodeInformation
198 {
199     ScrambledLocalFriendCode scrambledLocalFriendCode; //
200     nn::cfg::CTR::UserName userName; //
201     u16     nodeId;             //
202     NN_PADDING2;
203 };
204 
205 const u8 NODE_INFORMATION_SIZE = sizeof(NodeInformation);
206 
207 /* Please see man pages for details
208 
209 
210 
211 */
212 struct EndpointDescriptor
213 {
214     u32  id;                 //
215 };
216 
217 
218 //Below are the definitions used by internal processes.
219 namespace detail{
220 
221     /* Please see man pages for details
222 
223 
224     */
225     struct RadioStrength
226     {
227         s8   rssi;
228         bool isValid;
229     };
230 
231     /* Please see man pages for details
232 
233 
234 
235 
236     */
237     class RadioStrengthInfo
238     {
239     public:
RadioStrengthInfo()240         RadioStrengthInfo(){m_IsInitialized = false;}
241         void Initialize( const RadioStrength& masterLink, const RadioStrength directLink[NODE_MAX] );
~RadioStrengthInfo()242         ~RadioStrengthInfo(){m_IsInitialized = false;}
243 
244         s8 GetAverage();    //
245         s8 GetMinimum();    //
246         s8 GetMaximum();    //
247         s8 GetMasterLink(); //
248 
249     private:
250         bool m_IsInitialized;
251         void GetRawData(s8 rawLink[NODE_MAX] ); //
252 
253         RadioStrength m_MasterLink;
254         RadioStrength m_DirectLink[NODE_MAX];
255     };
256 
257     // Received result for each Endpoint that could be obtained by DestroyEndpoint.
258     struct ReceiveReport
259     {
260         u32 id;             //
261         u16 targetNodeId;   //
262         u16 port;           //
263         u32 receiveCount;   //
264         u32 lostCount;      //
265     };
266 
UDS_BE2LE16(u16 value)267     inline u16 UDS_BE2LE16( u16 value )
268     {
269         return static_cast<u16>( (((value) & 0xFF00UL) >> 8UL) | (((value) & 0x00FFUL) << 8UL));
270     }
271 
UDS_BE2LE32(u32 value)272     inline u32 UDS_BE2LE32( u32 value )
273     {
274     return static_cast<u32>( (((value) & 0xFF000000UL) >> 24UL) | (((value) & 0x00FF0000UL) >> 8UL) | (((value) & 0x0000FF00UL) << 8UL) | (((value) & 0x000000FFUL) << 24UL));
275     }
276 
UDS_BE2LE64(u64 value)277     inline u64 UDS_BE2LE64( u64 value )
278     {
279         u64 returnValue;
280         u32* tmpA = reinterpret_cast<u32*>(&(returnValue));
281         u32* tmpB = reinterpret_cast<u32*>(&(value));
282 
283         tmpA[0] = UDS_BE2LE32(tmpB[1]);
284         tmpA[1] = UDS_BE2LE32(tmpB[0]);
285 
286         return returnValue;
287     }
288 
UDS_LE2BE32(u32 value)289     inline u32 UDS_LE2BE32( u32 value)
290     {
291         return static_cast<u32>( (((value) & 0xFF000000UL) >> 24UL) | (((value) & 0x00FF0000UL) >> 8UL) | (((value) & 0x0000FF00UL) << 8UL) | (((value) & 0x000000FFUL) << 24UL));
292     }
293 
UDS_LE2BE16(u16 value)294     inline u16 UDS_LE2BE16( u16 value )
295     {
296         return static_cast<u16>( (((value) & 0xFF00UL) >> 8UL) | (((value) & 0x00FFUL) << 8UL));
297     }
298 
UDS_LE2BE64(u64 value)299     inline u64 UDS_LE2BE64( u64 value )
300     {
301         u64 returnValue;
302         u32* tmpA = reinterpret_cast<u32*>(&(returnValue));
303         u32* tmpB = reinterpret_cast<u32*>(&(value));
304 
305         tmpA[0] = UDS_LE2BE32(tmpB[1]);
306         tmpA[1] = UDS_LE2BE32(tmpB[0]);
307 
308         return returnValue;
309     }
310 
311     // UDS versions
312     // 1.0: Initial version
313     // 2.0: Revised the return values of ConnectNetwork() in CTR-SDK 2.X series (ctr-support:1415). Now sends Deauth at Eject().
314     // 3.0: Resolved the latency issue in Finalize() in CTR-SDK 3.X series (+100 msec prior to version 3.0) (ctr-net:1631).
315     // 4.0: ResultInvalidState(ctr-net:1667) for Initialize() during sleep in CTR-SDK 4.X series
316     #define NN_UDS_DEFINE_UDS_VERSION(major, minor)  ((bit16)major<<8 | (bit16)minor&0x00FF)
317     const   bit16  UDS_SDK_VERSION = NN_UDS_DEFINE_UDS_VERSION(4, 0);
318 
319 /*
320 inline u32 UDS_LE2BE32( u32 value)
321 {
322     NN_ASM("rev value, value");
323     return value;
324 }
325 */
326 
327 } //end of namespace detail
328 } // end of namespace CTR
329 } // end of namespace uds
330 } // end of namespace nn
331 
332 #endif /* NN_UDS_CTR_UDS_TYPE_H_ */
333