source: lab.git/Dev/utvpn/utvpn-unix-v101-7101-public/src/Mayaqua/Network.h @ a1bae3e

trunk
Last change on this file since a1bae3e was a1bae3e, checked in by mitty <mitty@…>, 12 years ago
  • copy vendor drop to trunk

git-svn-id: https://lab.mitty.jp/svn/lab/trunk@147 7d2118f6-f56c-43e7-95a2-4bb3031d96e7

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