Link.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. // SoftEther VPN Source Code
  2. // Cedar Communication Module
  3. //
  4. // SoftEther VPN Server, Client and Bridge are free software under GPLv2.
  5. //
  6. // Copyright (c) 2012-2015 Daiyuu Nobori.
  7. // Copyright (c) 2012-2015 SoftEther VPN Project, University of Tsukuba, Japan.
  8. // Copyright (c) 2012-2015 SoftEther Corporation.
  9. //
  10. // All Rights Reserved.
  11. //
  12. // http://www.softether.org/
  13. //
  14. // Author: Daiyuu Nobori
  15. // Comments: Tetsuo Sugiyama, Ph.D.
  16. //
  17. // This program is free software; you can redistribute it and/or
  18. // modify it under the terms of the GNU General Public License
  19. // version 2 as published by the Free Software Foundation.
  20. //
  21. // This program is distributed in the hope that it will be useful,
  22. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  24. // GNU General Public License for more details.
  25. //
  26. // You should have received a copy of the GNU General Public License version 2
  27. // along with this program; if not, write to the Free Software
  28. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  29. //
  30. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  31. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  32. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  33. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  34. // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  35. // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  36. // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  37. //
  38. // THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
  39. // AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
  40. //
  41. //
  42. // THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
  43. // UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
  44. // MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
  45. // SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
  46. // SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
  47. // CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
  48. // DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
  49. // MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
  50. // SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
  51. // CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
  52. // EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
  53. // JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
  54. // AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
  55. // THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
  56. //
  57. // USE ONLY IN JAPAN. DO NOT USE THIS SOFTWARE IN ANOTHER COUNTRY UNLESS
  58. // YOU HAVE A CONFIRMATION THAT THIS SOFTWARE DOES NOT VIOLATE ANY
  59. // CRIMINAL LAWS OR CIVIL RIGHTS IN THAT PARTICULAR COUNTRY. USING THIS
  60. // SOFTWARE IN OTHER COUNTRIES IS COMPLETELY AT YOUR OWN RISK. THE
  61. // SOFTETHER VPN PROJECT HAS DEVELOPED AND DISTRIBUTED THIS SOFTWARE TO
  62. // COMPLY ONLY WITH THE JAPANESE LAWS AND EXISTING CIVIL RIGHTS INCLUDING
  63. // PATENTS WHICH ARE SUBJECTS APPLY IN JAPAN. OTHER COUNTRIES' LAWS OR
  64. // CIVIL RIGHTS ARE NONE OF OUR CONCERNS NOR RESPONSIBILITIES. WE HAVE
  65. // NEVER INVESTIGATED ANY CRIMINAL REGULATIONS, CIVIL LAWS OR
  66. // INTELLECTUAL PROPERTY RIGHTS INCLUDING PATENTS IN ANY OF OTHER 200+
  67. // COUNTRIES AND TERRITORIES. BY NATURE, THERE ARE 200+ REGIONS IN THE
  68. // WORLD, WITH DIFFERENT LAWS. IT IS IMPOSSIBLE TO VERIFY EVERY
  69. // COUNTRIES' LAWS, REGULATIONS AND CIVIL RIGHTS TO MAKE THE SOFTWARE
  70. // COMPLY WITH ALL COUNTRIES' LAWS BY THE PROJECT. EVEN IF YOU WILL BE
  71. // SUED BY A PRIVATE ENTITY OR BE DAMAGED BY A PUBLIC SERVANT IN YOUR
  72. // COUNTRY, THE DEVELOPERS OF THIS SOFTWARE WILL NEVER BE LIABLE TO
  73. // RECOVER OR COMPENSATE SUCH DAMAGES, CRIMINAL OR CIVIL
  74. // RESPONSIBILITIES. NOTE THAT THIS LINE IS NOT LICENSE RESTRICTION BUT
  75. // JUST A STATEMENT FOR WARNING AND DISCLAIMER.
  76. //
  77. //
  78. // SOURCE CODE CONTRIBUTION
  79. // ------------------------
  80. //
  81. // Your contribution to SoftEther VPN Project is much appreciated.
  82. // Please send patches to us through GitHub.
  83. // Read the SoftEther VPN Patch Acceptance Policy in advance:
  84. // http://www.softether.org/5-download/src/9.patch
  85. //
  86. //
  87. // DEAR SECURITY EXPERTS
  88. // ---------------------
  89. //
  90. // If you find a bug or a security vulnerability please kindly inform us
  91. // about the problem immediately so that we can fix the security problem
  92. // to protect a lot of users around the world as soon as possible.
  93. //
  94. // Our e-mail address for security reports is:
  95. // softether-vpn-security [at] softether.org
  96. //
  97. // Please note that the above e-mail address is not a technical support
  98. // inquiry address. If you need technical assistance, please visit
  99. // http://www.softether.org/ and ask your question on the users forum.
  100. //
  101. // Thank you for your cooperation.
  102. //
  103. //
  104. // NO MEMORY OR RESOURCE LEAKS
  105. // ---------------------------
  106. //
  107. // The memory-leaks and resource-leaks verification under the stress
  108. // test has been passed before release this source code.
  109. // Link.c
  110. // Inter-HUB Link
  111. #include "CedarPch.h"
  112. // Link server thread
  113. void LinkServerSessionThread(THREAD *t, void *param)
  114. {
  115. LINK *k = (LINK *)param;
  116. CONNECTION *c;
  117. SESSION *s;
  118. POLICY *policy;
  119. wchar_t name[MAX_SIZE];
  120. // Validate arguments
  121. if (t == NULL || param == NULL)
  122. {
  123. return;
  124. }
  125. // Create a server connection
  126. c = NewServerConnection(k->Cedar, NULL, t);
  127. c->Protocol = CONNECTION_HUB_LINK_SERVER;
  128. // Create a policy
  129. policy = ZeroMalloc(sizeof(POLICY));
  130. Copy(policy, k->Policy, sizeof(POLICY));
  131. // Create a server session
  132. s = NewServerSession(k->Cedar, c, k->Hub, LINK_USER_NAME, policy);
  133. s->LinkModeServer = true;
  134. s->Link = k;
  135. c->Session = s;
  136. ReleaseConnection(c);
  137. // User name
  138. s->Username = CopyStr(LINK_USER_NAME_PRINT);
  139. k->ServerSession = s;
  140. AddRef(k->ServerSession->ref);
  141. // Notify the initialization completion
  142. NoticeThreadInit(t);
  143. UniStrCpy(name, sizeof(name), k->Option->AccountName);
  144. HLog(s->Hub, "LH_LINK_START", name, s->Name);
  145. // Main function of session
  146. SessionMain(s);
  147. HLog(s->Hub, "LH_LINK_STOP", name);
  148. ReleaseSession(s);
  149. }
  150. // Initialize the packet adapter
  151. bool LinkPaInit(SESSION *s)
  152. {
  153. LINK *k;
  154. THREAD *t;
  155. // Validate arguments
  156. if (s == NULL || (k = (LINK *)s->PacketAdapter->Param) == NULL)
  157. {
  158. return false;
  159. }
  160. if (k->Halting || (*k->StopAllLinkFlag))
  161. {
  162. return false;
  163. }
  164. // Create a transmission packet queue
  165. k->SendPacketQueue = NewQueue();
  166. // Creat a link server thread
  167. t = NewThread(LinkServerSessionThread, (void *)k);
  168. WaitThreadInit(t);
  169. k->LastServerConnectionReceivedBlocksNum = 0;
  170. k->CurrentSendPacketQueueSize = 0;
  171. ReleaseThread(t);
  172. return true;
  173. }
  174. // Get the cancel object
  175. CANCEL *LinkPaGetCancel(SESSION *s)
  176. {
  177. LINK *k;
  178. // Validate arguments
  179. if (s == NULL || (k = (LINK *)s->PacketAdapter->Param) == NULL)
  180. {
  181. return NULL;
  182. }
  183. return NULL;
  184. }
  185. // Get the next packet
  186. UINT LinkPaGetNextPacket(SESSION *s, void **data)
  187. {
  188. LINK *k;
  189. UINT ret = 0;
  190. // Validate arguments
  191. if (s == NULL || data == NULL || (k = (LINK *)s->PacketAdapter->Param) == NULL)
  192. {
  193. return INFINITE;
  194. }
  195. if (k->Halting || (*k->StopAllLinkFlag))
  196. {
  197. return INFINITE;
  198. }
  199. // Examine whether there are packets in the queue
  200. LockQueue(k->SendPacketQueue);
  201. {
  202. BLOCK *block = GetNext(k->SendPacketQueue);
  203. if (block != NULL)
  204. {
  205. // There was a packet
  206. *data = block->Buf;
  207. ret = block->Size;
  208. k->CurrentSendPacketQueueSize -= block->Size;
  209. // Discard the memory for the structure
  210. Free(block);
  211. }
  212. }
  213. UnlockQueue(k->SendPacketQueue);
  214. return ret;
  215. }
  216. // Write the received packet
  217. bool LinkPaPutPacket(SESSION *s, void *data, UINT size)
  218. {
  219. LINK *k;
  220. BLOCK *block = NULL;
  221. SESSION *server_session;
  222. CONNECTION *server_connection;
  223. bool ret = true;
  224. bool halting = false;
  225. // Validate arguments
  226. if (s == NULL || (k = (LINK *)s->PacketAdapter->Param) == NULL)
  227. {
  228. return false;
  229. }
  230. halting = (k->Halting || (*k->StopAllLinkFlag));
  231. server_session = k->ServerSession;
  232. server_connection = server_session->Connection;
  233. k->Flag1++;
  234. if ((k->Flag1 % 32) == 0)
  235. {
  236. // Ommit for performance
  237. UINT current_num;
  238. int diff;
  239. current_num = GetQueueNum(server_connection->ReceivedBlocks);
  240. diff = (int)current_num - (int)k->LastServerConnectionReceivedBlocksNum;
  241. k->LastServerConnectionReceivedBlocksNum = current_num;
  242. CedarAddQueueBudget(k->Cedar, diff);
  243. }
  244. // Since the packet arrives from the HUB of the link destination,
  245. // deliver it to the ReceivedBlocks of the server session
  246. if (data != NULL)
  247. {
  248. if (halting == false)
  249. {
  250. block = NewBlock(data, size, 0);
  251. }
  252. if (k->LockFlag == false)
  253. {
  254. UINT current_num;
  255. int diff;
  256. k->LockFlag = true;
  257. LockQueue(server_connection->ReceivedBlocks);
  258. current_num = GetQueueNum(server_connection->ReceivedBlocks);
  259. diff = (int)current_num - (int)k->LastServerConnectionReceivedBlocksNum;
  260. k->LastServerConnectionReceivedBlocksNum = current_num;
  261. CedarAddQueueBudget(k->Cedar, diff);
  262. }
  263. if (halting == false)
  264. {
  265. if (CedarGetFifoBudgetBalance(k->Cedar) == 0)
  266. {
  267. FreeBlock(block);
  268. }
  269. else
  270. {
  271. InsertReveicedBlockToQueue(server_connection, block, true);
  272. }
  273. }
  274. }
  275. else
  276. {
  277. UINT current_num;
  278. int diff;
  279. current_num = GetQueueNum(server_connection->ReceivedBlocks);
  280. diff = (int)current_num - (int)k->LastServerConnectionReceivedBlocksNum;
  281. k->LastServerConnectionReceivedBlocksNum = current_num;
  282. CedarAddQueueBudget(k->Cedar, diff);
  283. if (k->LockFlag)
  284. {
  285. k->LockFlag = false;
  286. UnlockQueue(server_connection->ReceivedBlocks);
  287. }
  288. // Issue the Cancel, since finished store all packets when the data == NULL
  289. Cancel(server_session->Cancel1);
  290. if (k->Hub != NULL && k->Hub->Option != NULL && k->Hub->Option->YieldAfterStorePacket)
  291. {
  292. YieldCpu();
  293. }
  294. }
  295. if (halting)
  296. {
  297. ret = false;
  298. }
  299. return ret;
  300. }
  301. // Release the packet adapter
  302. void LinkPaFree(SESSION *s)
  303. {
  304. LINK *k;
  305. // Validate arguments
  306. if (s == NULL || (k = (LINK *)s->PacketAdapter->Param) == NULL)
  307. {
  308. return;
  309. }
  310. CedarAddQueueBudget(k->Cedar, -((int)k->LastServerConnectionReceivedBlocksNum));
  311. k->LastServerConnectionReceivedBlocksNum = 0;
  312. // Stop the server session
  313. StopSession(k->ServerSession);
  314. ReleaseSession(k->ServerSession);
  315. // Release the transmission packet queue
  316. LockQueue(k->SendPacketQueue);
  317. {
  318. BLOCK *block;
  319. while (block = GetNext(k->SendPacketQueue))
  320. {
  321. FreeBlock(block);
  322. }
  323. }
  324. UnlockQueue(k->SendPacketQueue);
  325. ReleaseQueue(k->SendPacketQueue);
  326. k->CurrentSendPacketQueueSize = 0;
  327. }
  328. // Packet adapter
  329. PACKET_ADAPTER *LinkGetPacketAdapter()
  330. {
  331. return NewPacketAdapter(LinkPaInit, LinkPaGetCancel, LinkPaGetNextPacket,
  332. LinkPaPutPacket, LinkPaFree);
  333. }
  334. // Release all links
  335. void ReleaseAllLink(HUB *h)
  336. {
  337. LINK **kk;
  338. UINT num, i;
  339. // Validate arguments
  340. if (h == NULL)
  341. {
  342. return;
  343. }
  344. LockList(h->LinkList);
  345. {
  346. num = LIST_NUM(h->LinkList);
  347. kk = ToArray(h->LinkList);
  348. DeleteAll(h->LinkList);
  349. }
  350. UnlockList(h->LinkList);
  351. for (i = 0;i < num;i++)
  352. {
  353. LINK *k = kk[i];
  354. ReleaseLink(k);
  355. }
  356. Free(kk);
  357. }
  358. // Release the link
  359. void ReleaseLink(LINK *k)
  360. {
  361. // Validate arguments
  362. if (k == NULL)
  363. {
  364. return;
  365. }
  366. if (Release(k->ref) == 0)
  367. {
  368. CleanupLink(k);
  369. }
  370. }
  371. // Clean-up the link
  372. void CleanupLink(LINK *k)
  373. {
  374. // Validate arguments
  375. if (k == NULL)
  376. {
  377. return;
  378. }
  379. DeleteLock(k->lock);
  380. if (k->ClientSession)
  381. {
  382. ReleaseSession(k->ClientSession);
  383. }
  384. Free(k->Option);
  385. CiFreeClientAuth(k->Auth);
  386. Free(k->Policy);
  387. if (k->ServerCert != NULL)
  388. {
  389. FreeX(k->ServerCert);
  390. }
  391. Free(k);
  392. }
  393. // Make the link on-line
  394. void SetLinkOnline(LINK *k)
  395. {
  396. // Validate arguments
  397. if (k == NULL)
  398. {
  399. return;
  400. }
  401. if (k->NoOnline)
  402. {
  403. return;
  404. }
  405. if (k->Offline == false)
  406. {
  407. return;
  408. }
  409. k->Offline = false;
  410. StartLink(k);
  411. }
  412. // Make the link off-line
  413. void SetLinkOffline(LINK *k)
  414. {
  415. // Validate arguments
  416. if (k == NULL)
  417. {
  418. return;
  419. }
  420. if (k->Offline)
  421. {
  422. return;
  423. }
  424. StopLink(k);
  425. k->Offline = true;
  426. }
  427. // Delete the link
  428. void DelLink(HUB *hub, LINK *k)
  429. {
  430. // Validate arguments
  431. if (hub == NULL || k == NULL)
  432. {
  433. return;
  434. }
  435. LockList(hub->LinkList);
  436. {
  437. if (Delete(hub->LinkList, k))
  438. {
  439. ReleaseLink(k);
  440. }
  441. }
  442. UnlockList(hub->LinkList);
  443. }
  444. // Start all links
  445. void StartAllLink(HUB *h)
  446. {
  447. // Validate arguments
  448. if (h == NULL)
  449. {
  450. return;
  451. }
  452. LockList(h->LinkList);
  453. {
  454. UINT i;
  455. for (i = 0;i < LIST_NUM(h->LinkList);i++)
  456. {
  457. LINK *k = (LINK *)LIST_DATA(h->LinkList, i);
  458. if (k->Offline == false)
  459. {
  460. StartLink(k);
  461. }
  462. }
  463. }
  464. UnlockList(h->LinkList);
  465. }
  466. // Stop all links
  467. void StopAllLink(HUB *h)
  468. {
  469. LINK **link_list;
  470. UINT num_link;
  471. UINT i;
  472. // Validate arguments
  473. if (h == NULL)
  474. {
  475. return;
  476. }
  477. h->StopAllLinkFlag = true;
  478. LockList(h->LinkList);
  479. {
  480. link_list = ToArray(h->LinkList);
  481. num_link = LIST_NUM(h->LinkList);
  482. for (i = 0;i < num_link;i++)
  483. {
  484. AddRef(link_list[i]->ref);
  485. }
  486. }
  487. UnlockList(h->LinkList);
  488. for (i = 0;i < num_link;i++)
  489. {
  490. StopLink(link_list[i]);
  491. ReleaseLink(link_list[i]);
  492. }
  493. Free(link_list);
  494. h->StopAllLinkFlag = false;
  495. }
  496. // Start the link
  497. void StartLink(LINK *k)
  498. {
  499. PACKET_ADAPTER *pa;
  500. // Validate arguments
  501. if (k == NULL)
  502. {
  503. return;
  504. }
  505. LockLink(k);
  506. {
  507. if (k->Started || k->Halting)
  508. {
  509. UnlockLink(k);
  510. return;
  511. }
  512. k->Started = true;
  513. Inc(k->Cedar->CurrentActiveLinks);
  514. }
  515. UnlockLink(k);
  516. // Connect the client session
  517. pa = LinkGetPacketAdapter();
  518. pa->Param = (void *)k;
  519. LockLink(k);
  520. {
  521. k->ClientSession = NewClientSession(k->Cedar, k->Option, k->Auth, pa);
  522. }
  523. UnlockLink(k);
  524. }
  525. // Stop the link
  526. void StopLink(LINK *k)
  527. {
  528. // Validate arguments
  529. if (k == NULL)
  530. {
  531. return;
  532. }
  533. LockLink(k);
  534. {
  535. if (k->Started == false)
  536. {
  537. UnlockLink(k);
  538. return;
  539. }
  540. k->Started = false;
  541. k->Halting = true;
  542. Dec(k->Cedar->CurrentActiveLinks);
  543. }
  544. UnlockLink(k);
  545. if (k->ClientSession != NULL)
  546. {
  547. // Disconnect the client session
  548. StopSession(k->ClientSession);
  549. LockLink(k);
  550. {
  551. ReleaseSession(k->ClientSession);
  552. k->ClientSession = NULL;
  553. }
  554. UnlockLink(k);
  555. }
  556. LockLink(k);
  557. {
  558. k->Halting = false;
  559. }
  560. UnlockLink(k);
  561. }
  562. // Lock the link
  563. void LockLink(LINK *k)
  564. {
  565. // Validate arguments
  566. if (k == NULL)
  567. {
  568. return;
  569. }
  570. Lock(k->lock);
  571. }
  572. // Unlock the link
  573. void UnlockLink(LINK *k)
  574. {
  575. // Validate arguments
  576. if (k == NULL)
  577. {
  578. return;
  579. }
  580. Unlock(k->lock);
  581. }
  582. // Normalize the policy for the link
  583. void NormalizeLinkPolicy(POLICY *p)
  584. {
  585. // Validate arguments
  586. if (p == NULL)
  587. {
  588. return;
  589. }
  590. p->Access = true;
  591. p->NoBridge = p->NoRouting = p->MonitorPort = false;
  592. p->MaxConnection = 32;
  593. p->TimeOut = 20;
  594. p->FixPassword = false;
  595. }
  596. // Create a Link
  597. LINK *NewLink(CEDAR *cedar, HUB *hub, CLIENT_OPTION *option, CLIENT_AUTH *auth, POLICY *policy)
  598. {
  599. CLIENT_OPTION *o;
  600. LINK *k;
  601. CLIENT_AUTH *a;
  602. // Validate arguments
  603. if (cedar == NULL || hub == NULL || option == NULL || auth == NULL || policy == NULL)
  604. {
  605. return NULL;
  606. }
  607. if (hub->Halt)
  608. {
  609. return NULL;
  610. }
  611. if (LIST_NUM(hub->LinkList) >= MAX_HUB_LINKS)
  612. {
  613. return NULL;
  614. }
  615. if (UniIsEmptyStr(option->AccountName))
  616. {
  617. return NULL;
  618. }
  619. // Limitation of authentication method
  620. if (auth->AuthType != CLIENT_AUTHTYPE_ANONYMOUS && auth->AuthType != CLIENT_AUTHTYPE_PASSWORD &&
  621. auth->AuthType != CLIENT_AUTHTYPE_PLAIN_PASSWORD && auth->AuthType != CLIENT_AUTHTYPE_CERT)
  622. {
  623. // Authentication method other than anonymous authentication, password authentication, plain password, certificate authentication cannot be used
  624. return NULL;
  625. }
  626. // Copy of the client options (for modification)
  627. o = ZeroMalloc(sizeof(CLIENT_OPTION));
  628. Copy(o, option, sizeof(CLIENT_OPTION));
  629. StrCpy(o->DeviceName, sizeof(o->DeviceName), LINK_DEVICE_NAME);
  630. o->RequireBridgeRoutingMode = true; // Request the bridge mode
  631. o->RequireMonitorMode = false; // Not to require the monitor mode
  632. o->NumRetry = INFINITE; // Retry the connection infinitely
  633. o->RetryInterval = 10; // Retry interval is 10 seconds
  634. o->NoRoutingTracking = true; // Stop the routing tracking
  635. // Copy the authentication data
  636. a = CopyClientAuth(auth);
  637. a->SecureSignProc = NULL;
  638. a->CheckCertProc = NULL;
  639. // Link object
  640. k = ZeroMalloc(sizeof(LINK));
  641. k->StopAllLinkFlag = &hub->StopAllLinkFlag;
  642. k->lock = NewLock();
  643. k->ref = NewRef();
  644. k->Cedar = cedar;
  645. k->Option = o;
  646. k->Auth = a;
  647. k->Hub = hub;
  648. // Copy the policy
  649. k->Policy = ZeroMalloc(sizeof(POLICY));
  650. Copy(k->Policy, policy, sizeof(POLICY));
  651. // Normalize the policy
  652. NormalizeLinkPolicy(k->Policy);
  653. // Register in the link list of the HUB
  654. LockList(hub->LinkList);
  655. {
  656. Add(hub->LinkList, k);
  657. AddRef(k->ref);
  658. }
  659. UnlockList(hub->LinkList);
  660. return k;
  661. }
  662. // Developed by SoftEther VPN Project at University of Tsukuba in Japan.
  663. // Department of Computer Science has dozens of overly-enthusiastic geeks.
  664. // Join us: http://www.tsukuba.ac.jp/english/admission/