Changes to update Tomato RAF.
[tomato.git] / release / src / router / dnscrypt / src / proxy / dnscrypt_proxy.h
blob10e48eba8db3cac7e15435f164eae31d111f3f3b
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 "crypto_box.h"
15 #include "crypto_sign_ed25519.h"
16 #include "dnscrypt_client.h"
17 #include "queue.h"
19 #ifndef DNS_QUERY_TIMEOUT
20 # define DNS_QUERY_TIMEOUT 10
21 #endif
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
28 #else
29 # define DNS_MAX_PACKET_SIZE_UDP DNS_MAX_PACKET_SIZE_UDP_SEND
30 #endif
32 #ifndef DNS_DEFAULT_LOCAL_PORT
33 # define DNS_DEFAULT_LOCAL_PORT "53"
34 #endif
35 #ifndef DNS_DEFAULT_RESOLVER_PORT
36 # define DNS_DEFAULT_RESOLVER_PORT "443"
37 #endif
38 #ifndef DNS_DEFAULT_STANDARD_DNS_PORT
39 # define DNS_DEFAULT_STANDARD_DNS_PORT "53"
40 #endif
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;
79 const char *local_ip;
80 const char *local_port;
81 const char *log_file;
82 const char *pid_file;
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;
91 char *user_dir;
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;
97 #ifndef _WIN32
98 uid_t user_id;
99 gid_t user_group;
100 #endif
101 unsigned int connections_count;
102 unsigned int connections_count_max;
103 int log_fd;
104 _Bool daemonize;
105 _Bool listeners_started;
106 _Bool tcp_only;
107 } ProxyContext;
109 int dnscrypt_proxy_start_listeners(ProxyContext * const proxy_context);
111 #endif