53#if LWIP_MDNS_RESPONDER
56static void mdns_clear_outmsg(
struct mdns_outmsg *outmsg);
63mdns_prepare_txtdata(
struct mdns_service *service)
65 memset(&service->txtdata, 0,
sizeof(
struct mdns_domain));
66 if (service->txt_fn) {
67 service->txt_fn(service, service->txt_userdata);
84mdns_add_question(
struct mdns_outpacket *outpkt,
struct mdns_domain *
domain,
101 question_len =
domain->length +
sizeof(
type) +
sizeof(klass);
102 if (outpkt->write_offset + question_len > outpkt->pbuf->tot_len) {
115 res =
pbuf_take_at(outpkt->pbuf, &field16,
sizeof(field16), outpkt->write_offset);
119 outpkt->write_offset +=
sizeof(field16);
126 res =
pbuf_take_at(outpkt->pbuf, &field16,
sizeof(field16), outpkt->write_offset);
130 outpkt->write_offset +=
sizeof(field16);
153mdns_add_answer(
struct mdns_outpacket *reply,
struct mdns_domain *
domain,
155 const u8_t *
buf,
size_t buf_length,
struct mdns_domain *answer_domain)
174 answer_len =
domain->length +
sizeof(
type) +
sizeof(klass) +
sizeof(ttl) +
sizeof(field16);
176 answer_len += (
u16_t)buf_length;
179 answer_len += answer_domain->length;
181 if (reply->write_offset + answer_len > reply->pbuf->tot_len) {
187 mdns_add_question(reply,
domain,
type, klass, cache_flush);
191 res =
pbuf_take_at(reply->pbuf, &field32,
sizeof(field32), reply->write_offset);
195 reply->write_offset +=
sizeof(field32);
198 rdlen_offset = reply->write_offset;
199 reply->write_offset +=
sizeof(field16);
200 answer_offset = reply->write_offset;
208 reply->write_offset += (
u16_t)buf_length;
213 res = mdns_write_domain(reply, answer_domain);
220 field16 =
lwip_htons(reply->write_offset - answer_offset);
221 res =
pbuf_take_at(reply->pbuf, &field16,
sizeof(field16), rdlen_offset);
228mdns_add_any_host_question(
struct mdns_outpacket *outpkt,
229 struct mdns_host *mdns,
230 u16_t request_unicast_reply)
232 struct mdns_domain
host;
233 mdns_build_host_domain(&
host, mdns);
236 request_unicast_reply);
241mdns_add_any_service_question(
struct mdns_outpacket *outpkt,
242 struct mdns_service *service,
243 u16_t request_unicast_reply)
245 struct mdns_domain
domain;
246 mdns_build_service_domain(&
domain, service, 1);
249 request_unicast_reply);
255mdns_add_a_answer(
struct mdns_outpacket *reply,
struct mdns_outmsg *
msg,
259 u32_t ttl = MDNS_TTL_120;
260 struct mdns_domain
host;
261 mdns_build_host_domain(&
host, netif_mdns_data(
netif));
264 if(
msg->legacy_query) {
267 if(reply->questions < 1) {
273 reply->questions = 1;
280 ttl, (
const u8_t *) netif_ip4_addr(
netif),
281 sizeof(ip4_addr_t),
NULL);
286mdns_add_hostv4_ptr_answer(
struct mdns_outpacket *reply,
struct mdns_outmsg *
msg,
290 u32_t ttl = MDNS_TTL_120;
291 struct mdns_domain
host, revhost;
292 mdns_build_host_domain(&
host, netif_mdns_data(
netif));
293 mdns_build_reverse_v4_domain(&revhost, netif_ip4_addr(
netif));
296 if(
msg->legacy_query) {
299 if(reply->questions < 1) {
305 reply->questions = 1;
319mdns_add_aaaa_answer(
struct mdns_outpacket *reply,
struct mdns_outmsg *
msg,
323 u32_t ttl = MDNS_TTL_120;
324 struct mdns_domain
host;
325 mdns_build_host_domain(&
host, netif_mdns_data(
netif));
328 if(
msg->legacy_query) {
331 if(reply->questions < 1) {
337 reply->questions = 1;
344 ttl, (
const u8_t *) netif_ip6_addr(
netif, addrindex),
350mdns_add_hostv6_ptr_answer(
struct mdns_outpacket *reply,
struct mdns_outmsg *
msg,
354 u32_t ttl = MDNS_TTL_120;
355 struct mdns_domain
host, revhost;
356 mdns_build_host_domain(&
host, netif_mdns_data(
netif));
357 mdns_build_reverse_v6_domain(&revhost, netif_ip6_addr(
netif, addrindex));
360 if(
msg->legacy_query) {
363 if(reply->questions < 1) {
369 reply->questions = 1;
382mdns_add_servicetype_ptr_answer(
struct mdns_outpacket *reply,
struct mdns_outmsg *
msg,
383 struct mdns_service *service)
386 u32_t ttl = MDNS_TTL_4500;
387 struct mdns_domain service_type, service_dnssd;
388 mdns_build_service_domain(&service_type, service, 0);
389 mdns_build_dnssd_domain(&service_dnssd);
392 if(
msg->legacy_query) {
395 if(reply->questions < 1) {
401 reply->questions = 1;
408 0, ttl,
NULL, 0, &service_type);
413mdns_add_servicename_ptr_answer(
struct mdns_outpacket *reply,
struct mdns_outmsg *
msg,
414 struct mdns_service *service)
417 u32_t ttl = MDNS_TTL_120;
418 struct mdns_domain service_type, service_instance;
419 mdns_build_service_domain(&service_type, service, 0);
420 mdns_build_service_domain(&service_instance, service, 1);
423 if(
msg->legacy_query) {
426 if(reply->questions < 1) {
432 reply->questions = 1;
439 0, ttl,
NULL, 0, &service_instance);
444mdns_add_srv_answer(
struct mdns_outpacket *reply,
struct mdns_outmsg *
msg,
445 struct mdns_host *mdns,
struct mdns_service *service)
448 u32_t ttl = MDNS_TTL_120;
449 struct mdns_domain service_instance, srvhost;
451 mdns_build_service_domain(&service_instance, service, 1);
452 mdns_build_host_domain(&srvhost, mdns);
453 if (
msg->legacy_query) {
458 srvhost.skip_compression = 1;
463 if(reply->questions < 1) {
469 reply->questions = 1;
479 msg->cache_flush, ttl,
480 (
const u8_t *) &srvdata,
sizeof(srvdata), &srvhost);
485mdns_add_txt_answer(
struct mdns_outpacket *reply,
struct mdns_outmsg *
msg,
486 struct mdns_service *service)
489 u32_t ttl = MDNS_TTL_120;
490 struct mdns_domain service_instance;
491 mdns_build_service_domain(&service_instance, service, 1);
492 mdns_prepare_txtdata(service);
495 if(
msg->legacy_query) {
498 if(reply->questions < 1) {
504 reply->questions = 1;
511 msg->cache_flush, ttl, (
u8_t *) &service->txtdata.
name,
512 service->txtdata.length,
NULL);
517mdns_add_probe_questions_to_outpacket(
struct mdns_outpacket *outpkt,
struct mdns_outmsg *
msg,
522 struct mdns_host *mdns = netif_mdns_data(
netif);
525 if(
msg->host_questions & QUESTION_PROBE_HOST_ANY) {
526 res = mdns_add_any_host_question(outpkt, mdns, 1);
534 struct mdns_service* service = mdns->services[
i];
538 if(
msg->serv_questions[
i] & QUESTION_PROBE_SERVICE_NAME_ANY) {
539 res = mdns_add_any_service_question(outpkt, service, 1);
551mdns_add_query_question_to_outpacket(
struct mdns_outpacket *outpkt,
struct mdns_outmsg *
msg)
556 struct mdns_request *req =
msg->query;
557 struct mdns_domain dom;
559 mdns_build_request_domain(&dom, req, req->name[0]);
578mdns_create_outpacket(
struct netif *
netif,
struct mdns_outmsg *
msg,
579 struct mdns_outpacket *outpkt)
581 struct mdns_host *mdns = netif_mdns_data(
netif);
582 struct mdns_service *service;
588 res = mdns_add_query_question_to_outpacket(outpkt,
msg);
594 res = mdns_add_probe_questions_to_outpacket(outpkt,
msg,
netif);
601 if (
msg->host_replies & REPLY_HOST_A) {
608 if (
msg->host_replies & REPLY_HOST_PTR_V4) {
609 res = mdns_add_hostv4_ptr_answer(outpkt,
msg,
netif);
617 if (
msg->host_replies & REPLY_HOST_AAAA) {
620 if (ip6_addr_isvalid(netif_ip6_addr_state(
netif, addrindex))) {
621 res = mdns_add_aaaa_answer(outpkt,
msg,
netif, addrindex);
629 if (
msg->host_replies & REPLY_HOST_PTR_V6) {
630 u8_t rev_addrs =
msg->host_reverse_v6_replies;
634 res = mdns_add_hostv6_ptr_answer(outpkt,
msg,
netif, addrindex);
648 service = mdns->services[
i];
653 if (
msg->serv_replies[
i] & REPLY_SERVICE_TYPE_PTR) {
654 res = mdns_add_servicetype_ptr_answer(outpkt,
msg, service);
661 if (
msg->serv_replies[
i] & REPLY_SERVICE_NAME_PTR) {
662 res = mdns_add_servicename_ptr_answer(outpkt,
msg, service);
669 if (
msg->serv_replies[
i] & REPLY_SERVICE_SRV) {
670 res = mdns_add_srv_answer(outpkt,
msg, mdns, service);
677 if (
msg->serv_replies[
i] & REPLY_SERVICE_TXT) {
678 res = mdns_add_txt_answer(outpkt,
msg, service);
689 outpkt->answers += answers;
691 outpkt->authoritative += answers;
696 service = mdns->services[
i];
701 if (
msg->serv_replies[
i] & REPLY_SERVICE_NAME_PTR) {
704 if (!(
msg->serv_replies[
i] & REPLY_SERVICE_SRV)) {
705 res = mdns_add_srv_answer(outpkt,
msg, mdns, service);
709 outpkt->additional++;
712 if (!(
msg->serv_replies[
i] & REPLY_SERVICE_TXT)) {
713 res = mdns_add_txt_answer(outpkt,
msg, service);
717 outpkt->additional++;
724 if ((
msg->serv_replies[
i] & (REPLY_SERVICE_NAME_PTR | REPLY_SERVICE_SRV)) ||
725 (
msg->host_replies & (REPLY_HOST_A | REPLY_HOST_AAAA))) {
727 if (!(
msg->host_replies & REPLY_HOST_AAAA)) {
730 if (ip6_addr_isvalid(netif_ip6_addr_state(
netif, addrindex))) {
731 res = mdns_add_aaaa_answer(outpkt,
msg,
netif, addrindex);
735 outpkt->additional++;
741 if (!(
msg->host_replies & REPLY_HOST_A) &&
742 !ip4_addr_isany_val(*netif_ip4_addr(
netif))) {
747 outpkt->additional++;
763mdns_send_outpacket(
struct mdns_outmsg *
msg,
struct netif *
netif)
765 struct mdns_outpacket outpkt;
768 memset(&outpkt, 0,
sizeof(outpkt));
793 outpkt.write_offset));
795 res = udp_sendto_if(get_mdns_pcb(), outpkt.pbuf, &
msg->dest_addr,
msg->dest_port,
netif);
813mdns_multicast_timeout_reset_ipv4(
void *
arg)
816 struct mdns_host *mdns = netif_mdns_data(
netif);
820 mdns->ipv4.multicast_timeout = 0;
830mdns_multicast_probe_timeout_reset_ipv4(
void *
arg)
833 struct mdns_host *mdns = netif_mdns_data(
netif);
838 mdns->ipv4.multicast_probe_timeout = 0;
840 if (mdns->ipv4.multicast_msg_waiting) {
841 res = mdns_send_outpacket(&mdns->ipv4.delayed_msg_multicast,
netif);
847 mdns_clear_outmsg(&mdns->ipv4.delayed_msg_multicast);
848 mdns->ipv4.multicast_msg_waiting = 0;
849 mdns_start_multicast_timeouts_ipv4(
netif);
861mdns_multicast_timeout_25ttl_reset_ipv4(
void *
arg)
864 struct mdns_host *mdns = netif_mdns_data(
netif);
868 mdns->ipv4.multicast_timeout_25TTL = 0;
877mdns_send_multicast_msg_delayed_ipv4(
void *
arg)
880 struct mdns_host *mdns = netif_mdns_data(
netif);
883 res = mdns_send_outpacket(&mdns->ipv4.delayed_msg_multicast,
netif);
889 mdns_clear_outmsg(&mdns->ipv4.delayed_msg_multicast);
890 mdns->ipv4.multicast_msg_waiting = 0;
891 mdns_start_multicast_timeouts_ipv4(
netif);
901mdns_send_unicast_msg_delayed_ipv4(
void *
arg)
904 struct mdns_host *mdns = netif_mdns_data(
netif);
907 res = mdns_send_outpacket(&mdns->ipv4.delayed_msg_unicast,
netif);
913 mdns_clear_outmsg(&mdns->ipv4.delayed_msg_unicast);
914 mdns->ipv4.unicast_msg_in_use = 0;
927mdns_start_multicast_timeouts_ipv4(
struct netif *
netif)
929 struct mdns_host *mdns = netif_mdns_data(
netif);
931 mdns_set_timeout(
netif, MDNS_MULTICAST_TIMEOUT, mdns_multicast_timeout_reset_ipv4,
932 &mdns->ipv4.multicast_timeout);
934 mdns_set_timeout(
netif, MDNS_MULTICAST_PROBE_TIMEOUT, mdns_multicast_probe_timeout_reset_ipv4,
935 &mdns->ipv4.multicast_probe_timeout);
937 mdns_set_timeout(
netif, MDNS_MULTICAST_TIMEOUT_25TTL, mdns_multicast_timeout_25ttl_reset_ipv4,
938 &mdns->ipv4.multicast_timeout_25TTL);
950mdns_multicast_timeout_reset_ipv6(
void *
arg)
953 struct mdns_host *mdns = netif_mdns_data(
netif);
957 mdns->ipv6.multicast_timeout = 0;
967mdns_multicast_probe_timeout_reset_ipv6(
void *
arg)
970 struct mdns_host *mdns = netif_mdns_data(
netif);
975 mdns->ipv6.multicast_probe_timeout = 0;
977 if (mdns->ipv6.multicast_msg_waiting) {
978 res = mdns_send_outpacket(&mdns->ipv6.delayed_msg_multicast,
netif);
984 mdns_clear_outmsg(&mdns->ipv6.delayed_msg_multicast);
985 mdns->ipv6.multicast_msg_waiting = 0;
986 mdns_start_multicast_timeouts_ipv6(
netif);
998mdns_multicast_timeout_25ttl_reset_ipv6(
void *
arg)
1001 struct mdns_host *mdns = netif_mdns_data(
netif);
1005 mdns->ipv6.multicast_timeout_25TTL = 0;
1014mdns_send_multicast_msg_delayed_ipv6(
void *
arg)
1017 struct mdns_host *mdns = netif_mdns_data(
netif);
1020 res = mdns_send_outpacket(&mdns->ipv6.delayed_msg_multicast,
netif);
1026 mdns_clear_outmsg(&mdns->ipv6.delayed_msg_multicast);
1027 mdns->ipv6.multicast_msg_waiting = 0;
1028 mdns_start_multicast_timeouts_ipv6(
netif);
1038mdns_send_unicast_msg_delayed_ipv6(
void *
arg)
1041 struct mdns_host *mdns = netif_mdns_data(
netif);
1044 res = mdns_send_outpacket(&mdns->ipv6.delayed_msg_unicast,
netif);
1050 mdns_clear_outmsg(&mdns->ipv6.delayed_msg_unicast);
1051 mdns->ipv6.unicast_msg_in_use = 0;
1064mdns_start_multicast_timeouts_ipv6(
struct netif *
netif)
1066 struct mdns_host *mdns = netif_mdns_data(
netif);
1068 mdns_set_timeout(
netif, MDNS_MULTICAST_TIMEOUT, mdns_multicast_timeout_reset_ipv6,
1069 &mdns->ipv6.multicast_timeout);
1071 mdns_set_timeout(
netif, MDNS_MULTICAST_PROBE_TIMEOUT, mdns_multicast_probe_timeout_reset_ipv6,
1072 &mdns->ipv6.multicast_probe_timeout);
1074 mdns_set_timeout(
netif, MDNS_MULTICAST_TIMEOUT_25TTL, mdns_multicast_timeout_25ttl_reset_ipv6,
1075 &mdns->ipv6.multicast_timeout_25TTL);
1088mdns_clear_outmsg(
struct mdns_outmsg *outmsg)
1094 outmsg->cache_flush = 0;
1095 outmsg->unicast_reply_requested = 0;
1096 outmsg->legacy_query = 0;
1097 outmsg->probe_query_recv = 0;
1098 outmsg->host_questions = 0;
1099 outmsg->host_replies = 0;
1100 outmsg->host_reverse_v6_replies = 0;
1103 outmsg->serv_questions[
i] = 0;
1104 outmsg->serv_replies[
i] = 0;
1135#ifdef LWIP_MDNS_SEARCH
1143mdns_send_request(
struct mdns_request *req,
struct netif *
netif,
const ip_addr_t *destination)
1145 struct mdns_outmsg outmsg;
1148 memset(&outmsg, 0,
sizeof(outmsg));
1151 SMEMCPY(&outmsg.dest_addr, destination,
sizeof(outmsg.dest_addr));
1152 res = mdns_send_outpacket(&outmsg,
netif);
static void cleanup(void)
UINT(* handler)(MSIPACKAGE *)
#define LWIP_DEBUGF(debug, message)
GLuint GLuint GLsizei GLenum type
GLenum GLuint GLenum GLsizei const GLchar * buf
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define LWIP_IPV6_NUM_ADDRESSES
#define SMEMCPY(dst, src, len)
#define MDNS_OUTPUT_PACKET_SIZE
#define MDNS_MAX_SERVICES
void pbuf_realloc(struct pbuf *p, u16_t new_len)
struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
u8_t pbuf_free(struct pbuf *p)
err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len)
err_t pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset)
#define DNS_FLAG1_RESPONSE
typedefPACK_STRUCT_END struct ip6_addr_packed ip6_addr_p_t