|
46 | 46 | #define MDNS_ANSWER_A 0x01
|
47 | 47 | #define MDNS_ANSWER_AAAA 0x10
|
48 | 48 | #define MDNS_ANSWER_NSEC 0x20
|
| 49 | +#define MDNS_ANSWER_SDPTR 0x80 |
49 | 50 |
|
50 | 51 | #define MDNS_SERVICE_PORT 5353 // UDP port that the server runs on
|
51 | 52 | #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
|
796 | 797 | return record_length;
|
797 | 798 | }
|
798 | 799 |
|
| 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 | + |
799 | 846 | /**
|
800 | 847 | * @brief appends TXT record for service to a packet, incrementing the index
|
801 | 848 | *
|
@@ -1042,6 +1089,13 @@ static void _mdns_send_answers(mdns_server_t * server, mdns_answer_item_t * answ
|
1042 | 1089 | }
|
1043 | 1090 | answer_count += 1;
|
1044 | 1091 | }
|
| 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 | + } |
1045 | 1099 | }
|
1046 | 1100 | mdns_answer_item_t * a = answers;
|
1047 | 1101 | answers = answers->next;
|
@@ -1274,6 +1328,20 @@ static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, siz
|
1274 | 1328 | }
|
1275 | 1329 | continue;
|
1276 | 1330 | }
|
| 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 | + } |
1277 | 1345 |
|
1278 | 1346 | if (name->sub) {
|
1279 | 1347 | continue;
|
|
0 commit comments