1 // SoftEther UT-VPN SourceCode
\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
8 // http://utvpn.tsukuba.ac.jp/
\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
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
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
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。
\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布
\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示
\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の
\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。
\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
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、
\r
34 // および、試験または研究のために利用が行われることを想定して配布
\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に
\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード
\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して
\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して
\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース
\r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する
\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。
\r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社
\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。
\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの
\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意
\r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の
\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、
\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの
\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社
\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、
\r
58 // 公益保護にご協力いただきますようお願い申し上げます。
\r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を
\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客
\r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/
\r
65 // 日本国内の脆弱性情報届出受付公的機関:
\r
67 // http://www.ipa.go.jp/security/vuln/report/
\r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。
\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/
\r
72 // -----------------------------------------------
\r
75 // 新規リリース by SoftEther
\r
76 // -----------------------------------------------
\r
79 // Ethernet ブリッジプログラム
\r
90 #include "BridgeWin32.c"
\r
95 #include "BridgeUnix.c"
\r
99 // 現在の Ethernet デバイス一覧をハッシュする
\r
100 UINT GetEthDeviceHash()
\r
107 UCHAR hash[SHA1_SIZE];
\r
108 TOKEN_LIST *t = GetEthList();
\r
110 num = t->NumTokens;
\r
112 for (i = 0;i < t->NumTokens;i++)
\r
114 StrCat(tmp, sizeof(tmp), t->Token[i]);
\r
118 Hash(hash, tmp, StrLen(tmp), true);
\r
120 Copy(&num, hash, sizeof(UINT));
\r
126 MS_ADAPTER_LIST *a = MsCreateAdapterListEx(true);
\r
130 UCHAR hash[SHA1_SIZE];
\r
135 for (i = 0;i < a->Num;i++)
\r
137 StrCat(tmp, sizeof(tmp), a->Adapters[i]->Title);
\r
140 MsFreeAdapterList(a);
\r
142 Hash(hash, tmp, StrLen(tmp), true);
\r
144 Copy(&num, hash, sizeof(UINT));
\r
150 // WinPcap が必要かどうか取得する
\r
151 bool IsNeedWinPcap()
\r
153 if (IsBridgeSupported() == false)
\r
161 if (IsEthSupported())
\r
163 // すでに Ethernet デバイスへのアクセスに成功している
\r
168 // Ethernet デバイスへのアクセスに失敗している
\r
174 // 現在の OS でブリッジがサポートされているかどうか取得する
\r
175 bool IsBridgeSupported()
\r
177 UINT type = GetOsInfo()->OsType;
\r
179 if (OS_IS_WINDOWS(type))
\r
185 return IsEthSupported();
\r
190 bool DeleteLocalBridge(CEDAR *c, char *hubname, char *devicename)
\r
194 if (c == NULL || hubname == NULL || devicename == NULL)
\r
199 LockList(c->HubList);
\r
201 LockList(c->LocalBridgeList);
\r
205 for (i = 0;i < LIST_NUM(c->LocalBridgeList);i++)
\r
207 LOCALBRIDGE *br = LIST_DATA(c->LocalBridgeList, i);
\r
209 if (StrCmpi(br->HubName, hubname) == 0)
\r
211 if (StrCmpi(br->DeviceName, devicename) == 0)
\r
213 if (br->Bridge != NULL)
\r
215 BrFreeBridge(br->Bridge);
\r
219 Delete(c->LocalBridgeList, br);
\r
228 UnlockList(c->LocalBridgeList);
\r
230 UnlockList(c->HubList);
\r
236 void AddLocalBridge(CEDAR *c, char *hubname, char *devicename, bool local, bool monitor, bool tapmode, char *tapaddr, bool fullbcast)
\r
240 LOCALBRIDGE *br = NULL;
\r
242 if (c == NULL || hubname == NULL || devicename == NULL)
\r
247 if (OS_IS_UNIX(GetOsInfo()->OsType) == false)
\r
252 LockList(c->HubList);
\r
254 LockList(c->LocalBridgeList);
\r
256 bool exists = false;
\r
258 // 全く同一のブリッジ設定が無いかどうか調べる
\r
259 for (i = 0;i < LIST_NUM(c->LocalBridgeList);i++)
\r
261 LOCALBRIDGE *br = LIST_DATA(c->LocalBridgeList, i);
\r
262 if (StrCmpi(br->DeviceName, devicename) == 0)
\r
264 if (StrCmpi(br->HubName, hubname) == 0)
\r
266 if (br->TapMode == tapmode)
\r
274 if (exists == false)
\r
277 br = ZeroMalloc(sizeof(LOCALBRIDGE));
\r
278 StrCpy(br->HubName, sizeof(br->HubName), hubname);
\r
279 StrCpy(br->DeviceName, sizeof(br->DeviceName), devicename);
\r
282 br->TapMode = tapmode;
\r
283 br->FullBroadcast = fullbcast;
\r
284 br->Monitor = monitor;
\r
287 if (tapaddr != NULL && IsZero(tapaddr, 6) == false)
\r
289 Copy(br->TapMacAddress, tapaddr, 6);
\r
293 GenMacAddress(br->TapMacAddress);
\r
297 Add(c->LocalBridgeList, br);
\r
300 for (i = 0;i < LIST_NUM(c->HubList);i++)
\r
302 HUB *hub = LIST_DATA(c->HubList, i);
\r
303 if (StrCmpi(hub->Name, br->HubName) == 0)
\r
312 UnlockList(c->LocalBridgeList);
\r
314 UnlockList(c->HubList);
\r
317 if (h != NULL && br != NULL && h->Type != HUB_TYPE_FARM_DYNAMIC)
\r
319 Lock(h->lock_online);
\r
321 if (h->Offline == false)
\r
323 LockList(c->LocalBridgeList);
\r
325 if (IsInList(c->LocalBridgeList, br))
\r
327 if (br->Bridge == NULL)
\r
329 br->Bridge = BrNewBridge(h, br->DeviceName, NULL, br->Local, br->Monitor, br->TapMode, br->TapMacAddress, br->FullBroadcast);
\r
333 UnlockList(c->LocalBridgeList);
\r
336 Unlock(h->lock_online);
\r
343 void InitLocalBridgeList(CEDAR *c)
\r
351 c->LocalBridgeList = NewList(NULL);
\r
355 void FreeLocalBridgeList(CEDAR *c)
\r
364 for (i = 0;i < LIST_NUM(c->LocalBridgeList);i++)
\r
366 LOCALBRIDGE *br = LIST_DATA(c->LocalBridgeList, i);
\r
370 ReleaseList(c->LocalBridgeList);
\r
371 c->LocalBridgeList = NULL;
\r
375 void BrBridgeThread(THREAD *thread, void *param)
\r
381 char name[MAX_SIZE];
\r
383 if (thread == NULL || param == NULL)
\r
388 b = (BRIDGE *)param;
\r
391 c = NewServerConnection(b->Cedar, NULL, thread);
\r
392 c->Protocol = CONNECTION_HUB_BRIDGE;
\r
395 s = NewServerSession(b->Cedar, c, b->Hub, BRIDGE_USER_NAME, b->Policy);
\r
396 HLog(b->Hub, "LH_START_BRIDGE", b->Name, s->Name);
\r
397 StrCpy(name, sizeof(name), b->Name);
\r
400 s->BridgeMode = true;
\r
403 ReleaseConnection(c);
\r
406 s->Username = CopyStr(BRIDGE_USER_NAME_PRINT);
\r
412 NoticeThreadInit(thread);
\r
415 Debug("Bridge %s Start.\n", b->Name);
\r
417 Debug("Bridge %s Stop.\n", b->Name);
\r
419 HLog(h, "LH_STOP_BRIDGE", name);
\r
427 void BrFreeBridge(BRIDGE *b)
\r
436 StopSession(b->Session);
\r
437 ReleaseSession(b->Session);
\r
444 BRIDGE *BrNewBridge(HUB *h, char *name, POLICY *p, bool local, bool monitor, bool tapmode, char *tapaddr, bool fullbcast)
\r
450 if (h == NULL || name == NULL)
\r
457 policy = ClonePolicy(GetDefaultPolicy());
\r
461 policy = ClonePolicy(p);
\r
464 policy->CheckMac = true;
\r
467 policy->CheckMac = false;
\r
468 #endif // UNIX_LINUX
\r
470 policy->NoBroadcastLimiter = true;
\r
472 b = ZeroMalloc(sizeof(BRIDGE));
\r
473 b->Cedar = h->Cedar;
\r
475 b->Name = CopyStr(name);
\r
476 b->Policy = policy;
\r
478 b->Monitor = monitor;
\r
479 b->TapMode = tapmode;
\r
480 b->FullBroadcast = fullbcast;
\r
484 if (tapaddr != NULL && IsZero(tapaddr, 6) == false)
\r
486 Copy(b->TapMacAddress, tapaddr, 6);
\r
490 GenMacAddress(b->TapMacAddress);
\r
497 policy->MonitorPort = true;
\r
500 if (b->FullBroadcast)
\r
503 policy->NoBroadcastLimiter = true;
\r
507 t = NewThread(BrBridgeThread, b);
\r