mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2024-11-22 17:39:53 +03:00
Merge PR #337: Put TUN down on client disconnect.
This commit is contained in:
commit
d4d17549c4
@ -598,7 +598,7 @@ ETH *OpenEthLinux(char *name, bool local, bool tapmode, char *tapaddr)
|
|||||||
{
|
{
|
||||||
#ifndef NO_VLAN
|
#ifndef NO_VLAN
|
||||||
// In tap mode
|
// In tap mode
|
||||||
VLAN *v = NewTap(name, tapaddr);
|
VLAN *v = NewTap(name, tapaddr, true);
|
||||||
if (v == NULL)
|
if (v == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -3854,6 +3854,7 @@ void InRpcClientConfig(CLIENT_CONFIG *c, PACK *p)
|
|||||||
c->KeepConnectProtocol = PackGetInt(p, "KeepConnectProtocol");
|
c->KeepConnectProtocol = PackGetInt(p, "KeepConnectProtocol");
|
||||||
c->KeepConnectInterval = PackGetInt(p, "KeepConnectInterval");
|
c->KeepConnectInterval = PackGetInt(p, "KeepConnectInterval");
|
||||||
c->AllowRemoteConfig = PackGetInt(p, "AllowRemoteConfig") == 0 ? false : true;
|
c->AllowRemoteConfig = PackGetInt(p, "AllowRemoteConfig") == 0 ? false : true;
|
||||||
|
c->NicDownOnDisconnect = PackGetBool(p, "NicDownOnDisconnect");
|
||||||
PackGetStr(p, "KeepConnectHost", c->KeepConnectHost, sizeof(c->KeepConnectHost));
|
PackGetStr(p, "KeepConnectHost", c->KeepConnectHost, sizeof(c->KeepConnectHost));
|
||||||
}
|
}
|
||||||
void OutRpcClientConfig(PACK *p, CLIENT_CONFIG *c)
|
void OutRpcClientConfig(PACK *p, CLIENT_CONFIG *c)
|
||||||
@ -3869,6 +3870,7 @@ void OutRpcClientConfig(PACK *p, CLIENT_CONFIG *c)
|
|||||||
PackAddInt(p, "KeepConnectProtocol", c->KeepConnectProtocol);
|
PackAddInt(p, "KeepConnectProtocol", c->KeepConnectProtocol);
|
||||||
PackAddInt(p, "KeepConnectInterval", c->KeepConnectInterval);
|
PackAddInt(p, "KeepConnectInterval", c->KeepConnectInterval);
|
||||||
PackAddInt(p, "AllowRemoteConfig", c->AllowRemoteConfig);
|
PackAddInt(p, "AllowRemoteConfig", c->AllowRemoteConfig);
|
||||||
|
PackAddBool(p, "NicDownOnDisconnect", c->NicDownOnDisconnect);
|
||||||
PackAddStr(p, "KeepConnectHost", c->KeepConnectHost);
|
PackAddStr(p, "KeepConnectHost", c->KeepConnectHost);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6657,7 +6659,7 @@ bool CtConnect(CLIENT *c, RPC_CLIENT_CONNECT *connect)
|
|||||||
|
|
||||||
CLog(c, "LC_CONNECT", connect->AccountName);
|
CLog(c, "LC_CONNECT", connect->AccountName);
|
||||||
|
|
||||||
r->ClientSession = NewClientSessionEx(c->Cedar, r->ClientOption, r->ClientAuth, pa, r);
|
r->ClientSession = NewClientSessionEx(c->Cedar, r->ClientOption, r->ClientAuth, pa, r, &c->Config.NicDownOnDisconnect);
|
||||||
Notify(r->ClientSession, CLIENT_NOTIFY_ACCOUNT_CHANGED);
|
Notify(r->ClientSession, CLIENT_NOTIFY_ACCOUNT_CHANGED);
|
||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
@ -6674,6 +6676,82 @@ bool CtConnect(CLIENT *c, RPC_CLIENT_CONNECT *connect)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Put all unused TUN interfaces down
|
||||||
|
// Requires account and VLan lists of the CLIENT argument to be already locked
|
||||||
|
bool CtVLansDown(CLIENT *c)
|
||||||
|
{
|
||||||
|
#ifndef UNIX_LINUX
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
int i;
|
||||||
|
LIST *tmpVLanList;
|
||||||
|
UNIX_VLAN t, *r;
|
||||||
|
bool result = true;
|
||||||
|
|
||||||
|
if (c == NULL)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpVLanList = CloneList(c->UnixVLanList);
|
||||||
|
if (tmpVLanList == NULL)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove from tmpVLanList all VLans corresponding to active sessions
|
||||||
|
for (i = 0; i < LIST_NUM(c->AccountList); ++i)
|
||||||
|
{
|
||||||
|
ACCOUNT *a = LIST_DATA(c->AccountList, i);
|
||||||
|
if (a->ClientSession == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Zero(&t, sizeof(t));
|
||||||
|
StrCpy(t.Name, sizeof(t.Name), a->ClientOption->DeviceName);
|
||||||
|
r = Search(tmpVLanList, &t);
|
||||||
|
Delete(tmpVLanList, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set down every VLan in tmpVLanList
|
||||||
|
for (i = 0; i < LIST_NUM(tmpVLanList) && result; ++i)
|
||||||
|
{
|
||||||
|
r = LIST_DATA(tmpVLanList, i);
|
||||||
|
result = UnixVLanSetState(r->Name, false);
|
||||||
|
// [MP:] Should we report *critical* error on failure?
|
||||||
|
}
|
||||||
|
|
||||||
|
ReleaseList(tmpVLanList);
|
||||||
|
return result;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put all TUN interfaces up
|
||||||
|
// Requires VLan list of the CLIENT argument to be already locked
|
||||||
|
bool CtVLansUp(CLIENT *c)
|
||||||
|
{
|
||||||
|
#ifndef UNIX_LINUX
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
int i;
|
||||||
|
UNIX_VLAN *r;
|
||||||
|
|
||||||
|
if (c == NULL)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < LIST_NUM(c->UnixVLanList); ++i)
|
||||||
|
{
|
||||||
|
r = LIST_DATA(c->UnixVLanList, i);
|
||||||
|
UnixVLanSetState(r->Name, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// Get the account information
|
// Get the account information
|
||||||
bool CtGetAccount(CLIENT *c, RPC_CLIENT_GET_ACCOUNT *a)
|
bool CtGetAccount(CLIENT *c, RPC_CLIENT_GET_ACCOUNT *a)
|
||||||
{
|
{
|
||||||
@ -6894,6 +6972,20 @@ bool CtSetClientConfig(CLIENT *c, CLIENT_CONFIG *o)
|
|||||||
}
|
}
|
||||||
Unlock(k->lock);
|
Unlock(k->lock);
|
||||||
|
|
||||||
|
// Apply TAP state
|
||||||
|
LockList(c->AccountList);
|
||||||
|
LockList(c->UnixVLanList);
|
||||||
|
if (o->NicDownOnDisconnect)
|
||||||
|
{
|
||||||
|
CtVLansDown(c);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CtVLansUp(c);
|
||||||
|
}
|
||||||
|
UnlockList(c->UnixVLanList);
|
||||||
|
UnlockList(c->AccountList);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8302,8 +8394,8 @@ bool CtCreateVLan(CLIENT *c, RPC_CLIENT_CREATE_VLAN *create)
|
|||||||
GenMacAddress(r->MacAddress);
|
GenMacAddress(r->MacAddress);
|
||||||
StrCpy(r->Name, sizeof(r->Name), create->DeviceName);
|
StrCpy(r->Name, sizeof(r->Name), create->DeviceName);
|
||||||
|
|
||||||
// Create a Tap
|
// Create a TUN
|
||||||
if (UnixVLanCreate(r->Name, r->MacAddress) == false)
|
if (UnixVLanCreate(r->Name, r->MacAddress, !c->Config.NicDownOnDisconnect) == false)
|
||||||
{
|
{
|
||||||
// Failure
|
// Failure
|
||||||
Free(r);
|
Free(r);
|
||||||
@ -9371,6 +9463,7 @@ void CiLoadClientConfig(CLIENT_CONFIG *c, FOLDER *f)
|
|||||||
c->AllowRemoteConfig = CfgGetBool(f, "AllowRemoteConfig");
|
c->AllowRemoteConfig = CfgGetBool(f, "AllowRemoteConfig");
|
||||||
c->KeepConnectInterval = MAKESURE(CfgGetInt(f, "KeepConnectInterval"), KEEP_INTERVAL_MIN, KEEP_INTERVAL_MAX);
|
c->KeepConnectInterval = MAKESURE(CfgGetInt(f, "KeepConnectInterval"), KEEP_INTERVAL_MIN, KEEP_INTERVAL_MAX);
|
||||||
c->NoChangeWcmNetworkSettingOnWindows8 = CfgGetBool(f, "NoChangeWcmNetworkSettingOnWindows8");
|
c->NoChangeWcmNetworkSettingOnWindows8 = CfgGetBool(f, "NoChangeWcmNetworkSettingOnWindows8");
|
||||||
|
c->NicDownOnDisconnect = CfgGetBool(f, "NicDownOnDisconnect");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the client authentication data
|
// Read the client authentication data
|
||||||
@ -9699,7 +9792,7 @@ void CiLoadVLan(CLIENT *c, FOLDER *f)
|
|||||||
Add(c->UnixVLanList, v);
|
Add(c->UnixVLanList, v);
|
||||||
|
|
||||||
#ifdef OS_UNIX
|
#ifdef OS_UNIX
|
||||||
UnixVLanCreate(v->Name, v->MacAddress);
|
UnixVLanCreate(v->Name, v->MacAddress, !c->Config.NicDownOnDisconnect);
|
||||||
#endif // OS_UNIX
|
#endif // OS_UNIX
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9923,6 +10016,7 @@ void CiWriteClientConfig(FOLDER *cc, CLIENT_CONFIG *config)
|
|||||||
CfgAddBool(cc, "AllowRemoteConfig", config->AllowRemoteConfig);
|
CfgAddBool(cc, "AllowRemoteConfig", config->AllowRemoteConfig);
|
||||||
CfgAddInt(cc, "KeepConnectInterval", config->KeepConnectInterval);
|
CfgAddInt(cc, "KeepConnectInterval", config->KeepConnectInterval);
|
||||||
CfgAddBool(cc, "NoChangeWcmNetworkSettingOnWindows8", config->NoChangeWcmNetworkSettingOnWindows8);
|
CfgAddBool(cc, "NoChangeWcmNetworkSettingOnWindows8", config->NoChangeWcmNetworkSettingOnWindows8);
|
||||||
|
CfgAddBool(cc, "NicDownOnDisconnect", config->NicDownOnDisconnect);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the client authentication data
|
// Write the client authentication data
|
||||||
|
@ -195,6 +195,7 @@ struct CLIENT_CONFIG
|
|||||||
UINT KeepConnectProtocol; // Protocol
|
UINT KeepConnectProtocol; // Protocol
|
||||||
UINT KeepConnectInterval; // Interval
|
UINT KeepConnectInterval; // Interval
|
||||||
bool NoChangeWcmNetworkSettingOnWindows8; // Don't change the WCM network settings on Windows 8
|
bool NoChangeWcmNetworkSettingOnWindows8; // Don't change the WCM network settings on Windows 8
|
||||||
|
bool NicDownOnDisconnect; // Put NIC down on disconnect/connection loss and put it up again after connecting to VPN server
|
||||||
};
|
};
|
||||||
|
|
||||||
// Version acquisition
|
// Version acquisition
|
||||||
|
@ -3119,6 +3119,9 @@ void PcMain(PC *pc)
|
|||||||
{"AccountImport", PcAccountImport},
|
{"AccountImport", PcAccountImport},
|
||||||
{"RemoteEnable", PcRemoteEnable},
|
{"RemoteEnable", PcRemoteEnable},
|
||||||
{"RemoteDisable", PcRemoteDisable},
|
{"RemoteDisable", PcRemoteDisable},
|
||||||
|
{"TUNDownOnDisconnectEnable", PcTunDownOnDisconnectEnable},
|
||||||
|
{"TUNDownOnDisconnectDisable", PcTunDownOnDisconnectDisable},
|
||||||
|
{"TUNDownOnDisconnectGet", PcTunDownOnDisconnectGet},
|
||||||
{"KeepEnable", PcKeepEnable},
|
{"KeepEnable", PcKeepEnable},
|
||||||
{"KeepDisable", PcKeepDisable},
|
{"KeepDisable", PcKeepDisable},
|
||||||
{"KeepSet", PcKeepSet},
|
{"KeepSet", PcKeepSet},
|
||||||
@ -6641,6 +6644,136 @@ UINT PcRemoteDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enable turning TUN interface up/down on client connect/disconnect
|
||||||
|
UINT PcTunDownOnDisconnectEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||||
|
{
|
||||||
|
LIST *o;
|
||||||
|
PC *pc = (PC *)param;
|
||||||
|
UINT ret = ERR_NO_ERROR;
|
||||||
|
CLIENT_CONFIG t;
|
||||||
|
|
||||||
|
// Get the parameter list
|
||||||
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
||||||
|
if (o == NULL)
|
||||||
|
{
|
||||||
|
return ERR_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
// RPC call
|
||||||
|
Zero(&t, sizeof(t));
|
||||||
|
|
||||||
|
ret = CcGetClientConfig(pc->RemoteClient, &t);
|
||||||
|
|
||||||
|
if (ret == ERR_NO_ERROR)
|
||||||
|
{
|
||||||
|
// Change the settings
|
||||||
|
t.NicDownOnDisconnect = true;
|
||||||
|
ret = CcSetClientConfig(pc->RemoteClient, &t);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret == ERR_NO_ERROR)
|
||||||
|
{
|
||||||
|
// Success
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != ERR_NO_ERROR)
|
||||||
|
{
|
||||||
|
// Error has occurred
|
||||||
|
CmdPrintError(c, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release of the parameter list
|
||||||
|
FreeParamValueList(o);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable turning TUN interface up/down on client connect/disconnect
|
||||||
|
UINT PcTunDownOnDisconnectDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||||
|
{
|
||||||
|
LIST *o;
|
||||||
|
PC *pc = (PC *)param;
|
||||||
|
UINT ret = ERR_NO_ERROR;
|
||||||
|
CLIENT_CONFIG t;
|
||||||
|
|
||||||
|
// Get the parameter list
|
||||||
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
||||||
|
if (o == NULL)
|
||||||
|
{
|
||||||
|
return ERR_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
// RPC call
|
||||||
|
Zero(&t, sizeof(t));
|
||||||
|
|
||||||
|
ret = CcGetClientConfig(pc->RemoteClient, &t);
|
||||||
|
|
||||||
|
if (ret == ERR_NO_ERROR)
|
||||||
|
{
|
||||||
|
// Change the settings
|
||||||
|
t.NicDownOnDisconnect = false;
|
||||||
|
ret = CcSetClientConfig(pc->RemoteClient, &t);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret == ERR_NO_ERROR)
|
||||||
|
{
|
||||||
|
// Success
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != ERR_NO_ERROR)
|
||||||
|
{
|
||||||
|
// Error has occurred
|
||||||
|
CmdPrintError(c, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release of the parameter list
|
||||||
|
FreeParamValueList(o);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get status of turning TUN interface up/down on client connect/disconnect
|
||||||
|
UINT PcTunDownOnDisconnectGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||||
|
{
|
||||||
|
LIST *o;
|
||||||
|
PC *pc = (PC *)param;
|
||||||
|
UINT ret = ERR_NO_ERROR;
|
||||||
|
CLIENT_CONFIG t;
|
||||||
|
|
||||||
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
||||||
|
if (o == NULL)
|
||||||
|
{
|
||||||
|
return ERR_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
// RPC call
|
||||||
|
Zero(&t, sizeof(t));
|
||||||
|
|
||||||
|
ret = CcGetClientConfig(pc->RemoteClient, &t);
|
||||||
|
|
||||||
|
if (ret == ERR_NO_ERROR)
|
||||||
|
{
|
||||||
|
wchar_t tmp[MAX_SIZE];
|
||||||
|
CT *ct = CtNewStandard();
|
||||||
|
|
||||||
|
CtInsert(ct, _UU("CMD_TUNDownOnDisconnectGet_COLUMN1"),
|
||||||
|
t.NicDownOnDisconnect ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"));
|
||||||
|
|
||||||
|
CtFree(ct, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != ERR_NO_ERROR)
|
||||||
|
{
|
||||||
|
// Error has occurred
|
||||||
|
CmdPrintError(c, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release of the parameter list
|
||||||
|
FreeParamValueList(o);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
// Enable the maintenance function of the Internet connection
|
// Enable the maintenance function of the Internet connection
|
||||||
UINT PcKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
UINT PcKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
||||||
{
|
{
|
||||||
|
@ -483,6 +483,9 @@ UINT PcAccountExport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
|||||||
UINT PcAccountImport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
UINT PcAccountImport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||||
UINT PcRemoteEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
UINT PcRemoteEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||||
UINT PcRemoteDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
UINT PcRemoteDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||||
|
UINT PcTunDownOnDisconnectEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||||
|
UINT PcTunDownOnDisconnectDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||||
|
UINT PcTunDownOnDisconnectGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||||
UINT PcKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
UINT PcKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||||
UINT PcKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
UINT PcKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||||
UINT PcKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
UINT PcKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param);
|
||||||
|
@ -612,7 +612,7 @@ void StartLink(LINK *k)
|
|||||||
pa->Param = (void *)k;
|
pa->Param = (void *)k;
|
||||||
LockLink(k);
|
LockLink(k);
|
||||||
{
|
{
|
||||||
k->ClientSession = NewClientSession(k->Cedar, k->Option, k->Auth, pa);
|
k->ClientSession = NewClientSession(k->Cedar, k->Option, k->Auth, pa, NULL);
|
||||||
}
|
}
|
||||||
UnlockLink(k);
|
UnlockLink(k);
|
||||||
}
|
}
|
||||||
|
@ -5385,6 +5385,14 @@ REDIRECTED:
|
|||||||
|
|
||||||
PrintStatus(sess, _UU("STATUS_9"));
|
PrintStatus(sess, _UU("STATUS_9"));
|
||||||
|
|
||||||
|
#ifdef OS_UNIX
|
||||||
|
// Set TUN up if session has NicDownOnDisconnect set
|
||||||
|
if (c->Session->NicDownOnDisconnect != NULL)
|
||||||
|
{
|
||||||
|
UnixVLanSetState(c->Session->ClientOption->DeviceName, true);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Shift the connection to the tunneling mode
|
// Shift the connection to the tunneling mode
|
||||||
StartTunnelingMode(c);
|
StartTunnelingMode(c);
|
||||||
s = NULL;
|
s = NULL;
|
||||||
|
@ -1381,6 +1381,13 @@ void CleanupSession(SESSION *s)
|
|||||||
FreePacketAdapter(s->PacketAdapter);
|
FreePacketAdapter(s->PacketAdapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef OS_UNIX
|
||||||
|
if (s->NicDownOnDisconnect != NULL && *s->NicDownOnDisconnect)
|
||||||
|
{
|
||||||
|
UnixVLanSetState(s->ClientOption->DeviceName, false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (s->OldTraffic != NULL)
|
if (s->OldTraffic != NULL)
|
||||||
{
|
{
|
||||||
FreeTraffic(s->OldTraffic);
|
FreeTraffic(s->OldTraffic);
|
||||||
@ -1529,6 +1536,13 @@ void ClientThread(THREAD *t, void *param)
|
|||||||
CLog(s->Cedar->Client, "LC_CONNECT_ERROR", s->ClientOption->AccountName,
|
CLog(s->Cedar->Client, "LC_CONNECT_ERROR", s->ClientOption->AccountName,
|
||||||
GetUniErrorStr(s->Err), s->Err);
|
GetUniErrorStr(s->Err), s->Err);
|
||||||
|
|
||||||
|
#ifdef OS_UNIX
|
||||||
|
if (s->NicDownOnDisconnect != NULL && *s->NicDownOnDisconnect)
|
||||||
|
{
|
||||||
|
UnixVLanSetState(s->ClientOption->DeviceName, false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (s->LinkModeClient && s->Link != NULL)
|
if (s->LinkModeClient && s->Link != NULL)
|
||||||
{
|
{
|
||||||
HLog(s->Link->Hub, "LH_CONNECT_ERROR", s->ClientOption->AccountName,
|
HLog(s->Link->Hub, "LH_CONNECT_ERROR", s->ClientOption->AccountName,
|
||||||
@ -1953,7 +1967,7 @@ SESSION *NewRpcSessionEx2(CEDAR *cedar, CLIENT_OPTION *option, UINT *err, char *
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a client session
|
// Create a client session
|
||||||
SESSION *NewClientSessionEx(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa, ACCOUNT *account)
|
SESSION *NewClientSessionEx(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa, ACCOUNT *account, bool *NicDownOnDisconnect)
|
||||||
{
|
{
|
||||||
SESSION *s;
|
SESSION *s;
|
||||||
THREAD *t;
|
THREAD *t;
|
||||||
@ -2081,6 +2095,8 @@ SESSION *NewClientSessionEx(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *au
|
|||||||
s->ClientOption->NumRetry = 0;
|
s->ClientOption->NumRetry = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s->NicDownOnDisconnect = NicDownOnDisconnect;
|
||||||
|
|
||||||
// Create a client thread
|
// Create a client thread
|
||||||
t = NewThread(ClientThread, (void *)s);
|
t = NewThread(ClientThread, (void *)s);
|
||||||
WaitThreadInit(t);
|
WaitThreadInit(t);
|
||||||
@ -2088,9 +2104,9 @@ SESSION *NewClientSessionEx(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *au
|
|||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
SESSION *NewClientSession(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa)
|
SESSION *NewClientSession(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa, bool *NicDownOnDisconnect)
|
||||||
{
|
{
|
||||||
return NewClientSessionEx(cedar, option, auth, pa, NULL);
|
return NewClientSessionEx(cedar, option, auth, pa, NULL, NicDownOnDisconnect);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the session from the 32bit session key
|
// Get the session from the 32bit session key
|
||||||
|
@ -324,6 +324,8 @@ struct SESSION
|
|||||||
// Measures for D-Link bug
|
// Measures for D-Link bug
|
||||||
UINT64 LastDLinkSTPPacketSendTick; // Last D-Link STP packet transmission time
|
UINT64 LastDLinkSTPPacketSendTick; // Last D-Link STP packet transmission time
|
||||||
UCHAR LastDLinkSTPPacketDataHash[MD5_SIZE]; // Last D-Link STP packet hash
|
UCHAR LastDLinkSTPPacketDataHash[MD5_SIZE]; // Last D-Link STP packet hash
|
||||||
|
|
||||||
|
bool *NicDownOnDisconnect; // Pointer to client configuration parameter. NULL for non-clients.
|
||||||
};
|
};
|
||||||
|
|
||||||
// Password dialog
|
// Password dialog
|
||||||
@ -399,8 +401,8 @@ struct UI_CHECKCERT
|
|||||||
|
|
||||||
|
|
||||||
// Function prototype
|
// Function prototype
|
||||||
SESSION *NewClientSessionEx(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa, struct ACCOUNT *account);
|
SESSION *NewClientSessionEx(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa, struct ACCOUNT *account, bool *NicDownOnDisconnect);
|
||||||
SESSION *NewClientSession(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa);
|
SESSION *NewClientSession(CEDAR *cedar, CLIENT_OPTION *option, CLIENT_AUTH *auth, PACKET_ADAPTER *pa, bool *NicDownOnDisconnect);
|
||||||
SESSION *NewRpcSession(CEDAR *cedar, CLIENT_OPTION *option);
|
SESSION *NewRpcSession(CEDAR *cedar, CLIENT_OPTION *option);
|
||||||
SESSION *NewRpcSessionEx(CEDAR *cedar, CLIENT_OPTION *option, UINT *err, char *client_str);
|
SESSION *NewRpcSessionEx(CEDAR *cedar, CLIENT_OPTION *option, UINT *err, char *client_str);
|
||||||
SESSION *NewRpcSessionEx2(CEDAR *cedar, CLIENT_OPTION *option, UINT *err, char *client_str, void *hWnd);
|
SESSION *NewRpcSessionEx2(CEDAR *cedar, CLIENT_OPTION *option, UINT *err, char *client_str, void *hWnd);
|
||||||
|
@ -360,7 +360,7 @@ void FreeVLan(VLAN *v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a tap
|
// Create a tap
|
||||||
VLAN *NewTap(char *name, char *mac_address)
|
VLAN *NewTap(char *name, char *mac_address, bool create_up)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
VLAN *v;
|
VLAN *v;
|
||||||
@ -370,7 +370,7 @@ VLAN *NewTap(char *name, char *mac_address)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = UnixCreateTapDeviceEx(name, "tap", mac_address);
|
fd = UnixCreateTapDeviceEx(name, "tap", mac_address, create_up);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -423,13 +423,25 @@ VLAN *NewVLan(char *instance_name, VLAN_PARAM *param)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Generate TUN interface name
|
||||||
|
void GenerateTunName(char *name, char *prefix, char *tun_name, size_t tun_name_len)
|
||||||
|
{
|
||||||
|
char instance_name_lower[MAX_SIZE];
|
||||||
|
|
||||||
|
// Generate the device name
|
||||||
|
StrCpy(instance_name_lower, sizeof(instance_name_lower), name);
|
||||||
|
Trim(instance_name_lower);
|
||||||
|
StrLower(instance_name_lower);
|
||||||
|
Format(tun_name, tun_name_len, "%s_%s", prefix, instance_name_lower);
|
||||||
|
|
||||||
|
tun_name[15] = 0;
|
||||||
|
}
|
||||||
// Create a tap device
|
// Create a tap device
|
||||||
int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address)
|
int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address, bool create_up)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
char eth_name[MAX_SIZE];
|
char eth_name[MAX_SIZE];
|
||||||
char instance_name_lower[MAX_SIZE];
|
|
||||||
struct sockaddr sa;
|
struct sockaddr sa;
|
||||||
char *tap_name = TAP_FILENAME_1;
|
char *tap_name = TAP_FILENAME_1;
|
||||||
int s;
|
int s;
|
||||||
@ -442,13 +454,7 @@ int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate the device name
|
GenerateTunName(name, prefix, eth_name, sizeof(eth_name));
|
||||||
StrCpy(instance_name_lower, sizeof(instance_name_lower), name);
|
|
||||||
Trim(instance_name_lower);
|
|
||||||
StrLower(instance_name_lower);
|
|
||||||
Format(eth_name, sizeof(eth_name), "%s_%s", prefix, instance_name_lower);
|
|
||||||
|
|
||||||
eth_name[15] = 0;
|
|
||||||
|
|
||||||
// Open the tun / tap
|
// Open the tun / tap
|
||||||
#ifndef UNIX_MACOS
|
#ifndef UNIX_MACOS
|
||||||
@ -531,8 +537,11 @@ int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address)
|
|||||||
StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), eth_name);
|
StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), eth_name);
|
||||||
ioctl(s, SIOCGIFFLAGS, &ifr);
|
ioctl(s, SIOCGIFFLAGS, &ifr);
|
||||||
|
|
||||||
ifr.ifr_flags |= IFF_UP;
|
if (create_up)
|
||||||
ioctl(s, SIOCSIFFLAGS, &ifr);
|
{
|
||||||
|
ifr.ifr_flags |= IFF_UP;
|
||||||
|
ioctl(s, SIOCSIFFLAGS, &ifr);
|
||||||
|
}
|
||||||
|
|
||||||
close(s);
|
close(s);
|
||||||
}
|
}
|
||||||
@ -560,8 +569,11 @@ int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address)
|
|||||||
StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), macos_eth_name);
|
StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), macos_eth_name);
|
||||||
ioctl(s, SIOCGIFFLAGS, &ifr);
|
ioctl(s, SIOCGIFFLAGS, &ifr);
|
||||||
|
|
||||||
ifr.ifr_flags |= IFF_UP;
|
if (create_up)
|
||||||
ioctl(s, SIOCSIFFLAGS, &ifr);
|
{
|
||||||
|
ifr.ifr_flags |= IFF_UP;
|
||||||
|
ioctl(s, SIOCSIFFLAGS, &ifr);
|
||||||
|
}
|
||||||
|
|
||||||
close(s);
|
close(s);
|
||||||
}
|
}
|
||||||
@ -637,9 +649,9 @@ int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address)
|
|||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
int UnixCreateTapDevice(char *name, UCHAR *mac_address)
|
int UnixCreateTapDevice(char *name, UCHAR *mac_address, bool create_up)
|
||||||
{
|
{
|
||||||
return UnixCreateTapDeviceEx(name, "vpn", mac_address);
|
return UnixCreateTapDeviceEx(name, "vpn", mac_address, create_up);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close the tap device
|
// Close the tap device
|
||||||
@ -696,7 +708,7 @@ void UnixVLanInit()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a VLAN
|
// Create a VLAN
|
||||||
bool UnixVLanCreateEx(char *name, char *prefix, UCHAR *mac_address)
|
bool UnixVLanCreateEx(char *name, char *prefix, UCHAR *mac_address, bool create_up)
|
||||||
{
|
{
|
||||||
// Validate arguments
|
// Validate arguments
|
||||||
char tmp[MAX_SIZE];
|
char tmp[MAX_SIZE];
|
||||||
@ -727,7 +739,7 @@ bool UnixVLanCreateEx(char *name, char *prefix, UCHAR *mac_address)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a tap device
|
// Create a tap device
|
||||||
fd = UnixCreateTapDeviceEx(name, prefix, mac_address);
|
fd = UnixCreateTapDeviceEx(name, prefix, mac_address, create_up);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
{
|
{
|
||||||
// Failure to create
|
// Failure to create
|
||||||
@ -745,9 +757,63 @@ bool UnixVLanCreateEx(char *name, char *prefix, UCHAR *mac_address)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool UnixVLanCreate(char *name, UCHAR *mac_address)
|
bool UnixVLanCreate(char *name, UCHAR *mac_address, bool create_up)
|
||||||
{
|
{
|
||||||
return UnixVLanCreateEx(name, "vpn", mac_address);
|
return UnixVLanCreateEx(name, "vpn", mac_address, create_up);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set a VLAN up/down
|
||||||
|
bool UnixVLanSetState(char* name, bool state_up)
|
||||||
|
{
|
||||||
|
#ifdef UNIX_LINUX
|
||||||
|
UNIX_VLAN_LIST *t, tt;
|
||||||
|
struct ifreq ifr;
|
||||||
|
int s;
|
||||||
|
char eth_name[MAX_SIZE];
|
||||||
|
|
||||||
|
LockList(unix_vlan);
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
// Find a device with the same name
|
||||||
|
Zero(&tt, sizeof(tt));
|
||||||
|
StrCpy(tt.Name, sizeof(tt.Name), name);
|
||||||
|
|
||||||
|
t = Search(unix_vlan, &tt);
|
||||||
|
if (t == NULL)
|
||||||
|
{
|
||||||
|
// No such device
|
||||||
|
UnlockList(unix_vlan);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateTunName(name, "vpn", eth_name, sizeof(eth_name));
|
||||||
|
Zero(&ifr, sizeof(ifr));
|
||||||
|
StrCpy(ifr.ifr_name, sizeof(ifr.ifr_name), eth_name);
|
||||||
|
|
||||||
|
s = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
if (s == -1)
|
||||||
|
{
|
||||||
|
// Failed to create socket
|
||||||
|
UnlockList(unix_vlan);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ioctl(s, SIOCGIFFLAGS, &ifr);
|
||||||
|
if (state_up)
|
||||||
|
{
|
||||||
|
ifr.ifr_flags |= IFF_UP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ifr.ifr_flags &= ~IFF_UP;
|
||||||
|
}
|
||||||
|
result = ioctl(s, SIOCSIFFLAGS, &ifr);
|
||||||
|
close(s);
|
||||||
|
}
|
||||||
|
UnlockList(unix_vlan);
|
||||||
|
#endif // UNIX_LINUX
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enumerate VLANs
|
// Enumerate VLANs
|
||||||
|
@ -129,7 +129,7 @@ struct VLAN
|
|||||||
|
|
||||||
// Function prototype
|
// Function prototype
|
||||||
VLAN *NewVLan(char *instance_name, VLAN_PARAM *param);
|
VLAN *NewVLan(char *instance_name, VLAN_PARAM *param);
|
||||||
VLAN *NewTap(char *name, char *mac_address);
|
VLAN *NewTap(char *name, char *mac_address, bool create_up);
|
||||||
void FreeVLan(VLAN *v);
|
void FreeVLan(VLAN *v);
|
||||||
CANCEL *VLanGetCancel(VLAN *v);
|
CANCEL *VLanGetCancel(VLAN *v);
|
||||||
bool VLanGetNextPacket(VLAN *v, void **buf, UINT *size);
|
bool VLanGetNextPacket(VLAN *v, void **buf, UINT *size);
|
||||||
@ -154,15 +154,16 @@ struct UNIX_VLAN_LIST
|
|||||||
int fd; // fd
|
int fd; // fd
|
||||||
};
|
};
|
||||||
|
|
||||||
int UnixCreateTapDevice(char *name, UCHAR *mac_address);
|
int UnixCreateTapDevice(char *name, UCHAR *mac_address, bool create_up);
|
||||||
int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address);
|
int UnixCreateTapDeviceEx(char *name, char *prefix, UCHAR *mac_address, bool create_up);
|
||||||
void UnixCloseTapDevice(int fd);
|
void UnixCloseTapDevice(int fd);
|
||||||
void UnixVLanInit();
|
void UnixVLanInit();
|
||||||
void UnixVLanFree();
|
void UnixVLanFree();
|
||||||
bool UnixVLanCreate(char *name, UCHAR *mac_address);
|
bool UnixVLanCreate(char *name, UCHAR *mac_address, bool create_up);
|
||||||
bool UnixVLanCreateEx(char *name, char *prefix, UCHAR *mac_address);
|
bool UnixVLanCreateEx(char *name, char *prefix, UCHAR *mac_address, bool create_up);
|
||||||
TOKEN_LIST *UnixVLanEnum();
|
TOKEN_LIST *UnixVLanEnum();
|
||||||
void UnixVLanDelete(char *name);
|
void UnixVLanDelete(char *name);
|
||||||
|
bool UnixVLanSetState(char* name, bool state_up);
|
||||||
int UnixVLanGet(char *name);
|
int UnixVLanGet(char *name);
|
||||||
int UnixCompareVLan(void *p1, void *p2);
|
int UnixCompareVLan(void *p1, void *p2);
|
||||||
|
|
||||||
|
@ -1326,6 +1326,20 @@ QUEUE *NewQueueFast()
|
|||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clone the list
|
||||||
|
LIST *CloneList(LIST *o)
|
||||||
|
{
|
||||||
|
LIST *n = NewList(o->cmp);
|
||||||
|
|
||||||
|
// Memory reallocation
|
||||||
|
Free(n->p);
|
||||||
|
n->p = ToArray(o);
|
||||||
|
n->num_item = n->num_reserved = LIST_NUM(o);
|
||||||
|
n->sorted = o->sorted;
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
// Copy the list to an array
|
// Copy the list to an array
|
||||||
void CopyToArray(LIST *o, void *p)
|
void CopyToArray(LIST *o, void *p)
|
||||||
{
|
{
|
||||||
|
@ -380,6 +380,7 @@ LIST *NewListFast(COMPARE *cmp);
|
|||||||
LIST *NewListEx(COMPARE *cmp, bool fast);
|
LIST *NewListEx(COMPARE *cmp, bool fast);
|
||||||
LIST *NewListEx2(COMPARE *cmp, bool fast, bool fast_malloc);
|
LIST *NewListEx2(COMPARE *cmp, bool fast, bool fast_malloc);
|
||||||
LIST *NewListSingle(void *p);
|
LIST *NewListSingle(void *p);
|
||||||
|
LIST *CloneList(LIST *o);
|
||||||
void CopyToArray(LIST *o, void *p);
|
void CopyToArray(LIST *o, void *p);
|
||||||
void *ToArray(LIST *o);
|
void *ToArray(LIST *o);
|
||||||
void *ToArrayEx(LIST *o, bool fast);
|
void *ToArrayEx(LIST *o, bool fast);
|
||||||
|
@ -4686,6 +4686,21 @@ CMD_ServerCipherSet_Args ServerCipherSet [name]
|
|||||||
CMD_ServerCipherSet_[name] 指定设置加密和数字签名的程序。可以使用的程序一览,可以从 ServerCipherGet 指令中获取。
|
CMD_ServerCipherSet_[name] 指定设置加密和数字签名的程序。可以使用的程序一览,可以从 ServerCipherGet 指令中获取。
|
||||||
CMD_ServerCipherSet_PROMPT_NAME 指定的加密程序的名称:
|
CMD_ServerCipherSet_PROMPT_NAME 指定的加密程序的名称:
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectEnable command
|
||||||
|
CMD_TUNDownOnDisconnectEnable Enable the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectEnable_Help This allows you to enable Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectEnable_Args TUNDownOnDisconnectEnable
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectDisable command
|
||||||
|
CMD_TUNDownOnDisconnectDisable Disable the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectDisable_Help This allows you to disable Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectDisable_Args TUNDownOnDisconnectDisable
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectGet command
|
||||||
|
CMD_TUNDownOnDisconnectGet Get status of the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectGet_Help This allows you to get status of the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectGet_Args TUNDownOnDisconnectGet
|
||||||
|
CMD_TUNDownOnDisconnectGet_COLUMN1 Put TUN down on disconnect
|
||||||
|
|
||||||
# KeepEnable 命令
|
# KeepEnable 命令
|
||||||
CMD_KeepEnable 启动 Internet 保持连接功能
|
CMD_KeepEnable 启动 Internet 保持连接功能
|
||||||
|
@ -4669,6 +4669,21 @@ CMD_ServerCipherSet_Args ServerCipherSet [name]
|
|||||||
CMD_ServerCipherSet_[name] This specifies the encrypted and electronic signature algorithm to set. You can obtain the list of usable algorithms by using the ServerCipherGet command.
|
CMD_ServerCipherSet_[name] This specifies the encrypted and electronic signature algorithm to set. You can obtain the list of usable algorithms by using the ServerCipherGet command.
|
||||||
CMD_ServerCipherSet_PROMPT_NAME Encrypted Algorithm Name to Specify:
|
CMD_ServerCipherSet_PROMPT_NAME Encrypted Algorithm Name to Specify:
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectEnable command
|
||||||
|
CMD_TUNDownOnDisconnectEnable Enable the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectEnable_Help This allows you to enable Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectEnable_Args TUNDownOnDisconnectEnable
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectDisable command
|
||||||
|
CMD_TUNDownOnDisconnectDisable Disable the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectDisable_Help This allows you to disable Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectDisable_Args TUNDownOnDisconnectDisable
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectGet command
|
||||||
|
CMD_TUNDownOnDisconnectGet Get status of the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectGet_Help This allows you to get status of the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectGet_Args TUNDownOnDisconnectGet
|
||||||
|
CMD_TUNDownOnDisconnectGet_COLUMN1 Put TUN down on disconnect
|
||||||
|
|
||||||
# KeepEnable command
|
# KeepEnable command
|
||||||
CMD_KeepEnable Enable the Keep Alive Internet Connection Function
|
CMD_KeepEnable Enable the Keep Alive Internet Connection Function
|
||||||
|
@ -4671,6 +4671,21 @@ CMD_ServerCipherSet_Args ServerCipherSet [name]
|
|||||||
CMD_ServerCipherSet_[name] 設定するる暗号化および電子署名アルゴリズムを指定します。使用可能なアルゴリズムの一覧は、ServerCipherGet コマンドで取得することができます。
|
CMD_ServerCipherSet_[name] 設定するる暗号化および電子署名アルゴリズムを指定します。使用可能なアルゴリズムの一覧は、ServerCipherGet コマンドで取得することができます。
|
||||||
CMD_ServerCipherSet_PROMPT_NAME 指定する暗号化アルゴリズム名:
|
CMD_ServerCipherSet_PROMPT_NAME 指定する暗号化アルゴリズム名:
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectEnable command
|
||||||
|
CMD_TUNDownOnDisconnectEnable Enable the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectEnable_Help This allows you to enable Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectEnable_Args TUNDownOnDisconnectEnable
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectDisable command
|
||||||
|
CMD_TUNDownOnDisconnectDisable Disable the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectDisable_Help This allows you to disable Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectDisable_Args TUNDownOnDisconnectDisable
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectGet command
|
||||||
|
CMD_TUNDownOnDisconnectGet Get status of the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectGet_Help This allows you to get status of the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectGet_Args TUNDownOnDisconnectGet
|
||||||
|
CMD_TUNDownOnDisconnectGet_COLUMN1 Put TUN down on disconnect
|
||||||
|
|
||||||
# KeepEnable コマンド
|
# KeepEnable コマンド
|
||||||
CMD_KeepEnable インターネット接続の維持機能の有効化
|
CMD_KeepEnable インターネット接続の維持機能の有効化
|
||||||
|
@ -4666,6 +4666,21 @@ CMD_ServerCipherSet_Args ServerCipherSet [name]
|
|||||||
CMD_ServerCipherSet_ [name] 설정해야 루루 암호화 및 전자 서명 알고리즘을 지정합니다. 사용 가능한 알고리즘 목록은 ServerCipherGet 명령에서 얻을 수 있습니다.
|
CMD_ServerCipherSet_ [name] 설정해야 루루 암호화 및 전자 서명 알고리즘을 지정합니다. 사용 가능한 알고리즘 목록은 ServerCipherGet 명령에서 얻을 수 있습니다.
|
||||||
CMD_ServerCipherSet_PROMPT_NAME 지정하는 암호화 알고리즘 명:
|
CMD_ServerCipherSet_PROMPT_NAME 지정하는 암호화 알고리즘 명:
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectEnable command
|
||||||
|
CMD_TUNDownOnDisconnectEnable Enable the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectEnable_Help This allows you to enable Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectEnable_Args TUNDownOnDisconnectEnable
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectDisable command
|
||||||
|
CMD_TUNDownOnDisconnectDisable Disable the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectDisable_Help This allows you to disable Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectDisable_Args TUNDownOnDisconnectDisable
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectGet command
|
||||||
|
CMD_TUNDownOnDisconnectGet Get status of the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectGet_Help This allows you to get status of the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectGet_Args TUNDownOnDisconnectGet
|
||||||
|
CMD_TUNDownOnDisconnectGet_COLUMN1 Put TUN down on disconnect
|
||||||
|
|
||||||
# KeepEnable 명령
|
# KeepEnable 명령
|
||||||
CMD_KeepEnable 인터넷 연결 유지 기능 활성화
|
CMD_KeepEnable 인터넷 연결 유지 기능 활성화
|
||||||
|
@ -4686,6 +4686,21 @@ CMD_ServerCipherSet_Args ServerCipherSet [name]
|
|||||||
CMD_ServerCipherSet_[name] 指定設置加密和數位簽章的程式。可以使用的程式一覽,可以從 ServerCipherGet 指令中獲取。
|
CMD_ServerCipherSet_[name] 指定設置加密和數位簽章的程式。可以使用的程式一覽,可以從 ServerCipherGet 指令中獲取。
|
||||||
CMD_ServerCipherSet_PROMPT_NAME 指定的加密程式的名稱:
|
CMD_ServerCipherSet_PROMPT_NAME 指定的加密程式的名稱:
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectEnable command
|
||||||
|
CMD_TUNDownOnDisconnectEnable Enable the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectEnable_Help This allows you to enable Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectEnable_Args TUNDownOnDisconnectEnable
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectDisable command
|
||||||
|
CMD_TUNDownOnDisconnectDisable Disable the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectDisable_Help This allows you to disable Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectDisable_Args TUNDownOnDisconnectDisable
|
||||||
|
|
||||||
|
# TUNDownOnDisconnectGet command
|
||||||
|
CMD_TUNDownOnDisconnectGet Get status of the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectGet_Help This allows you to get status of the Turn TUN Interface Down on Client Disconnect Function.
|
||||||
|
CMD_TUNDownOnDisconnectGet_Args TUNDownOnDisconnectGet
|
||||||
|
CMD_TUNDownOnDisconnectGet_COLUMN1 Put TUN down on disconnect
|
||||||
|
|
||||||
# KeepEnable 命令
|
# KeepEnable 命令
|
||||||
CMD_KeepEnable 啟動 Internet 保持連接功能
|
CMD_KeepEnable 啟動 Internet 保持連接功能
|
||||||
|
Loading…
Reference in New Issue
Block a user