UdpAccel.c 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204
  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-2014 Daiyuu Nobori.
  7. // Copyright (c) 2012-2014 SoftEther VPN Project, University of Tsukuba, Japan.
  8. // Copyright (c) 2012-2014 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. // UdpAccel.c
  110. // UDP acceleration function
  111. #include "CedarPch.h"
  112. // Polling process
  113. void UdpAccelPoll(UDP_ACCEL *a)
  114. {
  115. UCHAR *tmp = a->TmpBuf;
  116. IP nat_t_ip;
  117. UINT num_ignore_errors = 0;
  118. // Validate arguments
  119. if (a == NULL)
  120. {
  121. return;
  122. }
  123. Lock(a->NatT_Lock);
  124. {
  125. Copy(&nat_t_ip, &a->NatT_IP, sizeof(IP));
  126. }
  127. Unlock(a->NatT_Lock);
  128. if (IsZeroIp(&nat_t_ip) == false)
  129. {
  130. // Release the thread which gets the IP address of the NAT-T server because it is no longer needed
  131. if (a->NatT_GetIpThread != NULL)
  132. {
  133. WaitThread(a->NatT_GetIpThread, INFINITE);
  134. ReleaseThread(a->NatT_GetIpThread);
  135. a->NatT_GetIpThread = NULL;
  136. }
  137. }
  138. // Receive a new UDP packet
  139. while (true)
  140. {
  141. IP src_ip;
  142. UINT src_port;
  143. UINT ret;
  144. ret = RecvFrom(a->UdpSock, &src_ip, &src_port, tmp, UDP_ACCELERATION_TMP_BUF_SIZE);
  145. if (ret != 0 && ret != SOCK_LATER)
  146. {
  147. if (a->UseUdpIpQuery && a->UdpIpQueryPacketSize >= 8 && CmpIpAddr(&a->UdpIpQueryHost, &src_ip) == 0 &&
  148. src_port == a->UdpIpQueryPort)
  149. {
  150. // Receive a response of the query for IP and port number
  151. IP my_ip = {0};
  152. UINT myport = 0;
  153. BUF *b = MemToBuf(a->UdpIpQueryPacketData, a->UdpIpQueryPacketSize);
  154. FreeBuf(b);
  155. }
  156. else if (IsZeroIp(&nat_t_ip) == false && CmpIpAddr(&nat_t_ip, &src_ip) == 0 &&
  157. src_port == UDP_NAT_T_PORT)
  158. {
  159. // Receive a response from the NAT-T server
  160. IP my_ip;
  161. UINT myport;
  162. if (RUDPParseIPAndPortStr(tmp, ret, &my_ip, &myport))
  163. {
  164. if (myport >= 1 && myport <= 65535)
  165. {
  166. if (a->MyPortByNatTServer != myport)
  167. {
  168. a->MyPortByNatTServer = myport;
  169. a->MyPortByNatTServerChanged = true;
  170. a->CommToNatT_NumFail = 0;
  171. Debug("NAT-T: MyPort = %u\n", myport);
  172. }
  173. }
  174. }
  175. /*
  176. BUF *b = NewBuf();
  177. PACK *p;
  178. WriteBuf(b, tmp, ret);
  179. SeekBufToBegin(b);
  180. p = BufToPack(b);
  181. if (p != NULL)
  182. {
  183. if (PackCmpStr(p, "opcode", "query_for_nat_traversal"))
  184. {
  185. if (PackGetBool(p, "ok"))
  186. {
  187. if (PackGetInt64(p, "tran_id") == a->NatT_TranId)
  188. {
  189. UINT myport = PackGetInt(p, "your_port");
  190. if (myport >= 1 && myport <= 65535)
  191. {
  192. if (a->MyPortByNatTServer != myport)
  193. {
  194. a->MyPortByNatTServer = myport;
  195. a->MyPortByNatTServerChanged = true;
  196. Debug("NAT-T: MyPort = %u\n", myport);
  197. }
  198. }
  199. }
  200. }
  201. }
  202. FreePack(p);
  203. }
  204. FreeBuf(b);*/
  205. }
  206. else
  207. {
  208. BLOCK *b = UdpAccelProcessRecvPacket(a, tmp, ret, &src_ip, src_port);
  209. //Debug("UDP Recv: %u %u %u\n", ret, (b == NULL ? 0 : b->Size), (b == NULL ? 0 : b->Compressed));
  210. /*if (b != NULL)
  211. {
  212. char tmp[MAX_SIZE * 10];
  213. BinToStr(tmp, sizeof(tmp), b->Buf, b->Size);
  214. Debug("Recv Pkt: %s\n", tmp);
  215. }*/
  216. if (b != NULL)
  217. {
  218. // Receive a packet
  219. InsertQueue(a->RecvBlockQueue, b);
  220. }
  221. }
  222. }
  223. else
  224. {
  225. if (ret == 0)
  226. {
  227. if (a->UdpSock->IgnoreRecvErr == false)
  228. {
  229. // Serious UDP reception error occurs
  230. a->FatalError = true;
  231. break;
  232. }
  233. if ((num_ignore_errors++) >= MAX_NUM_IGNORE_ERRORS)
  234. {
  235. a->FatalError = true;
  236. break;
  237. }
  238. }
  239. else
  240. {
  241. // SOCK_LATER
  242. break;
  243. }
  244. }
  245. }
  246. // Send a Keep-Alive packet
  247. if (a->NextSendKeepAlive == 0 || (a->NextSendKeepAlive <= a->Now) || a->YourPortByNatTServerChanged)
  248. {
  249. a->YourPortByNatTServerChanged = false;
  250. if (UdpAccelIsSendReady(a, false))
  251. {
  252. UINT rand_interval;
  253. if (a->FastDetect == false)
  254. {
  255. rand_interval = rand() % (UDP_ACCELERATION_KEEPALIVE_INTERVAL_MAX - UDP_ACCELERATION_KEEPALIVE_INTERVAL_MIN) + UDP_ACCELERATION_KEEPALIVE_INTERVAL_MIN;
  256. }
  257. else
  258. {
  259. rand_interval = rand() % (UDP_ACCELERATION_KEEPALIVE_INTERVAL_MAX_FAST - UDP_ACCELERATION_KEEPALIVE_INTERVAL_MIN_FAST) + UDP_ACCELERATION_KEEPALIVE_INTERVAL_MIN_FAST;
  260. }
  261. a->NextSendKeepAlive = a->Now + (UINT64)rand_interval;
  262. //Debug("UDP KeepAlive\n");
  263. UdpAccelSend(a, NULL, 0, false, 1000, false);
  264. }
  265. }
  266. // Send a NAT-T request packet (Only if the connection by UDP has not be established yet)
  267. if (a->NoNatT == false)
  268. {
  269. // In the usual case
  270. if (IsZeroIp(&nat_t_ip) == false)
  271. {
  272. if (UdpAccelIsSendReady(a, true) == false)
  273. {
  274. if (a->NextPerformNatTTick == 0 || (a->NextPerformNatTTick <= a->Now))
  275. {
  276. UINT rand_interval;
  277. UCHAR c = 'B';
  278. a->CommToNatT_NumFail++;
  279. rand_interval = UDP_NAT_T_INTERVAL_INITIAL * MIN(a->CommToNatT_NumFail, UDP_NAT_T_INTERVAL_FAIL_MAX);
  280. //PACK *p = NewPack();
  281. //BUF *b;
  282. if (a->MyPortByNatTServer != 0)
  283. {
  284. rand_interval = GenRandInterval(UDP_NAT_T_INTERVAL_MIN, UDP_NAT_T_INTERVAL_MAX);
  285. }
  286. a->NextPerformNatTTick = a->Now + (UINT64)rand_interval;
  287. // Generate the request packet
  288. /*PackAddStr(p, "description", UDP_NAT_T_SIGNATURE);
  289. PackAddStr(p, "opcode", "query_for_nat_traversal");
  290. PackAddInt64(p, "tran_id", a->NatT_TranId);
  291. b = PackToBuf(p);
  292. FreePack(p);*/
  293. // Send the request packet
  294. SendTo(a->UdpSock, &nat_t_ip, UDP_NAT_T_PORT, &c, 1);
  295. //FreeBuf(b);
  296. }
  297. }
  298. else
  299. {
  300. a->NextPerformNatTTick = 0;
  301. a->CommToNatT_NumFail = 0;
  302. }
  303. }
  304. }
  305. else
  306. {
  307. // NAT_T is disabled, but there is a reference host (such as VGC)
  308. if (a->UseUdpIpQuery || a->UseSuperRelayQuery)
  309. {
  310. }
  311. }
  312. }
  313. // Send a packet block
  314. void UdpAccelSendBlock(UDP_ACCEL *a, BLOCK *b)
  315. {
  316. // Validate arguments
  317. if (a == NULL || b == NULL)
  318. {
  319. return;
  320. }
  321. UdpAccelSend(a, b->Buf, b->Size, b->Compressed, a->MaxUdpPacketSize, b->PriorityQoS);
  322. }
  323. // Calculate the best MSS
  324. UINT UdpAccelCalcMss(UDP_ACCEL *a)
  325. {
  326. UINT ret;
  327. // Validate arguments
  328. if (a == NULL)
  329. {
  330. return 0;
  331. }
  332. ret = MTU_FOR_PPPOE;
  333. // IPv4
  334. if (a->IsIPv6)
  335. {
  336. ret -= 40;
  337. }
  338. else
  339. {
  340. ret -= 20;
  341. }
  342. // UDP
  343. ret -= 8;
  344. if (a->PlainTextMode == false)
  345. {
  346. // IV
  347. ret -= UDP_ACCELERATION_PACKET_IV_SIZE;
  348. }
  349. // Cookie
  350. ret -= sizeof(UINT);
  351. // My Tick
  352. ret -= sizeof(UINT64);
  353. // Your Tick
  354. ret -= sizeof(UINT64);
  355. // Size
  356. ret -= sizeof(USHORT);
  357. // Compress Flag
  358. ret -= sizeof(UCHAR);
  359. if (a->PlainTextMode == false)
  360. {
  361. // Verify
  362. ret -= UDP_ACCELERATION_PACKET_IV_SIZE;
  363. }
  364. // Ethernet header (communication packets)
  365. ret -= 14;
  366. // IPv4 Header (communication packets)
  367. ret -= 20;
  368. // TCP header (communication packet)
  369. ret -= 20;
  370. return ret;
  371. }
  372. // Send
  373. void UdpAccelSend(UDP_ACCEL *a, UCHAR *data, UINT data_size, bool compressed, UINT max_size, bool high_priority)
  374. {
  375. UCHAR tmp[UDP_ACCELERATION_TMP_BUF_SIZE];
  376. UCHAR *buf;
  377. UINT size;
  378. UCHAR key[UDP_ACCELERATION_PACKET_KEY_SIZE];
  379. UINT64 ui64;
  380. USHORT us;
  381. UCHAR c;
  382. UINT current_size;
  383. UINT ui32;
  384. bool fatal_error = false;
  385. UINT r;
  386. // Validate arguments
  387. if (a == NULL || (data_size != 0 && data == NULL))
  388. {
  389. return;
  390. }
  391. if (max_size == 0)
  392. {
  393. max_size = INFINITE;
  394. }
  395. buf = tmp;
  396. size = 0;
  397. // IV
  398. if (a->PlainTextMode == false)
  399. {
  400. // IV
  401. Copy(buf, a->NextIv, UDP_ACCELERATION_PACKET_IV_SIZE);
  402. buf += UDP_ACCELERATION_PACKET_IV_SIZE;
  403. size += UDP_ACCELERATION_PACKET_IV_SIZE;
  404. // Calculate the key
  405. UdpAccelCalcKey(key, a->MyKey, a->NextIv);
  406. if (false)
  407. {
  408. char tmp1[256];
  409. char tmp2[256];
  410. char tmp3[256];
  411. BinToStr(tmp1, sizeof(tmp1), a->MyKey, sizeof(a->MyKey));
  412. BinToStr(tmp2, sizeof(tmp2), a->NextIv, UDP_ACCELERATION_PACKET_IV_SIZE);
  413. BinToStr(tmp3, sizeof(tmp3), key, sizeof(key));
  414. Debug("My Key : %s\n"
  415. "IV : %s\n"
  416. "Comm Key: %s\n",
  417. tmp1, tmp2, tmp3);
  418. }
  419. }
  420. // Cookie
  421. ui32 = Endian32(a->YourCookie);
  422. Copy(buf, &ui32, sizeof(UINT));
  423. buf += sizeof(UINT);
  424. size += sizeof(UINT);
  425. // My Tick
  426. ui64 = Endian64(a->Now == 0 ? 1ULL : a->Now);
  427. Copy(buf, &ui64, sizeof(UINT64));
  428. buf += sizeof(UINT64);
  429. size += sizeof(UINT64);
  430. // Your Tick
  431. ui64 = Endian64(a->LastRecvYourTick);
  432. Copy(buf, &ui64, sizeof(UINT64));
  433. buf += sizeof(UINT64);
  434. size += sizeof(UINT64);
  435. // Size
  436. us = Endian16(data_size);
  437. Copy(buf, &us, sizeof(USHORT));
  438. buf += sizeof(USHORT);
  439. size += sizeof(USHORT);
  440. // Compress Flag
  441. c = (compressed ? 1 : 0);
  442. Copy(buf, &c, sizeof(UCHAR));
  443. buf += sizeof(UCHAR);
  444. size += sizeof(UCHAR);
  445. // Data
  446. if (data_size >= 1)
  447. {
  448. Copy(buf, data, data_size);
  449. buf += data_size;
  450. size += data_size;
  451. }
  452. if (a->PlainTextMode == false)
  453. {
  454. static UCHAR zero[UDP_ACCELERATION_PACKET_IV_SIZE] = {0};
  455. CRYPT *c;
  456. current_size = UDP_ACCELERATION_PACKET_IV_SIZE + sizeof(UINT) + sizeof(UINT64) * 2 +
  457. sizeof(USHORT) + sizeof(UCHAR) + data_size + UDP_ACCELERATION_PACKET_IV_SIZE;
  458. if (current_size < max_size)
  459. {
  460. // Padding
  461. UCHAR pad[UDP_ACCELERATION_MAX_PADDING_SIZE];
  462. UINT pad_size = MIN(max_size - current_size, UDP_ACCELERATION_MAX_PADDING_SIZE);
  463. pad_size = rand() % pad_size;
  464. Zero(pad, sizeof(pad));
  465. Copy(buf, pad, pad_size);
  466. buf += pad_size;
  467. size += pad_size;
  468. }
  469. // Verify
  470. Copy(buf, zero, UDP_ACCELERATION_PACKET_IV_SIZE);
  471. buf += UDP_ACCELERATION_PACKET_IV_SIZE;
  472. size += UDP_ACCELERATION_PACKET_IV_SIZE;
  473. // Encryption
  474. c = NewCrypt(key, UDP_ACCELERATION_PACKET_KEY_SIZE);
  475. Encrypt(c, tmp + UDP_ACCELERATION_PACKET_IV_SIZE, tmp + UDP_ACCELERATION_PACKET_IV_SIZE, size - UDP_ACCELERATION_PACKET_IV_SIZE);
  476. FreeCrypt(c);
  477. // Next Iv
  478. Copy(a->NextIv, buf - UDP_ACCELERATION_PACKET_IV_SIZE, UDP_ACCELERATION_PACKET_IV_SIZE);
  479. }
  480. // Send
  481. SetSockHighPriority(a->UdpSock, high_priority);
  482. r = SendTo(a->UdpSock, &a->YourIp, a->YourPort, tmp, size);
  483. if (r == 0 && a->UdpSock->IgnoreSendErr == false)
  484. {
  485. fatal_error = true;
  486. Debug("Error: SendTo: %r %u %u\n", &a->YourIp, a->YourPort, size);
  487. WHERE;
  488. }
  489. if (data_size == 0)
  490. {
  491. if (UdpAccelIsSendReady(a, true) == false)
  492. {
  493. if ((a->YourPortByNatTServer != 0) && (a->YourPort != a->YourPortByNatTServer))
  494. {
  495. r = SendTo(a->UdpSock, &a->YourIp, a->YourPortByNatTServer, tmp, size);
  496. if (r == 0 && a->UdpSock->IgnoreSendErr == false)
  497. {
  498. fatal_error = true;
  499. WHERE;
  500. }
  501. }
  502. }
  503. }
  504. if (data_size == 0)
  505. {
  506. if (IsZeroIP(&a->YourIp2) == false && CmpIpAddr(&a->YourIp, &a->YourIp2) != 0)
  507. {
  508. if (UdpAccelIsSendReady(a, true) == false)
  509. {
  510. // When the KeepAlive, if the opponent may be behind a NAT,
  511. // send the packet to the IP address of outside of the NAT
  512. r = SendTo(a->UdpSock, &a->YourIp2, a->YourPort, tmp, size);
  513. if (r == 0 && a->UdpSock->IgnoreSendErr == false)
  514. {
  515. fatal_error = true;
  516. WHERE;
  517. }
  518. if ((a->YourPortByNatTServer != 0) && (a->YourPort != a->YourPortByNatTServer))
  519. {
  520. r = SendTo(a->UdpSock, &a->YourIp2, a->YourPortByNatTServer, tmp, size);
  521. if (r == 0 && a->UdpSock->IgnoreSendErr == false)
  522. {
  523. fatal_error = true;
  524. WHERE;
  525. }
  526. }
  527. }
  528. }
  529. }
  530. if (fatal_error)
  531. {
  532. a->FatalError = true;
  533. WHERE;
  534. }
  535. //Debug("UDP Send: %u\n", size);
  536. }
  537. // Determine whether transmission is possible
  538. bool UdpAccelIsSendReady(UDP_ACCEL *a, bool check_keepalive)
  539. {
  540. UINT64 timeout_value;
  541. // Validate arguments
  542. if (a == NULL)
  543. {
  544. return false;
  545. }
  546. if (a->Inited == false)
  547. {
  548. return false;
  549. }
  550. if (a->YourPort == 0)
  551. {
  552. return false;
  553. }
  554. if (IsZeroIp(&a->YourIp))
  555. {
  556. return false;
  557. }
  558. timeout_value = UDP_ACCELERATION_KEEPALIVE_TIMEOUT;
  559. if (a->FastDetect)
  560. {
  561. timeout_value = UDP_ACCELERATION_KEEPALIVE_TIMEOUT_FAST;
  562. }
  563. if (check_keepalive)
  564. {
  565. if (a->LastRecvTick == 0 || ((a->LastRecvTick + timeout_value) < a->Now))
  566. {
  567. a->FirstStableReceiveTick = 0;
  568. return false;
  569. }
  570. else
  571. {
  572. if ((a->FirstStableReceiveTick + (UINT64)UDP_ACCELERATION_REQUIRE_CONTINUOUS) <= a->Now)
  573. {
  574. return true;
  575. }
  576. else
  577. {
  578. return false;
  579. }
  580. }
  581. }
  582. return true;
  583. }
  584. // Process the received packet
  585. BLOCK *UdpAccelProcessRecvPacket(UDP_ACCEL *a, UCHAR *buf, UINT size, IP *src_ip, UINT src_port)
  586. {
  587. UCHAR key[UDP_ACCELERATION_PACKET_KEY_SIZE];
  588. UCHAR *iv;
  589. CRYPT *c;
  590. UINT64 my_tick, your_tick;
  591. UINT inner_size;
  592. UCHAR *inner_data = NULL;
  593. UINT pad_size;
  594. UCHAR *verify;
  595. bool compress_flag;
  596. BLOCK *b = NULL;
  597. UINT cookie;
  598. // Validate arguments
  599. if (a == NULL || buf == NULL || size == 0 || src_ip == NULL)
  600. {
  601. return NULL;
  602. }
  603. if (a->PlainTextMode == false)
  604. {
  605. // IV
  606. if (size < UDP_ACCELERATION_PACKET_IV_SIZE)
  607. {
  608. return NULL;
  609. }
  610. iv = buf;
  611. buf += UDP_ACCELERATION_PACKET_IV_SIZE;
  612. size -= UDP_ACCELERATION_PACKET_IV_SIZE;
  613. // Calculate the key
  614. UdpAccelCalcKey(key, a->YourKey, iv);
  615. if (false)
  616. {
  617. char tmp1[256];
  618. char tmp2[256];
  619. char tmp3[256];
  620. BinToStr(tmp1, sizeof(tmp1), a->YourKey, sizeof(a->YourKey));
  621. BinToStr(tmp2, sizeof(tmp2), iv, UDP_ACCELERATION_PACKET_IV_SIZE);
  622. BinToStr(tmp3, sizeof(tmp3), key, sizeof(key));
  623. Debug("Your Key: %s\n"
  624. "IV : %s\n"
  625. "Comm Key: %s\n",
  626. tmp1, tmp2, tmp3);
  627. }
  628. // Decryption
  629. c = NewCrypt(key, UDP_ACCELERATION_PACKET_KEY_SIZE);
  630. Encrypt(c, buf, buf, size);
  631. FreeCrypt(c);
  632. }
  633. // Cookie
  634. if (size < sizeof(UINT))
  635. {
  636. return NULL;
  637. }
  638. cookie = READ_UINT(buf);
  639. buf += sizeof(UINT);
  640. size -= sizeof(UINT);
  641. if (cookie != a->MyCookie)
  642. {
  643. return NULL;
  644. }
  645. // My Tick
  646. if (size < sizeof(UINT64))
  647. {
  648. return NULL;
  649. }
  650. my_tick = READ_UINT64(buf);
  651. buf += sizeof(UINT64);
  652. size -= sizeof(UINT64);
  653. // Your Tick
  654. if (size < sizeof(UINT64))
  655. {
  656. return NULL;
  657. }
  658. your_tick = READ_UINT64(buf);
  659. buf += sizeof(UINT64);
  660. size -= sizeof(UINT64);
  661. // inner_size
  662. if (size < sizeof(USHORT))
  663. {
  664. return NULL;
  665. }
  666. inner_size = READ_USHORT(buf);
  667. buf += sizeof(USHORT);
  668. size -= sizeof(USHORT);
  669. // compress_flag
  670. if (size < sizeof(UCHAR))
  671. {
  672. return NULL;
  673. }
  674. compress_flag = *((UCHAR *)buf);
  675. buf += sizeof(UCHAR);
  676. size -= sizeof(UCHAR);
  677. if (size < inner_size)
  678. {
  679. return NULL;
  680. }
  681. // inner_data
  682. if (inner_size >= 1)
  683. {
  684. inner_data = buf;
  685. buf += inner_size;
  686. size -= inner_size;
  687. }
  688. if (a->PlainTextMode == false)
  689. {
  690. // padding
  691. if (size < UDP_ACCELERATION_PACKET_IV_SIZE)
  692. {
  693. return false;
  694. }
  695. pad_size = size - UDP_ACCELERATION_PACKET_IV_SIZE;
  696. buf += pad_size;
  697. size -= pad_size;
  698. // verify
  699. if (size != UDP_ACCELERATION_PACKET_IV_SIZE)
  700. {
  701. return NULL;
  702. }
  703. verify = buf;
  704. if (IsZero(verify, UDP_ACCELERATION_PACKET_IV_SIZE) == false)
  705. {
  706. return NULL;
  707. }
  708. }
  709. if (my_tick < a->LastRecvYourTick)
  710. {
  711. if ((a->LastRecvYourTick - my_tick) >= ((UINT64)UDP_ACCELERATION_WINDOW_SIZE_MSEC))
  712. {
  713. return NULL;
  714. }
  715. }
  716. a->LastRecvMyTick = MAX(a->LastRecvMyTick, your_tick);
  717. a->LastRecvYourTick = MAX(a->LastRecvYourTick, my_tick);
  718. if (inner_size >= 1)
  719. {
  720. b = NewBlock(Clone(inner_data, inner_size), inner_size, compress_flag ? -1 : 0);
  721. }
  722. if (a->LastSetSrcIpAndPortTick < a->LastRecvYourTick)
  723. {
  724. a->LastSetSrcIpAndPortTick = a->LastRecvYourTick;
  725. Copy(&a->YourIp, src_ip, sizeof(IP));
  726. a->YourPort = src_port;
  727. }
  728. if (a->LastRecvMyTick != 0)
  729. {
  730. if ((a->LastRecvMyTick + (UINT64)(UDP_ACCELERATION_WINDOW_SIZE_MSEC)) >= a->Now)
  731. {
  732. a->LastRecvTick = a->Now;
  733. a->IsReachedOnce = true;
  734. if (a->FirstStableReceiveTick == 0)
  735. {
  736. a->FirstStableReceiveTick = a->Now;
  737. }
  738. }
  739. }
  740. return b;
  741. }
  742. // Calculate the key
  743. void UdpAccelCalcKey(UCHAR *key, UCHAR *common_key, UCHAR *iv)
  744. {
  745. UCHAR tmp[UDP_ACCELERATION_COMMON_KEY_SIZE + UDP_ACCELERATION_PACKET_IV_SIZE];
  746. // Validate arguments
  747. if (key == NULL || common_key == NULL || iv == NULL)
  748. {
  749. return;
  750. }
  751. Copy(tmp, common_key, UDP_ACCELERATION_COMMON_KEY_SIZE);
  752. Copy(tmp + UDP_ACCELERATION_COMMON_KEY_SIZE, iv, UDP_ACCELERATION_PACKET_IV_SIZE);
  753. HashSha1(key, tmp, sizeof(tmp));
  754. }
  755. // Set the current time
  756. void UdpAccelSetTick(UDP_ACCEL *a, UINT64 tick64)
  757. {
  758. // Validate arguments
  759. if (a == NULL)
  760. {
  761. return;
  762. }
  763. a->Now = tick64;
  764. }
  765. // Initialize the server-side
  766. bool UdpAccelInitServer(UDP_ACCEL *a, UCHAR *client_key, IP *client_ip, UINT client_port, IP *client_ip_2)
  767. {
  768. char tmp[MAX_SIZE];
  769. // Validate arguments
  770. if (a == NULL || client_key == NULL)
  771. {
  772. return false;
  773. }
  774. IPToStr(tmp, sizeof(tmp), client_ip);
  775. Debug("UdpAccelInitServer: client_ip=%s, client_port=%u, server_cookie=%u, client_cookie=%u\n", tmp, client_port,
  776. a->MyCookie, a->YourCookie);
  777. if (IsIP6(client_ip) != a->IsIPv6)
  778. {
  779. return false;
  780. }
  781. Copy(a->YourKey, client_key, UDP_ACCELERATION_COMMON_KEY_SIZE);
  782. Copy(&a->YourIp, client_ip, sizeof(IP));
  783. Copy(&a->YourIp2, client_ip_2, sizeof(IP));
  784. a->YourPort = client_port;
  785. a->Now = Tick64();
  786. a->Inited = true;
  787. return true;
  788. }
  789. // Initialize the client-side
  790. bool UdpAccelInitClient(UDP_ACCEL *a, UCHAR *server_key, IP *server_ip, UINT server_port, UINT server_cookie, UINT client_cookie, IP *server_ip_2)
  791. {
  792. char tmp[MAX_SIZE];
  793. // Validate arguments
  794. if (a == NULL || server_key == NULL || server_ip == NULL || server_port == 0)
  795. {
  796. return false;
  797. }
  798. IPToStr(tmp, sizeof(tmp), server_ip);
  799. Debug("UdpAccelInitClient: server_ip=%s, server_port=%u, server_cookie=%u, client_cookie=%u\n", tmp, server_port, server_cookie, client_cookie);
  800. if (IsIP6(server_ip) != a->IsIPv6)
  801. {
  802. return false;
  803. }
  804. Copy(a->YourKey, server_key, UDP_ACCELERATION_COMMON_KEY_SIZE);
  805. Copy(&a->YourIp, server_ip, sizeof(IP));
  806. Copy(&a->YourIp2, server_ip_2, sizeof(IP));
  807. a->YourPort = server_port;
  808. a->Now = Tick64();
  809. a->MyCookie = client_cookie;
  810. a->YourCookie = server_cookie;
  811. a->Inited = true;
  812. return true;
  813. }
  814. // Create a new UDP acceleration function
  815. UDP_ACCEL *NewUdpAccel(CEDAR *cedar, IP *ip, bool client_mode, bool random_port, bool no_nat_t)
  816. {
  817. UDP_ACCEL *a;
  818. SOCK *s;
  819. UINT max_udp_size;
  820. bool is_in_cedar_port_list = false;
  821. if (IsZeroIP(ip))
  822. {
  823. ip = NULL;
  824. }
  825. if (client_mode || random_port)
  826. {
  827. // Use a appropriate vacant port number in the case of using random port or client mode
  828. s = NewUDPEx3(0, ip);
  829. }
  830. else
  831. {
  832. // Specify in the range in the case of server mode
  833. UINT i;
  834. s = NULL;
  835. LockList(cedar->UdpPortList);
  836. {
  837. for (i = UDP_SERVER_PORT_LOWER;i <= UDP_SERVER_PORT_HIGHER;i++)
  838. {
  839. if (IsIntInList(cedar->UdpPortList, i) == false)
  840. {
  841. s = NewUDPEx3(i, ip);
  842. if (s != NULL)
  843. {
  844. is_in_cedar_port_list = true;
  845. break;
  846. }
  847. }
  848. }
  849. if (s == NULL)
  850. {
  851. // Leave the port selection to the OS because the available port is not found within the range
  852. s = NewUDPEx3(0, ip);
  853. }
  854. if (s != NULL && is_in_cedar_port_list)
  855. {
  856. AddIntDistinct(cedar->UdpPortList, i);
  857. }
  858. }
  859. UnlockList(cedar->UdpPortList);
  860. }
  861. if (s == NULL)
  862. {
  863. return NULL;
  864. }
  865. a = ZeroMalloc(sizeof(UDP_ACCEL));
  866. a->Cedar = cedar;
  867. AddRef(a->Cedar->ref);
  868. a->NoNatT = no_nat_t;
  869. a->NatT_TranId = Rand64();
  870. a->CreatedTick = Tick64();
  871. a->IsInCedarPortList = is_in_cedar_port_list;
  872. a->ClientMode = client_mode;
  873. a->Now = Tick64();
  874. a->UdpSock = s;
  875. Rand(a->MyKey, sizeof(a->MyKey));
  876. Rand(a->YourKey, sizeof(a->YourKey));
  877. Copy(&a->MyIp, ip, sizeof(IP));
  878. a->MyPort = s->LocalPort;
  879. a->IsIPv6 = IsIP6(ip);
  880. if (a->IsIPv6)
  881. {
  882. a->NoNatT = true;
  883. }
  884. a->RecvBlockQueue = NewQueue();
  885. Rand(a->NextIv, sizeof(a->NextIv));
  886. do
  887. {
  888. a->MyCookie = Rand32();
  889. }
  890. while (a->MyCookie == 0);
  891. do
  892. {
  893. a->YourCookie = Rand32();
  894. }
  895. while (a->MyCookie == 0 || a->MyCookie == a->YourCookie);
  896. // Calculate the maximum transmittable UDP packet size
  897. max_udp_size = MTU_FOR_PPPOE;
  898. if (a->IsIPv6 == false)
  899. {
  900. // IPv4
  901. max_udp_size -= 20;
  902. }
  903. else
  904. {
  905. // IPv6
  906. max_udp_size -= 40;
  907. }
  908. // UDP
  909. max_udp_size -= 8;
  910. a->MaxUdpPacketSize = max_udp_size;
  911. Debug("Udp Accel My Port = %u\n", a->MyPort);
  912. // Initialize the NAT-T server IP address acquisition thread
  913. a->NatT_Lock = NewLock();
  914. a->NatT_HaltEvent = NewEvent();
  915. if (a->NoNatT == false)
  916. {
  917. a->NatT_GetIpThread = NewThread(NatT_GetIpThread, a);
  918. }
  919. return a;
  920. }
  921. // NAT-T server IP address acquisition thread
  922. void NatT_GetIpThread(THREAD *thread, void *param)
  923. {
  924. UDP_ACCEL *a;
  925. char hostname[MAX_SIZE];
  926. static IP dummy_ip = {0};
  927. UINT num_retry = 0;
  928. // Validate arguments
  929. if (thread == NULL || param == NULL)
  930. {
  931. return;
  932. }
  933. a = (UDP_ACCEL *)param;
  934. if (IsZeroIP(&dummy_ip))
  935. {
  936. SetIP(&dummy_ip, 11, Rand8(), Rand8(), Rand8());
  937. }
  938. RUDPGetRegisterHostNameByIP(hostname, sizeof(hostname), &dummy_ip);
  939. while (a->NatT_Halt == false)
  940. {
  941. IP ip;
  942. UINT wait_time = UDP_NAT_T_GET_IP_INTERVAL;
  943. // Get the IP address
  944. bool ret = GetIP4Ex(&ip, hostname, 0, &a->NatT_Halt);
  945. if (ret && (IsZeroIp(&ip) == false))
  946. {
  947. char tmp[128];
  948. // Success to get
  949. Lock(a->NatT_Lock);
  950. {
  951. Copy(&a->NatT_IP, &ip, sizeof(IP));
  952. }
  953. Unlock(a->NatT_Lock);
  954. IPToStr(tmp, sizeof(tmp), &ip);
  955. Debug("NAT-T IP Address Resolved: %s = %s\n", hostname, tmp);
  956. a->NatT_IP_Changed = true;
  957. break;
  958. }
  959. // Fail to get
  960. num_retry++;
  961. wait_time = (UINT)(MIN((UINT64)UDP_NAT_T_GET_IP_INTERVAL * (UINT64)num_retry, (UINT64)UDP_NAT_T_GET_IP_INTERVAL_MAX));
  962. Wait(a->NatT_HaltEvent, wait_time);
  963. }
  964. }
  965. // Release the UDP acceleration function
  966. void FreeUdpAccel(UDP_ACCEL *a)
  967. {
  968. // Validate arguments
  969. if (a == NULL)
  970. {
  971. return;
  972. }
  973. while (true)
  974. {
  975. BLOCK *b = GetNext(a->RecvBlockQueue);
  976. if (b == NULL)
  977. {
  978. break;
  979. }
  980. FreeBlock(b);
  981. }
  982. ReleaseQueue(a->RecvBlockQueue);
  983. ReleaseSock(a->UdpSock);
  984. if (a->IsInCedarPortList)
  985. {
  986. LockList(a->Cedar->UdpPortList);
  987. {
  988. DelInt(a->Cedar->UdpPortList, a->MyPort);
  989. }
  990. UnlockList(a->Cedar->UdpPortList);
  991. }
  992. // Release of NAT-T related
  993. a->NatT_Halt = true;
  994. Set(a->NatT_HaltEvent);
  995. if (a->NatT_GetIpThread != NULL)
  996. {
  997. WaitThread(a->NatT_GetIpThread, INFINITE);
  998. ReleaseThread(a->NatT_GetIpThread);
  999. }
  1000. ReleaseEvent(a->NatT_HaltEvent);
  1001. DeleteLock(a->NatT_Lock);
  1002. ReleaseCedar(a->Cedar);
  1003. Free(a);
  1004. }
  1005. // Developed by SoftEther VPN Project at University of Tsukuba in Japan.
  1006. // Department of Computer Science has dozens of overly-enthusiastic geeks.
  1007. // Join us: http://www.tsukuba.ac.jp/english/admission/