* tar xzf utvpn-src-unix-v101-7101-public-2010.06.27.tar.gz
[lab.git] / utvpn / utvpn-unix-v101-7101-public / src / Cedar / Session.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 // Session.h\r
79 // Session.c のヘッダ\r
80 \r
81 #ifndef SESSION_H\r
82 #define SESSION_H\r
83 \r
84 \r
85 \r
86 // パケットアダプタ関数\r
87 typedef bool (PA_INIT)(SESSION *s);\r
88 typedef CANCEL *(PA_GETCANCEL)(SESSION *s);\r
89 typedef UINT (PA_GETNEXTPACKET)(SESSION *s, void **data);\r
90 typedef bool (PA_PUTPACKET)(SESSION *s, void *data, UINT size);\r
91 typedef void (PA_FREE)(SESSION *s);\r
92 \r
93 // クライアント関係関数\r
94 typedef void (CLIENT_STATUS_PRINTER)(SESSION *s, wchar_t *status);\r
95 \r
96 // ノード情報\r
97 struct NODE_INFO\r
98 {\r
99         char ClientProductName[64];             // クライアント製品名\r
100         UINT ClientProductVer;                  // クライアントバージョン\r
101         UINT ClientProductBuild;                // クライアントビルド番号\r
102         char ServerProductName[64];             // サーバー製品名\r
103         UINT ServerProductVer;                  // サーバーバージョン\r
104         UINT ServerProductBuild;                // サーバービルド番号\r
105         char ClientOsName[64];                  // クライアント OS 名\r
106         char ClientOsVer[128];                  // クライアント OS バージョン\r
107         char ClientOsProductId[64];             // クライアント OS プロダクト ID\r
108         char ClientHostname[64];                // クライアントホスト名\r
109         UINT ClientIpAddress;                   // クライアント IP アドレス\r
110         UINT ClientPort;                                // クライアントポート番号\r
111         char ServerHostname[64];                // サーバーホスト名\r
112         UINT ServerIpAddress;                   // サーバー IP アドレス\r
113         UINT ServerPort;                                // サーバーポート番号\r
114         char ProxyHostname[64];                 // プロキシホスト名\r
115         UINT ProxyIpAddress;                    // プロキシ IP アドレス\r
116         UINT ProxyPort;                                 // プロキシポート番号\r
117         char HubName[64];                               // HUB 名\r
118         UCHAR UniqueId[16];                             // ユニーク ID\r
119         // 以下は IPv6 対応用\r
120         UCHAR ClientIpAddress6[16];             // クライアント IPv6 アドレス\r
121         UCHAR ServerIpAddress6[16];             // サーバー IP アドレス\r
122         UCHAR ProxyIpAddress6[16];              // プロキシ IP アドレス\r
123         char Padding[304 - (16 * 3)];   // パディング\r
124 };\r
125 \r
126 // パケットアダプタ\r
127 struct PACKET_ADAPTER\r
128 {\r
129         PA_INIT *Init;\r
130         PA_GETCANCEL *GetCancel;\r
131         PA_GETNEXTPACKET *GetNextPacket;\r
132         PA_PUTPACKET *PutPacket;\r
133         PA_FREE *Free;\r
134         void *Param;\r
135 };\r
136 \r
137 // セッション構造体\r
138 struct SESSION\r
139 {\r
140         LOCK *lock;                                             // ロック\r
141         REF *ref;                                               // 参照カウンタ\r
142         CEDAR *Cedar;                                   // Cedar\r
143         bool LocalHostSession;                  // ローカルホストセッション\r
144         bool ServerMode;                                // サーバーモードセッション\r
145         bool LinkModeClient;                    // リンクモードクライアント\r
146         bool LinkModeServer;                    // リンクモードサーバー\r
147         bool SecureNATMode;                             // SecureNAT セッション\r
148         bool BridgeMode;                                // Bridge セッション\r
149         bool VirtualHost;                               // 仮想ホストモード\r
150         bool L3SwitchMode;                              // Layer-3 スイッチモード\r
151         THREAD *Thread;                                 // 管理スレッド\r
152         CONNECTION *Connection;                 // コネクション\r
153         CLIENT_OPTION *ClientOption;    // クライアント接続オプション\r
154         CLIENT_AUTH *ClientAuth;                // クライアント認証データ\r
155         volatile bool Halt;                             // 停止フラグ\r
156         volatile bool CancelConnect;    // 接続のキャンセル\r
157         EVENT *HaltEvent;                               // 停止イベント\r
158         UINT Err;                                               // エラー値\r
159         HUB *Hub;                                               // HUB\r
160         CANCEL *Cancel1;                                // キャンセルオブジェクト 1\r
161         CANCEL *Cancel2;                                // キャンセルオブジェクト 2\r
162         PACKET_ADAPTER *PacketAdapter;  // パケットアダプタ\r
163         UCHAR UdpSendKey[16];                   // UDP 送信用暗号化鍵\r
164         UCHAR UdpRecvKey[16];                   // UDP 受信用暗号化鍵\r
165         UINT ClientStatus;                              // クライアントステータス\r
166         bool RetryFlag;                                 // リトライフラグ (クライアント)\r
167         bool ForceStopFlag;                             // 強制停止フラグ (クライアント)\r
168         UINT CurrentRetryCount;                 // 現在のリトライカウンタ (クライアント)\r
169         UINT RetryInterval;                             // リトライ間隔 (クライアント)\r
170         bool ConnectSucceed;                    // 接続成功フラグ (クライアント)\r
171         bool SessionTimeOuted;                  // セッションがタイムアウトした\r
172         UINT Timeout;                                   // タイムアウト時間\r
173         UINT64 NextConnectionTime;              // 次に追加コネクションを張る時刻\r
174         IP ServerIP;                                    // サーバーの IP アドレス\r
175         bool ClientModeAndUseVLan;              // クライアントモードで仮想 LAN カードを使用\r
176         bool UseSSLDataEncryption;              // SSL データ暗号化を使用する\r
177         LOCK *TrafficLock;                              // トラフィックデータロック\r
178         LINK *Link;                                             // リンクオブジェクトへの参照\r
179         SNAT *SecureNAT;                                // SecureNAT オブジェクトへの参照\r
180         BRIDGE *Bridge;                                 // Bridge オブジェクトへの参照\r
181         NODE_INFO NodeInfo;                             // ノード情報\r
182         UINT64 LastIncrementTraffic;    // 最後にユーザーのトラフィックデータを更新した時刻\r
183         bool AdministratorMode;                 // 管理者モード\r
184         LIST *CancelList;                               // キャンセルリスト\r
185         L3IF *L3If;                                             // Layer-3 インターフェイス\r
186         IP DefaultDns;                                  // デフォルトの DNS サーバーの IP アドレス\r
187         bool IPv6Session;                               // IPv6 セッション (物理的な通信が IPv6 である)\r
188         UINT VLanId;                                    // VLAN ID\r
189 \r
190         UINT64 CreatedTime;                             // 作成日時\r
191         UINT64 LastCommTime;                    // 最終通信日時\r
192         TRAFFIC *Traffic;                               // トラフィックデータ\r
193         TRAFFIC *OldTraffic;                    // 古いトラフィックデータ\r
194         UINT64 TotalSendSize;                   // 合計送信データサイズ\r
195         UINT64 TotalRecvSize;                   // 合計受信データサイズ\r
196         UINT64 TotalSendSizeReal;               // 合計送信データサイズ (無圧縮)\r
197         UINT64 TotalRecvSizeReal;               // 合計受信データサイズ (無圧縮)\r
198         char *Name;                                             // セッション名\r
199         char *Username;                                 // ユーザー名\r
200         char UserNameReal[MAX_USERNAME_LEN + 1];        // ユーザー名 (本物)\r
201         char GroupName[MAX_USERNAME_LEN + 1];   // グループ名\r
202         POLICY *Policy;                                 // ポリシー\r
203         UCHAR SessionKey[SHA1_SIZE];    // セッションキー\r
204         UINT SessionKey32;                              // 32bit のセッションキー\r
205         UINT MaxConnection;                             // 最大同時接続 TCP コネクション数\r
206         bool UseEncrypt;                                // 暗号化通信を使用\r
207         bool UseFastRC4;                                // 高速 RC4 暗号化を使用\r
208         bool UseCompress;                               // データ圧縮を使用\r
209         bool HalfConnection;                    // ハーフコネクションモード\r
210         bool QoS;                                               // VoIP / QoS\r
211         bool NoSendSignature;                   // シグネチャを送信しない\r
212         UINT64 FirstConnectionEstablisiedTime;  // 最初のコネクションの接続完了時刻\r
213         UINT64 CurrentConnectionEstablishTime;  // このコネクションの接続完了時刻\r
214         UINT NumConnectionsEatablished; // これまでに確立したコネクション数\r
215 \r
216         ACCOUNT *Account;                               // クライアント アカウント\r
217         UINT VLanDeviceErrorCount;              // 仮想 LAN カードでエラーが発生した回数\r
218         bool Win32HideConnectWindow;    // 接続ウインドウを非表示にする\r
219         bool Win32HideNicInfoWindow;    // NIC 情報ウインドウを非表示にする\r
220         bool UserCanceled;                              // ユーザーによってキャンセルされた\r
221         UINT64 LastTryAddConnectTime;   // 最後にコネクションの追加を試行しようとした時刻\r
222 \r
223         bool IsMonitorMode;                             // モニタモードか否か\r
224         bool IsBridgeMode;                              // ブリッジモードか否か\r
225         bool UseClientLicense;                  // 割り当てられたクライアントライセンス数\r
226         bool UseBridgeLicense;                  // 割り当てられたブリッジライセンス数\r
227 \r
228         COUNTER *LoggingRecordCount;    // ロギング中のレコード数のカウンタ\r
229 \r
230         bool Client_NoSavePassword;             // パスワードの保存を禁止\r
231         wchar_t *Client_Message;                // サーバーから送信されてきたメッセージ\r
232 \r
233         LIST *DelayedPacketList;                // 遅延パケットリスト\r
234         UINT Flag1;\r
235 \r
236         // D-Link バグ対策\r
237         UINT64 LastDLinkSTPPacketSendTick;      // 最後の D-Link STP パケット送出時刻\r
238         UCHAR LastDLinkSTPPacketDataHash[MD5_SIZE];     // 最後の D-Link STP パケットハッシュ\r
239 };\r
240 \r
241 // パスワードダイアログ\r
242 struct UI_PASSWORD_DLG\r
243 {\r
244         UINT Type;                                              // パスワードの種類\r
245         char Username[MAX_USERNAME_LEN + 1];    // ユーザー名\r
246         char Password[MAX_PASSWORD_LEN + 1];    // パスワード\r
247         char ServerName[MAX_HOST_NAME_LEN + 1]; // サーバー名\r
248         UINT RetryIntervalSec;                  // リトライまでの時間\r
249         EVENT *CancelEvent;                             // ダイアログ表示をキャンセルするイベント\r
250         bool ProxyServer;                               // プロキシサーバーに関する認証\r
251         UINT64 StartTick;                               // 開始時刻\r
252         bool AdminMode;                                 // 管理モード\r
253         bool ShowNoSavePassword;                // パスワードを保存しないチェックボックスを表示するかどうか\r
254         bool NoSavePassword;                    // パスワードを保存しないモード\r
255         SOCK *Sock;                                             // ソケット\r
256 };\r
257 \r
258 // メッセージダイアログ\r
259 struct UI_MSG_DLG\r
260 {\r
261         char ServerName[MAX_HOST_NAME_LEN + 1]; // サーバー名\r
262         char HubName[MAX_HUBNAME_LEN + 1];      // 仮想 HUB 名\r
263         wchar_t *Msg;                                   // 本文\r
264         SOCK *Sock;                                             // ソケット\r
265         bool Halt;                                              // 閉じるフラグ\r
266 };\r
267 \r
268 // NIC 情報\r
269 struct UI_NICINFO\r
270 {\r
271         wchar_t AccountName[MAX_SIZE];  // 接続設定名\r
272         char NicName[MAX_SIZE];                 // 仮想 NIC 名\r
273 \r
274         SOCK *Sock;                                             // ソケット\r
275         bool Halt;                                              // 閉じるフラグ\r
276         ROUTE_CHANGE *RouteChange;              // ルーティングテーブル変更通知\r
277         UINT CurrentIcon;                               // 現在のアイコン\r
278         UINT64 CloseAfterTime;                  // 自動で閉じる\r
279 };\r
280 \r
281 // 接続エラーダイアログ\r
282 struct UI_CONNECTERROR_DLG\r
283 {\r
284         EVENT *CancelEvent;                             // ダイアログ表示をキャンセルするイベント\r
285         wchar_t AccountName[MAX_ACCOUNT_NAME_LEN + 1];  // アカウント名\r
286         char ServerName[MAX_HOST_NAME_LEN + 1]; // サーバー名\r
287         UINT Err;                                               // エラーコード\r
288         UINT CurrentRetryCount;                 // 現在のリトライ回数\r
289         UINT RetryLimit;                                // リトライ回数のリミット\r
290         UINT64 StartTick;                               // 開始時刻\r
291         UINT RetryIntervalSec;                  // リトライまでの時間\r
292         bool HideWindow;                                // ウインドウを非表示にする\r
293         SOCK *Sock;                                             // ソケット\r
294 };\r
295 \r
296 // サーバー証明書チェックダイアログ\r
297 struct UI_CHECKCERT\r
298 {\r
299         wchar_t AccountName[MAX_ACCOUNT_NAME_LEN + 1];  // アカウント名\r
300         char ServerName[MAX_HOST_NAME_LEN + 1]; // サーバー名\r
301         X *x;                                                   // サーバー証明書\r
302         X *parent_x;                                    // 親証明書\r
303         X *old_x;                                               // 前回の証明書\r
304         bool DiffWarning;                               // 証明書変造の警告を表示する\r
305         bool Ok;                                                // 接続許可フラグ\r
306         bool SaveServerCert;                    // サーバー証明書を保存する\r
307         SESSION *Session;                               // セッション\r
308         volatile bool Halt;                             // 停止フラグ\r
309         SOCK *Sock;                                             // ソケット\r
310 };\r
311 \r
312 \r
313 // 関数プロトタイプ\r
314 SESSION *NewClientSessionEx(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa, struct ACCOUNT *account);\r
315 SESSION *NewClientSession(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa);\r
316 SESSION *NewRpcSession(CEDAR *cedar, CLIENT_OPTION *option);\r
317 SESSION *NewRpcSessionEx(CEDAR *cedar, CLIENT_OPTION *option, UINT *err, char *client_str);\r
318 SESSION *NewRpcSessionEx2(CEDAR *cedar, CLIENT_OPTION *option, UINT *err, char *client_str, void *hWnd);\r
319 SESSION *NewServerSession(CEDAR *cedar, CONNECTION *c, HUB *h, char *username, POLICY *policy);\r
320 void ClientThread(THREAD *t, void *param);\r
321 void ReleaseSession(SESSION *s);\r
322 void CleanupSession(SESSION *s);\r
323 void StopSession(SESSION *s);\r
324 void StopSessionEx(SESSION *s, bool no_wait);\r
325 bool SessionConnect(SESSION *s);\r
326 bool ClientConnect(CONNECTION *c);\r
327 int CompareSession(void *p1, void *p2);\r
328 PACKET_ADAPTER *NewPacketAdapter(PA_INIT *init, PA_GETCANCEL *getcancel, PA_GETNEXTPACKET *getnext,\r
329                                                                  PA_PUTPACKET *put, PA_FREE *free);\r
330 void FreePacketAdapter(PACKET_ADAPTER *pa);\r
331 void SessionMain(SESSION *s);\r
332 void NewSessionKey(CEDAR *cedar, UCHAR *session_key, UINT *session_key_32);\r
333 SESSION *GetSessionFromKey(CEDAR *cedar, UCHAR *session_key);\r
334 SESSION *GetSessionFromKey32(CEDAR *cedar, UINT key32);\r
335 void DebugPrintSessionKey(UCHAR *session_key);\r
336 void ClientAdditionalConnectChance(SESSION *s);\r
337 void SessionAdditionalConnect(SESSION *s);\r
338 void ClientAdditionalThread(THREAD *t, void *param);\r
339 void PrintSessionTotalDataSize(SESSION *s);\r
340 void AddTrafficForSession(SESSION *s, TRAFFIC *t);\r
341 void IncrementUserTraffic(HUB *hub, char *username, SESSION *s);\r
342 void Notify(SESSION *s, UINT code);\r
343 void PrintStatus(SESSION *s, wchar_t *str);\r
344 LIST *NewCancelList();\r
345 void ReleaseCancelList(LIST *o);\r
346 void AddCancelList(LIST *o, CANCEL *c);\r
347 void CancelList(LIST *o);\r
348 bool CompareNodeInfo(NODE_INFO *a, NODE_INFO *b);\r
349 bool IsPriorityHighestPacketForQoS(void *data, UINT size);\r
350 UINT GetNextDelayedPacketTickDiff(SESSION *s);\r
351 \r
352 #endif  // SESSION_H\r
353 \r
354 \r
355 \r