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