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: 32947 $ 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 @param[in] bUseSecondarySession true にすると複数セッションが必要な操作 142 (Startup 中の AbortStartup) が可能になります 143 144 @return 処理結果。 145 */ 146 Result InitializePrivilegedControl(bool bUseSecondarySession = false); 147 148 149 /*! 150 :private 151 @brief システム用 API の利用を終了し、使用していたリソースを解放します。 152 153 @return 処理結果。 154 */ 155 Result FinalizePrivilegedControl(void); 156 157 /*! 158 :private 159 @brief ソケットプロセスに動作の開始を指示します。 160 161 ソケットプロセスは動作を開始すると、IP アドレスの取得を試みます。 162 DHCP でアドレスを取得する設定になっている場合は、 163 取得処理が完了するまでブロックします。 164 165 事前に InitializePrivilegedControl の呼び出しが必要です。 166 167 @param[in] config ソケットの設定 168 169 @return 処理結果。 170 */ 171 Result Startup(const Config& config); 172 173 /*! 174 :private 175 @brief ソケットプロセスに動作の停止を指示します。 176 177 ソケットプロセスは動作を停止する際に IP アドレスの開放を試みます。 178 停止が完了すると IP アドレスは 0.0.0.0 となり一切の通信ができません。 179 180 事前に InitializePrivilegedControl の呼び出しが必要です。 181 182 @return 処理結果。 183 */ 184 Result Cleanup(void); 185 186 /*! 187 :private 188 @brief @ref Startup を中断します。 189 190 @return 処理結果。 191 */ 192 Result AbortStartup(void); 193 194 /*! 195 @} 196 197 @name そのほか 198 199 @{ 200 */ 201 202 Result CloseAll(void); 203 Result CloseAll(bit32 processId); 204 205 Result SetMaxDescriptor(s32 number); 206 Result AllowOtherProcess(s32 s); 207 208 209 /*! 210 :private 211 @brief ソケットプロセスの内部で発生したエラーを取得します。 212 213 事前に InitializePrivilegedControl の呼び出しが必要です。 214 215 @param[out] err 内部エラーコード 216 217 @return 処理結果。 218 */ 219 Result GetConfigError(s32* err); 220 221 /*! 222 :private 223 @brief ソケットプロセスの内部で発生したエラーを通知するイベントを取得します。 224 225 取得できるイベントは手動リセットイベントです。 226 一度エラーが発生すると再び Startup し直すまでずっとシグナル状態を維持します。 227 228 事前に InitializePrivilegedControl の呼び出しが必要です。 229 230 @param[out] event 通知のためのイベント。 231 未初期化のイベントを渡してください。 232 233 @return 処理結果。 234 */ 235 Result GetErrorReportEvent(nn::os::Event& event); 236 237 /*! 238 @} 239 */ 240 } 241 } 242 243 #endif // ifndef NN_SOCKET_SOCKET_COMMON_H_ 244