1 // SoftEther UT-VPN SourceCode
\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
8 // http://utvpn.tsukuba.ac.jp/
\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
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
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
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。
\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布
\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示
\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の
\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。
\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
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、
\r
34 // および、試験または研究のために利用が行われることを想定して配布
\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に
\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード
\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して
\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して
\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース
\r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する
\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。
\r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社
\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。
\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの
\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意
\r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の
\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、
\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの
\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社
\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、
\r
58 // 公益保護にご協力いただきますようお願い申し上げます。
\r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を
\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客
\r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/
\r
65 // 日本国内の脆弱性情報届出受付公的機関:
\r
67 // http://www.ipa.go.jp/security/vuln/report/
\r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。
\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/
\r
72 // -----------------------------------------------
\r
75 // 新規リリース by SoftEther
\r
76 // -----------------------------------------------
\r
84 #define TIMEOUT_GETIP 2300
\r
86 #define TIMEOUT_INFINITE (0x7fffffff)
\r
87 #define TIMEOUT_TCP_PORT_CHECK (10 * 1000)
\r
88 #define TIMEOUT_SSL_CONNECT (15 * 1000)
\r
90 #define TIMEOUT_HOSTNAME (500)
\r
91 #define TIMEOUT_NETBIOS_HOSTNAME (100)
\r
92 #define EXPIRES_HOSTNAME (10 * 60 * 1000)
\r
94 #define SOCKET_BUFFER_SIZE 0x10000000
\r
96 #define IPV6_DUMMY_FOR_IPV4 0xFEFFFFDF
\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
107 // IP 構造体をアドレス部分のみで比較する際のサイズ
\r
108 #define SIZE_OF_IP_FOR_ADDR (sizeof(UCHAR) * 20)
\r
111 #define CmpIpAddr(ip1, ip2) (Cmp((ip1), (ip2), SIZE_OF_IP_FOR_ADDR))
\r
116 UCHAR Value[16]; // 値
\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
141 IP IpAddress; // IP アドレス
\r
142 UINT NumConnections; // 接続個数
\r
148 REF *ref; // 参照カウンタ
\r
150 void *hEvent; // Win32 イベントハンドルへのポインタ
\r
152 LIST *SockList; // ソケットリスト
\r
153 int pipe_read, pipe_write; // パイプ
\r
164 REF *ref; // 参照カウンタ
\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
202 pthread_t CallingThread; // システムコールを呼び出しているスレッド
\r
206 void *hEvent; // 非同期モードの場合のイベント
\r
211 #define SOCK_LATER (0xffffffff) // ブロッキング中
\r
214 #define MAX_SOCKSET_NUM 60 // ソケットセットに格納できるソケット数
\r
217 UINT NumSocket; // ソケット数
\r
218 SOCK *Sock[MAX_SOCKSET_NUM]; // ソケットへのポインタの配列
\r
224 REF *ref; // 参照カウンタ
\r
225 bool SpecialFlag; // 特殊フラグ (Win32 ドライバが生成したイベントを関連付ける)
\r
227 void *hEvent; // Win32 イベントハンドルへのポインタ
\r
229 int pipe_read, pipe_write; // パイプ
\r
240 bool PPPConnection;
\r
251 ROUTE_ENTRY **Entry;
\r
255 typedef struct HOSTCACHE
\r
257 UINT64 Expires; // 有効期限
\r
258 IP IpAddress; // IP アドレス
\r
259 char HostName[256]; // ホスト名
\r
263 typedef struct NBTREQUEST
\r
265 USHORT TransactionId;
\r
267 USHORT NumQuestions;
\r
269 USHORT AuthorityRRs;
\r
270 USHORT AdditionalRRs;
\r
275 typedef struct NBTRESPONSE
\r
277 USHORT TransactionId;
\r
279 USHORT NumQuestions;
\r
281 USHORT AuthorityRRs;
\r
282 USHORT AdditionalRRs;
\r
283 UCHAR Response[61];
\r
287 typedef struct SOCKLIST
\r
293 // Solaris 用タイムアウトスレッドのパラメータ
\r
294 typedef struct SOCKET_TIMEOUT_PARAM{
\r
299 } SOCKET_TIMEOUT_PARAM;
\r
301 // GetIP 用スレッドのパラメータ
\r
302 struct GETIP_THREAD_PARAM
\r
305 char HostName[MAX_PATH];
\r
312 // IP アドレスリリース用スレッドのパラメータ
\r
313 struct WIN32_RELEASEADDRESS_THREAD_PARAM
\r
316 char Guid[MAX_SIZE];
\r
323 typedef struct TCPTABLE
\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
348 struct ROUTE_CHANGE
\r
350 ROUTE_CHANGE_DATA *Data;
\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
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
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
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
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
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
631 void SocketTimeoutThread(THREAD *t, void *param);
\r
632 SOCKET_TIMEOUT_PARAM *NewSocketTimeout(SOCK *sock);
\r
633 void FreeSocketTimeout(SOCKET_TIMEOUT_PARAM *ttp);
\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
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
702 #endif // NETWORK_H
\r