1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     nsoc_user.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:$
14  *---------------------------------------------------------------------------*/
15 
16 /**
17  * @file nsoc_user.h
18  * NSOCモジュール 一般アプリケーション開発者用定義
19  */
20 
21 #ifndef NSOC_USER_H
22 #define NSOC_USER_H
23 
24 #include <nn/net/compatible/nos/nos.h>	/* for NOSxxxx */
25 
26 #ifdef  __cplusplus
27 extern "C" {
28 #endif
29 
30 //#undef NSOC_IP6_ENABLE     /**< IPv6を使用 */
31 
32 
33 /**
34  * @brief プロトコルファミリ表す列挙型です。
35  */
36 enum NSOCProtocolFamily {
37 	NSOC_PF_UNSPEC  = 0,           /**< Unspecified */
38 	NSOC_PF_INET    = 2,           /**< ARPA Internet protocols */
39 	NSOC_PF_INET6   = 23           /**< ARPA Internet protocols version 6 */
40 };
41 
42 /**
43  * @brief アドレスファミリを表す列挙型です。
44  */
45 enum NSOCAddressFamily {
46 	NSOC_AF_UNSPEC  = NSOC_PF_UNSPEC,   /**< Unspecified */
47 	NSOC_AF_INET    = NSOC_PF_INET,     /**< ARPA Internet protocols */
48 	NSOC_AF_INET6   = NSOC_PF_INET6     /**< ARPA Internet protocols version 6 */
49 };
50 
51 /**
52  * @brief ソケット種別表す列挙型です。
53  */
54 enum NSOCSocketType {
55 	NSOC_SOCK_STREAM    = 1,           /**< ストリームソケット */
56 	NSOC_SOCK_DGRAM     = 2            /**< データグラムソケット */
57 };
58 
59 /**
60  * @brief @ref NSOC_RecvFrom や @ref NSOC_SendTo などに与えるフラグです。
61  */
62 enum NSOCMessageFlag {
63 	NSOC_MSG_OOB        = 0x01,        /**< 対域外データの送受信を行います。 */
64 	NSOC_MSG_PEEK       = 0x02,        /**< データ読み出すだけで、取り出さずそのまま残します。 */
65 	NSOC_MSG_DONTWAIT   = 0x04         /**< 非同期操作を行います。 */
66 };
67 
68 /**
69  * @brief @ref NSOC_Poll に与えるフラグです。
70  */
71 enum NSOCPollType {
72 	NSOC_POLLRDNORM     = 0x0001,     /**< 通常のデータを読み出し可能な状態。 SOCListen 関数により受付を開始したソケットが接続要求を受けた状態を含みます。 */
73 	NSOC_POLLRDBAND     = 0x0002,     /**< 優先帯域のデータを読み出し可能な状態。 TCP の緊急モードのデータを読み出し可能な状態です。 */
74 	NSOC_POLLPRI        = 0x0004,     /**< 緊急のデータを読み出し可能な状態。この状態になり得るプロトコルをサポートしていません。 */
75 	NSOC_POLLWRNORM     = 0x0008,     /**< 通常のデータを書き込み可能な状態です。 */
76 	NSOC_POLLWRBAND     = 0x0010,     /**< 優先帯域のデータを書き込み可能な状態。 TCP の緊急モードのデータを書き込み可能な状態です。 */
77 	NSOC_POLLERR        = 0x0020,     /**< 何らかの異常を検知した状態。 (revents のみ) */
78 	NSOC_POLLHUP        = 0x0040,     /**< ハングアップした状態。 (revents のみ) */
79 	NSOC_POLLNVAL       = 0x0080,     /**< 不正な処理が行われた状態。(revents のみ) */
80 	NSOC_POLLIN         = (NSOC_POLLRDNORM | NSOC_POLLRDBAND), /**< データを読み出し可能な状態。 NSOC_POLLRDNORM と NSOC_POLLRDBAND の論理和と同じです。 */
81 	NSOC_POLLOUT        = NSOC_POLLWRNORM /**< データを書き込み可能な状態。NSOC_POLLWRNORM と同じです。 */
82 };
83 
84 /**
85  * @brief @ref NSOC_GetSockOpt(), @ref NSOC_SetSockOpt() などに与えるオプションレベルです。
86  */
87 enum NSOCSocketLevel {
88 	NSOC_SOL_SOCKET     = 0xffff,      /**< ソケット */
89 	NSOC_SOL_CONFIG     = 0xfffe,      /**< インスタンス */
90 	NSOC_SOL_IP         = 0,           /**< IP */
91 	NSOC_SOL_ICMP       = 1,           /**< ICMP */
92 	NSOC_SOL_TCP        = 6,           /**< TCP */
93 	NSOC_SOL_UDP        = 17,          /**< UDP */
94 	NSOC_SOL_IP6        = 41           /**< IPv6 */
95 };
96 
97 /**
98  * @brief @ref NSOC_GetSockOpt(), @ref NSOC_SetSockOpt() に与えるオプション番号です。
99  */
100 enum NSOCSocketOptionType {
101 	NSOC_IP_TOS             = 0x00000007, /**< IPヘッダのTOSフィールド値(int) */
102 	NSOC_IP_TTL             = 0x00000008, /**< IPヘッダのTTLフィールド値(int) */
103 	NSOC_IP_MULTICAST_LOOP  = 0x00000009, /**< マルチキャストパケットをループさせる(unsigned char) */
104 	NSOC_IP_MULTICAST_TTL   = 0x0000000a, /**< マルチキャストパケットのTTLフィールド値(unsigned char) */
105 	NSOC_IP_ADD_MEMBERSHIP  = 0x0000000b, /**< マルチキャストグループ追加(NSOCIPMreq) */
106 	NSOC_IP_DROP_MEMBERSHIP = 0x0000000c, /**< マルチキャストグループ削除(NSOCIPMreq) */
107 	NSOC_SO_REUSEADDR       = 0x00000004, /**< ソケットの再利用を許可する(BOOL) */
108 	NSOC_SO_LINGER          = 0x00000080, /**< TCP切断完了を待つ(NSOCLinger) */
109 	NSOC_SO_OOBINLINE       = 0x00000100, /**< 緊急データをオンラインデータとして扱う(BOOL) */
110 	NSOC_SO_SNDBUF          = 0x00001001, /**< TCP送信バッファサイズ(int) */
111 	NSOC_SO_RCVBUF          = 0x00001002, /**< TCP受信バッファサイズ(int) */
112 	NSOC_SO_SNDLOWAT        = 0x00001003, /**< TCP送信バッファの利用可能下限値(int) */
113 	NSOC_SO_RCVLOWAT        = 0x00001004, /**< TCP受信バッファの利用可能下限値(int) */
114 	NSOC_SO_TYPE            = 0x00001008, /**< ソケット種別(int) */
115 	NSOC_SO_ERROR           = 0x00001009, /**< ソケットにセットされているエラー(int) */
116 	NSOC_TCP_NODELAY        = 0x00002001, /**< 遅延ACKを使用しない(BOOL) */
117 	NSOC_TCP_MAXSEG         = 0x00002002, /**< TCPのMSS値(int) */
118 	NSOC_TCP_STDURG         = 0x00002003, /**< TCPのurgentポインタをRFC仕様にする(BOOL) */
119 	NSOC_TCP_R2             = 0x00002004, /**< TCPのR2タイマ値(int) */
120 	NSOC_TCP_R2_SYN         = 0x00002005  /**< TCPのSYN用R2タイマ値(int) */
121 #ifdef NSOC_IP6_ENABLE
122 	,
123 	NSOC_IP6_MULTICAST_LOOP = 0x00010009, /**< IPv6マルチキャストパケットをループさせる(unsigned char) */
124 	NSOC_IP6_HOPLIMIT       = 0x0001000a, /**< IPv6ヘッダのホップリミット値(unsigned char) */
125 	NSOC_IP6_ADD_MEMBERSHIP = 0x0001000b, /**< IPv6マルチキャストグループ追加(NSOCIP6Mreq) */
126 	NSOC_IP6_DROP_MEMBERSHIP= 0x0001000c  /**< IPv6マルチキャストグループ削除(NSOCIP6Mreq) */
127 #endif
128 };
129 
130 /**
131  * @brief @ref NSOC_Shutdown に与えるフラグです。
132  */
133 enum NSOCShutdownType {
134 	NSOC_SHUT_RD        = 0,           /**< 受信 */
135 	NSOC_SHUT_WR        = 1,           /**< 送信 */
136 	NSOC_SHUT_RDWR      = 2            /**< 送受信 */
137 };
138 
139 /**
140  * @brief @ref NSOC_Fcntl に与えるフラグです。
141  */
142 enum NSOCFctrlFlag {
143 	NSOC_F_GETFL        = 3,            /**< ソケットのフラグ値取得 */
144 	NSOC_F_SETFL        = 4             /**< ソケットのフラグ値セット */
145 };
146 
147 /**
148  * @brief @ref NSOC_Fcntl に与えるモード値です。
149  */
150 enum NSOCFctrlOperation {
151 	NSOC_O_NONBLOCK     = 0x04          /**< APIをノンブロッキングモードに変更 */
152 };
153 
154 /**
155  * @brief @ref NSOC_GetAddrInfo に与えるフラグです。
156  */
157 enum NSOCAddrInfoType {
158 	NSOC_AI_PASSIVE     = 0x01,         /**< nodeNameがNULLのとき、0.0.0.0が設定される */
159 	NSOC_AI_CANONNAME   = 0x02,         /**< nodeNameに対応する正規名の取得 */
160 	NSOC_AI_NUMERICHOST = 0x04,         /**< 数値表現のホストアドレス文字列をnodeNameに指定 */
161 	NSOC_AI_NUMERICSERV = 0x08          /**< 数値表現のポート番号文字列をservNameに指定 */
162 };
163 
164 /**
165  * @brief @ref NSOC_GetNameInfo に与えるフラグです。
166  */
167 enum NSOCNameInfoType {
168 	NSOC_NI_NOFQDN      = 0x01,         /**< 完全修飾ドメイン名(FQDN)のうちノード名の部分だけを取得 */
169 	NSOC_NI_NUMERICHOST = 0x02,         /**< アドレスを数値記法で格納 */
170 	NSOC_NI_NAMEREQD    = 0x04,         /**< ホスト名の問い合わせに失敗した場合にエラー */
171 	NSOC_NI_NUMERICSERV = 0x08,         /**< ポート番号を数値記法で格納 */
172 	NSOC_NI_DGRAM       = 0x10          /**< UDPでの問い合わせ */
173 };
174 
175 /**
176  * @brief @ref NSOC_GetAddrInfo, @ref NSOC_GetNameInfo が返すエラー値です。
177  */
178 enum NSOCAddrInfoError {
179 	NSOC_EAI_BADFLAGS   = -301,         /**< フラグが不正 */
180 	NSOC_EAI_FAIL       = -302,         /**< 修復不可能なエラー */
181 	NSOC_EAI_FAMILY     = -303,         /**< 不明なアドレスファミリ */
182 	NSOC_EAI_MEMORY     = -304,         /**< メモリ割り当てに失敗 */
183 	NSOC_EAI_NONAME     = -305,         /**< 名前を解決できません */
184 	NSOC_EAI_SOCKTYPE   = -307,         /**< ソケットタイプエラー */
185 	NSOC_EAI_SYSTEM     = -308          /**< システムエラー */
186 };
187 
188 /**
189  * @ref NSOC_GetRRSetByName が返すエラー値です。
190  */
191 enum NSOCRRsetError {
192 	NSOC_ERRSET_NONAME  = -350,
193 	NSOC_ERRSET_NODATA  = -351,
194 	NSOC_ERRSET_NOMEMORY= -352,         /**< メモリ不足 */
195 	NSOC_ERRSET_INVAL   = -353,         /**< 引数が不正 */
196 	NSOC_ERRSET_FAIL    = -354
197 };
198 
199 /**
200  * @brief ソケット API 共通で使用するエラー値です。説明のないエラーは内部で使用され、ソケット API が返すことはありません。
201  */
202 enum NSOCSocketError {
203 	NSOC_E2BIG          = -1,
204 	NSOC_EACCES         = -2,     /**< 使用する権限がありません */
205 	NSOC_EADDRINUSE     = -3,     /**< アドレスがすでに使用中です */
206 	NSOC_EADDRNOTAVAIL  = -4,     /**< アドレスが使用できません */
207 	NSOC_EAFNOSUPPORT   = -5,     /**< サポートされていないアドレスファミリです */
208 	NSOC_EAGAIN         = -6,     /**< 要求した操作は封鎖しないと実行できません。(NSOC_EWOULDBLOCKと同様) */
209 	NSOC_EALREADY       = -7,
210 	NSOC_EBADF          = -8,     /**< 不正なソケット記述子です */
211 	NSOC_EBADMSG        = -9,
212 	NSOC_EBUSY          = -10,
213 	NSOC_ECANCELED      = -11,
214 	NSOC_ECHILD         = -12,
215 	NSOC_ECONNABORTED   = -13,    /**< 接続が中断されました */
216 	NSOC_ECONNREFUSED   = -14,    /**< 接続が拒否されました */
217 	NSOC_ECONNRESET     = -15,    /**< 接続がリセットされました */
218 	NSOC_EDEADLK        = -16,
219 	NSOC_EDESTADDRREQ   = -17,    /**< 終点アドレスが指定されていません */
220 	NSOC_EDOM           = -18,
221 	NSOC_EDQUOT         = -19,
222 	NSOC_EEXIST         = -20,
223 	NSOC_EFAULT         = -21,
224 	NSOC_EFBIG          = -22,
225 	NSOC_EHOSTUNREACH   = -23,
226 	NSOC_EIDRM          = -24,
227 	NSOC_EILSEQ         = -25,
228 	NSOC_EINPROGRESS    = -26,    /**< 接続がまだ完了していません */
229 	NSOC_EINTR          = -27,    /**< 中止されました */
230 	NSOC_EINVAL         = -28,    /**< 無効な処理 */
231 	NSOC_EIO            = -29,    /**< 入出力エラー */
232 	NSOC_EISCONN        = -30,    /**< ソケットがすでに接続されています */
233 	NSOC_EISDIR         = -31,
234 	NSOC_ELOOP          = -32,
235 	NSOC_EMFILE         = -33,    /**< ソケット記述子をこれ以上作れません */
236 	NSOC_EMLINK         = -34,
237 	NSOC_EMSGSIZE       = -35,    /**< 送信するにはサイズが大きすぎます */
238 	NSOC_EMULTIHOP      = -36,
239 	NSOC_ENAMETOOLONG   = -37,
240 	NSOC_ENETDOWN       = -38,    /**< 該当インスタンスがダウンしています */
241 	NSOC_ENETRESET      = -39,    /**< ソケットライブラリが初期化されていません */
242 	NSOC_ENETUNREACH    = -40,    /**< 到達できません */
243 	NSOC_ENFILE         = -41,
244 	NSOC_ENOBUFS        = -42,    /**< リソース不足 */
245 	NSOC_ENODATA        = -43,
246 	NSOC_ENODEV         = -44,
247 	NSOC_ENOENT         = -45,
248 	NSOC_ENOEXEC        = -46,
249 	NSOC_ENOLCK         = -47,
250 	NSOC_ENOLINK        = -48,
251 	NSOC_ENOMEM         = -49,    /**< メモリ不足 */
252 	NSOC_ENOMSG         = -50,
253 	NSOC_ENOPROTOOPT    = -51,    /**< サポートされていないオプション */
254 	NSOC_ENOSPC         = -52,
255 	NSOC_ENOSR          = -53,
256 	NSOC_ENOSTR         = -54,
257 	NSOC_ENOSYS         = -55,
258 	NSOC_ENOTCONN       = -56,    /**< 接続されていません */
259 	NSOC_ENOTDIR        = -57,
260 	NSOC_ENOTEMPTY      = -58,
261 	NSOC_ENOTSOCK       = -59,
262 	NSOC_ENOTSUP        = -60,
263 	NSOC_ENOTTY         = -61,
264 	NSOC_ENXIO          = -62,
265 	NSOC_EOPNOTSUPP     = -63,    /**< サポートされていない処理 */
266 	NSOC_EOVERFLOW      = -64,
267 	NSOC_EPERM          = -65,
268 	NSOC_EPIPE          = -66,
269 	NSOC_EPROTO         = -67,
270 	NSOC_EPROTONOSUPPORT= -68,    /**< サポートされていないプロトコル */
271 	NSOC_EPROTOTYPE     = -69,    /**< サポートされていないソケットタイプ */
272 	NSOC_ERANGE         = -70,
273 	NSOC_EROFS          = -71,
274 	NSOC_ESPIPE         = -72,
275 	NSOC_ESRCH          = -73,
276 	NSOC_ESTALE         = -74,
277 	NSOC_ETIME          = -75,
278 	NSOC_ETIMEDOUT      = -76,    /**< 時間切れ */
279 	NSOC_ETXTBSY        = -77,
280 	NSOC_EWOULDBLOCK    = NSOC_EAGAIN,   /**< 要求した操作は封鎖しないと実行できません。(NSOC_EAGAINと同様) */  /* Posix.1g */
281 	NSOC_EXDEV          = -78
282 };
283 
284 /**
285  * @ref NSOC_GetInstanceOpt(), @ref NSOC_SetInstanceOpt() に与えるオプション番号です。
286  */
287 enum NSOCInstanceOptionType {
288 	NSOC_CONFIG_FILTER_INPUT                   =  0x1001,    /**< 受信パケットフィルタ関数 */
289 	NSOC_CONFIG_FILTER_OUTPUT                  =  0x1002,    /**< 送信パケットフィルタ関数 */
290 	NSOC_CONFIG_ERROR                          =  0x1003,    /**< インスタンスのエラー */
291 	NSOC_CONFIG_MAC_ADDRESS                    =  0x1004,    /**< 自MACアドレス */
292 	NSOC_CONFIG_LINK_STATE                     =  0x1005,    /**< インスタンスの起動状態 */
293 	NSOC_CONFIG_INTERFACE_STATISTICS           =  0x1006,    /**< インスタンスの統計情報 */
294 	NSOC_CONFIG_MUTE                           =  0x1007,    /**< パケット送受信停止 */
295 	NSOC_CONFIG_ARP_NUMBER                     =  0x3001,    /**< ARPキャッシュエントリ数 */
296 	NSOC_CONFIG_ARP_TABLE                      =  0x3002,    /**< ARPテーブル */
297 	NSOC_CONFIG_ARP_REFRESH                    =  0x3003,    /**< ARPテーブルのクリア */
298 	NSOC_CONFIG_ARP_ADD                        =  0x3004,    /**< ARPキャッシュエントリ登録 */
299 	NSOC_CONFIG_ARP_REMOVE                     =  0x3005,    /**< ARPキャッシュエントリ削除 */
300 	NSOC_CONFIG_IP_STATISTICS                  =  0x4001,    /**< IPの統計情報 */
301 	NSOC_CONFIG_IP_ADDR_NUMBER                 =  0x4002,    /**< IPアドレス数 */
302 	NSOC_CONFIG_IP_ADDR_TABLE                  =  0x4003,    /**< IPアドレステーブル */
303 	NSOC_CONFIG_IP_MTU                         =  0x4004,    /**< IPのMTU */
304 	NSOC_CONFIG_IP_ROUTING_NUMBER              =  0x4005,    /**< 経路情報エントリ数 */
305 	NSOC_CONFIG_IP_ROUTING_TABLE               =  0x4006,    /**< 経路情報テーブル */
306 	NSOC_CONFIG_IP_ADD_ROUTE                   =  0x4007,    /**< 経路情報エントリ登録 */
307 	NSOC_CONFIG_IP_REMOVE_ROUTE                =  0x4008,    /**< 経路情報エントリ削除 */
308 	NSOC_CONFIG_IP_ADDR                        =  0x400a,    /**< IPアドレス */
309 	NSOC_CONFIG_IP_GATEWAY                     =  0x400b,    /**< デフォルトゲートウエイアドレス */
310 	NSOC_CONFIG_IP_NETMASK                     =  0x400c,    /**< サブネットマスク */
311 	NSOC_CONFIG_IP_REFRESH_ROUTE               =  0x400d,    /**< 経路情報を最新状態に更新 */
312 	NSOC_CONFIG_ICMP_STATISTICS                =  0x5001,    /**< ICMPの統計情報 */
313 #ifdef NSOC_IP6_ENABLE
314 	NSOC_CONFIG_IP6_STATISTICS                 =  0x6001,    /**< IPv6の統計情報 */
315 	NSOC_CONFIG_IP6_MTU                        =  0x6002,    /**< IPv6リンクMTU */
316 	NSOC_CONFIG_IP6_PREFIX_NUMBER              =  0x6003,    /**< IPv6プレフィックスリストエントリ数 */
317 	NSOC_CONFIG_IP6_PREFIX_TABLE               =  0x6004,    /**< IPv6プレフィックスリスト */
318 	NSOC_CONFIG_IP6_ADD_ROUTE                  =  0x6005,    /**< IPv6経路情報エントリ登録 */
319 	NSOC_CONFIG_IP6_REMOVE_ROUTE               =  0x6006,    /**< IPv6経路情報エントリ削除 */
320 	NSOC_CONFIG_IP6_ADD_ADDRESS                =  0x6007,    /**< IPv6アドレス追加 */
321 	NSOC_CONFIG_IP6_REMOVE_ADDRESS             =  0x6008,    /**< IPv6アドレス削除 */
322 	NSOC_CONFIG_IP6_HOPLIMIT                   =  0x6009,    /**< IPv6アドレスホップリミット */
323 	NSOC_CONFIG_IP6_RETRANSMIT_TIMER           =  0x600a,    /**< IPv6アドレス重複検査用NS送信間隔 */
324 	NSOC_CONFIG_IP6_DUP_ADDR_DETECT_TRANSMITS  =  0x600b,    /**< IPv6アドレス重複検査用NS送信回数 */
325 	NSOC_CONFIG_IP6_INTERFACE_ID               =  0x600c,    /**< IPv6アドレスインタフェースID */
326 	NSOC_CONFIG_IP6_DESTINATION_CACHE_NUMBER   =  0x600d,    /**< IPv6宛先キャッシュリストエントリ数 */
327 	NSOC_CONFIG_IP6_DESTINATION_CACHE_TABLE    =  0x600e,    /**< IPv6宛先キャッシュリスト */
328 	NSOC_CONFIG_IP6_ADDR_NUMBER                =  0x600f,    /**< IPv6アドレスリストエントリ数 */
329 	NSOC_CONFIG_IP6_ADDR_TABLE                 =  0x6010,    /**< IPv6アドレスリスト */
330 	NSOC_CONFIG_IP6_ROUTE_NUMBER               =  0x6011,    /**< IPv6経路情報エントリ数 */
331 	NSOC_CONFIG_IP6_ROUTE_TABLE                =  0x6012,    /**< IPv6経路情報テーブル */
332 	NSOC_CONFIG_IP6_NEIGHBOR_CACHE_NUMBER      =  0x6013,    /**< IPv6近隣キャッシュリストエントリ数 */
333 	NSOC_CONFIG_IP6_NEIGHBOR_CACHE_TABLE       =  0x6014,    /**< IPv6近隣キャッシュリスト */
334 	NSOC_CONFIG_IP6_DEFAULT_ROUTER_NUMBER      =  0x6015,    /**< IPv6デフォルトルータリストエントリ数 */
335 	NSOC_CONFIG_IP6_DEFAULT_ROUTER_TABLE       =  0x6016,    /**< IPv6デフォルトルータリスト */
336 	NSOC_CONFIG_IP6_ADD_PREFIX                 =  0x6017,    /**< IPv6プレフィックスエントリ登録 */
337 	NSOC_CONFIG_IP6_REMOVE_PREFIX              =  0x6018,    /**< IPv6プレフィックスエントリ削除 */
338 	NSOC_CONFIG_ICMP6_STATISTICS               =  0x7001,    /**< ICMPv6の統計情報 */
339 #endif /* NSOC_IP6_ENABLE */
340 	NSOC_CONFIG_UDP_STATISTICS                 =  0x8001,    /**< UDPの統計情報 */
341 	NSOC_CONFIG_UDP_NUMBER                     =  0x8002,    /**< UDPソケット数 */
342 	NSOC_CONFIG_UDP_TABLE                      =  0x8003,    /**< UDPソケットテーブル */
343 	NSOC_CONFIG_TCP_STATISTICS                 =  0x9001,    /**< TCPの統計情報 */
344 	NSOC_CONFIG_TCP_NUMBER                     =  0x9002,    /**< TCPソケット数 */
345 	NSOC_CONFIG_TCP_TABLE                      =  0x9003,    /**< TCPソケットテーブル */
346 	NSOC_CONFIG_TCP_MSL                        =  0x9006,    /**< TCPのMSS */
347 	NSOC_CONFIG_TCP_RTO_MIN                    =  0x9007,    /**< TCPの最小再送時間 */
348 	NSOC_CONFIG_TCP_RTO_MAX                    =  0x9008,    /**< TCPの最大再送時間 */
349 	NSOC_CONFIG_TCP_RTO_DEFAULT                =  0x9009,    /**< TCPのデフォルト再送時間 */
350 	NSOC_CONFIG_IGMP_MODE                      =  0xA001,    /**< IGMPのバージョン */
351 	NSOC_CONFIG_DNS_DOMAIN_NAME                =  0xB001,    /**< ドメイン名 */
352 	NSOC_CONFIG_DNS_SERVER_NUMBER              =  0xB002,    /**< DNSサーバ数 */
353 	NSOC_CONFIG_DNS_SERVER_TABLE               =  0xB003,    /**< DNSサーバテーブル */
354 	NSOC_CONFIG_DHCP_REMAINING_LEASE_TIME      =  0xC001     /**< DHCPの残りリース時間 */
355 };
356 
357 /**
358  * ソケットモジュールのステートを表す列挙型です。
359  */
360 enum NSOCInstanceState {
361     NSOC_STATE_INIT = 0,        /**< 初期状態 */
362     NSOC_STATE_WAIT_LINKUP,     /**< 起動実行中 */
363     NSOC_STATE_ACTIVE,          /**< 起動完了状態 */
364     NSOC_STATE_MORIBUND         /**< 終了実行中 */
365 };
366 
367 /*---------------------------------------------------------------------------*
368  * Types/Declarations
369  *---------------------------------------------------------------------------*/
370 
371 /**
372  * 外部参照用 @ref NSOCInstance のポインタ型です。
373  */
374 typedef void * NSOCInstancePtr;
375 
376 /*
377  * アドレス長
378  */
379 #define NSOC_ETH_ALEN           6       /**< MACアドレス長 */
380 #define NSOC_IP_ALEN            4       /**< IPv4アドレス長 */
381 #define NSOC_IP6_ALEN           16      /**< IPv6アドレス長 */
382 
383 /**
384  * IPv4アドレスの文字列長
385  * aaa.bbb.ccc.ddd
386  *
387  * IPv6アドレスの文字列長
388  * RFC3493: 6.3. Address Conversion Functions
389  * ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
390  */
391 #define NSOC_INET_ADDRSTRLEN    16
392 #define NSOC_INET6_ADDRSTRLEN   46
393 
394 /**
395  * @brief IPv4アドレス構造体です。
396  */
397 #define NSOC_INADDR_ANY           ((u32) 0x00000000)  /**< 0.0.0.0 */
398 
399 typedef struct NSOCInAddr
400 {
401     u32         addr;   /**< ネットワークバイトオーダでのIPv4アドレス */
402 } NSOCInAddr;
403 
404 /**
405  * @brief IPv4ソケット構造体です。
406  */
407 typedef struct NSOCSockAddrIn
408 {
409     u8          len;            /**< ソケット構造体のサイズ */
410     u8          family;         /**< アドレスファミリ */
411     u16         port;           /**< ポート番号 */
412     NSOCInAddr  addr;           /**< IPv4アドレス構造体 */
413 } NSOCSockAddrIn;
414 
415 /**
416  * IPv6アドレス構造体です。
417  */
418 typedef struct NSOCIn6Addr
419 {
420     u8         addr[NSOC_IP6_ALEN];    /**< IPv6アドレス */
421 } NSOCIn6Addr;
422 
423 /**
424  * IPv6ソケット構造体です。
425  */
426 typedef struct NSOCSockAddrIn6
427 {
428     u8          len;            /**< ソケット構造体のサイズ */
429     u8          family;         /**< アドレスファミリ */
430     u16         port;           /**< ポート番号 */
431     NSOCIn6Addr addr;           /**< IPv6アドレス構造体 */
432     u32         flowInfo;       /**< IPv6 flow information */
433     u32         scopeId;        /**< set of interfaces for a scope */
434 } NSOCSockAddrIn6;
435 
436 /**
437  * @brief ソケット構造体です。
438  */
439 typedef struct NSOCSockAddr
440 {
441     u8          len;            /**< ソケット構造体のサイズ */
442     u8          family;         /**< アドレスファミリ */
443     u16         pad1;           /**< padding */
444     u32         pad2[6];        /**< padding2 */
445 } NSOCSockAddr;
446 
447 /**
448  * @ref NSOCSockAddrIn と @ref NSOCSockAddrIn6を格納できるだけの大きさの構造体です。
449  */
450 typedef struct NSOCSockAddrStorage
451 {
452     u8          len;            /**< ソケット構造体のサイズ */
453     u8          family;         /**< アドレスファミリ */
454     u16         pad1;           /**< padding */
455     u32         pad2[6];        /**< padding2 */
456 } NSOCSockAddrStorage;
457 
458 /**
459  * @brief @ref NSOC_GetSockOpt(), @ref NSOC_SetSockOpt()で NSOC_SO_LINGER を使用する時の構造体です。
460  */
461 typedef struct NSOCLinger
462 {
463     int         onoff;          /**< 1:linger有効、0:linger無効 */
464     int         linger;         /**< linger時間(秒単位) */
465 } NSOCLinger;
466 
467 /**
468  * @brief @ref NSOC_GetSockOpt(), @ref NSOC_SetSockOpt()で NSOC_IP_ADD_MEMBERSHIP, NSOC_IP_DROP_MEMBERSHIP を使用する時の構造体です。
469  */
470 typedef struct NSOCIPMreq
471 {
472    NSOCInAddr     multiaddr;      /**< グループのIPアドレス */
473    NSOCInAddr     interface;      /**< インターフェイスのIPアドレス */
474 } NSOCIPMreq;
475 
476 /**
477  * @ref NSOC_GetSockOpt(), @ref NSOC_SetSockOpt()で NSOC_IP6_ADD_MEMBERSHIP, NSOC_IP6_DROP_MEMBERSHIP を使用する時の構造体です。
478  */
479 typedef struct NSOCIP6Mreq
480 {
481    u32            scopeId;                  /**< set of interfaces for a scope */
482    u8             maddr[NSOC_IP6_ALEN];     /**< グループのIPアドレス */
483    u8             filterType;               /**< フィルタタイプ */
484    u32            srcNum;                   /**< 送信元アドレス数 */
485    u8             srcList[NSOC_IP6_ALEN];   /**< 送信元アドレス。2つ以上指定するときは続けてアドレスを入れる領域を用意すること */
486 } NSOCIP6Mreq;
487 
488 enum NSOCIP6MreqType {
489 	NSOC_IP6MREQ_INCLUDE = 0,   /**< フィルタタイプ:INCLUDE */
490 	NSOC_IP6MREQ_EXCLUDE = 1    /**< フィルタタイプ:EXCLUDE */
491 };
492 
493 /**
494  * @brief @ref NSOC_Poll() を使用する時の構造体です。
495  */
496 typedef struct NSOCPollFD
497 {
498     int         fd;             /**< ソケット番号 */
499     int         events;         /**< 取得したいイベント */
500     int         revents;        /**< 実際に取得したイベントが返ります */
501 } NSOCPollFD;
502 
503 
504 typedef struct NSOCAddrInfo   NSOCAddrInfo;
505 
506 /**
507  * @brief @ref NSOC_GetAddrInfo() を使用する時の構造体です。
508  */
509 struct NSOCAddrInfo
510 {
511     int             flags;         /**< フラグ */
512     int             family;        /**< ソケットのアドレスファミリ */
513     int             sockType;      /**< ソケットタイプ */
514     int             protocol;      /**< ソケットのプロトコル */
515     unsigned        addrLen;       /**< ソケット構造体のサイズ */
516     char*           canonName;     /**< 正規名 */
517     void*           addr;          /**< ソケット構造体へのポインタ */
518     NSOCAddrInfo*   next;          /**< 次のNSOCAddrInfoへのポインタ。リストの最後ではNULL */
519 };
520 
521 typedef struct NSOCRDataInfo {
522     u32 length;
523     u8 *data;
524 } NSOCRDataInfo;
525 
526 /**
527  * @ref NSOC_GetRRSetByName() を使用する時の構造体です。
528  */
529 typedef struct NSOCRRSetInfo {
530     u16 rdClass;
531     u16 rdType;
532     u32 ttl;
533     u32 nrDatas;
534     char *name;
535     NSOCRDataInfo *rDatas;
536 } NSOCRRSetInfo;
537 
538 /**
539  * @brief @ref NSOC_GetHostByAddr(), @ref NSOC_GetHostByName() を使用する時の構造体です。
540  */
541 typedef struct NSOCHostEnt
542 {
543     char*       name;           /**< ホストのオフィシャル名 */
544     char**      aliases;        /**< エイリアスリストへのポインタ */
545     s16         addrType;       /**< アドレスタイプ。NSOC_PF_INET */
546     s16         length;         /**< ソケット構造体のサイズ */
547     u8**        addrList;       /**< ソケット構造体リストへのポインタ */
548 } NSOCHostEnt;
549 
550 
551 /**
552  * @brief DNSサーバアドレスの構造体です。
553  */
554 typedef struct NSOCDNSAddr {
555     int af;                 /**< アドレスファミリ。NSOC_AF_INETまたはNSOC_AF_INET6、使用しない場合は0 */
556     u8 addr[NSOC_IP6_ALEN];  /**< IPv4またはIPv6アドレス */
557 } NSOCDNSAddr;
558 
559 /**
560  * NSOC_SetResolverIns()、NSOC_GetResolverIns() 使用時の構造体です。
561  */
562 #define NSOC_DNSSERVER_NUM_MAX          4      /**< 保持できる最大のDNSサーバ数 */
563 #define NSOC_DOMAIN_NAME_LEN_MAX        255
564 typedef struct NSOCDNSServerInfo {
565     NSOCDNSAddr entry[NSOC_DNSSERVER_NUM_MAX];         /**< DNSサーバアドレス構造体 */
566 
567     char domain[NSOC_DOMAIN_NAME_LEN_MAX + 1];        /**< ドメイン名 */
568 
569 } NSOCDNSServerInfo;
570 
571 #define NSOC_DNS_NAME_MAX               255 /**< DNSにおける名前の最大文字数*/
572 #define NSOC_MAXDNAME                   (NSOC_DNS_NAME_MAX + 1) /**< DNSにおける名前文字列の最大長(DNS名の最大文字数に'\0'の一文字分を加えた値)*/
573 #define NSOC_DNS_RESOLV_ADDRESS_MAX     24  /**< DNSの名前解決において、一つの名前に対して取得できるアドレスの最大数*/
574 #define NSOC_DNS_RESOLV_ALIASNAME_MAX   24  /**< DNSの名前解決において、一度の解決で取得できるエイリアス名(CNAMEレコードで指定される名称)の最大数*/
575 
576 /*
577  * well-known address 初期化用定義
578  */
579 #define NSOC_IN6ADDR_UNSPECIFIED_INIT               {0}
580 #define NSOC_IN6ADDR_LOOPBACK_INIT                  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}
581 #define NSOC_IN6ADDR_LINKLOCAL_ALL_NODES_INIT       {0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,1}
582 #define NSOC_IN6ADDR_LINKLOCAL_ALL_ROUTERS_INIT     {0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,2}
583 #define NSOC_IN6ADDR_MULTICAST_SOLICITED_NODE_INIT  {0xff,0x02,0,0,0,0,0,0,0,0,0,0x01,0xff,0,0,0}
584 #define NSOC_IN6ADDR_LINKLOCAL_UNICAST_INIT         {0xfe,0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
585 #define NSOC_IN6ADDR_MULTICAST_ALL_ROUTERS_INIT     {0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,16}
586 
587 #ifdef SWITCH_SO_ENDIAN_BIG
588 // Big Endian environment
589 #define NSOC_NtoHl(netlong)        ((u32) (netlong))
590 #define NSOC_NtoHs(netshort)       ((u16) (netshort))
591 #define NSOC_HtoNl(hostlong)       ((u32) (hostlong))
592 #define NSOC_HtoNs(hostshort)      ((u16) (hostshort))
593 
594 #else
595 // Little Endian environment
596 /**
597  * 4byte長変数をネットワークバイトオーダからホストバイトオーダに変換
598  */
599 #define NSOC_NtoHl(netlong)        ( (u32)( (((u32)(netlong)>>24)&0x000000FF) | (((u32)(netlong)>> 8)&0x0000FF00) | (((u32)(netlong)<< 8)&0x00FF0000) | (((u32)(netlong)<<24)&0xFF000000) ) )
600 
601 /**
602  * 2byte長変数をネットワークバイトオーダからホストバイトオーダに変換
603  */
604 #define NSOC_NtoHs(netshort)       ( (u16)( (((u16)(netshort)>>8)&0x00FF) | (((u16)(netshort)<<8)&0xFF00) ) )
605 
606 /**
607  * 4byte長変数をホストオーダからネットワークバイトオーダに変換
608  */
609 #define NSOC_HtoNl(hostlong)       ( (u32)( (((u32)(hostlong)>>24)&0x000000FF) | (((u32)(hostlong)>> 8)&0x0000FF00) | (((u32)(hostlong)<< 8)&0x00FF0000) | (((u32)(hostlong)<<24)&0xFF000000) ) )
610 
611 /**
612  * 2byte長変数をホストオーダからネットワークバイトオーダに変換
613  */
614 #define NSOC_HtoNs(hostshort)      ( (u16)( (((u16)(hostshort)>>8)&0x00FF) | (((u16)(hostshort)<<8)&0xFF00) ) )
615 
616 #endif
617 
618 /**
619  * NSOCモジュールのAPI
620  */
621 /* nsoc_socket.c */
622 extern int NSOC_Socket(int af, int type, int protocol);
623 extern int NSOC_SocketEx(int af, int type, int protocol, void *userInfo);
624 extern int NSOC_Listen(int s, int backlog);
625 extern int NSOC_Accept(int s, void* sockAddr);
626 extern int NSOC_Bind(int s, const void* sockAddr);
627 extern int NSOC_Connect(int s, const void* sockAddr);
628 extern int NSOC_Read(int s, void* buf, int len);
629 extern int NSOC_Recv(int s, void* buf, int len, int flags);
630 extern int NSOC_RecvFrom(int s, void* buf, int len, int flags, void* sockFrom);
631 extern int NSOC_Write(int s, const void* buf, int len);
632 extern int NSOC_Send(int s, const void* buf, int len, int flags);
633 extern int NSOC_SendTo(int s, const void* buf, int len, int flags, const void* sockTo);
634 extern int NSOC_Close(int s);
635 extern int NSOC_Shutdown(int s, int how);
636 extern int NSOC_GetSockOpt(int s, int level, int optname, void* optval, int* optlen);
637 extern int NSOC_SetSockOpt(int s, int level, int optname,  const void* optval, int optlen);
638 extern int NSOC_Fcntl(int s, int cmd, ...);
639 extern int NSOC_Poll(NSOCPollFD fds[], unsigned nfds, s32 timeout);
640 extern int NSOC_SockAtMark(int s);
641 extern u32 NSOC_GetHostID(NSOCInstancePtr insP);
642 extern NSOCHostEnt* NSOC_GetHostByAddr(const void* addr, int len, int type);
643 extern NSOCHostEnt* NSOC_GetHostByName(const char* name);
644 extern int NSOC_GetSockName(int s, void* sockAddr);
645 extern int NSOC_GetPeerName(int s, void* sockAddr);
646 extern int NSOC_SetDNSInstance(NSOCInstancePtr insP);
647 extern int NSOC_SetResolverIns(NSOCInstancePtr insP, NSOCDNSServerInfo *dnsServer);
648 extern int NSOC_GetResolverIns(NSOCInstancePtr insP, NSOCDNSServerInfo *dnsServer);
649 extern int NSOC_SetResolver(const NSOCInAddr* dns1, const NSOCInAddr* dns2); /* deprecated */
650 extern int NSOC_GetResolver(NSOCInAddr* dns1, NSOCInAddr* dns2); /* deprecated */
651 extern int NSOC_SetSuffix(const char* domainName);
652 extern int NSOC_GetSuffix(char* domainName);
653 extern int NSOC_SetInstanceOpt(NSOCInstancePtr insP, int level, int optname, const void* optval, int optlen);
654 extern int NSOC_GetInstanceOpt(NSOCInstancePtr insP, int level, int optname, void* optval, int* optlen);
655 extern void NSOC_SetLastError(int error);
656 extern int NSOC_GetLastError(void);
657 
658 /* nsoc_dns.c */
659 extern int NSOC_GetAddrInfo(const char* nodeName, const char* servName, const NSOCAddrInfo* hints, NSOCAddrInfo** res);
660 extern int NSOC_GetNameInfo(const void* sa, char* node, unsigned nodeLen, char* service, unsigned serviceLen, int flags);
661 extern void NSOC_FreeAddrInfo(NSOCAddrInfo* head);
662 extern void NSOC_FreeRRSet(NSOCRRSetInfo *rrset);
663 extern int NSOC_GetRRSetByName(const char *hostName, u16 rdClass, u16 rdType, u32 flags, NSOCRRSetInfo **res);
664 extern int NSOC_GetServiceLocation(const char* domainName, const char* servName, const NSOCAddrInfo* hints, NSOCAddrInfo** res);
665 
666 /* nsoc_inet.c */
667 extern char* NSOC_IPAtoN(const char* dotted, u8* addr);
668 extern char* NSOC_IPNtoA(const u8* addr);
669 #ifdef NSOC_IP6_ENABLE
670 extern char *NSOC_IP6AtoN(const char *dotted, u8 *addr);
671 extern char *NSOC_IP6NtoA(const u8 *addr, char *ascii, u32 buflen);
672 extern char *NSOC_IP6NtoAs(const u8 *addr);
673 #endif
674 extern int NSOC_InetAtoN(const char* cp, NSOCInAddr* inp);
675 extern char* NSOC_InetNtoA(NSOCInAddr in);
676 extern int NSOC_InetPtoN(int af, const char* src, void* dst);
677 extern const char* NSOC_InetNtoP(int af, const void* src, char* dst, unsigned len);
678 
679 /* nsoc_main.c */
680 extern u32 NSOC_IP6GetScopeIdByInstance(NSOCInstancePtr insP);
681 
682 /* nsoc_state.c */
683 extern s32 NSOC_GetStateIns(NSOCInstancePtr insP);
684 extern void NSOC_ChangeStateIns(NSOCInstancePtr insP, s32 state);
685 
686 
687 extern int NSOC_TST_GetNodeParam(int socket, NOSMutexId *mtxid, u8 *proto, u8 *flag, s32 *id);
688 extern int NSOC_TST_UDPGetObj(int socket, void*  getobj);
689 extern int NSOC_TST_IPGetInfo(int socket, void* ipinfo);
690 extern int NSOC_TST_TCPGetObj(int socket, void*  getobj);
691 
692 #ifdef  __cplusplus
693 }
694 #endif
695 
696 /* NSOC_USER_H */
697 #endif
698