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