* copy vendor drop to trunk
[lab.git] / Dev / utvpn / utvpn-unix-v101-7101-public / src / Cedar / Virtual.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 // Virtual.h\r
79 // Virtual.c のヘッダ\r
80 \r
81 #ifndef VIRTUAL_H\r
82 #define VIRTUAL_H\r
83 \r
84 \r
85 // ARP エントリ\r
86 struct ARP_ENTRY\r
87 {\r
88         UINT IpAddress;                                 // IP アドレス\r
89         UCHAR MacAddress[6];                    // MAC アドレス\r
90         UCHAR Padding[2];\r
91         UINT64 Created;                                 // 作成日時\r
92         UINT64 Expire;                                  // 有効期限\r
93 };\r
94 \r
95 // ARP 待機リスト\r
96 struct ARP_WAIT\r
97 {\r
98         UINT IpAddress;                                 // 解決しようとしている IP アドレス\r
99         UINT NextTimeoutTimeValue;              // 次にタイムアウトするまでの時間\r
100         UINT64 TimeoutTime;                             // 現在の送信のタイムアウト時刻\r
101         UINT64 GiveupTime;                              // 送信を諦める時刻\r
102 };\r
103 \r
104 // IP 待機リスト\r
105 struct IP_WAIT\r
106 {\r
107         UINT DestIP;                                    // 宛先 IP アドレス\r
108         UINT SrcIP;                                             // 送信元 IP アドレス\r
109         UINT64 Expire;                                  // 保管期限\r
110         void *Data;                                             // データ\r
111         UINT Size;                                              // サイズ\r
112 };\r
113 \r
114 // IP 部分リスト\r
115 struct IP_PART\r
116 {\r
117         UINT Offset;                                    // オフセット\r
118         UINT Size;                                              // サイズ\r
119 };\r
120 \r
121 // IP 復元リスト\r
122 struct IP_COMBINE\r
123 {\r
124         UINT DestIP;                                    // 宛先 IP アドレス\r
125         UINT SrcIP;                                             // 送信元 IP アドレス\r
126         USHORT Id;                                              // IP パケット ID\r
127         UINT64 Expire;                                  // 保管期限\r
128         void *Data;                                             // パケットデータ\r
129         UINT DataReserved;                              // データ用に確保された領域\r
130         UINT Size;                                              // パケットサイズ (トータル)\r
131         LIST *IpParts;                                  // IP 部分リスト\r
132         UCHAR Protocol;                                 // プロトコル番号\r
133         bool MacBroadcast;                              // MAC レベルでのブロードキャストパケット\r
134 };\r
135 \r
136 #define IP_COMBINE_INITIAL_BUF_SIZE             (MAX_IP_DATA_SIZE)              // 初期バッファサイズ\r
137 \r
138 // NAT セッションテーブル\r
139 struct NAT_ENTRY\r
140 {\r
141         // TCP | UDP 共通項目\r
142         struct VH *v;                                   // 仮想マシン\r
143         UINT Id;                                                // ID\r
144         LOCK *lock;                                             // ロック\r
145         UINT Protocol;                                  // プロトコル\r
146         UINT SrcIp;                                             // 接続元 IP アドレス\r
147         UINT SrcPort;                                   // 接続元ポート番号\r
148         UINT DestIp;                                    // 接続先 IP アドレス\r
149         UINT DestPort;                                  // 接続先ポート番号\r
150         UINT PublicIp;                                  // 公衆 IP アドレス\r
151         UINT PublicPort;                                // 公衆ポート番号\r
152         UINT64 CreatedTime;                             // 接続時刻\r
153         UINT64 LastCommTime;                    // 最終通信時刻\r
154         SOCK *Sock;                                             // ソケット\r
155         bool DisconnectNow;                             // すぐに停止せよフラグ\r
156         UINT tag1;\r
157         bool ProxyDns;                                  // プロキシ DNS\r
158         UINT DestIpProxy;                               // プロキシ DNS アドレス\r
159 \r
160         // DNS NAT 項目\r
161         THREAD *DnsThread;                              // DNS 問い合わせ用スレッド\r
162         bool DnsGetIpFromHost;                  // 逆引きフラグ\r
163         char *DnsTargetHostName;                // ターゲットホスト名\r
164         IP DnsResponseIp;                               // 応答 IP アドレス\r
165         char *DnsResponseHostName;              // 応答ホスト名\r
166         UINT DnsTransactionId;                  // DNS トランザクション ID\r
167         bool DnsFinished;                               // DNS 問い合わせ完了フラグ\r
168         bool DnsOk;                                             // DNS 成功フラグ\r
169         bool DnsPollingFlag;                    // DNS ポーリング完了フラグ\r
170 \r
171         // UDP 項目\r
172         QUEUE *UdpSendQueue;                    // UDP 送信キュー\r
173         QUEUE *UdpRecvQueue;                    // UDP 受信キュー\r
174         bool UdpSocketCreated;                  // UDP のソケットが作成されたかどうか\r
175 \r
176         // TCP 項目\r
177         FIFO *SendFifo;                                 // 送信 FIFO\r
178         FIFO *RecvFifo;                                 // 受信 FIFO\r
179         UINT TcpStatus;                                 // TCP 状態\r
180         THREAD *NatTcpConnectThread;    // TCP ソケット接続スレッド\r
181         bool TcpMakeConnectionFailed;   // 接続スレッドによる接続に失敗した\r
182         bool TcpMakeConnectionSucceed;  // 接続スレッドによる接続に成功した\r
183         UINT TcpSendMaxSegmentSize;             // 最大送信セグメントサイズ\r
184         UINT TcpRecvMaxSegmentSize;             // 最大受信セグメントサイズ\r
185         UINT64 LastSynAckSentTime;              // 最後に SYN + ACK を送信した時刻\r
186         UINT SynAckSentCount;                   // SYN + ACK 送信回数\r
187         UINT TcpSendWindowSize;                 // 送信ウインドウサイズ\r
188         UINT TcpSendCWnd;                               // 送信用輻輳ウインドウサイズ (/mss)\r
189         UINT TcpRecvWindowSize;                 // 受信ウインドウサイズ\r
190         UINT TcpSendTimeoutSpan;                // 送信タイムアウト時間\r
191         UINT64 TcpLastSentTime;                 // TCP で最後に送信を行った時刻\r
192         UINT64 LastSentKeepAliveTime;   // 最後にキープアライブ ACK を送信した時刻\r
193         FIFO *TcpRecvWindow;                    // TCP 受信ウインドウ\r
194         LIST *TcpRecvList;                              // TCP 受信リスト\r
195         bool SendAckNext;                               // 次の送信時に ACK を送信する\r
196         UINT LastSentWindowSize;                // 最後に送信した自分のウインドウサイズ\r
197 \r
198         UINT64 SendSeqInit;                             // 初期送信シーケンス番号\r
199         UINT64 SendSeq;                                 // 送信シーケンス番号\r
200         UINT64 RecvSeqInit;                             // 初期受信シーケンス番号\r
201         UINT64 RecvSeq;                                 // 受信シーケンス番号\r
202 \r
203         bool CurrentSendingMission;             // バースト送信実施中\r
204         UINT SendMissionSize;                   // 今回の送信サイズ\r
205         bool RetransmissionUsedFlag;    // 再送信使用記録フラグ\r
206 \r
207         UINT CurrentRTT;                                // 現在の RTT 値\r
208         UINT64 CalcRTTStartTime;                // RTT 測定開始時刻\r
209         UINT64 CalcRTTStartValue;               // RTT 測定開始値\r
210 \r
211         bool TcpFinished;                               // TCP のデータ通信終了フラグ\r
212         UINT64 FinSentTime;                             // 最後に FIN を送信した時刻\r
213         UINT FinSentCount;                              // FIN 送信回数\r
214 };\r
215 \r
216 \r
217 // TCP オプション\r
218 struct TCP_OPTION\r
219 {\r
220         UINT MaxSegmentSize;                    // 最大セグメントサイズ\r
221         UINT WindowScaling;                             // ウインドウスケーリング\r
222 };\r
223 \r
224 // 仮想ホスト構造体\r
225 struct VH\r
226 {\r
227         REF *ref;                                               // 参照カウンタ\r
228         LOCK *lock;                                             // ロック\r
229         SESSION *Session;                               // セッション\r
230         CANCEL *Cancel;                                 // キャンセルオブジェクト\r
231         QUEUE *SendQueue;                               // 送信キュー\r
232         bool Active;                                    // アクティブフラグ\r
233         volatile bool HaltNat;                  // NAT 停止フラグ\r
234         LIST *ArpTable;                                 // ARP テーブル\r
235         LIST *ArpWaitTable;                             // ARP 待ちテーブル\r
236         LIST *IpWaitTable;                              // IP 待ちテーブル\r
237         LIST *IpCombine;                                // IP 結合テーブル\r
238         UINT64 Now;                                             // 現在時刻\r
239         UINT64 NextArpTablePolling;             // 次に ARP テーブルをポーリングする時刻\r
240         UINT Mtu;                                               // MTU 値\r
241         UINT IpMss;                                             // IP 最大データサイズ\r
242         UINT TcpMss;                                    // TCP 最大データサイズ\r
243         UINT UdpMss;                                    // UDP 最大データサイズ\r
244         bool flag1;                                             // フラグ 1\r
245         bool flag2;                                             // フラグ 2\r
246         USHORT NextId;                                  // IP パケットの ID\r
247         UINT CurrentIpQuota;                    // IP パケットメモリクォータ\r
248         LIST *NatTable;                                 // NAT テーブル\r
249         SOCK_EVENT *SockEvent;                  // ソケットイベント\r
250         THREAD *NatThread;                              // NAT 用スレッド\r
251         void *TmpBuf;                                   // 一時的に使用できるバッファ\r
252         bool NatDoCancelFlag;                   // キャンセルを叩くかどうかのフラグ\r
253         UCHAR MacAddress[6];                    // MAC アドレス\r
254         UCHAR Padding[2];\r
255         UINT HostIP;                                    // ホスト IP\r
256         UINT HostMask;                                  // ホストサブネットマスク\r
257         UINT NatTcpTimeout;                             // NAT TCP タイムアウト秒数\r
258         UINT NatUdpTimeout;                             // NAT UDP タイムアウト秒数\r
259         bool UseNat;                                    // NAT 使用フラグ\r
260         bool UseDhcp;                                   // DHCP 使用フラグ\r
261         UINT DhcpIpStart;                               // 配布開始アドレス\r
262         UINT DhcpIpEnd;                                 // 配布終了アドレス\r
263         UINT DhcpMask;                                  // サブネットマスク\r
264         UINT DhcpExpire;                                // アドレス配布有効期限\r
265         UINT DhcpGateway;                               // ゲートウェイアドレス\r
266         UINT DhcpDns;                                   // DNS サーバーアドレス\r
267         char DhcpDomain[MAX_HOST_NAME_LEN + 1]; // 割り当てドメイン名\r
268         LIST *DhcpLeaseList;                    // DHCP リースリスト\r
269         UINT64 LastDhcpPolling;                 // 最後に DHCP リストをポーリングした時刻\r
270         bool SaveLog;                                   // ログの保存\r
271         COUNTER *Counter;                               // セッションカウンタ\r
272         UINT DhcpId;                                    // DHCP ID\r
273         UINT64 LastSendBeacon;                  // 最後にビーコンを発信した時刻\r
274         LOG *Logger;                                    // ロガー\r
275         NAT *nat;                                               // NAT オブジェクトへの参照\r
276 };\r
277 \r
278 // 仮想ホストオプション\r
279 struct VH_OPTION\r
280 {\r
281         char HubName[MAX_HUBNAME_LEN + 1];      // 操作対象の仮想 HUB 名\r
282         UCHAR MacAddress[6];                    // MAC アドレス\r
283         UCHAR Padding[2];\r
284         IP Ip;                                                  // IP アドレス\r
285         IP Mask;                                                // サブネットマスク\r
286         bool UseNat;                                    // NAT 機能の使用フラグ\r
287         UINT Mtu;                                               // MTU 値\r
288         UINT NatTcpTimeout;                             // NAT TCP タイムアウト秒数\r
289         UINT NatUdpTimeout;                             // NAT UDP タイムアウト秒数\r
290         bool UseDhcp;                                   // DHCP 機能の使用フラグ\r
291         IP DhcpLeaseIPStart;                    // DHCP 配布 IP 開始アドレス\r
292         IP DhcpLeaseIPEnd;                              // DHCP 配布 IP 終了アドレス\r
293         IP DhcpSubnetMask;                              // DHCP サブネットマスク\r
294         UINT DhcpExpireTimeSpan;                // DHCP 有効期限\r
295         IP DhcpGatewayAddress;                  // 割り当てゲートウェイアドレス\r
296         IP DhcpDnsServerAddress;                // 割り当て DNS サーバーアドレス\r
297         char DhcpDomainName[MAX_HOST_NAME_LEN + 1];     // 割り当てドメイン名\r
298         bool SaveLog;                                   // ログの保存\r
299 };\r
300 \r
301 // DHCP オプション\r
302 struct DHCP_OPTION\r
303 {\r
304         UINT Id;                                                // ID\r
305         UINT Size;                                              // サイズ\r
306         void *Data;                                             // データ\r
307 };\r
308 \r
309 // DHCP オプションリスト\r
310 struct DHCP_OPTION_LIST\r
311 {\r
312         // 共通項目\r
313         UINT Opcode;                                    // DHCP オペコード\r
314 \r
315         // クライアント要求\r
316         UINT RequestedIp;                               // 要求された IP アドレス\r
317         char Hostname[MAX_HOST_NAME_LEN + 1]; // ホスト名\r
318 \r
319         // サーバー応答\r
320         UINT ServerAddress;                             // DHCP サーバーアドレス\r
321         UINT LeaseTime;                                 // リース時間\r
322         char DomainName[MAX_HOST_NAME_LEN + 1]; // ドメイン名\r
323         UINT SubnetMask;                                // サブネットマスク\r
324         UINT Gateway;                                   // ゲートウェイアドレス\r
325         UINT DnsServer;                                 // DNS サーバーアドレス\r
326 };\r
327 \r
328 \r
329 // DHCP リース エントリ\r
330 struct DHCP_LEASE\r
331 {\r
332         UINT Id;                                                // ID\r
333         UINT64 LeasedTime;                              // リースした時刻\r
334         UINT64 ExpireTime;                              // 有効期限\r
335         UCHAR MacAddress[6];                    // MAC アドレス\r
336         UCHAR Padding[2];                               // Padding\r
337         UINT IpAddress;                                 // IP アドレス\r
338         UINT Mask;                                              // サブネットマスク\r
339         char *Hostname;                                 // ホスト名\r
340 };\r
341 \r
342 // DNS 問い合わせ\r
343 typedef struct NAT_DNS_QUERY\r
344 {\r
345         REF *ref;                                               // 参照カウンタ\r
346         char Hostname[256];                             // ホスト名\r
347         bool Ok;                                                // 結果の成功フラグ\r
348         IP Ip;                                                  // 結果 IP アドレス\r
349 } NAT_DNS_QUERY;\r
350 \r
351 \r
352 // 仮想ホストの仮想 LAN カード\r
353 PACKET_ADAPTER *VirtualGetPacketAdapter();\r
354 bool VirtualPaInit(SESSION *s);\r
355 CANCEL *VirtualPaGetCancel(SESSION *s);\r
356 UINT VirtualPaGetNextPacket(SESSION *s, void **data);\r
357 bool VirtualPaPutPacket(SESSION *s, void *data, UINT size);\r
358 void VirtualPaFree(SESSION *s);\r
359 \r
360 bool VirtualInit(VH *v);\r
361 UINT VirtualGetNextPacket(VH *v, void **data);\r
362 bool VirtualPutPacket(VH *v, void *data, UINT size);\r
363 void Virtual_Free(VH *v);\r
364 \r
365 VH *NewVirtualHost(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, VH_OPTION *vh_option);\r
366 VH *NewVirtualHostEx(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, VH_OPTION *vh_option, NAT *nat);\r
367 void LockVirtual(VH *v);\r
368 void UnlockVirtual(VH *v);\r
369 void ReleaseVirtual(VH *v);\r
370 void CleanupVirtual(VH *v);\r
371 void StopVirtualHost(VH *v);\r
372 void SetVirtualHostOption(VH *v, VH_OPTION *vo);\r
373 void GenMacAddress(UCHAR *mac);\r
374 void GetVirtualHostOption(VH *v, VH_OPTION *o);\r
375 \r
376 void VirtualLayer2(VH *v, PKT *packet);\r
377 bool VirtualLayer2Filter(VH *v, PKT *packet);\r
378 void VirtualArpReceived(VH *v, PKT *packet);\r
379 void VirtualArpResponseRequest(VH *v, PKT *packet);\r
380 void VirtualArpResponseReceived(VH *v, PKT *packet);\r
381 void VirtualArpSendResponse(VH *v, UCHAR *dest_mac, UINT dest_ip, UINT src_ip);\r
382 void VirtualArpSendRequest(VH *v, UINT dest_ip);\r
383 void VirtualIpSend(VH *v, UCHAR *dest_mac, void *data, UINT size);\r
384 void VirtualLayer2Send(VH *v, UCHAR *dest_mac, UCHAR *src_mac, USHORT protocol, void *data, UINT size);\r
385 void VirtualPolling(VH *v);\r
386 void InitArpTable(VH *v);\r
387 void FreeArpTable(VH *v);\r
388 int CompareArpTable(void *p1, void *p2);\r
389 ARP_ENTRY *SearchArpTable(VH *v, UINT ip);\r
390 void RefreshArpTable(VH *v);\r
391 void PollingArpTable(VH *v);\r
392 void InsertArpTable(VH *v, UCHAR *mac, UINT ip);\r
393 bool IsMacBroadcast(UCHAR *mac);\r
394 bool IsMacInvalid(UCHAR *mac);\r
395 void InitArpWaitTable(VH *v);\r
396 void FreeArpWaitTable(VH *v);\r
397 int CompareArpWaitTable(void *p1, void *p2);\r
398 ARP_WAIT *SearchArpWaitTable(VH *v, UINT ip);\r
399 void DeleteArpWaitTable(VH *v, UINT ip);\r
400 void SendArp(VH *v, UINT ip);\r
401 void InsertArpWaitTable(VH *v, ARP_WAIT *w);\r
402 void PollingArpWaitTable(VH *v);\r
403 void ArpIpWasKnown(VH *v, UINT ip, UCHAR *mac);\r
404 void InitIpWaitTable(VH *v);\r
405 void FreeIpWaitTable(VH *v);\r
406 void InsertIpWaitTable(VH *v, UINT dest_ip, UINT src_ip, void *data, UINT size);\r
407 void SendFragmentedIp(VH *v, UINT dest_ip, UINT src_ip, USHORT id, USHORT total_size, USHORT offset, UCHAR protocol, void *data, UINT size, UCHAR *dest_mac);\r
408 void SendIp(VH *v, UINT dest_ip, UINT src_ip, UCHAR protocol, void *data, UINT size);\r
409 void PollingIpWaitTable(VH *v);\r
410 void DeleteOldIpWaitTable(VH *v);\r
411 void SendWaitingIp(VH *v, UCHAR *mac, UINT dest_ip);\r
412 void VirtualIpReceived(VH *v, PKT *packet);\r
413 void InitIpCombineList(VH *v);\r
414 void FreeIpCombineList(VH *v);\r
415 int CompareIpCombine(void *p1, void *p2);\r
416 void CombineIp(VH *v, IP_COMBINE *c, UINT offset, void *data, UINT size, bool last_packet);\r
417 void IpReceived(VH *v, UINT src_ip, UINT dest_ip, UINT protocol, void *data, UINT size, bool mac_broadcast);\r
418 void FreeIpCombine(VH *v, IP_COMBINE *c);\r
419 void PollingIpCombine(VH *v);\r
420 IP_COMBINE *InsertIpCombine(VH *v, UINT src_ip, UINT dest_ip, USHORT id, UCHAR protocol, bool mac_broadcast);\r
421 IP_COMBINE *SearchIpCombine(VH *v, UINT src_ip, UINT dest_ip, USHORT id, UCHAR protocol);\r
422 USHORT IpChecksum(void *buf, UINT size);\r
423 bool IpCheckChecksum(IPV4_HEADER *ip);\r
424 void VirtualIcmpReceived(VH *v, UINT src_ip, UINT dst_ip, void *data, UINT size);\r
425 void VirtualIcmpEchoRequestReceived(VH *v, UINT src_ip, UINT dst_ip, void *data, UINT size);\r
426 void VirtualIcmpEchoSendResponse(VH *v, UINT src_ip, UINT dst_ip, USHORT id, USHORT seq_no, void *data, UINT size);\r
427 void VirtualIcmpSend(VH *v, UINT src_ip, UINT dst_ip, void *data, UINT size);\r
428 void VirtualUdpReceived(VH *v, UINT src_ip, UINT dest_ip, void *data, UINT size, bool mac_broadcast);\r
429 void SendUdp(VH *v, UINT dest_ip, UINT dest_port, UINT src_ip, UINT src_port, void *data, UINT size);\r
430 UINT GetNetworkAddress(UINT addr, UINT mask);\r
431 UINT GetBroadcastAddress(UINT addr, UINT mask);\r
432 bool IsInNetwork(UINT uni_addr, UINT network_addr, UINT mask);\r
433 void UdpRecvForMe(VH *v, UINT src_ip, UINT src_port, UINT dest_ip, UINT dest_port, void *data, UINT size);\r
434 void UdpRecvForBroadcast(VH *v, UINT src_ip, UINT src_port, UINT dest_ip, UINT dest_port, void *data, UINT size);\r
435 void UdpRecvForInternet(VH *v, UINT src_ip, UINT src_port, UINT dest_ip, UINT dest_port, void *data, UINT size, bool dns_proxy);\r
436 void InitNat(VH *v);\r
437 void FreeNat(VH *v);\r
438 int CompareNat(void *p1, void *p2);\r
439 NAT_ENTRY *SearchNat(VH *v, NAT_ENTRY *target);\r
440 void SetNat(NAT_ENTRY *n, UINT protocol, UINT src_ip, UINT src_port, UINT dest_ip, UINT dest_port, UINT public_ip, UINT public_port);\r
441 void DeleteNatTcp(VH *v, NAT_ENTRY *n);\r
442 void DeleteNatUdp(VH *v, NAT_ENTRY *n);\r
443 NAT_ENTRY *CreateNatUdp(VH *v, UINT src_ip, UINT src_port, UINT dest_ip, UINT dest_port, UINT dns_proxy_ip);\r
444 void NatThread(THREAD *t, void *param);\r
445 void NatThreadMain(VH *v);\r
446 bool NatTransactUdp(VH *v, NAT_ENTRY *n);\r
447 void PoolingNat(VH *v);\r
448 void PoolingNatUdp(VH *v, NAT_ENTRY *n);\r
449 void VirtualTcpReceived(VH *v, UINT src_ip, UINT dest_ip, void *data, UINT size);\r
450 void TcpRecvForInternet(VH *v, UINT src_ip, UINT src_port, UINT dest_ip, UINT dest_port, TCP_HEADER *tcp, void *data, UINT size);\r
451 NAT_ENTRY *CreateNatTcp(VH *v, UINT src_ip, UINT src_port, UINT dest_ip, UINT dest_port);\r
452 bool NatTransactTcp(VH *v, NAT_ENTRY *n);\r
453 void CreateNatTcpConnectThread(VH *v, NAT_ENTRY *n);\r
454 void NatTcpConnectThread(THREAD *t, void *p);\r
455 void PollingNatTcp(VH *v, NAT_ENTRY *n);\r
456 void ParseTcpOption(TCP_OPTION *o, void *data, UINT size);\r
457 void SendTcp(VH *v, UINT src_ip, UINT src_port, UINT dest_ip, UINT dest_port, UINT seq, UINT ack, UINT flag, UINT window_size, UINT mss, void *data, UINT size);\r
458 void DnsProxy(VH *v, UINT src_ip, UINT src_port, UINT dest_ip, UINT dest_port, void *data, UINT size);\r
459 bool ParseDnsPacket(VH *v, UINT src_ip, UINT src_port, UINT dest_ip, UINT dest_port, void *data, UINT size);\r
460 bool ParseDnsQuery(char *name, UINT name_size, void *data, UINT data_size);\r
461 UCHAR GetNextByte(BUF *b);\r
462 bool NatTransactDns(VH *v, NAT_ENTRY *n);\r
463 void NatDnsThread(THREAD *t, void *param);\r
464 bool NatGetIP(IP *ip, char *hostname);\r
465 void NatGetIPThread(THREAD *t, void *param);\r
466 NAT_ENTRY *CreateNatDns(VH *v, UINT src_ip, UINT src_port, UINT dest_ip, UINT dest_port,\r
467                                   UINT transaction_id, bool dns_get_ip_from_host, char *dns_target_host_name);\r
468 void PollingNatDns(VH *v, NAT_ENTRY *n);\r
469 void SendNatDnsResponse(VH *v, NAT_ENTRY *n);\r
470 void BuildDnsQueryPacket(BUF *b, char *hostname, bool ptr);\r
471 void BuildDnsResponsePacketA(BUF *b, IP *ip);\r
472 void BuildDnsResponsePacketPtr(BUF *b, char *hostname);\r
473 bool ArpaToIP(IP *ip, char *str);\r
474 BUF *BuildDnsHostName(char *hostname);\r
475 bool CanCreateNewNatEntry(VH *v);\r
476 void VirtualDhcpServer(VH *v, PKT *p);\r
477 LIST *ParseDhcpOptions(void *data, UINT size);\r
478 void FreeDhcpOptions(LIST *o);\r
479 DHCP_OPTION *GetDhcpOption(LIST *o, UINT id);\r
480 DHCP_OPTION_LIST *ParseDhcpOptionList(void *data, UINT size);\r
481 void InitDhcpServer(VH *v);\r
482 void FreeDhcpServer(VH *v);\r
483 void PollingDhcpServer(VH *v);\r
484 int CompareDhcpLeaseList(void *p1, void *p2);\r
485 DHCP_LEASE *NewDhcpLease(UINT expire, UCHAR *mac_address, UINT ip, UINT mask, char *hostname);\r
486 void FreeDhcpLease(DHCP_LEASE *d);\r
487 DHCP_LEASE *SearchDhcpLeaseByMac(VH *v, UCHAR *mac);\r
488 DHCP_LEASE *SearchDhcpLeaseByIp(VH *v, UINT ip);\r
489 UINT ServeDhcpDiscover(VH *v, UCHAR *mac, UINT request_ip);\r
490 UINT GetFreeDhcpIpAddress(VH *v);\r
491 UINT ServeDhcpRequest(VH *v, UCHAR *mac, UINT request_ip);\r
492 LIST *BuildDhcpOption(DHCP_OPTION_LIST *opt);\r
493 DHCP_OPTION *NewDhcpOption(UINT id, void *data, UINT size);\r
494 BUF *BuildDhcpOptionsBuf(LIST *o);\r
495 void VirtualDhcpSend(VH *v, UINT tran_id, UINT dest_ip, UINT dest_port,\r
496                                          UINT new_ip, UCHAR *client_mac, BUF *b);\r
497 void VLog(VH *v, char *str);\r
498 void SendBeacon(VH *v);\r
499 void PollingBeacon(VH *v);\r
500 \r
501 \r
502 #endif  // VIRTUAL_H\r
503 \r
504 \r