* tar xzf utvpn-src-unix-v101-7101-public-2010.06.27.tar.gz
[lab.git] / utvpn / utvpn-unix-v101-7101-public / src / Cedar / NullLan.c
diff --git a/utvpn/utvpn-unix-v101-7101-public/src/Cedar/NullLan.c b/utvpn/utvpn-unix-v101-7101-public/src/Cedar/NullLan.c
new file mode 100644 (file)
index 0000000..a974549
--- /dev/null
@@ -0,0 +1,249 @@
+// SoftEther UT-VPN SourceCode\r
+// \r
+// Copyright (C) 2004-2010 SoftEther Corporation.\r
+// Copyright (C) 2004-2010 University of Tsukuba, Japan.\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
+// version 2 as published by the Free Software Foundation.\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 version 2\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
+// 本プログラムの配布者は、本プログラムを、業としての利用以外のため、\r
+// および、試験または研究のために利用が行われることを想定して配布\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
+// GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
+// 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
+// \r
+// 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
+// (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
+// ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの\r
+// 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
+// ください。\r
+// \r
+// お願い: どのような通信ソフトウェアにも通常は必ず未発見の\r
+// セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、\r
+// UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの\r
+// 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社\r
+// および脆弱性情報の届出を受け付ける公的機関まで通報いただき、\r
+// 公益保護にご協力いただきますようお願い申し上げます。\r
+// \r
+// ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を\r
+// 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客\r
+// を保護するための努力を行います。\r
+// \r
+// ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/\r
+// 日本国内の脆弱性情報届出受付公的機関:\r
+//         独立行政法人 情報処理推進機構\r
+//         http://www.ipa.go.jp/security/vuln/report/\r
+// \r
+// 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。\r
+// 連絡先: http://www.softether.co.jp/jp/contact/\r
+\r
+// -----------------------------------------------\r
+// [ChangeLog]\r
+// 2010.05.20\r
+//  新規リリース by SoftEther\r
+// -----------------------------------------------\r
+\r
+// NullLan.c\r
+// テスト用仮想 LAN カードデバイスドライバ\r
+\r
+#include "CedarPch.h"\r
+\r
+static UCHAR null_lan_broadcast_address[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\r
+\r
+// パケットアダプタの取得\r
+PACKET_ADAPTER *NullGetPacketAdapter()\r
+{\r
+       PACKET_ADAPTER *pa = NewPacketAdapter(NullPaInit, NullPaGetCancel, NullPaGetNextPacket,\r
+               NullPaPutPacket, NullPaFree);\r
+\r
+       return pa;\r
+}\r
+\r
+// パケット生成スレッド\r
+void NullPacketGenerateThread(THREAD *t, void *param)\r
+{\r
+       NULL_LAN *n = (NULL_LAN *)param;\r
+       // 引数チェック\r
+       if (t == NULL || param == NULL)\r
+       {\r
+               return;\r
+       }\r
+\r
+       while (true)\r
+       {\r
+               Wait(n->Event, Rand32() % NULL_PACKET_GENERATE_INTERVAL);\r
+               if (n->Halt)\r
+               {\r
+                       break;\r
+               }\r
+\r
+               LockQueue(n->PacketQueue);\r
+               {\r
+                       UCHAR *data;\r
+                       BLOCK *b;\r
+                       UINT size = Rand32() % 1500 + 14;\r
+                       data = Malloc(size);\r
+                       Copy(data, null_lan_broadcast_address, 6);\r
+                       Copy(data + 6, n->MacAddr, 6);\r
+                       b = NewBlock(data, size, 0);\r
+                       InsertQueue(n->PacketQueue, b);\r
+               }\r
+               UnlockQueue(n->PacketQueue);\r
+               Cancel(n->Cancel);\r
+       }\r
+}\r
+\r
+// パケットアダプタの初期化\r
+bool NullPaInit(SESSION *s)\r
+{\r
+       NULL_LAN *n;\r
+       // 引数チェック\r
+       if (s == NULL)\r
+       {\r
+               return false;\r
+       }\r
+\r
+       n = ZeroMalloc(sizeof(NULL_LAN));\r
+       s->PacketAdapter->Param = (void *)n;\r
+\r
+       n->Cancel = NewCancel();\r
+       n->PacketQueue = NewQueue();\r
+       n->Event = NewEvent();\r
+\r
+       GenMacAddress(n->MacAddr);\r
+\r
+       n->PacketGeneratorThread = NewThread(NullPacketGenerateThread, n);\r
+\r
+       return true;\r
+}\r
+\r
+// キャンセルオブジェクトの取得\r
+CANCEL *NullPaGetCancel(SESSION *s)\r
+{\r
+       // 引数チェック\r
+       NULL_LAN *n;\r
+       if (s == NULL || (n = s->PacketAdapter->Param) == NULL)\r
+       {\r
+               return NULL;\r
+       }\r
+\r
+       AddRef(n->Cancel->ref);\r
+\r
+       return n->Cancel;\r
+}\r
+\r
+// 次のパケットを取得\r
+UINT NullPaGetNextPacket(SESSION *s, void **data)\r
+{\r
+       UINT size = 0;\r
+       // 引数チェック\r
+       NULL_LAN *n;\r
+       if (s == NULL || (n = s->PacketAdapter->Param) == NULL)\r
+       {\r
+               return INFINITE;\r
+       }\r
+\r
+       LockQueue(n->PacketQueue);\r
+       {\r
+               BLOCK *b = GetNext(n->PacketQueue);\r
+\r
+               if (b != NULL)\r
+               {\r
+                       *data = b->Buf;\r
+                       size = b->Size;\r
+                       Free(b);\r
+               }\r
+       }\r
+       UnlockQueue(n->PacketQueue);\r
+\r
+       return size;\r
+}\r
+\r
+// パケットを書き込み\r
+bool NullPaPutPacket(SESSION *s, void *data, UINT size)\r
+{\r
+       // 引数チェック\r
+       if (s == NULL)\r
+       {\r
+               return false;\r
+       }\r
+       if (data == NULL)\r
+       {\r
+               return true;\r
+       }\r
+\r
+       // パケット無視\r
+       Free(data);\r
+\r
+       return true;\r
+}\r
+\r
+// 解放\r
+void NullPaFree(SESSION *s)\r
+{\r
+       // 引数チェック\r
+       NULL_LAN *n;\r
+       BLOCK *b;\r
+       if (s == NULL || (n = s->PacketAdapter->Param) == NULL)\r
+       {\r
+               return;\r
+       }\r
+\r
+       n->Halt = true;\r
+       Set(n->Event);\r
+\r
+       WaitThread(n->PacketGeneratorThread, INFINITE);\r
+       ReleaseThread(n->PacketGeneratorThread);\r
+\r
+       LockQueue(n->PacketQueue);\r
+       {\r
+               while (b = GetNext(n->PacketQueue))\r
+               {\r
+                       FreeBlock(b);\r
+               }\r
+       }\r
+       UnlockQueue(n->PacketQueue);\r
+\r
+       ReleaseQueue(n->PacketQueue);\r
+\r
+       ReleaseCancel(n->Cancel);\r
+\r
+       ReleaseEvent(n->Event);\r
+\r
+       s->PacketAdapter->Param = NULL;\r
+       Free(n);\r
+}\r
+\r
+\r