master
h 88 lines 2.64 KB
Raw
1 // Copyright (C) Microsoft Corporation. All rights reserved.
2
3 #pragma once
4 #include <memory>
5 #include <optional>
6 #include <utility>
7 #include <hcs.hpp>
8
9 #include "WslCoreNetworkEndpointSettings.h"
10 #include "WslCoreTcpIpStateTracking.h"
11
12 namespace wsl::core::networking {
13
14 struct NetworkEndpoint
15 {
16 NetworkEndpoint() = default;
17
18 ~NetworkEndpoint() noexcept
19 {
20 DeleteEndpoint();
21 }
22
23 NetworkEndpoint(NetworkEndpoint&&) = default;
24 NetworkEndpoint& operator=(NetworkEndpoint&& source) noexcept
25 {
26 if (this != &source)
27 {
28 DeleteEndpoint();
29 StateTracking.reset();
30
31 Network = std::move(source.Network);
32 NetworkId = source.NetworkId;
33 EndpointId = source.EndpointId;
34 InterfaceGuid = source.InterfaceGuid;
35 InterfaceLuid = source.InterfaceLuid;
36 Endpoint = std::move(source.Endpoint);
37 StateTracking = std::move(source.StateTracking);
38 }
39
40 return *this;
41 }
42
43 NetworkEndpoint(const NetworkEndpoint&) = delete;
44 NetworkEndpoint& operator=(const NetworkEndpoint&) = delete;
45
46 std::shared_ptr<NetworkSettings> Network;
47 GUID NetworkId{};
48 GUID EndpointId{};
49 GUID InterfaceGuid{};
50 NET_LUID InterfaceLuid{};
51 windows::common::hcs::unique_hcn_endpoint Endpoint{};
52 std::optional<IpStateTracking> StateTracking;
53
54 void DeleteEndpoint() noexcept
55 {
56 if (Endpoint)
57 {
58 wil::unique_cotaskmem_string error;
59 LOG_IF_FAILED_MSG(::HcnDeleteEndpoint(EndpointId, &error), "error message: %ls", error.get());
60 Endpoint.reset();
61 }
62 }
63
64 void TraceLoggingRundown() const
65 {
66 if (Network)
67 {
68 WSL_LOG(
69 "NetworkEndpoint::TraceLoggingRundown",
70 TraceLoggingValue(NetworkId, "networkId"),
71 TraceLoggingValue(EndpointId, "endpointId"),
72 TraceLoggingValue(InterfaceGuid, "interfaceGuid"),
73 TraceLoggingValue(InterfaceLuid.Value, "interfaceLuid"),
74 TRACE_NETWORKSETTINGS_OBJECT(Network));
75 }
76 else
77 {
78 WSL_LOG(
79 "NetworkEndpoint::TraceLoggingRundown",
80 TraceLoggingValue(NetworkId, "networkId"),
81 TraceLoggingValue(EndpointId, "endpointId"),
82 TraceLoggingValue(InterfaceGuid, "interfaceGuid"),
83 TraceLoggingValue(InterfaceLuid.Value, "interfaceLuid"),
84 TraceLoggingValue("null", "Network"));
85 }
86 }
87 };
88 } // namespace wsl::core::networking