dns_client.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719
  1. #include "luat_base.h"
  2. #include "luat_mcu.h"
  3. #include "luat_mem.h"
  4. #ifdef LUAT_USE_DNS
  5. #include "platform_def.h"
  6. #include "dns_def.h"
  7. #include "ctype.h"
  8. #include "luat_network_adapter.h"
  9. #define dnsONE_QUESTION 0x0001
  10. #define dnsFLAG_QUERY_RESPONSE_BIT 0x8000
  11. #define dnsFLAG_OPERATION_CODE_BITS 0x7800
  12. #define dnsFLAG_TRUNCATION_BIT 0x0200
  13. #define dnsFLAG_RESPONSE_CODE_BITS 0x000f
  14. #define dnsOUTGOING_FLAGS 0x0100 /* Standard query. */
  15. #define dnsTYPE_IPV4 0x0001 /* A record (host address. */
  16. #define dnsCLASS 0x0001 /* IN */
  17. #define dnsRX_FLAGS_MASK 0x800f /* The bits of interest in the flags field of incoming DNS messages. */
  18. #define dnsEXPECTED_RX_FLAGS 0x8000 /* Should be a response, without any errors. */
  19. #define dnsTYPE_IPV6 0x001C
  20. #define dnsNAME_IS_OFFSET ( ( uint8_t ) 0xc0 )
  21. #define MAX_DOMAIN_LEN 255
  22. #define MAX_CHARACTER_NUM_PER_LABEL 63
  23. #define DNS_TO_BASE (900)
  24. #define DNS_TRY_MAX (3)
  25. #ifdef LUAT_USE_STD_STRING
  26. extern void DBG_Printf(const char* format, ...);
  27. #ifdef LUAT_LOG_NO_NEWLINE
  28. #define DBG(x,y...) DBG_Printf("%s %d:"x, __FUNCTION__,__LINE__,##y)
  29. #define DBG_ERR(x,y...) DBG_Printf("%s %d:"x, __FUNCTION__,__LINE__,##y)
  30. #else
  31. #define DBG(x,y...) DBG_Printf("%s %d:"x"\r\n", __FUNCTION__,__LINE__,##y)
  32. #define DBG_ERR(x,y...) DBG_Printf("%s %d:"x"\r\n", __FUNCTION__,__LINE__,##y)
  33. #endif
  34. #define LLOGD DBG
  35. #define LLOGI DBG
  36. #define LLOGE DBG
  37. #define LLOGW DBG
  38. #else
  39. #define LUAT_LOG_TAG "DNS"
  40. #include "luat_log.h"
  41. #endif
  42. typedef struct
  43. {
  44. llist_head node;
  45. Buffer_Struct uri_buf; //静态不用释放
  46. luat_dns_ip_result ip_result[MAX_DNS_IP];
  47. uint64_t timeout_ms;
  48. uint16_t session_id;
  49. uint8_t retry_cnt;
  50. uint8_t dns_cnt;
  51. uint8_t ip_nums;
  52. uint8_t is_done;
  53. uint8_t ipv6_mode;
  54. uint8_t is_ipv6;
  55. uint8_t ipv6_done;
  56. }dns_process_t;
  57. typedef struct xDNSMessage
  58. {
  59. uint16_t usIdentifier;
  60. uint16_t usFlags;
  61. uint16_t usQuestions;
  62. uint16_t usAnswers;
  63. uint16_t usAuthorityRRs;
  64. uint16_t usAdditionalRRs;
  65. }xDNSMessage_t;
  66. static int32_t dns_find_process(void *pData, void *pParam)
  67. {
  68. uint16_t session_id = (uint32_t)pParam;
  69. dns_process_t *process = (dns_process_t *)pData;
  70. if (process->session_id == session_id)
  71. {
  72. return LIST_FIND;
  73. }
  74. return LIST_PASS;
  75. }
  76. static uint16_t dns_get_session_id(dns_client_t *client)
  77. {
  78. client->session_id++;
  79. if (!client->session_id)
  80. {
  81. client->session_id = 1;
  82. }
  83. return client->session_id;
  84. }
  85. static int32_t dns_skip_name_field(Buffer_Struct *buf)
  86. {
  87. if( ( buf->Data[buf->Pos] & dnsNAME_IS_OFFSET ) == dnsNAME_IS_OFFSET )
  88. {
  89. /* Jump over the two byte offset. */
  90. buf->Pos += sizeof( uint16_t );
  91. }
  92. else
  93. {
  94. /* pucByte points to the full name. Walk over the string. */
  95. while( buf->Data[buf->Pos] != 0x00 )
  96. {
  97. /* The number of bytes to jump for each name section is stored in the byte
  98. before the name section. */
  99. buf->Pos += ( buf->Data[buf->Pos] + 1 );
  100. if (buf->Pos >= buf->MaxLen)
  101. {
  102. return -1;
  103. }
  104. }
  105. buf->Pos++;
  106. }
  107. if (buf->Pos >= buf->MaxLen)
  108. {
  109. return -1;
  110. }
  111. return 0;
  112. }
  113. static int32_t dns_set_result(void *pData, void *pParam)
  114. {
  115. int i;
  116. dns_process_t *process = (dns_process_t *)pParam;
  117. luat_dns_require_t *require = (luat_dns_require_t *)pData;
  118. if (!require->result)
  119. {
  120. if (process->uri_buf.Pos == require->uri.Pos)
  121. {
  122. if (!memcmp(process->uri_buf.Data, require->uri.Data, require->uri.Pos))
  123. {
  124. require->result = -1;
  125. if (process->ip_nums)
  126. {
  127. for(i = 0; i < process->ip_nums; i++)
  128. {
  129. require->ip_result[i] = process->ip_result[i];
  130. }
  131. require->result = process->ip_nums;
  132. }
  133. }
  134. }
  135. }
  136. return LIST_PASS;
  137. }
  138. int32_t dns_get_ip(dns_client_t *client, Buffer_Struct *buf, uint16_t answer_num, dns_process_t *process)
  139. {
  140. uint16_t i, usTemp;
  141. luat_ip_addr_t ip_addr = {0};
  142. uint32_t ttl;
  143. uint8_t error = 0;
  144. for(i = 0; i < answer_num; i++)
  145. {
  146. if (dns_skip_name_field(buf) != ERROR_NONE)
  147. {
  148. error = 1;
  149. goto NET_DNSGETIP_DONE;
  150. }
  151. usTemp = BytesGetBe16(buf->Data + buf->Pos);
  152. switch (usTemp)
  153. {
  154. case dnsTYPE_IPV4:
  155. if ( (buf->Pos + 14) > buf->MaxLen)
  156. {
  157. error = 1;
  158. goto NET_DNSGETIP_DONE;
  159. }
  160. buf->Pos += 4;
  161. ttl = BytesGetBe32FromBuf(buf);
  162. if (!ttl)
  163. {
  164. LLOGW("ttl zero");
  165. }
  166. usTemp = BytesGetBe16FromBuf(buf);
  167. if ( (buf->Pos + usTemp) > buf->MaxLen)
  168. {
  169. error = 1;
  170. goto NET_DNSGETIP_DONE;
  171. }
  172. network_set_ip_ipv4(&ip_addr, BytesGetLe32(buf->Data + buf->Pos));
  173. buf->Pos += usTemp;
  174. // if (ttl > 0)
  175. {
  176. if (process && (process->ip_nums < MAX_DNS_IP))
  177. {
  178. //LLOGD("ipv4 result%d,%d.%d.%d.%d", process->ip_nums, pvUn.u8[0], pvUn.u8[1], pvUn.u8[2], pvUn.u8[3] );
  179. process->ip_result[process->ip_nums].ip = ip_addr;
  180. process->ip_result[process->ip_nums].ttl_end = ttl + ((uint32_t)(luat_mcu_tick64_ms()/1000));
  181. process->ip_nums++;
  182. }
  183. }
  184. break;
  185. case dnsTYPE_IPV6:
  186. if ( (buf->Pos + 14) > buf->MaxLen)
  187. {
  188. error = 1;
  189. goto NET_DNSGETIP_DONE;
  190. }
  191. buf->Pos += 4;
  192. ttl = BytesGetBe32FromBuf(buf);
  193. if (!ttl)
  194. {
  195. LLOGW("ttl zero");
  196. }
  197. usTemp = BytesGetBe16FromBuf(buf);
  198. if ( (buf->Pos + usTemp) > buf->MaxLen)
  199. {
  200. error = 1;
  201. goto NET_DNSGETIP_DONE;
  202. }
  203. #ifdef LUAT_USE_LWIP
  204. #if LWIP_IPV6
  205. memcpy(ip_addr.u_addr.ip6.addr, buf->Data + buf->Pos, sizeof( uint32_t ) * 4);
  206. // ip_addr.u_addr.ip6.zone = 0;
  207. ip_addr.type = IPADDR_TYPE_V6;
  208. // LLOGI("ipv6 result %s", ipaddr_ntoa(&ip_addr));
  209. #endif
  210. #else
  211. memcpy(ip_addr.ipv6_u8_addr, buf->Data + buf->Pos, sizeof( uint32_t ) * 4);
  212. ip_addr.is_ipv6 = 1;
  213. #endif
  214. //if (ttl > 0)
  215. {
  216. if (process && (process->ip_nums < MAX_DNS_IP))
  217. {
  218. process->ip_result[process->ip_nums].ip = ip_addr;
  219. process->ip_result[process->ip_nums].ttl_end = ttl + ((uint32_t)(luat_mcu_tick64_ms()/1000));
  220. process->ip_nums++;
  221. }
  222. }
  223. buf->Pos += usTemp;
  224. break;
  225. default:
  226. //DBG("%04x",usTemp);
  227. buf->Pos += 8;
  228. usTemp = BytesGetBe16FromBuf(buf);
  229. buf->Pos += usTemp;
  230. //OS(Dump)(buf->Data + buf->Pos, usTemp);
  231. break;
  232. }
  233. }
  234. NET_DNSGETIP_DONE:
  235. if (error)
  236. {
  237. return -1;
  238. }
  239. else
  240. {
  241. if (process)
  242. {
  243. if (process->ipv6_mode)
  244. {
  245. if (process->is_ipv6)
  246. {
  247. process->ipv6_done = 1;
  248. process->session_id = dns_get_session_id(client);
  249. process->is_ipv6 = 0;
  250. process->timeout_ms = 0;
  251. process->retry_cnt = 0;
  252. LLOGI("dns ipv6 done, now dns ipv4");
  253. return 0;
  254. }
  255. }
  256. process->is_done = 1;
  257. llist_traversal(&client->require_head, dns_set_result, process);
  258. }
  259. return 0;
  260. }
  261. }
  262. uint8_t dns_check_uri(const char *uri, uint32_t uri_len)
  263. {
  264. uint32_t dot_num = 0;
  265. uint32_t i = 0;
  266. uint32_t label_len = 0;
  267. char uri_last = 0;
  268. if(uri ==NULL)
  269. {
  270. return 0;
  271. }
  272. if(uri_len == 0 || uri_len > MAX_DOMAIN_LEN) //domain must less than 255
  273. {
  274. return 0;
  275. }
  276. if (!isalpha((int)uri[0])) // domain must start with a letter
  277. {
  278. return 0;
  279. }
  280. uri_last = uri[uri_len - 1];
  281. if (!isalnum((int)uri_last))//end with a letter or digit
  282. {
  283. return 0;
  284. }
  285. for(i = 0; i < uri_len ; i++)
  286. {
  287. if(!(isalnum((int)uri[i]) || uri[i]== '.' || uri[i] == '-'))//must a~z or A~Z or 0~9 or . or -
  288. {
  289. return 0;
  290. }
  291. if( uri [i] == '.')
  292. {
  293. dot_num++;
  294. if((label_len > MAX_CHARACTER_NUM_PER_LABEL) || (0 == label_len)) //Label must be 63 characters or less
  295. return 0;
  296. label_len = 0;
  297. }
  298. else
  299. {
  300. label_len++;
  301. }
  302. }
  303. if((label_len > MAX_CHARACTER_NUM_PER_LABEL) || (0 == dot_num))//the last label must be 63 characters or less
  304. return 0;
  305. return 1;
  306. }
  307. int32_t dns_make(dns_client_t *client, dns_process_t *process, Buffer_Struct *out)
  308. {
  309. xDNSMessage_t MsgHead;
  310. uint8_t *pucStart, *pucByte;
  311. // uint16_t usRecordType;
  312. // uint16_t usClass = BSP_Swap16(dnsCLASS);
  313. if (process->dns_cnt >= MAX_DNS_SERVER)
  314. {
  315. return -ERROR_PERMISSION_DENIED;
  316. }
  317. out->Pos = sizeof(xDNSMessage_t) + 6 + process->uri_buf.Pos;
  318. memset(&MsgHead, 0, sizeof(MsgHead));
  319. MsgHead.usIdentifier = BSP_Swap16(process->session_id);
  320. MsgHead.usFlags = BSP_Swap16(dnsOUTGOING_FLAGS);
  321. MsgHead.usQuestions = BSP_Swap16(dnsONE_QUESTION);
  322. memcpy(out->Data, &MsgHead, sizeof(MsgHead));
  323. pucStart = out->Data + sizeof( MsgHead );
  324. /* Leave a gap for the first length bytes. */
  325. pucByte = pucStart + 1;
  326. /* Copy in the host name. */
  327. memcpy( ( char * ) pucByte, process->uri_buf.Data, process->uri_buf.Pos );
  328. /* Mark the end of the string. */
  329. pucByte += process->uri_buf.Pos;
  330. *pucByte = 0x00;
  331. /* Walk the string to replace the '.' characters with byte counts.
  332. pucStart holds the address of the byte count. Walking the string
  333. starts after the byte count position. */
  334. pucByte = pucStart;
  335. do
  336. {
  337. pucByte++;
  338. while( ( *pucByte != 0x00 ) && ( *pucByte != '.' ) )
  339. {
  340. pucByte++;
  341. }
  342. /* Fill in the byte count, then move the pucStart pointer up to
  343. the found byte position. */
  344. *pucStart = ( uint8_t ) ( ( uint32_t ) pucByte - ( uint32_t ) pucStart );
  345. ( *pucStart )--;
  346. pucStart = pucByte;
  347. } while( *pucByte != 0x00 );
  348. pucByte++;
  349. /* Finish off the record. */
  350. if (process->is_ipv6)
  351. {
  352. BytesPutBe16(pucByte, dnsTYPE_IPV6);
  353. }
  354. else
  355. {
  356. BytesPutBe16(pucByte, dnsTYPE_IPV4);
  357. }
  358. pucByte += sizeof( uint16_t );
  359. BytesPutBe16(pucByte, dnsCLASS);
  360. process->timeout_ms = luat_mcu_tick64_ms() + DNS_TO_BASE * (process->retry_cnt + 1);
  361. return ERROR_NONE;
  362. }
  363. static int32_t dns_check_process(void *pData, void *pParam)
  364. {
  365. dns_process_t *process = (dns_process_t *)pData;
  366. Buffer_Struct *uri_buf = (Buffer_Struct *)pParam;
  367. if (uri_buf->Pos == process->uri_buf.Pos)
  368. {
  369. if (!memcmp(uri_buf->Data, process->uri_buf.Data, uri_buf->Pos))
  370. {
  371. return LIST_FIND;
  372. }
  373. }
  374. return LIST_PASS;
  375. }
  376. void dns_require(dns_client_t *client, const char *domain_name, uint32_t len, void *param)
  377. {
  378. luat_dns_require_t *require = zalloc(sizeof(luat_dns_require_t));
  379. require->uri.Data = (uint8_t *)domain_name;
  380. require->uri.Pos = len;
  381. require->uri.MaxLen = len;
  382. require->param = param;
  383. dns_process_t *process = llist_traversal(&client->process_head, dns_check_process, &require->uri);
  384. // if no same proc
  385. if (!process)
  386. {
  387. process = zalloc(sizeof(dns_process_t));
  388. Buffer_StaticInit(&process->uri_buf, require->uri.Data, require->uri.Pos);
  389. process->uri_buf.Pos = require->uri.Pos;
  390. process->session_id = dns_get_session_id(client);
  391. llist_add_tail(&process->node, &client->process_head);
  392. }
  393. llist_add_tail(&require->node, &client->require_head);
  394. }
  395. void dns_require_ex(dns_client_t *client, const char *domain_name, void *param, uint8_t adapter_index)
  396. {
  397. luat_dns_require_t *require = zalloc(sizeof(luat_dns_require_t));
  398. require->uri.Data = (uint8_t *)domain_name;
  399. require->uri.Pos = strlen(domain_name);
  400. require->uri.MaxLen = strlen(domain_name);
  401. require->param = param;
  402. require->adapter_index = adapter_index;
  403. dns_process_t *process = llist_traversal(&client->process_head, dns_check_process, &require->uri);
  404. // if no same proc
  405. if (!process)
  406. {
  407. process = zalloc(sizeof(dns_process_t));
  408. Buffer_StaticInit(&process->uri_buf, require->uri.Data, require->uri.Pos);
  409. process->uri_buf.Pos = require->uri.Pos;
  410. process->session_id = dns_get_session_id(client);
  411. llist_add_tail(&process->node, &client->process_head);
  412. }
  413. llist_add_tail(&require->node, &client->require_head);
  414. }
  415. void dns_require_ipv6(dns_client_t *client, const char *domain_name, void *param, uint8_t adapter_index, uint8_t is_ipv6)
  416. {
  417. luat_dns_require_t *require = zalloc(sizeof(luat_dns_require_t));
  418. require->uri.Data = (uint8_t *)domain_name;
  419. require->uri.Pos = strlen(domain_name);
  420. require->uri.MaxLen = strlen(domain_name);
  421. require->param = param;
  422. require->adapter_index = adapter_index;
  423. dns_process_t *process = llist_traversal(&client->process_head, dns_check_process, &require->uri);
  424. // if no same proc
  425. if (!process)
  426. {
  427. process = zalloc(sizeof(dns_process_t));
  428. Buffer_StaticInit(&process->uri_buf, require->uri.Data, require->uri.Pos);
  429. process->uri_buf.Pos = require->uri.Pos;
  430. process->session_id = dns_get_session_id(client);
  431. process->ipv6_mode = is_ipv6;
  432. process->is_ipv6 = is_ipv6;
  433. llist_add_tail(&process->node, &client->process_head);
  434. }
  435. llist_add_tail(&require->node, &client->require_head);
  436. }
  437. static int32_t dns_clear_require(void *pData, void *pParam)
  438. {
  439. luat_dns_require_t *require = (luat_dns_require_t *)pData;
  440. free(require->uri.Data);
  441. return LIST_DEL;
  442. }
  443. static int32_t dns_clear_process(void *pData, void *pParam)
  444. {
  445. dns_process_t *process = (dns_process_t *)pData;
  446. if (pParam)
  447. {
  448. return process->is_done?LIST_DEL:LIST_PASS;
  449. }
  450. return LIST_DEL;
  451. }
  452. void dns_clear(dns_client_t *client)
  453. {
  454. // uint64_t now_time = luat_mcu_tick64_ms();
  455. llist_traversal(&client->process_head, dns_clear_process, NULL);
  456. llist_traversal(&client->require_head, dns_clear_require, NULL);
  457. }
  458. static int32_t dns_find_need_tx_process(void *pData, void *pParam)
  459. {
  460. dns_process_t *process = (dns_process_t *)pData;
  461. if (!process->is_done && (process->timeout_ms < luat_mcu_tick64_ms()))
  462. {
  463. return LIST_FIND;
  464. }
  465. return LIST_PASS;
  466. }
  467. void dns_run(dns_client_t *client, Buffer_Struct *in, Buffer_Struct *out, int *server_cnt)
  468. {
  469. dns_process_t *process;
  470. int i;
  471. if (llist_empty(&client->process_head) && !llist_empty(&client->require_head))
  472. {
  473. dns_clear(client);
  474. if (client->is_run)
  475. {
  476. LLOGI("dns all done ,now stop");
  477. }
  478. client->is_run = 0;
  479. return;
  480. }
  481. if (in)
  482. {
  483. xDNSMessage_t MsgHead;
  484. while ( (in->Pos + sizeof(MsgHead)) < in->MaxLen)
  485. {
  486. memcpy(&MsgHead, in->Data + in->Pos, sizeof(MsgHead));
  487. MsgHead.usIdentifier = BSP_Swap16(MsgHead.usIdentifier);
  488. MsgHead.usFlags = BSP_Swap16(MsgHead.usFlags);
  489. in->Pos += sizeof(MsgHead);
  490. process = llist_traversal(&client->process_head, dns_find_process, (void *)((uint32_t)MsgHead.usIdentifier));
  491. if (process)
  492. {
  493. if ( MsgHead.usFlags & 0x8000)
  494. {
  495. MsgHead.usQuestions = BSP_Swap16(MsgHead.usQuestions);
  496. MsgHead.usAnswers = BSP_Swap16(MsgHead.usAnswers);
  497. MsgHead.usAuthorityRRs = BSP_Swap16(MsgHead.usAuthorityRRs);
  498. MsgHead.usAdditionalRRs = BSP_Swap16(MsgHead.usAdditionalRRs);
  499. for(i = 0; i < MsgHead.usQuestions; i++)
  500. {
  501. if (dns_skip_name_field(in) != ERROR_NONE)
  502. {
  503. goto NET_DNS_RX_OUT;
  504. }
  505. in->Pos += 4;
  506. if (in->Pos >= in->MaxLen)
  507. {
  508. goto NET_DNS_RX_OUT;
  509. }
  510. }
  511. if (!(MsgHead.usFlags & 0x000f))
  512. {
  513. if (dns_get_ip(client, in, MsgHead.usAnswers, process))
  514. {
  515. goto NET_DNS_RX_OUT;
  516. }
  517. }
  518. else
  519. {
  520. if (dns_get_ip(client, in, MsgHead.usAnswers, NULL))
  521. {
  522. goto NET_DNS_RX_OUT;
  523. }
  524. }
  525. if (dns_get_ip(client, in, MsgHead.usAuthorityRRs, NULL))
  526. {
  527. goto NET_DNS_RX_OUT;
  528. }
  529. if (dns_get_ip(client, in, MsgHead.usAdditionalRRs, NULL))
  530. {
  531. goto NET_DNS_RX_OUT;
  532. }
  533. }
  534. else
  535. {
  536. goto NET_DNS_RX_OUT;
  537. }
  538. }
  539. }
  540. }
  541. else if (out)
  542. {
  543. NET_DNS_TX:
  544. process = llist_traversal(&client->process_head, dns_find_need_tx_process, NULL);
  545. if (!process)
  546. {
  547. goto NET_DNS_RX_OUT;
  548. }
  549. if (process->timeout_ms)
  550. {
  551. process->retry_cnt++;
  552. if (process->retry_cnt >= DNS_TRY_MAX)
  553. {
  554. process->retry_cnt = 0;
  555. if (process->ipv6_mode)
  556. {
  557. if (process->is_ipv6)
  558. {
  559. process->is_ipv6 = 0;
  560. goto NET_DNS_TX_IPV4;
  561. }
  562. else
  563. {
  564. if (process->ipv6_done && process->ip_nums)
  565. {
  566. LLOGD("get ipv6, no ipv4");
  567. // process->ip_nums = 0;
  568. process->is_done = 1;
  569. client->new_result = 1;
  570. llist_traversal(&client->require_head, dns_set_result, process);
  571. llist_del(&process->node);
  572. free(process);
  573. goto NET_DNS_TX;
  574. }
  575. else
  576. {
  577. process->is_ipv6 = 1;
  578. }
  579. }
  580. }
  581. process->dns_cnt++;
  582. if (process->dns_cnt >= MAX_DNS_SERVER)
  583. {
  584. LLOGE("no ipv6, no ipv4");
  585. process->ip_nums = 0;
  586. process->is_done = 1;
  587. client->new_result = 1;
  588. llist_traversal(&client->require_head, dns_set_result, process);
  589. llist_del(&process->node);
  590. free(process);
  591. goto NET_DNS_TX;
  592. }
  593. }
  594. }
  595. NET_DNS_TX_IPV4:
  596. while(!network_ip_is_vaild(&client->dns_server[process->dns_cnt]))
  597. {
  598. process->dns_cnt++;
  599. if (process->dns_cnt >= MAX_DNS_SERVER)
  600. {
  601. LLOGE("no ipv6, no ipv4");
  602. process->ip_nums = 0;
  603. process->is_done = 1;
  604. client->new_result = 1;
  605. llist_traversal(&client->require_head, dns_set_result, process);
  606. llist_del(&process->node);
  607. free(process);
  608. goto NET_DNS_TX;
  609. }
  610. }
  611. LLOGD("%.*s state %d id %d ipv6 %d use dns server%d, try %d", process->uri_buf.Pos, process->uri_buf.Data, process->is_done, process->session_id, process->is_ipv6, process->dns_cnt, process->retry_cnt);
  612. process->is_done = 0;
  613. OS_InitBuffer(out, 512);
  614. dns_make(client, process, out);
  615. *server_cnt = process->dns_cnt;
  616. }
  617. NET_DNS_RX_OUT:
  618. if (!llist_empty(&client->process_head))
  619. {
  620. llist_traversal(&client->process_head, dns_clear_process, (void *)1);
  621. }
  622. if (llist_empty(&client->process_head) && llist_empty(&client->require_head))
  623. {
  624. if (client->is_run)
  625. {
  626. LLOGI("dns all done ,now stop");
  627. }
  628. client->is_run = 0;
  629. return;
  630. }
  631. else
  632. {
  633. client->is_run = 1;
  634. }
  635. return ;
  636. }
  637. void dns_init_client(dns_client_t *client)
  638. {
  639. int i;
  640. INIT_LLIST_HEAD(&client->process_head);
  641. INIT_LLIST_HEAD(&client->require_head);
  642. for(i = 0; i < MAX_DNS_SERVER; i++)
  643. {
  644. if (!client->is_static_dns[i])
  645. {
  646. network_set_ip_invaild(&client->dns_server[i]);
  647. }
  648. }
  649. }
  650. #endif