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