* copy vendor drop to trunk
[lab.git] / Dev / utvpn / utvpn-unix-v101-7101-public / src / Mayaqua / Network.h
1 // SoftEther UT-VPN SourceCode\r
2 // \r
3 // Copyright (C) 2004-2010 SoftEther Corporation.\r
4 // Copyright (C) 2004-2010 University of Tsukuba, Japan.\r
5 // Copyright (C) 2003-2010 Daiyuu Nobori.\r
6 // All Rights Reserved.\r
7 // \r
8 // http://utvpn.tsukuba.ac.jp/\r
9 // \r
10 // This program is free software; you can redistribute it and/or\r
11 // modify it under the terms of the GNU General Public License\r
12 // version 2 as published by the Free Software Foundation.\r
13 // \r
14 // This program is distributed in the hope that it will be useful,\r
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
17 // GNU General Public License for more details.\r
18 // \r
19 // You should have received a copy of the GNU General Public License version 2\r
20 // along with this program; if not, write to the Free Software\r
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
22 // \r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。\r
28 // \r
29 // この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の\r
30 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )\r
31 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって\r
32 // ホストされています。\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、\r
34 // および、試験または研究のために利用が行われることを想定して配布\r
35 // しています。\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に\r
37 // あります。\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース\r
42 // に組み込みさせていただきます。\r
43 // \r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
46 // \r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
51 // ください。\r
52 // \r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、\r
58 // 公益保護にご協力いただきますようお願い申し上げます。\r
59 // \r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客\r
62 // を保護するための努力を行います。\r
63 // \r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/\r
65 // 日本国内の脆弱性情報届出受付公的機関:\r
66 //         独立行政法人 情報処理推進機構\r
67 //         http://www.ipa.go.jp/security/vuln/report/\r
68 // \r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/\r
71 \r
72 // -----------------------------------------------\r
73 // [ChangeLog]\r
74 // 2010.05.20\r
75 //  新規リリース by SoftEther\r
76 // -----------------------------------------------\r
77 \r
78 // Network.h\r
79 // Network.c のヘッダ\r
80 \r
81 #ifndef NETWORK_H\r
82 #define NETWORK_H\r
83 \r
84 #define TIMEOUT_GETIP                           2300\r
85 \r
86 #define TIMEOUT_INFINITE                        (0x7fffffff)\r
87 #define TIMEOUT_TCP_PORT_CHECK          (10 * 1000)\r
88 #define TIMEOUT_SSL_CONNECT                     (15 * 1000)\r
89 \r
90 #define TIMEOUT_HOSTNAME                        (500)\r
91 #define TIMEOUT_NETBIOS_HOSTNAME        (100)\r
92 #define EXPIRES_HOSTNAME                        (10 * 60 * 1000)\r
93 \r
94 #define SOCKET_BUFFER_SIZE                      0x10000000\r
95 \r
96 #define IPV6_DUMMY_FOR_IPV4                     0xFEFFFFDF\r
97 \r
98 \r
99 // IP アドレス\r
100 struct IP\r
101 {\r
102         UCHAR addr[4];                                  // IPv4 アドレス, ※ 223.255.255.254 = IPv6 を意味する\r
103         UCHAR ipv6_addr[16];                    // IPv6 アドレス\r
104         UINT ipv6_scope_id;                             // IPv6 スコープ ID\r
105 };\r
106 \r
107 // IP 構造体をアドレス部分のみで比較する際のサイズ\r
108 #define SIZE_OF_IP_FOR_ADDR                     (sizeof(UCHAR) * 20)\r
109 \r
110 // IP アドレス部を比較\r
111 #define CmpIpAddr(ip1, ip2)                     (Cmp((ip1), (ip2), SIZE_OF_IP_FOR_ADDR))\r
112 \r
113 // IPv6 アドレス (異形式)\r
114 struct IPV6_ADDR\r
115 {\r
116         UCHAR Value[16];                                // 値\r
117 } GCC_PACKED;\r
118 \r
119 // IPv6アドレスの種類\r
120 #define IPV6_ADDR_UNICAST                                               1       // ユニキャスト\r
121 #define IPV6_ADDR_LOCAL_UNICAST                                 2       // ローカルユニキャスト\r
122 #define IPV6_ADDR_GLOBAL_UNICAST                                4       // グローバルユニキャスト\r
123 #define IPV6_ADDR_MULTICAST                                             8       // マルチキャスト\r
124 #define IPV6_ADDR_ALL_NODE_MULTICAST                    16      // 全ノードマルチキャスト\r
125 #define IPV6_ADDR_ALL_ROUTER_MULTICAST                  32      // 全ルータマルチキャスト\r
126 #define IPV6_ADDR_SOLICIATION_MULTICAST                 64      // 要請ノードマルチキャスト\r
127 #define IPV6_ADDR_ZERO                                                  128     // オールゼロ\r
128 #define IPV6_ADDR_LOOPBACK                                              256     // ループバック\r
129 \r
130 \r
131 // DNS キャッシュリスト\r
132 struct DNSCACHE\r
133 {\r
134         char *HostName;\r
135         IP IpAddress;\r
136 };\r
137 \r
138 // クライアントリスト\r
139 struct IP_CLIENT\r
140 {\r
141         IP IpAddress;                                   // IP アドレス\r
142         UINT NumConnections;                    // 接続個数\r
143 };\r
144 \r
145 // ソケットイベント\r
146 struct SOCK_EVENT\r
147 {\r
148         REF *ref;                                               // 参照カウンタ\r
149 #ifdef  OS_WIN32\r
150         void *hEvent;                                   // Win32 イベントハンドルへのポインタ\r
151 #else   // OS_WIN32\r
152         LIST *SockList;                                 // ソケットリスト\r
153         int pipe_read, pipe_write;              // パイプ\r
154 #endif  // OS_WIN32\r
155 };\r
156 \r
157 // ソケットの種類\r
158 #define SOCK_TCP                                1\r
159 #define SOCK_UDP                                2\r
160 \r
161 // ソケット\r
162 struct SOCK\r
163 {\r
164         REF *ref;                                       // 参照カウンタ\r
165         LOCK *lock;                                     // ロック\r
166         LOCK *ssl_lock;                         // SSL 関係のロック\r
167         LOCK *disconnect_lock;          // 切断用ロック\r
168         SOCKET socket;                          // ソケット番号\r
169         SSL *ssl;                                       // SSL オブジェクト\r
170         UINT Type;                                      // ソケットの種類\r
171         bool Connected;                         // 接続中フラグ\r
172         bool ServerMode;                        // サーバーモード\r
173         bool AsyncMode;                         // 非同期モード\r
174         bool SecureMode;                        // SSL 通信モード\r
175         bool ListenMode;                        // Listen 中\r
176         BUF *SendBuf;                           // 送信バッファ\r
177         IP RemoteIP;                            // リモートホストの IP アドレス\r
178         IP LocalIP;                                     // ローカルホストの IP アドレス\r
179         char *RemoteHostname;           // リモートホスト名\r
180         UINT RemotePort;                        // リモート側のポート番号\r
181         UINT LocalPort;                         // ローカル側のポート番号\r
182         UINT64 SendSize;                        // 送信したデータサイズの合計\r
183         UINT64 RecvSize;                        // 受信したデータサイズの合計\r
184         UINT64 SendNum;                         // 送信したデータブロック数\r
185         UINT64 RecvNum;                         // 受信したデータブロック数\r
186         X *RemoteX;                                     // リモートホストの証明書\r
187         X *LocalX;                                      // ローカルホストの証明書\r
188         char *CipherName;                       // 暗号化アルゴリズム名\r
189         char *WaitToUseCipher;          // 使用したいアルゴリズム名を設定する\r
190         bool IgnoreRecvErr;                     // RecvFrom エラーを無視できるかどうか\r
191         bool IgnoreSendErr;                     // SendTo エラーを無視できるかどうか\r
192         UINT TimeOut;                           // タイムアウト値\r
193         SOCK_EVENT *SockEvent;          // 関連付けられているソケットイベント\r
194         bool CancelAccept;                      // Accept のキャンセルフラグ\r
195         bool WriteBlocked;                      // 前回の書き込みがブロックされた\r
196         bool Disconnecting;                     // 切断しようとしている\r
197         bool UdpBroadcast;                      // UDP ブロードキャストモード\r
198         void *Param;                            // 任意のパラメータ\r
199         bool IPv6;                                      // IPv6\r
200 \r
201 #ifdef  OS_UNIX\r
202         pthread_t CallingThread;        // システムコールを呼び出しているスレッド\r
203 #endif  // OS_UNIX\r
204 \r
205 #ifdef  OS_WIN32\r
206         void *hEvent;                           // 非同期モードの場合のイベント\r
207 #endif  // OS_WIN32\r
208 };\r
209 \r
210 // 戻り値の定数\r
211 #define SOCK_LATER      (0xffffffff)    // ブロッキング中\r
212 \r
213 // ソケットセット\r
214 #define MAX_SOCKSET_NUM         60              // ソケットセットに格納できるソケット数\r
215 struct SOCKSET\r
216 {\r
217         UINT NumSocket;                                 // ソケット数\r
218         SOCK *Sock[MAX_SOCKSET_NUM];    // ソケットへのポインタの配列\r
219 };\r
220 \r
221 // キャンセルオブジェクト\r
222 struct CANCEL\r
223 {\r
224         REF *ref;                                               // 参照カウンタ\r
225         bool SpecialFlag;                               // 特殊フラグ (Win32 ドライバが生成したイベントを関連付ける)\r
226 #ifdef  OS_WIN32\r
227         void *hEvent;                                   // Win32 イベントハンドルへのポインタ\r
228 #else   // OS_WIN32\r
229         int pipe_read, pipe_write;              // パイプ\r
230 #endif  // OS_WIN32\r
231 };\r
232 \r
233 // ルーティングテーブルエントリ\r
234 struct ROUTE_ENTRY\r
235 {\r
236         IP DestIP;\r
237         IP DestMask;\r
238         IP GatewayIP;\r
239         bool LocalRouting;\r
240         bool PPPConnection;\r
241         UINT Metric;\r
242         UINT OldIfMetric;\r
243         UINT InterfaceID;\r
244 };\r
245 \r
246 // ルーティングテーブル\r
247 struct ROUTE_TABLE\r
248 {\r
249         UINT NumEntry;\r
250         UINT HashedValue;\r
251         ROUTE_ENTRY **Entry;\r
252 };\r
253 \r
254 // ホスト名キャッシュリスト\r
255 typedef struct HOSTCACHE\r
256 {\r
257         UINT64 Expires;                                                 // 有効期限\r
258         IP IpAddress;                                                   // IP アドレス\r
259         char HostName[256];                                             // ホスト名\r
260 } HOSTCACHE;\r
261 \r
262 // NETBIOS 名前要求\r
263 typedef struct NBTREQUEST\r
264 {\r
265         USHORT TransactionId;\r
266         USHORT Flags;\r
267         USHORT NumQuestions;\r
268         USHORT AnswerRRs;\r
269         USHORT AuthorityRRs;\r
270         USHORT AdditionalRRs;\r
271         UCHAR Query[38];\r
272 } NBTREQUEST;\r
273 \r
274 // NETBIOS 名前応答\r
275 typedef struct NBTRESPONSE\r
276 {\r
277         USHORT TransactionId;\r
278         USHORT Flags;\r
279         USHORT NumQuestions;\r
280         USHORT AnswerRRs;\r
281         USHORT AuthorityRRs;\r
282         USHORT AdditionalRRs;\r
283         UCHAR Response[61];\r
284 } NBTRESPONSE;\r
285 \r
286 // ソケットリスト\r
287 typedef struct SOCKLIST\r
288 {\r
289         LIST *SockList;\r
290 } SOCKLIST;\r
291 \r
292 \r
293 // Solaris 用タイムアウトスレッドのパラメータ\r
294 typedef struct SOCKET_TIMEOUT_PARAM{\r
295         SOCK *sock;\r
296         CANCEL *cancel;\r
297         THREAD *thread;\r
298         bool unblocked;\r
299 } SOCKET_TIMEOUT_PARAM;\r
300 \r
301 // GetIP 用スレッドのパラメータ\r
302 struct GETIP_THREAD_PARAM\r
303 {\r
304         REF *Ref;\r
305         char HostName[MAX_PATH];\r
306         bool IPv6;\r
307         UINT Timeout;\r
308         IP Ip;\r
309         bool Ok;\r
310 };\r
311 \r
312 // IP アドレスリリース用スレッドのパラメータ\r
313 struct WIN32_RELEASEADDRESS_THREAD_PARAM\r
314 {\r
315         REF *Ref;\r
316         char Guid[MAX_SIZE];\r
317         UINT Timeout;\r
318         bool Ok;\r
319         bool Renew;\r
320 };\r
321 \r
322 // TCP テーブルエントリ\r
323 typedef struct TCPTABLE\r
324 {\r
325         UINT Status;\r
326         IP LocalIP;\r
327         UINT LocalPort;\r
328         IP RemoteIP;\r
329         UINT RemotePort;\r
330         UINT ProcessId;\r
331 } TCPTABLE;\r
332 \r
333 // TCP の状態\r
334 #define TCP_STATE_CLOSED                                1\r
335 #define TCP_STATE_LISTEN                                2\r
336 #define TCP_STATE_SYN_SENT                              3\r
337 #define TCP_STATE_SYN_RCVD                              4\r
338 #define TCP_STATE_ESTAB                                 5\r
339 #define TCP_STATE_FIN_WAIT1                             6\r
340 #define TCP_STATE_FIN_WAIT2                             7\r
341 #define TCP_STATE_CLOSE_WAIT                    8\r
342 #define TCP_STATE_CLOSING                               9\r
343 #define TCP_STATE_LAST_ACK                              10\r
344 #define TCP_STATE_TIME_WAIT                             11\r
345 #define TCP_STATE_DELETE_TCB                    12\r
346 \r
347 // ルーティングテーブル変化通知\r
348 struct ROUTE_CHANGE\r
349 {\r
350         ROUTE_CHANGE_DATA *Data;\r
351 };\r
352 \r
353 \r
354 #ifdef  OS_WIN32\r
355 \r
356 // Win32 用関数プロトタイプ\r
357 void Win32InitSocketLibrary();\r
358 void Win32FreeSocketLibrary();\r
359 void Win32Select(SOCKSET *set, UINT timeout, CANCEL *c1, CANCEL *c2);\r
360 void Win32InitAsyncSocket(SOCK *sock);\r
361 void Win32JoinSockToSockEvent(SOCK *sock, SOCK_EVENT *event);\r
362 void Win32FreeAsyncSocket(SOCK *sock);\r
363 void Win32IpForwardRowToRouteEntry(ROUTE_ENTRY *entry, void *ip_forward_row);\r
364 void Win32RouteEntryToIpForwardRow(void *ip_forward_row, ROUTE_ENTRY *entry);\r
365 int Win32CompareRouteEntryByMetric(void *p1, void *p2);\r
366 ROUTE_TABLE *Win32GetRouteTable();\r
367 bool Win32AddRouteEntry(ROUTE_ENTRY *e, bool *already_exists);\r
368 void Win32DeleteRouteEntry(ROUTE_ENTRY *e);\r
369 void Win32UINTToIP(IP *ip, UINT i);\r
370 UINT Win32IPToUINT(IP *ip);\r
371 UINT Win32GetVLanInterfaceID(char *instance_name);\r
372 char **Win32EnumVLan(char *tag_name);\r
373 void Win32Cancel(CANCEL *c);\r
374 void Win32CleanupCancel(CANCEL *c);\r
375 CANCEL *Win32NewCancel();\r
376 SOCK_EVENT *Win32NewSockEvent();\r
377 void Win32SetSockEvent(SOCK_EVENT *event);\r
378 void Win32CleanupSockEvent(SOCK_EVENT *event);\r
379 bool Win32WaitSockEvent(SOCK_EVENT *event, UINT timeout);\r
380 bool Win32GetDefaultDns(IP *ip, char *domain, UINT size);\r
381 void Win32RenewDhcp();\r
382 void Win32RenewDhcp9x(UINT if_id);\r
383 void Win32ReleaseDhcp9x(UINT if_id, bool wait);\r
384 int CompareIpAdapterIndexMap(void *p1, void *p2);\r
385 LIST *Win32GetTcpTableList();\r
386 LIST *Win32GetTcpTableListByGetExtendedTcpTable();\r
387 LIST *Win32GetTcpTableListByAllocateAndGetTcpExTableFromStack();\r
388 LIST *Win32GetTcpTableListByGetTcpTable();\r
389 ROUTE_CHANGE *Win32NewRouteChange();\r
390 void Win32FreeRouteChange(ROUTE_CHANGE *r);\r
391 bool Win32IsRouteChanged(ROUTE_CHANGE *r);\r
392 bool Win32GetAdapterFromGuid(void *a, char *guid);\r
393 \r
394 bool Win32ReleaseAddress(void *a);\r
395 bool Win32ReleaseAddressByGuid(char *guid);\r
396 bool Win32ReleaseAddressByGuidEx(char *guid, UINT timeout);\r
397 void Win32ReleaseAddressByGuidExThread(THREAD *t, void *param);\r
398 void ReleaseWin32ReleaseAddressByGuidThreadParam(WIN32_RELEASEADDRESS_THREAD_PARAM *p);\r
399 bool Win32ReleaseOrRenewAddressByGuidEx(char *guid, UINT timeout, bool renew);\r
400 bool Win32RenewAddress(void *a);\r
401 bool Win32RenewAddressByGuid(char *guid);\r
402 bool Win32RenewAddressByGuidEx(char *guid, UINT timeout);\r
403 \r
404 \r
405 #else   // OS_WIN32\r
406 \r
407 // UNIX 用関数プロトタイプ\r
408 void UnixInitSocketLibrary();\r
409 void UnixFreeSocketLibrary();\r
410 void UnixSelect(SOCKSET *set, UINT timeout, CANCEL *c1, CANCEL *c2);\r
411 void UnixInitAsyncSocket(SOCK *sock);\r
412 void UnixJoinSockToSockEvent(SOCK *sock, SOCK_EVENT *event);\r
413 void UnixFreeAsyncSocket(SOCK *sock);\r
414 void UnixIpForwardRowToRouteEntry(ROUTE_ENTRY *entry, void *ip_forward_row);\r
415 void UnixRouteEntryToIpForwardRow(void *ip_forward_row, ROUTE_ENTRY *entry);\r
416 int UnixCompareRouteEntryByMetric(void *p1, void *p2);\r
417 ROUTE_TABLE *UnixGetRouteTable();\r
418 bool UnixAddRouteEntry(ROUTE_ENTRY *e, bool *already_exists);\r
419 void UnixDeleteRouteEntry(ROUTE_ENTRY *e);\r
420 UINT UnixGetVLanInterfaceID(char *instance_name);\r
421 char **UnixEnumVLan(char *tag_name);\r
422 void UnixCancel(CANCEL *c);\r
423 void UnixCleanupCancel(CANCEL *c);\r
424 CANCEL *UnixNewCancel();\r
425 SOCK_EVENT *UnixNewSockEvent();\r
426 void UnixSetSockEvent(SOCK_EVENT *event);\r
427 void UnixCleanupSockEvent(SOCK_EVENT *event);\r
428 bool UnixWaitSockEvent(SOCK_EVENT *event, UINT timeout);\r
429 bool UnixGetDefaultDns(IP *ip);\r
430 void UnixRenewDhcp();\r
431 void UnixNewPipe(int *pipe_read, int *pipe_write);\r
432 void UnixWritePipe(int pipe_write);\r
433 void UnixDeletePipe(int p1, int p2);\r
434 void UnixSelectInner(UINT num_read, UINT *reads, UINT num_write, UINT *writes, UINT timeout);\r
435 void UnixSetSocketNonBlockingMode(int fd, bool nonblock);\r
436 \r
437 #endif  // OS_WIN32\r
438 \r
439 // 関数プロトタイプ\r
440 void InitNetwork();\r
441 void FreeNetwork();\r
442 void InitDnsCache();\r
443 void FreeDnsCache();\r
444 void LockDnsCache();\r
445 void UnlockDnsCache();\r
446 int CompareDnsCache(void *p1, void *p2);\r
447 void GenDnsCacheKeyName(char *dst, UINT size, char *src, bool ipv6);\r
448 void NewDnsCacheEx(char *hostname, IP *ip, bool ipv6);\r
449 DNSCACHE *FindDnsCacheEx(char *hostname, bool ipv6);\r
450 bool QueryDnsCacheEx(IP *ip, char *hostname, bool ipv6);\r
451 void NewDnsCache(char *hostname, IP *ip);\r
452 DNSCACHE *FindDnsCache(char *hostname);\r
453 bool QueryDnsCache(IP *ip, char *hostname);\r
454 void InAddrToIP(IP *ip, struct in_addr *addr);\r
455 void InAddrToIP6(IP *ip, struct in6_addr *addr);\r
456 void IPToInAddr(struct in_addr *addr, IP *ip);\r
457 void IPToInAddr6(struct in6_addr *addr, IP *ip);\r
458 bool StrToIP(IP *ip, char *str);\r
459 UINT StrToIP32(char *str);\r
460 bool UniStrToIP(IP *ip, wchar_t *str);\r
461 UINT UniStrToIP32(wchar_t *str);\r
462 void IPToStr(char *str, UINT size, IP *ip);\r
463 void IPToStr4(char *str, UINT size, IP *ip);\r
464 void IPToStr32(char *str, UINT size, UINT ip);\r
465 void IPToStr128(char *str, UINT size, UCHAR *ip_bytes);\r
466 void IPToStr4or6(char *str, UINT size, UINT ip_4_uint, UCHAR *ip_6_bytes);\r
467 void IPToUniStr(wchar_t *str, UINT size, IP *ip);\r
468 void IPToUniStr32(wchar_t *str, UINT size, UINT ip);\r
469 bool GetIPEx(IP *ip, char *hostname, bool ipv6);\r
470 bool GetIP46(IP *ip4, IP *ip6, char *hostname);\r
471 bool GetIP46Ex(IP *ip4, IP *ip6, char *hostname, UINT timeout, bool *cancel);\r
472 bool GetIP46Any4(IP *ip, char *hostname);\r
473 bool GetIP46Any6(IP *ip, char *hostname);\r
474 bool GetIP(IP *ip, char *hostname);\r
475 bool GetIP4(IP *ip, char *hostname);\r
476 bool GetIP6(IP *ip, char *hostname);\r
477 bool GetIP4Ex(IP *ip, char *hostname, UINT timeout, bool *cancel);\r
478 bool GetIP6Ex(IP *ip, char *hostname, UINT timeout, bool *cancel);\r
479 bool GetIP4Ex6Ex(IP *ip, char *hostname, UINT timeout, bool ipv6, bool *cancel);\r
480 void GetIP4Ex6ExThread(THREAD *t, void *param);\r
481 void ReleaseGetIPThreadParam(GETIP_THREAD_PARAM *p);\r
482 void CleanupGetIPThreadParam(GETIP_THREAD_PARAM *p);\r
483 bool GetIP4Inner(IP *ip, char *hostname);\r
484 bool GetIP6Inner(IP *ip, char *hostname);\r
485 bool GetHostNameInner(char *hostname, UINT size, IP *ip);\r
486 bool GetHostNameInner6(char *hostname, UINT size, IP *ip);\r
487 bool GetHostName(char *hostname, UINT size, IP *ip);\r
488 void GetHostNameThread(THREAD *t, void *p);\r
489 void GetMachineName(char *name, UINT size);\r
490 void GetMachineNameEx(char *name, UINT size, bool no_load_hosts);\r
491 bool GetMachineNameFromHosts(char *name, UINT size);\r
492 void GetMachineIp(IP *ip);\r
493 void GetMachineHostName(char *name, UINT size);\r
494 void UINTToIP(IP *ip, UINT value);\r
495 UINT IPToUINT(IP *ip);\r
496 SOCK *NewSock();\r
497 void ReleaseSock(SOCK *s);\r
498 void CleanupSock(SOCK *s);\r
499 SOCK *Connect(char *hostname, UINT port);\r
500 SOCK *ConnectEx(char *hostname, UINT port, UINT timeout);\r
501 SOCK *ConnectEx2(char *hostname, UINT port, UINT timeout, bool *cancel_flag);\r
502 void SetSocketSendRecvBufferSize(int s, UINT size);\r
503 void QuerySocketInformation(SOCK *sock);\r
504 void Disconnect(SOCK *sock);\r
505 SOCK *Listen(UINT port);\r
506 SOCK *ListenEx(UINT port, bool local_only);\r
507 SOCK *Listen6(UINT port);\r
508 SOCK *ListenEx6(UINT port, bool local_only);\r
509 SOCK *Accept(SOCK *sock);\r
510 SOCK *Accept6(SOCK *sock);\r
511 UINT Send(SOCK *sock, void *data, UINT size, bool secure);\r
512 UINT Recv(SOCK *sock, void *data, UINT size, bool secure);\r
513 UINT SecureSend(SOCK *sock, void *data, UINT size);\r
514 UINT SecureRecv(SOCK *sock, void *data, UINT size);\r
515 bool StartSSL(SOCK *sock, X *x, K *priv);\r
516 bool StartSSLEx(SOCK *sock, X *x, K *priv, bool client_tls);\r
517 bool SendAll(SOCK *sock, void *data, UINT size, bool secure);\r
518 void SendAdd(SOCK *sock, void *data, UINT size);\r
519 bool SendNow(SOCK *sock, int secure);\r
520 bool RecvAll(SOCK *sock, void *data, UINT size, bool secure);\r
521 void InitSockSet(SOCKSET *set);\r
522 void AddSockSet(SOCKSET *set, SOCK *sock);\r
523 CANCEL *NewCancel();\r
524 CANCEL *NewCancelSpecial(void *hEvent);\r
525 void ReleaseCancel(CANCEL *c);\r
526 void CleanupCancel(CANCEL *c);\r
527 void Cancel(CANCEL *c);\r
528 void Select(SOCKSET *set, UINT timeout, CANCEL *c1, CANCEL *c2);\r
529 void SetWantToUseCipher(SOCK *sock, char *name);\r
530 SOCK *NewUDP(UINT port);\r
531 SOCK *NewUDPEx(UINT port, bool ipv6);\r
532 SOCK *NewUDP4(UINT port);\r
533 SOCK *NewUDP6(UINT port);\r
534 UINT SendTo(SOCK *sock, IP *dest_addr, UINT dest_port, void *data, UINT size);\r
535 UINT SendTo6(SOCK *sock, IP *dest_addr, UINT dest_port, void *data, UINT size);\r
536 UINT RecvFrom(SOCK *sock, IP *src_addr, UINT *src_port, void *data, UINT size);\r
537 UINT RecvFrom6(SOCK *sock, IP *src_addr, UINT *src_port, void *data, UINT size);\r
538 void SetTimeout(SOCK *sock, UINT timeout);\r
539 UINT GetTimeout(SOCK *sock);\r
540 void LockOpenSSL();\r
541 void UnlockOpenSSL();\r
542 bool CheckTCPPort(char *hostname, UINT port);\r
543 bool CheckTCPPortEx(char *hostname, UINT port, UINT timeout);\r
544 void CheckTCPPortThread(THREAD *thread, void *param);\r
545 ROUTE_TABLE *GetRouteTable();\r
546 void FreeRouteTable(ROUTE_TABLE *t);\r
547 bool AddRouteEntryEx(ROUTE_ENTRY *e, bool *already_exists);\r
548 bool AddRouteEntry(ROUTE_ENTRY *e);\r
549 void DeleteRouteEntry(ROUTE_ENTRY *e);\r
550 char **EnumVLan(char *tag_name);\r
551 void FreeEnumVLan(char **s);\r
552 UINT GetVLanInterfaceID(char *tag_name);\r
553 ROUTE_ENTRY *GetBestRouteEntry(IP *ip);\r
554 ROUTE_ENTRY *GetBestRouteEntryEx(IP *ip, UINT exclude_if_id);\r
555 ROUTE_ENTRY *GetBestRouteEntryFromRouteTable(ROUTE_TABLE *table, IP *ip);\r
556 ROUTE_ENTRY *GetBestRouteEntryFromRouteTableEx(ROUTE_TABLE *table, IP *ip, UINT exclude_if_id);\r
557 void FreeRouteEntry(ROUTE_ENTRY *e);\r
558 void JoinSockToSockEvent(SOCK *sock, SOCK_EVENT *event);\r
559 SOCK_EVENT *NewSockEvent();\r
560 void SetSockEvent(SOCK_EVENT *event);\r
561 void CleanupSockEvent(SOCK_EVENT *event);\r
562 bool WaitSockEvent(SOCK_EVENT *event, UINT timeout);\r
563 void ReleaseSockEvent(SOCK_EVENT *event);\r
564 void SetIP(IP *ip, UCHAR a1, UCHAR a2, UCHAR a3, UCHAR a4);\r
565 bool GetDefaultDns(IP *ip);\r
566 bool GetDomainName(char *name, UINT size);\r
567 bool UnixGetDomainName(char *name, UINT size);\r
568 void RenewDhcp();\r
569 void AcceptInit(SOCK *s);\r
570 bool CheckCipherListName(char *name);\r
571 TOKEN_LIST *GetCipherList();\r
572 COUNTER *GetNumTcpConnectionsCounter();\r
573 void InitWaitThread();\r
574 void FreeWaitThread();\r
575 void AddWaitThread(THREAD *t);\r
576 void DelWaitThread(THREAD *t);\r
577 void InitHostCache();\r
578 void FreeHostCache();\r
579 int CompareHostCache(void *p1, void *p2);\r
580 void AddHostCache(IP *ip, char *hostname);\r
581 bool GetHostCache(char *hostname, UINT size, IP *ip);\r
582 bool IsSubnetMask(IP *ip);\r
583 bool IsSubnetMask4(IP *ip);\r
584 bool IsSubnetMask32(UINT ip);\r
585 bool IsNetworkAddress(IP *ip, IP *mask);\r
586 bool IsNetworkAddress4(IP *ip, IP *mask);\r
587 bool IsNetworkAddress32(UINT ip, UINT mask);\r
588 bool IsHostIPAddress4(IP *ip);\r
589 bool IsHostIPAddress32(UINT ip);\r
590 bool IsZeroIp(IP *ip);\r
591 bool IsZeroIP(IP *ip);\r
592 bool IsZeroIP6Addr(IPV6_ADDR *addr);\r
593 UINT IntToSubnetMask32(UINT i);\r
594 void IntToSubnetMask4(IP *ip, UINT i);\r
595 bool GetNetBiosName(char *name, UINT size, IP *ip);\r
596 bool NormalizeMacAddress(char *dst, UINT size, char *src);\r
597 SOCKLIST *NewSockList();\r
598 void AddSockList(SOCKLIST *sl, SOCK *s);\r
599 void DelSockList(SOCKLIST *sl, SOCK *s);\r
600 void StopSockList(SOCKLIST *sl);\r
601 void FreeSockList(SOCKLIST *sl);\r
602 bool IsIPv6Supported();\r
603 void SetSockPriorityHigh(SOCK *s);\r
604 void InitIpClientList();\r
605 void FreeIpClientList();\r
606 int CompareIpClientList(void *p1, void *p2);\r
607 void AddIpClient(IP *ip);\r
608 void DelIpClient(IP *ip);\r
609 IP_CLIENT *SearchIpClient(IP *ip);\r
610 UINT GetNumIpClient(IP *ip);\r
611 void SetLinuxArpFilter();\r
612 LIST *GetTcpTableList();\r
613 void FreeTcpTableList(LIST *o);\r
614 int CompareTcpTable(void *p1, void *p2);\r
615 void PrintTcpTableList(LIST *o);\r
616 TCPTABLE *GetTcpTableFromEndPoint(LIST *o, IP *local_ip, UINT local_port, IP *remote_ip, UINT remote_port);\r
617 UINT GetTcpProcessIdFromSocket(SOCK *s);\r
618 UINT GetTcpProcessIdFromSocketReverse(SOCK *s);\r
619 bool CanGetTcpProcessId();\r
620 int connect_timeout(SOCKET s, struct sockaddr *addr, int size, int timeout, bool *cancel_flag);\r
621 void EnableNetworkNameCache();\r
622 void DisableNetworkNameCache();\r
623 bool IsNetworkNameCacheEnabled();\r
624 ROUTE_CHANGE *NewRouteChange();\r
625 void FreeRouteChange(ROUTE_CHANGE *r);\r
626 bool IsRouteChanged(ROUTE_CHANGE *r);\r
627 void RouteToStr(char *str, UINT str_size, ROUTE_ENTRY *e);\r
628 void DebugPrintRoute(ROUTE_ENTRY *e);\r
629 void DebugPrintRouteTable(ROUTE_TABLE *r);\r
630 \r
631 void SocketTimeoutThread(THREAD *t, void *param);\r
632 SOCKET_TIMEOUT_PARAM *NewSocketTimeout(SOCK *sock);\r
633 void FreeSocketTimeout(SOCKET_TIMEOUT_PARAM *ttp);\r
634 \r
635 bool CheckSubnetLength6(UINT i);\r
636 bool IsIP6(IP *ip);\r
637 bool IsIP4(IP *ip);\r
638 void IPv6AddrToIP(IP *ip, IPV6_ADDR *addr);\r
639 bool IPToIPv6Addr(IPV6_ADDR *addr, IP *ip);\r
640 void SetIP6(IP *ip, UCHAR *value);\r
641 void GetLocalHostIP6(IP *ip);\r
642 void ZeroIP6(IP *ip);\r
643 void ZeroIP4(IP *ip);\r
644 bool CheckIPItemStr6(char *str);\r
645 void IPItemStrToChars6(UCHAR *chars, char *str);\r
646 bool StrToIP6(IP *ip, char *str);\r
647 bool StrToIP6Addr(IPV6_ADDR *ip, char *str);\r
648 void IPToStr6(char *str, UINT size, IP *ip);\r
649 void IP6AddrToStr(char *str, UINT size, IPV6_ADDR *addr);\r
650 void IPToStr6Array(char *str, UINT size, UCHAR *bytes);\r
651 void IPToStr6Inner(char *str, IP *ip);\r
652 void IntToSubnetMask6(IP *ip, UINT i);\r
653 void IPNot6(IP *dst, IP *a);\r
654 void IPOr6(IP *dst, IP *a, IP *b);\r
655 void IPAnd6(IP *dst, IP *a, IP *b);\r
656 void GetAllRouterMulticastAddress6(IP *ip);\r
657 void GetAllNodeMulticaseAddress6(IP *ip);\r
658 void GetLoopbackAddress6(IP *ip);\r
659 void GetAllFilledAddress6(IP *ip);\r
660 UINT GetIPAddrType6(IP *ip);\r
661 UINT GetIPv6AddrType(IPV6_ADDR *addr);\r
662 void GenerateMulticastMacAddress6(UCHAR *mac, IP *ip);\r
663 void GetSoliciationMulticastAddr6(IP *dst, IP *src);\r
664 bool CheckUnicastAddress(IP *ip);\r
665 bool IsNetworkPrefixAddress6(IP *ip, IP *subnet);\r
666 bool IsNetworkAddress6(IP *ip, IP *subnet);\r
667 void GetHostAddress6(IP *dst, IP *ip, IP *subnet);\r
668 void GetPrefixAddress6(IP *dst, IP *ip, IP *subnet);\r
669 bool IsNetworkPrefixAddress6(IP *ip, IP *subnet);\r
670 bool IsInSameNetwork6(IP *a1, IP *a2, IP *subnet);\r
671 void GenerateEui64Address6(UCHAR *dst, UCHAR *mac);\r
672 void GenerateEui64LocalAddress(IP *a, UCHAR *mac);\r
673 void GenerateEui64GlobalAddress(IP *ip, IP *prefix, IP *subnet, UCHAR *mac);\r
674 bool IsSubnetMask6(IP *a);\r
675 UINT SubnetMaskToInt(IP *a);\r
676 UINT SubnetMaskToInt6(IP *a);\r
677 UINT SubnetMaskToInt4(IP *a);\r
678 bool IsStrIPv6Address(char *str);\r
679 \r
680 bool ParseIpAndSubnetMask4(char *src, UINT *ip, UINT *mask);\r
681 bool ParseIpAndSubnetMask6(char *src, IP *ip, IP *mask);\r
682 bool ParseIpAndSubnetMask46(char *src, IP *ip, IP *mask);\r
683 bool ParseIpAndMask4(char *src, UINT *ip, UINT *mask);\r
684 bool ParseIpAndMask6(char *src, IP *ip, IP *mask);\r
685 bool ParseIpAndMask46(char *src, IP *ip, IP *mask);\r
686 bool IsIpStr4(char *str);\r
687 bool IsIpStr6(char *str);\r
688 bool IsIpMask6(char *str);\r
689 bool IsIpStr46(char *str);\r
690 bool StrToMask4(IP *mask, char *str);\r
691 bool StrToMask6(IP *mask, char *str);\r
692 bool StrToMask6Addr(IPV6_ADDR *mask, char *str);\r
693 bool StrToMask46(IP *mask, char *str, bool ipv6);\r
694 void MaskToStr(char *str, UINT size, IP *mask);\r
695 void Mask6AddrToStrEx(char *str, UINT size, IPV6_ADDR *mask, bool always_full_address);\r
696 void Mask6AddrToStr(char *str, UINT size, IPV6_ADDR *mask);\r
697 void MaskToStr32(char *str, UINT size, UINT mask);\r
698 void MaskToStr32Ex(char *str, UINT size, UINT mask, bool always_full_address);\r
699 void MaskToStrEx(char *str, UINT size, IP *mask, bool always_full_address);\r
700 \r
701 \r
702 #endif  // NETWORK_H\r
703 \r