mDNS
This is a mDNS server.
mDNSResponder.cpp@2:2b00b659497a, 2015-08-14 (annotated)
- Committer:
- JBRYU
- Date:
- Fri Aug 14 12:26:23 2015 +0000
- Revision:
- 2:2b00b659497a
- Parent:
- 1:163dc87e95c3
- Child:
- 3:25a82eb200c7
delete unused sets
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JBRYU | 0:0df3300689d2 | 1 | /* |
JBRYU | 0:0df3300689d2 | 2 | ---------------------------------------------------- |
JBRYU | 0:0df3300689d2 | 3 | Made by JB RYU, KOR - 2015 |
JBRYU | 0:0df3300689d2 | 4 | |
JBRYU | 0:0df3300689d2 | 5 | origin - C / mdns-sd on CONTIKI-ipv6(uIP) I'd made |
JBRYU | 0:0df3300689d2 | 6 | |
JBRYU | 0:0df3300689d2 | 7 | now - C++ (actually singleton C-style process)/ |
JBRYU | 0:0df3300689d2 | 8 | mdns-sd on MBED-ipv4(LWIP) |
JBRYU | 0:0df3300689d2 | 9 | ---------------------------------------------------- |
JBRYU | 0:0df3300689d2 | 10 | More progressed things than others : |
JBRYU | 0:0df3300689d2 | 11 | { |
JBRYU | 2:2b00b659497a | 12 | Parsing multi-records (OK), |
JBRYU | 0:0df3300689d2 | 13 | Check duplicated host and avoid (OK) |
JBRYU | 0:0df3300689d2 | 14 | } |
JBRYU | 0:0df3300689d2 | 15 | |
JBRYU | 0:0df3300689d2 | 16 | TODO : (Actully these are not necessary for my prj) |
JBRYU | 0:0df3300689d2 | 17 | { |
JBRYU | 0:0df3300689d2 | 18 | register multiple service, |
JBRYU | 0:0df3300689d2 | 19 | managing records-caches |
JBRYU | 0:0df3300689d2 | 20 | } |
JBRYU | 0:0df3300689d2 | 21 | ---------------------------------------------------- |
JBRYU | 0:0df3300689d2 | 22 | Notes : |
JBRYU | 0:0df3300689d2 | 23 | srv-instance-name = host-name |
JBRYU | 2:2b00b659497a | 24 | SEP-<rand 2hex><IP 2hex> |
JBRYU | 0:0df3300689d2 | 25 | ---------------------------------------------------- |
JBRYU | 0:0df3300689d2 | 26 | */ |
JBRYU | 0:0df3300689d2 | 27 | |
JBRYU | 0:0df3300689d2 | 28 | |
JBRYU | 0:0df3300689d2 | 29 | #include "lwip/opt.h" |
JBRYU | 0:0df3300689d2 | 30 | #include "mbed.h" |
JBRYU | 0:0df3300689d2 | 31 | #include "EthernetInterface.h" |
JBRYU | 0:0df3300689d2 | 32 | #include <cstring> |
JBRYU | 0:0df3300689d2 | 33 | #if LWIP_DNS /* don't build if not configured for use in lwipopts.h */ |
JBRYU | 0:0df3300689d2 | 34 | |
JBRYU | 0:0df3300689d2 | 35 | #include "mDNSResponder.h" |
JBRYU | 0:0df3300689d2 | 36 | #include "dns-sd.h" |
JBRYU | 0:0df3300689d2 | 37 | |
JBRYU | 0:0df3300689d2 | 38 | #define MDNS_DBG 1 |
JBRYU | 0:0df3300689d2 | 39 | #if (MDNS_DBG > 0) |
JBRYU | 0:0df3300689d2 | 40 | #define MDBG(x...) printf(x) |
JBRYU | 0:0df3300689d2 | 41 | #else |
JBRYU | 0:0df3300689d2 | 42 | #define MDBG(x...) |
JBRYU | 0:0df3300689d2 | 43 | #endif |
JBRYU | 0:0df3300689d2 | 44 | |
JBRYU | 0:0df3300689d2 | 45 | mDNSResponder::mDNSResponder() : IP_str(NULL) |
JBRYU | 0:0df3300689d2 | 46 | {} |
JBRYU | 0:0df3300689d2 | 47 | |
JBRYU | 0:0df3300689d2 | 48 | /* initialize static instance */ |
JBRYU | 0:0df3300689d2 | 49 | char mDNSResponder::query_buf[1500] = |
JBRYU | 0:0df3300689d2 | 50 | { |
JBRYU | 0:0df3300689d2 | 51 | 0, |
JBRYU | 0:0df3300689d2 | 52 | }; |
JBRYU | 0:0df3300689d2 | 53 | |
JBRYU | 0:0df3300689d2 | 54 | MY_SD_DOMAINS mDNSResponder::SD_domains = |
JBRYU | 0:0df3300689d2 | 55 | { |
JBRYU | 0:0df3300689d2 | 56 | .numbers = N_CONTIKI_SERVICES, |
JBRYU | 0:0df3300689d2 | 57 | .elements = |
JBRYU | 0:0df3300689d2 | 58 | { |
JBRYU | 0:0df3300689d2 | 59 | { |
JBRYU | 0:0df3300689d2 | 60 | .inst_len = 8, |
JBRYU | 0:0df3300689d2 | 61 | .instance = {'S','E','P','-','0','0','0','0'}, |
JBRYU | 0:0df3300689d2 | 62 | .serv_len = 12, |
JBRYU | 0:0df3300689d2 | 63 | .service = {'_','s','m','a','r','t','e','n','e','r','g','y',}, |
JBRYU | 0:0df3300689d2 | 64 | .trl_len = 4, |
JBRYU | 0:0df3300689d2 | 65 | .trl = {'_','t','c','p'}, |
JBRYU | 0:0df3300689d2 | 66 | .domain_len = 5, |
JBRYU | 0:0df3300689d2 | 67 | .domain = {'l','o','c','a','l'}, |
JBRYU | 0:0df3300689d2 | 68 | .txt = |
JBRYU | 0:0df3300689d2 | 69 | { |
JBRYU | 0:0df3300689d2 | 70 | .len_txtvers = 9, |
JBRYU | 0:0df3300689d2 | 71 | .txtvers = {'t','x','t','v','e','r','s','=','1'}, |
JBRYU | 0:0df3300689d2 | 72 | .len_dcap = 10, |
JBRYU | 0:0df3300689d2 | 73 | .dcap = {'d','c','a','p','=','/','d','c','a','p'}, |
JBRYU | 0:0df3300689d2 | 74 | .len_path = 9, |
JBRYU | 0:0df3300689d2 | 75 | .path = {'p','a','t','h','=','/','u','p','t'}, |
JBRYU | 0:0df3300689d2 | 76 | .len_https = 9, |
JBRYU | 0:0df3300689d2 | 77 | .https = {'h','t','t','p','s','=','4','4','3'}, |
JBRYU | 0:0df3300689d2 | 78 | .len_level = 9, |
JBRYU | 0:0df3300689d2 | 79 | .level = {'l','e','v','e','l','=','-','S','0'}, |
JBRYU | 0:0df3300689d2 | 80 | } |
JBRYU | 0:0df3300689d2 | 81 | }, |
JBRYU | 0:0df3300689d2 | 82 | }, |
JBRYU | 0:0df3300689d2 | 83 | }; |
JBRYU | 0:0df3300689d2 | 84 | |
JBRYU | 0:0df3300689d2 | 85 | struct dns_hdr mDNSResponder::SD_res_hdr = |
JBRYU | 0:0df3300689d2 | 86 | { |
JBRYU | 0:0df3300689d2 | 87 | .id = 0x0000, |
JBRYU | 0:0df3300689d2 | 88 | .flags1 = DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE, |
JBRYU | 0:0df3300689d2 | 89 | .flags2 = 0, |
JBRYU | 0:0df3300689d2 | 90 | .numquestions = 0, |
JBRYU | 0:0df3300689d2 | 91 | .numanswers = htons(1), |
JBRYU | 0:0df3300689d2 | 92 | .numauthrr = 0, |
JBRYU | 0:0df3300689d2 | 93 | .numextrarr = 0, |
JBRYU | 0:0df3300689d2 | 94 | }; |
JBRYU | 0:0df3300689d2 | 95 | |
JBRYU | 0:0df3300689d2 | 96 | QR_MAP mDNSResponder::g_queries = {0,}; |
JBRYU | 0:0df3300689d2 | 97 | |
JBRYU | 0:0df3300689d2 | 98 | /* end of initialize static instance */ |
JBRYU | 0:0df3300689d2 | 99 | |
JBRYU | 0:0df3300689d2 | 100 | mDNSResponder::~mDNSResponder() |
JBRYU | 0:0df3300689d2 | 101 | { |
JBRYU | 0:0df3300689d2 | 102 | close(); |
JBRYU | 0:0df3300689d2 | 103 | } |
JBRYU | 0:0df3300689d2 | 104 | |
JBRYU | 0:0df3300689d2 | 105 | void mDNSResponder:: |
JBRYU | 0:0df3300689d2 | 106 | register_service(char* number) |
JBRYU | 0:0df3300689d2 | 107 | { |
JBRYU | 0:0df3300689d2 | 108 | memcpy(&SD_domains.elements[0].instance[4], number, 4); |
JBRYU | 0:0df3300689d2 | 109 | } |
JBRYU | 0:0df3300689d2 | 110 | |
JBRYU | 0:0df3300689d2 | 111 | void mDNSResponder:: |
JBRYU | 0:0df3300689d2 | 112 | query_domain(void) |
JBRYU | 0:0df3300689d2 | 113 | { |
JBRYU | 0:0df3300689d2 | 114 | volatile uint8_t i; |
JBRYU | 0:0df3300689d2 | 115 | struct dns_hdr* hdr; |
JBRYU | 0:0df3300689d2 | 116 | struct dns_question* question; |
JBRYU | 0:0df3300689d2 | 117 | uint8_t *query; |
JBRYU | 0:0df3300689d2 | 118 | |
JBRYU | 0:0df3300689d2 | 119 | MDBG("start probe duplicate domain\n"); |
JBRYU | 0:0df3300689d2 | 120 | |
JBRYU | 0:0df3300689d2 | 121 | hdr = (struct dns_hdr *)query_buf; |
JBRYU | 0:0df3300689d2 | 122 | |
JBRYU | 0:0df3300689d2 | 123 | memset(hdr, 0, sizeof(struct dns_hdr)); |
JBRYU | 0:0df3300689d2 | 124 | |
JBRYU | 0:0df3300689d2 | 125 | hdr->id = 0; |
JBRYU | 0:0df3300689d2 | 126 | hdr->flags1 = DNS_FLAG1_RD; |
JBRYU | 0:0df3300689d2 | 127 | hdr->numquestions = htons(1); |
JBRYU | 0:0df3300689d2 | 128 | |
JBRYU | 0:0df3300689d2 | 129 | query = (unsigned char *)query_buf + sizeof(*hdr); |
JBRYU | 0:0df3300689d2 | 130 | |
JBRYU | 0:0df3300689d2 | 131 | memcpy(query, &SD_domains.elements[0].inst_len, |
JBRYU | 0:0df3300689d2 | 132 | SD_domains.elements[0].inst_len+1); |
JBRYU | 0:0df3300689d2 | 133 | query += SD_domains.elements[0].inst_len+1; |
JBRYU | 0:0df3300689d2 | 134 | |
JBRYU | 0:0df3300689d2 | 135 | memcpy(query, &SD_domains.elements[0].domain_len, |
JBRYU | 0:0df3300689d2 | 136 | SD_domains.elements[0].domain_len+1); |
JBRYU | 0:0df3300689d2 | 137 | query += SD_domains.elements[0].domain_len+1; |
JBRYU | 0:0df3300689d2 | 138 | |
JBRYU | 0:0df3300689d2 | 139 | *query = 0x00; |
JBRYU | 0:0df3300689d2 | 140 | query++; |
JBRYU | 0:0df3300689d2 | 141 | |
JBRYU | 0:0df3300689d2 | 142 | question = (struct dns_question*)query; |
JBRYU | 0:0df3300689d2 | 143 | question->type = htons(DNS_TYPE_ANY); |
JBRYU | 0:0df3300689d2 | 144 | question->obj = htons(DNS_CLASS_IN); |
JBRYU | 0:0df3300689d2 | 145 | |
JBRYU | 0:0df3300689d2 | 146 | query += 4; |
JBRYU | 0:0df3300689d2 | 147 | |
JBRYU | 0:0df3300689d2 | 148 | MDBG("send probe query(%d)\n", |
JBRYU | 0:0df3300689d2 | 149 | (uint16_t)((uint32_t)query - (uint32_t)query_buf)); |
JBRYU | 0:0df3300689d2 | 150 | |
JBRYU | 0:0df3300689d2 | 151 | mdns_sock.sendTo(send_endpt, query_buf, |
JBRYU | 0:0df3300689d2 | 152 | (query - (uint8_t *) query_buf)); |
JBRYU | 0:0df3300689d2 | 153 | } |
JBRYU | 0:0df3300689d2 | 154 | |
JBRYU | 0:0df3300689d2 | 155 | void mDNSResponder::announce(char* ip) |
JBRYU | 0:0df3300689d2 | 156 | { |
JBRYU | 0:0df3300689d2 | 157 | send_endpt.set_address(MCAST, MDNS_PORT); |
JBRYU | 0:0df3300689d2 | 158 | |
JBRYU | 0:0df3300689d2 | 159 | mdns_sock.bind(MDNS_PORT); |
JBRYU | 0:0df3300689d2 | 160 | if (mdns_sock.join_multicast_group(MCAST) != 0) |
JBRYU | 0:0df3300689d2 | 161 | { |
JBRYU | 0:0df3300689d2 | 162 | printf("Error joining the multicast group\n"); |
JBRYU | 0:0df3300689d2 | 163 | while (true) {} |
JBRYU | 0:0df3300689d2 | 164 | } |
JBRYU | 0:0df3300689d2 | 165 | |
JBRYU | 0:0df3300689d2 | 166 | IP_str = ip; |
JBRYU | 0:0df3300689d2 | 167 | |
JBRYU | 0:0df3300689d2 | 168 | IPstringToByte(IP_str); |
JBRYU | 0:0df3300689d2 | 169 | |
JBRYU | 0:0df3300689d2 | 170 | char instance_number[4]; |
JBRYU | 0:0df3300689d2 | 171 | sprintf(instance_number, "%.2d%.2X", |
JBRYU | 0:0df3300689d2 | 172 | 0, IP_byte[3]); |
JBRYU | 0:0df3300689d2 | 173 | register_service(instance_number); |
JBRYU | 0:0df3300689d2 | 174 | |
JBRYU | 0:0df3300689d2 | 175 | query_domain(); |
JBRYU | 0:0df3300689d2 | 176 | } |
JBRYU | 0:0df3300689d2 | 177 | |
JBRYU | 0:0df3300689d2 | 178 | void mDNSResponder::close() |
JBRYU | 0:0df3300689d2 | 179 | { |
JBRYU | 0:0df3300689d2 | 180 | mdns_sock.close(); |
JBRYU | 0:0df3300689d2 | 181 | } |
JBRYU | 0:0df3300689d2 | 182 | |
JBRYU | 0:0df3300689d2 | 183 | void mDNSResponder::IPstringToByte(char* IPstr) |
JBRYU | 0:0df3300689d2 | 184 | { |
JBRYU | 0:0df3300689d2 | 185 | char ip1[4] = {0,}; char ip2[4] = {0,}; |
JBRYU | 0:0df3300689d2 | 186 | char ip3[4] = {0,}; char ip4[4] = {0,}; |
JBRYU | 0:0df3300689d2 | 187 | char* p; |
JBRYU | 0:0df3300689d2 | 188 | char* p_dot; |
JBRYU | 0:0df3300689d2 | 189 | |
JBRYU | 0:0df3300689d2 | 190 | p_dot = strstr(IPstr, "."); |
JBRYU | 0:0df3300689d2 | 191 | memcpy(ip1, IPstr, p_dot-IPstr); |
JBRYU | 0:0df3300689d2 | 192 | IP_byte[0] = (uint8_t)atoi((const char*)ip1); |
JBRYU | 0:0df3300689d2 | 193 | |
JBRYU | 0:0df3300689d2 | 194 | p = p_dot + 1; |
JBRYU | 0:0df3300689d2 | 195 | p_dot = strstr(p, "."); |
JBRYU | 0:0df3300689d2 | 196 | memcpy(ip2, p, p_dot-p); |
JBRYU | 0:0df3300689d2 | 197 | IP_byte[1] = (uint8_t)atoi((const char*)ip2); |
JBRYU | 0:0df3300689d2 | 198 | |
JBRYU | 0:0df3300689d2 | 199 | p = p_dot + 1; |
JBRYU | 0:0df3300689d2 | 200 | p_dot = strstr(p, "."); |
JBRYU | 0:0df3300689d2 | 201 | memcpy(ip3, p, p_dot-p); |
JBRYU | 0:0df3300689d2 | 202 | IP_byte[2] = (uint8_t)atoi((const char*)ip3); |
JBRYU | 0:0df3300689d2 | 203 | |
JBRYU | 0:0df3300689d2 | 204 | p = p_dot + 1; |
JBRYU | 0:0df3300689d2 | 205 | memcpy(ip4, p, 3); |
JBRYU | 0:0df3300689d2 | 206 | IP_byte[3] = (uint8_t)atoi((const char*)ip4); |
JBRYU | 0:0df3300689d2 | 207 | } |
JBRYU | 0:0df3300689d2 | 208 | |
JBRYU | 0:0df3300689d2 | 209 | char* mDNSResponder:: |
JBRYU | 0:0df3300689d2 | 210 | skip_name(char* query) |
JBRYU | 0:0df3300689d2 | 211 | { |
JBRYU | 0:0df3300689d2 | 212 | unsigned char n; |
JBRYU | 0:0df3300689d2 | 213 | |
JBRYU | 0:0df3300689d2 | 214 | do |
JBRYU | 0:0df3300689d2 | 215 | { |
JBRYU | 0:0df3300689d2 | 216 | n = *query; |
JBRYU | 0:0df3300689d2 | 217 | if(n & 0xc0) |
JBRYU | 0:0df3300689d2 | 218 | { |
JBRYU | 0:0df3300689d2 | 219 | ++query; |
JBRYU | 0:0df3300689d2 | 220 | break; |
JBRYU | 0:0df3300689d2 | 221 | } |
JBRYU | 0:0df3300689d2 | 222 | |
JBRYU | 0:0df3300689d2 | 223 | ++query; |
JBRYU | 0:0df3300689d2 | 224 | |
JBRYU | 0:0df3300689d2 | 225 | while(n > 0) |
JBRYU | 0:0df3300689d2 | 226 | { |
JBRYU | 0:0df3300689d2 | 227 | ++query; |
JBRYU | 0:0df3300689d2 | 228 | --n; |
JBRYU | 0:0df3300689d2 | 229 | }; |
JBRYU | 0:0df3300689d2 | 230 | } while(*query != 0); |
JBRYU | 0:0df3300689d2 | 231 | |
JBRYU | 0:0df3300689d2 | 232 | return query + 1; |
JBRYU | 0:0df3300689d2 | 233 | } |
JBRYU | 0:0df3300689d2 | 234 | |
JBRYU | 0:0df3300689d2 | 235 | char* mDNSResponder:: |
JBRYU | 0:0df3300689d2 | 236 | decode_name(char* query, char* packet) |
JBRYU | 0:0df3300689d2 | 237 | { |
JBRYU | 0:0df3300689d2 | 238 | char c = 0xff; |
JBRYU | 0:0df3300689d2 | 239 | static char dest[MAX_DOMAIN_LEN]; |
JBRYU | 0:0df3300689d2 | 240 | int len = 0; |
JBRYU | 0:0df3300689d2 | 241 | |
JBRYU | 0:0df3300689d2 | 242 | memset(dest, 0, MAX_DOMAIN_LEN); |
JBRYU | 0:0df3300689d2 | 243 | |
JBRYU | 0:0df3300689d2 | 244 | MDBG("\n"); |
JBRYU | 0:0df3300689d2 | 245 | while((len < MAX_DOMAIN_LEN) && (c != 0x00)) |
JBRYU | 0:0df3300689d2 | 246 | { |
JBRYU | 0:0df3300689d2 | 247 | c = *query; |
JBRYU | 0:0df3300689d2 | 248 | |
JBRYU | 0:0df3300689d2 | 249 | while (c == 0xc0) |
JBRYU | 0:0df3300689d2 | 250 | { |
JBRYU | 0:0df3300689d2 | 251 | MDBG("%s : read offset\n", __FUNCTION__); |
JBRYU | 0:0df3300689d2 | 252 | query++; |
JBRYU | 0:0df3300689d2 | 253 | query = (char*)((uint32_t)packet + *query); |
JBRYU | 0:0df3300689d2 | 254 | c = *query; |
JBRYU | 0:0df3300689d2 | 255 | } |
JBRYU | 0:0df3300689d2 | 256 | |
JBRYU | 0:0df3300689d2 | 257 | memset(&dest[len], c, 1); |
JBRYU | 0:0df3300689d2 | 258 | |
JBRYU | 0:0df3300689d2 | 259 | query++; |
JBRYU | 0:0df3300689d2 | 260 | len++; |
JBRYU | 0:0df3300689d2 | 261 | } |
JBRYU | 0:0df3300689d2 | 262 | |
JBRYU | 0:0df3300689d2 | 263 | MDBG("\n%s : %s\n", __FUNCTION__, dest); |
JBRYU | 0:0df3300689d2 | 264 | return dest; |
JBRYU | 0:0df3300689d2 | 265 | } |
JBRYU | 0:0df3300689d2 | 266 | |
JBRYU | 0:0df3300689d2 | 267 | void mDNSResponder:: |
JBRYU | 0:0df3300689d2 | 268 | send_dns_ans(struct dns_hdr* hdr) |
JBRYU | 0:0df3300689d2 | 269 | { |
JBRYU | 0:0df3300689d2 | 270 | int i = 0; |
JBRYU | 0:0df3300689d2 | 271 | uint8_t* ptr; |
JBRYU | 0:0df3300689d2 | 272 | uint32_t off_inst = 0; |
JBRYU | 0:0df3300689d2 | 273 | uint32_t off_serv = 0; |
JBRYU | 0:0df3300689d2 | 274 | uint32_t off_domain = 0; |
JBRYU | 0:0df3300689d2 | 275 | PTR_ANS* ptr_ans; |
JBRYU | 0:0df3300689d2 | 276 | SRV_ANS* srv_ans; |
JBRYU | 0:0df3300689d2 | 277 | struct dns_answer* A_ans; |
JBRYU | 0:0df3300689d2 | 278 | TXT_ANS* txt_ans; |
JBRYU | 0:0df3300689d2 | 279 | int numbers = g_queries.numbers; |
JBRYU | 0:0df3300689d2 | 280 | |
JBRYU | 0:0df3300689d2 | 281 | uint8_t ans_mask = DNS_TYPE_ANY; //later, for addtional ans |
JBRYU | 0:0df3300689d2 | 282 | |
JBRYU | 0:0df3300689d2 | 283 | memcpy(hdr, &SD_res_hdr, sizeof(struct dns_hdr)); |
JBRYU | 0:0df3300689d2 | 284 | hdr->numanswers = htons(numbers); |
JBRYU | 0:0df3300689d2 | 285 | ptr = (uint8_t*)hdr + sizeof(struct dns_hdr); |
JBRYU | 0:0df3300689d2 | 286 | |
JBRYU | 0:0df3300689d2 | 287 | while (numbers--) |
JBRYU | 0:0df3300689d2 | 288 | { |
JBRYU | 0:0df3300689d2 | 289 | switch (g_queries.reqs[i]) |
JBRYU | 0:0df3300689d2 | 290 | { |
JBRYU | 0:0df3300689d2 | 291 | case DNS_TYPE_PTR : |
JBRYU | 0:0df3300689d2 | 292 | ans_mask = ans_mask ^ DNS_TYPE_PTR; |
JBRYU | 0:0df3300689d2 | 293 | if (off_serv == 0) |
JBRYU | 0:0df3300689d2 | 294 | { |
JBRYU | 0:0df3300689d2 | 295 | off_serv = (uint32_t)ptr - (uint32_t)hdr; |
JBRYU | 0:0df3300689d2 | 296 | |
JBRYU | 0:0df3300689d2 | 297 | memcpy(ptr, &SD_domains.elements[0].serv_len, |
JBRYU | 0:0df3300689d2 | 298 | SD_domains.elements[0].serv_len + 1); |
JBRYU | 0:0df3300689d2 | 299 | ptr += SD_domains.elements[0].serv_len + 1; |
JBRYU | 0:0df3300689d2 | 300 | |
JBRYU | 0:0df3300689d2 | 301 | memcpy(ptr, &SD_domains.elements[0].trl_len, |
JBRYU | 0:0df3300689d2 | 302 | SD_domains.elements[0].trl_len + 1); |
JBRYU | 0:0df3300689d2 | 303 | ptr += SD_domains.elements[0].trl_len + 1; |
JBRYU | 0:0df3300689d2 | 304 | |
JBRYU | 0:0df3300689d2 | 305 | memcpy(ptr, &SD_domains.elements[0].domain_len, |
JBRYU | 0:0df3300689d2 | 306 | SD_domains.elements[0].domain_len + 1); |
JBRYU | 0:0df3300689d2 | 307 | ptr += SD_domains.elements[0].domain_len + 1; |
JBRYU | 0:0df3300689d2 | 308 | *ptr = 0x00; |
JBRYU | 0:0df3300689d2 | 309 | ptr++; |
JBRYU | 0:0df3300689d2 | 310 | } |
JBRYU | 0:0df3300689d2 | 311 | else |
JBRYU | 0:0df3300689d2 | 312 | { |
JBRYU | 0:0df3300689d2 | 313 | *ptr = 0xc0; |
JBRYU | 0:0df3300689d2 | 314 | ptr++; |
JBRYU | 0:0df3300689d2 | 315 | *ptr = (uint8_t)off_serv; |
JBRYU | 0:0df3300689d2 | 316 | ptr++; |
JBRYU | 0:0df3300689d2 | 317 | } |
JBRYU | 0:0df3300689d2 | 318 | |
JBRYU | 0:0df3300689d2 | 319 | ptr_ans = (PTR_ANS*)ptr; |
JBRYU | 0:0df3300689d2 | 320 | |
JBRYU | 0:0df3300689d2 | 321 | ptr_ans->type = htons(DNS_TYPE_PTR); |
JBRYU | 0:0df3300689d2 | 322 | ptr_ans->obj = htons(DNS_CLASS_IN); |
JBRYU | 0:0df3300689d2 | 323 | ptr_ans->ttl[0] = 0; |
JBRYU | 0:0df3300689d2 | 324 | ptr_ans->ttl[1] = htons(120); |
JBRYU | 0:0df3300689d2 | 325 | |
JBRYU | 0:0df3300689d2 | 326 | int instance_len = SD_domains.elements[0].inst_len; |
JBRYU | 0:0df3300689d2 | 327 | |
JBRYU | 0:0df3300689d2 | 328 | ptr = (uint8_t*)ptr_ans->name; |
JBRYU | 0:0df3300689d2 | 329 | |
JBRYU | 0:0df3300689d2 | 330 | if (off_inst == 0) |
JBRYU | 0:0df3300689d2 | 331 | { |
JBRYU | 0:0df3300689d2 | 332 | off_inst = (uint32_t)ptr - (uint32_t)hdr; |
JBRYU | 0:0df3300689d2 | 333 | |
JBRYU | 0:0df3300689d2 | 334 | ptr_ans->len = htons(instance_len + 3); |
JBRYU | 0:0df3300689d2 | 335 | |
JBRYU | 0:0df3300689d2 | 336 | memcpy(ptr_ans->name, |
JBRYU | 0:0df3300689d2 | 337 | &SD_domains.elements[0].inst_len, |
JBRYU | 0:0df3300689d2 | 338 | 1 + SD_domains.elements[0].inst_len); |
JBRYU | 0:0df3300689d2 | 339 | |
JBRYU | 0:0df3300689d2 | 340 | ptr += instance_len + 1; |
JBRYU | 0:0df3300689d2 | 341 | *ptr = 0xc0; |
JBRYU | 0:0df3300689d2 | 342 | ptr++; |
JBRYU | 0:0df3300689d2 | 343 | *ptr = (uint8_t)off_serv; |
JBRYU | 0:0df3300689d2 | 344 | ptr++; |
JBRYU | 0:0df3300689d2 | 345 | } |
JBRYU | 0:0df3300689d2 | 346 | else |
JBRYU | 0:0df3300689d2 | 347 | { |
JBRYU | 0:0df3300689d2 | 348 | ptr_ans->len = htons(2); |
JBRYU | 0:0df3300689d2 | 349 | |
JBRYU | 0:0df3300689d2 | 350 | *ptr = 0xc0; |
JBRYU | 0:0df3300689d2 | 351 | ptr++; |
JBRYU | 0:0df3300689d2 | 352 | *ptr = (uint8_t)off_inst; |
JBRYU | 0:0df3300689d2 | 353 | ptr++; |
JBRYU | 0:0df3300689d2 | 354 | } |
JBRYU | 0:0df3300689d2 | 355 | break; |
JBRYU | 0:0df3300689d2 | 356 | case DNS_TYPE_SRV : |
JBRYU | 0:0df3300689d2 | 357 | ans_mask = ans_mask ^ DNS_TYPE_SRV; |
JBRYU | 0:0df3300689d2 | 358 | if (off_inst == 0) |
JBRYU | 0:0df3300689d2 | 359 | { |
JBRYU | 0:0df3300689d2 | 360 | off_inst = (uint32_t)ptr - (uint32_t)hdr; |
JBRYU | 0:0df3300689d2 | 361 | |
JBRYU | 0:0df3300689d2 | 362 | memcpy(ptr, |
JBRYU | 0:0df3300689d2 | 363 | &SD_domains.elements[0].inst_len, |
JBRYU | 0:0df3300689d2 | 364 | 1 + SD_domains.elements[0].inst_len); |
JBRYU | 0:0df3300689d2 | 365 | |
JBRYU | 0:0df3300689d2 | 366 | ptr += 1 + SD_domains.elements[0].inst_len; |
JBRYU | 0:0df3300689d2 | 367 | |
JBRYU | 0:0df3300689d2 | 368 | if (off_serv == 0) |
JBRYU | 0:0df3300689d2 | 369 | { |
JBRYU | 0:0df3300689d2 | 370 | off_serv = (uint32_t)ptr - (uint32_t)hdr; |
JBRYU | 0:0df3300689d2 | 371 | |
JBRYU | 0:0df3300689d2 | 372 | memcpy(ptr, &SD_domains.elements[0].serv_len, |
JBRYU | 0:0df3300689d2 | 373 | SD_domains.elements[0].serv_len + 1); |
JBRYU | 0:0df3300689d2 | 374 | ptr += SD_domains.elements[0].serv_len + 1; |
JBRYU | 0:0df3300689d2 | 375 | |
JBRYU | 0:0df3300689d2 | 376 | memcpy(ptr, &SD_domains.elements[0].trl_len, |
JBRYU | 0:0df3300689d2 | 377 | SD_domains.elements[0].trl_len + 1); |
JBRYU | 0:0df3300689d2 | 378 | ptr += SD_domains.elements[0].trl_len + 1; |
JBRYU | 0:0df3300689d2 | 379 | |
JBRYU | 0:0df3300689d2 | 380 | memcpy(ptr, &SD_domains.elements[0].domain_len, |
JBRYU | 0:0df3300689d2 | 381 | SD_domains.elements[0].domain_len + 1); |
JBRYU | 0:0df3300689d2 | 382 | ptr += SD_domains.elements[0].domain_len + 1; |
JBRYU | 0:0df3300689d2 | 383 | |
JBRYU | 0:0df3300689d2 | 384 | *ptr = 0x00; |
JBRYU | 0:0df3300689d2 | 385 | ptr++; |
JBRYU | 0:0df3300689d2 | 386 | } |
JBRYU | 0:0df3300689d2 | 387 | else |
JBRYU | 0:0df3300689d2 | 388 | { |
JBRYU | 0:0df3300689d2 | 389 | *ptr = 0xc0; |
JBRYU | 0:0df3300689d2 | 390 | ptr++; |
JBRYU | 0:0df3300689d2 | 391 | *ptr = (uint8_t)off_serv; |
JBRYU | 0:0df3300689d2 | 392 | ptr++; |
JBRYU | 0:0df3300689d2 | 393 | } |
JBRYU | 0:0df3300689d2 | 394 | } |
JBRYU | 0:0df3300689d2 | 395 | else |
JBRYU | 0:0df3300689d2 | 396 | { |
JBRYU | 0:0df3300689d2 | 397 | *ptr = 0xc0; |
JBRYU | 0:0df3300689d2 | 398 | ptr++; |
JBRYU | 0:0df3300689d2 | 399 | *ptr = (uint8_t)off_inst; |
JBRYU | 0:0df3300689d2 | 400 | ptr++; |
JBRYU | 0:0df3300689d2 | 401 | } |
JBRYU | 0:0df3300689d2 | 402 | |
JBRYU | 0:0df3300689d2 | 403 | srv_ans = (SRV_ANS*)(ptr); |
JBRYU | 0:0df3300689d2 | 404 | srv_ans->type = htons(DNS_TYPE_SRV); |
JBRYU | 0:0df3300689d2 | 405 | srv_ans->obj = htons(DNS_CLASS_IN | DNS_CASH_FLUSH); |
JBRYU | 0:0df3300689d2 | 406 | srv_ans->ttl[0] = 0; |
JBRYU | 0:0df3300689d2 | 407 | srv_ans->ttl[1] = htons(120); |
JBRYU | 0:0df3300689d2 | 408 | srv_ans->pri = 0; |
JBRYU | 0:0df3300689d2 | 409 | srv_ans->wei = 0; |
JBRYU | 0:0df3300689d2 | 410 | srv_ans->port = htons(8080); |
JBRYU | 0:0df3300689d2 | 411 | ptr = (uint8_t*)srv_ans->name; |
JBRYU | 0:0df3300689d2 | 412 | |
JBRYU | 0:0df3300689d2 | 413 | if (off_domain == 0) |
JBRYU | 0:0df3300689d2 | 414 | { |
JBRYU | 0:0df3300689d2 | 415 | off_domain = (uint32_t)ptr - (uint32_t)hdr; |
JBRYU | 0:0df3300689d2 | 416 | |
JBRYU | 0:0df3300689d2 | 417 | memcpy(ptr, |
JBRYU | 0:0df3300689d2 | 418 | &SD_domains.elements[0].inst_len, |
JBRYU | 0:0df3300689d2 | 419 | 1 + SD_domains.elements[0].inst_len); |
JBRYU | 0:0df3300689d2 | 420 | |
JBRYU | 0:0df3300689d2 | 421 | ptr += 1 + SD_domains.elements[0].inst_len; |
JBRYU | 0:0df3300689d2 | 422 | |
JBRYU | 0:0df3300689d2 | 423 | memcpy(ptr, |
JBRYU | 0:0df3300689d2 | 424 | &SD_domains.elements[0].domain_len, |
JBRYU | 0:0df3300689d2 | 425 | 1 + SD_domains.elements[0].domain_len); |
JBRYU | 0:0df3300689d2 | 426 | |
JBRYU | 0:0df3300689d2 | 427 | ptr+= 1 + SD_domains.elements[0].domain_len; |
JBRYU | 0:0df3300689d2 | 428 | *ptr = 0x00; |
JBRYU | 0:0df3300689d2 | 429 | ptr++; |
JBRYU | 0:0df3300689d2 | 430 | } |
JBRYU | 0:0df3300689d2 | 431 | else |
JBRYU | 0:0df3300689d2 | 432 | { |
JBRYU | 0:0df3300689d2 | 433 | *ptr = 0xc0; |
JBRYU | 0:0df3300689d2 | 434 | ptr++; |
JBRYU | 0:0df3300689d2 | 435 | *ptr = (uint8_t)off_domain; |
JBRYU | 0:0df3300689d2 | 436 | ptr++; |
JBRYU | 0:0df3300689d2 | 437 | } |
JBRYU | 0:0df3300689d2 | 438 | srv_ans->len = |
JBRYU | 0:0df3300689d2 | 439 | htons((uint16_t)((uint32_t)ptr - (uint32_t)&srv_ans->pri)); |
JBRYU | 0:0df3300689d2 | 440 | |
JBRYU | 0:0df3300689d2 | 441 | break; |
JBRYU | 0:0df3300689d2 | 442 | case DNS_TYPE_TXT : |
JBRYU | 0:0df3300689d2 | 443 | ans_mask = ans_mask ^ DNS_TYPE_TXT; |
JBRYU | 0:0df3300689d2 | 444 | if (off_inst == 0) |
JBRYU | 0:0df3300689d2 | 445 | { |
JBRYU | 0:0df3300689d2 | 446 | off_inst = (uint32_t)ptr - (uint32_t)hdr; |
JBRYU | 0:0df3300689d2 | 447 | |
JBRYU | 0:0df3300689d2 | 448 | memcpy(ptr, |
JBRYU | 0:0df3300689d2 | 449 | &SD_domains.elements[0].inst_len, |
JBRYU | 0:0df3300689d2 | 450 | 1 + SD_domains.elements[0].inst_len); |
JBRYU | 0:0df3300689d2 | 451 | |
JBRYU | 0:0df3300689d2 | 452 | ptr += 1 + SD_domains.elements[0].inst_len; |
JBRYU | 0:0df3300689d2 | 453 | |
JBRYU | 0:0df3300689d2 | 454 | if (off_serv == 0) |
JBRYU | 0:0df3300689d2 | 455 | { |
JBRYU | 0:0df3300689d2 | 456 | off_serv = (uint32_t)ptr - (uint32_t)hdr; |
JBRYU | 0:0df3300689d2 | 457 | |
JBRYU | 0:0df3300689d2 | 458 | memcpy(ptr, &SD_domains.elements[0].serv_len, |
JBRYU | 0:0df3300689d2 | 459 | SD_domains.elements[0].serv_len + 1); |
JBRYU | 0:0df3300689d2 | 460 | ptr += SD_domains.elements[0].serv_len + 1; |
JBRYU | 0:0df3300689d2 | 461 | |
JBRYU | 0:0df3300689d2 | 462 | memcpy(ptr, &SD_domains.elements[0].trl_len, |
JBRYU | 0:0df3300689d2 | 463 | SD_domains.elements[0].trl_len + 1); |
JBRYU | 0:0df3300689d2 | 464 | ptr += SD_domains.elements[0].trl_len + 1; |
JBRYU | 0:0df3300689d2 | 465 | |
JBRYU | 0:0df3300689d2 | 466 | memcpy(ptr, &SD_domains.elements[0].domain_len, |
JBRYU | 0:0df3300689d2 | 467 | SD_domains.elements[0].domain_len + 1); |
JBRYU | 0:0df3300689d2 | 468 | ptr += SD_domains.elements[0].domain_len + 1; |
JBRYU | 0:0df3300689d2 | 469 | |
JBRYU | 0:0df3300689d2 | 470 | *ptr = 0x00; |
JBRYU | 0:0df3300689d2 | 471 | ptr++; |
JBRYU | 0:0df3300689d2 | 472 | } |
JBRYU | 0:0df3300689d2 | 473 | else |
JBRYU | 0:0df3300689d2 | 474 | { |
JBRYU | 0:0df3300689d2 | 475 | *ptr = 0xc0; |
JBRYU | 0:0df3300689d2 | 476 | ptr++; |
JBRYU | 0:0df3300689d2 | 477 | *ptr = (uint8_t)off_serv; |
JBRYU | 0:0df3300689d2 | 478 | ptr++; |
JBRYU | 0:0df3300689d2 | 479 | } |
JBRYU | 0:0df3300689d2 | 480 | } |
JBRYU | 0:0df3300689d2 | 481 | else |
JBRYU | 0:0df3300689d2 | 482 | { |
JBRYU | 0:0df3300689d2 | 483 | *ptr = 0xc0; |
JBRYU | 0:0df3300689d2 | 484 | ptr++; |
JBRYU | 0:0df3300689d2 | 485 | *ptr = (uint8_t)off_inst; |
JBRYU | 0:0df3300689d2 | 486 | ptr++; |
JBRYU | 0:0df3300689d2 | 487 | } |
JBRYU | 0:0df3300689d2 | 488 | |
JBRYU | 0:0df3300689d2 | 489 | txt_ans = (TXT_ANS*)(ptr); |
JBRYU | 0:0df3300689d2 | 490 | txt_ans->type = htons(DNS_TYPE_TXT); |
JBRYU | 0:0df3300689d2 | 491 | txt_ans->obj = htons(DNS_CLASS_IN | DNS_CASH_FLUSH); |
JBRYU | 0:0df3300689d2 | 492 | txt_ans->ttl[0] = 0; |
JBRYU | 0:0df3300689d2 | 493 | txt_ans->ttl[1] = htons(120); |
JBRYU | 0:0df3300689d2 | 494 | ptr = (uint8_t*)txt_ans->txt; |
JBRYU | 0:0df3300689d2 | 495 | |
JBRYU | 0:0df3300689d2 | 496 | memcpy(ptr, |
JBRYU | 0:0df3300689d2 | 497 | &SD_domains.elements[0].txt.len_txtvers, |
JBRYU | 0:0df3300689d2 | 498 | 1 + SD_domains.elements[0].txt.len_txtvers); |
JBRYU | 0:0df3300689d2 | 499 | ptr += 1 + SD_domains.elements[0].txt.len_txtvers; |
JBRYU | 0:0df3300689d2 | 500 | |
JBRYU | 0:0df3300689d2 | 501 | memcpy(ptr, |
JBRYU | 0:0df3300689d2 | 502 | &SD_domains.elements[0].txt.len_dcap, |
JBRYU | 0:0df3300689d2 | 503 | 1 + SD_domains.elements[0].txt.len_dcap); |
JBRYU | 0:0df3300689d2 | 504 | ptr += 1 + SD_domains.elements[0].txt.len_dcap; |
JBRYU | 0:0df3300689d2 | 505 | |
JBRYU | 0:0df3300689d2 | 506 | memcpy(ptr, |
JBRYU | 0:0df3300689d2 | 507 | &SD_domains.elements[0].txt.len_path, |
JBRYU | 0:0df3300689d2 | 508 | 1 + SD_domains.elements[0].txt.len_path); |
JBRYU | 0:0df3300689d2 | 509 | ptr += 1 + SD_domains.elements[0].txt.len_path; |
JBRYU | 0:0df3300689d2 | 510 | |
JBRYU | 0:0df3300689d2 | 511 | memcpy(ptr, |
JBRYU | 0:0df3300689d2 | 512 | &SD_domains.elements[0].txt.len_https, |
JBRYU | 0:0df3300689d2 | 513 | 1 + SD_domains.elements[0].txt.len_https); |
JBRYU | 0:0df3300689d2 | 514 | ptr += 1 + SD_domains.elements[0].txt.len_https; |
JBRYU | 0:0df3300689d2 | 515 | |
JBRYU | 0:0df3300689d2 | 516 | memcpy(ptr, |
JBRYU | 0:0df3300689d2 | 517 | &SD_domains.elements[0].txt.len_level, |
JBRYU | 0:0df3300689d2 | 518 | 1 + SD_domains.elements[0].txt.len_level); |
JBRYU | 0:0df3300689d2 | 519 | ptr += 1 + SD_domains.elements[0].txt.len_level; |
JBRYU | 0:0df3300689d2 | 520 | |
JBRYU | 0:0df3300689d2 | 521 | txt_ans->len = |
JBRYU | 0:0df3300689d2 | 522 | htons((uint16_t)((uint32_t)ptr - (uint32_t)txt_ans->txt)); |
JBRYU | 0:0df3300689d2 | 523 | |
JBRYU | 0:0df3300689d2 | 524 | break; |
JBRYU | 0:0df3300689d2 | 525 | case DNS_TYPE_A : |
JBRYU | 0:0df3300689d2 | 526 | ans_mask = ans_mask ^ DNS_TYPE_A; |
JBRYU | 0:0df3300689d2 | 527 | if (off_domain == 0) |
JBRYU | 0:0df3300689d2 | 528 | { |
JBRYU | 0:0df3300689d2 | 529 | off_domain = (uint32_t)ptr - (uint32_t)hdr; |
JBRYU | 0:0df3300689d2 | 530 | |
JBRYU | 0:0df3300689d2 | 531 | memcpy(ptr, |
JBRYU | 0:0df3300689d2 | 532 | &SD_domains.elements[0].inst_len, |
JBRYU | 0:0df3300689d2 | 533 | 1 + SD_domains.elements[0].inst_len); |
JBRYU | 0:0df3300689d2 | 534 | |
JBRYU | 0:0df3300689d2 | 535 | ptr += 1 + SD_domains.elements[0].inst_len; |
JBRYU | 0:0df3300689d2 | 536 | |
JBRYU | 0:0df3300689d2 | 537 | memcpy(ptr, |
JBRYU | 0:0df3300689d2 | 538 | &SD_domains.elements[0].domain_len, |
JBRYU | 0:0df3300689d2 | 539 | 1 + SD_domains.elements[0].domain_len); |
JBRYU | 0:0df3300689d2 | 540 | |
JBRYU | 0:0df3300689d2 | 541 | ptr += 1 + SD_domains.elements[0].domain_len; |
JBRYU | 0:0df3300689d2 | 542 | *ptr = 0x00; |
JBRYU | 0:0df3300689d2 | 543 | ptr++; |
JBRYU | 0:0df3300689d2 | 544 | } |
JBRYU | 0:0df3300689d2 | 545 | else |
JBRYU | 0:0df3300689d2 | 546 | { |
JBRYU | 0:0df3300689d2 | 547 | *ptr = 0xc0; |
JBRYU | 0:0df3300689d2 | 548 | ptr++; |
JBRYU | 0:0df3300689d2 | 549 | *ptr = (uint8_t)off_domain; |
JBRYU | 0:0df3300689d2 | 550 | ptr++; |
JBRYU | 0:0df3300689d2 | 551 | } |
JBRYU | 0:0df3300689d2 | 552 | |
JBRYU | 0:0df3300689d2 | 553 | A_ans = (struct dns_answer*)(ptr); |
JBRYU | 0:0df3300689d2 | 554 | |
JBRYU | 0:0df3300689d2 | 555 | A_ans->type = htons(DNS_TYPE_A); |
JBRYU | 0:0df3300689d2 | 556 | A_ans->obj = htons(DNS_CLASS_IN | DNS_CASH_FLUSH); |
JBRYU | 0:0df3300689d2 | 557 | A_ans->ttl[0] = 0; |
JBRYU | 0:0df3300689d2 | 558 | A_ans->ttl[1] = htons(120); |
JBRYU | 0:0df3300689d2 | 559 | A_ans->len = htons(4); |
JBRYU | 0:0df3300689d2 | 560 | memcpy((uint8_t*)A_ans->ipaddr, |
JBRYU | 0:0df3300689d2 | 561 | IP_byte, 4); |
JBRYU | 0:0df3300689d2 | 562 | |
JBRYU | 0:0df3300689d2 | 563 | ptr = (uint8_t*)&A_ans->ipaddr + 4; |
JBRYU | 0:0df3300689d2 | 564 | break; |
JBRYU | 0:0df3300689d2 | 565 | |
JBRYU | 0:0df3300689d2 | 566 | default : |
JBRYU | 0:0df3300689d2 | 567 | break; |
JBRYU | 0:0df3300689d2 | 568 | } |
JBRYU | 0:0df3300689d2 | 569 | i++; |
JBRYU | 0:0df3300689d2 | 570 | } |
JBRYU | 0:0df3300689d2 | 571 | |
JBRYU | 0:0df3300689d2 | 572 | int send_len = ptr - (uint8_t*)hdr; |
JBRYU | 0:0df3300689d2 | 573 | |
JBRYU | 0:0df3300689d2 | 574 | mdns_sock.sendTo(send_endpt, (char*)hdr, send_len); |
JBRYU | 0:0df3300689d2 | 575 | } |
JBRYU | 0:0df3300689d2 | 576 | |
JBRYU | 0:0df3300689d2 | 577 | void mDNSResponder:: |
JBRYU | 0:0df3300689d2 | 578 | MDNS_process(void const *args) |
JBRYU | 0:0df3300689d2 | 579 | { |
JBRYU | 0:0df3300689d2 | 580 | char rcv_buf[ 1500 ]; |
JBRYU | 0:0df3300689d2 | 581 | uint8_t nquestions, nanswers; |
JBRYU | 0:0df3300689d2 | 582 | struct dns_hdr* hdr; |
JBRYU | 0:0df3300689d2 | 583 | char *queryptr; |
JBRYU | 0:0df3300689d2 | 584 | uint8_t is_request; |
JBRYU | 0:0df3300689d2 | 585 | int len; |
JBRYU | 0:0df3300689d2 | 586 | |
JBRYU | 0:0df3300689d2 | 587 | MDBG("MDNS Process\n"); |
JBRYU | 0:0df3300689d2 | 588 | |
JBRYU | 0:0df3300689d2 | 589 | while ((len = mdns_sock.receiveFrom(rcv_endpt, |
JBRYU | 0:0df3300689d2 | 590 | rcv_buf, sizeof(rcv_buf))) != 0) |
JBRYU | 0:0df3300689d2 | 591 | { |
JBRYU | 0:0df3300689d2 | 592 | hdr = (struct dns_hdr *)rcv_buf; |
JBRYU | 0:0df3300689d2 | 593 | queryptr = (char *)hdr + sizeof(*hdr); |
JBRYU | 0:0df3300689d2 | 594 | is_request = ((hdr->flags1 & ~1) == 0) && (hdr->flags2 == 0); |
JBRYU | 0:0df3300689d2 | 595 | nquestions = (uint8_t) ntohs(hdr->numquestions); |
JBRYU | 0:0df3300689d2 | 596 | nanswers = (uint8_t) ntohs(hdr->numanswers); |
JBRYU | 0:0df3300689d2 | 597 | |
JBRYU | 0:0df3300689d2 | 598 | MDBG("resolver: flags1=0x%02X flags2=0x%02X nquestions=%d,\ |
JBRYU | 0:0df3300689d2 | 599 | nanswers=%d, nauthrr=%d, nextrarr=%d\n",\ |
JBRYU | 0:0df3300689d2 | 600 | hdr->flags1, hdr->flags2, (uint8_t) nquestions, (uint8_t) nanswers,\ |
JBRYU | 0:0df3300689d2 | 601 | (uint8_t) ntohs(hdr->numauthrr),\ |
JBRYU | 0:0df3300689d2 | 602 | (uint8_t) ntohs(hdr->numextrarr)); |
JBRYU | 0:0df3300689d2 | 603 | |
JBRYU | 0:0df3300689d2 | 604 | if(hdr->id != 0) |
JBRYU | 0:0df3300689d2 | 605 | { |
JBRYU | 0:0df3300689d2 | 606 | return; |
JBRYU | 0:0df3300689d2 | 607 | } |
JBRYU | 0:0df3300689d2 | 608 | |
JBRYU | 0:0df3300689d2 | 609 | /** ANSWER HANDLING SECTION ************************************************/ |
JBRYU | 0:0df3300689d2 | 610 | struct dns_question* question = (struct dns_question *)skip_name(queryptr); |
JBRYU | 0:0df3300689d2 | 611 | |
JBRYU | 0:0df3300689d2 | 612 | uint16_t type; |
JBRYU | 0:0df3300689d2 | 613 | |
JBRYU | 0:0df3300689d2 | 614 | if (is_request) |
JBRYU | 0:0df3300689d2 | 615 | { |
JBRYU | 0:0df3300689d2 | 616 | char* name; |
JBRYU | 0:0df3300689d2 | 617 | |
JBRYU | 0:0df3300689d2 | 618 | memset(&g_queries, 0, sizeof(QR_MAP)); |
JBRYU | 0:0df3300689d2 | 619 | |
JBRYU | 0:0df3300689d2 | 620 | while (nquestions--) |
JBRYU | 0:0df3300689d2 | 621 | { |
JBRYU | 0:0df3300689d2 | 622 | type = ntohs(question->type); |
JBRYU | 0:0df3300689d2 | 623 | name = decode_name(queryptr, (char*)hdr); |
JBRYU | 0:0df3300689d2 | 624 | |
JBRYU | 0:0df3300689d2 | 625 | if ((type & DNS_TYPE_PTR) == DNS_TYPE_PTR) |
JBRYU | 0:0df3300689d2 | 626 | { |
JBRYU | 0:0df3300689d2 | 627 | if (strncmp((const char*)name, |
JBRYU | 0:0df3300689d2 | 628 | (const char*)&SD_domains.elements[0].serv_len, |
JBRYU | 0:0df3300689d2 | 629 | SD_domains.elements[0].serv_len + 1) == 0) |
JBRYU | 0:0df3300689d2 | 630 | { |
JBRYU | 0:0df3300689d2 | 631 | MDBG("recv PTR request\n"); |
JBRYU | 0:0df3300689d2 | 632 | g_queries.reqs[g_queries.numbers] = DNS_TYPE_PTR; |
JBRYU | 0:0df3300689d2 | 633 | g_queries.numbers++; |
JBRYU | 0:0df3300689d2 | 634 | } |
JBRYU | 0:0df3300689d2 | 635 | } |
JBRYU | 0:0df3300689d2 | 636 | |
JBRYU | 0:0df3300689d2 | 637 | if ((type & DNS_TYPE_SRV) == DNS_TYPE_SRV) |
JBRYU | 0:0df3300689d2 | 638 | { |
JBRYU | 0:0df3300689d2 | 639 | if ((strncmp((const char*)name, |
JBRYU | 0:0df3300689d2 | 640 | (const char*)&SD_domains.elements[0].inst_len, |
JBRYU | 0:0df3300689d2 | 641 | SD_domains.elements[0].inst_len + 1) == 0) && |
JBRYU | 0:0df3300689d2 | 642 | (strncmp((const char*)(name + SD_domains.elements[0].inst_len+1), |
JBRYU | 0:0df3300689d2 | 643 | (const char*)&SD_domains.elements[0].serv_len, |
JBRYU | 0:0df3300689d2 | 644 | SD_domains.elements[0].serv_len+1) == 0)) |
JBRYU | 0:0df3300689d2 | 645 | { |
JBRYU | 0:0df3300689d2 | 646 | MDBG("recv SRV request\n"); |
JBRYU | 0:0df3300689d2 | 647 | g_queries.reqs[g_queries.numbers] = DNS_TYPE_SRV; |
JBRYU | 0:0df3300689d2 | 648 | g_queries.numbers++; |
JBRYU | 0:0df3300689d2 | 649 | } |
JBRYU | 0:0df3300689d2 | 650 | } |
JBRYU | 0:0df3300689d2 | 651 | |
JBRYU | 0:0df3300689d2 | 652 | if ((type & DNS_TYPE_TXT) == DNS_TYPE_TXT) |
JBRYU | 0:0df3300689d2 | 653 | { |
JBRYU | 0:0df3300689d2 | 654 | if ((strncmp((const char*)name, |
JBRYU | 0:0df3300689d2 | 655 | (const char*)&SD_domains.elements[0].inst_len, |
JBRYU | 0:0df3300689d2 | 656 | SD_domains.elements[0].inst_len + 1) == 0) && |
JBRYU | 0:0df3300689d2 | 657 | (strncmp((const char*)(name + SD_domains.elements[0].inst_len+1), |
JBRYU | 0:0df3300689d2 | 658 | (const char*)&SD_domains.elements[0].serv_len, |
JBRYU | 0:0df3300689d2 | 659 | SD_domains.elements[0].serv_len+1) == 0)) |
JBRYU | 0:0df3300689d2 | 660 | { |
JBRYU | 0:0df3300689d2 | 661 | MDBG("recv TXT request\n"); |
JBRYU | 0:0df3300689d2 | 662 | g_queries.reqs[g_queries.numbers] = DNS_TYPE_TXT; |
JBRYU | 0:0df3300689d2 | 663 | g_queries.numbers++; |
JBRYU | 0:0df3300689d2 | 664 | } |
JBRYU | 0:0df3300689d2 | 665 | } |
JBRYU | 0:0df3300689d2 | 666 | |
JBRYU | 0:0df3300689d2 | 667 | if ((type & DNS_TYPE_A) == DNS_TYPE_A) |
JBRYU | 0:0df3300689d2 | 668 | { |
JBRYU | 0:0df3300689d2 | 669 | if ((strncmp((const char*)name, |
JBRYU | 0:0df3300689d2 | 670 | (const char*)&SD_domains.elements[0].inst_len, |
JBRYU | 0:0df3300689d2 | 671 | SD_domains.elements[0].inst_len + 1) == 0) && |
JBRYU | 0:0df3300689d2 | 672 | (strncmp((const char*)(name + SD_domains.elements[0].inst_len+1), |
JBRYU | 0:0df3300689d2 | 673 | (const char*)&SD_domains.elements[0].domain_len, |
JBRYU | 0:0df3300689d2 | 674 | SD_domains.elements[0].domain_len+1) == 0)) |
JBRYU | 0:0df3300689d2 | 675 | { |
JBRYU | 0:0df3300689d2 | 676 | MDBG("recv AAAA request\n"); |
JBRYU | 0:0df3300689d2 | 677 | g_queries.reqs[g_queries.numbers] = DNS_TYPE_A; |
JBRYU | 0:0df3300689d2 | 678 | g_queries.numbers++; |
JBRYU | 0:0df3300689d2 | 679 | } |
JBRYU | 0:0df3300689d2 | 680 | } |
JBRYU | 0:0df3300689d2 | 681 | |
JBRYU | 0:0df3300689d2 | 682 | queryptr = (char*)question + sizeof(struct dns_question); |
JBRYU | 0:0df3300689d2 | 683 | question = (struct dns_question *)skip_name(queryptr); |
JBRYU | 0:0df3300689d2 | 684 | } |
JBRYU | 0:0df3300689d2 | 685 | |
JBRYU | 0:0df3300689d2 | 686 | if (g_queries.numbers) |
JBRYU | 0:0df3300689d2 | 687 | send_dns_ans(hdr); |
JBRYU | 0:0df3300689d2 | 688 | } |
JBRYU | 0:0df3300689d2 | 689 | else |
JBRYU | 0:0df3300689d2 | 690 | { |
JBRYU | 0:0df3300689d2 | 691 | if (strncmp((const char*)queryptr, |
JBRYU | 0:0df3300689d2 | 692 | (const char*)&SD_domains.elements[0].inst_len, |
JBRYU | 0:0df3300689d2 | 693 | SD_domains.elements[0].inst_len + 1) == 0) |
JBRYU | 0:0df3300689d2 | 694 | { |
JBRYU | 0:0df3300689d2 | 695 | type = ntohs(question->type); |
JBRYU | 0:0df3300689d2 | 696 | if (type == DNS_TYPE_A || type == DNS_TYPE_A) |
JBRYU | 0:0df3300689d2 | 697 | { |
JBRYU | 0:0df3300689d2 | 698 | char instance_number[4]; |
JBRYU | 0:0df3300689d2 | 699 | sprintf(instance_number, "%.2d%.2X", |
JBRYU | 0:0df3300689d2 | 700 | (uint8_t)(rand()%100), |
JBRYU | 0:0df3300689d2 | 701 | IP_byte[3]); |
JBRYU | 0:0df3300689d2 | 702 | register_service(instance_number); |
JBRYU | 0:0df3300689d2 | 703 | query_domain(); |
JBRYU | 0:0df3300689d2 | 704 | } |
JBRYU | 0:0df3300689d2 | 705 | } |
JBRYU | 0:0df3300689d2 | 706 | } |
JBRYU | 0:0df3300689d2 | 707 | |
JBRYU | 0:0df3300689d2 | 708 | } |
JBRYU | 0:0df3300689d2 | 709 | } |
JBRYU | 0:0df3300689d2 | 710 | #endif |
JBRYU | 0:0df3300689d2 | 711 |