dns_client.c 18 KB

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