1 // SoftEther VPN Source Code - Developer Edition Master Branch
2 // Cedar Communication Module
3 
4 
5 // Nat.h
6 // Header of Nat.c
7 
8 #ifndef	NAT_H
9 #define	NAT_H
10 
11 #include "Cedar.h"
12 #include "Virtual.h"
13 
14 #include "Mayaqua/Kernel.h"
15 
16 // Constants
17 #define	NAT_CONFIG_FILE_NAME			"$vpn_router.config"	// NAT configuration file
18 #define	DEFAULT_NAT_ADMIN_PORT			2828		// Default port number for management
19 #define	NAT_ADMIN_PORT_LISTEN_INTERVAL	1000		// Interval for trying to open a port for management
20 #define	NAT_FILE_SAVE_INTERVAL			(30 * 1000)	// Interval to save
21 
22 
23 // NAT object
24 struct NAT
25 {
26 	LOCK *lock;							// Lock
27 	UCHAR HashedPassword[SHA1_SIZE];	// Administrative password
28 	VH_OPTION Option;					// Option
29 	CEDAR *Cedar;						// Cedar
30 	UINT AdminPort;						// Management port number
31 	bool Online;						// Online flag
32 	VH *Virtual;						// Virtual host object
33 	CLIENT_OPTION *ClientOption;		// Client Option
34 	CLIENT_AUTH *ClientAuth;			// Client authentication data
35 	CFG_RW *CfgRw;						// Config file R/W
36 	THREAD *AdminAcceptThread;			// Management connection reception thread
37 	SOCK *AdminListenSock;				// Management port socket
38 	EVENT *HaltEvent;					// Halting event
39 	volatile bool Halt;					// Halting flag
40 	LIST *AdminList;					// Management thread list
41 	X *AdminX;							// Server certificate for management
42 	K *AdminK;							// Server private key for management
43 	SNAT *SecureNAT;					// SecureNAT object
44 };
45 
46 // NAT management connection
47 struct NAT_ADMIN
48 {
49 	NAT *Nat;							// NAT
50 	SOCK *Sock;							// Socket
51 	THREAD *Thread;						// Thread
52 };
53 
54 // RPC_DUMMY
55 struct RPC_DUMMY
56 {
57 	UINT DummyValue;
58 };
59 
60 // RPC_NAT_STATUS
61 struct RPC_NAT_STATUS
62 {
63 	char HubName[MAX_HUBNAME_LEN + 1];			// HUB name
64 	UINT NumTcpSessions;						// Number of TCP sessions
65 	UINT NumUdpSessions;						// Ntmber of UDP sessions
66 	UINT NumIcmpSessions;						// Number of ICMP sessions
67 	UINT NumDnsSessions;						// Number of DNS sessions
68 	UINT NumDhcpClients;						// Number of DHCP clients
69 	bool IsKernelMode;							// Whether kernel mode
70 	bool IsRawIpMode;							// Whether raw IP mode
71 };
72 
73 // RPC_NAT_INFO *
74 struct RPC_NAT_INFO
75 {
76 	char NatProductName[128];					// Server product name
77 	char NatVersionString[128];					// Server version string
78 	char NatBuildInfoString[128];				// Server build information string
79 	UINT NatVerInt;								// Server version integer value
80 	UINT NatBuildInt;							// Server build number integer value
81 	char NatHostName[MAX_HOST_NAME_LEN + 1];	// Server host name
82 	OS_INFO OsInfo;								// OS information
83 	MEMINFO MemInfo;							// Memory information
84 };
85 
86 // RPC_ENUM_NAT_ITEM
87 struct RPC_ENUM_NAT_ITEM
88 {
89 	UINT Id;									// ID
90 	UINT Protocol;								// Protocol
91 	UINT SrcIp;									// Source IP address
92 	char SrcHost[MAX_HOST_NAME_LEN + 1];		// Source host name
93 	UINT SrcPort;								// Source port number
94 	UINT DestIp;								// Destination IP address
95 	char DestHost[MAX_HOST_NAME_LEN + 1];		// Destination host name
96 	UINT DestPort;								// Destination port number
97 	UINT64 CreatedTime;							// Connection time
98 	UINT64 LastCommTime;						// Last communication time
99 	UINT64 SendSize;							// Transmission size
100 	UINT64 RecvSize;							// Receive size
101 	UINT TcpStatus;								// TCP state
102 };
103 
104 // RPC_ENUM_NAT *
105 struct RPC_ENUM_NAT
106 {
107 	char HubName[MAX_HUBNAME_LEN + 1];			// HUB name
108 	UINT NumItem;								// Number of items
109 	RPC_ENUM_NAT_ITEM *Items;					// Item
110 };
111 
112 // RPC_ENUM_DHCP_ITEM
113 struct RPC_ENUM_DHCP_ITEM
114 {
115 	UINT Id;									// ID
116 	UINT64 LeasedTime;							// Lease time
117 	UINT64 ExpireTime;							// Expiration date
118 	UCHAR MacAddress[6];						// MAC address
119 	UCHAR Padding[2];							// Padding
120 	UINT IpAddress;								// IP address
121 	UINT Mask;									// Subnet mask
122 	char Hostname[MAX_HOST_NAME_LEN + 1];		// Host name
123 };
124 
125 // RPC_ENUM_DHCP *
126 struct RPC_ENUM_DHCP
127 {
128 	char HubName[MAX_HUBNAME_LEN + 1];			// HUB name
129 	UINT NumItem;								// Number of items
130 	RPC_ENUM_DHCP_ITEM *Items;					// Item
131 };
132 
133 
134 // Function prototype
135 NAT *NiNewNat();
136 NAT *NiNewNatEx(SNAT *snat, VH_OPTION *o);
137 void NiFreeNat(NAT *n);
138 void NiInitConfig(NAT *n);
139 void NiFreeConfig(NAT *n);
140 void NiInitDefaultConfig(NAT *n);
141 void NiSetDefaultVhOption(NAT *n, VH_OPTION *o);
142 void NiClearUnsupportedVhOptionForDynamicHub(VH_OPTION *o, bool initial);
143 void NiWriteConfig(NAT *n);
144 void NiWriteVhOption(NAT *n, FOLDER *root);
145 void NiWriteVhOptionEx(VH_OPTION *o, FOLDER *root);
146 void NiWriteClientData(NAT *n, FOLDER *root);
147 void NiLoadVhOption(NAT *n, FOLDER *root);
148 void NiLoadVhOptionEx(VH_OPTION *o, FOLDER *root);
149 bool NiLoadConfig(NAT *n, FOLDER *root);
150 void NiLoadClientData(NAT *n, FOLDER *root);
151 void NiInitAdminAccept(NAT *n);
152 void NiFreeAdminAccept(NAT *n);
153 void NiListenThread(THREAD *thread, void *param);
154 void NiAdminThread(THREAD *thread, void *param);
155 void NiAdminMain(NAT *n, SOCK *s);
156 PACK *NiRpcServer(RPC *r, char *name, PACK *p);
157 
158 RPC *NatAdminConnect(CEDAR *cedar, char *hostname, UINT port, void *hashed_password, UINT *err);
159 void NatAdminDisconnect(RPC *r);
160 
161 void NtStartNat();
162 void NtStopNat();
163 void NtInit();
164 void NtFree();
165 
166 
167 UINT NtOnline(NAT *n, RPC_DUMMY *t);
168 UINT NtOffline(NAT *n, RPC_DUMMY *t);
169 UINT NtSetHostOption(NAT *n, VH_OPTION *t);
170 UINT NtGetHostOption(NAT *n, VH_OPTION *t);
171 UINT NtSetClientConfig(NAT *n, RPC_CREATE_LINK *t);
172 UINT NtGetClientConfig(NAT *n, RPC_CREATE_LINK *t);
173 UINT NtGetStatus(NAT *n, RPC_NAT_STATUS *t);
174 UINT NtGetInfo(NAT *n, RPC_NAT_INFO *t);
175 UINT NtEnumNatList(NAT *n, RPC_ENUM_NAT *t);
176 UINT NtEnumDhcpList(NAT *n, RPC_ENUM_DHCP *t);
177 UINT NtSetPassword(NAT *n, RPC_SET_PASSWORD *t);
178 
179 
180 UINT NcOnline(RPC *r, RPC_DUMMY *t);
181 UINT NcOffline(RPC *r, RPC_DUMMY *t);
182 UINT NcSetHostOption(RPC *r, VH_OPTION *t);
183 UINT NcGetHostOption(RPC *r, VH_OPTION *t);
184 UINT NcSetClientConfig(RPC *r, RPC_CREATE_LINK *t);
185 UINT NcGetClientConfig(RPC *r, RPC_CREATE_LINK *t);
186 UINT NcGetStatus(RPC *r, RPC_NAT_STATUS *t);
187 UINT NcGetInfo(RPC *r, RPC_NAT_INFO *t);
188 UINT NcEnumNatList(RPC *r, RPC_ENUM_NAT *t);
189 UINT NcEnumDhcpList(RPC *r, RPC_ENUM_DHCP *t);
190 UINT NcSetPassword(RPC *r, RPC_SET_PASSWORD *t);
191 
192 
193 
194 
195 void InRpcEnumDhcp(RPC_ENUM_DHCP *t, PACK *p);
196 void OutRpcEnumDhcp(PACK *p, RPC_ENUM_DHCP *t);
197 void FreeRpcEnumDhcp(RPC_ENUM_DHCP *t);
198 void InRpcEnumNat(RPC_ENUM_NAT *t, PACK *p);
199 void OutRpcEnumNat(PACK *p, RPC_ENUM_NAT *t);
200 void FreeRpcEnumNat(RPC_ENUM_NAT *t);
201 void InRpcNatInfo(RPC_NAT_INFO *t, PACK *p);
202 void OutRpcNatInfo(PACK *p, RPC_NAT_INFO *t);
203 void FreeRpcNatInfo(RPC_NAT_INFO *t);
204 void InRpcNatStatus(RPC_NAT_STATUS *t, PACK *p);
205 void OutRpcNatStatus(PACK *p, RPC_NAT_STATUS *t);
206 void FreeRpcNatStatus(RPC_NAT_STATUS *t);
207 void InVhOption(VH_OPTION *t, PACK *p);
208 void OutVhOption(PACK *p, VH_OPTION *t);
209 void InRpcDummy(RPC_DUMMY *t, PACK *p);
210 void OutRpcDummy(PACK *p, RPC_DUMMY *t);
211 
212 
213 
214 
215 #endif	// NAT_H
216 
217 
218