silently drop unicast questions that dont originate from port 5353
[project/mdnsd.git] / dns.h
1 /*
2 * Copyright (C) 2014 John Crispin <blogic@openwrt.org>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License version 2.1
6 * as published by the Free Software Foundation
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14 #ifndef _DNS_H__
15 #define _DNS_H__
16
17 #include <stdint.h>
18 #include <arpa/inet.h>
19
20 #define FLAG_RESPONSE 0x8000
21 #define FLAG_AUTHORATIVE 0x0400
22
23 #define TYPE_A 0x0001
24 #define TYPE_PTR 0x000C
25 #define TYPE_TXT 0x0010
26 #define TYPE_AAAA 0x001c
27 #define TYPE_SRV 0x0021
28 #define TYPE_ANY 0x00ff
29
30 #define IS_COMPRESSED(x) ((x & 0xc0) == 0xc0)
31
32 #define MCAST_ADDR "224.0.0.251"
33 #define MCAST_ADDR6 "ff02::fb"
34 #define MCAST_PORT 5353
35
36 #define CLASS_UNICAST 0x8000
37 #define CLASS_IN 0x0001
38
39 #define MAX_NAME_LEN 8096
40 #define MAX_DATA_LEN 8096
41
42 #define C_DNS_SD "_services._dns-sd._udp.local"
43
44 struct dns_header {
45 uint16_t id;
46 uint16_t flags;
47 uint16_t questions;
48 uint16_t answers;
49 uint16_t authority;
50 uint16_t additional;
51 };
52
53 struct dns_srv_data {
54 uint16_t priority;
55 uint16_t weight;
56 uint16_t port;
57 } __attribute__((packed, aligned(2)));
58
59 struct dns_answer {
60 uint16_t type;
61 uint16_t class;
62 uint32_t ttl;
63 uint16_t rdlength;
64 } __attribute__((packed, aligned(2)));
65
66 struct dns_question {
67 uint16_t type;
68 uint16_t class;
69 } __attribute__((packed, aligned(2)));
70
71 struct interface;
72 extern int cfg_proto;
73
74 void dns_send_question(struct interface *iface, const char *question, int type, int unicast);
75 void dns_init_answer(void);
76 void dns_add_answer(int type, const uint8_t *rdata, uint16_t rdlength, int ttl);
77 void dns_send_answer(struct interface *iface, const char *answer);
78 const char* dns_type_string(uint16_t type);
79 void dns_handle_packet(struct interface *iface, struct sockaddr *s, uint16_t port, uint8_t *buf, int len);
80
81 #endif