1 #ifndef UDP_REQUEST_H
2 #define UDP_REQUEST_H
3 
4 #include "dnscrypt.h"
5 
6 struct context;
7 struct cert_;
8 
9 typedef struct UDPRequestStatus_ {
10     bool is_dying:1;
11     bool is_in_queue:1;
12 } UDPRequestStatus;
13 
14 typedef struct UDPRequest_ {
15     RB_ENTRY(UDPRequest_) queue;
16     struct context *context;
17     struct event *sendto_retry_timer;
18     struct event *timeout_timer;
19     uint64_t hash;
20     uint16_t id;
21     uint16_t gen;
22     uint16_t len;
23     uint8_t client_nonce[crypto_box_HALF_NONCEBYTES];
24     uint8_t nmkey[crypto_box_BEFORENMBYTES];
25     struct sockaddr_storage client_sockaddr;
26     evutil_socket_t client_proxy_handle;
27     ev_socklen_t client_sockaddr_len;
28     UDPRequestStatus status;
29     unsigned char retries;
30     const struct cert_ *cert;
31     bool is_dnscrypted;
32     bool is_blocked;
33 } UDPRequest;
34 
35 typedef TAILQ_HEAD(TCPRequestQueue_, TCPRequest_) TCPRequestQueue;
36 typedef RB_HEAD(UDPRequestQueue_, UDPRequest_) UDPRequestQueue;
37 
38 int udp_listener_bind(struct context *c);
39 int udp_listener_start(struct context *c);
40 void udp_listener_stop(struct context *c);
41 int udp_listener_kill_oldest_request(struct context *c);
42 
43 #endif
44