BSocket.c 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745
  1. /**
  2. * @file BSocket.c
  3. * @author Ambroz Bizjak <ambrop7@gmail.com>
  4. *
  5. * @section LICENSE
  6. *
  7. * This file is part of BadVPN.
  8. *
  9. * BadVPN is free software: you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2
  11. * as published by the Free Software Foundation.
  12. *
  13. * BadVPN is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License along
  19. * with this program; if not, write to the Free Software Foundation, Inc.,
  20. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  21. */
  22. #ifndef BADVPN_USE_WINAPI
  23. #define _GNU_SOURCE
  24. #include <sys/types.h>
  25. #include <sys/socket.h>
  26. #include <sys/un.h>
  27. #include <netinet/in.h>
  28. #include <netinet/tcp.h>
  29. #include <arpa/inet.h>
  30. #include <unistd.h>
  31. #include <fcntl.h>
  32. #include <errno.h>
  33. #include <sys/socket.h>
  34. #include <signal.h>
  35. #endif
  36. #ifdef BADVPN_LINUX
  37. #include <netpacket/packet.h>
  38. #include <net/ethernet.h>
  39. #endif
  40. #include <stdlib.h>
  41. #include <string.h>
  42. #include <stddef.h>
  43. #include <misc/debug.h>
  44. #include <system/BLog.h>
  45. #include <system/BSocket.h>
  46. #include <generated/blog_channel_BSocket.h>
  47. #define HANDLER_READ 0
  48. #define HANDLER_WRITE 1
  49. #define HANDLER_ACCEPT 2
  50. #define HANDLER_CONNECT 3
  51. #define HANDLER_ERROR 4
  52. #define CONNECT_STATUS_NONE 0
  53. #define CONNECT_STATUS_CONNECTING 1
  54. #define CONNECT_STATUS_DONE 2
  55. #define CONNECT_STATUS_DONE_IMMEDIATELY 3
  56. int bsocket_initialized = 0;
  57. static int get_event_index (int event)
  58. {
  59. switch (event) {
  60. case BSOCKET_READ:
  61. return HANDLER_READ;
  62. case BSOCKET_WRITE:
  63. return HANDLER_WRITE;
  64. case BSOCKET_ACCEPT:
  65. return HANDLER_ACCEPT;
  66. case BSOCKET_CONNECT:
  67. return HANDLER_CONNECT;
  68. case BSOCKET_ERROR:
  69. return HANDLER_ERROR;
  70. default:
  71. ASSERT(0)
  72. return 42;
  73. }
  74. }
  75. static int handler_events[] = {
  76. [HANDLER_READ] = BSOCKET_READ,
  77. [HANDLER_WRITE] = BSOCKET_WRITE,
  78. [HANDLER_ACCEPT] = BSOCKET_ACCEPT,
  79. [HANDLER_CONNECT] = BSOCKET_CONNECT,
  80. [HANDLER_ERROR] = BSOCKET_ERROR
  81. };
  82. static void init_handlers (BSocket *bs)
  83. {
  84. bs->global_handler = NULL;
  85. for (int i = 0; i < BSOCKET_NUM_EVENTS; i++) {
  86. bs->handlers[i] = NULL;
  87. }
  88. }
  89. static int set_nonblocking (int s)
  90. {
  91. #ifdef BADVPN_USE_WINAPI
  92. unsigned long bl = 1;
  93. int res = ioctlsocket(s, FIONBIO, &bl);
  94. #else
  95. int res = fcntl(s, F_SETFL, O_NONBLOCK);
  96. #endif
  97. return res;
  98. }
  99. static int set_pktinfo (int s)
  100. {
  101. #ifdef BADVPN_USE_WINAPI
  102. DWORD opt = 1;
  103. int res = setsockopt(s, IPPROTO_IP, IP_PKTINFO, (char *)&opt, sizeof(opt));
  104. #elif defined(BADVPN_FREEBSD)
  105. int opt = 1;
  106. int res = setsockopt(s, IPPROTO_IP, IP_RECVDSTADDR, &opt, sizeof(opt)); // IP_SENDSRCADDR is the same
  107. #else
  108. int opt = 1;
  109. int res = setsockopt(s, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt));
  110. #endif
  111. return res;
  112. }
  113. static int set_pktinfo6 (int s)
  114. {
  115. #ifdef BADVPN_USE_WINAPI
  116. DWORD opt = 1;
  117. int res = setsockopt(s, IPPROTO_IPV6, IPV6_PKTINFO, (char *)&opt, sizeof(opt));
  118. #else
  119. # ifdef IPV6_RECVPKTINFO
  120. int opt = 1;
  121. int res = setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &opt, sizeof(opt));
  122. # else
  123. int res = 0; // assume it succeeded
  124. # endif
  125. #endif
  126. return res;
  127. }
  128. static void close_socket (int fd)
  129. {
  130. #ifdef BADVPN_USE_WINAPI
  131. int res = closesocket(fd);
  132. #else
  133. int res = close(fd);
  134. #endif
  135. ASSERT_FORCE(res == 0)
  136. }
  137. static int translate_error (int error)
  138. {
  139. #ifdef BADVPN_USE_WINAPI
  140. switch (error) {
  141. case WSAEADDRNOTAVAIL:
  142. return BSOCKET_ERROR_ADDRESS_NOT_AVAILABLE;
  143. case WSAEADDRINUSE:
  144. return BSOCKET_ERROR_ADDRESS_IN_USE;
  145. case WSAECONNRESET:
  146. return BSOCKET_ERROR_CONNECTION_RESET;
  147. case WSAETIMEDOUT:
  148. return BSOCKET_ERROR_CONNECTION_TIMED_OUT;
  149. case WSAECONNREFUSED:
  150. return BSOCKET_ERROR_CONNECTION_REFUSED;
  151. }
  152. #else
  153. switch (error) {
  154. case EADDRNOTAVAIL:
  155. return BSOCKET_ERROR_ADDRESS_NOT_AVAILABLE;
  156. case EADDRINUSE:
  157. return BSOCKET_ERROR_ADDRESS_IN_USE;
  158. case EACCES:
  159. case EPERM:
  160. return BSOCKET_ERROR_ACCESS_DENIED;
  161. case ECONNREFUSED:
  162. return BSOCKET_ERROR_CONNECTION_REFUSED;
  163. case ECONNRESET:
  164. return BSOCKET_ERROR_CONNECTION_RESET;
  165. case ENETUNREACH:
  166. return BSOCKET_ERROR_NETWORK_UNREACHABLE;
  167. case ETIMEDOUT:
  168. return BSOCKET_ERROR_CONNECTION_TIMED_OUT;
  169. case ENOMEM:
  170. return BSOCKET_ERROR_NO_MEMORY;
  171. }
  172. #endif
  173. return BSOCKET_ERROR_UNKNOWN;
  174. }
  175. struct sys_addr {
  176. #ifdef BADVPN_USE_WINAPI
  177. int len;
  178. #else
  179. socklen_t len;
  180. #endif
  181. union {
  182. struct sockaddr generic;
  183. struct sockaddr_in ipv4;
  184. struct sockaddr_in6 ipv6;
  185. #ifdef BADVPN_LINUX
  186. struct sockaddr_ll packet;
  187. #endif
  188. } addr;
  189. };
  190. static void addr_socket_to_sys (struct sys_addr *out, BAddr *addr)
  191. {
  192. switch (addr->type) {
  193. case BADDR_TYPE_IPV4:
  194. out->len = sizeof(out->addr.ipv4);
  195. memset(&out->addr.ipv4, 0, sizeof(out->addr.ipv4));
  196. out->addr.ipv4.sin_family = AF_INET;
  197. out->addr.ipv4.sin_port = addr->ipv4.port;
  198. out->addr.ipv4.sin_addr.s_addr = addr->ipv4.ip;
  199. break;
  200. case BADDR_TYPE_IPV6:
  201. out->len = sizeof(out->addr.ipv6);
  202. memset(&out->addr.ipv6, 0, sizeof(out->addr.ipv6));
  203. out->addr.ipv6.sin6_family = AF_INET6;
  204. out->addr.ipv6.sin6_port = addr->ipv6.port;
  205. out->addr.ipv6.sin6_flowinfo = 0;
  206. memcpy(out->addr.ipv6.sin6_addr.s6_addr, addr->ipv6.ip, 16);
  207. out->addr.ipv6.sin6_scope_id = 0;
  208. break;
  209. #ifdef BADVPN_LINUX
  210. case BADDR_TYPE_PACKET:
  211. ASSERT(addr->packet.header_type == BADDR_PACKET_HEADER_TYPE_ETHERNET)
  212. memset(&out->addr.packet, 0, sizeof(out->addr.packet));
  213. out->len = sizeof(out->addr.packet);
  214. out->addr.packet.sll_family = AF_PACKET;
  215. out->addr.packet.sll_protocol = addr->packet.phys_proto;
  216. out->addr.packet.sll_ifindex = addr->packet.interface_index;
  217. out->addr.packet.sll_hatype = 1; // linux/if_arp.h: #define ARPHRD_ETHER 1
  218. switch (addr->packet.packet_type) {
  219. case BADDR_PACKET_PACKET_TYPE_HOST:
  220. out->addr.packet.sll_pkttype = PACKET_HOST;
  221. break;
  222. case BADDR_PACKET_PACKET_TYPE_BROADCAST:
  223. out->addr.packet.sll_pkttype = PACKET_BROADCAST;
  224. break;
  225. case BADDR_PACKET_PACKET_TYPE_MULTICAST:
  226. out->addr.packet.sll_pkttype = PACKET_MULTICAST;
  227. break;
  228. case BADDR_PACKET_PACKET_TYPE_OTHERHOST:
  229. out->addr.packet.sll_pkttype = PACKET_OTHERHOST;
  230. break;
  231. case BADDR_PACKET_PACKET_TYPE_OUTGOING:
  232. out->addr.packet.sll_pkttype = PACKET_OUTGOING;
  233. break;
  234. default:
  235. ASSERT(0);
  236. }
  237. out->addr.packet.sll_halen = 6;
  238. memcpy(out->addr.packet.sll_addr, addr->packet.phys_addr, 6);
  239. break;
  240. #endif
  241. default:
  242. ASSERT(0)
  243. break;
  244. }
  245. }
  246. static void addr_sys_to_socket (BAddr *out, struct sys_addr *addr)
  247. {
  248. switch (addr->addr.generic.sa_family) {
  249. case AF_INET:
  250. ASSERT(addr->len == sizeof(struct sockaddr_in))
  251. BAddr_InitIPv4(out, addr->addr.ipv4.sin_addr.s_addr, addr->addr.ipv4.sin_port);
  252. break;
  253. case AF_INET6:
  254. ASSERT(addr->len == sizeof(struct sockaddr_in6))
  255. BAddr_InitIPv6(out, addr->addr.ipv6.sin6_addr.s6_addr, addr->addr.ipv6.sin6_port);
  256. break;
  257. default:
  258. BAddr_InitNone(out);
  259. break;
  260. }
  261. }
  262. static void dispatch_event (BSocket *bs)
  263. {
  264. ASSERT(!bs->global_handler)
  265. ASSERT(bs->current_event_index >= 0)
  266. ASSERT(bs->current_event_index < BSOCKET_NUM_EVENTS)
  267. ASSERT(((bs->ready_events)&~(bs->waitEvents)) == 0)
  268. ASSERT(!BPending_IsSet(&bs->job))
  269. do {
  270. // get event
  271. int ev_index = bs->current_event_index;
  272. int ev_mask = handler_events[ev_index];
  273. int ev_dispatch = (bs->ready_events&ev_mask);
  274. // jump to next event, clear this event
  275. bs->current_event_index++;
  276. bs->ready_events &= ~ev_mask;
  277. ASSERT(!(bs->ready_events) || bs->current_event_index < BSOCKET_NUM_EVENTS)
  278. if (ev_dispatch) {
  279. // if there are more events to dispatch, schedule job
  280. if (bs->ready_events) {
  281. BPending_Set(&bs->job);
  282. }
  283. // dispatch this event
  284. bs->handlers[ev_index](bs->handlers_user[ev_index], ev_mask);
  285. return;
  286. }
  287. } while (bs->current_event_index < BSOCKET_NUM_EVENTS);
  288. ASSERT(!bs->ready_events)
  289. }
  290. static void job_handler (BSocket *bs)
  291. {
  292. ASSERT(!bs->global_handler) // BSocket_RemoveGlobalEventHandler unsets the job
  293. ASSERT(bs->current_event_index >= 0)
  294. ASSERT(bs->current_event_index < BSOCKET_NUM_EVENTS)
  295. ASSERT(((bs->ready_events)&~(bs->waitEvents)) == 0) // BSocket_DisableEvent clears events from ready_events
  296. DebugObject_Access(&bs->d_obj);
  297. dispatch_event(bs);
  298. return;
  299. }
  300. static void dispatch_events (BSocket *bs, int events)
  301. {
  302. ASSERT((events&~(bs->waitEvents)) == 0)
  303. ASSERT(!BPending_IsSet(&bs->job))
  304. // reset recv number
  305. bs->recv_num = 0;
  306. if (bs->global_handler) {
  307. if (events) {
  308. bs->global_handler(bs->global_handler_user, events);
  309. }
  310. return;
  311. }
  312. bs->ready_events = events;
  313. bs->current_event_index = 0;
  314. dispatch_event(bs);
  315. return;
  316. }
  317. static void connect_job_handler (BSocket *bs)
  318. {
  319. ASSERT(bs->connecting_status == CONNECT_STATUS_DONE_IMMEDIATELY)
  320. ASSERT((bs->waitEvents & BSOCKET_CONNECT))
  321. DebugObject_Access(&bs->d_obj);
  322. // allow retrieving the result
  323. bs->connecting_status = CONNECT_STATUS_DONE;
  324. if (bs->global_handler) {
  325. bs->global_handler(bs->global_handler_user, BSOCKET_CONNECT);
  326. return;
  327. }
  328. bs->handlers[HANDLER_CONNECT](bs->handlers_user[HANDLER_CONNECT], BSOCKET_CONNECT);
  329. return;
  330. }
  331. #ifdef BADVPN_USE_WINAPI
  332. static long get_wsa_events (int sock_events)
  333. {
  334. long res = 0;
  335. if ((sock_events&BSOCKET_READ)) {
  336. res |= FD_READ | FD_CLOSE;
  337. }
  338. if ((sock_events&BSOCKET_WRITE)) {
  339. res |= FD_WRITE | FD_CLOSE;
  340. }
  341. if ((sock_events&BSOCKET_ACCEPT)) {
  342. res |= FD_ACCEPT | FD_CLOSE;
  343. }
  344. if ((sock_events&BSOCKET_CONNECT)) {
  345. res |= FD_CONNECT | FD_CLOSE;
  346. }
  347. return res;
  348. }
  349. static void handle_handler (BSocket *bs)
  350. {
  351. ASSERT(!BPending_IsSet(&bs->job))
  352. DebugObject_Access(&bs->d_obj);
  353. // enumerate network events and reset event
  354. WSANETWORKEVENTS events;
  355. int res = WSAEnumNetworkEvents(bs->socket, bs->event, &events);
  356. ASSERT_FORCE(res == 0)
  357. int returned_events = 0;
  358. if ((bs->waitEvents&BSOCKET_READ) && ((events.lNetworkEvents&FD_READ) || (events.lNetworkEvents&FD_CLOSE))) {
  359. returned_events |= BSOCKET_READ;
  360. }
  361. if ((bs->waitEvents&BSOCKET_WRITE) && ((events.lNetworkEvents&FD_WRITE) || (events.lNetworkEvents&FD_CLOSE))) {
  362. returned_events |= BSOCKET_WRITE;
  363. }
  364. if ((bs->waitEvents&BSOCKET_ACCEPT) && ((events.lNetworkEvents&FD_ACCEPT) || (events.lNetworkEvents&FD_CLOSE))) {
  365. returned_events |= BSOCKET_ACCEPT;
  366. }
  367. if ((bs->waitEvents&BSOCKET_CONNECT) && ((events.lNetworkEvents&FD_CONNECT) || (events.lNetworkEvents&FD_CLOSE))) {
  368. returned_events |= BSOCKET_CONNECT;
  369. // read connection attempt result
  370. ASSERT(bs->connecting_status == CONNECT_STATUS_CONNECTING)
  371. bs->connecting_status = CONNECT_STATUS_DONE;
  372. if (events.iErrorCode[FD_CONNECT_BIT] == 0) {
  373. bs->connecting_result = BSOCKET_ERROR_NONE;
  374. } else {
  375. bs->connecting_result = translate_error(events.iErrorCode[FD_CONNECT_BIT]);
  376. }
  377. }
  378. if ((bs->waitEvents&BSOCKET_ERROR) && (events.lNetworkEvents&FD_CLOSE)) {
  379. returned_events |= BSOCKET_ERROR;
  380. }
  381. dispatch_events(bs, returned_events);
  382. return;
  383. }
  384. #else
  385. static int get_reactor_fd_events (int sock_events)
  386. {
  387. int res = 0;
  388. if ((sock_events&BSOCKET_READ) || (sock_events&BSOCKET_ACCEPT)) {
  389. res |= BREACTOR_READ;
  390. }
  391. if ((sock_events&BSOCKET_WRITE) || (sock_events&BSOCKET_CONNECT)) {
  392. res |= BREACTOR_WRITE;
  393. }
  394. return res;
  395. }
  396. static void file_descriptor_handler (BSocket *bs, int events)
  397. {
  398. ASSERT(!BPending_IsSet(&bs->job))
  399. DebugObject_Access(&bs->d_obj);
  400. int returned_events = 0;
  401. if ((bs->waitEvents&BSOCKET_READ) && ((events&BREACTOR_READ) || (events&BREACTOR_ERROR))) {
  402. returned_events |= BSOCKET_READ;
  403. }
  404. if ((bs->waitEvents&BSOCKET_WRITE) && ((events&BREACTOR_WRITE) || (events&BREACTOR_ERROR))) {
  405. returned_events |= BSOCKET_WRITE;
  406. }
  407. if ((bs->waitEvents&BSOCKET_ACCEPT) && ((events&BREACTOR_READ) || (events&BREACTOR_ERROR))) {
  408. returned_events |= BSOCKET_ACCEPT;
  409. }
  410. if ((bs->waitEvents&BSOCKET_CONNECT) && ((events&BREACTOR_WRITE) || (events&BREACTOR_ERROR))) {
  411. returned_events |= BSOCKET_CONNECT;
  412. // read connection attempt result
  413. ASSERT(bs->connecting_status == CONNECT_STATUS_CONNECTING)
  414. bs->connecting_status = CONNECT_STATUS_DONE;
  415. int result;
  416. socklen_t result_len = sizeof(result);
  417. int res = getsockopt(bs->socket, SOL_SOCKET, SO_ERROR, &result, &result_len);
  418. ASSERT_FORCE(res == 0)
  419. if (result == 0) {
  420. bs->connecting_result = BSOCKET_ERROR_NONE;
  421. } else {
  422. bs->connecting_result = translate_error(result);
  423. }
  424. }
  425. if ((bs->waitEvents&BSOCKET_ERROR) && (events&BREACTOR_ERROR)) {
  426. returned_events |= BSOCKET_ERROR;
  427. }
  428. dispatch_events(bs, returned_events);
  429. return;
  430. }
  431. #endif
  432. static int init_event_backend (BSocket *bs)
  433. {
  434. #ifdef BADVPN_USE_WINAPI
  435. if ((bs->event = WSACreateEvent()) == WSA_INVALID_EVENT) {
  436. return 0;
  437. }
  438. BHandle_Init(&bs->bhandle, bs->event, (BHandle_handler)handle_handler, bs);
  439. if (!BReactor_AddHandle(bs->bsys, &bs->bhandle)) {
  440. ASSERT_FORCE(WSACloseEvent(bs->event))
  441. return 0;
  442. }
  443. BReactor_EnableHandle(bs->bsys, &bs->bhandle);
  444. #else
  445. BFileDescriptor_Init(&bs->fd, bs->socket, (BFileDescriptor_handler)file_descriptor_handler, bs);
  446. if (!BReactor_AddFileDescriptor(bs->bsys, &bs->fd)) {
  447. return 0;
  448. }
  449. #endif
  450. return 1;
  451. }
  452. static void free_event_backend (BSocket *bs)
  453. {
  454. #ifdef BADVPN_USE_WINAPI
  455. BReactor_RemoveHandle(bs->bsys, &bs->bhandle);
  456. ASSERT_FORCE(WSACloseEvent(bs->event))
  457. #else
  458. BReactor_RemoveFileDescriptor(bs->bsys, &bs->fd);
  459. #endif
  460. }
  461. static void update_event_backend (BSocket *bs)
  462. {
  463. #ifdef BADVPN_USE_WINAPI
  464. ASSERT_FORCE(WSAEventSelect(bs->socket, bs->event, get_wsa_events(bs->waitEvents)) == 0)
  465. #else
  466. BReactor_SetFileDescriptorEvents(bs->bsys, &bs->fd, get_reactor_fd_events(bs->waitEvents));
  467. #endif
  468. }
  469. static int limit_recv (BSocket *bs)
  470. {
  471. if (bs->recv_max > 0) {
  472. if (bs->recv_num >= bs->recv_max) {
  473. return 1;
  474. }
  475. bs->recv_num++;
  476. }
  477. return 0;
  478. }
  479. static int setup_pktinfo (int socket, int type, int domain)
  480. {
  481. if (type == BSOCKET_TYPE_DGRAM) {
  482. switch (domain) {
  483. case BADDR_TYPE_IPV4:
  484. if (set_pktinfo(socket)) {
  485. return 0;
  486. }
  487. break;
  488. case BADDR_TYPE_IPV6:
  489. if (set_pktinfo6(socket)) {
  490. return 0;
  491. }
  492. break;
  493. }
  494. }
  495. return 1;
  496. }
  497. static void setup_winsock_exts (int socket, int type, BSocket *bs)
  498. {
  499. #ifdef BADVPN_USE_WINAPI
  500. if (type == BSOCKET_TYPE_DGRAM) {
  501. DWORD out_bytes;
  502. // obtain WSARecvMsg
  503. GUID guid_recv = WSAID_WSARECVMSG;
  504. if (WSAIoctl(socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid_recv, sizeof(guid_recv), &bs->WSARecvMsg, sizeof(bs->WSARecvMsg), &out_bytes, NULL, NULL) != 0) {
  505. bs->WSARecvMsg = NULL;
  506. }
  507. // obtain WSASendMsg
  508. GUID guid_send = WSAID_WSASENDMSG;
  509. if (WSAIoctl(socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid_send, sizeof(guid_send), &bs->WSASendMsg, sizeof(bs->WSASendMsg), &out_bytes, NULL, NULL) != 0) {
  510. bs->WSASendMsg = NULL;
  511. }
  512. }
  513. #endif
  514. }
  515. int BSocket_GlobalInit (void)
  516. {
  517. ASSERT(!bsocket_initialized)
  518. #ifdef BADVPN_USE_WINAPI
  519. WORD requested = MAKEWORD(2, 2);
  520. WSADATA wsadata;
  521. if (WSAStartup(requested, &wsadata) != 0) {
  522. goto fail0;
  523. }
  524. if (wsadata.wVersion != requested) {
  525. goto fail1;
  526. }
  527. #else
  528. struct sigaction act;
  529. memset(&act, 0, sizeof(act));
  530. act.sa_handler = SIG_IGN;
  531. sigemptyset(&act.sa_mask);
  532. act.sa_flags = 0;
  533. if (sigaction(SIGPIPE, &act, NULL) < 0) {
  534. BLog(BLOG_ERROR, "sigaction failed");
  535. goto fail0;
  536. }
  537. #endif
  538. bsocket_initialized = 1;
  539. return 0;
  540. #ifdef BADVPN_USE_WINAPI
  541. fail1:
  542. WSACleanup();
  543. #endif
  544. fail0:
  545. return -1;
  546. }
  547. int BSocket_Init (BSocket *bs, BReactor *bsys, int domain, int type)
  548. {
  549. // NOTE: if you change something here, you might also have to change BSocket_Accept
  550. // translate domain
  551. int sys_domain;
  552. switch (domain) {
  553. case BADDR_TYPE_IPV4:
  554. sys_domain = AF_INET;
  555. break;
  556. case BADDR_TYPE_IPV6:
  557. sys_domain = AF_INET6;
  558. break;
  559. #ifndef BADVPN_USE_WINAPI
  560. case BADDR_TYPE_UNIX:
  561. sys_domain = AF_UNIX;
  562. break;
  563. #endif
  564. #ifdef BADVPN_LINUX
  565. case BADDR_TYPE_PACKET:
  566. sys_domain = AF_PACKET;
  567. break;
  568. #endif
  569. default:
  570. ASSERT(0)
  571. return -1;
  572. }
  573. // translate type
  574. int sys_type;
  575. switch (type) {
  576. case BSOCKET_TYPE_STREAM:
  577. sys_type = SOCK_STREAM;
  578. break;
  579. case BSOCKET_TYPE_DGRAM:
  580. sys_type = SOCK_DGRAM;
  581. break;
  582. default:
  583. ASSERT(0)
  584. return -1;
  585. }
  586. // create socket
  587. int fd = socket(sys_domain, sys_type, 0);
  588. if (fd < 0) {
  589. BLog(BLOG_ERROR, "socket() failed");
  590. goto fail0;
  591. }
  592. // set socket nonblocking
  593. if (set_nonblocking(fd) != 0) {
  594. BLog(BLOG_ERROR, "set_nonblocking failed");
  595. goto fail1;
  596. }
  597. // set pktinfo if needed
  598. if (!setup_pktinfo(fd, type, domain)) {
  599. BLog(BLOG_ERROR, "setup_pktinfo failed");
  600. }
  601. // setup winsock exts
  602. setup_winsock_exts(fd, type, bs);
  603. bs->bsys = bsys;
  604. bs->type = type;
  605. bs->domain = domain;
  606. bs->socket = fd;
  607. bs->error = BSOCKET_ERROR_NONE;
  608. init_handlers(bs);
  609. bs->waitEvents = 0;
  610. bs->connecting_status = CONNECT_STATUS_NONE;
  611. bs->recv_max = BSOCKET_DEFAULT_RECV_MAX;
  612. bs->recv_num = 0;
  613. bs->ready_events = 0; // just initialize it so we can clear them safely from BSocket_DisableEvent
  614. // init job
  615. BPending_Init(&bs->job, BReactor_PendingGroup(bsys), (BPending_handler)job_handler, bs);
  616. // init connect job
  617. BPending_Init(&bs->connect_job, BReactor_PendingGroup(bsys), (BPending_handler)connect_job_handler, bs);
  618. // initialize event backend
  619. if (!init_event_backend(bs)) {
  620. BLog(BLOG_ERROR, "init_event_backend failed");
  621. goto fail2;
  622. }
  623. DebugObject_Init(&bs->d_obj);
  624. return 0;
  625. fail2:
  626. BPending_Free(&bs->connect_job);
  627. BPending_Free(&bs->job);
  628. fail1:
  629. close_socket(fd);
  630. fail0:
  631. return -1;
  632. }
  633. #ifndef BADVPN_USE_WINAPI
  634. int BSocket_InitPipe (BSocket *bs, BReactor *bsys, int fd)
  635. {
  636. // set socket nonblocking
  637. if (set_nonblocking(fd) != 0) {
  638. BLog(BLOG_ERROR, "set_nonblocking failed");
  639. goto fail0;
  640. }
  641. bs->bsys = bsys;
  642. bs->type = BSOCKET_TYPE_STREAM;
  643. bs->domain = BADDR_TYPE_UNIXPIPE;
  644. bs->socket = fd;
  645. bs->error = BSOCKET_ERROR_NONE;
  646. init_handlers(bs);
  647. bs->waitEvents = 0;
  648. bs->connecting_status = CONNECT_STATUS_NONE;
  649. bs->recv_max = BSOCKET_DEFAULT_RECV_MAX;
  650. bs->recv_num = 0;
  651. bs->ready_events = 0; // just initialize it so we can clear them safely from BSocket_DisableEvent
  652. // init job
  653. BPending_Init(&bs->job, BReactor_PendingGroup(bsys), (BPending_handler)job_handler, bs);
  654. // init connect job
  655. BPending_Init(&bs->connect_job, BReactor_PendingGroup(bsys), (BPending_handler)connect_job_handler, bs);
  656. // initialize event backend
  657. if (!init_event_backend(bs)) {
  658. BLog(BLOG_ERROR, "init_event_backend failed");
  659. goto fail1;
  660. }
  661. DebugObject_Init(&bs->d_obj);
  662. return 0;
  663. fail1:
  664. BPending_Free(&bs->connect_job);
  665. BPending_Free(&bs->job);
  666. fail0:
  667. return -1;
  668. }
  669. #endif
  670. void BSocket_Free (BSocket *bs)
  671. {
  672. DebugObject_Free(&bs->d_obj);
  673. // free event backend
  674. free_event_backend(bs);
  675. // free connect job
  676. BPending_Free(&bs->connect_job);
  677. // free job
  678. BPending_Free(&bs->job);
  679. // close socket
  680. #ifndef BADVPN_USE_WINAPI
  681. if (bs->domain != BADDR_TYPE_UNIXPIPE) {
  682. #endif
  683. close_socket(bs->socket);
  684. #ifndef BADVPN_USE_WINAPI
  685. }
  686. #endif
  687. }
  688. void BSocket_SetRecvMax (BSocket *bs, int max)
  689. {
  690. DebugObject_Access(&bs->d_obj);
  691. ASSERT(max > 0 || max == -1)
  692. bs->recv_max = max;
  693. bs->recv_num = 0;
  694. }
  695. int BSocket_GetError (BSocket *bs)
  696. {
  697. DebugObject_Access(&bs->d_obj);
  698. return bs->error;
  699. }
  700. void BSocket_AddGlobalEventHandler (BSocket *bs, BSocket_handler handler, void *user)
  701. {
  702. DebugObject_Access(&bs->d_obj);
  703. ASSERT(handler)
  704. ASSERT(!bs->global_handler)
  705. for (int i = 0; i < BSOCKET_NUM_EVENTS; i++) {
  706. ASSERT(!bs->handlers[i])
  707. }
  708. bs->global_handler = handler;
  709. bs->global_handler_user = user;
  710. // stop event dispatching job
  711. BPending_Unset(&bs->job);
  712. }
  713. void BSocket_RemoveGlobalEventHandler (BSocket *bs)
  714. {
  715. ASSERT(bs->global_handler)
  716. DebugObject_Access(&bs->d_obj);
  717. bs->global_handler = NULL;
  718. bs->waitEvents = 0;
  719. }
  720. void BSocket_SetGlobalEvents (BSocket *bs, int events)
  721. {
  722. ASSERT(bs->global_handler)
  723. DebugObject_Access(&bs->d_obj);
  724. // update events
  725. bs->waitEvents = events;
  726. // give new events to event backend
  727. update_event_backend(bs);
  728. }
  729. void BSocket_AddEventHandler (BSocket *bs, uint8_t event, BSocket_handler handler, void *user)
  730. {
  731. ASSERT(handler)
  732. ASSERT(!bs->global_handler)
  733. DebugObject_Access(&bs->d_obj);
  734. // get index
  735. int i = get_event_index(event);
  736. // event must not have handler
  737. ASSERT(!bs->handlers[i])
  738. // change handler
  739. bs->handlers[i] = handler;
  740. bs->handlers_user[i] = user;
  741. }
  742. void BSocket_RemoveEventHandler (BSocket *bs, uint8_t event)
  743. {
  744. DebugObject_Access(&bs->d_obj);
  745. // get table index
  746. int i = get_event_index(event);
  747. // event must have handler
  748. ASSERT(bs->handlers[i])
  749. // disable event if enabled
  750. if (bs->waitEvents&event) {
  751. BSocket_DisableEvent(bs, event);
  752. }
  753. // change handler
  754. bs->handlers[i] = NULL;
  755. }
  756. void BSocket_EnableEvent (BSocket *bs, uint8_t event)
  757. {
  758. DebugObject_Access(&bs->d_obj);
  759. #ifndef NDEBUG
  760. // check event and incompatible events
  761. switch (event) {
  762. case BSOCKET_READ:
  763. case BSOCKET_WRITE:
  764. ASSERT(!(bs->waitEvents&BSOCKET_ACCEPT))
  765. ASSERT(!(bs->waitEvents&BSOCKET_CONNECT))
  766. break;
  767. case BSOCKET_ACCEPT:
  768. ASSERT(!(bs->waitEvents&BSOCKET_READ))
  769. ASSERT(!(bs->waitEvents&BSOCKET_WRITE))
  770. ASSERT(!(bs->waitEvents&BSOCKET_CONNECT))
  771. break;
  772. case BSOCKET_CONNECT:
  773. ASSERT(!(bs->waitEvents&BSOCKET_READ))
  774. ASSERT(!(bs->waitEvents&BSOCKET_WRITE))
  775. ASSERT(!(bs->waitEvents&BSOCKET_ACCEPT))
  776. break;
  777. case BSOCKET_ERROR:
  778. break;
  779. default:
  780. ASSERT(0)
  781. break;
  782. }
  783. #endif
  784. // event must have handler
  785. ASSERT(bs->handlers[get_event_index(event)])
  786. // event must not be enabled
  787. ASSERT(!(bs->waitEvents&event))
  788. // update events
  789. bs->waitEvents |= event;
  790. // give new events to event backend
  791. update_event_backend(bs);
  792. // set connect job
  793. if (bs->connecting_status == CONNECT_STATUS_DONE_IMMEDIATELY && event == BSOCKET_CONNECT) {
  794. BPending_Set(&bs->connect_job);
  795. }
  796. }
  797. void BSocket_DisableEvent (BSocket *bs, uint8_t event)
  798. {
  799. DebugObject_Access(&bs->d_obj);
  800. // check event and get index
  801. int index = get_event_index(event);
  802. // event must have handler
  803. ASSERT(bs->handlers[index])
  804. // event must be enabled
  805. ASSERT(bs->waitEvents&event)
  806. // update events
  807. bs->waitEvents &= ~event;
  808. bs->ready_events &= ~event;
  809. // give new events to event backend
  810. update_event_backend(bs);
  811. // unset connect job
  812. if (!(bs->connecting_status == CONNECT_STATUS_DONE_IMMEDIATELY && (bs->waitEvents & BSOCKET_CONNECT))) {
  813. BPending_Unset(&bs->connect_job);
  814. }
  815. }
  816. int BSocket_Connect (BSocket *bs, BAddr *addr, int later)
  817. {
  818. ASSERT(addr)
  819. ASSERT(!BAddr_IsInvalid(addr))
  820. ASSERT(later == 0 || later == 1)
  821. ASSERT(bs->connecting_status == CONNECT_STATUS_NONE)
  822. DebugObject_Access(&bs->d_obj);
  823. struct sys_addr sysaddr;
  824. addr_socket_to_sys(&sysaddr, addr);
  825. if (connect(bs->socket, &sysaddr.addr.generic, sysaddr.len) < 0) {
  826. int error;
  827. #ifdef BADVPN_USE_WINAPI
  828. switch ((error = WSAGetLastError())) {
  829. case WSAEWOULDBLOCK:
  830. bs->connecting_status = CONNECT_STATUS_CONNECTING;
  831. bs->error = BSOCKET_ERROR_IN_PROGRESS;
  832. return -1;
  833. }
  834. #else
  835. switch ((error = errno)) {
  836. case EINPROGRESS:
  837. bs->connecting_status = CONNECT_STATUS_CONNECTING;
  838. bs->error = BSOCKET_ERROR_IN_PROGRESS;
  839. return -1;
  840. }
  841. #endif
  842. bs->error = translate_error(error);
  843. return -1;
  844. }
  845. if (later) {
  846. // set connect result
  847. bs->connecting_status = CONNECT_STATUS_DONE_IMMEDIATELY;
  848. bs->connecting_result = BSOCKET_ERROR_NONE;
  849. // set connect job
  850. if ((bs->waitEvents & BSOCKET_CONNECT)) {
  851. BPending_Set(&bs->connect_job);
  852. }
  853. // return in progress error
  854. bs->error = BSOCKET_ERROR_IN_PROGRESS;
  855. return -1;
  856. }
  857. bs->error = BSOCKET_ERROR_NONE;
  858. return 0;
  859. }
  860. int BSocket_GetConnectResult (BSocket *bs)
  861. {
  862. ASSERT(bs->connecting_status == CONNECT_STATUS_DONE)
  863. DebugObject_Access(&bs->d_obj);
  864. bs->connecting_status = CONNECT_STATUS_NONE;
  865. return bs->connecting_result;
  866. }
  867. int BSocket_Bind (BSocket *bs, BAddr *addr)
  868. {
  869. ASSERT(addr)
  870. ASSERT(!BAddr_IsInvalid(addr))
  871. DebugObject_Access(&bs->d_obj);
  872. struct sys_addr sysaddr;
  873. addr_socket_to_sys(&sysaddr, addr);
  874. if (bs->type == BSOCKET_TYPE_STREAM) {
  875. #ifdef BADVPN_USE_WINAPI
  876. BOOL optval = TRUE;
  877. #else
  878. int optval = 1;
  879. #endif
  880. if (setsockopt(bs->socket, SOL_SOCKET, SO_REUSEADDR, (void *)&optval, sizeof(optval)) < 0) {
  881. BLog(BLOG_ERROR, "setsockopt failed");
  882. }
  883. }
  884. if (bind(bs->socket, &sysaddr.addr.generic, sysaddr.len) < 0) {
  885. #ifdef BADVPN_USE_WINAPI
  886. int error = WSAGetLastError();
  887. #else
  888. int error = errno;
  889. #endif
  890. bs->error = translate_error(error);
  891. return -1;
  892. }
  893. bs->error = BSOCKET_ERROR_NONE;
  894. return 0;
  895. }
  896. int BSocket_Listen (BSocket *bs, int backlog)
  897. {
  898. ASSERT(bs->type == BSOCKET_TYPE_STREAM)
  899. DebugObject_Access(&bs->d_obj);
  900. if (backlog < 0) {
  901. backlog = BSOCKET_DEFAULT_BACKLOG;
  902. }
  903. if (listen(bs->socket, backlog) < 0) {
  904. #ifdef BADVPN_USE_WINAPI
  905. int error = WSAGetLastError();
  906. #else
  907. int error = errno;
  908. #endif
  909. bs->error = translate_error(error);
  910. return -1;
  911. }
  912. bs->error = BSOCKET_ERROR_NONE;
  913. return 0;
  914. }
  915. int BSocket_Accept (BSocket *bs, BSocket *newsock, BAddr *addr)
  916. {
  917. ASSERT(bs->type == BSOCKET_TYPE_STREAM)
  918. DebugObject_Access(&bs->d_obj);
  919. struct sys_addr sysaddr;
  920. sysaddr.len = sizeof(sysaddr.addr);
  921. int fd = accept(bs->socket, &sysaddr.addr.generic, &sysaddr.len);
  922. if (fd < 0) {
  923. int error;
  924. #ifdef BADVPN_USE_WINAPI
  925. switch ((error = WSAGetLastError())) {
  926. case WSAEWOULDBLOCK:
  927. bs->error = BSOCKET_ERROR_LATER;
  928. return -1;
  929. }
  930. #else
  931. switch ((error = errno)) {
  932. case EAGAIN:
  933. #if EAGAIN != EWOULDBLOCK
  934. case EWOULDBLOCK:
  935. #endif
  936. bs->error = BSOCKET_ERROR_LATER;
  937. return -1;
  938. }
  939. #endif
  940. bs->error = translate_error(error);
  941. return -1;
  942. }
  943. if (!newsock) {
  944. close_socket(fd);
  945. } else {
  946. // set nonblocking
  947. if (set_nonblocking(fd) != 0) {
  948. BLog(BLOG_ERROR, "set_nonblocking failed");
  949. goto fail0;
  950. }
  951. // set pktinfo if needed
  952. if (!setup_pktinfo(fd, bs->type, bs->domain)) {
  953. BLog(BLOG_ERROR, "setup_pktinfo failed");
  954. }
  955. // setup winsock exts
  956. setup_winsock_exts(fd, bs->type, newsock);
  957. newsock->bsys = bs->bsys;
  958. newsock->type = bs->type;
  959. newsock->domain = bs->domain;
  960. newsock->socket = fd;
  961. newsock->error = BSOCKET_ERROR_NONE;
  962. init_handlers(newsock);
  963. newsock->waitEvents = 0;
  964. newsock->connecting_status = 0;
  965. newsock->recv_max = BSOCKET_DEFAULT_RECV_MAX;
  966. newsock->recv_num = 0;
  967. newsock->ready_events = 0; // just initialize it so we can clear them safely from BSocket_DisableEvent
  968. // init job
  969. BPending_Init(&newsock->job, BReactor_PendingGroup(bs->bsys), (BPending_handler)job_handler, newsock);
  970. // init connect job
  971. BPending_Init(&newsock->connect_job, BReactor_PendingGroup(bs->bsys), (BPending_handler)connect_job_handler, newsock);
  972. if (!init_event_backend(newsock)) {
  973. BLog(BLOG_ERROR, "init_event_backend failed");
  974. goto fail1;
  975. }
  976. // init debug object
  977. DebugObject_Init(&newsock->d_obj);
  978. }
  979. // return client address
  980. if (addr) {
  981. addr_sys_to_socket(addr, &sysaddr);
  982. }
  983. bs->error = BSOCKET_ERROR_NONE;
  984. return 0;
  985. fail1:
  986. BPending_Free(&newsock->connect_job);
  987. BPending_Free(&newsock->job);
  988. fail0:
  989. close_socket(fd);
  990. bs->error = BSOCKET_ERROR_UNKNOWN;
  991. return -1;
  992. }
  993. int BSocket_Send (BSocket *bs, uint8_t *data, int len)
  994. {
  995. ASSERT(len >= 0)
  996. ASSERT(bs->type == BSOCKET_TYPE_STREAM)
  997. DebugObject_Access(&bs->d_obj);
  998. int bytes;
  999. #ifndef BADVPN_USE_WINAPI
  1000. if (bs->domain == BADDR_TYPE_UNIXPIPE) {
  1001. bytes = write(bs->socket, data, len);
  1002. } else {
  1003. #endif
  1004. bytes = send(bs->socket, data, len, 0);
  1005. #ifndef BADVPN_USE_WINAPI
  1006. }
  1007. #endif
  1008. if (bytes < 0) {
  1009. int error;
  1010. #ifdef BADVPN_USE_WINAPI
  1011. switch ((error = WSAGetLastError())) {
  1012. case WSAEWOULDBLOCK:
  1013. bs->error = BSOCKET_ERROR_LATER;
  1014. return -1;
  1015. }
  1016. #else
  1017. switch ((error = errno)) {
  1018. case EAGAIN:
  1019. #if EAGAIN != EWOULDBLOCK
  1020. case EWOULDBLOCK:
  1021. #endif
  1022. bs->error = BSOCKET_ERROR_LATER;
  1023. return -1;
  1024. }
  1025. #endif
  1026. bs->error = translate_error(error);
  1027. return -1;
  1028. }
  1029. bs->error = BSOCKET_ERROR_NONE;
  1030. return bytes;
  1031. }
  1032. int BSocket_Recv (BSocket *bs, uint8_t *data, int len)
  1033. {
  1034. ASSERT(len >= 0)
  1035. ASSERT(bs->type == BSOCKET_TYPE_STREAM)
  1036. DebugObject_Access(&bs->d_obj);
  1037. if (limit_recv(bs)) {
  1038. bs->error = BSOCKET_ERROR_LATER;
  1039. return -1;
  1040. }
  1041. int bytes;
  1042. #ifndef BADVPN_USE_WINAPI
  1043. if (bs->domain == BADDR_TYPE_UNIXPIPE) {
  1044. bytes = read(bs->socket, data, len);
  1045. } else {
  1046. #endif
  1047. bytes = recv(bs->socket, data, len, 0);
  1048. #ifndef BADVPN_USE_WINAPI
  1049. }
  1050. #endif
  1051. if (bytes < 0) {
  1052. int error;
  1053. #ifdef BADVPN_USE_WINAPI
  1054. switch ((error = WSAGetLastError())) {
  1055. case WSAEWOULDBLOCK:
  1056. bs->error = BSOCKET_ERROR_LATER;
  1057. return -1;
  1058. }
  1059. #else
  1060. switch ((error = errno)) {
  1061. case EAGAIN:
  1062. #if EAGAIN != EWOULDBLOCK
  1063. case EWOULDBLOCK:
  1064. #endif
  1065. bs->error = BSOCKET_ERROR_LATER;
  1066. return -1;
  1067. }
  1068. #endif
  1069. bs->error = translate_error(error);
  1070. return -1;
  1071. }
  1072. bs->error = BSOCKET_ERROR_NONE;
  1073. return bytes;
  1074. }
  1075. int BSocket_SendToFrom (BSocket *bs, uint8_t *data, int len, BAddr *addr, BIPAddr *local_addr)
  1076. {
  1077. ASSERT(len >= 0)
  1078. ASSERT(addr)
  1079. ASSERT(!BAddr_IsInvalid(addr))
  1080. ASSERT(local_addr)
  1081. ASSERT(bs->type == BSOCKET_TYPE_DGRAM)
  1082. DebugObject_Access(&bs->d_obj);
  1083. struct sys_addr remote_sysaddr;
  1084. addr_socket_to_sys(&remote_sysaddr, addr);
  1085. #ifdef BADVPN_USE_WINAPI
  1086. WSABUF buf;
  1087. buf.len = len;
  1088. buf.buf = data;
  1089. DWORD bytes;
  1090. if (!bs->WSASendMsg) {
  1091. if (WSASendTo(bs->socket, &buf, 1, &bytes, 0, &remote_sysaddr.addr.generic, remote_sysaddr.len, NULL, NULL) != 0) {
  1092. int error;
  1093. switch ((error = WSAGetLastError())) {
  1094. case WSAEWOULDBLOCK:
  1095. bs->error = BSOCKET_ERROR_LATER;
  1096. return -1;
  1097. }
  1098. bs->error = translate_error(error);
  1099. return -1;
  1100. }
  1101. } else {
  1102. union {
  1103. char in[WSA_CMSG_SPACE(sizeof(struct in_pktinfo))];
  1104. char in6[WSA_CMSG_SPACE(sizeof(struct in6_pktinfo))];
  1105. } cdata;
  1106. WSAMSG msg;
  1107. memset(&msg, 0, sizeof(msg));
  1108. msg.name = &remote_sysaddr.addr.generic;
  1109. msg.namelen = remote_sysaddr.len;
  1110. msg.lpBuffers = &buf;
  1111. msg.dwBufferCount = 1;
  1112. msg.Control.buf = (char *)&cdata;
  1113. msg.Control.len = sizeof(cdata);
  1114. int sum = 0;
  1115. WSACMSGHDR *cmsg = WSA_CMSG_FIRSTHDR(&msg);
  1116. switch (local_addr->type) {
  1117. case BADDR_TYPE_NONE:
  1118. break;
  1119. case BADDR_TYPE_IPV4: {
  1120. memset(cmsg, 0, WSA_CMSG_SPACE(sizeof(struct in_pktinfo)));
  1121. cmsg->cmsg_level = IPPROTO_IP;
  1122. cmsg->cmsg_type = IP_PKTINFO;
  1123. cmsg->cmsg_len = WSA_CMSG_LEN(sizeof(struct in_pktinfo));
  1124. struct in_pktinfo *pktinfo = (struct in_pktinfo *)WSA_CMSG_DATA(cmsg);
  1125. pktinfo->ipi_addr.s_addr = local_addr->ipv4;
  1126. sum += WSA_CMSG_SPACE(sizeof(struct in_pktinfo));
  1127. } break;
  1128. case BADDR_TYPE_IPV6: {
  1129. memset(cmsg, 0, WSA_CMSG_SPACE(sizeof(struct in6_pktinfo)));
  1130. cmsg->cmsg_level = IPPROTO_IPV6;
  1131. cmsg->cmsg_type = IPV6_PKTINFO;
  1132. cmsg->cmsg_len = WSA_CMSG_LEN(sizeof(struct in6_pktinfo));
  1133. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)WSA_CMSG_DATA(cmsg);
  1134. memcpy(pktinfo->ipi6_addr.s6_addr, local_addr->ipv6, 16);
  1135. sum += WSA_CMSG_SPACE(sizeof(struct in6_pktinfo));
  1136. } break;
  1137. default:
  1138. ASSERT(0);
  1139. }
  1140. msg.Control.len = sum;
  1141. // WSASendMsg chokes on empty control block
  1142. if (msg.Control.len == 0) {
  1143. msg.Control.buf = NULL;
  1144. }
  1145. if (bs->WSASendMsg(bs->socket, &msg, 0, &bytes, NULL, NULL) != 0) {
  1146. int error;
  1147. switch ((error = WSAGetLastError())) {
  1148. case WSAEWOULDBLOCK:
  1149. bs->error = BSOCKET_ERROR_LATER;
  1150. return -1;
  1151. }
  1152. bs->error = translate_error(error);
  1153. return -1;
  1154. }
  1155. }
  1156. #else
  1157. struct iovec iov;
  1158. iov.iov_base = data;
  1159. iov.iov_len = len;
  1160. union {
  1161. #ifdef BADVPN_FREEBSD
  1162. char in[CMSG_SPACE(sizeof(struct in_addr))];
  1163. #else
  1164. char in[CMSG_SPACE(sizeof(struct in_pktinfo))];
  1165. #endif
  1166. char in6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
  1167. } cdata;
  1168. struct msghdr msg;
  1169. memset(&msg, 0, sizeof(msg));
  1170. msg.msg_name = &remote_sysaddr.addr.generic;
  1171. msg.msg_namelen = remote_sysaddr.len;
  1172. msg.msg_iov = &iov;
  1173. msg.msg_iovlen = 1;
  1174. msg.msg_control = &cdata;
  1175. msg.msg_controllen = sizeof(cdata);
  1176. int sum = 0;
  1177. struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
  1178. switch (local_addr->type) {
  1179. case BADDR_TYPE_NONE:
  1180. break;
  1181. case BADDR_TYPE_IPV4: {
  1182. #ifdef BADVPN_FREEBSD
  1183. memset(cmsg, 0, CMSG_SPACE(sizeof(struct in_addr)));
  1184. cmsg->cmsg_level = IPPROTO_IP;
  1185. cmsg->cmsg_type = IP_SENDSRCADDR;
  1186. cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
  1187. struct in_addr *addrinfo = (struct in_addr *)CMSG_DATA(cmsg);
  1188. addrinfo->s_addr = local_addr->ipv4;;
  1189. sum += CMSG_SPACE(sizeof(struct in_addr));
  1190. #else
  1191. memset(cmsg, 0, CMSG_SPACE(sizeof(struct in_pktinfo)));
  1192. cmsg->cmsg_level = IPPROTO_IP;
  1193. cmsg->cmsg_type = IP_PKTINFO;
  1194. cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
  1195. struct in_pktinfo *pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
  1196. pktinfo->ipi_spec_dst.s_addr = local_addr->ipv4;
  1197. sum += CMSG_SPACE(sizeof(struct in_pktinfo));
  1198. #endif
  1199. } break;
  1200. case BADDR_TYPE_IPV6: {
  1201. memset(cmsg, 0, CMSG_SPACE(sizeof(struct in6_pktinfo)));
  1202. cmsg->cmsg_level = IPPROTO_IPV6;
  1203. cmsg->cmsg_type = IPV6_PKTINFO;
  1204. cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
  1205. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg);
  1206. memcpy(pktinfo->ipi6_addr.s6_addr, local_addr->ipv6, 16);
  1207. sum += CMSG_SPACE(sizeof(struct in6_pktinfo));
  1208. } break;
  1209. default:
  1210. ASSERT(0);
  1211. }
  1212. msg.msg_controllen = sum;
  1213. // FreeBSD chokes on empty control block
  1214. if (msg.msg_controllen == 0) {
  1215. msg.msg_control = NULL;
  1216. }
  1217. int bytes = sendmsg(bs->socket, &msg, 0);
  1218. if (bytes < 0) {
  1219. int error;
  1220. switch ((error = errno)) {
  1221. case EAGAIN:
  1222. #if EAGAIN != EWOULDBLOCK
  1223. case EWOULDBLOCK:
  1224. #endif
  1225. bs->error = BSOCKET_ERROR_LATER;
  1226. return -1;
  1227. }
  1228. bs->error = translate_error(error);
  1229. return -1;
  1230. }
  1231. #endif
  1232. bs->error = BSOCKET_ERROR_NONE;
  1233. return bytes;
  1234. }
  1235. int BSocket_RecvFromTo (BSocket *bs, uint8_t *data, int len, BAddr *addr, BIPAddr *local_addr)
  1236. {
  1237. ASSERT(len >= 0)
  1238. ASSERT(addr)
  1239. ASSERT(local_addr)
  1240. ASSERT(bs->type == BSOCKET_TYPE_DGRAM)
  1241. DebugObject_Access(&bs->d_obj);
  1242. if (limit_recv(bs)) {
  1243. bs->error = BSOCKET_ERROR_LATER;
  1244. return -1;
  1245. }
  1246. struct sys_addr remote_sysaddr;
  1247. remote_sysaddr.len = sizeof(remote_sysaddr.addr);
  1248. #ifdef BADVPN_USE_WINAPI
  1249. WSABUF buf;
  1250. buf.len = len;
  1251. buf.buf = data;
  1252. DWORD bytes;
  1253. WSAMSG msg;
  1254. if (!bs->WSARecvMsg) {
  1255. DWORD flags = 0;
  1256. INT fromlen = remote_sysaddr.len;
  1257. if (WSARecvFrom(bs->socket, &buf, 1, &bytes, &flags, &remote_sysaddr.addr.generic, &fromlen, NULL, NULL) != 0) {
  1258. int error;
  1259. switch ((error = WSAGetLastError())) {
  1260. case WSAEWOULDBLOCK:
  1261. bs->error = BSOCKET_ERROR_LATER;
  1262. return -1;
  1263. }
  1264. bs->error = translate_error(error);
  1265. return -1;
  1266. }
  1267. remote_sysaddr.len = fromlen;
  1268. } else {
  1269. union {
  1270. char in[WSA_CMSG_SPACE(sizeof(struct in_pktinfo))];
  1271. char in6[WSA_CMSG_SPACE(sizeof(struct in6_pktinfo))];
  1272. } cdata;
  1273. memset(&msg, 0, sizeof(msg));
  1274. msg.name = &remote_sysaddr.addr.generic;
  1275. msg.namelen = remote_sysaddr.len;
  1276. msg.lpBuffers = &buf;
  1277. msg.dwBufferCount = 1;
  1278. msg.Control.buf = (char *)&cdata;
  1279. msg.Control.len = sizeof(cdata);
  1280. if (bs->WSARecvMsg(bs->socket, &msg, &bytes, NULL, NULL) != 0) {
  1281. int error;
  1282. switch ((error = WSAGetLastError())) {
  1283. case WSAEWOULDBLOCK:
  1284. bs->error = BSOCKET_ERROR_LATER;
  1285. return -1;
  1286. }
  1287. bs->error = translate_error(error);
  1288. return -1;
  1289. }
  1290. remote_sysaddr.len = msg.namelen;
  1291. }
  1292. #else
  1293. struct iovec iov;
  1294. iov.iov_base = data;
  1295. iov.iov_len = len;
  1296. union {
  1297. #ifdef BADVPN_FREEBSD
  1298. char in[CMSG_SPACE(sizeof(struct in_addr))];
  1299. #else
  1300. char in[CMSG_SPACE(sizeof(struct in_pktinfo))];
  1301. #endif
  1302. char in6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
  1303. } cdata;
  1304. struct msghdr msg;
  1305. memset(&msg, 0, sizeof(msg));
  1306. msg.msg_name = &remote_sysaddr.addr.generic;
  1307. msg.msg_namelen = remote_sysaddr.len;
  1308. msg.msg_iov = &iov;
  1309. msg.msg_iovlen = 1;
  1310. msg.msg_control = &cdata;
  1311. msg.msg_controllen = sizeof(cdata);
  1312. int bytes = recvmsg(bs->socket, &msg, 0);
  1313. if (bytes < 0) {
  1314. int error;
  1315. switch ((error = errno)) {
  1316. case EAGAIN:
  1317. #if EAGAIN != EWOULDBLOCK
  1318. case EWOULDBLOCK:
  1319. #endif
  1320. bs->error = BSOCKET_ERROR_LATER;
  1321. return -1;
  1322. }
  1323. bs->error = translate_error(error);
  1324. return -1;
  1325. }
  1326. remote_sysaddr.len = msg.msg_namelen;
  1327. #endif
  1328. addr_sys_to_socket(addr, &remote_sysaddr);
  1329. BIPAddr_InitInvalid(local_addr);
  1330. #ifdef BADVPN_USE_WINAPI
  1331. if (bs->WSARecvMsg) {
  1332. WSACMSGHDR *cmsg;
  1333. for (cmsg = WSA_CMSG_FIRSTHDR(&msg); cmsg; cmsg = WSA_CMSG_NXTHDR(&msg, cmsg)) {
  1334. if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) {
  1335. struct in_pktinfo *pktinfo = (struct in_pktinfo *)WSA_CMSG_DATA(cmsg);
  1336. BIPAddr_InitIPv4(local_addr, pktinfo->ipi_addr.s_addr);
  1337. }
  1338. else if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) {
  1339. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)WSA_CMSG_DATA(cmsg);
  1340. BIPAddr_InitIPv6(local_addr, pktinfo->ipi6_addr.s6_addr);
  1341. }
  1342. }
  1343. }
  1344. #else
  1345. struct cmsghdr *cmsg;
  1346. for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
  1347. #ifdef BADVPN_FREEBSD
  1348. if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_RECVDSTADDR) {
  1349. struct in_addr *addrinfo = (struct in_addr *)CMSG_DATA(cmsg);
  1350. BIPAddr_InitIPv4(local_addr, addrinfo->s_addr);
  1351. }
  1352. #else
  1353. if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) {
  1354. struct in_pktinfo *pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
  1355. BIPAddr_InitIPv4(local_addr, pktinfo->ipi_addr.s_addr);
  1356. }
  1357. #endif
  1358. else if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) {
  1359. struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg);
  1360. BIPAddr_InitIPv6(local_addr, pktinfo->ipi6_addr.s6_addr);
  1361. }
  1362. }
  1363. #endif
  1364. bs->error = BSOCKET_ERROR_NONE;
  1365. return bytes;
  1366. }
  1367. int BSocket_GetPeerName (BSocket *bs, BAddr *addr)
  1368. {
  1369. ASSERT(addr)
  1370. DebugObject_Access(&bs->d_obj);
  1371. struct sys_addr sysaddr;
  1372. sysaddr.len = sizeof(sysaddr.addr);
  1373. if (getpeername(bs->socket, &sysaddr.addr.generic, &sysaddr.len) < 0) {
  1374. bs->error = BSOCKET_ERROR_UNKNOWN;
  1375. return -1;
  1376. }
  1377. addr_sys_to_socket(addr, &sysaddr);
  1378. bs->error = BSOCKET_ERROR_NONE;
  1379. return 0;
  1380. }
  1381. #ifndef BADVPN_USE_WINAPI
  1382. static int create_unix_sysaddr (struct sockaddr_un *addr, size_t *addr_len, const char *path)
  1383. {
  1384. size_t path_len = strlen(path);
  1385. if (path_len == 0) {
  1386. BLog(BLOG_ERROR, "path empty");
  1387. return 0;
  1388. }
  1389. addr->sun_family = AF_UNIX;
  1390. if (path_len >= sizeof(addr->sun_path)) {
  1391. BLog(BLOG_ERROR, "path too long");
  1392. return 0;
  1393. }
  1394. strcpy(addr->sun_path, path);
  1395. *addr_len = offsetof(struct sockaddr_un, sun_path) + path_len + 1;
  1396. return 1;
  1397. }
  1398. int BSocket_BindUnix (BSocket *bs, const char *path)
  1399. {
  1400. DebugObject_Access(&bs->d_obj);
  1401. struct sockaddr_un sys_addr;
  1402. size_t addr_len;
  1403. if (!create_unix_sysaddr(&sys_addr, &addr_len, path)) {
  1404. bs->error = BSOCKET_ERROR_UNKNOWN;
  1405. return -1;
  1406. }
  1407. if (bind(bs->socket, (struct sockaddr *)&sys_addr, addr_len) < 0) {
  1408. bs->error = translate_error(errno);
  1409. return -1;
  1410. }
  1411. bs->error = BSOCKET_ERROR_NONE;
  1412. return 0;
  1413. }
  1414. int BSocket_ConnectUnix (BSocket *bs, const char *path)
  1415. {
  1416. DebugObject_Access(&bs->d_obj);
  1417. struct sockaddr_un sys_addr;
  1418. size_t addr_len;
  1419. if (!create_unix_sysaddr(&sys_addr, &addr_len, path)) {
  1420. bs->error = BSOCKET_ERROR_UNKNOWN;
  1421. return -1;
  1422. }
  1423. if (connect(bs->socket, (struct sockaddr *)&sys_addr, addr_len) < 0) {
  1424. bs->error = translate_error(errno);
  1425. return -1;
  1426. }
  1427. bs->error = BSOCKET_ERROR_NONE;
  1428. return 0;
  1429. }
  1430. #endif
  1431. BReactor * BSocket_Reactor (BSocket *bs)
  1432. {
  1433. DebugObject_Access(&bs->d_obj);
  1434. return bs->bsys;
  1435. }
  1436. int BSocket_SockFd (BSocket *bs)
  1437. {
  1438. DebugObject_Access(&bs->d_obj);
  1439. return bs->socket;
  1440. }
  1441. int BSocket_SetSendBuffer (BSocket *bs, int buf_size)
  1442. {
  1443. ASSERT(buf_size > 0)
  1444. DebugObject_Access(&bs->d_obj);
  1445. if (setsockopt(bs->socket, SOL_SOCKET, SO_SNDBUF, (void *)&buf_size, sizeof(buf_size)) < 0) {
  1446. bs->error = translate_error(errno);
  1447. return -1;
  1448. }
  1449. bs->error = BSOCKET_ERROR_NONE;
  1450. return 0;
  1451. }