Loading doh/connection/driver.rs +1 −0 Original line number Diff line number Diff line Loading @@ -283,6 +283,7 @@ impl H3Driver { // If the request has already timed out, don't issue it to the server. if let Some(expiry) = request.expiry { if BootTime::now() > expiry { warn!("Abandoning expired DNS request"); return Ok(()); } } Loading doh/network/driver.rs +9 −2 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ use crate::config::Config; use crate::connection::Connection; use crate::dispatcher::{QueryError, Response}; use crate::encoding; use anyhow::{anyhow, Result}; use anyhow::{anyhow, bail, Result}; use std::sync::Arc; use tokio::sync::{mpsc, watch}; use tokio::task; Loading Loading @@ -90,7 +90,7 @@ async fn build_connection( } impl Driver { const MAX_BUFFERED_COMMANDS: usize = 10; const MAX_BUFFERED_COMMANDS: usize = 50; pub async fn new( info: ServerInfo, Loading Loading @@ -175,6 +175,13 @@ impl Driver { } async fn send_query(&mut self, query: Query) -> Result<()> { // If the associated receiver has been closed, meaning that the request has already // timed out, just drop it. This check helps drain the channel quickly in the case // where the network is stalled. if query.response.is_closed() { bail!("Abandoning expired DNS request") } if !self.connection.wait_for_live().await { // Try reconnecting self.connection = Loading doh/network/mod.rs +1 −1 Original line number Diff line number Diff line Loading @@ -102,7 +102,7 @@ impl Network { .unwrap_or_else(|_| { warn!("Query result listener went away before receiving a response") }), Status::Live => self.command_tx.send(Command::Query(query)).await?, Status::Live => self.command_tx.try_send(Command::Query(query))?, } Ok(()) } Loading tests/dns_responder/dns_responder_client_ndk.cpp +22 −19 Original line number Diff line number Diff line Loading @@ -21,8 +21,6 @@ #include <android/binder_manager.h> #include "NetdClient.h" // TODO: make this dynamic and stop depending on implementation details. #define TEST_OEM_NETWORK "oem29" #define TEST_NETID 30 // TODO: move this somewhere shared. Loading Loading @@ -172,43 +170,48 @@ void DnsResponderClient::SetupDNSServers(unsigned numServers, const std::vector< } } int DnsResponderClient::SetupOemNetwork() { mNetdSrv->networkDestroy(TEST_NETID); mDnsResolvSrv->destroyNetworkCache(TEST_NETID); int DnsResponderClient::SetupOemNetwork(int oemNetId) { mNetdSrv->networkDestroy(oemNetId); mDnsResolvSrv->destroyNetworkCache(oemNetId); ::ndk::ScopedAStatus ret; if (DnsResponderClient::isRemoteVersionSupported(mNetdSrv, 6)) { const auto& config = DnsResponderClient::makeNativeNetworkConfig( TEST_NETID, NativeNetworkType::PHYSICAL, INetd::PERMISSION_NONE, /*secure=*/false); oemNetId, NativeNetworkType::PHYSICAL, INetd::PERMISSION_NONE, /*secure=*/false); ret = mNetdSrv->networkCreate(config); } else { // Only for presubmit tests that run mainline module (and its tests) on R or earlier images. #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" ret = mNetdSrv->networkCreatePhysical(TEST_NETID, INetd::PERMISSION_NONE); ret = mNetdSrv->networkCreatePhysical(oemNetId, INetd::PERMISSION_NONE); #pragma clang diagnostic pop } if (!ret.isOk()) { fprintf(stderr, "Creating physical network %d failed, %s\n", TEST_NETID, ret.getMessage()); fprintf(stderr, "Creating physical network %d failed, %s\n", oemNetId, ret.getMessage()); return -1; } ret = mDnsResolvSrv->createNetworkCache(TEST_NETID); ret = mDnsResolvSrv->createNetworkCache(oemNetId); if (!ret.isOk()) { fprintf(stderr, "Creating network cache %d failed, %s\n", TEST_NETID, ret.getMessage()); fprintf(stderr, "Creating network cache %d failed, %s\n", oemNetId, ret.getMessage()); return -1; } setNetworkForProcess(TEST_NETID); if ((unsigned)TEST_NETID != getNetworkForProcess()) { setNetworkForProcess(oemNetId); if ((unsigned)oemNetId != getNetworkForProcess()) { return -1; } return TEST_NETID; return 0; } void DnsResponderClient::TearDownOemNetwork(int oemNetId) { if (oemNetId != -1) { mNetdSrv->networkDestroy(oemNetId); mDnsResolvSrv->destroyNetworkCache(oemNetId); int DnsResponderClient::TearDownOemNetwork(int oemNetId) { if (auto status = mNetdSrv->networkDestroy(oemNetId); !status.isOk()) { fprintf(stderr, "Removing network %d failed, %s\n", oemNetId, status.getMessage()); return -1; } if (auto status = mDnsResolvSrv->destroyNetworkCache(oemNetId); !status.isOk()) { fprintf(stderr, "Removing network cache %d failed, %s\n", oemNetId, status.getMessage()); return -1; } return 0; } void DnsResponderClient::SetUp() { Loading @@ -228,11 +231,11 @@ void DnsResponderClient::SetUp() { // Ensure resolutions go via proxy. setenv(ANDROID_DNS_MODE, "", 1); mOemNetId = SetupOemNetwork(); SetupOemNetwork(TEST_NETID); } void DnsResponderClient::TearDown() { TearDownOemNetwork(mOemNetId); TearDownOemNetwork(TEST_NETID); } NativeNetworkConfig DnsResponderClient::makeNativeNetworkConfig(int netId, Loading tests/dns_responder/dns_responder_client_ndk.h +3 −4 Original line number Diff line number Diff line Loading @@ -128,9 +128,9 @@ class DnsResponderClient { const std::vector<std::string>& domains, const std::string& tlsHostname, const std::vector<std::string>& tlsServers, const std::string& caCert = ""); int SetupOemNetwork(); void TearDownOemNetwork(int oemNetId); // Returns 0 on success and a negative value on failure. int SetupOemNetwork(int oemNetId); int TearDownOemNetwork(int oemNetId); virtual void SetUp(); virtual void TearDown(); Loading @@ -141,5 +141,4 @@ class DnsResponderClient { private: std::shared_ptr<aidl::android::net::INetd> mNetdSrv; std::shared_ptr<aidl::android::net::IDnsResolver> mDnsResolvSrv; int mOemNetId = -1; }; Loading
doh/connection/driver.rs +1 −0 Original line number Diff line number Diff line Loading @@ -283,6 +283,7 @@ impl H3Driver { // If the request has already timed out, don't issue it to the server. if let Some(expiry) = request.expiry { if BootTime::now() > expiry { warn!("Abandoning expired DNS request"); return Ok(()); } } Loading
doh/network/driver.rs +9 −2 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ use crate::config::Config; use crate::connection::Connection; use crate::dispatcher::{QueryError, Response}; use crate::encoding; use anyhow::{anyhow, Result}; use anyhow::{anyhow, bail, Result}; use std::sync::Arc; use tokio::sync::{mpsc, watch}; use tokio::task; Loading Loading @@ -90,7 +90,7 @@ async fn build_connection( } impl Driver { const MAX_BUFFERED_COMMANDS: usize = 10; const MAX_BUFFERED_COMMANDS: usize = 50; pub async fn new( info: ServerInfo, Loading Loading @@ -175,6 +175,13 @@ impl Driver { } async fn send_query(&mut self, query: Query) -> Result<()> { // If the associated receiver has been closed, meaning that the request has already // timed out, just drop it. This check helps drain the channel quickly in the case // where the network is stalled. if query.response.is_closed() { bail!("Abandoning expired DNS request") } if !self.connection.wait_for_live().await { // Try reconnecting self.connection = Loading
doh/network/mod.rs +1 −1 Original line number Diff line number Diff line Loading @@ -102,7 +102,7 @@ impl Network { .unwrap_or_else(|_| { warn!("Query result listener went away before receiving a response") }), Status::Live => self.command_tx.send(Command::Query(query)).await?, Status::Live => self.command_tx.try_send(Command::Query(query))?, } Ok(()) } Loading
tests/dns_responder/dns_responder_client_ndk.cpp +22 −19 Original line number Diff line number Diff line Loading @@ -21,8 +21,6 @@ #include <android/binder_manager.h> #include "NetdClient.h" // TODO: make this dynamic and stop depending on implementation details. #define TEST_OEM_NETWORK "oem29" #define TEST_NETID 30 // TODO: move this somewhere shared. Loading Loading @@ -172,43 +170,48 @@ void DnsResponderClient::SetupDNSServers(unsigned numServers, const std::vector< } } int DnsResponderClient::SetupOemNetwork() { mNetdSrv->networkDestroy(TEST_NETID); mDnsResolvSrv->destroyNetworkCache(TEST_NETID); int DnsResponderClient::SetupOemNetwork(int oemNetId) { mNetdSrv->networkDestroy(oemNetId); mDnsResolvSrv->destroyNetworkCache(oemNetId); ::ndk::ScopedAStatus ret; if (DnsResponderClient::isRemoteVersionSupported(mNetdSrv, 6)) { const auto& config = DnsResponderClient::makeNativeNetworkConfig( TEST_NETID, NativeNetworkType::PHYSICAL, INetd::PERMISSION_NONE, /*secure=*/false); oemNetId, NativeNetworkType::PHYSICAL, INetd::PERMISSION_NONE, /*secure=*/false); ret = mNetdSrv->networkCreate(config); } else { // Only for presubmit tests that run mainline module (and its tests) on R or earlier images. #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" ret = mNetdSrv->networkCreatePhysical(TEST_NETID, INetd::PERMISSION_NONE); ret = mNetdSrv->networkCreatePhysical(oemNetId, INetd::PERMISSION_NONE); #pragma clang diagnostic pop } if (!ret.isOk()) { fprintf(stderr, "Creating physical network %d failed, %s\n", TEST_NETID, ret.getMessage()); fprintf(stderr, "Creating physical network %d failed, %s\n", oemNetId, ret.getMessage()); return -1; } ret = mDnsResolvSrv->createNetworkCache(TEST_NETID); ret = mDnsResolvSrv->createNetworkCache(oemNetId); if (!ret.isOk()) { fprintf(stderr, "Creating network cache %d failed, %s\n", TEST_NETID, ret.getMessage()); fprintf(stderr, "Creating network cache %d failed, %s\n", oemNetId, ret.getMessage()); return -1; } setNetworkForProcess(TEST_NETID); if ((unsigned)TEST_NETID != getNetworkForProcess()) { setNetworkForProcess(oemNetId); if ((unsigned)oemNetId != getNetworkForProcess()) { return -1; } return TEST_NETID; return 0; } void DnsResponderClient::TearDownOemNetwork(int oemNetId) { if (oemNetId != -1) { mNetdSrv->networkDestroy(oemNetId); mDnsResolvSrv->destroyNetworkCache(oemNetId); int DnsResponderClient::TearDownOemNetwork(int oemNetId) { if (auto status = mNetdSrv->networkDestroy(oemNetId); !status.isOk()) { fprintf(stderr, "Removing network %d failed, %s\n", oemNetId, status.getMessage()); return -1; } if (auto status = mDnsResolvSrv->destroyNetworkCache(oemNetId); !status.isOk()) { fprintf(stderr, "Removing network cache %d failed, %s\n", oemNetId, status.getMessage()); return -1; } return 0; } void DnsResponderClient::SetUp() { Loading @@ -228,11 +231,11 @@ void DnsResponderClient::SetUp() { // Ensure resolutions go via proxy. setenv(ANDROID_DNS_MODE, "", 1); mOemNetId = SetupOemNetwork(); SetupOemNetwork(TEST_NETID); } void DnsResponderClient::TearDown() { TearDownOemNetwork(mOemNetId); TearDownOemNetwork(TEST_NETID); } NativeNetworkConfig DnsResponderClient::makeNativeNetworkConfig(int netId, Loading
tests/dns_responder/dns_responder_client_ndk.h +3 −4 Original line number Diff line number Diff line Loading @@ -128,9 +128,9 @@ class DnsResponderClient { const std::vector<std::string>& domains, const std::string& tlsHostname, const std::vector<std::string>& tlsServers, const std::string& caCert = ""); int SetupOemNetwork(); void TearDownOemNetwork(int oemNetId); // Returns 0 on success and a negative value on failure. int SetupOemNetwork(int oemNetId); int TearDownOemNetwork(int oemNetId); virtual void SetUp(); virtual void TearDown(); Loading @@ -141,5 +141,4 @@ class DnsResponderClient { private: std::shared_ptr<aidl::android::net::INetd> mNetdSrv; std::shared_ptr<aidl::android::net::IDnsResolver> mDnsResolvSrv; int mOemNetId = -1; };