Set TTL to the new value when updating cached service entry
[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_FLUSH             0x8000
37 #define CLASS_UNICAST           0x8000
38 #define CLASS_IN                0x0001
39
40 #define MAX_NAME_LEN            8096
41 #define MAX_DATA_LEN            8096
42
43 #define C_DNS_SD                "_services._dns-sd._udp.local"
44
45 struct dns_header {
46         uint16_t id;
47         uint16_t flags;
48         uint16_t questions;
49         uint16_t answers;
50         uint16_t authority;
51         uint16_t additional;
52 };
53
54 struct dns_srv_data {
55         uint16_t priority;
56         uint16_t weight;
57         uint16_t port;
58 } __attribute__((packed));
59
60 struct dns_answer {
61         uint16_t type;
62         uint16_t class;
63         uint32_t ttl;
64         uint16_t rdlength;
65 } __attribute__((packed));
66
67 struct dns_question {
68         uint16_t type;
69         uint16_t class;
70 } __attribute__((packed));
71
72 struct interface;
73 extern int cfg_proto;
74 extern int cfg_no_subnet;
75
76 void dns_send_question(struct interface *iface, const char *question, int type, int multicast);
77 void dns_init_answer(void);
78 void dns_add_answer(int type, const uint8_t *rdata, uint16_t rdlength, int ttl);
79 void dns_send_answer(struct interface *iface, const char *answer);
80 void dns_reply_a(struct interface *iface, int ttl);
81 const char* dns_type_string(uint16_t type);
82 void dns_handle_packet(struct interface *iface, struct sockaddr *s, uint16_t port, uint8_t *buf, int len);
83
84 #endif