diff --git a/g3proxy/Cargo.toml b/g3proxy/Cargo.toml index 1c10e2ba..d2f2cb09 100644 --- a/g3proxy/Cargo.toml +++ b/g3proxy/Cargo.toml @@ -25,7 +25,7 @@ tokio = { workspace = true, features = ["rt-multi-thread", "rt", "signal", "sync tokio-util = { workspace = true, features = ["time"] } tokio-rustls.workspace = true rustls.workspace = true -quinn = { workspace = true, features = ["tls-rustls", "runtime-tokio"] } +quinn = { workspace = true, optional = true, features = ["tls-rustls", "runtime-tokio"] } tokio-openssl.workspace = true openssl.workspace = true openssl-probe = { workspace = true, optional = true } @@ -66,7 +66,7 @@ pyo3 = { workspace = true, features = ["auto-initialize"], optional = true } g3-compat.workspace = true g3-types = { workspace = true, features = ["auth-crypt", "rustls", "openssl", "acl-rule", "http", "route", "async-log", "json"] } g3-socket.workspace = true -g3-daemon = { workspace = true, features = ["quic"] } +g3-daemon.workspace = true g3-signal.workspace = true g3-datetime.workspace = true g3-statsd.workspace = true @@ -95,7 +95,7 @@ tokio-util = { workspace = true, features = ["io"] } rustc_version.workspace = true [features] -default = ["lua54", "python", "c-ares", "hickory", "geoip"] +default = ["lua54", "python", "c-ares", "hickory", "geoip", "quic"] lua = ["mlua"] luajit = ["lua", "mlua/luajit"] lua51 = ["lua", "mlua/lua51"] @@ -105,6 +105,7 @@ python = ["pyo3"] c-ares = ["g3-resolver/c-ares"] hickory = ["g3-resolver/hickory"] geoip = ["g3-geoip", "g3-yaml/geoip", "fixedbitset", "rustc-hash", "fnv"] +quic = ["g3-daemon/quic", "g3-resolver/quic", "dep:quinn"] vendored-openssl = ["openssl/vendored", "dep:openssl-probe"] vendored-tongsuo = ["openssl/tongsuo", "dep:openssl-probe", "g3-yaml/vendored-tongsuo", "g3-json/vendored-tongsuo"] vendored-c-ares = ["c-ares", "g3-resolver/vendored-c-ares"] diff --git a/g3proxy/build.rs b/g3proxy/build.rs index e74332bf..e1c06259 100644 --- a/g3proxy/build.rs +++ b/g3proxy/build.rs @@ -88,4 +88,8 @@ fn main() { if env::var("CARGO_FEATURE_GEOIP").is_ok() { println!("cargo:rustc-env=G3_GEOIP_FEATURE=geoip"); } + + if env::var("CARGO_FEATURE_QUIC").is_ok() { + println!("cargo:rustc-env=G3_QUIC_FEATURE=quinn"); + } } diff --git a/g3proxy/debian/rules b/g3proxy/debian/rules index 2747f7da..7843c1e9 100755 --- a/g3proxy/debian/rules +++ b/g3proxy/debian/rules @@ -17,7 +17,7 @@ override_dh_auto_clean: override_dh_auto_build: G3_PACKAGE_VERSION=$(DEB_VERSION) \ cargo build --frozen --offline --profile $(BUILD_PROFILE) \ - --no-default-features --features $(LUA_FEATURE),$(SSL_FEATURE),$(CARES_FEATURE),hickory,geoip \ + --no-default-features --features $(LUA_FEATURE),$(SSL_FEATURE),quic,$(CARES_FEATURE),hickory,geoip \ --package g3proxy --package g3proxy-ctl --package g3proxy-ftp --package g3proxy-lua --package g3proxy-geoip sh $(PACKAGE_NAME)/service/generate_systemd.sh diff --git a/g3proxy/g3proxy.spec b/g3proxy/g3proxy.spec index 105ea13e..d584e259 100644 --- a/g3proxy/g3proxy.spec +++ b/g3proxy/g3proxy.spec @@ -43,7 +43,7 @@ LUA_FEATURE=lua$LUA_VERSION SSL_FEATURE=$(sh scripts/package/detect_openssl_feature.sh) CARES_FEATURE=$(sh scripts/package/detect_c-ares_feature.sh) export CMAKE="%{cmake_real}" -cargo build --frozen --offline --profile %{build_profile} --no-default-features --features $LUA_FEATURE,$SSL_FEATURE,$CARES_FEATURE,hickory,geoip --package g3proxy --package g3proxy-ctl --package g3proxy-ftp --package g3proxy-lua --package g3proxy-geoip +cargo build --frozen --offline --profile %{build_profile} --no-default-features --features $LUA_FEATURE,$SSL_FEATURE,quic,$CARES_FEATURE,hickory,geoip --package g3proxy --package g3proxy-ctl --package g3proxy-ftp --package g3proxy-lua --package g3proxy-geoip sh %{name}/service/generate_systemd.sh diff --git a/g3proxy/src/build.rs b/g3proxy/src/build.rs index 99639c2d..9cbdc751 100644 --- a/g3proxy/src/build.rs +++ b/g3proxy/src/build.rs @@ -33,6 +33,7 @@ const PYTHON_FEATURE: Option<&str> = option_env!("G3_PYTHON_FEATURE"); const C_ARES_FEATURE: Option<&str> = option_env!("G3_C_ARES_FEATURE"); const HICKORY_FEATURE: Option<&str> = option_env!("G3_HICKORY_FEATURE"); const GEOIP_FEATURE: Option<&str> = option_env!("G3_GEOIP_FEATURE"); +const QUIC_FEATURE: Option<&str> = option_env!("G3_QUIC_FEATURE"); pub(crate) fn print_version(verbose_level: u8) { println!("{PKG_NAME} {VERSION}"); @@ -53,6 +54,9 @@ pub(crate) fn print_version(verbose_level: u8) { if let Some(geoip) = GEOIP_FEATURE { print!(" {geoip}"); } + if let Some(quic) = QUIC_FEATURE { + print!(" {quic}"); + } println!(); println!("Compiler: {RUSTC_VERSION} ({RUSTC_CHANNEL})"); } diff --git a/g3proxy/src/config/server/mod.rs b/g3proxy/src/config/server/mod.rs index 45f4cde9..9b9d92d3 100644 --- a/g3proxy/src/config/server/mod.rs +++ b/g3proxy/src/config/server/mod.rs @@ -35,6 +35,7 @@ use crate::auth::UserGroup; pub(crate) mod dummy_close; pub(crate) mod intelli_proxy; pub(crate) mod native_tls_port; +#[cfg(feature = "quic")] pub(crate) mod plain_quic_port; pub(crate) mod plain_tcp_port; pub(crate) mod plain_tls_port; @@ -60,6 +61,7 @@ pub(crate) enum ServerConfigDiffAction { SpawnNew, ReloadOnlyConfig, ReloadAndRespawn, + #[allow(unused)] UpdateInPlace(u64), // to support server custom hot update, take a flags param } @@ -125,6 +127,7 @@ pub(crate) enum AnyServerConfig { PlainTcpPort(plain_tcp_port::PlainTcpPortConfig), PlainTlsPort(plain_tls_port::PlainTlsPortConfig), NativeTlsPort(native_tls_port::NativeTlsPortConfig), + #[cfg(feature = "quic")] PlainQuicPort(plain_quic_port::PlainQuicPortConfig), IntelliProxy(intelli_proxy::IntelliProxyConfig), TcpStream(Box), @@ -143,6 +146,7 @@ macro_rules! impl_transparent0 { AnyServerConfig::PlainTcpPort(s) => s.$f(), AnyServerConfig::PlainTlsPort(s) => s.$f(), AnyServerConfig::NativeTlsPort(s) => s.$f(), + #[cfg(feature = "quic")] AnyServerConfig::PlainQuicPort(s) => s.$f(), AnyServerConfig::IntelliProxy(s) => s.$f(), AnyServerConfig::TcpStream(s) => s.$f(), @@ -164,6 +168,7 @@ macro_rules! impl_transparent1 { AnyServerConfig::PlainTcpPort(s) => s.$f(p), AnyServerConfig::PlainTlsPort(s) => s.$f(p), AnyServerConfig::NativeTlsPort(s) => s.$f(p), + #[cfg(feature = "quic")] AnyServerConfig::PlainQuicPort(s) => s.$f(p), AnyServerConfig::IntelliProxy(s) => s.$f(p), AnyServerConfig::TcpStream(s) => s.$f(p), @@ -237,6 +242,7 @@ fn load_server( .context("failed to load this NativeTlsPort server")?; Ok(AnyServerConfig::NativeTlsPort(server)) } + #[cfg(feature = "quic")] "plain_quic_port" | "plainquicport" | "plain_quic" | "plainquic" => { let server = plain_quic_port::PlainQuicPortConfig::parse(map, position) .context("failed to load this PlainQuicPort server")?; diff --git a/g3proxy/src/serve/dummy_close/server.rs b/g3proxy/src/serve/dummy_close/server.rs index 31705943..387cb4fa 100644 --- a/g3proxy/src/serve/dummy_close/server.rs +++ b/g3proxy/src/serve/dummy_close/server.rs @@ -18,6 +18,7 @@ use std::sync::Arc; use anyhow::anyhow; use async_trait::async_trait; +#[cfg(feature = "quic")] use quinn::Connection; use tokio::net::TcpStream; use tokio::sync::broadcast; @@ -175,5 +176,6 @@ impl Server for DummyCloseServer { ) { } + #[cfg(feature = "quic")] async fn run_quic_task(&self, _connection: Connection, _cc_info: ClientConnectionInfo) {} } diff --git a/g3proxy/src/serve/http_proxy/server.rs b/g3proxy/src/serve/http_proxy/server.rs index e546e584..3c2daf31 100644 --- a/g3proxy/src/serve/http_proxy/server.rs +++ b/g3proxy/src/serve/http_proxy/server.rs @@ -22,6 +22,7 @@ use anyhow::{anyhow, Context}; use arc_swap::{ArcSwap, ArcSwapOption}; use async_trait::async_trait; use log::debug; +#[cfg(feature = "quic")] use quinn::Connection; use slog::Logger; use tokio::io::{AsyncRead, AsyncWrite}; @@ -237,6 +238,7 @@ impl HttpProxyServer { w_task.into_running().await } + #[cfg(feature = "quic")] fn spawn_quic_stream_task( &self, send_stream: quinn::SendStream, @@ -423,6 +425,7 @@ impl Server for HttpProxyServer { self.spawn_stream_task(stream, cc_info).await; } + #[cfg(feature = "quic")] async fn run_quic_task(&self, connection: Connection, cc_info: ClientConnectionInfo) { let client_addr = cc_info.client_addr(); self.server_stats.add_conn(client_addr); diff --git a/g3proxy/src/serve/http_rproxy/server.rs b/g3proxy/src/serve/http_rproxy/server.rs index 8be7afdb..f7f24bbb 100644 --- a/g3proxy/src/serve/http_rproxy/server.rs +++ b/g3proxy/src/serve/http_rproxy/server.rs @@ -22,6 +22,7 @@ use anyhow::{anyhow, Context}; use arc_swap::{ArcSwap, ArcSwapOption}; use async_trait::async_trait; use log::debug; +#[cfg(feature = "quic")] use quinn::Connection; use slog::Logger; use tokio::io::{AsyncRead, AsyncWrite}; @@ -440,5 +441,6 @@ impl Server for HttpRProxyServer { self.spawn_stream_task(stream, cc_info).await; } + #[cfg(feature = "quic")] async fn run_quic_task(&self, _connection: Connection, _cc_info: ClientConnectionInfo) {} } diff --git a/g3proxy/src/serve/intelli_proxy/server.rs b/g3proxy/src/serve/intelli_proxy/server.rs index 99322b61..1ccd6325 100644 --- a/g3proxy/src/serve/intelli_proxy/server.rs +++ b/g3proxy/src/serve/intelli_proxy/server.rs @@ -20,6 +20,7 @@ use std::sync::Arc; use anyhow::anyhow; use arc_swap::ArcSwap; use async_trait::async_trait; +#[cfg(feature = "quic")] use quinn::Connection; use tokio::net::TcpStream; use tokio::sync::broadcast; @@ -291,5 +292,6 @@ impl Server for IntelliProxy { ) { } + #[cfg(feature = "quic")] async fn run_quic_task(&self, _connection: Connection, _cc_info: ClientConnectionInfo) {} } diff --git a/g3proxy/src/serve/mod.rs b/g3proxy/src/serve/mod.rs index a80471b4..f5ec3484 100644 --- a/g3proxy/src/serve/mod.rs +++ b/g3proxy/src/serve/mod.rs @@ -17,6 +17,7 @@ use std::sync::Arc; use async_trait::async_trait; +#[cfg(feature = "quic")] use quinn::Connection; use tokio::net::TcpStream; use tokio::sync::broadcast; @@ -36,11 +37,14 @@ mod idle_check; pub(crate) use idle_check::ServerIdleChecker; mod runtime; -use runtime::{ListenQuicRuntime, ListenTcpRuntime}; +#[cfg(feature = "quic")] +use runtime::ListenQuicRuntime; +use runtime::ListenTcpRuntime; mod dummy_close; mod intelli_proxy; mod native_tls_port; +#[cfg(feature = "quic")] mod plain_quic_port; mod plain_tcp_port; mod plain_tls_port; @@ -111,6 +115,7 @@ pub(crate) trait Server: ServerInternal { async fn run_openssl_task(&self, stream: SslStream, cc_info: ClientConnectionInfo); + #[cfg(feature = "quic")] async fn run_quic_task(&self, connection: Connection, cc_info: ClientConnectionInfo); } diff --git a/g3proxy/src/serve/native_tls_port/mod.rs b/g3proxy/src/serve/native_tls_port/mod.rs index 2230bc8d..b9b24952 100644 --- a/g3proxy/src/serve/native_tls_port/mod.rs +++ b/g3proxy/src/serve/native_tls_port/mod.rs @@ -23,6 +23,7 @@ use arc_swap::ArcSwap; use async_trait::async_trait; use log::debug; use openssl::ssl::Ssl; +#[cfg(feature = "quic")] use quinn::Connection; use tokio::net::TcpStream; use tokio::sync::broadcast; @@ -307,5 +308,6 @@ impl Server for NativeTlsPort { ) { } + #[cfg(feature = "quic")] async fn run_quic_task(&self, _connection: Connection, _cc_info: ClientConnectionInfo) {} } diff --git a/g3proxy/src/serve/ops.rs b/g3proxy/src/serve/ops.rs index 074ce5d1..9d6380e1 100644 --- a/g3proxy/src/serve/ops.rs +++ b/g3proxy/src/serve/ops.rs @@ -32,6 +32,7 @@ use super::{registry, ArcServer}; use super::dummy_close::DummyCloseServer; use super::intelli_proxy::IntelliProxy; use super::native_tls_port::NativeTlsPort; +#[cfg(feature = "quic")] use super::plain_quic_port::PlainQuicPort; use super::plain_tcp_port::PlainTcpPort; use super::plain_tls_port::PlainTlsPort; @@ -289,6 +290,7 @@ fn spawn_new_unlocked(config: AnyServerConfig) -> anyhow::Result<()> { AnyServerConfig::PlainTcpPort(c) => PlainTcpPort::prepare_initial(c)?, AnyServerConfig::PlainTlsPort(c) => PlainTlsPort::prepare_initial(c)?, AnyServerConfig::NativeTlsPort(c) => NativeTlsPort::prepare_initial(c)?, + #[cfg(feature = "quic")] AnyServerConfig::PlainQuicPort(c) => PlainQuicPort::prepare_initial(c)?, AnyServerConfig::IntelliProxy(c) => IntelliProxy::prepare_initial(c)?, AnyServerConfig::TcpStream(c) => TcpStreamServer::prepare_initial(*c)?, diff --git a/g3proxy/src/serve/plain_tcp_port/mod.rs b/g3proxy/src/serve/plain_tcp_port/mod.rs index 6e8c81f0..b5568f68 100644 --- a/g3proxy/src/serve/plain_tcp_port/mod.rs +++ b/g3proxy/src/serve/plain_tcp_port/mod.rs @@ -20,6 +20,7 @@ use std::sync::Arc; use anyhow::anyhow; use arc_swap::ArcSwap; use async_trait::async_trait; +#[cfg(feature = "quic")] use quinn::Connection; use tokio::net::TcpStream; use tokio::sync::broadcast; @@ -257,5 +258,6 @@ impl Server for PlainTcpPort { ) { } + #[cfg(feature = "quic")] async fn run_quic_task(&self, _connection: Connection, _cc_info: ClientConnectionInfo) {} } diff --git a/g3proxy/src/serve/plain_tls_port/mod.rs b/g3proxy/src/serve/plain_tls_port/mod.rs index 9bc91858..816a5dcb 100644 --- a/g3proxy/src/serve/plain_tls_port/mod.rs +++ b/g3proxy/src/serve/plain_tls_port/mod.rs @@ -22,6 +22,7 @@ use anyhow::{anyhow, Context}; use arc_swap::ArcSwap; use async_trait::async_trait; use log::debug; +#[cfg(feature = "quic")] use quinn::Connection; use tokio::net::TcpStream; use tokio::sync::broadcast; @@ -295,5 +296,6 @@ impl Server for PlainTlsPort { ) { } + #[cfg(feature = "quic")] async fn run_quic_task(&self, _connection: Connection, _cc_info: ClientConnectionInfo) {} } diff --git a/g3proxy/src/serve/runtime/mod.rs b/g3proxy/src/serve/runtime/mod.rs index fd7641eb..066779e2 100644 --- a/g3proxy/src/serve/runtime/mod.rs +++ b/g3proxy/src/serve/runtime/mod.rs @@ -17,5 +17,7 @@ mod listen_tcp; pub(crate) use listen_tcp::ListenTcpRuntime; +#[cfg(feature = "quic")] mod listen_quic; +#[cfg(feature = "quic")] pub(crate) use listen_quic::ListenQuicRuntime; diff --git a/g3proxy/src/serve/sni_proxy/server.rs b/g3proxy/src/serve/sni_proxy/server.rs index 4660a92c..d220a749 100644 --- a/g3proxy/src/serve/sni_proxy/server.rs +++ b/g3proxy/src/serve/sni_proxy/server.rs @@ -20,6 +20,7 @@ use std::sync::Arc; use anyhow::anyhow; use arc_swap::{ArcSwap, ArcSwapOption}; use async_trait::async_trait; +#[cfg(feature = "quic")] use quinn::Connection; use slog::Logger; use tokio::net::TcpStream; @@ -286,5 +287,6 @@ impl Server for SniProxyServer { ) { } + #[cfg(feature = "quic")] async fn run_quic_task(&self, _connection: Connection, _cc_info: ClientConnectionInfo) {} } diff --git a/g3proxy/src/serve/socks_proxy/server.rs b/g3proxy/src/serve/socks_proxy/server.rs index 19e48f5a..88fa2985 100644 --- a/g3proxy/src/serve/socks_proxy/server.rs +++ b/g3proxy/src/serve/socks_proxy/server.rs @@ -20,6 +20,7 @@ use std::sync::Arc; use anyhow::anyhow; use arc_swap::{ArcSwap, ArcSwapOption}; use async_trait::async_trait; +#[cfg(feature = "quic")] use quinn::Connection; use slog::Logger; use tokio::net::TcpStream; @@ -295,5 +296,6 @@ impl Server for SocksProxyServer { self.listen_stats.add_dropped(); } + #[cfg(feature = "quic")] async fn run_quic_task(&self, _connection: Connection, _cc_info: ClientConnectionInfo) {} } diff --git a/g3proxy/src/serve/tcp_stream/server.rs b/g3proxy/src/serve/tcp_stream/server.rs index e989af3e..6cd88902 100644 --- a/g3proxy/src/serve/tcp_stream/server.rs +++ b/g3proxy/src/serve/tcp_stream/server.rs @@ -20,7 +20,7 @@ use std::sync::Arc; use anyhow::{anyhow, Context}; use arc_swap::{ArcSwap, ArcSwapOption}; use async_trait::async_trait; -use log::debug; +#[cfg(feature = "quic")] use quinn::Connection; use slog::Logger; use tokio::io::{AsyncRead, AsyncWrite}; @@ -223,6 +223,7 @@ impl TcpStreamServer { .await; } + #[cfg(feature = "quic")] fn run_task_with_quic_stream( &self, send_stream: quinn::SendStream, @@ -370,7 +371,10 @@ impl Server for TcpStreamServer { self.run_task_with_stream(stream, cc_info).await } + #[cfg(feature = "quic")] async fn run_quic_task(&self, connection: Connection, cc_info: ClientConnectionInfo) { + use log::debug; + let client_addr = cc_info.client_addr(); self.server_stats.add_conn(client_addr); if self.drop_early(client_addr) { diff --git a/g3proxy/src/serve/tls_stream/server.rs b/g3proxy/src/serve/tls_stream/server.rs index 61209365..985c8b29 100644 --- a/g3proxy/src/serve/tls_stream/server.rs +++ b/g3proxy/src/serve/tls_stream/server.rs @@ -22,6 +22,7 @@ use anyhow::{anyhow, Context}; use arc_swap::{ArcSwap, ArcSwapOption}; use async_trait::async_trait; use log::debug; +#[cfg(feature = "quic")] use quinn::Connection; use slog::Logger; use tokio::net::TcpStream; @@ -358,5 +359,6 @@ impl Server for TlsStreamServer { ) { } + #[cfg(feature = "quic")] async fn run_quic_task(&self, _connection: Connection, _cc_info: ClientConnectionInfo) {} } diff --git a/lib/g3-resolver/Cargo.toml b/lib/g3-resolver/Cargo.toml index 76a11170..81be03c8 100644 --- a/lib/g3-resolver/Cargo.toml +++ b/lib/g3-resolver/Cargo.toml @@ -17,7 +17,7 @@ indexmap.workspace = true ahash.workspace = true c-ares = { workspace = true, optional = true, features = ["build-cmake"] } c-ares-resolver = { workspace = true, optional = true } -hickory-resolver = { workspace = true, optional = true, features = ["tokio-runtime", "dns-over-rustls", "dns-over-https-rustls", "dns-over-quic", "dns-over-h3", "native-certs"] } +hickory-resolver = { workspace = true, optional = true, features = ["tokio-runtime", "dns-over-rustls", "dns-over-https-rustls", "native-certs"] } hickory-proto = { workspace = true, optional = true } rustls = { workspace = true, optional = true } g3-types = { workspace = true, optional = true } @@ -27,3 +27,4 @@ default = [] c-ares = ["dep:c-ares", "dep:c-ares-resolver"] vendored-c-ares = ["c-ares", "c-ares-resolver/vendored", "c-ares/vendored"] hickory = ["dep:hickory-resolver", "dep:hickory-proto", "g3-types/rustls", "dep:rustls"] +quic = ["hickory", "g3-types/quic", "hickory-resolver/dns-over-quic", "hickory-resolver/dns-over-h3"] diff --git a/lib/g3-resolver/src/driver/hickory/config.rs b/lib/g3-resolver/src/driver/hickory/config.rs index c7188d0d..0d89220e 100644 --- a/lib/g3-resolver/src/driver/hickory/config.rs +++ b/lib/g3-resolver/src/driver/hickory/config.rs @@ -100,12 +100,14 @@ impl TryFrom<&HickoryDriverConfig> for NameServerConfigGroup { tls_name, false, ), + #[cfg(feature = "quic")] DnsEncryptionProtocol::H3 => NameServerConfigGroup::from_ips_h3( &c.servers, c.server_port.unwrap_or(443), tls_name, false, ), + #[cfg(feature = "quic")] DnsEncryptionProtocol::Quic => NameServerConfigGroup::from_ips_quic( &c.servers, c.server_port.unwrap_or(853), diff --git a/lib/g3-types/Cargo.toml b/lib/g3-types/Cargo.toml index b20f0799..e1597875 100644 --- a/lib/g3-types/Cargo.toml +++ b/lib/g3-types/Cargo.toml @@ -63,3 +63,4 @@ proxy = ["http", "openssl"] route = ["dep:ahash", "dep:radix_trie", "dep:indexmap", "resolve"] async-log = ["dep:flume", "dep:slog"] json = ["dep:serde_json"] +quic = [] diff --git a/lib/g3-types/src/net/dns/encryption.rs b/lib/g3-types/src/net/dns/encryption.rs index 60479a58..5a489293 100644 --- a/lib/g3-types/src/net/dns/encryption.rs +++ b/lib/g3-types/src/net/dns/encryption.rs @@ -27,7 +27,9 @@ use crate::net::{RustlsClientConfig, RustlsClientConfigBuilder}; pub enum DnsEncryptionProtocol { Tls, Https, + #[cfg(feature = "quic")] H3, + #[cfg(feature = "quic")] Quic, } @@ -40,9 +42,11 @@ impl FromStr for DnsEncryptionProtocol { "https" | "h2" | "dns_over_https" | "dnsoverhttps" | "doh" => { Ok(DnsEncryptionProtocol::Https) } + #[cfg(feature = "quic")] "h3" | "http/3" | "dns_over_http/3" | "dnsoverhttp/3" | "doh3" => { Ok(DnsEncryptionProtocol::H3) } + #[cfg(feature = "quic")] "quic" | "dns_over_quic" | "dnsoverquic" | "doq" => Ok(DnsEncryptionProtocol::Quic), _ => Err(anyhow!("unknown protocol {}", s)), } @@ -54,7 +58,9 @@ impl DnsEncryptionProtocol { match self { DnsEncryptionProtocol::Tls => "DnsOverTls", DnsEncryptionProtocol::Https => "DnsOverHttps", + #[cfg(feature = "quic")] DnsEncryptionProtocol::H3 => "DnsOverHttp/3", + #[cfg(feature = "quic")] DnsEncryptionProtocol::Quic => "DnsOverQuic", } } @@ -63,7 +69,9 @@ impl DnsEncryptionProtocol { match self { DnsEncryptionProtocol::Tls => 853, DnsEncryptionProtocol::Https => 443, + #[cfg(feature = "quic")] DnsEncryptionProtocol::H3 => 443, + #[cfg(feature = "quic")] DnsEncryptionProtocol::Quic => 853, } }