* copy vendor drop to trunk
[lab.git] / Dev / utvpn / utvpn-unix-v101-7101-public / src / Cedar / Nat.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 // Nat.h\r
79 // Nat.c のヘッダ\r
80 \r
81 #ifndef NAT_H\r
82 #define NAT_H\r
83 \r
84 // 定数\r
85 #define NAT_CONFIG_FILE_NAME                    "@vpn_router.config"    // NAT 設定ファイル\r
86 #define DEFAULT_NAT_ADMIN_PORT                  2828            // デフォルトの管理用ポート番号\r
87 #define NAT_ADMIN_PORT_LISTEN_INTERVAL  1000            // 管理用ポートを開こうとする間隔\r
88 #define NAT_FILE_SAVE_INTERVAL                  (30 * 1000)     // 保存間隔\r
89 \r
90 \r
91 // NAT オブジェクト\r
92 struct NAT\r
93 {\r
94         LOCK *lock;                                                     // ロック\r
95         UCHAR HashedPassword[SHA1_SIZE];        // 管理用パスワード\r
96         VH_OPTION Option;                                       // オプション\r
97         CEDAR *Cedar;                                           // Cedar\r
98         UINT AdminPort;                                         // 管理用ポート番号\r
99         bool Online;                                            // オンライン フラグ\r
100         VH *Virtual;                                            // 仮想ホストオブジェクト\r
101         CLIENT_OPTION *ClientOption;            // クライアントオプション\r
102         CLIENT_AUTH *ClientAuth;                        // クライアント認証データ\r
103         CFG_RW *CfgRw;                                          // Config ファイル R/W\r
104         THREAD *AdminAcceptThread;                      // 管理用コネクション受付スレッド\r
105         SOCK *AdminListenSock;                          // 管理ポートソケット\r
106         EVENT *HaltEvent;                                       // 停止イベント\r
107         volatile bool Halt;                                     // 停止フラグ\r
108         LIST *AdminList;                                        // 管理スレッドリスト\r
109         X *AdminX;                                                      // 管理用サーバー証明書\r
110         K *AdminK;                                                      // 管理用サーバー秘密鍵\r
111         SNAT *SecureNAT;                                        // SecureNAT オブジェクト\r
112 };\r
113 \r
114 // NAT 管理コネクション\r
115 struct NAT_ADMIN\r
116 {\r
117         NAT *Nat;                                                       // NAT\r
118         SOCK *Sock;                                                     // ソケット\r
119         THREAD *Thread;                                         // スレッド\r
120 };\r
121 \r
122 // RPC_DUMMY\r
123 struct RPC_DUMMY\r
124 {\r
125         UINT DummyValue;\r
126 };\r
127 \r
128 // RPC_NAT_STATUS\r
129 struct RPC_NAT_STATUS\r
130 {\r
131         char HubName[MAX_HUBNAME_LEN + 1];                      // HUB 名\r
132         UINT NumTcpSessions;                                            // TCP セッション数\r
133         UINT NumUdpSessions;                                            // UDP セッション数\r
134         UINT NumDhcpClients;                                            // DHCP クライアント数\r
135 };\r
136 \r
137 // RPC_NAT_INFO *\r
138 struct RPC_NAT_INFO\r
139 {\r
140         char NatProductName[128];                                       // サーバー製品名\r
141         char NatVersionString[128];                                     // サーバーバージョン文字列\r
142         char NatBuildInfoString[128];                           // サーバービルド情報文字列\r
143         UINT NatVerInt;                                                         // サーバーバージョン整数値\r
144         UINT NatBuildInt;                                                       // サーバービルド番号整数値\r
145         char NatHostName[MAX_HOST_NAME_LEN + 1];        // サーバーホスト名\r
146         OS_INFO OsInfo;                                                         // OS 情報\r
147         MEMINFO MemInfo;                                                        // メモリ情報\r
148 };\r
149 \r
150 // RPC_ENUM_NAT_ITEM\r
151 struct RPC_ENUM_NAT_ITEM\r
152 {\r
153         UINT Id;                                                                        // ID\r
154         UINT Protocol;                                                          // プロトコル\r
155         UINT SrcIp;                                                                     // 接続元 IP アドレス\r
156         char SrcHost[MAX_HOST_NAME_LEN + 1];            // 接続元ホスト名\r
157         UINT SrcPort;                                                           // 接続元ポート番号\r
158         UINT DestIp;                                                            // 接続先 IP アドレス\r
159         char DestHost[MAX_HOST_NAME_LEN + 1];           // 接続先ホスト名\r
160         UINT DestPort;                                                          // 接続先ポート番号\r
161         UINT64 CreatedTime;                                                     // 接続時刻\r
162         UINT64 LastCommTime;                                            // 最終通信時刻\r
163         UINT64 SendSize;                                                        // 送信サイズ\r
164         UINT64 RecvSize;                                                        // 受信サイズ\r
165         UINT TcpStatus;                                                         // TCP 状態\r
166 };\r
167 \r
168 // RPC_ENUM_NAT *\r
169 struct RPC_ENUM_NAT\r
170 {\r
171         char HubName[MAX_HUBNAME_LEN + 1];                      // HUB 名\r
172         UINT NumItem;                                                           // アイテム数\r
173         RPC_ENUM_NAT_ITEM *Items;                                       // アイテム\r
174 };\r
175 \r
176 // RPC_ENUM_DHCP_ITEM\r
177 struct RPC_ENUM_DHCP_ITEM\r
178 {\r
179         UINT Id;                                                                        // ID\r
180         UINT64 LeasedTime;                                                      // リース時刻\r
181         UINT64 ExpireTime;                                                      // 有効期限\r
182         UCHAR MacAddress[6];                                            // MAC アドレス\r
183         UCHAR Padding[2];                                                       // パディング\r
184         UINT IpAddress;                                                         // IP アドレス\r
185         UINT Mask;                                                                      // サブネットマスク\r
186         char Hostname[MAX_HOST_NAME_LEN + 1];           // ホスト名\r
187 };\r
188 \r
189 // RPC_ENUM_DHCP *\r
190 struct RPC_ENUM_DHCP\r
191 {\r
192         char HubName[MAX_HUBNAME_LEN + 1];                      // HUB 名\r
193         UINT NumItem;                                                           // アイテム数\r
194         RPC_ENUM_DHCP_ITEM *Items;                                      // アイテム\r
195 };\r
196 \r
197 \r
198 // 関数プロトタイプ\r
199 NAT *NiNewNat();\r
200 NAT *NiNewNatEx(SNAT *snat, VH_OPTION *o);\r
201 void NiFreeNat(NAT *n);\r
202 void NiInitConfig(NAT *n);\r
203 void NiFreeConfig(NAT *n);\r
204 void NiInitDefaultConfig(NAT *n);\r
205 void NiSetDefaultVhOption(NAT *n, VH_OPTION *o);\r
206 void NiClearUnsupportedVhOptionForDynamicHub(VH_OPTION *o, bool initial);\r
207 void NiWriteConfig(NAT *n);\r
208 void NiWriteVhOption(NAT *n, FOLDER *root);\r
209 void NiWriteVhOptionEx(VH_OPTION *o, FOLDER *root);\r
210 void NiWriteClientData(NAT *n, FOLDER *root);\r
211 void NiLoadVhOption(NAT *n, FOLDER *root);\r
212 void NiLoadVhOptionEx(VH_OPTION *o, FOLDER *root);\r
213 bool NiLoadConfig(NAT *n, FOLDER *root);\r
214 void NiLoadClientData(NAT *n, FOLDER *root);\r
215 void NiInitAdminAccept(NAT *n);\r
216 void NiFreeAdminAccept(NAT *n);\r
217 void NiListenThread(THREAD *thread, void *param);\r
218 void NiAdminThread(THREAD *thread, void *param);\r
219 void NiAdminMain(NAT *n, SOCK *s);\r
220 PACK *NiRpcServer(RPC *r, char *name, PACK *p);\r
221 \r
222 RPC *NatAdminConnect(CEDAR *cedar, char *hostname, UINT port, void *hashed_password, UINT *err);\r
223 void NatAdminDisconnect(RPC *r);\r
224 \r
225 void NtStartNat();\r
226 void NtStopNat();\r
227 void NtInit();\r
228 void NtFree();\r
229 \r
230 \r
231 UINT NtOnline(NAT *n, RPC_DUMMY *t);\r
232 UINT NtOffline(NAT *n, RPC_DUMMY *t);\r
233 UINT NtSetHostOption(NAT *n, VH_OPTION *t);\r
234 UINT NtGetHostOption(NAT *n, VH_OPTION *t);\r
235 UINT NtSetClientConfig(NAT *n, RPC_CREATE_LINK *t);\r
236 UINT NtGetClientConfig(NAT *n, RPC_CREATE_LINK *t);\r
237 UINT NtGetStatus(NAT *n, RPC_NAT_STATUS *t);\r
238 UINT NtGetInfo(NAT *n, RPC_NAT_INFO *t);\r
239 UINT NtEnumNatList(NAT *n, RPC_ENUM_NAT *t);\r
240 UINT NtEnumDhcpList(NAT *n, RPC_ENUM_DHCP *t);\r
241 UINT NtSetPassword(NAT *n, RPC_SET_PASSWORD *t);\r
242 \r
243 \r
244 UINT NcOnline(RPC *r, RPC_DUMMY *t);\r
245 UINT NcOffline(RPC *r, RPC_DUMMY *t);\r
246 UINT NcSetHostOption(RPC *r, VH_OPTION *t);\r
247 UINT NcGetHostOption(RPC *r, VH_OPTION *t);\r
248 UINT NcSetClientConfig(RPC *r, RPC_CREATE_LINK *t);\r
249 UINT NcGetClientConfig(RPC *r, RPC_CREATE_LINK *t);\r
250 UINT NcGetStatus(RPC *r, RPC_NAT_STATUS *t);\r
251 UINT NcGetInfo(RPC *r, RPC_NAT_INFO *t);\r
252 UINT NcEnumNatList(RPC *r, RPC_ENUM_NAT *t);\r
253 UINT NcEnumDhcpList(RPC *r, RPC_ENUM_DHCP *t);\r
254 UINT NcSetPassword(RPC *r, RPC_SET_PASSWORD *t);\r
255 \r
256 \r
257 \r
258 \r
259 void InRpcEnumDhcp(RPC_ENUM_DHCP *t, PACK *p);\r
260 void OutRpcEnumDhcp(PACK *p, RPC_ENUM_DHCP *t);\r
261 void FreeRpcEnumDhcp(RPC_ENUM_DHCP *t);\r
262 void InRpcEnumNat(RPC_ENUM_NAT *t, PACK *p);\r
263 void OutRpcEnumNat(PACK *p, RPC_ENUM_NAT *t);\r
264 void FreeRpcEnumNat(RPC_ENUM_NAT *t);\r
265 void InRpcNatInfo(RPC_NAT_INFO *t, PACK *p);\r
266 void OutRpcNatInfo(PACK *p, RPC_NAT_INFO *t);\r
267 void FreeRpcNatInfo(RPC_NAT_INFO *t);\r
268 void InRpcNatStatus(RPC_NAT_STATUS *t, PACK *p);\r
269 void OutRpcNatStatus(PACK *p, RPC_NAT_STATUS *t);\r
270 void FreeRpcNatStatus(RPC_NAT_STATUS *t);\r
271 void InVhOption(VH_OPTION *t, PACK *p);\r
272 void OutVhOption(PACK *p, VH_OPTION *t);\r
273 void InRpcDummy(RPC_DUMMY *t, PACK *p);\r
274 void OutRpcDummy(PACK *p, RPC_DUMMY *t);\r
275 \r
276 \r
277 \r
278 \r
279 #endif  // NAT_H\r
280 \r
281 \r