// SPDX-License-Identifier: AGPL-1.0-only // Copyright (C) 2018 Ludvig Strigeus . All Rights Reserved. #ifndef TINYVPN_NETAPI_H_ #define TINYVPN_NETAPI_H_ #include "tunsafe_types.h" #include "tunsafe_ipaddr.h" #include #include #if !defined(OS_WIN) #include #include #include #include #endif #pragma warning (disable: 4200) struct Packet { union { Packet *next; #if defined(OS_WIN) SLIST_ENTRY list_entry; #endif }; unsigned int post_target, size; byte *data; #if defined(OS_WIN) OVERLAPPED overlapped; // For Windows overlapped IO #endif IpAddr addr; // Optionally set to target/source of the packet int sin_size; byte data_pre[4]; byte data_buf[0]; enum { // there's always this much data before data_ptr HEADROOM_BEFORE = 64, }; }; enum { kPacketAllocSize = 2048 - 16, kPacketCapacity = kPacketAllocSize - sizeof(Packet) - Packet::HEADROOM_BEFORE, }; void FreePacket(Packet *packet); void FreePackets(Packet *packet, Packet **end, int count); Packet *AllocPacket(); void FreeAllPackets(); class TunInterface { public: struct PrePostCommands { std::vector pre_up; std::vector post_up; std::vector pre_down; std::vector post_down; }; struct TunConfig { // no, yes(firewall), yes(route), yes(both), 255(default) uint8 internet_blocking; bool block_dns_on_adapters; // Set mtu int mtu; // The ipv6 and ipv4 addresses std::vector addresses; // Set this to configure DNS server std::vector dns; // This holds all cidr addresses to add as additional routing entries std::vector included_routes; // This holds all the ips to exclude std::vector excluded_routes; // This holds the pre/post commands PrePostCommands pre_post_commands; }; struct TunConfigOut { bool enable_neighbor_discovery_spoofing; uint8 neighbor_discovery_spoofing_mac[6]; }; virtual bool Configure(const TunConfig &&config, TunConfigOut *out) = 0; virtual void WriteTunPacket(Packet *packet) = 0; }; class UdpInterface { public: virtual bool Configure(int listen_port) = 0; virtual void WriteUdpPacket(Packet *packet) = 0; }; extern bool g_allow_pre_post; #endif // TINYVPN_NETAPI_H_