#pragma once #include #include #include "leaf.h" #include "CustomBuffer.h" #include "winrt/Windows.Networking.Sockets.h" #include "winrt/Windows.Networking.Vpn.h" namespace winrt::Maple_Task::implementation { static const hstring CONFIG_PATH_SETTING_KEY = L"CONFIG_PATH"; static const hstring NETIF_SETTING_KEY = L"NETIF"; struct VpnPlugin : implements { VpnPlugin() = default; void Connect(Windows::Networking::Vpn::VpnChannel const& channel); void Disconnect(Windows::Networking::Vpn::VpnChannel const& channel); void GetKeepAlivePayload(Windows::Networking::Vpn::VpnChannel const& channel, Windows::Networking::Vpn::VpnPacketBuffer& keepAlivePacket); void Encapsulate(Windows::Networking::Vpn::VpnChannel const& channel, Windows::Networking::Vpn::VpnPacketBufferList const& packets, Windows::Networking::Vpn::VpnPacketBufferList const& encapulatedPackets); void Decapsulate(Windows::Networking::Vpn::VpnChannel const& channel, Windows::Networking::Vpn::VpnPacketBuffer const& encapBuffer, Windows::Networking::Vpn::VpnPacketBufferList const& decapsulatedPackets, Windows::Networking::Vpn::VpnPacketBufferList const& controlPacketsToSend); void ConnectCore(Windows::Networking::Vpn::VpnChannel const& channel); void StopLeaf(); Leaf* m_leaf{}; NetStackHandle* m_netStackHandle{}; Windows::Networking::Sockets::DatagramSocket m_backTransport{ nullptr }; std::mutex m_decapQueueLock{}; std::queue> m_decapQueue{}; }; static const uint8_t dummyArr[] = { 0 }; static const auto dummyBuffer = winrt::make(const_cast(static_cast(dummyArr)), static_cast(sizeof(dummyArr))); static auto VpnPluginInstance = winrt::make_self(); }