BSocket.c 47 KB

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