1 // SoftEther VPN Source Code - Developer Edition Master Branch
2 // Cedar Communication Module
3 
4 
5 // VLanWin32.h
6 // Header of VLanWin32.c
7 
8 #ifdef OS_WIN32
9 
10 #ifndef	VLANWIN32_H
11 #define	VLANWIN32_H
12 
13 #include "CedarType.h"
14 
15 #include "VLan.h"
16 
17 #include "Mayaqua/Network.h"
18 
19 // Routing table tracking timer
20 #define	TRACKING_INTERVAL_INITIAL		444		// Initial
21 #define	TRACKING_INTERVAL_ADD			444		// Adding value
22 #define	TRACKING_INTERVAL_MAX			12345	// Maximum value
23 #define	TRACKING_INTERVAL_MAX_RC		87654	// Maximum value (OS which change detection mechanism enabled)
24 
25 
26 typedef void *HANDLE;
27 
28 // Routing tracking state machine
29 struct ROUTE_TRACKING
30 {
31 	UINT VLanInterfaceId;
32 	ROUTE_ENTRY *RouteToServer;
33 	bool RouteToServerAlreadyExists;
34 	ROUTE_ENTRY *DefaultGatewayByVLan;
35 	ROUTE_ENTRY *VistaDefaultGateway1, *VistaDefaultGateway2, *VistaOldDefaultGatewayByVLan;
36 	ROUTE_ENTRY *RouteToDefaultDns;
37 	ROUTE_ENTRY *RouteToEight;
38 	ROUTE_ENTRY *RouteToNatTServer;
39 	ROUTE_ENTRY *RouteToRealServerGlobal;
40 	UINT64 NextTrackingTime;
41 	UINT64 NextTrackingTimeAdd;
42 	UINT64 NextRouteChangeCheckTime;
43 	UINT LastRoutingTableHash;
44 	QUEUE *DeletedDefaultGateway;
45 	UINT OldDefaultGatewayMetric;
46 	IP OldDnsServer;
47 	bool VistaAndUsingPPP;
48 	ROUTE_CHANGE *RouteChange;
49 };
50 
51 // VLAN structure
52 struct VLAN
53 {
54 	volatile bool Halt;			// Halting flag
55 	char *InstanceName;			// Instance name
56 	char *DeviceNameWin32;		// Win32 device name
57 	char *EventNameWin32;		// Win32 event name
58 	HANDLE Handle;				// Device driver file
59 	HANDLE Event;				// Handle of the event
60 	void *GetBuffer;			// Sent packet capturing buffer
61 	UINT CurrentPacketCount;	// Packet number to be read next
62 	void *PutBuffer;			// Buffer for writing received packet
63 	ROUTE_TRACKING *RouteState;	// Routing tracking state machine
64 };
65 
66 // Instance list
67 struct INSTANCE_LIST
68 {
69 	UINT NumInstance;
70 	char **InstanceName;
71 };
72 
73 
74 // Function prototype
75 VLAN *NewVLan(char *instance_name, VLAN_PARAM *param);
76 void FreeVLan(VLAN *v);
77 CANCEL *VLanGetCancel(VLAN *v);
78 bool VLanGetNextPacket(VLAN *v, void **buf, UINT *size);
79 bool VLanGetPacketsFromDriver(VLAN *v);
80 bool VLanPutPacketsToDriver(VLAN *v);
81 bool VLanPutPacket(VLAN *v, void *buf, UINT size);
82 
83 PACKET_ADAPTER *VLanGetPacketAdapter();
84 bool VLanPaInit(SESSION *s);
85 CANCEL *VLanPaGetCancel(SESSION *s);
86 UINT VLanPaGetNextPacket(SESSION *s, void **data);
87 bool VLanPaPutPacket(SESSION *s, void *data, UINT size);
88 void VLanPaFree(SESSION *s);
89 
90 INSTANCE_LIST *GetInstanceList();
91 void FreeInstanceList(INSTANCE_LIST *n);
92 UINT GetInstanceId(char *name);
93 
94 void RouteTrackingStart(SESSION *s);
95 void RouteTrackingStop(SESSION *s, ROUTE_TRACKING *t);
96 void RouteTrackingMain(SESSION *s);
97 
98 void Win32GetWinVer(RPC_WINVER *v);
99 
100 #endif // VLANWIN32_H
101 
102 #endif // OS_WIN32
103