* 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
diff --git a/utvpn/utvpn-unix-v101-7101-public/src/Sen/Sen.h b/utvpn/utvpn-unix-v101-7101-public/src/Sen/Sen.h
new file mode 100644 (file)
index 0000000..55cee93
--- /dev/null
@@ -0,0 +1,293 @@
+// SoftEther UT-VPN SourceCode\r
+// \r
+// Copyright (C) 2004-2010 SoftEther Corporation.\r
+// Copyright (C) 2004-2010 University of Tsukuba.\r
+// Copyright (C) 2003-2010 Daiyuu Nobori.\r
+// All Rights Reserved.\r
+// \r
+// http://utvpn.tsukuba.ac.jp/\r
+// \r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+// \r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+// GNU General Public License for more details.\r
+// \r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+// \r
+// このファイルは GPL バージョン 2 ライセンスで公開されています。\r
+// 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布\r
+// することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示\r
+// を除去することはできません。改変した著作物を配布する場合は、改変実施者の\r
+// 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。\r
+// \r
+// この SoftEther UT-VPN オープンソース・プロジェクトは、\r
+// ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )\r
+// および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって\r
+// ホストされています。\r
+// SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に\r
+// あります。\r
+// 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード\r
+// の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して\r
+// いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して\r
+// ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース\r
+// に組み込みさせていただきます。\r
+// \r
+// 本ソフトウェアを本オープンソース・プロジェクトの運営主体以外が改変した場合、\r
+// それを複製、配布、販売することは GPL ライセンスに基づいて可能ですが、\r
+// その場合、"SoftEther UT-VPN" の名前を勝手に騙り使用することはできません。\r
+// 事前にソフトイーサ株式会社に許諾を求めるか、または、別の名称として\r
+// ソフトウェアを配布、販売してください。\r
+// \r
+// GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
+// 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
+// \r
+// 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
+// (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
+// ソフトイーサ株式会社はこれらの権利を放棄していません。本ソフトウェアの\r
+// 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
+// ください。\r
+// \r
+// 不明な点は、ソフトイーサ株式会社までご連絡ください。\r
+// 連絡先: http://www.softether.co.jp/jp/contact/\r
+\r
+// -----------------------------------------------\r
+// [ChangeLog]\r
+// 2010.05.20\r
+//  新規リリース by SoftEther\r
+// -----------------------------------------------\r
+\r
+/*\r
+**   File Name: Sen.h\r
+** Description: Sen.c のヘッダ\r
+*/\r
+\r
+#ifndef        SEN_H\r
+#define        SEN_H\r
+\r
+\r
+// 識別文字列 (NDIS)\r
+#define        NDIS_SEN_HARDWARE_ID                            "VPN Client Adapter - %s"\r
+#define        NDIS_SEN_DEVICE_NAME                            "\\Device\\SEN_%s_DEVICE"\r
+#define        NDIS_SEN_DEVICE_NAME_WIN32                      "\\DosDevices\\SEN_%s_DEVICE"\r
+#define        NDIS_SEN_DEVICE_FILE_NAME                       "\\\\.\\SEN_SENADAPTER_%s_DEVICE"\r
+#define        NDIS_SEN_EVENT_NAME                                     "\\BaseNamedObjects\\SEN_EVENT_%s"\r
+#define        NDIS_SEN_EVENT_NAME_WIN32                       "Global\\SEN_EVENT_SENADAPTER_%s"\r
+\r
+// 定数\r
+#define        SEN_MAX_PACKET_SIZE                     1560\r
+#define        SEN_MAX_PACKET_SIZE_ANNOUNCE    1514\r
+#define        SEN_MIN_PACKET_SIZE                     14\r
+#define        SEN_PACKET_HEADER_SIZE          14\r
+#define        SEN_MAX_FRAME_SIZE                      (SEN_MAX_PACKET_SIZE - SEN_MIN_PACKET_SIZE)\r
+#define        SEN_MAX_SPEED_DEFAULT           1000000\r
+#define        SEN_MAC_ADDRESS_SIZE            6\r
+#define        SEN_MAX_MULTICASE                       32\r
+\r
+\r
+// IOCTL 定数\r
+#define        SEN_IOCTL_SET_EVENT                     CTL_CODE(0x8000, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)\r
+#define        SEN_IOCTL_PUT_PACKET            CTL_CODE(0x8000, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)\r
+#define        SEN_IOCTL_GET_PACKET            CTL_CODE(0x8000, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)\r
+\r
+\r
+// パケットデータ交換関係\r
+#define        SEN_MAX_PACKET_EXCHANGE         256                     // 一度に交換できるパケット数\r
+#define        SEN_MAX_PACKET_QUEUED           4096            // キューに入れることができるパケット数\r
+#define        SEN_EX_SIZEOF_NUM_PACKET        4                       // パケット数データ (UINT)\r
+#define        SEN_EX_SIZEOF_LENGTH_PACKET     4                       // パケットデータの長さデータ (UINT)\r
+#define        SEN_EX_SIZEOF_LEFT_FLAG         4                       // まだパケットが残っていることを示すフラグ\r
+#define        SEN_EX_SIZEOF_ONE_PACKET        1600            // 1 つのパケットデータが占有するデータ領域\r
+#define        SEN_EXCHANGE_BUFFER_SIZE        (SEN_EX_SIZEOF_NUM_PACKET + SEN_EX_SIZEOF_LEFT_FLAG +   \\r
+       (SEN_EX_SIZEOF_LENGTH_PACKET + SEN_EX_SIZEOF_ONE_PACKET) * (SEN_MAX_PACKET_EXCHANGE + 1))\r
+#define        SEN_NUM_PACKET(buf)                     (*((UINT *)((UCHAR *)buf + 0)))\r
+#define        SEN_SIZE_OF_PACKET(buf, i)      (*((UINT *)((UCHAR *)buf + SEN_EX_SIZEOF_NUM_PACKET + \\r
+                                                                       (i * (SEN_EX_SIZEOF_LENGTH_PACKET + SEN_EX_SIZEOF_ONE_PACKET)))))\r
+#define        SEN_ADDR_OF_PACKET(buf, i)      (((UINT *)((UCHAR *)buf + SEN_EX_SIZEOF_NUM_PACKET + \\r
+                                                                       SEN_EX_SIZEOF_LENGTH_PACKET +   \\r
+                                                                       (i * (SEN_EX_SIZEOF_LENGTH_PACKET + SEN_EX_SIZEOF_ONE_PACKET)))))\r
+#define        SEN_LEFT_FLAG(buf)                      SEN_SIZE_OF_PACKET(buf, SEN_MAX_PACKET_EXCHANGE)\r
+\r
+\r
+\r
+// デバイスドライバとしてコンパイルする際に必要な定義\r
+#ifdef SEN_DEVICE_DRIVER\r
+\r
+// OS 判定\r
+#ifdef WIN32\r
+#define        OS_WIN32        // Microsoft Windows\r
+#else\r
+#define        OS_UNIX         // UNIX / Linux\r
+#endif\r
+\r
+\r
+// 型宣言\r
+#ifndef        WINDOWS_H_INCLUDED\r
+#ifndef        WIN9X\r
+typedef        unsigned long           BOOL;\r
+#endif // WIN9X\r
+#define        TRUE                            1\r
+#define        FALSE                           0\r
+#endif\r
+typedef        unsigned long           bool;\r
+#define        true                            1\r
+#define        false                           0\r
+typedef        unsigned long long      UINT64;\r
+typedef        signed long long        INT64;\r
+typedef        unsigned short          WORD;\r
+typedef        unsigned short          USHORT;\r
+typedef        signed short            SHORT;\r
+typedef        unsigned char           BYTE;\r
+typedef        unsigned char           UCHAR;\r
+typedef signed char                    CHAR;\r
+typedef        unsigned long           DWORD;\r
+#define        INFINITE                        0xFFFFFFFF\r
+\r
+#define        LESS(a, max_value)      ((a) < (max_value) ? (a) : (max_value))\r
+#define        MORE(a, min_value)      ((a) > (min_value) ? (a) : (min_value))\r
+#define        INNER(a, b, c)          (((b) <= (c) && (a) >= (b) && (a) <= (c)) || ((b) >= (c) && (a) >= (c) && (a) <= (b)))\r
+#define        OUTER(a, b, c)          (!INNER((a), (b), (c)))\r
+#define        MAKESURE(a, b, c)               (((b) <= (c)) ? (MORE(LESS((a), (c)), (b))) : (MORE(LESS((a), (b)), (c))))\r
+#define        MIN(a, b)                       ((a) >= (b) ? (b) : (a))\r
+#define        MAX(a, b)                       ((a) >= (b) ? (a) : (b))\r
+\r
+#ifdef OS_WIN32\r
+// NDIS 5.0 関係\r
+#include "NDIS5.h"\r
+#endif // OS_WIN32\r
+\r
+// ロック\r
+typedef struct _SEN_LOCK\r
+{\r
+#ifdef OS_WIN32\r
+       NDIS_SPIN_LOCK spin_lock;\r
+#endif\r
+} SEN_LOCK;\r
+\r
+// イベント\r
+typedef struct _SEN_EVENT\r
+{\r
+#ifdef OS_WIN32\r
+#ifndef        WIN9X\r
+       KEVENT *event;\r
+       HANDLE event_handle;\r
+#else  // WIN9X\r
+       DWORD win32_event;\r
+#endif // WIN9X\r
+#endif\r
+} SEN_EVENT;\r
+\r
+// パケットキュー\r
+typedef struct _SEN_QUEUE\r
+{\r
+       struct _SEN_QUEUE *Next;\r
+       UINT Size;\r
+       void *Buf;\r
+} SEN_QUEUE;\r
+\r
+// ステータス\r
+typedef struct _SEN_STATUS\r
+{\r
+       UINT NumPacketSend;\r
+       UINT NumPacketRecv;\r
+       UINT NumPacketSendError;\r
+       UINT NumPacketRecvError;\r
+       UINT NumPacketRecvNoBuffer;\r
+} SEN_STATUS;\r
+\r
+// NDIS パケットバッファ\r
+typedef struct _PACKET_BUFFER\r
+{\r
+       void *Buf;                                                      // バッファ\r
+       NDIS_PACKET *NdisPacket;                        // NDIS パケット\r
+       NDIS_BUFFER *NdisBuffer;                        // NDIS パケットバッファ\r
+       NDIS_HANDLE PacketPool;                         // パケットプール\r
+       NDIS_HANDLE BufferPool;                         // バッファプール\r
+} PACKET_BUFFER;\r
+\r
+// コンテキスト\r
+typedef struct _SEN_CTX\r
+{\r
+       SEN_EVENT *Event;                                       // パケット受信通知イベント\r
+       BOOL Opened;                                            // Open されているか否かのフラグ\r
+       BOOL Inited;                                            // 初期化フラグ\r
+       BOOL Initing;                                           // 起動中フラグ\r
+       volatile BOOL Halting;                          // 停止中フラグ\r
+       BYTE MacAddress[6];                                     // MAC アドレス\r
+       BYTE padding[2];                                        // padding\r
+       SEN_QUEUE *PacketQueue;                         // 送信パケットキュー\r
+       SEN_QUEUE *Tail;                                        // 送信パケットキューの末尾\r
+       UINT NumPacketQueue;                            // パケットキュー数\r
+       SEN_LOCK *PacketQueueLock;                      // 送信パケットキュー用ロック\r
+       SEN_STATUS Status;                                      // ステータス\r
+       BOOL Connected, ConnectedOld;           // ケーブル接続状態\r
+       BOOL ConnectedForce;                            // 接続状態強制通知\r
+#ifdef OS_WIN32\r
+       NDIS_HANDLE NdisWrapper;                        // NDIS ラッパーハンドル\r
+       NDIS_HANDLE NdisControl;                        // NDIS コントロールハンドル\r
+       NDIS_HANDLE NdisMiniport;                       // NDIS ミニポートハンドル\r
+       NDIS_HANDLE NdisContext;                        // NDIS コンテキストハンドル\r
+       NDIS_HANDLE NdisConfig;                         // NDIS Config ハンドル\r
+       DEVICE_OBJECT *NdisControlDevice;       // NDIS コントロールデバイス\r
+       PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION];\r
+       PACKET_BUFFER *PacketBuffer[SEN_MAX_PACKET_EXCHANGE];           // NDIS パケットバッファ\r
+       NDIS_PACKET *PacketBufferArray[SEN_MAX_PACKET_EXCHANGE];        // NDIS パケットバッファ配列\r
+       NDIS_HARDWARE_STATUS HardwareStatus;    // ハードウェア状態\r
+       char HardwareID[MAX_SIZE];                      // ハードウェア ID\r
+       char HardwareID_Raw[MAX_SIZE];          // 元のハードウェア ID\r
+       char HardwarePrintableID[MAX_SIZE];     // ハードウェア ID (表示用)\r
+#endif\r
+} SEN_CTX;\r
+\r
+extern SEN_CTX *ctx;\r
+\r
+\r
+// Sen.c ルーチン\r
+void SenNewStatus(SEN_STATUS *s);\r
+void SenFreeStatus(SEN_STATUS *s);\r
+BOOL SenInit();\r
+void SenShutdown();\r
+void SenInitPacketQueue();\r
+void SenFreePacketQueue();\r
+void SenClearPacketQueue();\r
+void SenLockPacketQueue();\r
+void SenUnlockPacketQueue();\r
+SEN_QUEUE *SenGetNextQueue();\r
+void SenFreeQueue(SEN_QUEUE *q);\r
+void SenInsertQueue(void *buf, UINT size);\r
+UINT SenGetNumQueue();\r
+void SenStartAdapter();\r
+void SenStopAdapter();\r
+void SenRead(void *buf);\r
+void SenWrite(void *buf);\r
+\r
+// 共通ルーチン (プラットフォーム依存)\r
+void *SenMalloc(UINT size);\r
+void *SenZeroMalloc(UINT size);\r
+void SenFree(void *p);\r
+void SenCopy(void *dst, void *src, UINT size);\r
+void SenZero(void *dst, UINT size);\r
+SEN_LOCK *SenNewLock();\r
+void SenLock(SEN_LOCK *lock);\r
+void SenUnlock(SEN_LOCK *lock);\r
+void SenFreeLock(SEN_LOCK *lock);\r
+SEN_EVENT *SenNewEvent(char *name);\r
+SEN_EVENT *SenCreateWin9xEvent(DWORD h);\r
+void SenFreeEvent(SEN_EVENT *event);\r
+void SenSet(SEN_EVENT *event);\r
+void SenReset(SEN_EVENT *event);\r
+BOOL SenIsKernelAddress(void *addr);\r
+\r
+#endif // SEN_DEVICE_DRIVER\r
+\r
+\r
+#endif // SEN_H\r
+\r
+\r
+\r