djbdnscurve6 51
djbdnscurve6
Loading...
Searching...
No Matches
dns.h
Go to the documentation of this file.
1/*
2 * Revision 20260202, Erwin Hoffmann
3 * - Added IP6_64PREFIX_GLOBAL macro
4 * Revision 20231219, Erwin Hoffmann
5 * - MSGSIZE 1232 byte according to DNS Flag Day recommendation
6 * - Added additional return codes
7 * Revision 20210908, Erwin Hoffmann
8 * - included MINMSGSIZE, MAXMSGSIZE
9 * - included TCP_BACKLOG
10 * Revision 20210829, Erwin Hoffmann
11 * - added randombind4 for dns_transmit.c
12 * Revision 20180606, Erwin Hoffmann
13 * - struct dns_transmit is now curve-enabled
14 * Revision 20180222, Erwin Hoffmann
15 * - we consider in total 32 NS IPs (IPv4 + IPv6)
16 * - added dns_transmit_start6
17 * - added uint32 scope_ids[32],
18 * the initial NS scopes read from /etc/resolv.conf et al.
19 * Revision 20180118, Erwin Hoffmann
20 * - included MSGSIZE for DNS messages (instead of MTUSIZE)
21*/
22#ifndef DNS_H
23#define DNS_H
24
25#include "stralloc.h"
26#include "iopause.h"
27#include "taia.h"
28#include "ip.h"
29
30/* Note: The conventions are subject of change in forthcoming versions */
31
32#define DNS_NXD 0 /* NXDOMAIN, NODATA */
33#define DNS_MEM -1 /* out of memory; fatal */
34#define DNS_ERR -2 /* parsing errors and others */
35#define DNS_COM -3 /* (socket) communication errors - SERVFAIL */
36#define DNS_INT -4 /* internal errors */
37#define DNS_SOFT -5 /* DNS_ERR or DNS_COM */
38#define DNS_HARD -6 /* DNS loop problem */
39
40#define MSGSIZE MTUSIZE - 48 /* DNS Flag Day 2020 recommendation */
41#define MINMSGSIZE 512 /* RFC 1035 */
42#define MAXMSGSIZE 4096 /* 4069 seen with EDNS0 */
43#define MAXSEGMENT 65535 /* Max TCP buffer size */
44#define MAX_TTL 655360 /* Default TTL for static DNS objects */
45
46#define QUERY_MAXNS 32 /* 16 IPv4 + 16 IPv6 NS */
47#define QUERY_MAXIPLEN 512 /* QUERY_MAXNS * 16 */
48#define TCP_BACKLOG 20 /* the number of TCP connections supported simultaneously */
49#define FQDN_LEN 255 /* length of FQDN including all labels + dots */
50
51/* Note: These following definitions are subject of change */
52
53#define DNS_C_IN "\0\1"
54#define DNS_C_ANY "\0\377"
55
56#define DNS_T_A "\0\1"
57#define DNS_T_NS "\0\2"
58#define DNS_T_CNAME "\0\5"
59#define DNS_T_SOA "\0\6"
60#define DNS_T_PTR "\0\14"
61#define DNS_T_HINFO "\0\15"
62#define DNS_T_MX "\0\17"
63#define DNS_T_TXT "\0\20"
64#define DNS_T_RP "\0\21"
65#define DNS_T_SIG "\0\30"
66#define DNS_T_KEY "\0\31"
67#define DNS_T_AAAA "\0\34"
68#define DNS_T_SRV "\0\41"
69#define DNS_T_NAPTR "\0\43"
70#define DNS_T_CERT "\0\45"
71#define DNS_T_OPT "\0\51"
72#define DNS_T_DS "\0\53"
73#define DNS_T_SSHFP "\0\54"
74#define DNS_T_IPSECKEY "\0\55"
75#define DNS_T_RRSIG "\0\56"
76#define DNS_T_NSEC "\0\57"
77#define DNS_T_DNSKEY "\0\60"
78#define DNS_T_NSEC3 "\0\62"
79#define DNS_T_NSEC3PARAM "\0\63"
80#define DNS_T_TLSA "\0\64"
81#define DNS_T_HIP "\0\67"
82#define DNS_T_OPENPGPKEY "\0\75"
83#define DNS_T_SVCB "\0\100"
84#define DNS_T_HTTPS "\0\101"
85#define DNS_T_SPF "\0\143"
86#define DNS_T_AXFR "\0\374"
87#define DNS_T_ANY "\0\377"
88#define DNS_T_CAA "\1\1"
89
90#define LOCALHOST "localhost" /* no clear distinction IPv4/IPv6 */
91#define IP4_LOOPBACK "ip4-loopback"
92#define IP6_LOOPBACK "ip6-loopback"
93#define IP6_64PREFIX_GLOBAL \
94"\000\144\377\233\000\000\000\000\000\000\000\000"
95
97 char *query; /* 0, or dynamically allocated */
98 unsigned int querylen;
99 char *packet; /* 0, or dynamically allocated */
100 unsigned int packetlen;
101 int s1; /* 0, or 1 + an open file descriptor */
104 unsigned int udploop;
105 unsigned int curserver;
106 struct taia deadline;
107 unsigned int pos;
108 const char *name; /* query name */
109 const char *servers;
110 const char *keys;
111 const char *pubkey;
112 const char *suffix; /* domain name */
113 char nonce[12];
114 uint32 scope_id;
115 char localip[16];
116 char qtype[2];
117} ;
118
119/* General */
120
121extern int flagdnsoptrr;
122
123extern void dns_random_init(const char [128]);
124extern unsigned int dns_random(unsigned int);
125
126extern void dns_domain_free(char **);
127extern int dns_domain_copy(char **,const char *);
128extern unsigned int dns_domain_length(const char *);
129extern int dns_domain_equal(const char *,const char *);
130extern int dns_domain_suffix(const char *,const char *);
131extern unsigned int dns_domain_suffixpos(const char *,const char *);
132extern int dns_domain_fromdot(char **,const char *,unsigned int);
133extern int dns_domain_todot_cat(stralloc *,const char *);
134
135extern unsigned int dns_packet_copy(const char *,unsigned int,unsigned int,char *,unsigned int);
136extern unsigned int dns_packet_getname(const char *,unsigned int,unsigned int,char **);
137extern unsigned int dns_packet_skipname(const char *,unsigned int,unsigned int);
138
139extern struct dns_transmit dns_resolve_tx;
140extern int dns_transmit_start(struct dns_transmit *,const char [QUERY_MAXIPLEN],int,const char *,const char [2],const char [16]);
141extern void dns_transmit_free(struct dns_transmit *);
142extern void dns_transmit_io(struct dns_transmit *,iopause_fd *,struct taia *);
143extern int dns_transmit_get(struct dns_transmit *,const iopause_fd *,const struct taia *);
144
145/* Common IPv4 + IPv6 */
146
147extern int dns_resolvconfip(char [QUERY_MAXIPLEN],uint32 [QUERY_MAXNS]);
148extern int dns_resolvconfrewrite(stralloc *);
149extern int dns_resolve(const char *,const char [2]);
150
151extern int dns_name(stralloc *,const char [16]);
152extern int dns_name_packet(stralloc *,const char *,unsigned int);
153extern int dns_txt_packet(stralloc *,const char *,unsigned int);
154extern int dns_txt(stralloc *,const stralloc *);
155extern int dns_mx_packet(stralloc *,const char *,unsigned int);
156extern int dns_mx(stralloc *,const stralloc *);
157extern int dns_ip_qualify(stralloc *,stralloc *,const stralloc *);
158
159/* IPv4 specific */
160
161extern int dns_ip4_packet(stralloc *,const char *,unsigned int);
162extern int dns_ip4(stralloc *,stralloc *);
163extern void dns_sortip4(char *,unsigned int);
164
165extern int dns_ip4_qualify_rules(stralloc *,stralloc *,const stralloc *,const stralloc *);
166extern int dns_ip4_qualify(stralloc *,stralloc *,const stralloc *);
167
168#define DNS_NAME4_DOMAIN 32
169extern int dns_name4_domain(char *,const char [4]);
170extern int dns_name4(stralloc *,const char [4]);
171
172/* IPv6 specific */
173
174extern int dns_ip6_packet(stralloc *,const char *,unsigned int);
175extern int dns_ip6(stralloc *,stralloc *);
176extern void dns_sortip6(char *,unsigned int);
177
178extern int dns_ip6_qualify_rules(stralloc *,stralloc *,const stralloc *,const stralloc *);
179extern int dns_ip6_qualify(stralloc *,stralloc *,const stralloc *);
180
181#define DNS_NAME6_DOMAIN (5*16)
182extern int dns_name6_domain(char *,const char [16]);
183extern int dns_name6(stralloc *,const char [16]);
184
185extern int dns_transmit_start6(struct dns_transmit *,const char [QUERY_MAXIPLEN],int,
186 const char *,const char [2],const char [16],const uint32 [QUERY_MAXNS]);
187
188extern unsigned int dns_packet_edns0(const char [12],const char *,const int,unsigned int);
189
190extern unsigned int dns_pseudo_rr(char *);
191
192/* General */
193
194extern void socketfree(struct dns_transmit *);
195extern void queryfree(struct dns_transmit *);
196extern void packetfree(struct dns_transmit *);
197extern int randombind(struct dns_transmit *);
198extern int randombind4(struct dns_transmit *);
199extern int serverwantstcp(const char *,unsigned int);
200extern int serverfailed(const char *,unsigned int,char *);
201extern int getscopeid(const struct dns_transmit *,const char *);
202extern int firstudp(struct dns_transmit *);
203extern int nextudp(struct dns_transmit *);
204extern int firsttcp(struct dns_transmit *);
205extern int nexttcp(struct dns_transmit *);
206
207#endif
void dns_transmit_free(struct dns_transmit *)
Definition: dns_transmit.c:95
void dns_transmit_io(struct dns_transmit *, iopause_fd *, struct taia *)
Definition: dns_transmit.c:279
int dns_ip4_qualify_rules(stralloc *, stralloc *, const stralloc *, const stralloc *)
Definition: dns_ipq.c:47
void dns_sortip4(char *, unsigned int)
Definition: dns_sortip.c:10
int serverwantstcp(const char *, unsigned int)
Definition: dns_transmit.c:29
int dns_transmit_start6(struct dns_transmit *, const char[QUERY_MAXIPLEN], int, const char *, const char[2], const char[16], const uint32[QUERY_MAXNS])
Definition: dns_transmit.c:270
int dns_transmit_start(struct dns_transmit *, const char[QUERY_MAXIPLEN], int, const char *, const char[2], const char[16])
Definition: dns_transmit.c:264
void socketfree(struct dns_transmit *)
Definition: dns_transmit.c:88
int dns_name4_domain(char *, const char[4])
unsigned int dns_packet_copy(const char *, unsigned int, unsigned int, char *, unsigned int)
Definition: dns_packet.c:8
int dns_ip4_packet(stralloc *, const char *, unsigned int)
Definition: dns_ip.c:9
int dns_ip4(stralloc *, stralloc *)
Definition: dns_ip.c:42
void packetfree(struct dns_transmit *)
Definition: dns_transmit.c:74
unsigned int dns_packet_edns0(const char[12], const char *, const int, unsigned int)
Definition: edns0.c:21
#define QUERY_MAXIPLEN
Definition: dns.h:47
int dns_domain_equal(const char *, const char *)
Definition: dns_domain.c:39
int serverfailed(const char *, unsigned int, char *)
Definition: dns_transmit.c:38
unsigned int dns_random(unsigned int)
Definition: dns_random.c:56
int dns_domain_fromdot(char **, const char *, unsigned int)
Definition: dns_dfd.c:6
int dns_name(stralloc *, const char[16])
Definition: dns_name.c:65
int dns_domain_todot_cat(stralloc *, const char *)
Definition: dns_dtda.c:11
int dns_ip_qualify(stralloc *, stralloc *, const stralloc *)
Definition: dns_ipq.c:228
int dns_resolve(const char *, const char[2])
Definition: dns_resolve.c:9
int firstudp(struct dns_transmit *)
Definition: dns_transmit.c:193
int dns_domain_copy(char **, const char *)
Definition: dns_domain.c:25
int nexttcp(struct dns_transmit *)
Definition: dns_transmit.c:256
void dns_sortip6(char *, unsigned int)
Definition: dns_sortip.c:25
int dns_domain_suffix(const char *, const char *)
Definition: dns_domain.c:50
int dns_name_packet(stralloc *, const char *, unsigned int)
Definition: dns_name.c:9
int firsttcp(struct dns_transmit *)
Definition: dns_transmit.c:250
void dns_random_init(const char[128])
Definition: dns_random.c:37
int dns_ip4_qualify(stralloc *, stralloc *, const stralloc *)
Definition: dns_ipq.c:109
unsigned int dns_pseudo_rr(char *)
unsigned int dns_packet_skipname(const char *, unsigned int, unsigned int)
Definition: dns_packet.c:18
void dns_domain_free(char **)
Definition: dns_domain.c:17
unsigned int dns_domain_length(const char *)
Definition: dns_domain.c:6
int dns_txt_packet(stralloc *, const char *, unsigned int)
Definition: dns_txt.c:6
int dns_ip6_qualify_rules(stralloc *, stralloc *, const stralloc *, const stralloc *)
Definition: dns_ipq.c:121
unsigned int dns_domain_suffixpos(const char *, const char *)
Definition: dns_domain.c:62
void queryfree(struct dns_transmit *)
Definition: dns_transmit.c:81
int dns_resolvconfrewrite(stralloc *)
Definition: dns_rcrw.c:115
int dns_ip6(stralloc *, stralloc *)
Definition: dns_ip.c:133
#define QUERY_MAXNS
Definition: dns.h:46
int dns_mx_packet(stralloc *, const char *, unsigned int)
Definition: dns_mx.c:8
int randombind(struct dns_transmit *)
Definition: dns_transmit.c:102
int dns_ip6_qualify(stralloc *, stralloc *, const stralloc *)
Definition: dns_ipq.c:157
unsigned int dns_packet_getname(const char *, unsigned int, unsigned int, char **)
Definition: dns_packet.c:35
int dns_mx(stralloc *, const stralloc *)
Definition: dns_mx.c:43
int dns_name6(stralloc *, const char[16])
Definition: dns_name.c:52
int dns_txt(stralloc *, const stralloc *)
Definition: dns_txt.c:53
struct dns_transmit dns_resolve_tx
Definition: dns_resolve.c:7
int dns_name4(stralloc *, const char[4])
Definition: dns_name.c:39
int dns_resolvconfip(char[QUERY_MAXIPLEN], uint32[QUERY_MAXNS])
Definition: dns_rcip.c:87
int randombind4(struct dns_transmit *)
Definition: dns_transmit.c:132
int nextudp(struct dns_transmit *)
Definition: dns_transmit.c:200
int dns_ip6_packet(stralloc *, const char *, unsigned int)
Definition: dns_ip.c:93
int dns_name6_domain(char *, const char[16])
int flagdnsoptrr
Definition: curvedns.c:20
int getscopeid(const struct dns_transmit *, const char *)
Definition: dns_transmit.c:18
int dns_transmit_get(struct dns_transmit *, const iopause_fd *, const struct taia *)
Definition: dns_transmit.c:296
uint32 scope_id
Definition: dns.h:114
unsigned int curserver
Definition: dns.h:105
char qtype[2]
Definition: dns.h:116
unsigned int udploop
Definition: dns.h:104
char localip[16]
Definition: dns.h:115
int flagrecursive
Definition: dns.h:103
int tcpstate
Definition: dns.h:102
const char * name
Definition: dns.h:108
char nonce[12]
Definition: dns.h:113
struct taia deadline
Definition: dns.h:106
const char * servers
Definition: dns.h:109
unsigned int packetlen
Definition: dns.h:100
const char * pubkey
Definition: dns.h:111
unsigned int querylen
Definition: dns.h:98
char * packet
Definition: dns.h:99
const char * suffix
Definition: dns.h:112
int s1
Definition: dns.h:101
const char * keys
Definition: dns.h:110
unsigned int pos
Definition: dns.h:107
char * query
Definition: dns.h:97