58 #ifndef DNS_MULTICAST_ADDRESS 59 #define DNS_MULTICAST_ADDRESS ipaddr_addr("224.0.0.251") 64 #define MDNS_LOCAL "local" 69 #define DNS_MDNS_PORT 5353 73 #ifndef DNS_MAX_RETRIES 74 #define DNS_MAX_RETRIES 4 79 #define DNS_MAX_TTL 604800 83 #define DNS_FLAG1_RESPONSE 0x84 84 #define DNS_FLAG1_OPCODE_STATUS 0x10 85 #define DNS_FLAG1_OPCODE_INVERSE 0x08 86 #define DNS_FLAG1_OPCODE_STANDARD 0x00 87 #define DNS_FLAG1_AUTHORATIVE 0x04 88 #define DNS_FLAG1_TRUNC 0x02 89 #define DNS_FLAG1_RD 0x01 90 #define DNS_FLAG2_RA 0x80 91 #define DNS_FLAG2_ERR_MASK 0x0f 92 #define DNS_FLAG2_ERR_NONE 0x00 93 #define DNS_FLAG2_ERR_NAME 0x03 96 #define DNS_STATE_UNUSED 0 97 #define DNS_STATE_NEW 1 98 #define DNS_STATE_ASKING 2 99 #define DNS_STATE_DONE 3 102 #define MDNS_HOSTNAME_REG 0 103 #define MDNS_SERVICE_REG 1 106 #define MDNS_REG_ANSWER 1 107 #define MDNS_SD_ANSWER 2 108 #define MDNS_SERVICE_REG_ANSWER 3 111 #define MDNS_HOST_TIME 120 112 #define MDNS_SERVICE_TIME 3600 115 #ifndef MDNS_LENGTH_ADD 116 #define MDNS_LENGTH_ADD 2 119 #ifdef MDNS_MAX_NAME_LENGTH 120 #undef MDNS_MAX_NAME_LENGTH 122 #define MDNS_MAX_NAME_LENGTH (256) 137 #define SIZEOF_DNS_HDR 12 148 #define SIZEOF_DNS_QUERY 4 160 #define SIZEOF_DNS_ANSWER 10 169 #define SIZEOF_MDNS_AUTH 4 172 struct mdns_service {
179 #define SIZEOF_MDNS_SERVICE 6 184 static void mdns_recv(
void *s,
struct udp_pcb *pcb,
struct pbuf *p,
196 static struct udp_pcb *mdns_pcb =
NULL;
198 static struct ip_addr multicast_addr;
199 static struct ip_addr host_addr;
200 static uint8 register_flag = 0;
201 static uint8 mdns_flag = 0;
209 getPcb(
struct udp_pcb *pcb) {
213 #if DNS_DOES_NAME_CHECK 225 mdns_compare_name(
unsigned char *query,
unsigned char *
response) {
231 if ((n & 0xc0) == 0xc0) {
237 if ((*query) != (*response)) {
246 }
while (*response != 0);
260 mdns_answer(
u16_t type,
const char* name,
u8_t id) {
262 struct mdns_hdr *hdr;
263 struct mdns_answer ans;
264 struct mdns_auth auth;
265 struct mdns_service serv;
266 struct pbuf *p ,*p_sta;
268 const char *pHostname;
276 SIZEOF_DNS_HDR + MDNS_MAX_NAME_LENGTH * 2 + SIZEOF_DNS_QUERY,
PBUF_RAM);
280 hdr = (
struct mdns_hdr*) p->
payload;
283 hdr->flags1 = DNS_FLAG1_RESPONSE;
285 if (type == MDNS_SD_ANSWER) {
287 hdr->numanswers =
htons(1);
288 }
else if (type == MDNS_SERVICE_REG_ANSWER) {
290 hdr->numanswers =
htons(type);
293 hdr->numanswers =
htons(type);
295 query = (
char*) hdr + SIZEOF_DNS_HDR;
302 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
308 }
while (*pHostname != 0);
312 if (type == MDNS_REG_ANSWER) {
314 ans.type =
htons(DNS_RRTYPE_A);
315 ans.class =
htons(DNS_RRCLASS_IN);
316 ans.ttl =
htonl(MDNS_SERVICE_TIME);
317 ans.len =
htons(DNS_IP_ADDR_LEN);
318 length = DNS_IP_ADDR_LEN;
320 MEMCPY( query, &ans, SIZEOF_DNS_ANSWER);
323 query = query + SIZEOF_DNS_ANSWER;
326 auth.src = host_addr.addr;
327 MEMCPY( query, &auth, SIZEOF_MDNS_AUTH);
329 if (type == MDNS_SD_ANSWER) {
331 ans.type =
htons(DNS_RRTYPE_PTR);
332 ans.class =
htons(DNS_RRCLASS_IN);
333 ans.ttl =
htonl(300);
337 MEMCPY( query, &ans, SIZEOF_DNS_ANSWER);
340 query = query + SIZEOF_DNS_ANSWER;
349 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
355 }
while (*pHostname != 0);
359 if (type == MDNS_SERVICE_REG_ANSWER) {
361 ans.type =
htons(DNS_RRTYPE_PTR);
362 ans.class =
htons(DNS_RRCLASS_IN);
363 ans.ttl =
htonl(MDNS_SERVICE_TIME);
368 length =
os_strlen(tmpBuf) + MDNS_LENGTH_ADD;
369 ans.len =
htons(length);
372 MEMCPY( query, &ans, SIZEOF_DNS_ANSWER);
375 query = query + SIZEOF_DNS_ANSWER;
385 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
391 }
while (*pHostname != 0);
403 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
409 }
while (*pHostname != 0);
413 *query++ = DNS_OFFSET_FLAG;
414 *query++ = DNS_DEFAULT_OFFSET;
418 ans.type =
htons(DNS_RRTYPE_SRV);
419 ans.class =
htons(DNS_RRCLASS_FLUSH_IN);
420 ans.ttl =
htonl(MDNS_SERVICE_TIME);
424 length =
os_strlen(tmpBuf) + MDNS_LENGTH_ADD;
425 ans.len =
htons(SIZEOF_MDNS_SERVICE + length);
427 MEMCPY( query, &ans, SIZEOF_DNS_ANSWER);
430 query = query + SIZEOF_DNS_ANSWER;
433 serv.prior =
htons(0);
434 serv.weight =
htons(0);
435 serv.port =
htons(PUCK_PORT);
436 MEMCPY( query, &serv, SIZEOF_MDNS_SERVICE);
438 query = query + SIZEOF_MDNS_SERVICE;
448 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
454 }
while (*pHostname != 0);
466 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
472 }
while (*pHostname != 0);
476 *query++ = DNS_OFFSET_FLAG;
477 *query++ = DNS_DEFAULT_OFFSET;
480 ans.type =
htons(DNS_RRTYPE_TXT);
481 ans.class =
htons(DNS_RRCLASS_IN);
482 ans.ttl =
htonl(MDNS_SERVICE_TIME);
484 ans.len =
htons(length);
486 MEMCPY( query, &ans, SIZEOF_DNS_ANSWER);
489 query = query + SIZEOF_DNS_ANSWER;
499 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
505 }
while (*pHostname != 0);
516 sta_netif !=
NULL && ap_netif !=
NULL) {
520 SIZEOF_DNS_HDR + MDNS_MAX_NAME_LENGTH * 2 + SIZEOF_DNS_QUERY,
PBUF_RAM);
522 os_printf(
"mdns_answer copying to new pbuf failed\n");
526 err = udp_sendto(mdns_pcb, p_sta, &multicast_addr, DNS_MDNS_PORT);
532 err = udp_sendto(mdns_pcb, p, &multicast_addr, DNS_MDNS_PORT);
552 struct mdns_hdr *hdr;
553 struct mdns_answer ans;
554 struct mdns_service serv;
555 struct mdns_auth auth;
556 struct pbuf *p ,*p_sta;
558 const char *pHostname;
564 u8_t addr1 = 12, addr2 = 12;
570 SIZEOF_DNS_HDR + MDNS_MAX_NAME_LENGTH * 2 + SIZEOF_DNS_QUERY,
PBUF_RAM);
574 hdr = (
struct mdns_hdr*) p->
payload;
577 hdr->flags1 = DNS_FLAG1_RESPONSE;
578 hdr->numanswers =
htons(4);
579 query = (
char*) hdr + SIZEOF_DNS_HDR;
592 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
600 }
while (*pHostname != 0);
602 length =
sizeof(MDNS_LOCAL);
607 ans.type =
htons(DNS_RRTYPE_PTR);
608 ans.class =
htons(DNS_RRCLASS_IN);
609 ans.ttl =
htonl(300);
611 length =
os_strlen(tmpBuf) + MDNS_LENGTH_ADD + 1;
612 ans.len =
htons(length);
615 MEMCPY( query, &ans, SIZEOF_DNS_ANSWER);
617 query = query + SIZEOF_DNS_ANSWER;
626 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
632 }
while (*pHostname != 0);
633 *query++ = DNS_OFFSET_FLAG;
634 *query++ = DNS_DEFAULT_OFFSET;
642 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
648 }
while (*pHostname != 0);
650 *query++ = DNS_OFFSET_FLAG;
651 *query++ = DNS_DEFAULT_OFFSET;
654 ans.type =
htons(DNS_RRTYPE_TXT);
655 ans.class =
htons(DNS_RRCLASS_FLUSH_IN);
656 ans.ttl =
htonl(300);
659 ets_sprintf(device_info,
"vendor = %s",
"Espressif");
665 ans.len =
htons(length);
667 MEMCPY( query, &ans, SIZEOF_DNS_ANSWER);
668 query = query + SIZEOF_DNS_ANSWER;
669 pHostname = device_info;
676 for (n = 0; *pHostname != 0; ++pHostname) {
682 }
while (*pHostname != 0);
692 for (n = 0; *pHostname != 0; ++pHostname) {
698 }
while (*pHostname != 0);
710 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
716 }
while (*pHostname != 0);
718 *query++ = DNS_OFFSET_FLAG;
719 *query++ = DNS_DEFAULT_OFFSET;
721 ans.type =
htons(DNS_RRTYPE_SRV);
722 ans.class =
htons(DNS_RRCLASS_FLUSH_IN);
723 ans.ttl =
htonl(300);
727 length =
os_strlen(tmpBuf) + MDNS_LENGTH_ADD;
728 ans.len =
htons(SIZEOF_MDNS_SERVICE + length);
730 MEMCPY( query, &ans, SIZEOF_DNS_ANSWER);
733 query = query + SIZEOF_DNS_ANSWER;
735 serv.prior =
htons(0);
736 serv.weight =
htons(0);
737 serv.port =
htons(PUCK_PORT);
738 MEMCPY( query, &serv, SIZEOF_MDNS_SERVICE);
740 query = query + SIZEOF_MDNS_SERVICE;
748 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
754 }
while (*pHostname != 0);
767 for (n = 0; *pHostname !=
'.' && *pHostname != 0; ++pHostname) {
773 }
while (*pHostname != 0);
779 ans.type =
htons(DNS_RRTYPE_A);
780 ans.class =
htons(DNS_RRCLASS_FLUSH_IN);
781 ans.ttl =
htonl(300);
782 ans.len =
htons(DNS_IP_ADDR_LEN);
784 MEMCPY( query, &ans, SIZEOF_DNS_ANSWER);
787 query = query + SIZEOF_DNS_ANSWER;
791 auth.src = host_addr.addr;
792 MEMCPY( query, &auth, SIZEOF_MDNS_AUTH);
794 query = query + SIZEOF_MDNS_AUTH;
805 sta_netif !=
NULL && ap_netif !=
NULL) {
809 SIZEOF_DNS_HDR + MDNS_MAX_NAME_LENGTH * 2 + SIZEOF_DNS_QUERY,
PBUF_RAM);
811 os_printf(
"mdns_send_service copying to new pbuf failed\n");
815 err = udp_sendto(mdns_pcb, p_sta, &multicast_addr, DNS_MDNS_PORT);
820 err = udp_sendto(mdns_pcb, p, &multicast_addr, DNS_MDNS_PORT);
838 mdns_recv(
void *arg,
struct udp_pcb *pcb,
struct pbuf *p,
struct ip_addr *addr,
841 struct mdns_hdr *hdr;
856 if (p->
tot_len < (SIZEOF_DNS_HDR + SIZEOF_DNS_QUERY + SIZEOF_DNS_ANSWER)) {
864 hdr = (
struct mdns_hdr*) mdns_payload;
869 nquestions =
htons(hdr->numquestions);
872 if (nquestions > 0) {
876 (
unsigned char *) mdns_payload + SIZEOF_DNS_HDR) == 0) {
879 }
else if (mdns_compare_name((
unsigned char *)
PUCK_SERVICE,
880 (
unsigned char *) mdns_payload + SIZEOF_DNS_HDR) == 0) {
882 mdns_send_service(info, 0);
903 if (mdns_pcb !=
NULL && ms_info !=
NULL)
904 udp_remove(mdns_pcb);
912 mdns_set_name(
const char *name)
922 udp_recv(mdns_pcb, mdns_recv,
NULL);
929 if (mdns_flag == 1) {
938 mdns_get_hostname(
void) {
940 char *name = host_name;
941 if (host_name[0] != 0 ) {
944 return (
"Espressif");
949 mdns_set_hostname(
char *name) {
963 mdns_set_servername(
const char *name) {
967 os_sprintf(server_name ,
"_%s._tcp.local",name);
973 mdns_get_servername(
void) {
982 mdns_server_unregister(
void) {
985 if(register_flag == 1){
986 if (igmp_leavegroup(&host_addr, &multicast_addr) !=
ERR_OK) {
987 os_printf(
"sta udp_leave_multigrup failed!\n");
992 ap_host_addr.addr = ipconfig.ip.addr;
993 if (igmp_leavegroup(&ap_host_addr, &multicast_addr) !=
ERR_OK) {
994 os_printf(
"ap udp_join_multigrup failed!\n");
1003 mdns_server_register(
void) {
1005 if (register_flag == 1) {
1006 os_printf(
"mdns server is already registered !\n");
1008 }
else if (igmp_joingroup(&host_addr, &multicast_addr) !=
ERR_OK) {
1009 os_printf(
"udp_join_multigrup failed!\n");
1020 mdns_send_service(info,0);
1034 multicast_addr.addr = DNS_MULTICAST_ADDRESS;
1038 if (ms_info !=
NULL) {
1044 if (ms_info->ipAddr == 0) {
1048 host_addr.addr = ms_info->ipAddr ;
1051 mdns_set_hostname(ms_info->host_name);
1052 mdns_set_servername(ms_info->server_name);
1053 mdns_set_name(ms_info->host_name);
1059 if (ms_info->server_port == 0)
1063 PUCK_PORT = ms_info->server_port;
1067 mdns_pcb = udp_new();
1069 if (mdns_pcb !=
NULL) {
1072 if (igmp_joingroup(&host_addr, &multicast_addr) !=
ERR_OK) {
1073 os_printf(
"sta udp_join_multigrup failed!\n");
1079 ap_host_addr.addr = ipconfig.ip.addr;
1080 if (igmp_joingroup(&ap_host_addr, &multicast_addr) !=
ERR_OK) {
1081 os_printf(
"ap udp_join_multigrup failed!\n");
1094 udp_recv(mdns_pcb, mdns_recv, ms_info);
err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from) ICACHE_FLASH_ATTR
#define PUCK_SERVICE_LENGTH
en61107_response_t response
const ip_addr_t ip_addr_any ICACHE_RODATA_ATTR
#define ICACHE_FLASH_ATTR
bool wifi_get_ip_info(uint8 if_index, struct ip_info *info)
struct netif * eagle_lwip_getif(uint8 index)
uint8 wifi_get_opmode(void)
#define LWIP_DEBUGF(debug, message)
void netif_set_default(struct netif *netif) ICACHE_FLASH_ATTR
uint8 wifi_get_broadcast_if(void)
#define PACK_STRUCT_STRUCT
u8_t pbuf_free(struct pbuf *p) ICACHE_FLASH_ATTR
#define PACK_STRUCT_BEGIN
#define os_timer_arm(a, b, c)
#define MEMCPY(dst, src, len)
#define LWIP_ASSERT(message, assertion)
u16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, u16_t len, u16_t offset) ICACHE_FLASH_ATTR
#define netif_is_up(netif)
#define SERVICE_DESCRIPTION
void pbuf_realloc(struct pbuf *p, u16_t size) ICACHE_FLASH_ATTR
#define PUCK_DATASHEET_SIZE
#define LWIP_UNUSED_ARG(x)
struct pbuf * pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type) ICACHE_FLASH_ATTR
#define PACK_STRUCT_FIELD(x)