1use std::future::Future;
2use std::net::SocketAddr;
3
4use hickory_proto::op::Message;
5use serde::Deserialize;
6
7mod dummy_keys;
8mod handler;
9#[cfg(test)]
10mod tls;
11mod utils;
12
13pub use handler::get_dns_listener;
14pub use handler::DNSError;
15
16#[derive(Debug, Deserialize, Clone)]
17#[serde(rename_all = "kebab-case")]
18pub struct DoHConfig {
19 pub addr: SocketAddr,
20 pub ca_cert: DnsServerCert,
21 pub ca_key: DnsServerKey,
22 pub hostname: Option<String>,
23}
24
25#[derive(Debug, Deserialize, Clone)]
26#[serde(rename_all = "kebab-case")]
27pub struct DoH3Config {
28 pub addr: SocketAddr,
29 pub ca_cert: DnsServerCert,
30 pub ca_key: DnsServerKey,
31 pub hostname: Option<String>,
32}
33
34#[derive(Debug, Deserialize, Clone)]
35#[serde(rename_all = "kebab-case")]
36pub struct DoTConfig {
37 pub addr: SocketAddr,
38 pub ca_cert: DnsServerCert,
39 pub ca_key: DnsServerKey,
40}
41
42pub type DnsServerKey = Option<String>;
43pub type DnsServerCert = Option<String>;
44
45#[derive(Debug, Default, Clone)]
46pub struct DNSListenAddr {
47 pub udp: Option<SocketAddr>,
48 pub tcp: Option<SocketAddr>,
49 pub doh: Option<DoHConfig>,
50 pub dot: Option<DoTConfig>,
51 pub doh3: Option<DoH3Config>,
52}
53
54#[cfg_attr(test, mockall::automock)]
55pub trait DnsMessageExchanger {
56 fn ipv6(&self) -> bool;
57 fn exchange(&self, message: &Message)
58 -> impl Future<Output = Result<Message, DNSError>> + Send;
59}