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
88 UINT IpAddress; // IP アドレス
\r
89 UCHAR MacAddress[6]; // MAC アドレス
\r
91 UINT64 Created; // 作成日時
\r
92 UINT64 Expire; // 有効期限
\r
98 UINT IpAddress; // 解決しようとしている IP アドレス
\r
99 UINT NextTimeoutTimeValue; // 次にタイムアウトするまでの時間
\r
100 UINT64 TimeoutTime; // 現在の送信のタイムアウト時刻
\r
101 UINT64 GiveupTime; // 送信を諦める時刻
\r
107 UINT DestIP; // 宛先 IP アドレス
\r
108 UINT SrcIP; // 送信元 IP アドレス
\r
109 UINT64 Expire; // 保管期限
\r
117 UINT Offset; // オフセット
\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
136 #define IP_COMBINE_INITIAL_BUF_SIZE (MAX_IP_DATA_SIZE) // 初期バッファサイズ
\r
142 struct VH *v; // 仮想マシン
\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
157 bool ProxyDns; // プロキシ DNS
\r
158 UINT DestIpProxy; // プロキシ DNS アドレス
\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
172 QUEUE *UdpSendQueue; // UDP 送信キュー
\r
173 QUEUE *UdpRecvQueue; // UDP 受信キュー
\r
174 bool UdpSocketCreated; // UDP のソケットが作成されたかどうか
\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
198 UINT64 SendSeqInit; // 初期送信シーケンス番号
\r
199 UINT64 SendSeq; // 送信シーケンス番号
\r
200 UINT64 RecvSeqInit; // 初期受信シーケンス番号
\r
201 UINT64 RecvSeq; // 受信シーケンス番号
\r
203 bool CurrentSendingMission; // バースト送信実施中
\r
204 UINT SendMissionSize; // 今回の送信サイズ
\r
205 bool RetransmissionUsedFlag; // 再送信使用記録フラグ
\r
207 UINT CurrentRTT; // 現在の RTT 値
\r
208 UINT64 CalcRTTStartTime; // RTT 測定開始時刻
\r
209 UINT64 CalcRTTStartValue; // RTT 測定開始値
\r
211 bool TcpFinished; // TCP のデータ通信終了フラグ
\r
212 UINT64 FinSentTime; // 最後に FIN を送信した時刻
\r
213 UINT FinSentCount; // FIN 送信回数
\r
220 UINT MaxSegmentSize; // 最大セグメントサイズ
\r
221 UINT WindowScaling; // ウインドウスケーリング
\r
227 REF *ref; // 参照カウンタ
\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
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
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
281 char HubName[MAX_HUBNAME_LEN + 1]; // 操作対象の仮想 HUB 名
\r
282 UCHAR MacAddress[6]; // MAC アドレス
\r
285 IP Mask; // サブネットマスク
\r
286 bool UseNat; // NAT 機能の使用フラグ
\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
310 struct DHCP_OPTION_LIST
\r
313 UINT Opcode; // DHCP オペコード
\r
316 UINT RequestedIp; // 要求された IP アドレス
\r
317 char Hostname[MAX_HOST_NAME_LEN + 1]; // ホスト名
\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
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
343 typedef struct NAT_DNS_QUERY
\r
345 REF *ref; // 参照カウンタ
\r
346 char Hostname[256]; // ホスト名
\r
347 bool Ok; // 結果の成功フラグ
\r
348 IP Ip; // 結果 IP アドレス
\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
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
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
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
502 #endif // VIRTUAL_H
\r