* copy vendor drop to trunk
[lab.git] / Dev / utvpn / utvpn-unix-v101-7101-public / src / Cedar / NullLan.c
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 // NullLan.c\r
79 // テスト用仮想 LAN カードデバイスドライバ\r
80 \r
81 #include "CedarPch.h"\r
82 \r
83 static UCHAR null_lan_broadcast_address[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\r
84 \r
85 // パケットアダプタの取得\r
86 PACKET_ADAPTER *NullGetPacketAdapter()\r
87 {\r
88         PACKET_ADAPTER *pa = NewPacketAdapter(NullPaInit, NullPaGetCancel, NullPaGetNextPacket,\r
89                 NullPaPutPacket, NullPaFree);\r
90 \r
91         return pa;\r
92 }\r
93 \r
94 // パケット生成スレッド\r
95 void NullPacketGenerateThread(THREAD *t, void *param)\r
96 {\r
97         NULL_LAN *n = (NULL_LAN *)param;\r
98         // 引数チェック\r
99         if (t == NULL || param == NULL)\r
100         {\r
101                 return;\r
102         }\r
103 \r
104         while (true)\r
105         {\r
106                 Wait(n->Event, Rand32() % NULL_PACKET_GENERATE_INTERVAL);\r
107                 if (n->Halt)\r
108                 {\r
109                         break;\r
110                 }\r
111 \r
112                 LockQueue(n->PacketQueue);\r
113                 {\r
114                         UCHAR *data;\r
115                         BLOCK *b;\r
116                         UINT size = Rand32() % 1500 + 14;\r
117                         data = Malloc(size);\r
118                         Copy(data, null_lan_broadcast_address, 6);\r
119                         Copy(data + 6, n->MacAddr, 6);\r
120                         b = NewBlock(data, size, 0);\r
121                         InsertQueue(n->PacketQueue, b);\r
122                 }\r
123                 UnlockQueue(n->PacketQueue);\r
124                 Cancel(n->Cancel);\r
125         }\r
126 }\r
127 \r
128 // パケットアダプタの初期化\r
129 bool NullPaInit(SESSION *s)\r
130 {\r
131         NULL_LAN *n;\r
132         // 引数チェック\r
133         if (s == NULL)\r
134         {\r
135                 return false;\r
136         }\r
137 \r
138         n = ZeroMalloc(sizeof(NULL_LAN));\r
139         s->PacketAdapter->Param = (void *)n;\r
140 \r
141         n->Cancel = NewCancel();\r
142         n->PacketQueue = NewQueue();\r
143         n->Event = NewEvent();\r
144 \r
145         GenMacAddress(n->MacAddr);\r
146 \r
147         n->PacketGeneratorThread = NewThread(NullPacketGenerateThread, n);\r
148 \r
149         return true;\r
150 }\r
151 \r
152 // キャンセルオブジェクトの取得\r
153 CANCEL *NullPaGetCancel(SESSION *s)\r
154 {\r
155         // 引数チェック\r
156         NULL_LAN *n;\r
157         if (s == NULL || (n = s->PacketAdapter->Param) == NULL)\r
158         {\r
159                 return NULL;\r
160         }\r
161 \r
162         AddRef(n->Cancel->ref);\r
163 \r
164         return n->Cancel;\r
165 }\r
166 \r
167 // 次のパケットを取得\r
168 UINT NullPaGetNextPacket(SESSION *s, void **data)\r
169 {\r
170         UINT size = 0;\r
171         // 引数チェック\r
172         NULL_LAN *n;\r
173         if (s == NULL || (n = s->PacketAdapter->Param) == NULL)\r
174         {\r
175                 return INFINITE;\r
176         }\r
177 \r
178         LockQueue(n->PacketQueue);\r
179         {\r
180                 BLOCK *b = GetNext(n->PacketQueue);\r
181 \r
182                 if (b != NULL)\r
183                 {\r
184                         *data = b->Buf;\r
185                         size = b->Size;\r
186                         Free(b);\r
187                 }\r
188         }\r
189         UnlockQueue(n->PacketQueue);\r
190 \r
191         return size;\r
192 }\r
193 \r
194 // パケットを書き込み\r
195 bool NullPaPutPacket(SESSION *s, void *data, UINT size)\r
196 {\r
197         // 引数チェック\r
198         if (s == NULL)\r
199         {\r
200                 return false;\r
201         }\r
202         if (data == NULL)\r
203         {\r
204                 return true;\r
205         }\r
206 \r
207         // パケット無視\r
208         Free(data);\r
209 \r
210         return true;\r
211 }\r
212 \r
213 // 解放\r
214 void NullPaFree(SESSION *s)\r
215 {\r
216         // 引数チェック\r
217         NULL_LAN *n;\r
218         BLOCK *b;\r
219         if (s == NULL || (n = s->PacketAdapter->Param) == NULL)\r
220         {\r
221                 return;\r
222         }\r
223 \r
224         n->Halt = true;\r
225         Set(n->Event);\r
226 \r
227         WaitThread(n->PacketGeneratorThread, INFINITE);\r
228         ReleaseThread(n->PacketGeneratorThread);\r
229 \r
230         LockQueue(n->PacketQueue);\r
231         {\r
232                 while (b = GetNext(n->PacketQueue))\r
233                 {\r
234                         FreeBlock(b);\r
235                 }\r
236         }\r
237         UnlockQueue(n->PacketQueue);\r
238 \r
239         ReleaseQueue(n->PacketQueue);\r
240 \r
241         ReleaseCancel(n->Cancel);\r
242 \r
243         ReleaseEvent(n->Event);\r
244 \r
245         s->PacketAdapter->Param = NULL;\r
246         Free(n);\r
247 }\r
248 \r
249 \r