@@ -15,13 +15,29 @@ static constexpr auto c_eth0DeviceName = L"eth0";
1515static constexpr auto c_loopbackDeviceName = TEXT(LX_INIT_LOOPBACK_DEVICE_NAME);
1616
1717VirtioNetworking::VirtioNetworking (
18- GnsChannel&& gnsChannel, VirtioNetworkingFlags flags, LPCWSTR dnsOptions, std::shared_ptr<GuestDeviceManager> guestDeviceManager, wil::shared_handle userToken) :
18+ GnsChannel&& gnsChannel,
19+ VirtioNetworkingFlags flags,
20+ LPCWSTR dnsOptions,
21+ std::shared_ptr<GuestDeviceManager> guestDeviceManager,
22+ wil::shared_handle userToken,
23+ wil::unique_socket&& dnsHvsocket) :
1924 m_guestDeviceManager(std::move(guestDeviceManager)),
2025 m_userToken(std::move(userToken)),
2126 m_gnsChannel(std::move(gnsChannel)),
2227 m_flags(flags),
2328 m_dnsOptions(dnsOptions)
2429{
30+ THROW_HR_IF_MSG (
31+ E_INVALIDARG,
32+ ((!!dnsHvsocket != WI_IsFlagSet (m_flags, VirtioNetworkingFlags::DnsTunnelingSocket)) ||
33+ (WI_IsFlagSet (m_flags, VirtioNetworkingFlags::DnsTunnelingSocket) && WI_IsFlagSet (m_flags, VirtioNetworkingFlags::DnsTunneling))),
34+ " Incompatible DNS settings" );
35+
36+ if (dnsHvsocket)
37+ {
38+ networking::DnsResolverFlags resolverFlags{};
39+ m_dnsTunnelingResolver.emplace (std::move (dnsHvsocket), resolverFlags);
40+ }
2541}
2642
2743VirtioNetworking::~VirtioNetworking ()
@@ -72,9 +88,11 @@ void VirtioNetworking::StartPortTracker(wil::unique_socket&& socket)
7288}
7389
7490void NETIOAPI_API_ VirtioNetworking::OnNetworkConnectivityChange (PVOID context, NL_NETWORK_CONNECTIVITY_HINT hint)
91+ try
7592{
7693 static_cast <VirtioNetworking*>(context)->RefreshGuestConnection ();
7794}
95+ CATCH_LOG ()
7896
7997HRESULT VirtioNetworking::HandlePortNotification(const SOCKADDR_INET& addr, int protocol, bool allocate) const noexcept
8098{
@@ -164,8 +182,7 @@ int VirtioNetworking::ModifyOpenPorts(_In_ PCWSTR tag, _In_ const SOCKADDR_INET&
164182 return 0 ;
165183}
166184
167- void VirtioNetworking::RefreshGuestConnection () noexcept
168- try
185+ void VirtioNetworking::RefreshGuestConnection ()
169186{
170187 // Query current networking information before acquiring the lock.
171188 auto networkSettings = GetHostEndpointSettings ();
196213 {
197214 currentDns = networking::HostDnsInfo::GetDnsTunnelingSettings (default_route);
198215 }
216+ else if (WI_IsFlagSet (m_flags, VirtioNetworkingFlags::DnsTunnelingSocket))
217+ {
218+ currentDns = networking::HostDnsInfo::GetDnsTunnelingSettings (TEXT (LX_INIT_DNS_TUNNELING_IP_ADDRESS));
219+ }
199220 else
200221 {
201222 wsl::core::networking::DnsSettingsFlags dnsFlags = networking::DnsSettingsFlags::IncludeVpn;
211232 // Add virtio net adapter to guest. If the adapter already exists update adapter state.
212233 if (device_options != m_trackedDeviceOptions)
213234 {
214- m_trackedDeviceOptions = device_options;
215235 if (!m_adapterId.has_value ())
216236 {
217237 m_adapterId = m_guestDeviceManager->AddGuestDevice (
225245 LOG_IF_FAILED (server->AddSharePath (c_eth0DeviceName, device_options.c_str (), 0 ));
226246 }
227247 }
248+
249+ m_trackedDeviceOptions = device_options;
228250 }
229251
230252 UpdateIpv4Address (networkSettings->PreferredIpAddress );
240262
241263 m_networkSettings = std::move (networkSettings);
242264}
243- CATCH_LOG ();
244265
245266void VirtioNetworking::SetupLoopbackDevice ()
246267{
0 commit comments