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