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