You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

resolver.c 27KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129
  1. /*
  2. * Copyright (c) 2014, Vsevolod Stakhov
  3. *
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions are met:
  8. * * Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * * Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in the
  12. * documentation and/or other materials provided with the distribution.
  13. *
  14. * THIS SOFTWARE IS PROVIDED BY AUTHOR ''AS IS'' AND ANY
  15. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  16. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  17. * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
  18. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  19. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  20. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  21. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  22. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  23. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24. */
  25. #include <sys/socket.h>
  26. #include <netinet/in.h>
  27. #include <arpa/inet.h>
  28. #include <unistd.h>
  29. #include <stdlib.h>
  30. #include <string.h>
  31. #include <errno.h>
  32. #include <stdarg.h>
  33. #include "rdns.h"
  34. #include "dns_private.h"
  35. #include "ottery.h"
  36. #include "util.h"
  37. #include "packet.h"
  38. #include "parse.h"
  39. #include "logger.h"
  40. #include "compression.h"
  41. static int
  42. rdns_send_request (struct rdns_request *req, int fd, bool new_req)
  43. {
  44. int r;
  45. struct rdns_server *serv = req->io->srv;
  46. struct rdns_resolver *resolver = req->resolver;
  47. struct rdns_request *tmp;
  48. struct dns_header *header;
  49. const int max_id_cycles = 32;
  50. /* Find ID collision */
  51. if (new_req) {
  52. r = 0;
  53. HASH_FIND_INT (req->io->requests, &req->id, tmp);
  54. while (tmp != NULL) {
  55. /* Check for unique id */
  56. header = (struct dns_header *)req->packet;
  57. header->qid = rdns_permutor_generate_id ();
  58. req->id = header->qid;
  59. if (++r > max_id_cycles) {
  60. return -1;
  61. }
  62. HASH_FIND_INT (req->io->requests, &req->id, tmp);
  63. }
  64. }
  65. if (resolver->curve_plugin == NULL) {
  66. if (!req->io->connected) {
  67. r = sendto (fd, req->packet, req->pos, 0,
  68. req->io->saddr,
  69. req->io->slen);
  70. }
  71. else {
  72. r = send (fd, req->packet, req->pos, 0);
  73. }
  74. }
  75. else {
  76. if (!req->io->connected) {
  77. r = resolver->curve_plugin->cb.curve_plugin.send_cb (req,
  78. resolver->curve_plugin->data,
  79. req->io->saddr,
  80. req->io->slen);
  81. }
  82. else {
  83. r = resolver->curve_plugin->cb.curve_plugin.send_cb (req,
  84. resolver->curve_plugin->data,
  85. NULL,
  86. 0);
  87. }
  88. }
  89. if (r == -1) {
  90. if (errno == EAGAIN || errno == EINTR) {
  91. if (new_req) {
  92. /* Write when socket is ready */
  93. HASH_ADD_INT (req->io->requests, id, req);
  94. req->async_event = resolver->async->add_write (resolver->async->data,
  95. fd, req);
  96. req->state = RDNS_REQUEST_WAIT_SEND;
  97. }
  98. /*
  99. * If request is already processed then the calling function
  100. * should take care about events processing
  101. */
  102. return 0;
  103. }
  104. else {
  105. rdns_debug ("send failed: %s for server %s", strerror (errno), serv->name);
  106. return -1;
  107. }
  108. }
  109. else if (!req->io->connected) {
  110. /* Connect socket */
  111. r = connect (fd, req->io->saddr, req->io->slen);
  112. if (r == -1) {
  113. rdns_err ("cannot connect after sending request: %s for server %s",
  114. strerror (errno), serv->name);
  115. }
  116. else {
  117. req->io->connected = true;
  118. }
  119. }
  120. if (new_req) {
  121. /* Add request to hash table */
  122. HASH_ADD_INT (req->io->requests, id, req);
  123. /* Fill timeout */
  124. req->async_event = resolver->async->add_timer (resolver->async->data,
  125. req->timeout, req);
  126. req->state = RDNS_REQUEST_WAIT_REPLY;
  127. }
  128. return 1;
  129. }
  130. static struct rdns_reply *
  131. rdns_make_reply (struct rdns_request *req, enum dns_rcode rcode)
  132. {
  133. struct rdns_reply *rep;
  134. rep = malloc (sizeof (struct rdns_reply));
  135. if (rep != NULL) {
  136. rep->request = req;
  137. rep->resolver = req->resolver;
  138. rep->entries = NULL;
  139. rep->code = rcode;
  140. req->reply = rep;
  141. rep->authenticated = false;
  142. }
  143. return rep;
  144. }
  145. static struct rdns_request *
  146. rdns_find_dns_request (uint8_t *in, struct rdns_io_channel *ioc)
  147. {
  148. struct dns_header *header = (struct dns_header *)in;
  149. struct rdns_request *req;
  150. int id;
  151. struct rdns_resolver *resolver = ioc->resolver;
  152. id = header->qid;
  153. HASH_FIND_INT (ioc->requests, &id, req);
  154. if (req == NULL) {
  155. /* No such requests found */
  156. rdns_debug ("DNS request with id %d has not been found for IO channel", (int)id);
  157. }
  158. return req;
  159. }
  160. static bool
  161. rdns_parse_reply (uint8_t *in, int r, struct rdns_request *req,
  162. struct rdns_reply **_rep)
  163. {
  164. struct dns_header *header = (struct dns_header *)in;
  165. struct rdns_reply *rep;
  166. struct rdns_reply_entry *elt;
  167. uint8_t *pos, *npos;
  168. struct rdns_resolver *resolver = req->resolver;
  169. uint16_t qdcount;
  170. int type;
  171. bool found = false;
  172. int i, t;
  173. /* First check header fields */
  174. if (header->qr == 0) {
  175. rdns_info ("got request while waiting for reply");
  176. return false;
  177. }
  178. qdcount = ntohs (header->qdcount);
  179. if (qdcount != req->qcount) {
  180. rdns_info ("request has %d queries, reply has %d queries", (int)req->qcount, (int)header->qdcount);
  181. return false;
  182. }
  183. /*
  184. * Now we have request and query data is now at the end of header, so compare
  185. * request QR section and reply QR section
  186. */
  187. req->pos = sizeof (struct dns_header);
  188. pos = in + sizeof (struct dns_header);
  189. t = r - sizeof (struct dns_header);
  190. for (i = 0; i < (int)qdcount; i ++) {
  191. if ((npos = rdns_request_reply_cmp (req, pos,t)) == NULL) {
  192. rdns_info ("DNS request with id %d is for different query, ignoring", (int)req->id);
  193. return false;
  194. }
  195. t -= npos - pos;
  196. pos = npos;
  197. }
  198. /*
  199. * Now pos is in answer section, so we should extract data and form reply
  200. */
  201. rep = rdns_make_reply (req, header->rcode);
  202. if (header->ad) {
  203. rep->authenticated = true;
  204. }
  205. if (rep == NULL) {
  206. rdns_warn ("Cannot allocate memory for reply");
  207. return false;
  208. }
  209. type = req->requested_names[0].type;
  210. if (rep->code == RDNS_RC_NOERROR) {
  211. r -= pos - in;
  212. /* Extract RR records */
  213. for (i = 0; i < ntohs (header->ancount); i ++) {
  214. elt = malloc (sizeof (struct rdns_reply_entry));
  215. t = rdns_parse_rr (resolver, in, elt, &pos, rep, &r);
  216. if (t == -1) {
  217. free (elt);
  218. rdns_debug ("incomplete reply");
  219. break;
  220. }
  221. else if (t == 1) {
  222. DL_APPEND (rep->entries, elt);
  223. if (elt->type == type) {
  224. found = true;
  225. }
  226. }
  227. else {
  228. rdns_debug ("no matching reply for %s",
  229. req->requested_names[0].name);
  230. free (elt);
  231. }
  232. }
  233. }
  234. if (!found && type != RDNS_REQUEST_ANY) {
  235. /* We have not found the requested RR type */
  236. if (rep->code == RDNS_RC_NOERROR) {
  237. rep->code = RDNS_RC_NOREC;
  238. }
  239. }
  240. *_rep = rep;
  241. return true;
  242. }
  243. void
  244. rdns_process_read (int fd, void *arg)
  245. {
  246. struct rdns_io_channel *ioc = arg;
  247. struct rdns_resolver *resolver;
  248. struct rdns_request *req = NULL;
  249. ssize_t r;
  250. struct rdns_reply *rep;
  251. uint8_t in[UDP_PACKET_SIZE];
  252. resolver = ioc->resolver;
  253. /* First read packet from socket */
  254. if (resolver->curve_plugin == NULL) {
  255. r = recv (fd, in, sizeof (in), 0);
  256. if (r > (int)(sizeof (struct dns_header) + sizeof (struct dns_query))) {
  257. req = rdns_find_dns_request (in, ioc);
  258. }
  259. }
  260. else {
  261. r = resolver->curve_plugin->cb.curve_plugin.recv_cb (ioc, in,
  262. sizeof (in), resolver->curve_plugin->data, &req,
  263. ioc->saddr, ioc->slen);
  264. if (req == NULL &&
  265. r > (int)(sizeof (struct dns_header) + sizeof (struct dns_query))) {
  266. req = rdns_find_dns_request (in, ioc);
  267. }
  268. }
  269. if (req != NULL) {
  270. if (rdns_parse_reply (in, r, req, &rep)) {
  271. UPSTREAM_OK (req->io->srv);
  272. if (req->resolver->ups && req->io->srv->ups_elt) {
  273. req->resolver->ups->ok (req->io->srv->ups_elt,
  274. req->resolver->ups->data);
  275. }
  276. rdns_request_unschedule (req);
  277. req->state = RDNS_REQUEST_REPLIED;
  278. req->func (rep, req->arg);
  279. REF_RELEASE (req);
  280. }
  281. }
  282. else {
  283. /* Still want to increase uses */
  284. ioc->uses ++;
  285. }
  286. }
  287. void
  288. rdns_process_timer (void *arg)
  289. {
  290. struct rdns_request *req = (struct rdns_request *)arg;
  291. struct rdns_reply *rep;
  292. int r;
  293. bool renew = false;
  294. struct rdns_resolver *resolver;
  295. struct rdns_server *serv = NULL;
  296. unsigned cnt;
  297. req->retransmits --;
  298. resolver = req->resolver;
  299. if (req->resolver->ups && req->io->srv->ups_elt) {
  300. req->resolver->ups->fail (req->io->srv->ups_elt,
  301. req->resolver->ups->data, "timeout waiting reply");
  302. }
  303. else {
  304. UPSTREAM_FAIL (req->io->srv, time (NULL));
  305. }
  306. if (req->retransmits == 0) {
  307. rep = rdns_make_reply (req, RDNS_RC_TIMEOUT);
  308. rdns_request_unschedule (req);
  309. req->state = RDNS_REQUEST_REPLIED;
  310. req->func (rep, req->arg);
  311. REF_RELEASE (req);
  312. return;
  313. }
  314. if (!req->io->active || req->retransmits == 1) {
  315. if (resolver->ups) {
  316. cnt = resolver->ups->count (resolver->ups->data);
  317. }
  318. else {
  319. cnt = 0;
  320. UPSTREAM_FOREACH (resolver->servers, serv) {
  321. cnt ++;
  322. }
  323. }
  324. if (!req->io->active || cnt > 1) {
  325. /* Do not reschedule IO requests on inactive sockets */
  326. rdns_debug ("reschedule request with id: %d", (int)req->id);
  327. rdns_request_unschedule (req);
  328. REF_RELEASE (req->io);
  329. if (resolver->ups) {
  330. struct rdns_upstream_elt *elt;
  331. elt = resolver->ups->select_retransmit (
  332. req->requested_names[0].name,
  333. req->requested_names[0].len,
  334. req->io->srv->ups_elt,
  335. resolver->ups->data);
  336. if (elt) {
  337. serv = elt->server;
  338. serv->ups_elt = elt;
  339. }
  340. else {
  341. UPSTREAM_SELECT_ROUND_ROBIN (resolver->servers, serv);
  342. }
  343. }
  344. else {
  345. UPSTREAM_SELECT_ROUND_ROBIN (resolver->servers, serv);
  346. }
  347. if (serv == NULL) {
  348. rdns_warn ("cannot find suitable server for request");
  349. rep = rdns_make_reply (req, RDNS_RC_SERVFAIL);
  350. req->state = RDNS_REQUEST_REPLIED;
  351. req->func (rep, req->arg);
  352. REF_RELEASE (req);
  353. return;
  354. }
  355. /* Select random IO channel */
  356. req->io = serv->io_channels[ottery_rand_uint32 () % serv->io_cnt];
  357. req->io->uses ++;
  358. REF_RETAIN (req->io);
  359. renew = true;
  360. }
  361. }
  362. /*
  363. * Note: when `renew` is true, then send_request deals with the
  364. * timers and events itself
  365. */
  366. r = rdns_send_request (req, req->io->sock, renew);
  367. if (r == 0) {
  368. /* Retransmit one more time */
  369. if (!renew) {
  370. req->async->del_timer (req->async->data,
  371. req->async_event);
  372. req->async_event = req->async->add_write (req->async->data,
  373. req->io->sock, req);
  374. }
  375. req->state = RDNS_REQUEST_WAIT_SEND;
  376. }
  377. else if (r == -1) {
  378. if (req->resolver->ups && req->io->srv->ups_elt) {
  379. req->resolver->ups->fail (req->io->srv->ups_elt,
  380. req->resolver->ups->data, "cannot send retransmit after timeout");
  381. }
  382. else {
  383. UPSTREAM_FAIL (req->io->srv, time (NULL));
  384. }
  385. if (!renew) {
  386. req->async->del_timer (req->async->data,
  387. req->async_event);
  388. req->async_event = NULL;
  389. HASH_DEL (req->io->requests, req);
  390. }
  391. /* We have not scheduled timeout actually due to send error */
  392. rep = rdns_make_reply (req, RDNS_RC_NETERR);
  393. req->state = RDNS_REQUEST_REPLIED;
  394. req->func (rep, req->arg);
  395. REF_RELEASE (req);
  396. }
  397. else {
  398. req->async->repeat_timer (req->async->data, req->async_event);
  399. req->state = RDNS_REQUEST_WAIT_REPLY;
  400. }
  401. }
  402. static void
  403. rdns_process_periodic (void *arg)
  404. {
  405. struct rdns_resolver *resolver = (struct rdns_resolver*)arg;
  406. UPSTREAM_RESCAN (resolver->servers, time (NULL));
  407. }
  408. static void
  409. rdns_process_ioc_refresh (void *arg)
  410. {
  411. struct rdns_resolver *resolver = (struct rdns_resolver*)arg;
  412. struct rdns_server *serv;
  413. struct rdns_io_channel *ioc, *nioc;
  414. unsigned int i;
  415. if (resolver->max_ioc_uses > 0) {
  416. UPSTREAM_FOREACH (resolver->servers, serv) {
  417. for (i = 0; i < serv->io_cnt; i ++) {
  418. ioc = serv->io_channels[i];
  419. if (ioc->uses > resolver->max_ioc_uses) {
  420. /* Schedule IOC removing */
  421. nioc = calloc (1, sizeof (struct rdns_io_channel));
  422. if (nioc == NULL) {
  423. rdns_err ("calloc fails to allocate rdns_io_channel");
  424. continue;
  425. }
  426. nioc->sock = rdns_make_client_socket (serv->name, serv->port,
  427. SOCK_DGRAM, &nioc->saddr, &nioc->slen);
  428. if (nioc->sock == -1) {
  429. rdns_err ("cannot open socket to %s: %s", serv->name,
  430. strerror (errno));
  431. free (nioc);
  432. continue;
  433. }
  434. nioc->srv = serv;
  435. nioc->active = true;
  436. nioc->resolver = resolver;
  437. nioc->async_io = resolver->async->add_read (resolver->async->data,
  438. nioc->sock, nioc);
  439. REF_INIT_RETAIN (nioc, rdns_ioc_free);
  440. serv->io_channels[i] = nioc;
  441. rdns_debug ("scheduled io channel for server %s to be refreshed after "
  442. "%lu usages", serv->name, (unsigned long)ioc->uses);
  443. ioc->active = false;
  444. REF_RELEASE (ioc);
  445. }
  446. }
  447. }
  448. }
  449. }
  450. void
  451. rdns_process_retransmit (int fd, void *arg)
  452. {
  453. struct rdns_request *req = (struct rdns_request *)arg;
  454. struct rdns_resolver *resolver;
  455. struct rdns_reply *rep;
  456. int r;
  457. resolver = req->resolver;
  458. resolver->async->del_write (resolver->async->data,
  459. req->async_event);
  460. req->async_event = NULL;
  461. if (req->state == RDNS_REQUEST_FAKE) {
  462. /* Reply is ready */
  463. req->func (req->reply, req->arg);
  464. REF_RELEASE (req);
  465. return;
  466. }
  467. r = rdns_send_request (req, fd, false);
  468. if (r == 0) {
  469. /* Retransmit one more time */
  470. req->async_event = req->async->add_write (req->async->data,
  471. fd, req);
  472. req->state = RDNS_REQUEST_WAIT_SEND;
  473. }
  474. else if (r == -1) {
  475. if (req->resolver->ups && req->io->srv->ups_elt) {
  476. req->resolver->ups->fail (req->io->srv->ups_elt,
  477. req->resolver->ups->data, "retransmit send failed");
  478. }
  479. else {
  480. UPSTREAM_FAIL (req->io->srv, time (NULL));
  481. }
  482. rep = rdns_make_reply (req, RDNS_RC_NETERR);
  483. req->state = RDNS_REQUEST_REPLIED;
  484. req->func (rep, req->arg);
  485. REF_RELEASE (req);
  486. }
  487. else {
  488. req->async_event = req->async->add_timer (req->async->data,
  489. req->timeout, req);
  490. req->state = RDNS_REQUEST_WAIT_REPLY;
  491. }
  492. }
  493. struct rdns_server *
  494. rdns_select_request_upstream (struct rdns_resolver *resolver,
  495. struct rdns_request *req,
  496. bool is_retransmit,
  497. struct rdns_server *prev_serv)
  498. {
  499. struct rdns_server *serv = NULL;
  500. if (resolver->ups) {
  501. struct rdns_upstream_elt *elt;
  502. if (is_retransmit && prev_serv) {
  503. elt = resolver->ups->select_retransmit (req->requested_names[0].name,
  504. req->requested_names[0].len,
  505. prev_serv->ups_elt,
  506. resolver->ups->data);
  507. }
  508. else {
  509. elt = resolver->ups->select (req->requested_names[0].name,
  510. req->requested_names[0].len, resolver->ups->data);
  511. }
  512. if (elt) {
  513. serv = elt->server;
  514. serv->ups_elt = elt;
  515. }
  516. else {
  517. UPSTREAM_SELECT_ROUND_ROBIN (resolver->servers, serv);
  518. }
  519. }
  520. else {
  521. UPSTREAM_SELECT_ROUND_ROBIN (resolver->servers, serv);
  522. }
  523. return serv;
  524. }
  525. #define align_ptr(p, a) \
  526. (guint8 *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
  527. struct rdns_request*
  528. rdns_make_request_full (
  529. struct rdns_resolver *resolver,
  530. dns_callback_type cb,
  531. void *cbdata,
  532. double timeout,
  533. unsigned int repeats,
  534. unsigned int queries,
  535. ...
  536. )
  537. {
  538. va_list args;
  539. struct rdns_request *req;
  540. struct rdns_server *serv;
  541. int r, type;
  542. unsigned int i, tlen = 0, clen = 0, cur;
  543. size_t olen;
  544. const char *cur_name, *last_name = NULL;
  545. struct rdns_compression_entry *comp = NULL;
  546. struct rdns_fake_reply *fake_rep = NULL;
  547. char fake_buf[MAX_FAKE_NAME + sizeof (struct rdns_fake_reply_idx) + 16];
  548. struct rdns_fake_reply_idx *idx;
  549. if (resolver == NULL || !resolver->initialized) {
  550. if (resolver == NULL) {
  551. return NULL;
  552. }
  553. rdns_err ("resolver is uninitialized");
  554. return NULL;
  555. }
  556. req = malloc (sizeof (struct rdns_request));
  557. if (req == NULL) {
  558. rdns_err ("failed to allocate memory for request: %s",
  559. strerror (errno));
  560. return NULL;
  561. }
  562. req->resolver = resolver;
  563. req->func = cb;
  564. req->arg = cbdata;
  565. req->reply = NULL;
  566. req->qcount = queries;
  567. req->io = NULL;
  568. req->state = RDNS_REQUEST_NEW;
  569. req->packet = NULL;
  570. req->requested_names = calloc (queries, sizeof (struct rdns_request_name));
  571. req->async_event = NULL;
  572. if (req->requested_names == NULL) {
  573. free (req);
  574. rdns_err ("failed to allocate memory for request data: %s",
  575. strerror (errno));
  576. return NULL;
  577. }
  578. req->type = 0;
  579. #ifdef TWEETNACL
  580. req->curve_plugin_data = NULL;
  581. #endif
  582. REF_INIT_RETAIN (req, rdns_request_free);
  583. /* Calculate packet's total length based on records count */
  584. va_start (args, queries);
  585. for (i = 0; i < queries * 2; i += 2) {
  586. cur = i / 2;
  587. cur_name = va_arg (args, const char *);
  588. type = va_arg (args, int);
  589. if (cur_name != NULL) {
  590. clen = strlen (cur_name);
  591. if (clen == 0) {
  592. rdns_warn ("got empty name to resolve");
  593. rdns_request_free (req);
  594. return NULL;
  595. }
  596. if (cur_name[0] == '.') {
  597. /* Skip dots at the begin */
  598. unsigned int ndots = strspn (cur_name, ".");
  599. cur_name += ndots;
  600. clen -= ndots;
  601. if (clen == 0) {
  602. rdns_warn ("got empty name to resolve");
  603. rdns_request_free (req);
  604. return NULL;
  605. }
  606. }
  607. if (cur_name[clen - 1] == '.') {
  608. /* Skip trailing dots */
  609. while (clen >= 1 && cur_name[clen - 1] == '.') {
  610. clen --;
  611. }
  612. if (clen == 0) {
  613. rdns_warn ("got empty name to resolve");
  614. rdns_request_free (req);
  615. return NULL;
  616. }
  617. }
  618. if (last_name == NULL && queries == 1 && clen < MAX_FAKE_NAME) {
  619. /* We allocate structure in the static space */
  620. idx = (struct rdns_fake_reply_idx *)align_ptr (fake_buf, 16);
  621. idx->type = type;
  622. idx->len = clen;
  623. memcpy (idx->request, cur_name, clen);
  624. HASH_FIND (hh, resolver->fake_elts, idx, sizeof (*idx) + clen,
  625. fake_rep);
  626. if (fake_rep) {
  627. /* We actually treat it as a short-circuit */
  628. req->reply = rdns_make_reply (req, fake_rep->rcode);
  629. req->reply->entries = fake_rep->result;
  630. req->state = RDNS_REQUEST_FAKE;
  631. }
  632. }
  633. last_name = cur_name;
  634. tlen += clen;
  635. }
  636. else if (last_name == NULL) {
  637. rdns_err ("got NULL as the first name to resolve");
  638. rdns_request_free (req);
  639. return NULL;
  640. }
  641. if (req->state != RDNS_REQUEST_FAKE) {
  642. if (!rdns_format_dns_name (resolver, last_name, clen,
  643. &req->requested_names[cur].name, &olen)) {
  644. rdns_err ("cannot format %s", last_name);
  645. rdns_request_free (req);
  646. return NULL;
  647. }
  648. req->requested_names[cur].len = olen;
  649. }
  650. else {
  651. req->requested_names[cur].len = clen;
  652. }
  653. req->requested_names[cur].type = type;
  654. }
  655. va_end (args);
  656. if (req->state != RDNS_REQUEST_FAKE) {
  657. rdns_allocate_packet (req, tlen);
  658. rdns_make_dns_header (req, queries);
  659. for (i = 0; i < queries; i++) {
  660. cur_name = req->requested_names[i].name;
  661. clen = req->requested_names[i].len;
  662. type = req->requested_names[i].type;
  663. if (queries > 1) {
  664. if (!rdns_add_rr (req, cur_name, clen, type, &comp)) {
  665. rdns_err ("cannot add rr");
  666. REF_RELEASE (req);
  667. rnds_compression_free (comp);
  668. return NULL;
  669. }
  670. } else {
  671. if (!rdns_add_rr (req, cur_name, clen, type, NULL)) {
  672. rdns_err ("cannot add rr");
  673. REF_RELEASE (req);
  674. rnds_compression_free (comp);
  675. return NULL;
  676. }
  677. }
  678. }
  679. rnds_compression_free (comp);
  680. /* Add EDNS RR */
  681. rdns_add_edns0 (req);
  682. req->retransmits = repeats ? repeats : 1;
  683. req->timeout = timeout;
  684. req->state = RDNS_REQUEST_NEW;
  685. }
  686. req->async = resolver->async;
  687. serv = rdns_select_request_upstream (resolver, req, false, NULL);
  688. if (serv == NULL) {
  689. rdns_warn ("cannot find suitable server for request");
  690. REF_RELEASE (req);
  691. return NULL;
  692. }
  693. /* Select random IO channel */
  694. req->io = serv->io_channels[ottery_rand_uint32 () % serv->io_cnt];
  695. if (req->state == RDNS_REQUEST_FAKE) {
  696. req->async_event = resolver->async->add_write (resolver->async->data,
  697. req->io->sock, req);
  698. }
  699. else {
  700. /* Now send request to server */
  701. do {
  702. r = rdns_send_request (req, req->io->sock, true);
  703. if (r == -1) {
  704. req->retransmits --; /* It must be > 0 */
  705. if (req->retransmits > 0) {
  706. if (resolver->ups && serv->ups_elt) {
  707. resolver->ups->fail (serv->ups_elt, resolver->ups->data,
  708. "send IO error");
  709. }
  710. else {
  711. UPSTREAM_FAIL (serv, time (NULL));
  712. }
  713. serv = rdns_select_request_upstream (resolver, req,
  714. true, serv);
  715. if (serv == NULL) {
  716. rdns_warn ("cannot find suitable server for request");
  717. REF_RELEASE (req);
  718. return NULL;
  719. }
  720. req->io = serv->io_channels[ottery_rand_uint32 () % serv->io_cnt];
  721. }
  722. else {
  723. rdns_info ("cannot send DNS request: %s", strerror (errno));
  724. REF_RELEASE (req);
  725. if (resolver->ups && serv->ups_elt) {
  726. resolver->ups->fail (serv->ups_elt, resolver->ups->data,
  727. "send IO error");
  728. }
  729. else {
  730. UPSTREAM_FAIL (serv, time (NULL));
  731. }
  732. return NULL;
  733. }
  734. }
  735. else {
  736. /* All good */
  737. req->io->uses++;
  738. break;
  739. }
  740. } while (req->retransmits > 0);
  741. }
  742. REF_RETAIN (req->io);
  743. REF_RETAIN (req->resolver);
  744. return req;
  745. }
  746. bool
  747. rdns_resolver_init (struct rdns_resolver *resolver)
  748. {
  749. unsigned int i;
  750. struct rdns_server *serv;
  751. struct rdns_io_channel *ioc;
  752. if (!resolver->async_binded) {
  753. rdns_err ("no async backend specified");
  754. return false;
  755. }
  756. if (resolver->servers == NULL) {
  757. rdns_err ("no DNS servers defined");
  758. return false;
  759. }
  760. /* Now init io channels to all servers */
  761. UPSTREAM_FOREACH (resolver->servers, serv) {
  762. serv->io_channels = calloc (serv->io_cnt, sizeof (struct rdns_io_channel *));
  763. for (i = 0; i < serv->io_cnt; i ++) {
  764. ioc = calloc (1, sizeof (struct rdns_io_channel));
  765. if (ioc == NULL) {
  766. rdns_err ("cannot allocate memory for the resolver IO channels");
  767. return false;
  768. }
  769. ioc->sock = rdns_make_client_socket (serv->name, serv->port, SOCK_DGRAM,
  770. &ioc->saddr, &ioc->slen);
  771. if (ioc->sock == -1) {
  772. ioc->active = false;
  773. rdns_err ("cannot open socket to %s:%d %s",
  774. serv->name, serv->port, strerror (errno));
  775. free (ioc);
  776. return false;
  777. }
  778. else {
  779. ioc->srv = serv;
  780. ioc->resolver = resolver;
  781. ioc->async_io = resolver->async->add_read (resolver->async->data,
  782. ioc->sock, ioc);
  783. REF_INIT_RETAIN (ioc, rdns_ioc_free);
  784. serv->io_channels[i] = ioc;
  785. }
  786. }
  787. }
  788. if (resolver->async->add_periodic) {
  789. resolver->periodic = resolver->async->add_periodic (resolver->async->data,
  790. UPSTREAM_REVIVE_TIME, rdns_process_periodic, resolver);
  791. }
  792. resolver->initialized = true;
  793. return true;
  794. }
  795. void
  796. rdns_resolver_register_plugin (struct rdns_resolver *resolver,
  797. struct rdns_plugin *plugin)
  798. {
  799. if (resolver != NULL && plugin != NULL) {
  800. /* XXX: support only network plugin now, and only a single one */
  801. if (plugin->type == RDNS_PLUGIN_CURVE) {
  802. resolver->curve_plugin = plugin;
  803. }
  804. }
  805. }
  806. void *
  807. rdns_resolver_add_server (struct rdns_resolver *resolver,
  808. const char *name, unsigned int port,
  809. int priority, unsigned int io_cnt)
  810. {
  811. struct rdns_server *serv;
  812. union {
  813. struct in_addr v4;
  814. struct in6_addr v6;
  815. } addr;
  816. if (inet_pton (AF_INET, name, &addr) == 0 &&
  817. inet_pton (AF_INET6, name, &addr) == 0) {
  818. /* Invalid IP */
  819. return NULL;
  820. }
  821. if (io_cnt == 0) {
  822. return NULL;
  823. }
  824. if (port == 0 || port > UINT16_MAX) {
  825. return NULL;
  826. }
  827. serv = calloc (1, sizeof (struct rdns_server));
  828. if (serv == NULL) {
  829. return NULL;
  830. }
  831. serv->name = strdup (name);
  832. if (serv->name == NULL) {
  833. free (serv);
  834. return NULL;
  835. }
  836. serv->io_cnt = io_cnt;
  837. serv->port = port;
  838. UPSTREAM_ADD (resolver->servers, serv, priority);
  839. return serv;
  840. }
  841. void
  842. rdns_resolver_set_logger (struct rdns_resolver *resolver,
  843. rdns_log_function logger, void *log_data)
  844. {
  845. resolver->logger = logger;
  846. resolver->log_data = log_data;
  847. }
  848. void
  849. rdns_resolver_set_log_level (struct rdns_resolver *resolver,
  850. enum rdns_log_level level)
  851. {
  852. resolver->log_level = level;
  853. }
  854. void
  855. rdns_resolver_set_upstream_lib (struct rdns_resolver *resolver,
  856. struct rdns_upstream_context *ups_ctx,
  857. void *ups_data)
  858. {
  859. resolver->ups = ups_ctx;
  860. resolver->ups->data = ups_data;
  861. }
  862. void
  863. rdns_resolver_set_max_io_uses (struct rdns_resolver *resolver,
  864. uint64_t max_ioc_uses, double check_time)
  865. {
  866. if (resolver->refresh_ioc_periodic != NULL) {
  867. resolver->async->del_periodic (resolver->async->data,
  868. resolver->refresh_ioc_periodic);
  869. resolver->refresh_ioc_periodic = NULL;
  870. }
  871. resolver->max_ioc_uses = max_ioc_uses;
  872. if (check_time > 0.0 && resolver->async->add_periodic) {
  873. resolver->refresh_ioc_periodic =
  874. resolver->async->add_periodic (resolver->async->data,
  875. check_time, rdns_process_ioc_refresh, resolver);
  876. }
  877. }
  878. static void
  879. rdns_resolver_free (struct rdns_resolver *resolver)
  880. {
  881. struct rdns_server *serv, *stmp;
  882. struct rdns_io_channel *ioc;
  883. unsigned int i;
  884. if (resolver->initialized) {
  885. if (resolver->periodic != NULL) {
  886. resolver->async->del_periodic (resolver->async->data, resolver->periodic);
  887. }
  888. if (resolver->refresh_ioc_periodic != NULL) {
  889. resolver->async->del_periodic (resolver->async->data,
  890. resolver->refresh_ioc_periodic);
  891. }
  892. if (resolver->curve_plugin != NULL && resolver->curve_plugin->dtor != NULL) {
  893. resolver->curve_plugin->dtor (resolver, resolver->curve_plugin->data);
  894. }
  895. /* Stop IO watch on all IO channels */
  896. UPSTREAM_FOREACH_SAFE (resolver->servers, serv, stmp) {
  897. for (i = 0; i < serv->io_cnt; i ++) {
  898. ioc = serv->io_channels[i];
  899. REF_RELEASE (ioc);
  900. }
  901. serv->io_cnt = 0;
  902. UPSTREAM_DEL (resolver->servers, serv);
  903. free (serv->io_channels);
  904. free (serv->name);
  905. free (serv);
  906. }
  907. }
  908. free (resolver->async);
  909. free (resolver);
  910. }
  911. struct rdns_resolver *
  912. rdns_resolver_new (int flags)
  913. {
  914. struct rdns_resolver *new_resolver;
  915. new_resolver = calloc (1, sizeof (struct rdns_resolver));
  916. REF_INIT_RETAIN (new_resolver, rdns_resolver_free);
  917. new_resolver->logger = rdns_logger_internal;
  918. new_resolver->log_data = new_resolver;
  919. new_resolver->flags = flags;
  920. return new_resolver;
  921. }
  922. void
  923. rdns_resolver_async_bind (struct rdns_resolver *resolver,
  924. struct rdns_async_context *ctx)
  925. {
  926. if (resolver != NULL && ctx != NULL) {
  927. resolver->async = ctx;
  928. resolver->async_binded = true;
  929. }
  930. }
  931. void
  932. rdns_resolver_set_dnssec (struct rdns_resolver *resolver, bool enabled)
  933. {
  934. if (resolver) {
  935. resolver->enable_dnssec = enabled;
  936. }
  937. }
  938. void rdns_resolver_set_fake_reply (struct rdns_resolver *resolver,
  939. const char *name,
  940. enum rdns_request_type type,
  941. enum dns_rcode rcode,
  942. struct rdns_reply_entry *reply)
  943. {
  944. struct rdns_fake_reply *fake_rep;
  945. struct rdns_fake_reply_idx *srch;
  946. unsigned len = strlen (name);
  947. assert (len < MAX_FAKE_NAME);
  948. srch = malloc (sizeof (*srch) + len);
  949. srch->len = len;
  950. srch->type = type;
  951. memcpy (srch->request, name, len);
  952. HASH_FIND (hh, resolver->fake_elts, srch, len + sizeof (*srch), fake_rep);
  953. if (fake_rep) {
  954. /* Append reply to the existing list */
  955. fake_rep->rcode = rcode;
  956. if (reply) {
  957. DL_CONCAT (fake_rep->result, reply);
  958. }
  959. }
  960. else {
  961. fake_rep = calloc (1, sizeof (*fake_rep) + len);
  962. if (fake_rep == NULL) {
  963. abort ();
  964. }
  965. fake_rep->rcode = rcode;
  966. memcpy (&fake_rep->key, srch, sizeof (*srch) + len);
  967. if (reply) {
  968. DL_CONCAT (fake_rep->result, reply);
  969. }
  970. HASH_ADD (hh, resolver->fake_elts, key, sizeof (*srch) + len, fake_rep);
  971. }
  972. }