Skip to content

Commit 4637f37

Browse files
benhillisBen HillisCopilot
authored
virtio networking: fix two minor issues (#13810)
* virtio networking: fix two minor issues * Update src/windows/common/VirtioNetworking.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Ben Hillis <benhill@ntdev.microsoft.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 0f6f3c1 commit 4637f37

File tree

5 files changed

+49
-32
lines changed

5 files changed

+49
-32
lines changed

src/windows/common/NatNetworking.cpp

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -506,23 +506,12 @@ CATCH_LOG()
506506

507507
void NatNetworking::UpdateMtu()
508508
{
509-
unique_interface_table interfaceTable{};
510-
THROW_IF_WIN32_ERROR(::GetIpInterfaceTable(AF_UNSPEC, &interfaceTable));
511-
512-
ULONG minMtu = ULONG_MAX;
513-
for (ULONG index = 0; index < interfaceTable.get()->NumEntries; index++)
514-
{
515-
const auto& ipInterface = interfaceTable.get()->Table[index];
516-
if (ipInterface.Connected)
517-
{
518-
minMtu = std::min(ipInterface.NlMtu, minMtu);
519-
}
520-
}
509+
const auto minMtu = GetMinimumConnectedInterfaceMtu();
521510

522511
// Only send the update if the MTU changed.
523-
if (minMtu != ULONG_MAX && minMtu != m_networkMtu)
512+
if (minMtu && minMtu.value() != m_networkMtu)
524513
{
525-
m_networkMtu = minMtu;
514+
m_networkMtu = minMtu.value();
526515

527516
hns::ModifyGuestEndpointSettingRequest<hns::NetworkInterface> notification{};
528517
notification.ResourceType = hns::GuestEndpointResourceType::Interface;

src/windows/common/VirtioNetworking.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ VirtioNetworking::VirtioNetworking(
2222
{
2323
}
2424

25+
VirtioNetworking::~VirtioNetworking()
26+
{
27+
// Unregister the network notification callback to prevent it from using the GNS channel.
28+
m_networkNotifyHandle.reset();
29+
// Stop the GNS channel to unblock any stuck communications with the guest.
30+
m_gnsChannel.Stop();
31+
}
32+
2533
void VirtioNetworking::Initialize()
2634
try
2735
{
@@ -271,32 +279,25 @@ void VirtioNetworking::UpdateDns(hns::DNS&& dnsSettings)
271279

272280
void VirtioNetworking::UpdateMtu()
273281
{
274-
unique_interface_table interfaceTable{};
275-
THROW_IF_WIN32_ERROR(::GetIpInterfaceTable(AF_UNSPEC, &interfaceTable));
276-
277-
ULONG minMtu = ULONG_MAX;
278-
for (ULONG index = 0; index < interfaceTable.get()->NumEntries; index++)
279-
{
280-
const auto& ipInterface = interfaceTable.get()->Table[index];
281-
if (ipInterface.Connected)
282-
{
283-
minMtu = std::min(ipInterface.NlMtu, minMtu);
284-
}
285-
}
282+
const auto minMtu = GetMinimumConnectedInterfaceMtu();
286283

287284
// Only send the update if the MTU changed.
288-
if (minMtu != ULONG_MAX && minMtu != m_networkMtu)
285+
if (minMtu && minMtu.value() != m_networkMtu)
289286
{
287+
m_networkMtu = minMtu.value();
288+
290289
hns::ModifyGuestEndpointSettingRequest<hns::NetworkInterface> notification{};
291290
notification.ResourceType = hns::GuestEndpointResourceType::Interface;
292291
notification.RequestType = hns::ModifyRequestType::Update;
293-
notification.Settings.NlMtu = m_networkMtu;
294292
notification.Settings.Connected = true;
293+
notification.Settings.NlMtu = m_networkMtu;
295294

296-
WSL_LOG("VirtioNetworking::UpdateMtu", TraceLoggingValue(m_networkMtu, "VirtioMtu"));
295+
WSL_LOG(
296+
"VirtioNetworking::UpdateMtu",
297+
TraceLoggingValue(m_adapterId, "endpointId"),
298+
TraceLoggingValue(m_networkMtu, "virtioMtu"));
297299

298-
// TODO: Why was this commented ?
299-
// m_gnsChannel.SendHnsNotification(ToJsonW(notification).c_str(), m_endpointId);
300+
m_gnsChannel.SendHnsNotification(ToJsonW(notification).c_str(), m_adapterId);
300301
}
301302
}
302303

src/windows/common/VirtioNetworking.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class VirtioNetworking : public INetworkingEngine
1414
{
1515
public:
1616
VirtioNetworking(GnsChannel&& gnsChannel, bool enableLocalhostRelay, std::shared_ptr<GuestDeviceManager> guestDeviceManager, wil::shared_handle userToken);
17-
~VirtioNetworking() = default;
17+
~VirtioNetworking();
1818

1919
// Note: This class cannot be moved because m_networkNotifyHandle captures a 'this' pointer.
2020
VirtioNetworking(const VirtioNetworking&) = delete;

src/windows/common/WslCoreNetworkingSupport.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,3 +248,25 @@ wsl::core::networking::EphemeralHcnEndpoint wsl::core::networking::CreateEphemer
248248

249249
return endpoint;
250250
}
251+
252+
std::optional<ULONG> wsl::core::networking::GetMinimumConnectedInterfaceMtu() noexcept
253+
{
254+
std::optional<ULONG> minMtu{};
255+
try
256+
{
257+
unique_interface_table interfaceTable{};
258+
THROW_IF_WIN32_ERROR(::GetIpInterfaceTable(AF_UNSPEC, &interfaceTable));
259+
260+
for (ULONG index = 0; index < interfaceTable.get()->NumEntries; index++)
261+
{
262+
const auto& ipInterface = interfaceTable.get()->Table[index];
263+
if (ipInterface.Connected)
264+
{
265+
minMtu = std::min(minMtu.value_or(ipInterface.NlMtu), ipInterface.NlMtu);
266+
}
267+
}
268+
}
269+
CATCH_LOG()
270+
271+
return minMtu;
272+
}

src/windows/common/WslCoreNetworkingSupport.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,11 @@ std::vector<wsl::core::networking::CurrentInterfaceInformation> EnumerateConnect
456456

457457
bool IsMetered(ABI::Windows::Networking::Connectivity::NetworkCostType cost) noexcept;
458458

459+
/// <summary>
460+
/// Gets the minimum MTU across all connected network interfaces.
461+
/// </summary>
462+
std::optional<ULONG> GetMinimumConnectedInterfaceMtu() noexcept;
463+
459464
/// <summary>
460465
/// This instance acts as an IP_ADAPTER_ADDRESS pointer.
461466
/// </summary>

0 commit comments

Comments
 (0)