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