diff --git a/src/metrics.rs b/src/metrics.rs index 3b33b94..42f131e 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -10,7 +10,6 @@ use hyper::service::service_fn; use hyper::{Body, Request, Response, StatusCode}; use prometheus::{self, Encoder, TextEncoder}; use std::mem; -use std::net::SocketAddr; use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Arc; use tokio::net::TcpListener; @@ -52,33 +51,7 @@ pub async fn prometheus_service( runtime_handle: Handle, ) -> Result<(), Error> { let path = Arc::new(metrics_config.path); - let std_socket = match metrics_config.listen_addr { - SocketAddr::V4(_) => { - let kindy = socket2::Socket::new( - socket2::Domain::ipv4(), - socket2::Type::stream(), - Some(socket2::Protocol::tcp()), - )?; - kindy.set_reuse_address(true)?; - kindy.bind(&metrics_config.listen_addr.into())?; - kindy.listen(1024)?; - kindy.into_tcp_listener() - } - SocketAddr::V6(_) => { - let kindy = socket2::Socket::new( - socket2::Domain::ipv6(), - socket2::Type::stream(), - Some(socket2::Protocol::tcp()), - )?; - kindy.set_reuse_address(true)?; - kindy.set_only_v6(true)?; - kindy.bind(&metrics_config.listen_addr.into())?; - kindy.listen(1024)?; - kindy.into_tcp_listener() - } - }; - std_socket.set_nonblocking(true)?; - let stream = TcpListener::from_std(std_socket)?; + let stream = TcpListener::bind(metrics_config.listen_addr).await?; let concurrent_connections = Arc::new(AtomicU32::new(0)); loop { let (client, _client_addr) = stream.accept().await?; diff --git a/src/resolver.rs b/src/resolver.rs index f6e3f97..aea7724 100644 --- a/src/resolver.rs +++ b/src/resolver.rs @@ -9,7 +9,7 @@ use rand::prelude::*; use siphasher::sip128::Hasher128; use std::cmp; use std::hash::Hasher; -use std::net::{Ipv6Addr, SocketAddr, SocketAddrV6}; +use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::{TcpSocket, UdpSocket}; @@ -20,55 +20,24 @@ pub async fn resolve_udp( tid: u16, has_cached_response: bool, ) -> Result, Error> { - let std_socket = match globals.external_addr { - Some(x @ SocketAddr::V4(_)) => { - let kindy = socket2::Socket::new( - socket2::Domain::ipv4(), - socket2::Type::dgram(), - Some(socket2::Protocol::udp()), - )?; - kindy.bind(&x.into())?; - kindy.into_udp_socket() - } - Some(x @ SocketAddr::V6(_)) => { - let kindy = socket2::Socket::new( - socket2::Domain::ipv6(), - socket2::Type::dgram(), - Some(socket2::Protocol::udp()), - )?; - kindy.bind(&x.into())?; - kindy.into_udp_socket() - } + let ext_socket = match globals.external_addr { + Some(x) => UdpSocket::bind(x).await?, None => match globals.upstream_addr { SocketAddr::V4(_) => { - let kindy = socket2::Socket::new( - socket2::Domain::ipv4(), - socket2::Type::dgram(), - Some(socket2::Protocol::udp()), - )?; - kindy.into_udp_socket() + UdpSocket::bind(&SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 0))) + .await? } SocketAddr::V6(s) => { - let kindy = socket2::Socket::new( - socket2::Domain::ipv6(), - socket2::Type::dgram(), - Some(socket2::Protocol::udp()), - )?; - kindy.bind( - &SocketAddr::V6(SocketAddrV6::new( - Ipv6Addr::UNSPECIFIED, - 0, - s.flowinfo(), - s.scope_id(), - )) - .into(), - )?; - kindy.into_udp_socket() + UdpSocket::bind(&SocketAddr::V6(SocketAddrV6::new( + Ipv6Addr::UNSPECIFIED, + 0, + s.flowinfo(), + s.scope_id(), + ))) + .await? } }, }; - std_socket.set_nonblocking(true)?; - let ext_socket = UdpSocket::from_std(std_socket)?; ext_socket.connect(&globals.upstream_addr).await?; dns::set_edns_max_payload_size(&mut packet, DNS_MAX_PACKET_SIZE as u16)?; let mut response;