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 25KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078
  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. #define align_ptr(p, a) \
  494. (guint8 *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
  495. struct rdns_request*
  496. rdns_make_request_full (
  497. struct rdns_resolver *resolver,
  498. dns_callback_type cb,
  499. void *cbdata,
  500. double timeout,
  501. unsigned int repeats,
  502. unsigned int queries,
  503. ...
  504. )
  505. {
  506. va_list args;
  507. struct rdns_request *req;
  508. struct rdns_server *serv;
  509. int r, type;
  510. unsigned int i, tlen = 0, clen = 0, cur;
  511. size_t olen;
  512. const char *cur_name, *last_name = NULL;
  513. struct rdns_compression_entry *comp = NULL;
  514. struct rdns_fake_reply *fake_rep = NULL;
  515. char fake_buf[MAX_FAKE_NAME + sizeof (struct rdns_fake_reply_idx) + 16];
  516. struct rdns_fake_reply_idx *idx;
  517. if (resolver == NULL || !resolver->initialized) {
  518. if (resolver == NULL) {
  519. return NULL;
  520. }
  521. rdns_err ("resolver is uninitialized");
  522. return NULL;
  523. }
  524. req = malloc (sizeof (struct rdns_request));
  525. if (req == NULL) {
  526. rdns_err ("failed to allocate memory for request: %s",
  527. strerror (errno));
  528. return NULL;
  529. }
  530. req->resolver = resolver;
  531. req->func = cb;
  532. req->arg = cbdata;
  533. req->reply = NULL;
  534. req->qcount = queries;
  535. req->io = NULL;
  536. req->state = RDNS_REQUEST_NEW;
  537. req->packet = NULL;
  538. req->requested_names = calloc (queries, sizeof (struct rdns_request_name));
  539. req->async_event = NULL;
  540. if (req->requested_names == NULL) {
  541. free (req);
  542. rdns_err ("failed to allocate memory for request data: %s",
  543. strerror (errno));
  544. return NULL;
  545. }
  546. req->type = 0;
  547. #ifdef TWEETNACL
  548. req->curve_plugin_data = NULL;
  549. #endif
  550. REF_INIT_RETAIN (req, rdns_request_free);
  551. /* Calculate packet's total length based on records count */
  552. va_start (args, queries);
  553. for (i = 0; i < queries * 2; i += 2) {
  554. cur = i / 2;
  555. cur_name = va_arg (args, const char *);
  556. type = va_arg (args, int);
  557. if (cur_name != NULL) {
  558. clen = strlen (cur_name);
  559. if (clen == 0) {
  560. rdns_warn ("got empty name to resolve");
  561. rdns_request_free (req);
  562. return NULL;
  563. }
  564. if (cur_name[0] == '.') {
  565. /* Skip dots at the begin */
  566. unsigned int ndots = strspn (cur_name, ".");
  567. cur_name += ndots;
  568. clen -= ndots;
  569. if (clen == 0) {
  570. rdns_warn ("got empty name to resolve");
  571. rdns_request_free (req);
  572. return NULL;
  573. }
  574. }
  575. if (cur_name[clen - 1] == '.') {
  576. /* Skip trailing dots */
  577. while (clen >= 1 && cur_name[clen - 1] == '.') {
  578. clen --;
  579. }
  580. if (clen == 0) {
  581. rdns_warn ("got empty name to resolve");
  582. rdns_request_free (req);
  583. return NULL;
  584. }
  585. }
  586. if (last_name == NULL && queries == 1 && clen < MAX_FAKE_NAME) {
  587. /* We allocate structure in the static space */
  588. idx = (struct rdns_fake_reply_idx *)align_ptr (fake_buf, 16);
  589. idx->type = type;
  590. idx->len = clen;
  591. memcpy (idx->request, cur_name, clen);
  592. HASH_FIND (hh, resolver->fake_elts, idx, sizeof (*idx) + clen,
  593. fake_rep);
  594. if (fake_rep) {
  595. /* We actually treat it as a short-circuit */
  596. req->reply = rdns_make_reply (req, fake_rep->rcode);
  597. req->reply->entries = fake_rep->result;
  598. req->state = RDNS_REQUEST_FAKE;
  599. }
  600. }
  601. last_name = cur_name;
  602. tlen += clen;
  603. }
  604. else if (last_name == NULL) {
  605. rdns_err ("got NULL as the first name to resolve");
  606. rdns_request_free (req);
  607. return NULL;
  608. }
  609. if (req->state != RDNS_REQUEST_FAKE) {
  610. if (!rdns_format_dns_name (resolver, last_name, clen,
  611. &req->requested_names[cur].name, &olen)) {
  612. rdns_err ("cannot format %s", last_name);
  613. rdns_request_free (req);
  614. return NULL;
  615. }
  616. req->requested_names[cur].len = olen;
  617. }
  618. else {
  619. req->requested_names[cur].len = clen;
  620. }
  621. req->requested_names[cur].type = type;
  622. }
  623. va_end (args);
  624. if (req->state != RDNS_REQUEST_FAKE) {
  625. rdns_allocate_packet (req, tlen);
  626. rdns_make_dns_header (req, queries);
  627. for (i = 0; i < queries; i++) {
  628. cur_name = req->requested_names[i].name;
  629. clen = req->requested_names[i].len;
  630. type = req->requested_names[i].type;
  631. if (queries > 1) {
  632. if (!rdns_add_rr (req, cur_name, clen, type, &comp)) {
  633. rdns_err ("cannot add rr", cur_name);
  634. REF_RELEASE (req);
  635. rnds_compression_free (comp);
  636. return NULL;
  637. }
  638. } else {
  639. if (!rdns_add_rr (req, cur_name, clen, type, NULL)) {
  640. rdns_err ("cannot add rr", cur_name);
  641. REF_RELEASE (req);
  642. rnds_compression_free (comp);
  643. return NULL;
  644. }
  645. }
  646. }
  647. rnds_compression_free (comp);
  648. /* Add EDNS RR */
  649. rdns_add_edns0 (req);
  650. req->retransmits = repeats;
  651. req->timeout = timeout;
  652. req->state = RDNS_REQUEST_NEW;
  653. }
  654. req->async = resolver->async;
  655. if (resolver->ups) {
  656. struct rdns_upstream_elt *elt;
  657. elt = resolver->ups->select (req->requested_names[0].name,
  658. req->requested_names[0].len, resolver->ups->data);
  659. if (elt) {
  660. serv = elt->server;
  661. serv->ups_elt = elt;
  662. }
  663. else {
  664. UPSTREAM_SELECT_ROUND_ROBIN (resolver->servers, serv);
  665. }
  666. }
  667. else {
  668. UPSTREAM_SELECT_ROUND_ROBIN (resolver->servers, serv);
  669. }
  670. if (serv == NULL) {
  671. rdns_warn ("cannot find suitable server for request");
  672. REF_RELEASE (req);
  673. return NULL;
  674. }
  675. /* Select random IO channel */
  676. req->io = serv->io_channels[ottery_rand_uint32 () % serv->io_cnt];
  677. if (req->state == RDNS_REQUEST_FAKE) {
  678. req->async_event = resolver->async->add_write (resolver->async->data,
  679. req->io->sock, req);
  680. }
  681. else {
  682. req->io->uses++;
  683. /* Now send request to server */
  684. r = rdns_send_request (req, req->io->sock, true);
  685. if (r == -1) {
  686. rdns_info ("cannot send DNS request: %s", strerror (errno));
  687. REF_RELEASE (req);
  688. if (resolver->ups && serv->ups_elt) {
  689. resolver->ups->fail (serv->ups_elt, resolver->ups->data,
  690. "send IO error");
  691. }
  692. else {
  693. UPSTREAM_FAIL (serv, time (NULL));
  694. }
  695. return NULL;
  696. }
  697. }
  698. REF_RETAIN (req->io);
  699. REF_RETAIN (req->resolver);
  700. return req;
  701. }
  702. bool
  703. rdns_resolver_init (struct rdns_resolver *resolver)
  704. {
  705. unsigned int i;
  706. struct rdns_server *serv;
  707. struct rdns_io_channel *ioc;
  708. if (!resolver->async_binded) {
  709. rdns_err ("no async backend specified");
  710. return false;
  711. }
  712. if (resolver->servers == NULL) {
  713. rdns_err ("no DNS servers defined");
  714. return false;
  715. }
  716. /* Now init io channels to all servers */
  717. UPSTREAM_FOREACH (resolver->servers, serv) {
  718. serv->io_channels = calloc (serv->io_cnt, sizeof (struct rdns_io_channel *));
  719. for (i = 0; i < serv->io_cnt; i ++) {
  720. ioc = calloc (1, sizeof (struct rdns_io_channel));
  721. if (ioc == NULL) {
  722. rdns_err ("cannot allocate memory for the resolver IO channels");
  723. return false;
  724. }
  725. ioc->sock = rdns_make_client_socket (serv->name, serv->port, SOCK_DGRAM,
  726. &ioc->saddr, &ioc->slen);
  727. if (ioc->sock == -1) {
  728. ioc->active = false;
  729. rdns_err ("cannot open socket to %s:%d %s",
  730. serv->name, serv->port, strerror (errno));
  731. free (ioc);
  732. return false;
  733. }
  734. else {
  735. ioc->srv = serv;
  736. ioc->resolver = resolver;
  737. ioc->async_io = resolver->async->add_read (resolver->async->data,
  738. ioc->sock, ioc);
  739. REF_INIT_RETAIN (ioc, rdns_ioc_free);
  740. serv->io_channels[i] = ioc;
  741. }
  742. }
  743. }
  744. if (resolver->async->add_periodic) {
  745. resolver->periodic = resolver->async->add_periodic (resolver->async->data,
  746. UPSTREAM_REVIVE_TIME, rdns_process_periodic, resolver);
  747. }
  748. resolver->initialized = true;
  749. return true;
  750. }
  751. void
  752. rdns_resolver_register_plugin (struct rdns_resolver *resolver,
  753. struct rdns_plugin *plugin)
  754. {
  755. if (resolver != NULL && plugin != NULL) {
  756. /* XXX: support only network plugin now, and only a single one */
  757. if (plugin->type == RDNS_PLUGIN_CURVE) {
  758. resolver->curve_plugin = plugin;
  759. }
  760. }
  761. }
  762. void *
  763. rdns_resolver_add_server (struct rdns_resolver *resolver,
  764. const char *name, unsigned int port,
  765. int priority, unsigned int io_cnt)
  766. {
  767. struct rdns_server *serv;
  768. union {
  769. struct in_addr v4;
  770. struct in6_addr v6;
  771. } addr;
  772. if (inet_pton (AF_INET, name, &addr) == 0 &&
  773. inet_pton (AF_INET6, name, &addr) == 0) {
  774. /* Invalid IP */
  775. return NULL;
  776. }
  777. if (io_cnt == 0) {
  778. return NULL;
  779. }
  780. if (port == 0 || port > UINT16_MAX) {
  781. return NULL;
  782. }
  783. serv = calloc (1, sizeof (struct rdns_server));
  784. if (serv == NULL) {
  785. return NULL;
  786. }
  787. serv->name = strdup (name);
  788. if (serv->name == NULL) {
  789. free (serv);
  790. return NULL;
  791. }
  792. serv->io_cnt = io_cnt;
  793. serv->port = port;
  794. UPSTREAM_ADD (resolver->servers, serv, priority);
  795. return serv;
  796. }
  797. void
  798. rdns_resolver_set_logger (struct rdns_resolver *resolver,
  799. rdns_log_function logger, void *log_data)
  800. {
  801. resolver->logger = logger;
  802. resolver->log_data = log_data;
  803. }
  804. void
  805. rdns_resolver_set_log_level (struct rdns_resolver *resolver,
  806. enum rdns_log_level level)
  807. {
  808. resolver->log_level = level;
  809. }
  810. void
  811. rdns_resolver_set_upstream_lib (struct rdns_resolver *resolver,
  812. struct rdns_upstream_context *ups_ctx,
  813. void *ups_data)
  814. {
  815. resolver->ups = ups_ctx;
  816. resolver->ups->data = ups_data;
  817. }
  818. void
  819. rdns_resolver_set_max_io_uses (struct rdns_resolver *resolver,
  820. uint64_t max_ioc_uses, double check_time)
  821. {
  822. if (resolver->refresh_ioc_periodic != NULL) {
  823. resolver->async->del_periodic (resolver->async->data,
  824. resolver->refresh_ioc_periodic);
  825. resolver->refresh_ioc_periodic = NULL;
  826. }
  827. resolver->max_ioc_uses = max_ioc_uses;
  828. if (check_time > 0.0 && resolver->async->add_periodic) {
  829. resolver->refresh_ioc_periodic =
  830. resolver->async->add_periodic (resolver->async->data,
  831. check_time, rdns_process_ioc_refresh, resolver);
  832. }
  833. }
  834. static void
  835. rdns_resolver_free (struct rdns_resolver *resolver)
  836. {
  837. struct rdns_server *serv, *stmp;
  838. struct rdns_io_channel *ioc;
  839. unsigned int i;
  840. if (resolver->initialized) {
  841. if (resolver->periodic != NULL) {
  842. resolver->async->del_periodic (resolver->async->data, resolver->periodic);
  843. }
  844. if (resolver->refresh_ioc_periodic != NULL) {
  845. resolver->async->del_periodic (resolver->async->data,
  846. resolver->refresh_ioc_periodic);
  847. }
  848. if (resolver->curve_plugin != NULL && resolver->curve_plugin->dtor != NULL) {
  849. resolver->curve_plugin->dtor (resolver, resolver->curve_plugin->data);
  850. }
  851. /* Stop IO watch on all IO channels */
  852. UPSTREAM_FOREACH_SAFE (resolver->servers, serv, stmp) {
  853. for (i = 0; i < serv->io_cnt; i ++) {
  854. ioc = serv->io_channels[i];
  855. REF_RELEASE (ioc);
  856. }
  857. serv->io_cnt = 0;
  858. UPSTREAM_DEL (resolver->servers, serv);
  859. free (serv->io_channels);
  860. free (serv->name);
  861. free (serv);
  862. }
  863. }
  864. free (resolver->async);
  865. free (resolver);
  866. }
  867. struct rdns_resolver *
  868. rdns_resolver_new (void)
  869. {
  870. struct rdns_resolver *new;
  871. new = calloc (1, sizeof (struct rdns_resolver));
  872. REF_INIT_RETAIN (new, rdns_resolver_free);
  873. new->logger = rdns_logger_internal;
  874. new->log_data = new;
  875. return new;
  876. }
  877. void
  878. rdns_resolver_async_bind (struct rdns_resolver *resolver,
  879. struct rdns_async_context *ctx)
  880. {
  881. if (resolver != NULL && ctx != NULL) {
  882. resolver->async = ctx;
  883. resolver->async_binded = true;
  884. }
  885. }
  886. void
  887. rdns_resolver_set_dnssec (struct rdns_resolver *resolver, bool enabled)
  888. {
  889. if (resolver) {
  890. resolver->enable_dnssec = enabled;
  891. }
  892. }
  893. void rdns_resolver_set_fake_reply (struct rdns_resolver *resolver,
  894. const char *name,
  895. enum rdns_request_type type,
  896. enum dns_rcode rcode,
  897. struct rdns_reply_entry *reply)
  898. {
  899. struct rdns_fake_reply *fake_rep;
  900. struct rdns_fake_reply_idx *srch;
  901. unsigned len = strlen (name);
  902. assert (len < MAX_FAKE_NAME);
  903. srch = malloc (sizeof (*srch) + len);
  904. srch->len = len;
  905. srch->type = type;
  906. memcpy (srch->request, name, len);
  907. HASH_FIND (hh, resolver->fake_elts, srch, len + sizeof (*srch), fake_rep);
  908. if (fake_rep) {
  909. /* Append reply to the existing list */
  910. fake_rep->rcode = rcode;
  911. if (reply) {
  912. DL_CONCAT (fake_rep->result, reply);
  913. }
  914. }
  915. else {
  916. fake_rep = calloc (1, sizeof (*fake_rep) + len);
  917. if (fake_rep == NULL) {
  918. abort ();
  919. }
  920. fake_rep->rcode = rcode;
  921. memcpy (&fake_rep->key, srch, sizeof (*srch) + len);
  922. if (reply) {
  923. DL_CONCAT (fake_rep->result, reply);
  924. }
  925. HASH_ADD (hh, resolver->fake_elts, key, sizeof (*srch) + len, fake_rep);
  926. }
  927. }