dnscrypto-proxy: Update to release 1.3.0
[tomato.git] / release / src / router / dnscrypt / src / proxy / dnscrypt_proxy.h
blob82c7c36168fa4bcfd8b91300f4c2315b240a90a4
2 #ifndef __DNSCRYPT_PROXY_H__
3 #define __DNSCRYPT_PROXY_H__ 1
5 #include <sys/types.h>
7 #include <stdint.h>
9 #include <event2/event.h>
10 #include <event2/listener.h>
12 #include "app.h"
13 #include "cert.h"
14 #include "dnscrypt_client.h"
15 #include "queue.h"
16 #include "sodium.h"
18 #ifndef DNS_QUERY_TIMEOUT
19 # define DNS_QUERY_TIMEOUT 10
20 #endif
22 #define DNS_MAX_PACKET_SIZE_UDP_RECV (65536U - 20U - 8U)
23 #define DNS_MAX_PACKET_SIZE_UDP_SEND 512U
25 #if DNS_MAX_PACKET_SIZE_UDP_RECV > DNS_MAX_PACKET_SIZE_UDP_SEND
26 # define DNS_MAX_PACKET_SIZE_UDP DNS_MAX_PACKET_SIZE_UDP_RECV
27 #else
28 # define DNS_MAX_PACKET_SIZE_UDP DNS_MAX_PACKET_SIZE_UDP_SEND
29 #endif
31 #ifndef DNS_DEFAULT_STANDARD_DNS_PORT
32 # define DNS_DEFAULT_STANDARD_DNS_PORT "53"
33 #endif
34 #ifndef DNS_DEFAULT_LOCAL_PORT
35 # define DNS_DEFAULT_LOCAL_PORT DNS_DEFAULT_STANDARD_DNS_PORT
36 #endif
37 #ifndef DNS_DEFAULT_RESOLVER_PORT
38 # define DNS_DEFAULT_RESOLVER_PORT "443"
39 #endif
41 #define DNS_HEADER_SIZE 12U
42 #define DNS_FLAGS_TC 2U
43 #define DNS_FLAGS_QR 128U
44 #define DNS_FLAGS2_RA 128U
46 #define DNS_CLASS_IN 1U
47 #define DNS_TYPE_TXT 16U
48 #define DNS_TYPE_OPT 41U
50 #define DNS_OFFSET_QUESTION DNS_HEADER_SIZE
51 #define DNS_OFFSET_FLAGS 2U
52 #define DNS_OFFSET_FLAGS2 3U
53 #define DNS_OFFSET_QDCOUNT 4U
54 #define DNS_OFFSET_ANCOUNT 6U
55 #define DNS_OFFSET_NSCOUNT 8U
56 #define DNS_OFFSET_ARCOUNT 10U
58 #define DNS_OFFSET_EDNS_TYPE 0U
59 #define DNS_OFFSET_EDNS_PAYLOAD_SIZE 2U
61 #define DNS_DEFAULT_EDNS_PAYLOAD_SIZE 1252U
63 typedef TAILQ_HEAD(TCPRequestQueue_, TCPRequest_) TCPRequestQueue;
64 typedef TAILQ_HEAD(UDPRequestQueue_, UDPRequest_) UDPRequestQueue;
66 typedef struct ProxyContext_ {
67 uint8_t dnscrypt_magic_query[DNSCRYPT_MAGIC_QUERY_LEN];
68 uint8_t provider_publickey[crypto_sign_ed25519_PUBLICKEYBYTES];
69 uint8_t resolver_publickey[crypto_box_PUBLICKEYBYTES];
70 DNSCryptClient dnscrypt_client;
71 CertUpdater cert_updater;
72 struct sockaddr_storage local_sockaddr;
73 struct sockaddr_storage resolver_sockaddr;
74 TCPRequestQueue tcp_request_queue;
75 UDPRequestQueue udp_request_queue;
76 AppContext *app_context;
77 struct event_base *event_loop;
78 const char *local_ip;
79 const char *log_file;
80 const char *pid_file;
81 const char *provider_name;
82 const char *provider_publickey_s;
83 const char *resolver_ip;
84 struct evconnlistener *tcp_conn_listener;
85 struct event *tcp_accept_timer;
86 struct event *udp_listener_event;
87 struct event *udp_proxy_resolver_event;
88 char *user_dir;
89 ev_socklen_t local_sockaddr_len;
90 ev_socklen_t resolver_sockaddr_len;
91 size_t edns_payload_size;
92 evutil_socket_t udp_listener_handle;
93 evutil_socket_t udp_proxy_resolver_handle;
94 #ifndef _WIN32
95 uid_t user_id;
96 gid_t user_group;
97 #endif
98 unsigned int connections_count;
99 unsigned int connections_count_max;
100 int log_fd;
101 int max_log_level;
102 _Bool daemonize;
103 _Bool listeners_started;
104 _Bool tcp_only;
105 } ProxyContext;
107 int dnscrypt_proxy_start_listeners(ProxyContext * const proxy_context);
109 #endif