92 #define FLAG_QR (1<<7) 93 #define FLAG_AA (1<<2) 94 #define FLAG_TC (1<<1) 95 #define FLAG_RD (1<<0) 103 #define QTYPE_HINFO 13 104 #define QTYPE_MINFO 14 107 #define QTYPE_URI 256 110 #define QCLASS_ANY 255 111 #define QCLASS_URI 256 132 return ((p[0]<<8)&0xff00)|(p[1]&0xff);
143 if ((*labelPtr&0xC0)==0) {
146 if (i<resMaxLen && i!=0) res[i++]=
'.';
148 for (k=0; k<j; k++) {
149 if ((labelPtr-packet)>packetSz)
return NULL;
150 if (i<resMaxLen) res[i++]=*labelPtr++;
152 }
else if ((*labelPtr&0xC0)==0xC0) {
155 int offset=
my_ntohs(((uint16_t *)labelPtr))&0x3FFF;
157 if (offset>packetSz)
return NULL;
158 labelPtr=&packet[offset];
161 if ((labelPtr-packet)>packetSz)
return NULL;
162 }
while (*labelPtr!=0);
164 if (endPtr==
NULL) endPtr=labelPtr+1;
174 if (*str==
'.' || *str==0) {
200 char *rend=&reply[length];
210 if (hdr->ancount || hdr->nscount || hdr->arcount)
return;
211 if (hdr->flags&
FLAG_TC)
return;
213 memcpy(reply, pusrdata, length);
215 for (i=0; i<
my_ntohs(&hdr->qdcount); i++) {
217 p=
labelToStr(pusrdata, p, length, buff,
sizeof(buff));
225 rend=
strToLabel(buff, rend,
sizeof(reply)-(rend-reply));
226 if (rend==
NULL)
return;
240 setn16(&rhdr->ancount, my_ntohs(&rhdr->ancount)+1);
244 rend=
strToLabel(buff, rend,
sizeof(reply)-(rend-reply));
255 setn16(&rhdr->ancount, my_ntohs(&rhdr->ancount)+1);
259 rend=
strToLabel(buff, rend,
sizeof(reply)-(rend-reply));
267 setn16(&rf->rdlength, 4+16);
270 memcpy(rend,
"http://esp.nonet", 16);
272 setn16(&rhdr->ancount, my_ntohs(&rhdr->ancount)+1);
286 sendto(sockFd,(
uint8*)reply, rend-reply, 0, (
struct sockaddr *)premote_addr,
sizeof(
struct sockaddr_in));
291 static void captdnsTask(
void *pvParameters) {
292 struct sockaddr_in server_addr;
294 struct sockaddr_in from;
299 memset(&ipconfig, 0,
sizeof(ipconfig));
300 memset(&server_addr, 0,
sizeof(server_addr));
301 server_addr.sin_family = AF_INET;
303 server_addr.sin_port =
htons(53);
304 server_addr.sin_len =
sizeof(server_addr);
307 sockFd=socket(AF_INET, SOCK_DGRAM, 0);
310 vTaskDelay(1000/portTICK_RATE_MS);
312 }
while (sockFd==-1);
315 ret=bind(sockFd, (
struct sockaddr *)&server_addr,
sizeof(server_addr));
318 vTaskDelay(1000/portTICK_RATE_MS);
324 memset(&from, 0,
sizeof(from));
325 fromlen=
sizeof(
struct sockaddr_in);
326 ret=recvfrom(sockFd, (
u8 *)udp_msg,
DNS_LEN, 0,(
struct sockaddr *)&from,(socklen_t *)&fromlen);
336 xTaskCreate(captdnsTask, (
const char *)
"captdns_task", 1200,
NULL, 3,
NULL);
338 xTaskCreate(captdnsTask, (
const signed char *)
"captdns_task", 1200,
NULL, 3,
NULL);
void ICACHE_FLASH_ATTR captdnsInit(void)
sint8 espconn_regist_recvcb(struct espconn *espconn, espconn_recv_callback recv_cb)
static void ICACHE_FLASH_ATTR setn32(void *pp, int32_t n)
void ICACHE_FLASH_ATTR captdnsStop(void)
static struct espconn conn
sint8 espconn_get_connection_info(struct espconn *pespconn, remot_info **pcon_info, uint8 typeflags)
#define ICACHE_FLASH_ATTR
bool wifi_get_ip_info(uint8 if_index, struct ip_info *info)
static uint16_t ICACHE_FLASH_ATTR my_ntohs(uint16_t *in)
static char ICACHE_FLASH_ATTR * strToLabel(char *str, char *label, int maxLen)
static void ICACHE_FLASH_ATTR setn16(void *pp, int16_t n)
static char *ICACHE_FLASH_ATTR labelToStr(char *packet, char *labelPtr, int packetSz, char *res, int resMaxLen)
#define ip4_addr3(ipaddr)
sint8 espconn_delete(struct espconn *espconn)
sint16 ICACHE_FLASH_ATTR espconn_sendto(struct espconn *espconn, uint8 *psent, uint16 length)
#define ip4_addr2(ipaddr)
#define ip4_addr4(ipaddr)
#define ip4_addr1(ipaddr)
struct __attribute__((packed))
static void ICACHE_FLASH_ATTR captdnsRecv(void *arg, char *pusrdata, unsigned short length)
sint8 espconn_create(struct espconn *espconn)