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