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