@@ -43,7 +43,7 @@ HcsVirtualMachine::HcsVirtualMachine(_In_ const WSLCSessionSettings* Settings)
4343
4444 THROW_IF_FAILED (CoCreateGuid (&m_vmId));
4545 m_vmIdString = wsl::shared::string::GuidToString<wchar_t >(m_vmId, wsl::shared::string::GuidToStringFlags::Uppercase);
46- m_featureFlags = static_cast <WSLCFeatureFlags>( Settings->FeatureFlags ) ;
46+ m_featureFlags = Settings->FeatureFlags ;
4747 m_networkingMode = Settings->NetworkingMode ;
4848 m_bootTimeoutMs = Settings->BootTimeoutMs ;
4949
369369 if (FeatureEnabled (WslcFeatureFlagsDnsTunneling))
370370 {
371371 THROW_HR_IF (E_INVALIDARG, DnsSocket == nullptr );
372- THROW_HR_IF_MSG (
373- E_NOTIMPL, m_networkingMode == WSLCNetworkingModeVirtioProxy, " DNS tunneling not supported for VirtioProxy" );
374372
375373 THROW_IF_FAILED (wsl::core::networking::DnsResolver::LoadDnsResolverMethods ());
376374 dnsSocketHandle.reset (reinterpret_cast <SOCKET>(wslutil::DuplicateHandle (*DnsSocket)));
@@ -383,34 +381,39 @@ try
383381 if (m_networkingMode == WSLCNetworkingModeNAT)
384382 {
385383 // TODO: refactor this to avoid using wsl config
386- wsl::core::Config config (nullptr );
387- if (!wsl::core::NatNetworking::IsHyperVFirewallSupported (config ))
384+ m_natConfig. emplace (nullptr );
385+ if (!wsl::core::NatNetworking::IsHyperVFirewallSupported (*m_natConfig ))
388386 {
389- config. FirewallConfig .reset ();
387+ m_natConfig-> FirewallConfig .reset ();
390388 }
391389
392390 // Enable DNS tunneling if a DNS socket was provided
393391 if (FeatureEnabled (WslcFeatureFlagsDnsTunneling))
394392 {
395- config. EnableDnsTunneling = true ;
393+ m_natConfig-> EnableDnsTunneling = true ;
396394 in_addr address{};
397395 WI_VERIFY (inet_pton (AF_INET, LX_INIT_DNS_TUNNELING_IP_ADDRESS, &address) == 1 );
398- config. DnsTunnelingIpAddress = address.S_un .S_addr ;
396+ m_natConfig-> DnsTunnelingIpAddress = address.S_un .S_addr ;
399397 }
400398
401399 m_networkEngine = std::make_unique<wsl::core::NatNetworking>(
402400 m_computeSystem.get (),
403- wsl::core::NatNetworking::CreateNetwork (config ),
401+ wsl::core::NatNetworking::CreateNetwork (*m_natConfig ),
404402 wsl::core::GnsChannel (std::move (gnsSocketHandle)),
405- config ,
403+ *m_natConfig ,
406404 std::move (dnsSocketHandle),
407405 nullptr );
408406 }
409407 else if (m_networkingMode == WSLCNetworkingModeVirtioProxy)
410408 {
411409 wsl::core::VirtioNetworkingFlags flags = wsl::core::VirtioNetworkingFlags::Ipv6;
410+ if (FeatureEnabled (WslcFeatureFlagsDnsTunneling))
411+ {
412+ WI_SetFlag (flags, wsl::core::VirtioNetworkingFlags::DnsTunnelingSocket);
413+ }
414+
412415 m_networkEngine = std::make_unique<wsl::core::VirtioNetworking>(
413- wsl::core::GnsChannel (std::move (gnsSocketHandle)), flags, nullptr , m_guestDeviceManager, m_userToken);
416+ wsl::core::GnsChannel (std::move (gnsSocketHandle)), flags, nullptr , m_guestDeviceManager, m_userToken, std::move (dnsSocketHandle) );
414417 }
415418 else
416419 {
0 commit comments