BSocket.c 47 KB

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