* tar xzf utvpn-src-unix-v101-7101-public-2010.06.27.tar.gz
[lab.git] / utvpn / utvpn-unix-v101-7101-public / src / Sen / Sen.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.\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 // as published by the Free Software Foundation; either version 2\r
13 // of the License, or (at your option) any later version.\r
14 // \r
15 // This program is distributed in the hope that it will be useful,\r
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
18 // GNU General Public License for more details.\r
19 // \r
20 // You should have received a copy of the GNU General Public License\r
21 // along with this program; if not, write to the Free Software\r
22 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
23 // \r
24 // このファイルは GPL バージョン 2 ライセンスで公開されています。\r
25 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布\r
26 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示\r
27 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の\r
28 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。\r
29 // \r
30 // この SoftEther UT-VPN オープンソース・プロジェクトは、\r
31 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )\r
32 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって\r
33 // ホストされています。\r
34 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に\r
35 // あります。\r
36 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード\r
37 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して\r
38 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して\r
39 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース\r
40 // に組み込みさせていただきます。\r
41 // \r
42 // 本ソフトウェアを本オープンソース・プロジェクトの運営主体以外が改変した場合、\r
43 // それを複製、配布、販売することは GPL ライセンスに基づいて可能ですが、\r
44 // その場合、"SoftEther UT-VPN" の名前を勝手に騙り使用することはできません。\r
45 // 事前にソフトイーサ株式会社に許諾を求めるか、または、別の名称として\r
46 // ソフトウェアを配布、販売してください。\r
47 // \r
48 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
49 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
50 // \r
51 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
52 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
53 // ソフトイーサ株式会社はこれらの権利を放棄していません。本ソフトウェアの\r
54 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
55 // ください。\r
56 // \r
57 // 不明な点は、ソフトイーサ株式会社までご連絡ください。\r
58 // 連絡先: http://www.softether.co.jp/jp/contact/\r
59 \r
60 // -----------------------------------------------\r
61 // [ChangeLog]\r
62 // 2010.05.20\r
63 //  新規リリース by SoftEther\r
64 // -----------------------------------------------\r
65 \r
66 /*\r
67 **   File Name: Sen.h\r
68 ** Description: Sen.c のヘッダ\r
69 */\r
70 \r
71 #ifndef SEN_H\r
72 #define SEN_H\r
73 \r
74 \r
75 // 識別文字列 (NDIS)\r
76 #define NDIS_SEN_HARDWARE_ID                            "VPN Client Adapter - %s"\r
77 #define NDIS_SEN_DEVICE_NAME                            "\\Device\\SEN_%s_DEVICE"\r
78 #define NDIS_SEN_DEVICE_NAME_WIN32                      "\\DosDevices\\SEN_%s_DEVICE"\r
79 #define NDIS_SEN_DEVICE_FILE_NAME                       "\\\\.\\SEN_SENADAPTER_%s_DEVICE"\r
80 #define NDIS_SEN_EVENT_NAME                                     "\\BaseNamedObjects\\SEN_EVENT_%s"\r
81 #define NDIS_SEN_EVENT_NAME_WIN32                       "Global\\SEN_EVENT_SENADAPTER_%s"\r
82 \r
83 // 定数\r
84 #define SEN_MAX_PACKET_SIZE                     1560\r
85 #define SEN_MAX_PACKET_SIZE_ANNOUNCE    1514\r
86 #define SEN_MIN_PACKET_SIZE                     14\r
87 #define SEN_PACKET_HEADER_SIZE          14\r
88 #define SEN_MAX_FRAME_SIZE                      (SEN_MAX_PACKET_SIZE - SEN_MIN_PACKET_SIZE)\r
89 #define SEN_MAX_SPEED_DEFAULT           1000000\r
90 #define SEN_MAC_ADDRESS_SIZE            6\r
91 #define SEN_MAX_MULTICASE                       32\r
92 \r
93 \r
94 // IOCTL 定数\r
95 #define SEN_IOCTL_SET_EVENT                     CTL_CODE(0x8000, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)\r
96 #define SEN_IOCTL_PUT_PACKET            CTL_CODE(0x8000, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)\r
97 #define SEN_IOCTL_GET_PACKET            CTL_CODE(0x8000, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)\r
98 \r
99 \r
100 // パケットデータ交換関係\r
101 #define SEN_MAX_PACKET_EXCHANGE         256                     // 一度に交換できるパケット数\r
102 #define SEN_MAX_PACKET_QUEUED           4096            // キューに入れることができるパケット数\r
103 #define SEN_EX_SIZEOF_NUM_PACKET        4                       // パケット数データ (UINT)\r
104 #define SEN_EX_SIZEOF_LENGTH_PACKET     4                       // パケットデータの長さデータ (UINT)\r
105 #define SEN_EX_SIZEOF_LEFT_FLAG         4                       // まだパケットが残っていることを示すフラグ\r
106 #define SEN_EX_SIZEOF_ONE_PACKET        1600            // 1 つのパケットデータが占有するデータ領域\r
107 #define SEN_EXCHANGE_BUFFER_SIZE        (SEN_EX_SIZEOF_NUM_PACKET + SEN_EX_SIZEOF_LEFT_FLAG +   \\r
108         (SEN_EX_SIZEOF_LENGTH_PACKET + SEN_EX_SIZEOF_ONE_PACKET) * (SEN_MAX_PACKET_EXCHANGE + 1))\r
109 #define SEN_NUM_PACKET(buf)                     (*((UINT *)((UCHAR *)buf + 0)))\r
110 #define SEN_SIZE_OF_PACKET(buf, i)      (*((UINT *)((UCHAR *)buf + SEN_EX_SIZEOF_NUM_PACKET + \\r
111                                                                         (i * (SEN_EX_SIZEOF_LENGTH_PACKET + SEN_EX_SIZEOF_ONE_PACKET)))))\r
112 #define SEN_ADDR_OF_PACKET(buf, i)      (((UINT *)((UCHAR *)buf + SEN_EX_SIZEOF_NUM_PACKET + \\r
113                                                                         SEN_EX_SIZEOF_LENGTH_PACKET +   \\r
114                                                                         (i * (SEN_EX_SIZEOF_LENGTH_PACKET + SEN_EX_SIZEOF_ONE_PACKET)))))\r
115 #define SEN_LEFT_FLAG(buf)                      SEN_SIZE_OF_PACKET(buf, SEN_MAX_PACKET_EXCHANGE)\r
116 \r
117 \r
118 \r
119 // デバイスドライバとしてコンパイルする際に必要な定義\r
120 #ifdef  SEN_DEVICE_DRIVER\r
121 \r
122 // OS 判定\r
123 #ifdef  WIN32\r
124 #define OS_WIN32        // Microsoft Windows\r
125 #else\r
126 #define OS_UNIX         // UNIX / Linux\r
127 #endif\r
128 \r
129 \r
130 // 型宣言\r
131 #ifndef WINDOWS_H_INCLUDED\r
132 #ifndef WIN9X\r
133 typedef unsigned long           BOOL;\r
134 #endif  // WIN9X\r
135 #define TRUE                            1\r
136 #define FALSE                           0\r
137 #endif\r
138 typedef unsigned long           bool;\r
139 #define true                            1\r
140 #define false                           0\r
141 typedef unsigned long long      UINT64;\r
142 typedef signed long long        INT64;\r
143 typedef unsigned short          WORD;\r
144 typedef unsigned short          USHORT;\r
145 typedef signed short            SHORT;\r
146 typedef unsigned char           BYTE;\r
147 typedef unsigned char           UCHAR;\r
148 typedef signed char                     CHAR;\r
149 typedef unsigned long           DWORD;\r
150 #define INFINITE                        0xFFFFFFFF\r
151 \r
152 #define LESS(a, max_value)      ((a) < (max_value) ? (a) : (max_value))\r
153 #define MORE(a, min_value)      ((a) > (min_value) ? (a) : (min_value))\r
154 #define INNER(a, b, c)          (((b) <= (c) && (a) >= (b) && (a) <= (c)) || ((b) >= (c) && (a) >= (c) && (a) <= (b)))\r
155 #define OUTER(a, b, c)          (!INNER((a), (b), (c)))\r
156 #define MAKESURE(a, b, c)               (((b) <= (c)) ? (MORE(LESS((a), (c)), (b))) : (MORE(LESS((a), (b)), (c))))\r
157 #define MIN(a, b)                       ((a) >= (b) ? (b) : (a))\r
158 #define MAX(a, b)                       ((a) >= (b) ? (a) : (b))\r
159 \r
160 #ifdef  OS_WIN32\r
161 // NDIS 5.0 関係\r
162 #include "NDIS5.h"\r
163 #endif  // OS_WIN32\r
164 \r
165 // ロック\r
166 typedef struct _SEN_LOCK\r
167 {\r
168 #ifdef  OS_WIN32\r
169         NDIS_SPIN_LOCK spin_lock;\r
170 #endif\r
171 } SEN_LOCK;\r
172 \r
173 // イベント\r
174 typedef struct _SEN_EVENT\r
175 {\r
176 #ifdef  OS_WIN32\r
177 #ifndef WIN9X\r
178         KEVENT *event;\r
179         HANDLE event_handle;\r
180 #else   // WIN9X\r
181         DWORD win32_event;\r
182 #endif  // WIN9X\r
183 #endif\r
184 } SEN_EVENT;\r
185 \r
186 // パケットキュー\r
187 typedef struct _SEN_QUEUE\r
188 {\r
189         struct _SEN_QUEUE *Next;\r
190         UINT Size;\r
191         void *Buf;\r
192 } SEN_QUEUE;\r
193 \r
194 // ステータス\r
195 typedef struct _SEN_STATUS\r
196 {\r
197         UINT NumPacketSend;\r
198         UINT NumPacketRecv;\r
199         UINT NumPacketSendError;\r
200         UINT NumPacketRecvError;\r
201         UINT NumPacketRecvNoBuffer;\r
202 } SEN_STATUS;\r
203 \r
204 // NDIS パケットバッファ\r
205 typedef struct _PACKET_BUFFER\r
206 {\r
207         void *Buf;                                                      // バッファ\r
208         NDIS_PACKET *NdisPacket;                        // NDIS パケット\r
209         NDIS_BUFFER *NdisBuffer;                        // NDIS パケットバッファ\r
210         NDIS_HANDLE PacketPool;                         // パケットプール\r
211         NDIS_HANDLE BufferPool;                         // バッファプール\r
212 } PACKET_BUFFER;\r
213 \r
214 // コンテキスト\r
215 typedef struct _SEN_CTX\r
216 {\r
217         SEN_EVENT *Event;                                       // パケット受信通知イベント\r
218         BOOL Opened;                                            // Open されているか否かのフラグ\r
219         BOOL Inited;                                            // 初期化フラグ\r
220         BOOL Initing;                                           // 起動中フラグ\r
221         volatile BOOL Halting;                          // 停止中フラグ\r
222         BYTE MacAddress[6];                                     // MAC アドレス\r
223         BYTE padding[2];                                        // padding\r
224         SEN_QUEUE *PacketQueue;                         // 送信パケットキュー\r
225         SEN_QUEUE *Tail;                                        // 送信パケットキューの末尾\r
226         UINT NumPacketQueue;                            // パケットキュー数\r
227         SEN_LOCK *PacketQueueLock;                      // 送信パケットキュー用ロック\r
228         SEN_STATUS Status;                                      // ステータス\r
229         BOOL Connected, ConnectedOld;           // ケーブル接続状態\r
230         BOOL ConnectedForce;                            // 接続状態強制通知\r
231 #ifdef  OS_WIN32\r
232         NDIS_HANDLE NdisWrapper;                        // NDIS ラッパーハンドル\r
233         NDIS_HANDLE NdisControl;                        // NDIS コントロールハンドル\r
234         NDIS_HANDLE NdisMiniport;                       // NDIS ミニポートハンドル\r
235         NDIS_HANDLE NdisContext;                        // NDIS コンテキストハンドル\r
236         NDIS_HANDLE NdisConfig;                         // NDIS Config ハンドル\r
237         DEVICE_OBJECT *NdisControlDevice;       // NDIS コントロールデバイス\r
238         PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION];\r
239         PACKET_BUFFER *PacketBuffer[SEN_MAX_PACKET_EXCHANGE];           // NDIS パケットバッファ\r
240         NDIS_PACKET *PacketBufferArray[SEN_MAX_PACKET_EXCHANGE];        // NDIS パケットバッファ配列\r
241         NDIS_HARDWARE_STATUS HardwareStatus;    // ハードウェア状態\r
242         char HardwareID[MAX_SIZE];                      // ハードウェア ID\r
243         char HardwareID_Raw[MAX_SIZE];          // 元のハードウェア ID\r
244         char HardwarePrintableID[MAX_SIZE];     // ハードウェア ID (表示用)\r
245 #endif\r
246 } SEN_CTX;\r
247 \r
248 extern SEN_CTX *ctx;\r
249 \r
250 \r
251 // Sen.c ルーチン\r
252 void SenNewStatus(SEN_STATUS *s);\r
253 void SenFreeStatus(SEN_STATUS *s);\r
254 BOOL SenInit();\r
255 void SenShutdown();\r
256 void SenInitPacketQueue();\r
257 void SenFreePacketQueue();\r
258 void SenClearPacketQueue();\r
259 void SenLockPacketQueue();\r
260 void SenUnlockPacketQueue();\r
261 SEN_QUEUE *SenGetNextQueue();\r
262 void SenFreeQueue(SEN_QUEUE *q);\r
263 void SenInsertQueue(void *buf, UINT size);\r
264 UINT SenGetNumQueue();\r
265 void SenStartAdapter();\r
266 void SenStopAdapter();\r
267 void SenRead(void *buf);\r
268 void SenWrite(void *buf);\r
269 \r
270 // 共通ルーチン (プラットフォーム依存)\r
271 void *SenMalloc(UINT size);\r
272 void *SenZeroMalloc(UINT size);\r
273 void SenFree(void *p);\r
274 void SenCopy(void *dst, void *src, UINT size);\r
275 void SenZero(void *dst, UINT size);\r
276 SEN_LOCK *SenNewLock();\r
277 void SenLock(SEN_LOCK *lock);\r
278 void SenUnlock(SEN_LOCK *lock);\r
279 void SenFreeLock(SEN_LOCK *lock);\r
280 SEN_EVENT *SenNewEvent(char *name);\r
281 SEN_EVENT *SenCreateWin9xEvent(DWORD h);\r
282 void SenFreeEvent(SEN_EVENT *event);\r
283 void SenSet(SEN_EVENT *event);\r
284 void SenReset(SEN_EVENT *event);\r
285 BOOL SenIsKernelAddress(void *addr);\r
286 \r
287 #endif  // SEN_DEVICE_DRIVER\r
288 \r
289 \r
290 #endif  // SEN_H\r
291 \r
292 \r
293 \r