dns_client.c 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811
  1. /*************************************************************************
  2. *
  3. * Copyright (C) 2018 Ruilin Peng (Nick) <[email protected]>.
  4. *
  5. * smartdns is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * smartdns is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #include "dns_client.h"
  19. #include "atomic.h"
  20. #include "dns.h"
  21. #include "fast_ping.h"
  22. #include "hashtable.h"
  23. #include "list.h"
  24. #include "tlog.h"
  25. #include "util.h"
  26. #include <arpa/inet.h>
  27. #include <errno.h>
  28. #include <fcntl.h>
  29. #include <linux/filter.h>
  30. #include <netdb.h>
  31. #include <netinet/icmp6.h>
  32. #include <netinet/ip.h>
  33. #include <netinet/ip6.h>
  34. #include <netinet/ip_icmp.h>
  35. #include <netinet/tcp.h>
  36. #include <openssl/err.h>
  37. #include <openssl/ssl.h>
  38. #include <pthread.h>
  39. #include <stdio.h>
  40. #include <stdlib.h>
  41. #include <string.h>
  42. #include <sys/epoll.h>
  43. #include <sys/socket.h>
  44. #include <sys/stat.h>
  45. #include <sys/types.h>
  46. #include <unistd.h>
  47. #define DNS_MAX_HOSTNAME 256
  48. #define DNS_MAX_EVENTS 64
  49. #define DNS_HOSTNAME_LEN 128
  50. #define DNS_TCP_BUFFER (32 * 1024)
  51. #ifndef TCP_FASTOPEN_CONNECT
  52. #define TCP_FASTOPEN_CONNECT 30
  53. #endif
  54. struct dns_client_ecs {
  55. int enable;
  56. unsigned int family;
  57. unsigned int bitlen;
  58. union {
  59. unsigned char ipv4_addr[DNS_RR_A_LEN];
  60. unsigned char ipv6_addr[DNS_RR_AAAA_LEN];
  61. unsigned char addr[0];
  62. };
  63. };
  64. /* dns client */
  65. struct dns_client {
  66. pthread_t tid;
  67. int run;
  68. int epoll_fd;
  69. /* dns server list */
  70. pthread_mutex_t server_list_lock;
  71. struct list_head dns_server_list;
  72. /* query list */
  73. pthread_mutex_t dns_request_lock;
  74. struct list_head dns_request_list;
  75. atomic_t dns_server_num;
  76. /* ECS */
  77. struct dns_client_ecs ecs_ipv4;
  78. struct dns_client_ecs ecs_ipv6;
  79. /* query doman hash table, key: sid + domain */
  80. pthread_mutex_t domain_map_lock;
  81. DECLARE_HASHTABLE(domain_map, 6);
  82. };
  83. struct dns_server_buff {
  84. unsigned char data[DNS_TCP_BUFFER];
  85. unsigned short len;
  86. };
  87. typedef enum dns_server_status {
  88. DNS_SERVER_STATUS_INIT = 0,
  89. DNS_SERVER_STATUS_CONNECTING,
  90. DNS_SERVER_STATUS_CONNECTIONLESS,
  91. DNS_SERVER_STATUS_CONNECTED,
  92. DNS_SERVER_STATUS_DISCONNECTED,
  93. } dns_server_status;
  94. /* dns server information */
  95. struct dns_server_info {
  96. struct list_head list;
  97. /* server ping handle */
  98. struct ping_host_struct *ping_host;
  99. /* server type */
  100. dns_server_type_t type;
  101. /* client socket */
  102. int fd;
  103. int ttl;
  104. int ttl_range;
  105. SSL *ssl;
  106. SSL_CTX *ssl_ctx;
  107. dns_server_status status;
  108. unsigned int result_flag;
  109. struct dns_server_buff send_buff;
  110. struct dns_server_buff recv_buff;
  111. time_t last_send;
  112. time_t last_recv;
  113. /* server addr info */
  114. unsigned short ai_family;
  115. socklen_t ai_addrlen;
  116. union {
  117. struct sockaddr_in in;
  118. struct sockaddr_in6 in6;
  119. struct sockaddr addr;
  120. };
  121. };
  122. /* dns replied server info */
  123. struct dns_query_replied {
  124. struct hlist_node node;
  125. socklen_t addr_len;
  126. union {
  127. struct sockaddr_in in;
  128. struct sockaddr_in6 in6;
  129. struct sockaddr addr;
  130. };
  131. };
  132. /* query struct */
  133. struct dns_query_struct {
  134. atomic_t refcnt;
  135. /* query id, hash key sid + domain*/
  136. char domain[DNS_MAX_CNAME_LEN];
  137. unsigned short sid;
  138. struct hlist_node domain_node;
  139. struct list_head dns_request_list;
  140. struct list_head period_list;
  141. /* dns query type */
  142. int qtype;
  143. /* dns query number */
  144. atomic_t dns_request_sent;
  145. unsigned long send_tick;
  146. /* caller notification */
  147. dns_client_callback callback;
  148. void *user_ptr;
  149. /* replied hash table */
  150. DECLARE_HASHTABLE(replied_map, 4);
  151. };
  152. static struct dns_client client;
  153. static atomic_t dns_client_sid = ATOMIC_INIT(0);
  154. /* get addr info */
  155. static struct addrinfo *_dns_client_getaddr(const char *host, char *port, int type, int protocol)
  156. {
  157. struct addrinfo hints;
  158. struct addrinfo *result = NULL;
  159. int ret = 0;
  160. memset(&hints, 0, sizeof(hints));
  161. hints.ai_family = AF_UNSPEC;
  162. hints.ai_socktype = type;
  163. hints.ai_protocol = protocol;
  164. ret = getaddrinfo(host, port, &hints, &result);
  165. if (ret != 0) {
  166. tlog(TLOG_ERROR, "get addr info failed. %s\n", gai_strerror(errno));
  167. tlog(TLOG_ERROR, "host = %s, port = %s, type = %d, protocol = %d", host, port, type, protocol);
  168. goto errout;
  169. }
  170. return result;
  171. errout:
  172. if (result) {
  173. freeaddrinfo(result);
  174. }
  175. return NULL;
  176. }
  177. /* check whether server exists */
  178. int _dns_client_server_exist(struct addrinfo *gai, dns_server_type_t server_type)
  179. {
  180. struct dns_server_info *server_info, *tmp;
  181. pthread_mutex_lock(&client.server_list_lock);
  182. list_for_each_entry_safe(server_info, tmp, &client.dns_server_list, list)
  183. {
  184. if (server_info->ai_addrlen != gai->ai_addrlen || server_info->ai_family != gai->ai_family) {
  185. continue;
  186. }
  187. if (server_info->type != server_type) {
  188. continue;
  189. }
  190. if (memcmp(&server_info->addr, gai->ai_addr, gai->ai_addrlen) != 0) {
  191. continue;
  192. }
  193. pthread_mutex_unlock(&client.server_list_lock);
  194. return 0;
  195. }
  196. pthread_mutex_unlock(&client.server_list_lock);
  197. return -1;
  198. }
  199. void _dns_client_server_update_ttl(struct ping_host_struct *ping_host, const char *host, FAST_PING_RESULT result, struct sockaddr *addr, socklen_t addr_len,
  200. int seqno, int ttl, struct timeval *tv, void *userptr)
  201. {
  202. struct dns_server_info *server_info = userptr;
  203. if (result != PING_RESULT_RESPONSE || server_info == NULL) {
  204. return;
  205. }
  206. double rtt = tv->tv_sec * 1000.0 + tv->tv_usec / 1000.0;
  207. tlog(TLOG_DEBUG, "from %15s: seq=%d ttl=%d time=%.3f\n", host, seqno, ttl, rtt);
  208. server_info->ttl = ttl;
  209. }
  210. /* add dns server information */
  211. int _dns_client_server_add(char *server_ip, struct addrinfo *gai, dns_server_type_t server_type, unsigned int result_flag, int ttl)
  212. {
  213. struct dns_server_info *server_info = NULL;
  214. if (_dns_client_server_exist(gai, server_type) == 0) {
  215. return 0;
  216. }
  217. server_info = malloc(sizeof(*server_info));
  218. if (server_info == NULL) {
  219. goto errout;
  220. }
  221. if (server_type != DNS_SERVER_UDP) {
  222. result_flag &= (~DNSSERVER_FLAG_CHECK_TTL);
  223. }
  224. memset(server_info, 0, sizeof(*server_info));
  225. server_info->ai_family = gai->ai_family;
  226. server_info->ai_addrlen = gai->ai_addrlen;
  227. server_info->type = server_type;
  228. server_info->fd = 0;
  229. server_info->status = DNS_SERVER_STATUS_INIT;
  230. server_info->result_flag = result_flag;
  231. server_info->ttl = ttl;
  232. server_info->ttl_range = 0;
  233. if (gai->ai_addrlen > sizeof(server_info->in6)) {
  234. tlog(TLOG_ERROR, "addr len invalid, %d, %zd, %d", gai->ai_addrlen, sizeof(server_info->addr), server_info->ai_family);
  235. goto errout;
  236. }
  237. memcpy(&server_info->addr, gai->ai_addr, gai->ai_addrlen);
  238. /* start ping task */
  239. if (ttl <= 0 && (result_flag & DNSSERVER_FLAG_CHECK_TTL)) {
  240. server_info->ping_host = fast_ping_start(PING_TYPE_DNS, server_ip, 0, 60000, 1000, _dns_client_server_update_ttl, server_info);
  241. if (server_info->ping_host == NULL) {
  242. tlog(TLOG_ERROR, "start ping failed.");
  243. goto errout;
  244. }
  245. if (ttl < 0) {
  246. server_info->ttl_range = -ttl;
  247. }
  248. }
  249. /* add to list */
  250. pthread_mutex_lock(&client.server_list_lock);
  251. list_add(&server_info->list, &client.dns_server_list);
  252. pthread_mutex_unlock(&client.server_list_lock);
  253. atomic_inc(&client.dns_server_num);
  254. return 0;
  255. errout:
  256. if (server_info) {
  257. if (server_info->ping_host) {
  258. fast_ping_stop(server_info->ping_host);
  259. }
  260. free(server_info);
  261. }
  262. return -1;
  263. }
  264. static void _dns_client_close_socket(struct dns_server_info *server_info)
  265. {
  266. if (server_info->fd <= 0) {
  267. return;
  268. }
  269. if (server_info->ssl) {
  270. SSL_shutdown(server_info->ssl);
  271. SSL_free(server_info->ssl);
  272. server_info->ssl = NULL;
  273. }
  274. if (server_info->ssl_ctx) {
  275. SSL_CTX_free(server_info->ssl_ctx);
  276. server_info->ssl_ctx = NULL;
  277. }
  278. epoll_ctl(client.epoll_fd, EPOLL_CTL_DEL, server_info->fd, NULL);
  279. close(server_info->fd);
  280. server_info->fd = -1;
  281. server_info->status = DNS_SERVER_STATUS_DISCONNECTED;
  282. }
  283. /* remove all servers information */
  284. void _dns_client_server_remove_all(void)
  285. {
  286. struct dns_server_info *server_info, *tmp;
  287. pthread_mutex_lock(&client.server_list_lock);
  288. list_for_each_entry_safe(server_info, tmp, &client.dns_server_list, list)
  289. {
  290. list_del(&server_info->list);
  291. /* stop ping task */
  292. if (server_info->ping_host) {
  293. if (fast_ping_stop(server_info->ping_host) != 0) {
  294. tlog(TLOG_ERROR, "stop ping failed.\n");
  295. }
  296. }
  297. _dns_client_close_socket(server_info);
  298. free(server_info);
  299. }
  300. pthread_mutex_unlock(&client.server_list_lock);
  301. }
  302. /* remove single server */
  303. int _dns_client_server_remove(char *server_ip, struct addrinfo *gai, dns_server_type_t server_type)
  304. {
  305. struct dns_server_info *server_info, *tmp;
  306. /* find server and remove */
  307. pthread_mutex_lock(&client.server_list_lock);
  308. list_for_each_entry_safe(server_info, tmp, &client.dns_server_list, list)
  309. {
  310. if (server_info->ai_addrlen != gai->ai_addrlen || server_info->ai_family != gai->ai_family) {
  311. continue;
  312. }
  313. if (memcmp(&server_info->addr, gai->ai_addr, gai->ai_addrlen) != 0) {
  314. continue;
  315. }
  316. list_del(&server_info->list);
  317. pthread_mutex_unlock(&client.server_list_lock);
  318. if (fast_ping_stop(server_info->ping_host) != 0) {
  319. tlog(TLOG_ERROR, "stop ping failed.\n");
  320. }
  321. free(server_info);
  322. atomic_dec(&client.dns_server_num);
  323. return 0;
  324. }
  325. pthread_mutex_unlock(&client.server_list_lock);
  326. return -1;
  327. }
  328. int _dns_client_server_operate(char *server_ip, int port, dns_server_type_t server_type, int result_flag, int ttl, int operate)
  329. {
  330. char port_s[8];
  331. int sock_type;
  332. int ret;
  333. struct addrinfo *gai = NULL;
  334. if (server_type >= DNS_SERVER_TYPE_END) {
  335. tlog(TLOG_ERROR, "server type is invalid.");
  336. return -1;
  337. }
  338. switch (server_type) {
  339. case DNS_SERVER_UDP:
  340. sock_type = SOCK_DGRAM;
  341. break;
  342. case DNS_SERVER_TLS:
  343. case DNS_SERVER_TCP:
  344. sock_type = SOCK_STREAM;
  345. break;
  346. default:
  347. return -1;
  348. break;
  349. }
  350. /* get addr info */
  351. snprintf(port_s, 8, "%d", port);
  352. gai = _dns_client_getaddr(server_ip, port_s, sock_type, 0);
  353. if (gai == NULL) {
  354. tlog(TLOG_ERROR, "get address failed, %s:%d", server_ip, port);
  355. goto errout;
  356. }
  357. if (operate == 0) {
  358. ret = _dns_client_server_add(server_ip, gai, server_type, result_flag, ttl);
  359. if (ret != 0) {
  360. goto errout;
  361. }
  362. } else {
  363. ret = _dns_client_server_remove(server_ip, gai, server_type);
  364. if (ret != 0) {
  365. goto errout;
  366. }
  367. }
  368. freeaddrinfo(gai);
  369. return 0;
  370. errout:
  371. if (gai) {
  372. freeaddrinfo(gai);
  373. }
  374. return -1;
  375. }
  376. int dns_add_server(char *server_ip, int port, dns_server_type_t server_type, int result_flag, int ttl)
  377. {
  378. return _dns_client_server_operate(server_ip, port, server_type, result_flag, ttl, 0);
  379. }
  380. int dns_remove_server(char *server_ip, int port, dns_server_type_t server_type)
  381. {
  382. return _dns_client_server_operate(server_ip, port, server_type, 0, 0, 1);
  383. }
  384. int dns_server_num(void)
  385. {
  386. return atomic_read(&client.dns_server_num);
  387. }
  388. void _dns_client_query_get(struct dns_query_struct *query)
  389. {
  390. if (atomic_inc_return(&query->refcnt) <= 0) {
  391. tlog(TLOG_ERROR, "BUG: query ref is invalid, domain: %s", query->domain);
  392. abort();
  393. }
  394. }
  395. void _dns_client_query_release(struct dns_query_struct *query)
  396. {
  397. int refcnt = atomic_dec_return(&query->refcnt);
  398. int bucket = 0;
  399. struct dns_query_replied *replied_map;
  400. struct hlist_node *tmp;
  401. if (refcnt) {
  402. if (refcnt < 0) {
  403. tlog(TLOG_ERROR, "BUG: refcnt is %d", refcnt);
  404. abort();
  405. }
  406. return;
  407. }
  408. /* notify caller query end */
  409. if (query->callback) {
  410. query->callback(query->domain, DNS_QUERY_END, 0, NULL, NULL, 0, query->user_ptr);
  411. }
  412. /* free resource */
  413. pthread_mutex_lock(&client.domain_map_lock);
  414. list_del_init(&query->dns_request_list);
  415. hash_del(&query->domain_node);
  416. pthread_mutex_unlock(&client.domain_map_lock);
  417. hash_for_each_safe(query->replied_map, bucket, tmp, replied_map, node)
  418. {
  419. hash_del(&replied_map->node);
  420. free(replied_map);
  421. }
  422. memset(query, 0, sizeof(*query));
  423. free(query);
  424. }
  425. void _dns_client_query_remove(struct dns_query_struct *query)
  426. {
  427. /* remove query from period check list, and release reference*/
  428. pthread_mutex_lock(&client.domain_map_lock);
  429. if (list_empty(&query->dns_request_list)) {
  430. pthread_mutex_unlock(&client.domain_map_lock);
  431. return;
  432. }
  433. list_del_init(&query->dns_request_list);
  434. hash_del(&query->domain_node);
  435. pthread_mutex_unlock(&client.domain_map_lock);
  436. _dns_client_query_release(query);
  437. }
  438. void _dns_client_query_remove_all(void)
  439. {
  440. struct dns_query_struct *query, *tmp;
  441. LIST_HEAD(check_list);
  442. pthread_mutex_lock(&client.domain_map_lock);
  443. list_for_each_entry_safe(query, tmp, &client.dns_request_list, dns_request_list)
  444. {
  445. list_add(&query->period_list, &check_list);
  446. }
  447. pthread_mutex_unlock(&client.domain_map_lock);
  448. list_for_each_entry_safe(query, tmp, &check_list, period_list)
  449. {
  450. list_del_init(&query->period_list);
  451. _dns_client_query_remove(query);
  452. }
  453. return;
  454. }
  455. void _dns_client_period_run(void)
  456. {
  457. struct dns_query_struct *query, *tmp;
  458. struct dns_server_info *server_info;
  459. LIST_HEAD(check_list);
  460. unsigned long now = get_tick_count();
  461. /* get query which timed out to check list */
  462. pthread_mutex_lock(&client.domain_map_lock);
  463. list_for_each_entry_safe(query, tmp, &client.dns_request_list, dns_request_list)
  464. {
  465. if (now - query->send_tick >= 400 && query->send_tick > 0) {
  466. list_add(&query->period_list, &check_list);
  467. _dns_client_query_get(query);
  468. }
  469. }
  470. pthread_mutex_unlock(&client.domain_map_lock);
  471. list_for_each_entry_safe(query, tmp, &check_list, period_list)
  472. {
  473. /* free timed out query, and notify caller */
  474. list_del_init(&query->period_list);
  475. _dns_client_query_remove(query);
  476. _dns_client_query_release(query);
  477. /* For udp nat case.
  478. * when router reconnect to internet, udp port may always marked as UNREPLIED.
  479. * dns query will timeout, and cannot reconnect again,
  480. * create a new socket to communicate.
  481. */
  482. pthread_mutex_lock(&client.server_list_lock);
  483. list_for_each_entry(server_info, &client.dns_server_list, list)
  484. {
  485. if (server_info->last_send - 5 > server_info->last_recv) {
  486. server_info->recv_buff.len = 0;
  487. server_info->send_buff.len = 0;
  488. _dns_client_close_socket(server_info);
  489. }
  490. }
  491. pthread_mutex_unlock(&client.server_list_lock);
  492. }
  493. return;
  494. }
  495. static struct dns_query_struct *_dns_client_get_request(unsigned short sid, char *domain)
  496. {
  497. struct dns_query_struct *query = NULL;
  498. struct dns_query_struct *query_result = NULL;
  499. struct hlist_node *tmp = NULL;
  500. uint32_t key;
  501. /* get query by hash key : id + domain */
  502. key = hash_string(domain);
  503. key = jhash(&sid, sizeof(sid), key);
  504. pthread_mutex_lock(&client.domain_map_lock);
  505. hash_for_each_possible_safe(client.domain_map, query, tmp, domain_node, key)
  506. {
  507. if (sid != query->sid) {
  508. continue;
  509. }
  510. if (strncmp(query->domain, domain, DNS_MAX_CNAME_LEN) != 0) {
  511. continue;
  512. }
  513. query_result = query;
  514. _dns_client_query_get(query_result);
  515. break;
  516. }
  517. pthread_mutex_unlock(&client.domain_map_lock);
  518. return query_result;
  519. }
  520. int _dns_replied_check_add(struct dns_query_struct *dns_query, struct sockaddr *addr, socklen_t addr_len)
  521. {
  522. uint32_t key = 0;
  523. struct dns_query_replied *replied_map = NULL;
  524. if (addr_len > sizeof(struct sockaddr_in6)) {
  525. tlog(TLOG_ERROR, "addr length is invalid.");
  526. return -1;
  527. }
  528. /* avoid multiple replies from one server */
  529. key = jhash(addr, addr_len, 0);
  530. hash_for_each_possible(dns_query->replied_map, replied_map, node, key)
  531. {
  532. /* already replied, ignore this reply */
  533. if (memcmp(&replied_map->addr, addr, addr_len) == 0) {
  534. return -1;
  535. }
  536. }
  537. replied_map = malloc(sizeof(*replied_map));
  538. if (replied_map == NULL) {
  539. tlog(TLOG_ERROR, "malloc failed");
  540. return -1;
  541. }
  542. /* add address info to check hashtable */
  543. memcpy(&replied_map->addr, addr, addr_len);
  544. hash_add(dns_query->replied_map, &replied_map->node, key);
  545. return 0;
  546. }
  547. static int _dns_client_recv(struct dns_server_info *server_info, unsigned char *inpacket, int inpacket_len, struct sockaddr *from, socklen_t from_len)
  548. {
  549. int len;
  550. int i;
  551. int qtype;
  552. int qclass;
  553. char domain[DNS_MAX_CNAME_LEN];
  554. int rr_count;
  555. struct dns_rrs *rrs = NULL;
  556. unsigned char packet_buff[DNS_PACKSIZE];
  557. struct dns_packet *packet = (struct dns_packet *)packet_buff;
  558. int ret = 0;
  559. struct dns_query_struct *query;
  560. int request_num = 0;
  561. int has_opt = 0;
  562. packet->head.tc = 0;
  563. /* decode domain from udp packet */
  564. len = dns_decode(packet, DNS_PACKSIZE, inpacket, inpacket_len);
  565. if (len != 0) {
  566. char host_name[DNS_MAX_CNAME_LEN];
  567. tlog(TLOG_WARN, "decode failed, packet len = %d, tc = %d, id = %d, from = %s\n", inpacket_len, packet->head.tc, packet->head.id,
  568. gethost_by_addr(host_name, from, from_len));
  569. return -1;
  570. }
  571. /* not answer, return error */
  572. if (packet->head.qr != DNS_OP_IQUERY) {
  573. tlog(TLOG_DEBUG, "message type error.\n");
  574. return -1;
  575. }
  576. tlog(TLOG_DEBUG, "qdcount = %d, ancount = %d, nscount = %d, nrcount = %d, len = %d, id = %d, tc = %d, rd = %d, ra = %d, rcode = %d, payloadsize = %d\n",
  577. packet->head.qdcount, packet->head.ancount, packet->head.nscount, packet->head.nrcount, inpacket_len, packet->head.id, packet->head.tc,
  578. packet->head.rd, packet->head.ra, packet->head.rcode, dns_get_OPT_payload_size(packet));
  579. /* get question */
  580. rrs = dns_get_rrs_start(packet, DNS_RRS_QD, &rr_count);
  581. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(packet, rrs)) {
  582. dns_get_domain(rrs, domain, DNS_MAX_CNAME_LEN, &qtype, &qclass);
  583. tlog(TLOG_DEBUG, "domain: %s qtype: %d qclass: %d\n", domain, qtype, qclass);
  584. }
  585. if (dns_get_OPT_payload_size(packet) > 0) {
  586. has_opt = 1;
  587. }
  588. /* get query reference */
  589. query = _dns_client_get_request(packet->head.id, domain);
  590. if (query == NULL || (query && has_opt == 0 && server_info->result_flag & DNSSERVER_FLAG_CHECK_EDNS)) {
  591. if (query) {
  592. _dns_client_query_release(query);
  593. }
  594. return 0;
  595. }
  596. /* avoid multiple replies */
  597. if (_dns_replied_check_add(query, (struct sockaddr *)from, from_len) != 0) {
  598. _dns_client_query_release(query);
  599. return 0;
  600. }
  601. request_num = atomic_dec_return(&query->dns_request_sent);
  602. if (request_num < 0) {
  603. _dns_client_query_release(query);
  604. tlog(TLOG_ERROR, "send count is invalid, %d", request_num);
  605. return -1;
  606. }
  607. /* notify caller dns query result */
  608. if (query->callback) {
  609. ret = query->callback(query->domain, DNS_QUERY_RESULT, server_info->result_flag, packet, inpacket, inpacket_len, query->user_ptr);
  610. if (request_num == 0 || ret) {
  611. /* if all server replied, or done, stop query, release resource */
  612. _dns_client_query_remove(query);
  613. }
  614. }
  615. _dns_client_query_release(query);
  616. return ret;
  617. }
  618. static int _dns_client_create_socket_udp(struct dns_server_info *server_info)
  619. {
  620. int fd = 0;
  621. struct epoll_event event;
  622. const int on = 1;
  623. const int val = 255;
  624. fd = socket(server_info->ai_family, SOCK_DGRAM, 0);
  625. if (fd < 0) {
  626. tlog(TLOG_ERROR, "create socket failed.");
  627. goto errout;
  628. }
  629. memset(&event, 0, sizeof(event));
  630. event.events = EPOLLIN;
  631. event.data.ptr = server_info;
  632. if (epoll_ctl(client.epoll_fd, EPOLL_CTL_ADD, fd, &event) != 0) {
  633. tlog(TLOG_ERROR, "epoll ctl failed.");
  634. return -1;
  635. }
  636. server_info->fd = fd;
  637. server_info->status = DNS_SERVER_STATUS_CONNECTIONLESS;
  638. setsockopt(server_info->fd, IPPROTO_IP, IP_RECVTTL, &on, sizeof(on));
  639. setsockopt(server_info->fd, SOL_IP, IP_TTL, &val, sizeof(val));
  640. if (server_info->ai_family == AF_INET6) {
  641. setsockopt(server_info->fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &on, sizeof(on));
  642. setsockopt(server_info->fd, IPPROTO_IPV6, IPV6_2292HOPLIMIT, &on, sizeof(on));
  643. setsockopt(server_info->fd, IPPROTO_IPV6, IPV6_HOPLIMIT, &on, sizeof(on));
  644. }
  645. return 0;
  646. errout:
  647. if (fd > 0) {
  648. close(fd);
  649. }
  650. return -1;
  651. }
  652. static int _DNS_client_create_socket_tcp(struct dns_server_info *server_info)
  653. {
  654. int fd = 0;
  655. struct epoll_event event;
  656. int yes = 1;
  657. fd = socket(server_info->ai_family, SOCK_STREAM, 0);
  658. if (fd < 0) {
  659. tlog(TLOG_ERROR, "create socket failed.");
  660. goto errout;
  661. }
  662. if (set_fd_nonblock(fd, 1) != 0) {
  663. tlog(TLOG_ERROR, "set socket non block failed, %s", strerror(errno));
  664. goto errout;
  665. }
  666. if (setsockopt(fd, IPPROTO_TCP, TCP_FASTOPEN_CONNECT, &yes, sizeof(yes)) != 0) {
  667. tlog(TLOG_DEBUG, "enable TCP fast open failed.");
  668. }
  669. setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes));
  670. if (connect(fd, (struct sockaddr *)&server_info->addr, server_info->ai_addrlen) != 0) {
  671. if (errno != EINPROGRESS) {
  672. tlog(TLOG_ERROR, "connect failed.");
  673. goto errout;
  674. }
  675. }
  676. memset(&event, 0, sizeof(event));
  677. event.events = EPOLLIN | EPOLLOUT;
  678. event.data.ptr = server_info;
  679. if (epoll_ctl(client.epoll_fd, EPOLL_CTL_ADD, fd, &event) != 0) {
  680. tlog(TLOG_ERROR, "epoll ctl failed.");
  681. return -1;
  682. }
  683. server_info->fd = fd;
  684. server_info->status = DNS_SERVER_STATUS_CONNECTING;
  685. return 0;
  686. errout:
  687. if (fd > 0) {
  688. close(fd);
  689. }
  690. return -1;
  691. }
  692. static int _DNS_client_create_socket_tls(struct dns_server_info *server_info)
  693. {
  694. int fd = 0;
  695. struct epoll_event event;
  696. SSL_CTX *ctx = NULL;
  697. SSL *ssl = NULL;
  698. int yes = 1;
  699. ctx = SSL_CTX_new(SSLv23_client_method());
  700. if (ctx == NULL) {
  701. tlog(TLOG_ERROR, "create ssl ctx failed.");
  702. goto errout;
  703. }
  704. ssl = SSL_new(ctx);
  705. if (ssl == NULL) {
  706. tlog(TLOG_ERROR, "new ssl failed.");
  707. goto errout;
  708. }
  709. fd = socket(server_info->ai_family, SOCK_STREAM, 0);
  710. if (fd < 0) {
  711. tlog(TLOG_ERROR, "create socket failed.");
  712. goto errout;
  713. }
  714. if (set_fd_nonblock(fd, 1) != 0) {
  715. tlog(TLOG_ERROR, "set socket non block failed, %s", strerror(errno));
  716. goto errout;
  717. }
  718. if (setsockopt(fd, IPPROTO_TCP, TCP_FASTOPEN_CONNECT, &yes, sizeof(yes)) != 0) {
  719. tlog(TLOG_DEBUG, "enable TCP fast open failed.");
  720. }
  721. setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes));
  722. if (connect(fd, (struct sockaddr *)&server_info->addr, server_info->ai_addrlen) != 0) {
  723. if (errno != EINPROGRESS) {
  724. tlog(TLOG_ERROR, "connect failed.");
  725. goto errout;
  726. }
  727. }
  728. if (SSL_set_fd(ssl, fd) == 0) {
  729. tlog(TLOG_ERROR, "ssl set fd failed.");
  730. goto errout;
  731. }
  732. SSL_set_mode(ssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
  733. memset(&event, 0, sizeof(event));
  734. event.events = EPOLLIN | EPOLLOUT;
  735. event.data.ptr = server_info;
  736. if (epoll_ctl(client.epoll_fd, EPOLL_CTL_ADD, fd, &event) != 0) {
  737. tlog(TLOG_ERROR, "epoll ctl failed.");
  738. goto errout;
  739. }
  740. server_info->fd = fd;
  741. server_info->ssl = ssl;
  742. server_info->ssl_ctx = ctx;
  743. server_info->status = DNS_SERVER_STATUS_CONNECTING;
  744. tlog(TLOG_DEBUG, "TLS server connecting.\n");
  745. return 0;
  746. errout:
  747. if (fd > 0) {
  748. close(fd);
  749. }
  750. if (ssl) {
  751. SSL_free(ssl);
  752. }
  753. if (ctx) {
  754. SSL_CTX_free(ctx);
  755. }
  756. return -1;
  757. }
  758. static int _dns_client_create_socket(struct dns_server_info *server_info)
  759. {
  760. time(&server_info->last_send);
  761. time(&server_info->last_recv);
  762. if (server_info->fd > 0) {
  763. return -1;
  764. }
  765. if (server_info->type == DNS_SERVER_UDP) {
  766. return _dns_client_create_socket_udp(server_info);
  767. } else if (server_info->type == DNS_SERVER_TCP) {
  768. return _DNS_client_create_socket_tcp(server_info);
  769. } else if (server_info->type == DNS_SERVER_TLS) {
  770. return _DNS_client_create_socket_tls(server_info);
  771. } else {
  772. return -1;
  773. }
  774. return 0;
  775. }
  776. static int _dns_client_process_udp(struct dns_server_info *server_info, struct epoll_event *event, unsigned long now)
  777. {
  778. int len;
  779. unsigned char inpacket[DNS_IN_PACKSIZE];
  780. struct sockaddr_storage from;
  781. socklen_t from_len = sizeof(from);
  782. char from_host[DNS_MAX_CNAME_LEN];
  783. struct msghdr msg;
  784. struct iovec iov;
  785. char ans_data[4096];
  786. int ttl = 0;
  787. struct cmsghdr *cmsg;
  788. memset(&msg, 0, sizeof(msg));
  789. iov.iov_base = (char *)inpacket;
  790. iov.iov_len = sizeof(inpacket);
  791. msg.msg_name = &from;
  792. msg.msg_namelen = sizeof(from);
  793. msg.msg_iov = &iov;
  794. msg.msg_iovlen = 1;
  795. msg.msg_control = ans_data;
  796. msg.msg_controllen = sizeof(ans_data);
  797. len = recvmsg(server_info->fd, &msg, MSG_DONTWAIT);
  798. if (len < 0) {
  799. tlog(TLOG_ERROR, "recvfrom failed, %s\n", strerror(errno));
  800. return -1;
  801. }
  802. from_len = msg.msg_namelen;
  803. for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
  804. if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_TTL) {
  805. if (cmsg->cmsg_len >= sizeof(int)) {
  806. int *ttlPtr = (int *)CMSG_DATA(cmsg);
  807. ttl = *ttlPtr;
  808. }
  809. } else if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_HOPLIMIT) {
  810. if (cmsg->cmsg_len >= sizeof(int)) {
  811. int *ttlPtr = (int *)CMSG_DATA(cmsg);
  812. ttl = *ttlPtr;
  813. }
  814. }
  815. }
  816. tlog(TLOG_DEBUG, "recv udp, from %s, len: %d, ttl: %d", gethost_by_addr(from_host, (struct sockaddr *)&from, from_len), len, ttl);
  817. if ((ttl != server_info->ttl) && (server_info->ttl > 0) && (server_info->result_flag & DNSSERVER_FLAG_CHECK_TTL)) {
  818. if ((ttl < server_info->ttl - server_info->ttl_range) || (ttl > server_info->ttl + server_info->ttl_range)) {
  819. /* tlog(TLOG_DEBUG, "TTL mismatch, from:%d, local %d, discard result", ttl, server_info->ttl); */
  820. return 0;
  821. }
  822. }
  823. time(&server_info->last_recv);
  824. if (_dns_client_recv(server_info, inpacket, len, (struct sockaddr *)&from, from_len) != 0) {
  825. return -1;
  826. }
  827. return 0;
  828. }
  829. static int _dns_client_socket_ssl_send(SSL *ssl, const void *buf, int num)
  830. {
  831. int ret = 0;
  832. int ssl_ret = 0;
  833. unsigned long ssl_err = 0;
  834. if (ssl == NULL) {
  835. return -1;
  836. }
  837. ret = SSL_write(ssl, buf, num);
  838. if (ret >= 0) {
  839. return ret;
  840. }
  841. ssl_ret = SSL_get_error(ssl, ret);
  842. switch (ssl_ret) {
  843. case SSL_ERROR_NONE:
  844. errno = EAGAIN;
  845. return -1;
  846. break;
  847. case SSL_ERROR_ZERO_RETURN:
  848. return 0;
  849. break;
  850. case SSL_ERROR_WANT_READ:
  851. errno = EAGAIN;
  852. ret = -1;
  853. break;
  854. case SSL_ERROR_WANT_WRITE:
  855. errno = EAGAIN;
  856. ret = -1;
  857. break;
  858. case SSL_ERROR_SSL:
  859. ssl_err = ERR_get_error();
  860. if (ERR_GET_REASON(ssl_err) == SSL_R_UNINITIALIZED) {
  861. errno = EAGAIN;
  862. return -1;
  863. }
  864. tlog(TLOG_ERROR, "SSL write fail error no: %s(%ld)\n", ERR_reason_error_string(ssl_err), ssl_err);
  865. errno = EFAULT;
  866. ret = -1;
  867. break;
  868. case SSL_ERROR_SYSCALL:
  869. tlog(TLOG_ERROR, "SSL syscall failed, %s", strerror(errno));
  870. return ret;
  871. default:
  872. errno = EFAULT;
  873. ret = -1;
  874. break;
  875. }
  876. return ret;
  877. }
  878. static int _dns_client_socket_ssl_recv(SSL *ssl, void *buf, int num)
  879. {
  880. int ret = 0;
  881. int ssl_ret = 0;
  882. unsigned long ssl_err = 0;
  883. if (ssl == NULL) {
  884. errno = EFAULT;
  885. return -1;
  886. }
  887. ret = SSL_read(ssl, buf, num);
  888. if (ret >= 0) {
  889. return ret;
  890. }
  891. ssl_ret = SSL_get_error(ssl, ret);
  892. switch (ssl_ret) {
  893. case SSL_ERROR_NONE:
  894. errno = EAGAIN;
  895. return -1;
  896. break;
  897. case SSL_ERROR_ZERO_RETURN:
  898. return 0;
  899. break;
  900. case SSL_ERROR_WANT_READ:
  901. errno = EAGAIN;
  902. ret = -1;
  903. break;
  904. case SSL_ERROR_WANT_WRITE:
  905. errno = EAGAIN;
  906. ret = -1;
  907. break;
  908. case SSL_ERROR_SSL:
  909. ssl_err = ERR_get_error();
  910. if (ERR_GET_REASON(ssl_err) == SSL_R_UNINITIALIZED) {
  911. errno = EAGAIN;
  912. return -1;
  913. }
  914. tlog(TLOG_ERROR, "SSL read fail error no: %s(%ld)\n", ERR_reason_error_string(ssl_err), ssl_err);
  915. errno = EFAULT;
  916. ret = -1;
  917. break;
  918. case SSL_ERROR_SYSCALL:
  919. if (errno != ECONNRESET) {
  920. tlog(TLOG_INFO, "SSL syscall failed, %s ", strerror(errno));
  921. }
  922. ret = -1;
  923. return ret;
  924. default:
  925. errno = EFAULT;
  926. ret = -1;
  927. break;
  928. }
  929. return ret;
  930. }
  931. static int _dns_client_socket_send(struct dns_server_info *server_info)
  932. {
  933. if (server_info->type == DNS_SERVER_UDP) {
  934. return -1;
  935. } else if (server_info->type == DNS_SERVER_TCP) {
  936. return send(server_info->fd, server_info->send_buff.data, server_info->send_buff.len, MSG_NOSIGNAL);
  937. } else if (server_info->type == DNS_SERVER_TLS) {
  938. return _dns_client_socket_ssl_send(server_info->ssl, server_info->send_buff.data, server_info->send_buff.len);
  939. } else {
  940. return -1;
  941. }
  942. }
  943. static int _dns_client_socket_recv(struct dns_server_info *server_info)
  944. {
  945. if (server_info->type == DNS_SERVER_UDP) {
  946. return -1;
  947. } else if (server_info->type == DNS_SERVER_TCP) {
  948. return recv(server_info->fd, server_info->recv_buff.data + server_info->recv_buff.len, DNS_TCP_BUFFER - server_info->recv_buff.len, 0);
  949. } else if (server_info->type == DNS_SERVER_TLS) {
  950. return _dns_client_socket_ssl_recv(server_info->ssl, server_info->recv_buff.data + server_info->recv_buff.len, DNS_TCP_BUFFER - server_info->recv_buff.len);
  951. } else {
  952. return -1;
  953. }
  954. }
  955. static int _dns_client_process_tcp(struct dns_server_info *server_info, struct epoll_event *event, unsigned long now)
  956. {
  957. int len;
  958. int ret = -1;
  959. unsigned char *inpacket_data = server_info->recv_buff.data;
  960. char from_host[DNS_MAX_CNAME_LEN];
  961. if (event->events & EPOLLIN) {
  962. /* receive from tcp */
  963. len = _dns_client_socket_recv(server_info);
  964. if (len < 0) {
  965. /* no data to recv, try again */
  966. if (errno == EAGAIN) {
  967. return 0;
  968. }
  969. /* FOR GFW */
  970. if (errno == ECONNRESET) {
  971. goto errout;
  972. }
  973. tlog(TLOG_ERROR, "recv failed, %s\n", strerror(errno));
  974. goto errout;
  975. }
  976. /* peer server close */
  977. if (len == 0) {
  978. pthread_mutex_lock(&client.server_list_lock);
  979. _dns_client_close_socket(server_info);
  980. server_info->recv_buff.len = 0;
  981. if (server_info->send_buff.len > 0) {
  982. /* still remain request data, reconnect and send*/
  983. ret = _dns_client_create_socket(server_info);
  984. } else {
  985. ret = 0;
  986. }
  987. pthread_mutex_unlock(&client.server_list_lock);
  988. tlog(TLOG_DEBUG, "peer close, left = %d", server_info->send_buff.len);
  989. return ret;
  990. }
  991. time(&server_info->last_recv);
  992. server_info->recv_buff.len += len;
  993. if (server_info->recv_buff.len < 2) {
  994. /* wait and recv */
  995. return 0;
  996. }
  997. while (1) {
  998. /* tcp result format
  999. * | len (short) | dns query result |
  1000. */
  1001. inpacket_data = server_info->recv_buff.data;
  1002. len = ntohs(*((unsigned short *)(inpacket_data)));
  1003. if (len <= 0 || len >= DNS_IN_PACKSIZE) {
  1004. /* data len is invalid */
  1005. goto errout;
  1006. }
  1007. if (len > server_info->recv_buff.len - 2) {
  1008. /* len is not expceded, wait and recv */
  1009. break;
  1010. }
  1011. inpacket_data = server_info->recv_buff.data + 2;
  1012. tlog(TLOG_DEBUG, "recv tcp from %s, len = %d", gethost_by_addr(from_host, (struct sockaddr *)&server_info->addr, server_info->ai_addrlen), len);
  1013. /* process result */
  1014. if (_dns_client_recv(server_info, inpacket_data, len, &server_info->addr, server_info->ai_addrlen) != 0) {
  1015. goto errout;
  1016. }
  1017. len += 2;
  1018. server_info->recv_buff.len -= len;
  1019. /* move to next result */
  1020. if (server_info->recv_buff.len > 0) {
  1021. memmove(server_info->recv_buff.data, server_info->recv_buff.data + len, server_info->recv_buff.len);
  1022. } else {
  1023. break;
  1024. }
  1025. }
  1026. }
  1027. /* when connected */
  1028. if (event->events & EPOLLOUT) {
  1029. struct epoll_event event;
  1030. if (server_info->status == DNS_SERVER_STATUS_CONNECTING) {
  1031. server_info->status = DNS_SERVER_STATUS_CONNECTED;
  1032. tlog(TLOG_DEBUG, "tcp connected");
  1033. }
  1034. if (server_info->status != DNS_SERVER_STATUS_CONNECTED) {
  1035. server_info->status = DNS_SERVER_STATUS_DISCONNECTED;
  1036. }
  1037. pthread_mutex_lock(&client.server_list_lock);
  1038. if (server_info->send_buff.len > 0) {
  1039. /* send data in send_buffer */
  1040. len = _dns_client_socket_send(server_info);
  1041. if (len < 0) {
  1042. if (errno == EAGAIN) {
  1043. pthread_mutex_unlock(&client.server_list_lock);
  1044. return 0;
  1045. }
  1046. pthread_mutex_unlock(&client.server_list_lock);
  1047. goto errout;
  1048. }
  1049. server_info->send_buff.len -= len;
  1050. if (server_info->send_buff.len > 0) {
  1051. memmove(server_info->send_buff.data, server_info->send_buff.data + len, server_info->send_buff.len);
  1052. }
  1053. }
  1054. pthread_mutex_unlock(&client.server_list_lock);
  1055. /* still remain data, retry */
  1056. if (server_info->send_buff.len > 0) {
  1057. return 0;
  1058. }
  1059. /* clear epllout event */
  1060. memset(&event, 0, sizeof(event));
  1061. event.events = EPOLLIN;
  1062. event.data.ptr = server_info;
  1063. if (epoll_ctl(client.epoll_fd, EPOLL_CTL_MOD, server_info->fd, &event) != 0) {
  1064. tlog(TLOG_ERROR, "epoll ctl failed.");
  1065. goto errout;
  1066. }
  1067. return 0;
  1068. }
  1069. return 0;
  1070. errout:
  1071. pthread_mutex_lock(&client.server_list_lock);
  1072. server_info->recv_buff.len = 0;
  1073. server_info->send_buff.len = 0;
  1074. _dns_client_close_socket(server_info);
  1075. pthread_mutex_unlock(&client.server_list_lock);
  1076. return -1;
  1077. }
  1078. static inline int _dns_client_to_hex(int c)
  1079. {
  1080. if (c > 0x9) {
  1081. return 'A' + c - 0xA;
  1082. } else {
  1083. return '0' + c;
  1084. }
  1085. }
  1086. static int _dns_client_tls_verify(struct dns_server_info *server_info)
  1087. {
  1088. X509 *cert = NULL;
  1089. char peer_CN[256];
  1090. const EVP_MD *digest;
  1091. unsigned char md[EVP_MAX_MD_SIZE];
  1092. unsigned int n;
  1093. char cert_fingerprint[256];
  1094. int i = 0;
  1095. cert = SSL_get_peer_certificate(server_info->ssl);
  1096. if (cert == NULL) {
  1097. tlog(TLOG_ERROR, "get peer certificate failed.");
  1098. return -1;
  1099. }
  1100. X509_NAME_get_text_by_NID(X509_get_subject_name(cert), NID_commonName, peer_CN, 256);
  1101. tlog(TLOG_DEBUG, "peer CN: %s", peer_CN);
  1102. digest = EVP_get_digestbyname("sha256");
  1103. X509_digest(cert, digest, md, &n);
  1104. char *ptr = cert_fingerprint;
  1105. for (i = 0; i < 32; i++) {
  1106. *ptr = _dns_client_to_hex(md[i] >> 4 & 0xF);
  1107. ptr++;
  1108. *ptr = _dns_client_to_hex(md[i] & 0xF);
  1109. ptr++;
  1110. *ptr = ':';
  1111. ptr++;
  1112. }
  1113. ptr--;
  1114. *ptr = 0;
  1115. tlog(TLOG_DEBUG, "cert fingerprint(%s): %s", "sha256", cert_fingerprint);
  1116. X509_free(cert);
  1117. return 0;
  1118. }
  1119. static int _dns_client_process_tls(struct dns_server_info *server_info, struct epoll_event *event, unsigned long now)
  1120. {
  1121. int ret = -1;
  1122. struct epoll_event fd_event;
  1123. int ssl_ret;
  1124. if (server_info->status == DNS_SERVER_STATUS_CONNECTING) {
  1125. ret = SSL_connect(server_info->ssl);
  1126. if (ret == 0) {
  1127. goto errout;
  1128. } else if (ret < 0) {
  1129. memset(&fd_event, 0, sizeof(fd_event));
  1130. ssl_ret = SSL_get_error(server_info->ssl, ret);
  1131. if (ssl_ret == SSL_ERROR_WANT_READ) {
  1132. fd_event.events = EPOLLIN;
  1133. } else if (ssl_ret == SSL_ERROR_WANT_WRITE) {
  1134. fd_event.events = EPOLLOUT;
  1135. } else {
  1136. goto errout;
  1137. }
  1138. fd_event.data.ptr = server_info;
  1139. if (epoll_ctl(client.epoll_fd, EPOLL_CTL_MOD, server_info->fd, &fd_event) != 0) {
  1140. tlog(TLOG_ERROR, "epoll ctl failed.");
  1141. goto errout;
  1142. }
  1143. return 0;
  1144. }
  1145. tlog(TLOG_DEBUG, "TLS server connected.\n");
  1146. if (_dns_client_tls_verify(server_info) != 0) {
  1147. tlog(TLOG_WARN, "peer verify failed.");
  1148. goto errout;
  1149. }
  1150. server_info->status = DNS_SERVER_STATUS_CONNECTED;
  1151. memset(&fd_event, 0, sizeof(fd_event));
  1152. fd_event.events = EPOLLIN | EPOLLOUT;
  1153. fd_event.data.ptr = server_info;
  1154. if (epoll_ctl(client.epoll_fd, EPOLL_CTL_MOD, server_info->fd, &fd_event) != 0) {
  1155. tlog(TLOG_ERROR, "epoll ctl failed.");
  1156. goto errout;
  1157. }
  1158. }
  1159. return _dns_client_process_tcp(server_info, event, now);
  1160. errout:
  1161. pthread_mutex_lock(&client.server_list_lock);
  1162. server_info->recv_buff.len = 0;
  1163. server_info->send_buff.len = 0;
  1164. _dns_client_close_socket(server_info);
  1165. pthread_mutex_unlock(&client.server_list_lock);
  1166. return -1;
  1167. }
  1168. static int _dns_client_process(struct dns_server_info *server_info, struct epoll_event *event, unsigned long now)
  1169. {
  1170. if (server_info->type == DNS_SERVER_UDP) {
  1171. /* receive from udp */
  1172. return _dns_client_process_udp(server_info, event, now);
  1173. } else if (server_info->type == DNS_SERVER_TCP) {
  1174. /* receive from tcp */
  1175. return _dns_client_process_tcp(server_info, event, now);
  1176. } else if (server_info->type == DNS_SERVER_TLS) {
  1177. /* recive from tls */
  1178. return _dns_client_process_tls(server_info, event, now);
  1179. } else {
  1180. return -1;
  1181. }
  1182. return 0;
  1183. }
  1184. static void *_dns_client_work(void *arg)
  1185. {
  1186. struct epoll_event events[DNS_MAX_EVENTS + 1];
  1187. int num;
  1188. int i;
  1189. unsigned long now = {0};
  1190. unsigned int sleep = 100;
  1191. int sleep_time;
  1192. unsigned long expect_time = 0;
  1193. sleep_time = sleep;
  1194. now = get_tick_count() - sleep;
  1195. expect_time = now + sleep;
  1196. while (client.run) {
  1197. now = get_tick_count();
  1198. if (now >= expect_time) {
  1199. _dns_client_period_run();
  1200. sleep_time = sleep - (now - expect_time);
  1201. if (sleep_time < 0) {
  1202. sleep_time = 0;
  1203. expect_time = now;
  1204. }
  1205. expect_time += sleep;
  1206. }
  1207. num = epoll_wait(client.epoll_fd, events, DNS_MAX_EVENTS, sleep_time);
  1208. if (num < 0) {
  1209. usleep(100000);
  1210. continue;
  1211. }
  1212. for (i = 0; i < num; i++) {
  1213. struct epoll_event *event = &events[i];
  1214. struct dns_server_info *server_info = (struct dns_server_info *)event->data.ptr;
  1215. if (server_info == NULL) {
  1216. tlog(TLOG_WARN, "server info is invalid.");
  1217. continue;
  1218. }
  1219. _dns_client_process(server_info, event, now);
  1220. }
  1221. }
  1222. close(client.epoll_fd);
  1223. client.epoll_fd = -1;
  1224. return NULL;
  1225. }
  1226. static int _dns_client_send_udp(struct dns_server_info *server_info, void *packet, int len)
  1227. {
  1228. int send_len = 0;
  1229. send_len = sendto(server_info->fd, packet, len, 0, (struct sockaddr *)&server_info->addr, server_info->ai_addrlen);
  1230. if (send_len != len) {
  1231. return -1;
  1232. }
  1233. return 0;
  1234. }
  1235. static int _dns_client_send_data_to_buffer(struct dns_server_info *server_info, void *packet, int len)
  1236. {
  1237. struct epoll_event event;
  1238. if (DNS_TCP_BUFFER - server_info->send_buff.len < len) {
  1239. errno = ENOMEM;
  1240. return -1;
  1241. }
  1242. memcpy(server_info->send_buff.data + server_info->send_buff.len, packet, len);
  1243. server_info->send_buff.len += len;
  1244. memset(&event, 0, sizeof(event));
  1245. event.events = EPOLLIN | EPOLLOUT;
  1246. event.data.ptr = server_info;
  1247. if (epoll_ctl(client.epoll_fd, EPOLL_CTL_MOD, server_info->fd, &event) != 0) {
  1248. tlog(TLOG_ERROR, "epoll ctl failed.");
  1249. return -1;
  1250. }
  1251. return 0;
  1252. }
  1253. static int _dns_client_send_tcp(struct dns_server_info *server_info, void *packet, unsigned short len)
  1254. {
  1255. int send_len = 0;
  1256. unsigned char inpacket_data[DNS_IN_PACKSIZE];
  1257. unsigned char *inpacket = inpacket_data;
  1258. if (len > sizeof(inpacket_data) -2 ) {
  1259. tlog(TLOG_ERROR, "packet size is invalid.");
  1260. return -1;
  1261. }
  1262. /* TCP query format
  1263. * | len (short) | dns query data |
  1264. */
  1265. *((unsigned short *)(inpacket)) = htons(len);
  1266. memcpy(inpacket + 2, packet, len);
  1267. len += 2;
  1268. if (server_info->status != DNS_SERVER_STATUS_CONNECTED) {
  1269. return _dns_client_send_data_to_buffer(server_info, inpacket, len);
  1270. }
  1271. if (server_info->fd <= 0) {
  1272. return -1;
  1273. }
  1274. send_len = send(server_info->fd, inpacket, len, MSG_NOSIGNAL);
  1275. if (send_len < 0) {
  1276. if (errno == EAGAIN) {
  1277. /* save data to buffer, and retry when EPOLLOUT is available */
  1278. return _dns_client_send_data_to_buffer(server_info, inpacket, len);
  1279. } else if (errno == EPIPE) {
  1280. shutdown(server_info->fd, SHUT_RDWR);
  1281. }
  1282. return -1;
  1283. } else if (send_len < len) {
  1284. /* save remain data to buffer, and retry when EPOLLOUT is available */
  1285. return _dns_client_send_data_to_buffer(server_info, inpacket + send_len, len - send_len);
  1286. }
  1287. return 0;
  1288. }
  1289. static int _dns_client_send_tls(struct dns_server_info *server_info, void *packet, unsigned short len)
  1290. {
  1291. int send_len = 0;
  1292. unsigned char inpacket_data[DNS_IN_PACKSIZE];
  1293. unsigned char *inpacket = inpacket_data;
  1294. if (len > sizeof(inpacket_data) -2 ) {
  1295. tlog(TLOG_ERROR, "packet size is invalid.");
  1296. return -1;
  1297. }
  1298. /* TCP query format
  1299. * | len (short) | dns query data |
  1300. */
  1301. *((unsigned short *)(inpacket)) = htons(len);
  1302. memcpy(inpacket + 2, packet, len);
  1303. len += 2;
  1304. if (server_info->status != DNS_SERVER_STATUS_CONNECTED) {
  1305. return _dns_client_send_data_to_buffer(server_info, inpacket, len);
  1306. }
  1307. if (server_info->ssl == NULL) {
  1308. return -1;
  1309. }
  1310. send_len = _dns_client_socket_ssl_send(server_info->ssl, inpacket, len);
  1311. if (send_len < 0) {
  1312. if (errno == EAGAIN || server_info->ssl == NULL) {
  1313. /* save data to buffer, and retry when EPOLLOUT is available */
  1314. return _dns_client_send_data_to_buffer(server_info, inpacket, len);
  1315. } else if (server_info->ssl && errno != ENOMEM) {
  1316. SSL_shutdown(server_info->ssl);
  1317. }
  1318. return -1;
  1319. } else if (send_len < len) {
  1320. /* save remain data to buffer, and retry when EPOLLOUT is available */
  1321. return _dns_client_send_data_to_buffer(server_info, inpacket + send_len, len - send_len);
  1322. }
  1323. return 0;
  1324. }
  1325. static int _dns_client_send_packet(struct dns_query_struct *query, void *packet, int len)
  1326. {
  1327. struct dns_server_info *server_info, *tmp;
  1328. int ret = 0;
  1329. int send_err = 0;
  1330. query->send_tick = get_tick_count();
  1331. /* send query to all dns servers */
  1332. pthread_mutex_lock(&client.server_list_lock);
  1333. list_for_each_entry_safe(server_info, tmp, &client.dns_server_list, list)
  1334. {
  1335. if (server_info->fd <= 0) {
  1336. ret = _dns_client_create_socket(server_info);
  1337. if (ret != 0) {
  1338. continue;
  1339. }
  1340. }
  1341. atomic_inc(&query->dns_request_sent);
  1342. switch (server_info->type) {
  1343. case DNS_SERVER_UDP:
  1344. /* udp query */
  1345. ret = _dns_client_send_udp(server_info, packet, len);
  1346. send_err = errno;
  1347. break;
  1348. case DNS_SERVER_TCP:
  1349. /* tcp query */
  1350. ret = _dns_client_send_tcp(server_info, packet, len);
  1351. send_err = errno;
  1352. break;
  1353. case DNS_SERVER_TLS:
  1354. /* tls query */
  1355. ret = _dns_client_send_tls(server_info, packet, len);
  1356. send_err = errno;
  1357. break;
  1358. default:
  1359. /* unsupport query type */
  1360. ret = -1;
  1361. break;
  1362. }
  1363. if (ret != 0) {
  1364. char server_addr[128];
  1365. tlog(TLOG_ERROR, "send query to %s failed, %s, type: %d", gethost_by_addr(server_addr, &server_info->addr, server_info->ai_addrlen), strerror(send_err), server_info->type);
  1366. atomic_dec(&query->dns_request_sent);
  1367. continue;
  1368. }
  1369. time(&server_info->last_send);
  1370. }
  1371. pthread_mutex_unlock(&client.server_list_lock);
  1372. return 0;
  1373. }
  1374. static int _dns_client_dns_add_ecs(struct dns_packet *packet, int qtype)
  1375. {
  1376. if (qtype == DNS_T_A && client.ecs_ipv4.enable) {
  1377. struct dns_opt_ecs ecs;
  1378. ecs.family = DNS_ADDR_FAMILY_IP;
  1379. ecs.source_prefix = client.ecs_ipv4.bitlen;
  1380. ecs.scope_prefix = 0;
  1381. memcpy(ecs.addr, client.ecs_ipv4.ipv4_addr, DNS_RR_A_LEN);
  1382. return dns_add_OPT_ECS(packet, &ecs);
  1383. } else if (qtype == DNS_T_AAAA && client.ecs_ipv6.enable) {
  1384. struct dns_opt_ecs ecs;
  1385. ecs.family = DNS_ADDR_FAMILY_IPV6;
  1386. ecs.source_prefix = client.ecs_ipv6.bitlen;
  1387. ecs.scope_prefix = 0;
  1388. memcpy(ecs.addr, client.ecs_ipv6.ipv6_addr, DNS_RR_AAAA_LEN);
  1389. return dns_add_OPT_ECS(packet, &ecs);
  1390. }
  1391. return 0;
  1392. }
  1393. static int _dns_client_send_query(struct dns_query_struct *query, char *doamin)
  1394. {
  1395. unsigned char packet_buff[DNS_PACKSIZE];
  1396. unsigned char inpacket[DNS_IN_PACKSIZE];
  1397. struct dns_packet *packet = (struct dns_packet *)packet_buff;
  1398. int encode_len;
  1399. /* init dns packet head */
  1400. struct dns_head head;
  1401. memset(&head, 0, sizeof(head));
  1402. head.id = query->sid;
  1403. head.qr = DNS_QR_QUERY;
  1404. head.opcode = DNS_OP_QUERY;
  1405. head.aa = 0;
  1406. head.rd = 1;
  1407. head.ra = 0;
  1408. head.rcode = 0;
  1409. dns_packet_init(packet, DNS_PACKSIZE, &head);
  1410. /* add question */
  1411. dns_add_domain(packet, doamin, query->qtype, DNS_C_IN);
  1412. dns_set_OPT_payload_size(packet, DNS_IN_PACKSIZE);
  1413. if (_dns_client_dns_add_ecs(packet, query->qtype) != 0) {
  1414. tlog(TLOG_ERROR, "add ecs failed.");
  1415. return -1;
  1416. }
  1417. /* encode packet */
  1418. encode_len = dns_encode(inpacket, DNS_IN_PACKSIZE, packet);
  1419. if (encode_len <= 0) {
  1420. tlog(TLOG_ERROR, "encode query failed.");
  1421. return -1;
  1422. }
  1423. /* send query packet */
  1424. return _dns_client_send_packet(query, inpacket, encode_len);
  1425. }
  1426. int dns_client_query(char *domain, int qtype, dns_client_callback callback, void *user_ptr)
  1427. {
  1428. struct dns_query_struct *query = NULL;
  1429. int ret = 0;
  1430. uint32_t key = 0;
  1431. query = malloc(sizeof(*query));
  1432. if (query == NULL) {
  1433. goto errout;
  1434. }
  1435. memset(query, 0, sizeof(*query));
  1436. INIT_HLIST_NODE(&query->domain_node);
  1437. INIT_LIST_HEAD(&query->dns_request_list);
  1438. atomic_set(&query->refcnt, 0);
  1439. atomic_set(&query->dns_request_sent, 0);
  1440. hash_init(query->replied_map);
  1441. strncpy(query->domain, domain, DNS_MAX_CNAME_LEN);
  1442. query->user_ptr = user_ptr;
  1443. query->callback = callback;
  1444. query->qtype = qtype;
  1445. query->send_tick = 0;
  1446. query->sid = atomic_inc_return(&dns_client_sid);
  1447. _dns_client_query_get(query);
  1448. /* add query to hashtable */
  1449. key = hash_string(domain);
  1450. key = jhash(&query->sid, sizeof(query->sid), key);
  1451. pthread_mutex_lock(&client.domain_map_lock);
  1452. hash_add(client.domain_map, &query->domain_node, key);
  1453. pthread_mutex_unlock(&client.domain_map_lock);
  1454. /* send query */
  1455. _dns_client_query_get(query);
  1456. ret = _dns_client_send_query(query, domain);
  1457. if (ret != 0) {
  1458. _dns_client_query_release(query);
  1459. goto errout_del_list;
  1460. }
  1461. pthread_mutex_lock(&client.domain_map_lock);
  1462. list_add_tail(&query->dns_request_list, &client.dns_request_list);
  1463. pthread_mutex_unlock(&client.domain_map_lock);
  1464. tlog(TLOG_INFO, "send request %s, qtype %d, id %d\n", domain, qtype, query->sid);
  1465. _dns_client_query_release(query);
  1466. return 0;
  1467. errout_del_list:
  1468. query->callback = NULL;
  1469. _dns_client_query_remove(query);
  1470. query = NULL;
  1471. errout:
  1472. if (query) {
  1473. tlog(TLOG_ERROR, "release %p", query);
  1474. free(query);
  1475. }
  1476. return -1;
  1477. }
  1478. int dns_client_set_ecs(char *ip, int subnet)
  1479. {
  1480. return 0;
  1481. }
  1482. int dns_client_init()
  1483. {
  1484. pthread_attr_t attr;
  1485. int epollfd = -1;
  1486. int ret;
  1487. if (client.epoll_fd > 0) {
  1488. return -1;
  1489. }
  1490. memset(&client, 0, sizeof(client));
  1491. pthread_attr_init(&attr);
  1492. atomic_set(&client.dns_server_num, 0);
  1493. epollfd = epoll_create1(EPOLL_CLOEXEC);
  1494. if (epollfd < 0) {
  1495. tlog(TLOG_ERROR, "create epoll failed, %s\n", strerror(errno));
  1496. goto errout;
  1497. }
  1498. pthread_mutex_init(&client.server_list_lock, 0);
  1499. INIT_LIST_HEAD(&client.dns_server_list);
  1500. pthread_mutex_init(&client.domain_map_lock, 0);
  1501. hash_init(client.domain_map);
  1502. INIT_LIST_HEAD(&client.dns_request_list);
  1503. client.epoll_fd = epollfd;
  1504. client.run = 1;
  1505. /* start work task */
  1506. ret = pthread_create(&client.tid, &attr, _dns_client_work, NULL);
  1507. if (ret != 0) {
  1508. tlog(TLOG_ERROR, "create client work thread failed, %s\n", strerror(errno));
  1509. goto errout;
  1510. }
  1511. return 0;
  1512. errout:
  1513. if (client.tid > 0) {
  1514. void *retval = NULL;
  1515. client.run = 0;
  1516. pthread_join(client.tid, &retval);
  1517. }
  1518. if (epollfd) {
  1519. close(epollfd);
  1520. }
  1521. pthread_mutex_destroy(&client.server_list_lock);
  1522. pthread_mutex_destroy(&client.domain_map_lock);
  1523. return -1;
  1524. }
  1525. void dns_client_exit()
  1526. {
  1527. if (client.tid > 0) {
  1528. void *ret = NULL;
  1529. client.run = 0;
  1530. pthread_join(client.tid, &ret);
  1531. }
  1532. /* free all resouces */
  1533. _dns_client_server_remove_all();
  1534. _dns_client_query_remove_all();
  1535. pthread_mutex_destroy(&client.server_list_lock);
  1536. pthread_mutex_destroy(&client.domain_map_lock);
  1537. }