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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328
  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 <sys/uio.h>
  34. #include "rdns.h"
  35. #include "dns_private.h"
  36. #include "ottery.h"
  37. #include "util.h"
  38. #include "packet.h"
  39. #include "parse.h"
  40. #include "logger.h"
  41. #include "compression.h"
  42. __KHASH_IMPL(rdns_requests_hash, kh_inline, int, struct rdns_request *, true,
  43. kh_int_hash_func, kh_int_hash_equal);
  44. static int
  45. rdns_send_request (struct rdns_request *req, int fd, bool new_req)
  46. {
  47. ssize_t r;
  48. struct rdns_server *serv = req->io->srv;
  49. struct rdns_resolver *resolver = req->resolver;
  50. struct dns_header *header;
  51. const int max_id_cycles = 32;
  52. khiter_t k;
  53. /* Find ID collision */
  54. if (new_req) {
  55. r = 0;
  56. for (;;) {
  57. k = kh_get(rdns_requests_hash, req->io->requests, req->id);
  58. if (k != kh_end(req->io->requests)) {
  59. /* Check for unique id */
  60. header = (struct dns_header *) req->packet;
  61. header->qid = rdns_permutor_generate_id();
  62. req->id = header->qid;
  63. if (++r > max_id_cycles) {
  64. return -1;
  65. }
  66. }
  67. else {
  68. break;
  69. }
  70. }
  71. }
  72. if (resolver->curve_plugin == NULL) {
  73. if (!IS_CHANNEL_CONNECTED(req->io)) {
  74. r = sendto (fd, req->packet, req->pos, 0,
  75. req->io->saddr,
  76. req->io->slen);
  77. }
  78. else {
  79. r = send (fd, req->packet, req->pos, 0);
  80. }
  81. }
  82. else {
  83. if (!IS_CHANNEL_CONNECTED(req->io)) {
  84. r = resolver->curve_plugin->cb.curve_plugin.send_cb (req,
  85. resolver->curve_plugin->data,
  86. req->io->saddr,
  87. req->io->slen);
  88. }
  89. else {
  90. r = resolver->curve_plugin->cb.curve_plugin.send_cb (req,
  91. resolver->curve_plugin->data,
  92. NULL,
  93. 0);
  94. }
  95. }
  96. if (r == -1) {
  97. if (errno == EAGAIN || errno == EINTR) {
  98. if (new_req) {
  99. /* Write when socket is ready */
  100. int pr;
  101. k = kh_put(rdns_requests_hash, req->io->requests, req->id, &pr);
  102. kh_value(req->io->requests, k) = req;
  103. req->async_event = resolver->async->add_write (resolver->async->data,
  104. fd, req);
  105. req->state = RDNS_REQUEST_WAIT_SEND;
  106. }
  107. /*
  108. * If request is already processed then the calling function
  109. * should take care about events processing
  110. */
  111. return 0;
  112. }
  113. else {
  114. rdns_debug ("send failed: %s for server %s", strerror (errno), serv->name);
  115. return -1;
  116. }
  117. }
  118. else if (!IS_CHANNEL_CONNECTED(req->io)) {
  119. /* Connect socket */
  120. r = connect (fd, req->io->saddr, req->io->slen);
  121. if (r == -1) {
  122. rdns_err ("cannot connect after sending request: %s for server %s",
  123. strerror (errno), serv->name);
  124. }
  125. else {
  126. req->io->flags |= RDNS_CHANNEL_CONNECTED;
  127. }
  128. }
  129. if (new_req) {
  130. /* Add request to hash table */
  131. int pr;
  132. k = kh_put(rdns_requests_hash, req->io->requests, req->id, &pr);
  133. kh_value(req->io->requests, k) = req;
  134. /* Fill timeout */
  135. req->async_event = resolver->async->add_timer (resolver->async->data,
  136. req->timeout, req);
  137. req->state = RDNS_REQUEST_WAIT_REPLY;
  138. }
  139. return 1;
  140. }
  141. static struct rdns_reply *
  142. rdns_make_reply (struct rdns_request *req, enum dns_rcode rcode)
  143. {
  144. struct rdns_reply *rep;
  145. rep = malloc (sizeof (struct rdns_reply));
  146. if (rep != NULL) {
  147. rep->request = req;
  148. rep->resolver = req->resolver;
  149. rep->entries = NULL;
  150. rep->code = rcode;
  151. req->reply = rep;
  152. rep->flags = 0;
  153. rep->requested_name = req->requested_names[0].name;
  154. }
  155. return rep;
  156. }
  157. static struct rdns_request *
  158. rdns_find_dns_request (uint8_t *in, struct rdns_io_channel *ioc)
  159. {
  160. struct dns_header *header = (struct dns_header *)in;
  161. int id;
  162. struct rdns_resolver *resolver = ioc->resolver;
  163. id = header->qid;
  164. khiter_t k = kh_get(rdns_requests_hash, ioc->requests, id);
  165. if (k == kh_end(ioc->requests)) {
  166. /* No such requests found */
  167. rdns_debug ("DNS request with id %d has not been found for IO channel", id);
  168. }
  169. return kh_value(ioc->requests, k);
  170. }
  171. static bool
  172. rdns_parse_reply (uint8_t *in, int r, struct rdns_request *req,
  173. struct rdns_reply **_rep)
  174. {
  175. struct dns_header *header = (struct dns_header *)in;
  176. struct rdns_reply *rep;
  177. struct rdns_reply_entry *elt;
  178. uint8_t *pos, *npos;
  179. struct rdns_resolver *resolver = req->resolver;
  180. uint16_t qdcount;
  181. int type;
  182. bool found = false;
  183. int i, t;
  184. /* First check header fields */
  185. if (header->qr == 0) {
  186. rdns_info ("got request while waiting for reply");
  187. return false;
  188. }
  189. qdcount = ntohs (header->qdcount);
  190. if (qdcount != req->qcount) {
  191. rdns_info ("request has %d queries, reply has %d queries", (int)req->qcount, (int)header->qdcount);
  192. return false;
  193. }
  194. /*
  195. * Now we have request and query data is now at the end of header, so compare
  196. * request QR section and reply QR section
  197. */
  198. req->pos = sizeof (struct dns_header);
  199. pos = in + sizeof (struct dns_header);
  200. t = r - sizeof (struct dns_header);
  201. for (i = 0; i < (int)qdcount; i ++) {
  202. if ((npos = rdns_request_reply_cmp (req, pos,t)) == NULL) {
  203. rdns_info ("DNS request with id %d is for different query, ignoring", (int)req->id);
  204. return false;
  205. }
  206. t -= npos - pos;
  207. pos = npos;
  208. }
  209. /*
  210. * Now pos is in answer section, so we should extract data and form reply
  211. */
  212. rep = rdns_make_reply (req, header->rcode);
  213. if (header->ad) {
  214. rep->flags |= RDNS_AUTH;
  215. }
  216. if (header->tc) {
  217. rep->flags |= RDNS_TRUNCATED;
  218. }
  219. if (rep == NULL) {
  220. rdns_warn ("Cannot allocate memory for reply");
  221. return false;
  222. }
  223. type = req->requested_names[0].type;
  224. if (rep->code == RDNS_RC_NOERROR) {
  225. r -= pos - in;
  226. /* Extract RR records */
  227. for (i = 0; i < ntohs (header->ancount); i ++) {
  228. elt = malloc (sizeof (struct rdns_reply_entry));
  229. t = rdns_parse_rr (resolver, in, elt, &pos, rep, &r);
  230. if (t == -1) {
  231. free (elt);
  232. rdns_debug ("incomplete reply");
  233. break;
  234. }
  235. else if (t == 1) {
  236. DL_APPEND (rep->entries, elt);
  237. if (elt->type == type) {
  238. found = true;
  239. }
  240. }
  241. else {
  242. rdns_debug ("no matching reply for %s",
  243. req->requested_names[0].name);
  244. free (elt);
  245. }
  246. }
  247. }
  248. if (!found && type != RDNS_REQUEST_ANY) {
  249. /* We have not found the requested RR type */
  250. if (rep->code == RDNS_RC_NOERROR) {
  251. rep->code = RDNS_RC_NOREC;
  252. }
  253. }
  254. *_rep = rep;
  255. return true;
  256. }
  257. static void
  258. rdns_process_tcp_read (int fd, struct rdns_io_channel *ioc)
  259. {
  260. }
  261. static void
  262. rdns_process_tcp_connect (int fd, struct rdns_io_channel *ioc)
  263. {
  264. ioc->flags |= RDNS_CHANNEL_CONNECTED|RDNS_CHANNEL_ACTIVE;
  265. ioc->tcp->async_read = ioc->resolver->async->add_read(ioc->resolver->async->data,
  266. ioc->sock, ioc);
  267. }
  268. static void
  269. rdns_process_udp_read (int fd, struct rdns_io_channel *ioc)
  270. {
  271. struct rdns_resolver *resolver;
  272. struct rdns_request *req = NULL;
  273. ssize_t r;
  274. struct rdns_reply *rep;
  275. uint8_t in[UDP_PACKET_SIZE];
  276. resolver = ioc->resolver;
  277. /* First read packet from socket */
  278. if (resolver->curve_plugin == NULL) {
  279. r = recv (fd, in, sizeof (in), 0);
  280. if (r > (int)(sizeof (struct dns_header) + sizeof (struct dns_query))) {
  281. req = rdns_find_dns_request (in, ioc);
  282. }
  283. }
  284. else {
  285. r = resolver->curve_plugin->cb.curve_plugin.recv_cb (ioc, in,
  286. sizeof (in), resolver->curve_plugin->data, &req,
  287. ioc->saddr, ioc->slen);
  288. if (req == NULL &&
  289. r > (int)(sizeof (struct dns_header) + sizeof (struct dns_query))) {
  290. req = rdns_find_dns_request (in, ioc);
  291. }
  292. }
  293. if (req != NULL) {
  294. if (rdns_parse_reply (in, r, req, &rep)) {
  295. UPSTREAM_OK (req->io->srv);
  296. if (req->resolver->ups && req->io->srv->ups_elt) {
  297. req->resolver->ups->ok (req->io->srv->ups_elt,
  298. req->resolver->ups->data);
  299. }
  300. rdns_request_unschedule (req);
  301. req->state = RDNS_REQUEST_REPLIED;
  302. req->func (rep, req->arg);
  303. REF_RELEASE (req);
  304. }
  305. }
  306. else {
  307. /* Still want to increase uses */
  308. ioc->uses ++;
  309. }
  310. }
  311. void
  312. rdns_process_read (int fd, void *arg)
  313. {
  314. struct rdns_io_channel *ioc = (struct rdns_io_channel *)arg;
  315. struct rdns_resolver *resolver;
  316. resolver = ioc->resolver;
  317. if (IS_CHANNEL_TCP(ioc)) {
  318. if (IS_CHANNEL_CONNECTED(ioc)) {
  319. rdns_process_tcp_read (fd, ioc);
  320. }
  321. else {
  322. rdns_err ("read readiness on non connected TCP channel!");
  323. }
  324. }
  325. else {
  326. rdns_process_udp_read (fd, ioc);
  327. }
  328. }
  329. void
  330. rdns_process_timer (void *arg)
  331. {
  332. struct rdns_request *req = (struct rdns_request *)arg;
  333. struct rdns_reply *rep;
  334. int r;
  335. bool renew = false;
  336. struct rdns_resolver *resolver;
  337. struct rdns_server *serv = NULL;
  338. unsigned cnt;
  339. req->retransmits --;
  340. resolver = req->resolver;
  341. if (req->resolver->ups && req->io->srv->ups_elt) {
  342. req->resolver->ups->fail (req->io->srv->ups_elt,
  343. req->resolver->ups->data, "timeout waiting reply");
  344. }
  345. else {
  346. UPSTREAM_FAIL (req->io->srv, time (NULL));
  347. }
  348. if (req->retransmits == 0) {
  349. rep = rdns_make_reply (req, RDNS_RC_TIMEOUT);
  350. rdns_request_unschedule (req);
  351. req->state = RDNS_REQUEST_REPLIED;
  352. req->func (rep, req->arg);
  353. REF_RELEASE (req);
  354. return;
  355. }
  356. if (!IS_CHANNEL_ACTIVE(req->io) || req->retransmits == 1) {
  357. if (resolver->ups) {
  358. cnt = resolver->ups->count (resolver->ups->data);
  359. }
  360. else {
  361. cnt = 0;
  362. UPSTREAM_FOREACH (resolver->servers, serv) {
  363. cnt ++;
  364. }
  365. }
  366. if (!IS_CHANNEL_ACTIVE(req->io) || cnt > 1) {
  367. /* Do not reschedule IO requests on inactive sockets */
  368. rdns_debug ("reschedule request with id: %d", (int)req->id);
  369. rdns_request_unschedule (req);
  370. REF_RELEASE (req->io);
  371. if (resolver->ups) {
  372. struct rdns_upstream_elt *elt;
  373. elt = resolver->ups->select_retransmit (
  374. req->requested_names[0].name,
  375. req->requested_names[0].len,
  376. req->io->srv->ups_elt,
  377. resolver->ups->data);
  378. if (elt) {
  379. serv = elt->server;
  380. serv->ups_elt = elt;
  381. }
  382. else {
  383. UPSTREAM_SELECT_ROUND_ROBIN (resolver->servers, serv);
  384. }
  385. }
  386. else {
  387. UPSTREAM_SELECT_ROUND_ROBIN (resolver->servers, serv);
  388. }
  389. if (serv == NULL) {
  390. rdns_warn ("cannot find suitable server for request");
  391. rep = rdns_make_reply (req, RDNS_RC_SERVFAIL);
  392. req->state = RDNS_REQUEST_REPLIED;
  393. req->func (rep, req->arg);
  394. REF_RELEASE (req);
  395. return;
  396. }
  397. /* Select random IO channel */
  398. req->io = serv->io_channels[ottery_rand_uint32 () % serv->io_cnt];
  399. req->io->uses ++;
  400. REF_RETAIN (req->io);
  401. renew = true;
  402. }
  403. }
  404. /*
  405. * Note: when `renew` is true, then send_request deals with the
  406. * timers and events itself
  407. */
  408. r = rdns_send_request (req, req->io->sock, renew);
  409. if (r == 0) {
  410. /* Retransmit one more time */
  411. if (!renew) {
  412. req->async->del_timer (req->async->data,
  413. req->async_event);
  414. req->async_event = req->async->add_write (req->async->data,
  415. req->io->sock, req);
  416. }
  417. req->state = RDNS_REQUEST_WAIT_SEND;
  418. }
  419. else if (r == -1) {
  420. if (req->resolver->ups && req->io->srv->ups_elt) {
  421. req->resolver->ups->fail (req->io->srv->ups_elt,
  422. req->resolver->ups->data, "cannot send retransmit after timeout");
  423. }
  424. else {
  425. UPSTREAM_FAIL (req->io->srv, time (NULL));
  426. }
  427. if (!renew) {
  428. req->async->del_timer (req->async->data,
  429. req->async_event);
  430. req->async_event = NULL;
  431. rdns_request_remove_from_hash(req);
  432. }
  433. /* We have not scheduled timeout actually due to send error */
  434. rep = rdns_make_reply (req, RDNS_RC_NETERR);
  435. req->state = RDNS_REQUEST_REPLIED;
  436. req->func (rep, req->arg);
  437. REF_RELEASE (req);
  438. }
  439. else {
  440. req->async->repeat_timer (req->async->data, req->async_event);
  441. req->state = RDNS_REQUEST_WAIT_REPLY;
  442. }
  443. }
  444. static void
  445. rdns_process_periodic (void *arg)
  446. {
  447. struct rdns_resolver *resolver = (struct rdns_resolver*)arg;
  448. struct rdns_server *serv;
  449. UPSTREAM_RESCAN (resolver->servers, time (NULL));
  450. UPSTREAM_FOREACH (resolver->servers, serv) {
  451. for (int i = 0; i < serv->tcp_io_cnt; i ++) {
  452. if (IS_CHANNEL_CONNECTED(serv->tcp_io_channels[i])) {
  453. /* Disconnect channels with no requests in flight */
  454. if (kh_size(serv->tcp_io_channels[i]->requests) == 0) {
  455. rdns_debug ("reset inactive TCP connection to %s", serv->name);
  456. rdns_ioc_tcp_reset (serv->tcp_io_channels[i]);
  457. }
  458. }
  459. }
  460. }
  461. }
  462. static void
  463. rdns_process_ioc_refresh (void *arg)
  464. {
  465. struct rdns_resolver *resolver = (struct rdns_resolver*)arg;
  466. struct rdns_server *serv;
  467. struct rdns_io_channel *ioc, *nioc;
  468. unsigned int i;
  469. if (resolver->max_ioc_uses > 0) {
  470. UPSTREAM_FOREACH (resolver->servers, serv) {
  471. for (i = 0; i < serv->io_cnt; i ++) {
  472. ioc = serv->io_channels[i];
  473. if (ioc->uses > resolver->max_ioc_uses) {
  474. /* Schedule IOC removing */
  475. nioc = rdns_ioc_new (serv, resolver, false);
  476. if (nioc == NULL) {
  477. rdns_err ("calloc fails to allocate rdns_io_channel");
  478. continue;
  479. }
  480. serv->io_channels[i] = nioc;
  481. rdns_debug ("scheduled io channel for server %s to be refreshed after "
  482. "%lu usages", serv->name, (unsigned long)ioc->uses);
  483. ioc->flags &= ~RDNS_CHANNEL_ACTIVE;
  484. REF_RELEASE (ioc);
  485. }
  486. }
  487. }
  488. }
  489. }
  490. static void
  491. rdns_process_udp_retransmit (int fd, struct rdns_request *req)
  492. {
  493. struct rdns_resolver *resolver;
  494. struct rdns_reply *rep;
  495. int r;
  496. resolver = req->resolver;
  497. resolver->async->del_write (resolver->async->data,
  498. req->async_event);
  499. req->async_event = NULL;
  500. if (req->state == RDNS_REQUEST_FAKE) {
  501. /* Reply is ready */
  502. req->func (req->reply, req->arg);
  503. REF_RELEASE (req);
  504. return;
  505. }
  506. r = rdns_send_request (req, fd, false);
  507. if (r == 0) {
  508. /* Retransmit one more time */
  509. req->async_event = req->async->add_write (req->async->data,
  510. fd, req);
  511. req->state = RDNS_REQUEST_WAIT_SEND;
  512. }
  513. else if (r == -1) {
  514. if (req->resolver->ups && req->io->srv->ups_elt) {
  515. req->resolver->ups->fail (req->io->srv->ups_elt,
  516. req->resolver->ups->data, "retransmit send failed");
  517. }
  518. else {
  519. UPSTREAM_FAIL (req->io->srv, time (NULL));
  520. }
  521. rep = rdns_make_reply (req, RDNS_RC_NETERR);
  522. req->state = RDNS_REQUEST_REPLIED;
  523. req->func (rep, req->arg);
  524. REF_RELEASE (req);
  525. }
  526. else {
  527. req->async_event = req->async->add_timer (req->async->data,
  528. req->timeout, req);
  529. req->state = RDNS_REQUEST_WAIT_REPLY;
  530. }
  531. }
  532. static ssize_t
  533. rdns_write_output_chain (struct rdns_io_channel *ioc, struct rdns_tcp_output_chain *oc)
  534. {
  535. ssize_t r;
  536. struct iovec iov[2];
  537. int niov, already_written;
  538. switch (oc->cur_write) {
  539. case 0:
  540. /* Size + DNS request in full */
  541. iov[0].iov_base = &oc->next_write_size;
  542. iov[0].iov_len = sizeof (oc->next_write_size);
  543. iov[1].iov_base = oc->req->packet;
  544. iov[1].iov_len = oc->req->packet_len;
  545. niov = 2;
  546. break;
  547. case 1:
  548. /* Partial Size + DNS request in full */
  549. iov[0].iov_base = ((unsigned char *)&oc->next_write_size) + 1;
  550. iov[0].iov_len = 1;
  551. iov[1].iov_base = oc->req->packet;
  552. iov[1].iov_len = oc->req->packet_len;
  553. niov = 2;
  554. break;
  555. default:
  556. /* Merely DNS packet */
  557. already_written = oc->cur_write - 2;
  558. if (oc->req->packet_len <= already_written) {
  559. errno = EINVAL;
  560. return -1;
  561. }
  562. iov[0].iov_base = oc->req->packet + already_written;
  563. iov[0].iov_len = oc->req->packet_len - already_written;
  564. niov = 1;
  565. break;
  566. }
  567. r = writev(ioc->sock, iov, niov);
  568. if (r > 0) {
  569. oc->cur_write += r;
  570. }
  571. return r;
  572. }
  573. static void
  574. rdns_process_tcp_write (int fd, struct rdns_io_channel *ioc)
  575. {
  576. struct rdns_resolver *resolver = ioc->resolver;
  577. /* Try to write as much as we can */
  578. struct rdns_tcp_output_chain *oc, *tmp;
  579. DL_FOREACH_SAFE(ioc->tcp->output_chain, oc, tmp) {
  580. ssize_t r = rdns_write_output_chain (ioc, oc);
  581. if (r == -1) {
  582. if (errno == EAGAIN || errno == EINTR) {
  583. /* Write even is persistent */
  584. return;
  585. }
  586. else {
  587. rdns_err ("error when trying to write request to %s: %s",
  588. ioc->srv->name, strerror (errno));
  589. rdns_ioc_tcp_reset (ioc);
  590. return;
  591. }
  592. }
  593. else if (oc->next_write_size < oc->cur_write) {
  594. /* Packet has been fully written, remove it */
  595. DL_DELETE(ioc->tcp->output_chain, oc);
  596. /* Data in output buffer belongs to request */
  597. free (oc);
  598. ioc->tcp->cur_output_chains --;
  599. }
  600. else {
  601. /* Buffer is not yet processed, stop unless we can continue */
  602. break;
  603. }
  604. }
  605. if (ioc->tcp->cur_output_chains == 0) {
  606. /* Unregister write event */
  607. ioc->resolver->async->del_write (ioc->resolver->async->data,
  608. ioc->tcp->async_write);
  609. ioc->tcp->async_write = NULL;
  610. }
  611. }
  612. void
  613. rdns_process_write (int fd, void *arg)
  614. {
  615. /*
  616. * We first need to dispatch *arg to understand what has caused the write
  617. * readiness event.
  618. * The one possibility is that it was a UDP retransmit request, so our
  619. * arg will be struct rdns_request *
  620. * Another possibility is that write event was triggered by some TCP related
  621. * stuff. In this case the only possibility is that our arg is struct rdns_io_channel *
  622. * To distinguish these two cases (due to flaws in the rdns architecture in the first
  623. * place) we compare the first 8 bytes with RDNS_IO_CHANNEL_TAG
  624. */
  625. uint64_t tag;
  626. memcpy (&tag, arg, sizeof(tag));
  627. if (tag == RDNS_IO_CHANNEL_TAG) {
  628. struct rdns_io_channel *ioc = (struct rdns_io_channel *) arg;
  629. if (IS_CHANNEL_CONNECTED(ioc)) {
  630. rdns_process_tcp_write(fd, ioc);
  631. }
  632. else {
  633. rdns_process_tcp_connect(fd, ioc);
  634. rdns_process_tcp_write(fd, ioc);
  635. }
  636. }
  637. else {
  638. struct rdns_request *req = (struct rdns_request *) arg;
  639. rdns_process_udp_retransmit(fd, req);
  640. }
  641. }
  642. struct rdns_server *
  643. rdns_select_request_upstream (struct rdns_resolver *resolver,
  644. struct rdns_request *req,
  645. bool is_retransmit,
  646. struct rdns_server *prev_serv)
  647. {
  648. struct rdns_server *serv = NULL;
  649. if (resolver->ups) {
  650. struct rdns_upstream_elt *elt;
  651. if (is_retransmit && prev_serv) {
  652. elt = resolver->ups->select_retransmit (req->requested_names[0].name,
  653. req->requested_names[0].len,
  654. prev_serv->ups_elt,
  655. resolver->ups->data);
  656. }
  657. else {
  658. elt = resolver->ups->select (req->requested_names[0].name,
  659. req->requested_names[0].len, resolver->ups->data);
  660. }
  661. if (elt) {
  662. serv = elt->server;
  663. serv->ups_elt = elt;
  664. }
  665. else {
  666. UPSTREAM_SELECT_ROUND_ROBIN (resolver->servers, serv);
  667. }
  668. }
  669. else {
  670. UPSTREAM_SELECT_ROUND_ROBIN (resolver->servers, serv);
  671. }
  672. return serv;
  673. }
  674. #define align_ptr(p, a) \
  675. (guint8 *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
  676. struct rdns_request*
  677. rdns_make_request_full (
  678. struct rdns_resolver *resolver,
  679. dns_callback_type cb,
  680. void *cbdata,
  681. double timeout,
  682. unsigned int repeats,
  683. unsigned int queries,
  684. ...
  685. )
  686. {
  687. va_list args;
  688. struct rdns_request *req;
  689. struct rdns_server *serv;
  690. int r, type;
  691. unsigned int i, tlen = 0, clen = 0, cur;
  692. size_t olen;
  693. const char *cur_name, *last_name = NULL;
  694. struct rdns_compression_entry *comp = NULL;
  695. struct rdns_fake_reply *fake_rep = NULL;
  696. char fake_buf[MAX_FAKE_NAME + sizeof (struct rdns_fake_reply_idx) + 16];
  697. struct rdns_fake_reply_idx *idx;
  698. if (resolver == NULL || !resolver->initialized) {
  699. if (resolver == NULL) {
  700. return NULL;
  701. }
  702. rdns_err ("resolver is uninitialized");
  703. return NULL;
  704. }
  705. req = malloc (sizeof (struct rdns_request));
  706. if (req == NULL) {
  707. rdns_err ("failed to allocate memory for request: %s",
  708. strerror (errno));
  709. return NULL;
  710. }
  711. req->resolver = resolver;
  712. req->func = cb;
  713. req->arg = cbdata;
  714. req->reply = NULL;
  715. req->qcount = queries;
  716. req->io = NULL;
  717. req->state = RDNS_REQUEST_NEW;
  718. req->packet = NULL;
  719. req->requested_names = calloc (queries, sizeof (struct rdns_request_name));
  720. req->async_event = NULL;
  721. if (req->requested_names == NULL) {
  722. free (req);
  723. rdns_err ("failed to allocate memory for request data: %s",
  724. strerror (errno));
  725. return NULL;
  726. }
  727. req->type = 0;
  728. #ifdef TWEETNACL
  729. req->curve_plugin_data = NULL;
  730. #endif
  731. REF_INIT_RETAIN (req, rdns_request_free);
  732. /* Calculate packet's total length based on records count */
  733. va_start (args, queries);
  734. for (i = 0; i < queries * 2; i += 2) {
  735. cur = i / 2;
  736. cur_name = va_arg (args, const char *);
  737. type = va_arg (args, int);
  738. if (cur_name != NULL) {
  739. clen = strlen (cur_name);
  740. if (clen == 0) {
  741. rdns_warn ("got empty name to resolve");
  742. rdns_request_free (req);
  743. return NULL;
  744. }
  745. if (cur_name[0] == '.') {
  746. /* Skip dots at the begin */
  747. unsigned int ndots = strspn (cur_name, ".");
  748. cur_name += ndots;
  749. clen -= ndots;
  750. if (clen == 0) {
  751. rdns_warn ("got empty name to resolve");
  752. rdns_request_free (req);
  753. return NULL;
  754. }
  755. }
  756. if (cur_name[clen - 1] == '.') {
  757. /* Skip trailing dots */
  758. while (clen >= 1 && cur_name[clen - 1] == '.') {
  759. clen --;
  760. }
  761. if (clen == 0) {
  762. rdns_warn ("got empty name to resolve");
  763. rdns_request_free (req);
  764. return NULL;
  765. }
  766. }
  767. if (last_name == NULL && queries == 1 && clen < MAX_FAKE_NAME) {
  768. /* We allocate structure in the static space */
  769. idx = (struct rdns_fake_reply_idx *)align_ptr (fake_buf, 16);
  770. idx->type = type;
  771. idx->len = clen;
  772. memcpy (idx->request, cur_name, clen);
  773. HASH_FIND (hh, resolver->fake_elts, idx, sizeof (*idx) + clen,
  774. fake_rep);
  775. if (fake_rep) {
  776. /* We actually treat it as a short-circuit */
  777. req->reply = rdns_make_reply (req, fake_rep->rcode);
  778. req->reply->entries = fake_rep->result;
  779. req->state = RDNS_REQUEST_FAKE;
  780. }
  781. }
  782. last_name = cur_name;
  783. tlen += clen;
  784. }
  785. else if (last_name == NULL) {
  786. rdns_err ("got NULL as the first name to resolve");
  787. rdns_request_free (req);
  788. return NULL;
  789. }
  790. if (req->state != RDNS_REQUEST_FAKE) {
  791. if (!rdns_format_dns_name (resolver, last_name, clen,
  792. &req->requested_names[cur].name, &olen)) {
  793. rdns_err ("cannot format %s", last_name);
  794. rdns_request_free (req);
  795. return NULL;
  796. }
  797. req->requested_names[cur].len = olen;
  798. }
  799. else {
  800. req->requested_names[cur].len = clen;
  801. }
  802. req->requested_names[cur].type = type;
  803. }
  804. va_end (args);
  805. if (req->state != RDNS_REQUEST_FAKE) {
  806. rdns_allocate_packet (req, tlen);
  807. rdns_make_dns_header (req, queries);
  808. for (i = 0; i < queries; i++) {
  809. cur_name = req->requested_names[i].name;
  810. clen = req->requested_names[i].len;
  811. type = req->requested_names[i].type;
  812. if (queries > 1) {
  813. if (!rdns_add_rr (req, cur_name, clen, type, &comp)) {
  814. rdns_err ("cannot add rr");
  815. REF_RELEASE (req);
  816. rnds_compression_free (comp);
  817. return NULL;
  818. }
  819. } else {
  820. if (!rdns_add_rr (req, cur_name, clen, type, NULL)) {
  821. rdns_err ("cannot add rr");
  822. REF_RELEASE (req);
  823. rnds_compression_free (comp);
  824. return NULL;
  825. }
  826. }
  827. }
  828. rnds_compression_free (comp);
  829. /* Add EDNS RR */
  830. rdns_add_edns0 (req);
  831. req->retransmits = repeats ? repeats : 1;
  832. req->timeout = timeout;
  833. req->state = RDNS_REQUEST_NEW;
  834. }
  835. req->async = resolver->async;
  836. serv = rdns_select_request_upstream (resolver, req, false, NULL);
  837. if (serv == NULL) {
  838. rdns_warn ("cannot find suitable server for request");
  839. REF_RELEASE (req);
  840. return NULL;
  841. }
  842. /* Select random IO channel */
  843. req->io = serv->io_channels[ottery_rand_uint32 () % serv->io_cnt];
  844. if (req->state == RDNS_REQUEST_FAKE) {
  845. req->async_event = resolver->async->add_write (resolver->async->data,
  846. req->io->sock, req);
  847. }
  848. else {
  849. /* Now send request to server */
  850. do {
  851. r = rdns_send_request (req, req->io->sock, true);
  852. if (r == -1) {
  853. req->retransmits --; /* It must be > 0 */
  854. if (req->retransmits > 0) {
  855. if (resolver->ups && serv->ups_elt) {
  856. resolver->ups->fail (serv->ups_elt, resolver->ups->data,
  857. "send IO error");
  858. }
  859. else {
  860. UPSTREAM_FAIL (serv, time (NULL));
  861. }
  862. serv = rdns_select_request_upstream (resolver, req,
  863. true, serv);
  864. if (serv == NULL) {
  865. rdns_warn ("cannot find suitable server for request");
  866. REF_RELEASE (req);
  867. return NULL;
  868. }
  869. req->io = serv->io_channels[ottery_rand_uint32 () % serv->io_cnt];
  870. }
  871. else {
  872. rdns_info ("cannot send DNS request: %s", strerror (errno));
  873. REF_RELEASE (req);
  874. if (resolver->ups && serv->ups_elt) {
  875. resolver->ups->fail (serv->ups_elt, resolver->ups->data,
  876. "send IO error");
  877. }
  878. else {
  879. UPSTREAM_FAIL (serv, time (NULL));
  880. }
  881. return NULL;
  882. }
  883. }
  884. else {
  885. /* All good */
  886. req->io->uses++;
  887. break;
  888. }
  889. } while (req->retransmits > 0);
  890. }
  891. REF_RETAIN (req->io);
  892. REF_RETAIN (req->resolver);
  893. return req;
  894. }
  895. bool
  896. rdns_resolver_init (struct rdns_resolver *resolver)
  897. {
  898. unsigned int i;
  899. struct rdns_server *serv;
  900. struct rdns_io_channel *ioc;
  901. if (!resolver->async_binded) {
  902. rdns_err ("no async backend specified");
  903. return false;
  904. }
  905. if (resolver->servers == NULL) {
  906. rdns_err ("no DNS servers defined");
  907. return false;
  908. }
  909. /* Now init io channels to all servers */
  910. UPSTREAM_FOREACH (resolver->servers, serv) {
  911. serv->io_channels = calloc (serv->io_cnt, sizeof (struct rdns_io_channel *));
  912. if (serv->io_channels == NULL) {
  913. rdns_err ("cannot allocate memory for the resolver IO channels");
  914. return false;
  915. }
  916. for (i = 0; i < serv->io_cnt; i ++) {
  917. ioc = rdns_ioc_new(serv, resolver, false);
  918. if (ioc == NULL) {
  919. rdns_err ("cannot allocate memory or init the IO channel");
  920. return false;
  921. }
  922. serv->io_channels[i] = ioc;
  923. }
  924. int ntcp_channels = 0;
  925. /*
  926. * We are more forgiving for TCP IO channels: we can have zero of them
  927. * if DNS is misconfigured and still be able to resolve stuff
  928. */
  929. serv->tcp_io_channels = calloc (serv->tcp_io_cnt, sizeof (struct rdns_io_channel *));
  930. if (serv->tcp_io_channels == NULL) {
  931. rdns_err ("cannot allocate memory for the resolver TCP IO channels");
  932. return false;
  933. }
  934. for (i = 0; i < serv->tcp_io_cnt; i ++) {
  935. ioc = rdns_ioc_new (serv, resolver, true);
  936. if (ioc == NULL) {
  937. rdns_err ("cannot allocate memory or init the TCP IO channel");
  938. continue;
  939. }
  940. serv->tcp_io_channels[ntcp_channels++] = ioc;
  941. }
  942. serv->tcp_io_cnt = ntcp_channels;
  943. }
  944. if (resolver->async->add_periodic) {
  945. resolver->periodic = resolver->async->add_periodic (resolver->async->data,
  946. UPSTREAM_REVIVE_TIME, rdns_process_periodic, resolver);
  947. }
  948. resolver->initialized = true;
  949. return true;
  950. }
  951. void
  952. rdns_resolver_register_plugin (struct rdns_resolver *resolver,
  953. struct rdns_plugin *plugin)
  954. {
  955. if (resolver != NULL && plugin != NULL) {
  956. /* XXX: support only network plugin now, and only a single one */
  957. if (plugin->type == RDNS_PLUGIN_CURVE) {
  958. resolver->curve_plugin = plugin;
  959. }
  960. }
  961. }
  962. void *
  963. rdns_resolver_add_server (struct rdns_resolver *resolver,
  964. const char *name, unsigned int port,
  965. int priority, unsigned int io_cnt)
  966. {
  967. struct rdns_server *serv;
  968. union {
  969. struct in_addr v4;
  970. struct in6_addr v6;
  971. } addr;
  972. if (inet_pton (AF_INET, name, &addr) == 0 &&
  973. inet_pton (AF_INET6, name, &addr) == 0) {
  974. /* Invalid IP */
  975. return NULL;
  976. }
  977. if (io_cnt == 0) {
  978. return NULL;
  979. }
  980. if (port == 0 || port > UINT16_MAX) {
  981. return NULL;
  982. }
  983. serv = calloc (1, sizeof (struct rdns_server));
  984. if (serv == NULL) {
  985. return NULL;
  986. }
  987. serv->name = strdup (name);
  988. if (serv->name == NULL) {
  989. free (serv);
  990. return NULL;
  991. }
  992. serv->io_cnt = io_cnt;
  993. /* TODO: make it configurable maybe? */
  994. serv->tcp_io_cnt = default_tcp_io_cnt;
  995. serv->port = port;
  996. UPSTREAM_ADD (resolver->servers, serv, priority);
  997. return serv;
  998. }
  999. void
  1000. rdns_resolver_set_logger (struct rdns_resolver *resolver,
  1001. rdns_log_function logger, void *log_data)
  1002. {
  1003. resolver->logger = logger;
  1004. resolver->log_data = log_data;
  1005. }
  1006. void
  1007. rdns_resolver_set_log_level (struct rdns_resolver *resolver,
  1008. enum rdns_log_level level)
  1009. {
  1010. resolver->log_level = level;
  1011. }
  1012. void
  1013. rdns_resolver_set_upstream_lib (struct rdns_resolver *resolver,
  1014. struct rdns_upstream_context *ups_ctx,
  1015. void *ups_data)
  1016. {
  1017. resolver->ups = ups_ctx;
  1018. resolver->ups->data = ups_data;
  1019. }
  1020. void
  1021. rdns_resolver_set_max_io_uses (struct rdns_resolver *resolver,
  1022. uint64_t max_ioc_uses, double check_time)
  1023. {
  1024. if (resolver->refresh_ioc_periodic != NULL) {
  1025. resolver->async->del_periodic (resolver->async->data,
  1026. resolver->refresh_ioc_periodic);
  1027. resolver->refresh_ioc_periodic = NULL;
  1028. }
  1029. resolver->max_ioc_uses = max_ioc_uses;
  1030. if (check_time > 0.0 && resolver->async->add_periodic) {
  1031. resolver->refresh_ioc_periodic =
  1032. resolver->async->add_periodic (resolver->async->data,
  1033. check_time, rdns_process_ioc_refresh, resolver);
  1034. }
  1035. }
  1036. static void
  1037. rdns_resolver_free (struct rdns_resolver *resolver)
  1038. {
  1039. struct rdns_server *serv, *stmp;
  1040. struct rdns_io_channel *ioc;
  1041. unsigned int i;
  1042. if (resolver->initialized) {
  1043. if (resolver->periodic != NULL) {
  1044. resolver->async->del_periodic (resolver->async->data, resolver->periodic);
  1045. }
  1046. if (resolver->refresh_ioc_periodic != NULL) {
  1047. resolver->async->del_periodic (resolver->async->data,
  1048. resolver->refresh_ioc_periodic);
  1049. }
  1050. if (resolver->curve_plugin != NULL && resolver->curve_plugin->dtor != NULL) {
  1051. resolver->curve_plugin->dtor (resolver, resolver->curve_plugin->data);
  1052. }
  1053. /* Stop IO watch on all IO channels */
  1054. UPSTREAM_FOREACH_SAFE (resolver->servers, serv, stmp) {
  1055. for (i = 0; i < serv->io_cnt; i ++) {
  1056. ioc = serv->io_channels[i];
  1057. REF_RELEASE (ioc);
  1058. }
  1059. for (i = 0; i < serv->tcp_io_cnt; i ++) {
  1060. ioc = serv->tcp_io_channels[i];
  1061. REF_RELEASE (ioc);
  1062. }
  1063. UPSTREAM_DEL (resolver->servers, serv);
  1064. free (serv->io_channels);
  1065. free (serv->tcp_io_channels);
  1066. free (serv->name);
  1067. free (serv);
  1068. }
  1069. }
  1070. free (resolver->async);
  1071. free (resolver);
  1072. }
  1073. struct rdns_resolver *
  1074. rdns_resolver_new (int flags)
  1075. {
  1076. struct rdns_resolver *new_resolver;
  1077. new_resolver = calloc (1, sizeof (struct rdns_resolver));
  1078. REF_INIT_RETAIN (new_resolver, rdns_resolver_free);
  1079. new_resolver->logger = rdns_logger_internal;
  1080. new_resolver->log_data = new_resolver;
  1081. new_resolver->flags = flags;
  1082. return new_resolver;
  1083. }
  1084. void
  1085. rdns_resolver_async_bind (struct rdns_resolver *resolver,
  1086. struct rdns_async_context *ctx)
  1087. {
  1088. if (resolver != NULL && ctx != NULL) {
  1089. resolver->async = ctx;
  1090. resolver->async_binded = true;
  1091. }
  1092. }
  1093. void
  1094. rdns_resolver_set_dnssec (struct rdns_resolver *resolver, bool enabled)
  1095. {
  1096. if (resolver) {
  1097. resolver->enable_dnssec = enabled;
  1098. }
  1099. }
  1100. void rdns_resolver_set_fake_reply (struct rdns_resolver *resolver,
  1101. const char *name,
  1102. enum rdns_request_type type,
  1103. enum dns_rcode rcode,
  1104. struct rdns_reply_entry *reply)
  1105. {
  1106. struct rdns_fake_reply *fake_rep;
  1107. struct rdns_fake_reply_idx *srch;
  1108. unsigned len = strlen (name);
  1109. assert (len < MAX_FAKE_NAME);
  1110. srch = malloc (sizeof (*srch) + len);
  1111. srch->len = len;
  1112. srch->type = type;
  1113. memcpy (srch->request, name, len);
  1114. HASH_FIND (hh, resolver->fake_elts, srch, len + sizeof (*srch), fake_rep);
  1115. if (fake_rep) {
  1116. /* Append reply to the existing list */
  1117. fake_rep->rcode = rcode;
  1118. if (reply) {
  1119. DL_CONCAT (fake_rep->result, reply);
  1120. }
  1121. }
  1122. else {
  1123. fake_rep = calloc (1, sizeof (*fake_rep) + len);
  1124. if (fake_rep == NULL) {
  1125. abort ();
  1126. }
  1127. fake_rep->rcode = rcode;
  1128. memcpy (&fake_rep->key, srch, sizeof (*srch) + len);
  1129. if (reply) {
  1130. DL_CONCAT (fake_rep->result, reply);
  1131. }
  1132. HASH_ADD (hh, resolver->fake_elts, key, sizeof (*srch) + len, fake_rep);
  1133. }
  1134. free (srch);
  1135. }