1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     socket_User.autogen.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: 29753 $
14  *---------------------------------------------------------------------------*/
15 
16 /**
17  * モジュール 一般アプリケーション開発者用定義
18  */
19 
20 #ifndef NN_SOCKET_SOCKET_USER_AUTOGEN_H_
21 #define NN_SOCKET_SOCKET_USER_AUTOGEN_H_
22 
23 #include <nn/types.h>	/* for NOSxxxx */
24 
25 namespace nn {
26 namespace socket {
27 
28 //#undef NN_SOCKET_IP6_ENABLE     //!< IPv6を使用
29 
30 
31 /**
32  * @brief プロトコルファミリ表す列挙型です。
33  */
34 enum ProtocolFamily {
35 	PF_UNSPEC  = 0,           //!< Unspecified
36 	PF_INET    = 2,           //!< ARPA Internet protocols
37 	PF_INET6   = 23           //!< ARPA Internet protocols version 6
38 };
39 
40 /**
41  * @brief アドレスファミリを表す列挙型です。
42  */
43 enum AddressFamily {
44 	AF_UNSPEC  = PF_UNSPEC,   //!< Unspecified
45 	AF_INET    = PF_INET,     //!< ARPA Internet protocols
46 	AF_INET6   = PF_INET6     //!< ARPA Internet protocols version 6
47 };
48 
49 /**
50  * @brief ソケット種別表す列挙型です。
51  */
52 enum SocketType {
53 	SOCK_STREAM    = 1,           //!< ストリームソケット
54 	SOCK_DGRAM     = 2            //!< データグラムソケット
55 };
56 
57 /**
58  * @brief @ref RecvFrom や @ref SendTo などに与えるフラグです。
59  */
60 enum MessageFlag {
61 	MSG_OOB        = 0x01,        //!< 対域外データの送受信を行います。
62 	MSG_PEEK       = 0x02,        //!< データ読み出すだけで、取り出さずそのまま残します。
63 	MSG_DONTWAIT   = 0x04         //!< 非同期操作を行います。
64 };
65 
66 /**
67  * @brief @ref Poll に与えるフラグです。
68  */
69 enum PollType {
70 	POLLRDNORM     = 0x0001,     //!< 通常のデータを読み出し可能な状態。 SOCListen 関数により受付を開始したソケットが接続要求を受けた状態を含みます。
71 	POLLRDBAND     = 0x0002,     //!< 優先帯域のデータを読み出し可能な状態。 TCP の緊急モードのデータを読み出し可能な状態です。
72 	POLLPRI        = 0x0004,     //!< 緊急のデータを読み出し可能な状態。この状態になり得るプロトコルをサポートしていません。
73 	POLLWRNORM     = 0x0008,     //!< 通常のデータを書き込み可能な状態です。
74 	POLLWRBAND     = 0x0010,     //!< 優先帯域のデータを書き込み可能な状態。 TCP の緊急モードのデータを書き込み可能な状態です。
75 	POLLERR        = 0x0020,     //!< 何らかの異常を検知した状態。 (revents のみ)
76 	POLLHUP        = 0x0040,     //!< ハングアップした状態。 (revents のみ)
77 	POLLNVAL       = 0x0080,     //!< 不正な処理が行われた状態。(revents のみ)
78 	POLLIN         = (POLLRDNORM | POLLRDBAND), //!< データを読み出し可能な状態。 POLLRDNORM と POLLRDBAND の論理和と同じです。
79 	POLLOUT        = POLLWRNORM //!< データを書き込み可能な状態。POLLWRNORM と同じです。
80 };
81 
82 /**
83  * @brief @ref GetSockOpt(), @ref SetSockOpt() などに与えるオプションレベルです。
84  */
85 enum SocketLevel {
86 	SOL_SOCKET     = 0xffff,      //!< ソケット
87 	SOL_CONFIG     = 0xfffe,      //!< インスタンス
88 	SOL_IP         = 0,           //!< IP
89 	SOL_ICMP       = 1,           //!< ICMP
90 	SOL_TCP        = 6,           //!< TCP
91 	SOL_UDP        = 17,          //!< UDP
92 	SOL_IP6        = 41           //!< IPv6
93 };
94 
95 /**
96  * @brief @ref GetSockOpt(), @ref SetSockOpt() に与えるオプション番号です。
97  */
98 enum SocketOptionType {
99 	IP_TOS             = 0x00000007, //!< IPヘッダのTOSフィールド値(int)
100 	IP_TTL             = 0x00000008, //!< IPヘッダのTTLフィールド値(int)
101 	IP_MULTICAST_LOOP  = 0x00000009, //!< マルチキャストパケットをループさせる(unsigned char)
102 	IP_MULTICAST_TTL   = 0x0000000a, //!< マルチキャストパケットのTTLフィールド値(unsigned char)
103 	IP_ADD_MEMBERSHIP  = 0x0000000b, //!< マルチキャストグループ追加(IpMreq)
104 	IP_DROP_MEMBERSHIP = 0x0000000c, //!< マルチキャストグループ削除(IpMreq)
105 	SO_REUSEADDR       = 0x00000004, //!< ソケットの再利用を許可する(Bool)
106 	SO_LINGER          = 0x00000080, //!< TCP切断完了を待つ(Linger)
107 	SO_OOBINLINE       = 0x00000100, //!< 緊急データをオンラインデータとして扱う(Bool)
108 	SO_SNDBUF          = 0x00001001, //!< TCP送信バッファサイズ(int)
109 	SO_RCVBUF          = 0x00001002, //!< TCP受信バッファサイズ(int)
110 	SO_SNDLOWAT        = 0x00001003, //!< TCP送信バッファの利用可能下限値(int)
111 	SO_RCVLOWAT        = 0x00001004, //!< TCP受信バッファの利用可能下限値(int)
112 	SO_TYPE            = 0x00001008, //!< ソケット種別(int)
113 	SO_ERROR           = 0x00001009, //!< ソケットにセットされているエラー(int)
114 	TCP_NODELAY        = 0x00002001, //!< 遅延ACKを使用しない(Bool)
115 	TCP_MAXSEG         = 0x00002002, //!< TCPのMSS値(int)
116 	TCP_STDURG         = 0x00002003, //!< TCPのurgentポインタをRFC仕様にする(Bool)
117 	TCP_R2             = 0x00002004, //!< TCPのR2タイマ値(int)
118 	TCP_R2_SYN         = 0x00002005  //!< TCPのSYN用R2タイマ値(int)
119 #ifdef NN_SOCKET_IP6_ENABLE
120 	,
121 	IP6_MULTICAST_LOOP = 0x00010009, //!< IPv6マルチキャストパケットをループさせる(unsigned char)
122 	IP6_HOPLIMIT       = 0x0001000a, //!< IPv6ヘッダのホップリミット値(unsigned char)
123 	IP6_ADD_MEMBERSHIP = 0x0001000b, //!< IPv6マルチキャストグループ追加(Ip6Mreq)
124 	IP6_DROP_MEMBERSHIP= 0x0001000c  //!< IPv6マルチキャストグループ削除(Ip6Mreq)
125 #endif
126 };
127 
128 /**
129  * @brief @ref Shutdown に与えるフラグです。
130  */
131 enum ShutdownType {
132 	SHUT_RD        = 0,           //!< 受信
133 	SHUT_WR        = 1,           //!< 送信
134 	SHUT_RDWR      = 2            //!< 送受信
135 };
136 
137 /**
138  * @brief @ref Fcntl に与えるフラグです。
139  */
140 enum FcntlFlag {
141 	F_GETFL        = 3,            //!< ソケットのフラグ値取得
142 	F_SETFL        = 4             //!< ソケットのフラグ値セット
143 };
144 
145 /**
146  * @brief @ref Fcntl に与えるモード値です。
147  */
148 enum FcntlOperation {
149 	O_NONBLOCK     = 0x04          //!< APIをノンブロッキングモードに変更
150 };
151 
152 /**
153  * @brief @ref GetAddrInfo に与えるフラグです。
154  */
155 enum AddrInfoType {
156 	AI_PASSIVE     = 0x01,         //!< nodeNameがNULLのとき、0.0.0.0が設定される
157 	AI_CANONNAME   = 0x02,         //!< nodeNameに対応する正規名の取得
158 	AI_NUMERICHOST = 0x04,         //!< 数値表現のホストアドレス文字列をnodeNameに指定
159 	AI_NUMERICSERV = 0x08          //!< 数値表現のポート番号文字列をservNameに指定
160 };
161 
162 /**
163  * @brief @ref GetNameInfo に与えるフラグです。
164  */
165 enum NameInfoType {
166 	NI_NOFQDN      = 0x01,         //!< 完全修飾ドメイン名(FQDN)のうちノード名の部分だけを取得
167 	NI_NUMERICHOST = 0x02,         //!< アドレスを数値記法で格納
168 	NI_NAMEREQD    = 0x04,         //!< ホスト名の問い合わせに失敗した場合にエラー
169 	NI_NUMERICSERV = 0x08,         //!< ポート番号を数値記法で格納
170 	NI_DGRAM       = 0x10          //!< UDPでの問い合わせ
171 };
172 
173 /**
174  * @brief @ref GetAddrInfo, @ref GetNameInfo が返すエラー値です。
175  */
176 enum AddrInfoError {
177 	EAI_BADFLAGS   = -301,         //!< フラグが不正
178 	EAI_FAIL       = -302,         //!< 修復不可能なエラー
179 	EAI_FAMILY     = -303,         //!< 不明なアドレスファミリ
180 	EAI_MEMORY     = -304,         //!< メモリ割り当てに失敗
181 	EAI_NONAME     = -305,         //!< 名前を解決できません
182 	EAI_SOCKTYPE   = -307,         //!< ソケットタイプエラー
183 	EAI_SYSTEM     = -308          //!< システムエラー
184 };
185 
186 /**
187  * @ref GetRRSetByName が返すエラー値です。
188  */
189 enum RRsetError {
190 	ERRSET_NONAME  = -350,
191 	ERRSET_NODATA  = -351,
192 	ERRSET_NOMEMORY= -352,         //!< メモリ不足
193 	ERRSET_INVAL   = -353,         //!< 引数が不正
194 	ERRSET_FAIL    = -354
195 };
196 
197 /**
198  * @brief ソケット API 共通で使用するエラー値です。説明のないエラーは内部で使用され、ソケット API が返すことはありません。
199  */
200 enum SocketError {
201 	E2BIG          = -1,
202 	EACCES         = -2,     //!< 使用する権限がありません
203 	EADDRINUSE     = -3,     //!< アドレスがすでに使用中です
204 	EADDRNOTAVAIL  = -4,     //!< アドレスが使用できません
205 	EAFNOSUPPORT   = -5,     //!< サポートされていないアドレスファミリです
206 	EAGAIN         = -6,     //!< 非封鎖の操作が行われた、もしくはタイムアウトが発生したためリトライが必要です。(EWOULDBLOCKと同様)
207 	EALREADY       = -7,
208 	EBADF          = -8,     //!< 不正なソケット記述子です
209 	EBADMSG        = -9,
210 	EBUSY          = -10,
211 	ECANCELED      = -11,
212 	ECHILD         = -12,
213 	ECONNABORTED   = -13,    //!< 接続が中断されました
214 	ECONNREFUSED   = -14,    //!< 接続が拒否されました
215 	ECONNRESET     = -15,    //!< 接続がリセットされました
216 	EDEADLK        = -16,
217 	EDESTADDRREQ   = -17,    //!< 終点アドレスが指定されていません
218 	EDOM           = -18,
219 	EDQUOT         = -19,
220 	EEXIST         = -20,
221 	EFAULT         = -21,
222 	EFBIG          = -22,
223 	EHOSTUNREACH   = -23,
224 	EIDRM          = -24,
225 	EILSEQ         = -25,
226 	EINPROGRESS    = -26,    //!< 接続がまだ完了していません
227 	EINTR          = -27,    //!< 中止されました
228 	EINVAL         = -28,    //!< 無効な処理
229 	EIO            = -29,    //!< 入出力エラー
230 	EISCONN        = -30,    //!< ソケットがすでに接続されています
231 	EISDIR         = -31,
232 	ELOOP          = -32,
233 	EMFILE         = -33,    //!< ソケット記述子をこれ以上作れません
234 	EMLINK         = -34,
235 	EMSGSIZE       = -35,    //!< 送信するにはサイズが大きすぎます
236 	EMULTIHOP      = -36,
237 	ENAMETOOLONG   = -37,
238 	ENETDOWN       = -38,    //!< 該当インスタンスがダウンしています
239 	ENETRESET      = -39,    //!< ソケットライブラリが初期化されていません
240 	ENETUNREACH    = -40,    //!< 到達できません
241 	ENFILE         = -41,
242 	ENOBUFS        = -42,    //!< リソース不足
243 	ENODATA        = -43,
244 	ENODEV         = -44,
245 	ENOENT         = -45,
246 	ENOEXEC        = -46,
247 	ENOLCK         = -47,
248 	ENOLINK        = -48,
249 	ENOMEM         = -49,    //!< メモリ不足
250 	ENOMSG         = -50,
251 	ENOPROTOOPT    = -51,    //!< サポートされていないオプション
252 	ENOSPC         = -52,
253 	ENOSR          = -53,
254 	ENOSTR         = -54,
255 	ENOSYS         = -55,
256 	ENOTCONN       = -56,    //!< 接続されていません
257 	ENOTDIR        = -57,
258 	ENOTEMPTY      = -58,
259 	ENOTSOCK       = -59,
260 	ENOTSUP        = -60,
261 	ENOTTY         = -61,
262 	ENXIO          = -62,
263 	EOPNOTSUPP     = -63,    //!< サポートされていない処理
264 	EOVERFLOW      = -64,
265 	EPERM          = -65,
266 	EPIPE          = -66,
267 	EPROTO         = -67,
268 	EPROTONOSUPPORT= -68,    //!< サポートされていないプロトコル
269 	EPROTOTYPE     = -69,    //!< サポートされていないソケットタイプ
270 	ERANGE         = -70,
271 	EROFS          = -71,
272 	ESPIPE         = -72,
273 	ESRCH          = -73,
274 	ESTALE         = -74,
275 	ETIME          = -75,
276 	ETIMEDOUT      = -76,    //!< 時間切れ
277 	ETXTBSY        = -77,
278 	EWOULDBLOCK    = EAGAIN,   //!< 要求した操作は封鎖しないと実行できません。(EAGAINと同様)  /* Posix.1g */
279 	EXDEV          = -78
280 };
281 
282 /**
283  * @ref GetInstanceOpt(), @ref SetInstanceOpt() に与えるオプション番号です。
284  */
285 enum InstanceOptionType {
286 	CONFIG_FILTER_INPUT                   =  0x1001,    //!< 受信パケットフィルタ関数
287 	CONFIG_FILTER_OUTPUT                  =  0x1002,    //!< 送信パケットフィルタ関数
288 	CONFIG_ERROR                          =  0x1003,    //!< インスタンスのエラー
289 	CONFIG_MAC_ADDRESS                    =  0x1004,    //!< 自MACアドレス
290 	CONFIG_LINK_STATE                     =  0x1005,    //!< インスタンスの起動状態
291 	CONFIG_INTERFACE_STATISTICS           =  0x1006,    //!< インスタンスの統計情報
292 	CONFIG_MUTE                           =  0x1007,    //!< パケット送受信停止
293 	CONFIG_ARP_NUMBER                     =  0x3001,    //!< ARPキャッシュエントリ数
294 	CONFIG_ARP_TABLE                      =  0x3002,    //!< ARPテーブル
295 	CONFIG_ARP_REFRESH                    =  0x3003,    //!< ARPテーブルのクリア
296 	CONFIG_ARP_ADD                        =  0x3004,    //!< ARPキャッシュエントリ登録
297 	CONFIG_ARP_REMOVE                     =  0x3005,    //!< ARPキャッシュエントリ削除
298 	CONFIG_IP_STATISTICS                  =  0x4001,    //!< IPの統計情報
299 	CONFIG_IP_ADDR_NUMBER                 =  0x4002,    //!< IPアドレス数
300 	CONFIG_IP_ADDR_TABLE                  =  0x4003,    //!< IPアドレステーブル
301 	CONFIG_IP_MTU                         =  0x4004,    //!< IPのMTU
302 	CONFIG_IP_ROUTING_NUMBER              =  0x4005,    //!< 経路情報エントリ数
303 	CONFIG_IP_ROUTING_TABLE               =  0x4006,    //!< 経路情報テーブル
304 	CONFIG_IP_ADD_ROUTE                   =  0x4007,    //!< 経路情報エントリ登録
305 	CONFIG_IP_REMOVE_ROUTE                =  0x4008,    //!< 経路情報エントリ削除
306 	CONFIG_IP_ADDR                        =  0x400a,    //!< IPアドレス
307 	CONFIG_IP_GATEWAY                     =  0x400b,    //!< デフォルトゲートウエイアドレス
308 	CONFIG_IP_NETMASK                     =  0x400c,    //!< サブネットマスク
309 	CONFIG_IP_REFRESH_ROUTE               =  0x400d,    //!< 経路情報を最新状態に更新
310 	CONFIG_ICMP_STATISTICS                =  0x5001,    //!< ICMPの統計情報
311 #ifdef NN_SOCKET_IP6_ENABLE
312 	CONFIG_IP6_STATISTICS                 =  0x6001,    //!< IPv6の統計情報
313 	CONFIG_IP6_MTU                        =  0x6002,    //!< IPv6リンクMTU
314 	CONFIG_IP6_PREFIX_NUMBER              =  0x6003,    //!< IPv6プレフィックスリストエントリ数
315 	CONFIG_IP6_PREFIX_TABLE               =  0x6004,    //!< IPv6プレフィックスリスト
316 	CONFIG_IP6_ADD_ROUTE                  =  0x6005,    //!< IPv6経路情報エントリ登録
317 	CONFIG_IP6_REMOVE_ROUTE               =  0x6006,    //!< IPv6経路情報エントリ削除
318 	CONFIG_IP6_ADD_ADDRESS                =  0x6007,    //!< IPv6アドレス追加
319 	CONFIG_IP6_REMOVE_ADDRESS             =  0x6008,    //!< IPv6アドレス削除
320 	CONFIG_IP6_HOPLIMIT                   =  0x6009,    //!< IPv6アドレスホップリミット
321 	CONFIG_IP6_RETRANSMIT_TIMER           =  0x600a,    //!< IPv6アドレス重複検査用NS送信間隔
322 	CONFIG_IP6_DUP_ADDR_DETECT_TRANSMITS  =  0x600b,    //!< IPv6アドレス重複検査用NS送信回数
323 	CONFIG_IP6_INTERFACE_ID               =  0x600c,    //!< IPv6アドレスインタフェースID
324 	CONFIG_IP6_DESTINATION_CACHE_NUMBER   =  0x600d,    //!< IPv6宛先キャッシュリストエントリ数
325 	CONFIG_IP6_DESTINATION_CACHE_TABLE    =  0x600e,    //!< IPv6宛先キャッシュリスト
326 	CONFIG_IP6_ADDR_NUMBER                =  0x600f,    //!< IPv6アドレスリストエントリ数
327 	CONFIG_IP6_ADDR_TABLE                 =  0x6010,    //!< IPv6アドレスリスト
328 	CONFIG_IP6_ROUTE_NUMBER               =  0x6011,    //!< IPv6経路情報エントリ数
329 	CONFIG_IP6_ROUTE_TABLE                =  0x6012,    //!< IPv6経路情報テーブル
330 	CONFIG_IP6_NEIGHBOR_CACHE_NUMBER      =  0x6013,    //!< IPv6近隣キャッシュリストエントリ数
331 	CONFIG_IP6_NEIGHBOR_CACHE_TABLE       =  0x6014,    //!< IPv6近隣キャッシュリスト
332 	CONFIG_IP6_DEFAULT_ROUTER_NUMBER      =  0x6015,    //!< IPv6デフォルトルータリストエントリ数
333 	CONFIG_IP6_DEFAULT_ROUTER_TABLE       =  0x6016,    //!< IPv6デフォルトルータリスト
334 	CONFIG_IP6_ADD_PREFIX                 =  0x6017,    //!< IPv6プレフィックスエントリ登録
335 	CONFIG_IP6_REMOVE_PREFIX              =  0x6018,    //!< IPv6プレフィックスエントリ削除
336 	CONFIG_ICMP6_STATISTICS               =  0x7001,    //!< ICMPv6の統計情報
337 #endif /* NN_SOCKET_IP6_ENABLE */
338 	CONFIG_UDP_STATISTICS                 =  0x8001,    //!< UDPの統計情報
339 	CONFIG_UDP_NUMBER                     =  0x8002,    //!< UDPソケット数
340 	CONFIG_UDP_TABLE                      =  0x8003,    //!< UDPソケットテーブル
341 	CONFIG_TCP_STATISTICS                 =  0x9001,    //!< TCPの統計情報
342 	CONFIG_TCP_NUMBER                     =  0x9002,    //!< TCPソケット数
343 	CONFIG_TCP_TABLE                      =  0x9003,    //!< TCPソケットテーブル
344 	CONFIG_TCP_MSL                        =  0x9006,    //!< TCPのMSS
345 	CONFIG_TCP_RTO_MIN                    =  0x9007,    //!< TCPの最小再送時間
346 	CONFIG_TCP_RTO_MAX                    =  0x9008,    //!< TCPの最大再送時間
347 	CONFIG_TCP_RTO_DEFAULT                =  0x9009,    //!< TCPのデフォルト再送時間
348 	CONFIG_IGMP_MODE                      =  0xA001,    //!< IGMPのバージョン
349 	CONFIG_DNS_DOMAIN_NAME                =  0xB001,    //!< ドメイン名
350 	CONFIG_DNS_SERVER_NUMBER              =  0xB002,    //!< DNSサーバ数
351 	CONFIG_DNS_SERVER_TABLE               =  0xB003,    //!< DNSサーバテーブル
352 	CONFIG_DHCP_REMAINING_LEASE_TIME      =  0xC001     //!< DHCPの残りリース時間
353 };
354 
355 /**
356  * ソケットモジュールのステートを表す列挙型です。
357  */
358 enum InstanceState {
359     STATE_INIT = 0,        //!< 初期状態
360     STATE_WAIT_LINKUP,     //!< 起動実行中
361     STATE_ACTIVE,          //!< 起動完了状態
362     STATE_MORIBUND         //!< 終了実行中
363 };
364 
365 /*---------------------------------------------------------------------------*
366  * Types/Declarations
367  *---------------------------------------------------------------------------*/
368 
369 /**
370  * 外部参照用 @ref Instance のポインタ型です。
371  */
372 typedef void * InstancePtr;
373 
374 /*
375  * アドレス長
376  */
377 #define NN_SOCKET_ETH_ALEN           6       //!< MACアドレス長
378 #define NN_SOCKET_IP_ALEN            4       //!< IPv4アドレス長
379 #define NN_SOCKET_IP6_ALEN           16      //!< IPv6アドレス長
380 
381 /**
382  * IPv4アドレスの文字列長
383  * aaa.bbb.ccc.ddd
384  *
385  * IPv6アドレスの文字列長
386  * RFC3493: 6.3. Address Conversion Functions
387  * ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
388  */
389 #define NN_SOCKET_INET_ADDRSTRLEN    16
390 #define NN_SOCKET_INET6_ADDRSTRLEN   46
391 
392 /**
393  * @brief IPv4アドレス構造体です。
394  */
395 #define NN_SOCKET_INADDR_ANY           ((u32) 0x00000000)  //!< 0.0.0.0
396 
397 struct InAddr
398 {
399     u32         addr;   //!< ネットワークバイトオーダでのIPv4アドレス
400 };
401 
402 /**
403  * @brief IPv4ソケット構造体です。
404  */
405 struct SockAddrIn
406 {
407     u8          len;            //!< ソケット構造体のサイズ
408     u8          family;         //!< アドレスファミリ
409     u16         port;           //!< ポート番号
410     InAddr  addr;           //!< IPv4アドレス構造体
411 };
412 
413 /**
414  * IPv6アドレス構造体です。
415  */
416 struct In6Addr
417 {
418     u8         addr[NN_SOCKET_IP6_ALEN];    //!< IPv6アドレス
419 };
420 
421 /**
422  * IPv6ソケット構造体です。
423  */
424 struct SockAddrIn6
425 {
426     u8          len;            //!< ソケット構造体のサイズ
427     u8          family;         //!< アドレスファミリ
428     u16         port;           //!< ポート番号
429     In6Addr addr;           //!< IPv6アドレス構造体
430     u32         flowInfo;       //!< IPv6 flow information
431     u32         scopeId;        //!< set of interfaces for a scope
432 };
433 
434 /**
435  * @brief ソケット構造体です。
436  */
437 struct SockAddr
438 {
439     u8          len;            //!< ソケット構造体のサイズ
440     u8          family;         //!< アドレスファミリ
441     u16         pad1;           //!< padding
442     u32         pad2[6];        //!< padding2
443 };
444 
445 /**
446  * @ref SockAddrIn と @ref SockAddrIn6を格納できるだけの大きさの構造体です。
447  */
448 struct SockAddrStorage
449 {
450     u8          len;            //!< ソケット構造体のサイズ
451     u8          family;         //!< アドレスファミリ
452     u16         pad1;           //!< padding
453     u32         pad2[6];        //!< padding2
454 };
455 
456 /**
457  * @brief @ref GetSockOpt(), @ref SetSockOpt()で SO_LINGER を使用する時の構造体です。
458  */
459 struct Linger
460 {
461     int         onoff;          //!< 1:linger有効、0:linger無効
462     int         linger;         //!< linger時間(秒単位)
463 };
464 
465 /**
466  * @brief @ref GetSockOpt(), @ref SetSockOpt()で IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP を使用する時の構造体です。
467  */
468 struct IpMreq
469 {
470    InAddr     multiaddr;      //!< グループのIPアドレス
471    InAddr     interface;      //!< インターフェイスのIPアドレス
472 };
473 
474 /**
475  * @ref GetSockOpt(), @ref SetSockOpt()で IP6_ADD_MEMBERSHIP, IP6_DROP_MEMBERSHIP を使用する時の構造体です。
476  */
477 struct Ip6Mreq
478 {
479    u32            scopeId;                  //!< set of interfaces for a scope
480    u8             maddr[NN_SOCKET_IP6_ALEN];     //!< グループのIPアドレス
481    u8             filterType;               //!< フィルタタイプ
482    u32            srcNum;                   //!< 送信元アドレス数
483    u8             srcList[NN_SOCKET_IP6_ALEN];   //!< 送信元アドレス。2つ以上指定するときは続けてアドレスを入れる領域を用意すること
484 };
485 
486 enum IP6MreqType {
487 	IP6MREQ_INCLUDE = 0,   //!< フィルタタイプ:INCLUDE
488 	IP6MREQ_EXCLUDE = 1    //!< フィルタタイプ:EXCLUDE
489 };
490 
491 /**
492  * @brief @ref Poll() を使用する時の構造体です。
493  */
494 struct PollFd
495 {
496     int         fd;             //!< ソケット番号
497     int         events;         //!< 取得したいイベント
498     int         revents;        //!< 実際に取得したイベントが返ります
499 };
500 
501 
502 
503 /**
504  * @brief @ref GetAddrInfo() を使用する時の構造体です。
505  */
506 struct AddrInfo
507 {
508     int             flags;         //!< フラグ
509     int             family;        //!< ソケットのアドレスファミリ
510     int             sockType;      //!< ソケットタイプ
511     int             protocol;      //!< ソケットのプロトコル
512     unsigned        addrLen;       //!< ソケット構造体のサイズ
513     char*           canonName;     //!< 正規名
514     void*           addr;          //!< ソケット構造体へのポインタ
515     AddrInfo*   next;          //!< 次のAddrInfoへのポインタ。リストの最後ではNULL
516 };
517 
518 struct RDataInfo {
519     u32 length;
520     u8 *data;
521 };
522 
523 /**
524  * @ref GetRRSetByName() を使用する時の構造体です。
525  */
526 struct RRSetInfo {
527     u16 rdClass;
528     u16 rdType;
529     u32 ttl;
530     u32 nrDatas;
531     char *name;
532     RDataInfo *rDatas;
533 };
534 
535 /**
536  * @brief @ref GetHostByAddr(), @ref GetHostByName() を使用する時の構造体です。
537  */
538 struct HostEnt
539 {
540     char*       name;           //!< ホストのオフィシャル名
541     char**      aliases;        //!< エイリアスリストへのポインタ
542     s16         addrType;       //!< アドレスタイプ。PF_INET
543     s16         length;         //!< ソケット構造体のサイズ
544     u8**        addrList;       //!< ソケット構造体リストへのポインタ
545 };
546 
547 
548 /**
549  * @brief DNSサーバアドレスの構造体です。
550  */
551 struct DnsAddr {
552     int af;                 //!< アドレスファミリ。AF_INETまたはAF_INET6、使用しない場合は0
553     u8 addr[NN_SOCKET_IP6_ALEN];  //!< IPv4またはIPv6アドレス
554 };
555 
556 /**
557  * SetResolverIns()、GetResolverIns() 使用時の構造体です。
558  */
559 #define NN_SOCKET_DNSSERVER_NUM_MAX          4      //!< 保持できる最大のDNSサーバ数
560 #define NN_SOCKET_DOMAIN_NAME_LEN_MAX        255
561 struct DnsServerInfo {
562     DnsAddr entry[NN_SOCKET_DNSSERVER_NUM_MAX];         //!< DNSサーバアドレス構造体
563 
564     char domain[NN_SOCKET_DOMAIN_NAME_LEN_MAX + 1];        //!< ドメイン名
565 
566 };
567 
568 #define NN_SOCKET_DNS_NAME_MAX               255 //!< DNSにおける名前の最大文字数
569 #define NN_SOCKET_MAXDNAME                   (NN_SOCKET_DNS_NAME_MAX + 1) //!< DNSにおける名前文字列の最大長(DNS名の最大文字数に'\0'の一文字分を加えた値)
570 #define NN_SOCKET_DNS_RESOLV_ADDRESS_MAX     24  //!< DNSの名前解決において、一つの名前に対して取得できるアドレスの最大数
571 #define NN_SOCKET_DNS_RESOLV_ALIASNAME_MAX   24  //!< DNSの名前解決において、一度の解決で取得できるエイリアス名(CNAMEレコードで指定される名称)の最大数
572 
573 /*
574  * well-known address 初期化用定義
575  */
576 #define NN_SOCKET_IN6ADDR_UNSPECIFIED_INIT               {0}
577 #define NN_SOCKET_IN6ADDR_LOOPBACK_INIT                  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}
578 #define NN_SOCKET_IN6ADDR_LINKLOCAL_ALL_NODES_INIT       {0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,1}
579 #define NN_SOCKET_IN6ADDR_LINKLOCAL_ALL_ROUTERS_INIT     {0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,2}
580 #define NN_SOCKET_IN6ADDR_MULTICAST_SOLICITED_NODE_INIT  {0xff,0x02,0,0,0,0,0,0,0,0,0,0x01,0xff,0,0,0}
581 #define NN_SOCKET_IN6ADDR_LINKLOCAL_UNICAST_INIT         {0xfe,0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
582 #define NN_SOCKET_IN6ADDR_MULTICAST_ALL_ROUTERS_INIT     {0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,16}
583 
584 #ifdef SWITCH_SO_ENDIAN_BIG
585 // Big Endian environment
586 #define NN_SOCKET_NtoHl(netlong)        ((u32) (netlong))
587 #define NN_SOCKET_NtoHs(netshort)       ((u16) (netshort))
588 #define NN_SOCKET_HtoNl(hostlong)       ((u32) (hostlong))
589 #define NN_SOCKET_HtoNs(hostshort)      ((u16) (hostshort))
590 
591 #else
592 // Little Endian environment
593 /**
594  * 4byte長変数をネットワークバイトオーダからホストバイトオーダに変換
595  */
596 #define NN_SOCKET_NtoHl(netlong)        ( (u32)( (((u32)(netlong)>>24)&0x000000FF) | (((u32)(netlong)>> 8)&0x0000FF00) | (((u32)(netlong)<< 8)&0x00FF0000) | (((u32)(netlong)<<24)&0xFF000000) ) )
597 
598 /**
599  * 2byte長変数をネットワークバイトオーダからホストバイトオーダに変換
600  */
601 #define NN_SOCKET_NtoHs(netshort)       ( (u16)( (((u16)(netshort)>>8)&0x00FF) | (((u16)(netshort)<<8)&0xFF00) ) )
602 
603 /**
604  * 4byte長変数をホストオーダからネットワークバイトオーダに変換
605  */
606 #define NN_SOCKET_HtoNl(hostlong)       ( (u32)( (((u32)(hostlong)>>24)&0x000000FF) | (((u32)(hostlong)>> 8)&0x0000FF00) | (((u32)(hostlong)<< 8)&0x00FF0000) | (((u32)(hostlong)<<24)&0xFF000000) ) )
607 
608 /**
609  * 2byte長変数をホストオーダからネットワークバイトオーダに変換
610  */
611 #define NN_SOCKET_HtoNs(hostshort)      ( (u16)( (((u16)(hostshort)>>8)&0x00FF) | (((u16)(hostshort)<<8)&0xFF00) ) )
612 
613 #endif
614 
615 /**
616  * モジュールのAPI
617  */
618 /* nsoc_socket.c */
619 
620 /* nsoc_dns.c */
621 
622 /* nsoc_inet.c */
623 #ifdef NN_SOCKET_IP6_ENABLE
624 #endif
625 
626 /* nsoc_main.c */
627 
628 /* nsoc_state.c */
629 
630 
631 
632 
633 } // socket
634 } // nn
635 /* NN_SOCKET_SOCKET_USER_AUTOGEN_H_ */
636 #endif
637