BSocket.c 40 KB

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