1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: socket_Common.h 4 5 Copyright (C)2010 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: 28967 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NN_SOCKET_SOCKET_COMMON_H_ 17 #define NN_SOCKET_SOCKET_COMMON_H_ 18 19 #include <nn/types.h> 20 #include <nn/os/os_Event.h> 21 #include <nn/fnd/fnd_Allocator.h> 22 #include <nn/socket/socket_Types.h> 23 24 namespace nn { 25 namespace socket { 26 27 const char PORT_NAME_USER[] = "soc:U"; 28 const char PORT_NAME_PRIVILEGED[] = "soc:P"; 29 30 namespace detail{ 31 void* Allocate(size_t size, s32 alignment = sizeof(int)); 32 Result Allocate(void*& p, size_t size, s32 alignment = sizeof(int)); 33 void Free(void* p); 34 } 35 36 /*! 37 @name 初期化・終了 38 39 @{ 40 */ 41 42 /*! 43 @brief ソケットライブラリを初期化し、ソケット API を呼び出せるようにします。 44 45 @param[in] bufferAddress 46 ソケットライブラリが使用するワーク領域のアドレスを指定します。 47 4096 バイト整合である必要があります。デバイスメモリは使用できません。 48 49 @param[in] bufferSize 50 ワーク領域のサイズを指定します。 51 <br/> 52 ワーク領域は最低でも @ref GetRequiredMemorySize で求めたサイズ以上の 53 大きさが必要です。 54 <br/> 55 通常の使用方法であれば、この値をそのまま使用して問題ありませんが、 56 @ref GetAddrInfo で多数の @ref AddrInfo を確保する場合はさらに大きいサイズを必要に応じて指定してください。 57 58 @param[in] bufferSizeForSockets 59 ワーク領域のうち、ソケットの送受信バッファの割り当てに使用するサイズを指定します。 60 <br/> 61 各ソケットの送受信バッファは @ref SetSockOpt にて指定できます。 62 デフォルトでは 1 ソケットあたり TCP では 16KB(送信 8KB・受信 8KB)、UDP では 32KB のメモリを割り当てます。 63 ソケットを 1 つだけ使う場合でも、最低 64KB 程度は確保するようにしてください。 64 <br/> 65 ※デフォルトのバッファサイズは今後変更される可能性があります。 66 67 @param[in] maxSessions ソケット API を扱うスレッド数を指定します。 68 <br/> 69 この値を超えるスレッドからブロックするソケット API を呼ぶことはできません。 70 厳密には同時にブロックする API を呼び出さなければ、 71 この値を超える数のスレッドからソケット API を呼び出すことができますが推奨しません。 72 <br/> 73 API の呼び出し中にセッション数が不足した場合、 74 同期・非同期に関わらず使用できるセッションが空くまでブロックします。 75 また、データの着信や送信の完了などブロックの解除条件が満たされても、セッションが空くまでブロックは解除されません。 76 非同期操作は同期的な挙動になるので特に注意してください。 77 <br/> 78 @ref Poll を使用すると、1 回の API 呼び出しで複数のソケットの状態を確認することができ、 79 ソケット API を扱うスレッド数を減らすことができます。 80 81 @return 処理結果。 82 */ 83 Result Initialize(uptr bufferAddress, size_t bufferSize, s32 bufferSizeForSockets, s32 maxSessions); 84 85 86 /*! 87 @brief ソケットライブラリを初期化に最低限必要なワーク領域のサイズを求めます。 88 89 ワーク領域は @ref GetAddrInfo で返される @ref AddrInfo の確保に使用される他、API の呼び出し中に一時的に使用されます。 90 <br/> 91 ある程度余分にサイズを予約した上で値を計算していますので、通常はワーク領域がいつ使われているかを気にする必要はありません。 92 <br/> 93 ただし、@ref GetAddrInfo で取得した @ref AddrInfo を @ref FreeAddrInfo で解放せずに 94 連続して @ref GetAddrInfo を呼び出すような場合は、返された値よりもさらに大きなメモリが必要になる場合があります。 95 96 @param[in] bufferSizeForSockets 97 @ref Initialize の同名引数に指定する数。 98 99 @param[in] maxSessions @ref Initialize の同名引数に指定する数。 100 101 @return 必要なワーク領域のサイズ。 102 */ 103 size_t GetRequiredMemorySize(size_t bufferSizeForSockets, s32 maxSessions); 104 105 106 /*! 107 @brief ソケットライブラリを初期化し、ソケット API を呼び出せるようにします。 108 109 過去との互換性のために残されています。メモリの使用効率が悪いため、なるべく使用しないでください。 110 */ 111 Result Initialize(nn::fnd::IAllocator& allocator, size_t bufferSize, s32 maxSessions) NN_ATTRIBUTE_DEPRECATED; 112 113 /*! 114 @brief ソケットライブラリを初期化し、ソケット API を呼び出せるようにします。 115 116 パラメータを省略してすべてデフォルト値を指定します。 117 テスト用途のために用意されています。製品の開発には使用しないでください。 118 119 @return 処理結果。 120 */ 121 Result Initialize(void); 122 123 124 /*! 125 @brief ソケットライブラリを終了し、使用していたリソースを解放します。 126 127 使用中のソケット記述子はすべて破棄され、ブロック中の API も全てキャンセルされエラーを返します。 128 129 @return 処理結果。 130 */ 131 Result Finalize(void); 132 133 134 /*! 135 :private 136 @brief ソケットのシステム用 API を呼び出せるようにします。 137 Initialize とは別に呼び出す必要があります。 138 139 使用権限のない一般アプリケーションが呼び出すと常に失敗します。 140 141 @return 処理結果。 142 */ 143 Result InitializePrivilegedControl(void); 144 145 146 /*! 147 :private 148 @brief システム用 API の利用を終了し、使用していたリソースを解放します。 149 150 @return 処理結果。 151 */ 152 Result FinalizePrivilegedControl(void); 153 154 /*! 155 :private 156 @brief ソケットプロセスに動作の開始を指示します。 157 158 ソケットプロセスは動作を開始すると、IP アドレスの取得を試みます。 159 DHCP でアドレスを取得する設定になっている場合は、 160 取得処理が完了するまでブロックします。 161 162 事前に InitializePrivilegedControl の呼び出しが必要です。 163 164 @param[in] config ソケットの設定 165 166 @return 処理結果。 167 */ 168 Result Startup(const Config& config); 169 170 /*! 171 :private 172 @brief ソケットプロセスに動作の停止を指示します。 173 174 ソケットプロセスは動作を停止する際に IP アドレスの開放を試みます。 175 停止が完了すると IP アドレスは 0.0.0.0 となり一切の通信ができません。 176 177 事前に InitializePrivilegedControl の呼び出しが必要です。 178 179 @return 処理結果。 180 */ 181 Result Cleanup(void); 182 183 /*! 184 :private 185 @brief @ref Startup を中断します。 186 187 @return 処理結果。 188 */ 189 Result AbortStartup(void); 190 191 /*! 192 @} 193 194 @name そのほか 195 196 @{ 197 */ 198 199 Result CloseAll(void); 200 Result CloseAll(bit32 processId); 201 202 Result SetMaxDescriptor(s32 number); 203 Result AllowOtherProcess(s32 s); 204 205 206 /*! 207 :private 208 @brief ソケットプロセスの内部で発生したエラーを取得します。 209 210 事前に InitializePrivilegedControl の呼び出しが必要です。 211 212 @param[out] err 内部エラーコード 213 214 @return 処理結果。 215 */ 216 Result GetConfigError(s32* err); 217 218 /*! 219 :private 220 @brief ソケットプロセスの内部で発生したエラーを通知するイベントを取得します。 221 222 取得できるイベントは手動リセットイベントです。 223 一度エラーが発生すると再び Startup し直すまでずっとシグナル状態を維持します。 224 225 事前に InitializePrivilegedControl の呼び出しが必要です。 226 227 @param[out] event 通知のためのイベント。 228 未初期化のイベントを渡してください。 229 230 @return 処理結果。 231 */ 232 Result GetErrorReportEvent(nn::os::Event& event); 233 234 /*! 235 @} 236 */ 237 } 238 } 239 240 #endif // ifndef NN_SOCKET_SOCKET_COMMON_H_ 241