2017-10-19 05:48:23 +03:00
|
|
|
// SoftEther VPN Source Code - Developer Edition Master Branch
|
2014-01-04 17:00:08 +04:00
|
|
|
// Cedar Communication Module
|
|
|
|
|
|
|
|
|
|
|
|
// Listener.h
|
|
|
|
// Header of Listener.c
|
|
|
|
|
|
|
|
#ifndef LISTENER_H
|
|
|
|
#define LISTENER_H
|
|
|
|
|
2021-04-05 05:48:25 +03:00
|
|
|
#include "CedarType.h"
|
|
|
|
|
|
|
|
#include "Mayaqua/Kernel.h"
|
2014-01-04 17:00:08 +04:00
|
|
|
|
|
|
|
// Function to call when receiving a new connection
|
|
|
|
typedef void (NEW_CONNECTION_PROC)(CONNECTION *c);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Listener structure
|
|
|
|
struct LISTENER
|
|
|
|
{
|
|
|
|
LOCK *lock; // Lock
|
|
|
|
REF *ref; // Reference counter
|
|
|
|
CEDAR *Cedar; // Cedar
|
|
|
|
UINT Protocol; // Protocol
|
|
|
|
UINT Port; // Port number
|
|
|
|
THREAD *Thread; // Operating thread
|
|
|
|
SOCK *Sock; // Socket
|
|
|
|
EVENT *Event; // Event
|
|
|
|
volatile bool Halt; // Halting flag
|
|
|
|
UINT Status; // State
|
|
|
|
|
|
|
|
|
|
|
|
THREAD_PROC *ThreadProc; // Thread procedure
|
|
|
|
void *ThreadParam; // Thread parameters
|
|
|
|
bool LocalOnly; // Can be connected only from localhost
|
|
|
|
bool ShadowIPv6; // Flag indicating that the shadow IPv6 listener
|
|
|
|
LISTENER *ShadowListener; // Reference to managing shadow IPv6 listener
|
|
|
|
bool DisableDos; // Disable the DoS attack detection
|
|
|
|
volatile UINT *NatTGlobalUdpPort; // NAT-T global UDP port number
|
|
|
|
UCHAR RandPortId; // NAT-T UDP random port ID
|
|
|
|
bool EnableConditionalAccept; // The flag of whether to enable the Conditional Accept
|
|
|
|
};
|
|
|
|
|
|
|
|
// Parameters of TCPAcceptedThread
|
|
|
|
struct TCP_ACCEPTED_PARAM
|
|
|
|
{
|
|
|
|
LISTENER *r;
|
|
|
|
SOCK *s;
|
|
|
|
};
|
|
|
|
|
|
|
|
// UDP entry
|
|
|
|
struct UDP_ENTRY
|
|
|
|
{
|
|
|
|
UINT SessionKey32; // 32bit session key
|
|
|
|
SESSION *Session; // Reference to the session
|
|
|
|
};
|
|
|
|
|
|
|
|
// Dynamic listener
|
|
|
|
struct DYNAMIC_LISTENER
|
|
|
|
{
|
|
|
|
UINT Protocol; // Protocol
|
|
|
|
UINT Port; // Port
|
|
|
|
LOCK *Lock; // Lock
|
|
|
|
CEDAR *Cedar; // Cedar
|
|
|
|
bool *EnablePtr; // A pointer to the flag of the valid / invalid state
|
|
|
|
LISTENER *Listener; // Listener
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Function prototype
|
|
|
|
LISTENER *NewListener(CEDAR *cedar, UINT proto, UINT port);
|
|
|
|
LISTENER *NewListenerEx(CEDAR *cedar, UINT proto, UINT port, THREAD_PROC *proc, void *thread_param);
|
|
|
|
LISTENER *NewListenerEx2(CEDAR *cedar, UINT proto, UINT port, THREAD_PROC *proc, void *thread_param, bool local_only);
|
|
|
|
LISTENER *NewListenerEx3(CEDAR *cedar, UINT proto, UINT port, THREAD_PROC *proc, void *thread_param, bool local_only, bool shadow_ipv6);
|
|
|
|
LISTENER *NewListenerEx4(CEDAR *cedar, UINT proto, UINT port, THREAD_PROC *proc, void *thread_param, bool local_only, bool shadow_ipv6,
|
|
|
|
volatile UINT *natt_global_udp_port, UCHAR rand_port_id);
|
|
|
|
LISTENER *NewListenerEx5(CEDAR *cedar, UINT proto, UINT port, THREAD_PROC *proc, void *thread_param, bool local_only, bool shadow_ipv6,
|
|
|
|
volatile UINT *natt_global_udp_port, UCHAR rand_port_id, bool enable_ca);
|
|
|
|
void ReleaseListener(LISTENER *r);
|
|
|
|
void CleanupListener(LISTENER *r);
|
|
|
|
void ListenerThread(THREAD *thread, void *param);
|
|
|
|
void ListenerTCPMainLoop(LISTENER *r);
|
|
|
|
void StopListener(LISTENER *r);
|
|
|
|
int CompareListener(void *p1, void *p2);
|
|
|
|
void TCPAccepted(LISTENER *r, SOCK *s);
|
|
|
|
void EnableDosProtect();
|
|
|
|
void DisableDosProtect();
|
|
|
|
void TCPAcceptedThread(THREAD *t, void *param);
|
|
|
|
void ListenerUDPMainLoop(LISTENER *r);
|
|
|
|
void UDPReceivedPacket(CEDAR *cedar, SOCK *s, IP *ip, UINT port, void *data, UINT size);
|
|
|
|
int CompareUDPEntry(void *p1, void *p2);
|
|
|
|
void CleanupUDPEntry(CEDAR *cedar);
|
|
|
|
void AddUDPEntry(CEDAR *cedar, SESSION *session);
|
|
|
|
void DelUDPEntry(CEDAR *cedar, SESSION *session);
|
|
|
|
SESSION *GetSessionFromUDPEntry(CEDAR *cedar, UINT key32);
|
|
|
|
UINT GetMaxConnectionsPerIp();
|
|
|
|
void SetMaxConnectionsPerIp(UINT num);
|
|
|
|
UINT GetMaxUnestablishedConnections();
|
|
|
|
void SetMaxUnestablishedConnections(UINT num);
|
|
|
|
DYNAMIC_LISTENER *NewDynamicListener(CEDAR *c, bool *enable_ptr, UINT protocol, UINT port);
|
|
|
|
void ApplyDynamicListener(DYNAMIC_LISTENER *d);
|
|
|
|
void FreeDynamicListener(DYNAMIC_LISTENER *d);
|
|
|
|
bool ListenerRUDPRpcRecvProc(RUDP_STACK *r, UDPPACKET *p);
|
|
|
|
void ListenerSetProcRecvRpcEnable(bool b);
|
|
|
|
|
|
|
|
|
|
|
|
#endif // LISTENER_H
|
|
|
|
|
|
|
|
|