Files
BLV_C1F_Module/BasicCode/Drive/NET/DNS.c

449 lines
15 KiB
C
Raw Normal View History

#include "DNS.h"
#include "CH57xNET.H"
#include "DBG.h"
#define CH57xNET_DBG 1
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
UINT8 DNS_SERVER_IP[4]={223,5,5,5}; /* DNS<4E><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 */
UINT8 DNS_SERVER_IP2[4]={114,114,114,114}; /* DNS<4E><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 */
#define IPPORT_DOMAIN 53 /* DNSĬ<53>϶˿<CFB6> */
UINT16 MSG_ID = 0x1100; /* <20><>ʶ */
//UINT32 count = 0;
//UINT8 dns_buf[MAX_DNS_BUF_SIZE];
UINT8* dns_buf = NULL;
//UINT8 url_dn4[] = "www.boonlive-rcu.com";
/*******************************************************************************
* Function Name : get16
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UINT8<EFBFBD><EFBFBD><EFBFBD><EFBFBD>תΪUINT16<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Input : s -UINT8<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Output : None
* Return : ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UINT16<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
UINT16 get16(UINT8 * s)
{
UINT16 i;
i = *s++ << 8;
i = i + *s;
return i;
}
/*******************************************************************************
* Function Name : ParseName
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Input : msg -ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ָ<EFBFBD><EFBFBD>
compressed -ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
buf -<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Output : None
* Return : ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵij<EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
int ParseName(UINT8 * msg, UINT8 * compressed, char * buf)
{
UINT16 slen; /* <20><>ǰƬ<C7B0>γ<EFBFBD><CEB3><EFBFBD>*/
UINT8 * cp;
int clen = 0; /* ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int indirect = 0;
int nseg = 0; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
cp = compressed;
for (;;){
slen = *cp++; /* <20><><EFBFBD>ֽڵļ<DAB5><C4BC><EFBFBD>ֵ*/
if (!indirect) clen++;
if ((slen & 0xc0) == 0xc0){ /* <20><><EFBFBD><EFBFBD><EFBFBD>ֽڸ<D6BD><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<CEAA><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ʽ */
if (!indirect) clen++;
indirect = 1;
cp = &msg[((slen & 0x3f)<<8) + *cp]; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>ֵָ<D6B5><D6B8>ƫ<EFBFBD>Ƶ<EFBFBD>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB> */
slen = *cp++;
}
if (slen == 0) break; /* <20><><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if (!indirect) clen += slen;
while (slen-- != 0) *buf++ = (char)*cp++;
*buf++ = '.';
nseg++;
}
if (nseg == 0){
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; */
*buf++ = '.';
}
*buf++ = '\0';
return clen; /* ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD> */
}
/*******************************************************************************
* Function Name : DnsQuestion
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Input : msg -ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ָ<EFBFBD><EFBFBD>
cp -ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* Output : None
* Return : ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
*******************************************************************************/
UINT8 * DnsQuestion(UINT8 * msg, UINT8 * cp)
{
int len;
char name[MAX_DNS_BUF_SIZE];
len = ParseName(msg, cp, name);
cp += len;
cp += 2; /* <20><><EFBFBD><EFBFBD> */
cp += 2; /* <20><> */
return cp;
}
/*******************************************************************************
* Function Name : DnsAnswer
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĻش<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Input : msg -ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ָ<EFBFBD><EFBFBD>
cp -ָ<EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
psip
* Output : None
* Return :ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
*******************************************************************************/
UINT8 * DnsAnswer(UINT8 * msg, UINT8 * cp, UINT8 * pSip)
{
int len, type;
char name[MAX_DNS_BUF_SIZE];
len = ParseName(msg, cp, name);
cp += len;
type = get16(cp);
cp += 2; /* <20><><EFBFBD><EFBFBD> */
cp += 2; /* <20><> */
cp += 4; /* <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> */
cp += 2; /* <20><>Դ<EFBFBD><D4B4><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> */
switch ( type ){
case TYPE_A:
pSip[0] = *cp++;
pSip[1] = *cp++;
pSip[2] = *cp++;
pSip[3] = *cp++;
break;
case TYPE_CNAME:
case TYPE_MB:
case TYPE_MG:
case TYPE_MR:
case TYPE_NS:
case TYPE_PTR:
len = ParseName(msg, cp, name);
cp += len;
break;
case TYPE_HINFO:
case TYPE_MX:
case TYPE_SOA:
case TYPE_TXT:
break;
default:
break;
}
return cp;
}
/*******************************************************************************
* Function Name : parseMSG
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Input : msg -ָ<EFBFBD><EFBFBD>DNS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
cp -ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ָ<EFBFBD><EFBFBD>
* Output : None
* Return :<EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD>0
*******************************************************************************/
UINT8 parseMSG(struct dhdr * pdhdr, UINT8 * pbuf, UINT8 * pSip)
{
UINT16 tmp;
UINT16 i;
UINT8 * msg;
UINT8 * cp;
msg = pbuf;
memset(pdhdr, 0, sizeof(*pdhdr));
pdhdr->id = get16(&msg[0]);
tmp = get16(&msg[2]);
if (tmp & 0x8000) pdhdr->qr = 1;
pdhdr->opcode = (tmp >> 11) & 0xf;
if (tmp & 0x0400) pdhdr->aa = 1;
if (tmp & 0x0200) pdhdr->tc = 1;
if (tmp & 0x0100) pdhdr->rd = 1;
if (tmp & 0x0080) pdhdr->ra = 1;
pdhdr->rcode = tmp & 0xf;
pdhdr->qdcount = get16(&msg[4]);
pdhdr->ancount = get16(&msg[6]);
pdhdr->nscount = get16(&msg[8]);
pdhdr->arcount = get16(&msg[10]);
/* <20><><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD><C9B1><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>Ȳ<EFBFBD><C8B2><EFBFBD>*/
cp = &msg[12];
/* <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD> */
for (i = 0; i < pdhdr->qdcount; i++)
{
cp = DnsQuestion(msg, cp);
}
/* <20>ش<EFBFBD> */
for (i = 0; i < pdhdr->ancount; i++)
{
cp = DnsAnswer(msg, cp, pSip);
}
/*<2A><>Ȩ */
for (i = 0; i < pdhdr->nscount; i++)
{
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ ;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ */
for (i = 0; i < pdhdr->arcount; i++)
{
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ ;
}
if(pdhdr->rcode == 0) return 1; /* rcode = 0:<3A>ɹ<EFBFBD> */
else return 0;
}
/*******************************************************************************
* Function Name : put16
* Description :UINT16 <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>UINT8<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Input : s -<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
i -UINT16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Output : None
* Return : ƫ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
*******************************************************************************/
UINT8 * put16(UINT8 * s, UINT16 i)
{
*s++ = i >> 8;
*s++ = i;
return s;
}
/*******************************************************************************
* Function Name : MakeDnsQuery
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>DNS<EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
input : op - <EFBFBD>ݹ<EFBFBD>
* name - ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* buf - DNS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
* len - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󳤶<EFBFBD>.
* Output : None
* Return : ָ<EFBFBD><EFBFBD>DNS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
*******************************************************************************/
UINT16 MakeDnsQueryMsg(UINT16 op, char * name, UINT8 * buf, UINT16 len)
{
UINT8 *cp;
char *cp1;
char tmpname[MAX_DNS_BUF_SIZE];
char *dname;
UINT16 p;
UINT16 dlen;
//printf("Domain name:%s \n",name);
cp = buf;
MSG_ID++;
cp = put16(cp, MSG_ID); /* <20><>ʶ */
p = (op << 11) | 0x0100;
cp = put16(cp, p); /* 0x0100<30><30>Recursion desired */
cp = put16(cp, 1); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 */
cp = put16(cp, 0); /* <20><>Դ<EFBFBD><D4B4>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>0 */
cp = put16(cp, 0); /* <20><>Դ<EFBFBD><D4B4>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>0 */
cp = put16(cp, 0); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>0 */
strcpy(tmpname, name);
dname = tmpname;
dlen = strlen(dname);
for (;;){ /* <20><><EFBFBD><EFBFBD>DNS<4E><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>URIд<49>뵽buf<75><66><EFBFBD><EFBFBD>ȥ */
cp1 = strchr(dname, '.');
if (cp1 != NULL) len = cp1 - dname;
else len = dlen;
*cp++ = len;
if (len == 0) break;
strncpy((char *)cp, dname, len);
cp += len;
if (cp1 == NULL)
{
*cp++ = 0;
break;
}
dname += len+1; /* dname<6D>׵<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD> */
dlen -= len+1; /* dname<6D><65><EFBFBD>ȼ<EFBFBD>С */
}
cp = put16(cp, 0x0001); /* type <20><>1------ip<69><70>ַ */
cp = put16(cp, 0x0001); /* class<73><73>1-------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ */
return ((UINT16)(cp - buf));
}
/*******************************************************************************
* Function Name : DnsQuery
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>DNS<EFBFBD><EFBFBD>ѯ
input : s -socket<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* name - ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
pSip -<EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Output : None
* Return : <EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD>2
*******************************************************************************/
//UINT8 DnsQuery2(UINT8* s, UINT8 * name, UINT8 * pSip)
//{
// struct dhdr dhp;
// UINT8 ret;
// UINT32 len;
// if(Status >1 ){
// count++;
// DelayMs(10);
// if( count>20000 ){
//#if CH57xNET_DBG
// printf("DNS Fail!!!!!\n");
//#endif
// count=0;
// Status = 0;
// return 2;
// }
// }
// if(Status == 1)
// {
// DNS_SocketParamInit(s, DNS_SERVER_IP, 4000, IPPORT_DOMAIN);
// //UDPSocketParamInit(*s,DNS_SERVER_IP,4000,IPPORT_DOMAIN);
// Status = 2;
//#if CH57xNET_DBG
// printf(" 2 status = %d!\n",Status);
//#endif
// }
// if(Status ==2)
// {
// len = MakeDnsQueryMsg(0,(char *)name, dns_buf, MAX_DNS_BUF_SIZE);
// ret = CH57xNET_SocketSend(*s,dns_buf,&len);
// if ( ret ) return(0);
// else{
// Status = 3;
//#if CH57xNET_DBG
// printf("status = 3!\n");
//#endif
// }
// }
// if(Status ==4)
// {
// //CH57xNET_SocketClose(*s,TCP_CLOSE_NORMAL );
// return(parseMSG(&dhp, dns_buf, pSip)); /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD>*/
//
// }
// return 0;
//}
/*******************************************************************************
* Function Name : DnsQuery_Task
* Description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>DNS<EFBFBD><EFBFBD>ѯ
input : s -socket<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* name - ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
pSip -<EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Output : None
* Return : <EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD>2
*<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> : ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
UINT8 DnsQuery_Task(UINT8* s, UINT8 * name, UINT8 * pSip)
{
static uint32_t dnschange_wait_tick1 = 0;
switch(server_info.dns_sta)
{
case DNS_INIT:
{
if(dns_buf == NULL) dns_buf = (UINT8*)malloc(MAX_DNS_BUF_SIZE/2); //ΪDNS<4E><53><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>
UINT8 ret = DNS_SocketParamInit(s, DNS_SERVER_IP, 4000, IPPORT_DOMAIN); //<2F><><EFBFBD><EFBFBD>DNS<4E>õ<EFBFBD><C3B5>׽<EFBFBD><D7BD><EFBFBD>
if(ret == CH57xNET_ERR_SUCCESS)
{
server_info.dns_sta = DNS_DATA_SEND;
Dbg_Println(DBG_BIT_NET_STATUS_bit,"DNS socket<65><74><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>,DNS Server IP:%d.%d.%d.%d",\
DNS_SERVER_IP[0],DNS_SERVER_IP[1],DNS_SERVER_IP[2],DNS_SERVER_IP[3]);
}
else
{
Dbg_Println(DBG_BIT_NET_STATUS_bit,"DNS socket<65><74><EFBFBD>´<EFBFBD><C2B4><EFBFBD>,DNS Server IP:%d.%d.%d.%d",\
DNS_SERVER_IP[0],DNS_SERVER_IP[1],DNS_SERVER_IP[2],DNS_SERVER_IP[3]);
server_info.dns_sta = DNS_ClOSE; //2023-03-06
server_info.dns_fail++; //2023-03-06
}
}
break;
case DNS_INIT1:
{
if(dns_buf == NULL) dns_buf = (UINT8*)malloc(MAX_DNS_BUF_SIZE/2); //ΪDNS<4E><53><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>
UINT8 ret = DNS_SocketParamInit(s, DNS_SERVER_IP2, 4000, IPPORT_DOMAIN); //<2F><><EFBFBD><EFBFBD>DNS<4E>õ<EFBFBD><C3B5>׽<EFBFBD><D7BD><EFBFBD>
if(ret == CH57xNET_ERR_SUCCESS)
{
server_info.dns_sta = DNS_DATA_SEND;
Dbg_Println(DBG_BIT_NET_STATUS_bit,"DNS socket<65><74><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>,DNS Server IP:%d.%d.%d.%d",\
DNS_SERVER_IP2[0],DNS_SERVER_IP2[1],DNS_SERVER_IP2[2],DNS_SERVER_IP2[3]);
}
else
{
Dbg_Println(DBG_BIT_NET_STATUS_bit,"DNS socket<65><74><EFBFBD>´<EFBFBD><C2B4><EFBFBD>,DNS Server IP:%d.%d.%d.%d",\
DNS_SERVER_IP2[0],DNS_SERVER_IP2[1],DNS_SERVER_IP2[2],DNS_SERVER_IP2[3]);
server_info.dns_sta = DNS_ClOSE; //2023-03-06
server_info.dns_fail++; //2023-03-06
}
}
break;
case DNS_DATA_SEND:
{
UINT32 len = MakeDnsQueryMsg(0,(char *)name, dns_buf, MAX_DNS_BUF_SIZE); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UINT8 ret = CH57xNET_SocketSend(*s, dns_buf, &len); //<2F><><EFBFBD>͵<EFBFBD>DNS<4E><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(ret == CH57xNET_ERR_SUCCESS)
{
Dbg_Println(DBG_BIT_NET_STATUS_bit,"DNS<EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
else Dbg_Println(DBG_BIT_NET_STATUS_bit,"DNS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
server_info.wait_cot = SysTick_10ms;
server_info.dns_sta = DNS_WAIT_RECV;
server_info.dns_flg = 0x00;
}
break;
case DNS_WAIT_RECV: //<2F><><EFBFBD><EFBFBD>DNS<4E>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA>ر<EFBFBD><D8B1>׽<EFBFBD><D7BD><EFBFBD>
if(server_info.dns_flg == 1) //<2F><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ip
{
struct dhdr dhp;
UINT8 rev = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD>׽<EFBFBD><D7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Dbg_Println(DBG_BIT_NET_STATUS_bit,"DNS <20><>ʱ<EFBFBD><CAB1>%d0ms", SysTick_10ms - server_info.wait_cot);
rev = parseMSG(&dhp, dns_buf, pSip); /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>ֵ<EFBFBD><D6B5>0x01:<3A>ɹ<EFBFBD><C9B9><EFBFBD>0x00:ʧ<><CAA7>*/
CH57xNET_SocketClose(*s,SOCK_STAT_CLOSED );
Dbg_Println(DBG_BIT_NET_STATUS_bit,"<EFBFBD>ͷ<EFBFBD>DNS<EFBFBD>׽<EFBFBD><EFBFBD><EFBFBD>");
if(rev == 0x01) /*parseMSG <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD> 2022-06-08*/
{
return 0x01; //<2F><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
}else {
server_info.dns_fail++;
server_info.dns_sta = DNS_ClOSE;
dnschange_wait_tick1 = SysTick_10ms;
}
}
else if(SysTick_10ms - server_info.wait_cot > 200) //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ճ<EFBFBD>ʱ
{
server_info.wait_cot = SysTick_10ms;
server_info.dns_sta = DNS_ClOSE;
server_info.dns_fail++;
}
break;
case DNS_ClOSE:
free(dns_buf); //<2F>ͷ<EFBFBD>DNS<4E>ռ<EFBFBD>
dns_buf = NULL;
CH57xNET_SocketClose(*s,SOCK_STAT_CLOSED ); //<2F><><EFBFBD><EFBFBD><EFBFBD>׽<EFBFBD><D7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(server_info.dns_fail == 0x01)
{
if(SysTick_10ms - dnschange_wait_tick1 > 50)
{
Dbg_Println(DBG_BIT_NET_STATUS_bit,"<EFBFBD>л<EFBFBD>DNS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
dnschange_wait_tick1 = SysTick_10ms;
server_info.dns_sta = DNS_INIT1;
}
}
else if(server_info.dns_fail >= 0x02)
{
*s = 0;
server_info.dns_fail = 0x00;
return 0x02; //<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
}
break;
}
return 0;
}