449 lines
15 KiB
C
449 lines
15 KiB
C
|
|
#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;
|
|||
|
|
}
|