Skip to content

Commit 4acf639

Browse files
mdns: add simple dns-sd meta query support
tabs to spaces match domain * Original commit: espressif/esp-idf@96e8a3c
1 parent 1a1cf71 commit 4acf639

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

components/mdns/mdns.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#define MDNS_ANSWER_A 0x01
4747
#define MDNS_ANSWER_AAAA 0x10
4848
#define MDNS_ANSWER_NSEC 0x20
49+
#define MDNS_ANSWER_SDPTR 0x80
4950

5051
#define MDNS_SERVICE_PORT 5353 // UDP port that the server runs on
5152
#define MDNS_SERVICE_STACK_DEPTH 4096 // Stack size for the service thread
@@ -796,6 +797,52 @@ static uint16_t _mdns_append_ptr_record(uint8_t * packet, uint16_t * index, mdns
796797
return record_length;
797798
}
798799

800+
/**
801+
* @brief appends DNS-SD PTR record for service to a packet, incrementing the index
802+
*
803+
* @param packet MDNS packet
804+
* @param index offset in the packet
805+
* @param server the server that is hosting the service
806+
* @param service the service to add record for
807+
*
808+
* @return length of added data: 0 on error or length on success
809+
*/
810+
static uint16_t _mdns_append_sdptr_record(uint8_t * packet, uint16_t * index, mdns_server_t * server, mdns_service_t * service)
811+
{
812+
const char * str[3];
813+
const char * sd_str[4];
814+
uint16_t record_length = 0;
815+
uint8_t part_length;
816+
817+
sd_str[0] = (char*)"_services";
818+
sd_str[1] = (char*)"_dns-sd";
819+
sd_str[2] = (char*)"_udp";
820+
sd_str[3] = MDNS_DEFAULT_DOMAIN;
821+
822+
str[0] = service->service;
823+
str[1] = service->proto;
824+
str[2] = MDNS_DEFAULT_DOMAIN;
825+
826+
part_length = _mdns_append_fqdn(packet, index, sd_str, 4);
827+
828+
record_length += part_length;
829+
830+
part_length = _mdns_append_type(packet, index, MDNS_ANSWER_PTR, MDNS_ANSWER_PTR_TTL);
831+
if (!part_length) {
832+
return 0;
833+
}
834+
record_length += part_length;
835+
836+
uint16_t data_len_location = *index - 2;
837+
part_length = _mdns_append_fqdn(packet, index, str, 3);
838+
if (!part_length) {
839+
return 0;
840+
}
841+
_mdns_set_u16(packet, data_len_location, part_length);
842+
record_length += part_length;
843+
return record_length;
844+
}
845+
799846
/**
800847
* @brief appends TXT record for service to a packet, incrementing the index
801848
*
@@ -1042,6 +1089,13 @@ static void _mdns_send_answers(mdns_server_t * server, mdns_answer_item_t * answ
10421089
}
10431090
answer_count += 1;
10441091
}
1092+
1093+
if (answers->answer & MDNS_ANSWER_SDPTR) {
1094+
if (!_mdns_append_sdptr_record(packet, &index, server, answers->service)) {
1095+
return;
1096+
}
1097+
answer_count += 1;
1098+
}
10451099
}
10461100
mdns_answer_item_t * a = answers;
10471101
answers = answers->next;
@@ -1274,6 +1328,20 @@ static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, siz
12741328
}
12751329
continue;
12761330
}
1331+
1332+
//is this a dns-sd service discovery meta query?
1333+
if (!strcmp(name->host, "_services") && !strcmp(name->service, "_dns-sd") && !strcmp(name->proto, "_udp") && !strcmp(name->domain, MDNS_DEFAULT_DOMAIN) && type == MDNS_TYPE_PTR)
1334+
{
1335+
//add answers for all services
1336+
mdns_srv_item_t * s = server->services;
1337+
while(s) {
1338+
if (s->service->service && s->service->proto) {
1339+
answers = _mdns_add_answer(answers, s->service, MDNS_ANSWER_SDPTR);
1340+
}
1341+
s = s->next;
1342+
}
1343+
continue;
1344+
}
12771345

12781346
if (name->sub) {
12791347
continue;

0 commit comments

Comments
 (0)