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