2 #ifndef __DNSCRYPT_PROXY_H__
3 #define __DNSCRYPT_PROXY_H__ 1
9 #include <event2/event.h>
10 #include <event2/listener.h>
14 #include "crypto_box.h"
15 #include "crypto_sign_ed25519.h"
16 #include "dnscrypt_client.h"
19 #ifndef DNS_QUERY_TIMEOUT
20 # define DNS_QUERY_TIMEOUT 10
23 #define DNS_MAX_PACKET_SIZE_UDP_RECV (65536U - 20U - 8U)
24 #define DNS_MAX_PACKET_SIZE_UDP_SEND 512U
26 #if DNS_MAX_PACKET_SIZE_UDP_RECV > DNS_MAX_PACKET_SIZE_UDP_SEND
27 # define DNS_MAX_PACKET_SIZE_UDP DNS_MAX_PACKET_SIZE_UDP_RECV
29 # define DNS_MAX_PACKET_SIZE_UDP DNS_MAX_PACKET_SIZE_UDP_SEND
32 #ifndef DNS_DEFAULT_LOCAL_PORT
33 # define DNS_DEFAULT_LOCAL_PORT "53"
35 #ifndef DNS_DEFAULT_RESOLVER_PORT
36 # define DNS_DEFAULT_RESOLVER_PORT "443"
38 #ifndef DNS_DEFAULT_STANDARD_DNS_PORT
39 # define DNS_DEFAULT_STANDARD_DNS_PORT "53"
42 #define DNS_HEADER_SIZE 12U
43 #define DNS_FLAGS_TC 2U
44 #define DNS_FLAGS_QR 128U
45 #define DNS_FLAGS2_RA 128U
47 #define DNS_CLASS_IN 1U
48 #define DNS_TYPE_TXT 16U
49 #define DNS_TYPE_OPT 41U
51 #define DNS_OFFSET_QUESTION DNS_HEADER_SIZE
52 #define DNS_OFFSET_FLAGS 2U
53 #define DNS_OFFSET_FLAGS2 3U
54 #define DNS_OFFSET_QDCOUNT 4U
55 #define DNS_OFFSET_ANCOUNT 6U
56 #define DNS_OFFSET_NSCOUNT 8U
57 #define DNS_OFFSET_ARCOUNT 10U
59 #define DNS_OFFSET_EDNS_TYPE 0U
60 #define DNS_OFFSET_EDNS_PAYLOAD_SIZE 2U
62 #define DNS_DEFAULT_EDNS_PAYLOAD_SIZE 1280U
64 typedef TAILQ_HEAD(TCPRequestQueue_
, TCPRequest_
) TCPRequestQueue
;
65 typedef TAILQ_HEAD(UDPRequestQueue_
, UDPRequest_
) UDPRequestQueue
;
67 typedef struct ProxyContext_
{
68 uint8_t dnscrypt_magic_query
[DNSCRYPT_MAGIC_QUERY_LEN
];
69 uint8_t provider_publickey
[crypto_sign_ed25519_PUBLICKEYBYTES
];
70 uint8_t resolver_publickey
[crypto_box_PUBLICKEYBYTES
];
71 DNSCryptClient dnscrypt_client
;
72 CertUpdater cert_updater
;
73 struct sockaddr_storage local_sockaddr
;
74 struct sockaddr_storage resolver_sockaddr
;
75 TCPRequestQueue tcp_request_queue
;
76 UDPRequestQueue udp_request_queue
;
77 AppContext
*app_context
;
78 struct event_base
*event_loop
;
80 const char *local_port
;
83 const char *provider_name
;
84 const char *provider_publickey_s
;
85 const char *resolver_ip
;
86 const char *resolver_port
;
87 struct evconnlistener
*tcp_conn_listener
;
88 struct event
*tcp_accept_timer
;
89 struct event
*udp_listener_event
;
90 struct event
*udp_proxy_resolver_event
;
92 ev_socklen_t local_sockaddr_len
;
93 ev_socklen_t resolver_sockaddr_len
;
94 size_t edns_payload_size
;
95 evutil_socket_t udp_proxy_resolver_handle
;
96 evutil_socket_t udp_listener_handle
;
101 unsigned int connections_count
;
102 unsigned int connections_count_max
;
105 _Bool listeners_started
;
109 int dnscrypt_proxy_start_listeners(ProxyContext
* const proxy_context
);