1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2026-02-20 01:20:09 +03:00

Add server-side NOOP upload for connection keepalive

This commit is contained in:
Siddharth Narayan
2025-12-21 21:10:32 -05:00
parent 304364719c
commit c32184495b
4 changed files with 48 additions and 3 deletions

View File

@ -5429,7 +5429,7 @@ void ClientUploadNoop(CONNECTION *c)
} }
p = PackError(0); p = PackError(0);
PackAddInt(p, "noop", 1); PackAddInt(p, "noop", NOOP);
(void)HttpClientSend(c->FirstSock, p); (void)HttpClientSend(c->FirstSock, p);
FreePack(p); FreePack(p);
@ -5440,6 +5440,24 @@ void ClientUploadNoop(CONNECTION *c)
} }
} }
void ServerUploadNoop(CONNECTION *c)
{
PACK *p;
// Validate arguments
if (c == NULL)
{
return;
}
p = PackError(0);
PackAddInt(p, "noop", NOOP_IGNORE);
(void)HttpServerSend(c->FirstSock, p);
FreePack(p);
// Client can't re-respond to an HTTP "response"
// so we don't wait for it on the server side
}
// Add client version information to the PACK // Add client version information to the PACK
void PackAddClientVersion(PACK *p, CONNECTION *c) void PackAddClientVersion(PACK *p, CONNECTION *c)
{ {

View File

@ -169,6 +169,7 @@ bool GetSessionKeyFromPack(PACK *p, UCHAR *session_key, UINT *session_key_32);
void CreateNodeInfo(NODE_INFO *info, CONNECTION *c); void CreateNodeInfo(NODE_INFO *info, CONNECTION *c);
UINT SecureSign(SECURE_SIGN *sign, UINT device_id, char *pin); UINT SecureSign(SECURE_SIGN *sign, UINT device_id, char *pin);
void ClientUploadNoop(CONNECTION *c); void ClientUploadNoop(CONNECTION *c);
void ServerUploadNoop(CONNECTION *c);
bool ClientCheckServerCert(CONNECTION *c, bool *expired); bool ClientCheckServerCert(CONNECTION *c, bool *expired);
void ClientCheckServerCertThread(THREAD *thread, void *param); void ClientCheckServerCertThread(THREAD *thread, void *param);
bool ClientSecureSign(CONNECTION *c, UCHAR *sign, UCHAR *random, X **x); bool ClientSecureSign(CONNECTION *c, UCHAR *sign, UCHAR *random, X **x);

View File

@ -1207,12 +1207,14 @@ PACK *HttpClientRecv(SOCK *s)
UINT size; UINT size;
UCHAR *tmp; UCHAR *tmp;
HTTP_VALUE *v; HTTP_VALUE *v;
UINT num_noop = 0;
// Validate arguments // Validate arguments
if (s == NULL) if (s == NULL)
{ {
return NULL; return NULL;
} }
START:
h = RecvHttpHeader(s); h = RecvHttpHeader(s);
if (h == NULL) if (h == NULL)
{ {
@ -1257,6 +1259,22 @@ PACK *HttpClientRecv(SOCK *s)
p = BufToPack(b); p = BufToPack(b);
FreeBuf(b); FreeBuf(b);
// Client shouldn't receive a noop other than NOOP_IGNORE
// because it can't respond without a full new HTTP request
UINT noop = PackGetInt(p, "noop");
if (noop == NOOP_IGNORE) {
Debug("recv: noop ignore\n");
FreePack(p);
num_noop++;
if (num_noop > MAX_NOOP_PER_SESSION)
{
return NULL;
}
goto START;
}
return p; return p;
} }
@ -1365,13 +1383,14 @@ START:
FreeBuf(b); FreeBuf(b);
// Determine whether it's a NOOP // Determine whether it's a NOOP
if (PackGetInt(p, "noop") != 0) UINT noop = PackGetInt(p, "noop");
if (noop == NOOP)
{ {
Debug("recv: noop\n"); Debug("recv: noop\n");
FreePack(p); FreePack(p);
p = PackError(0); p = PackError(0);
PackAddInt(p, "noop", 1); PackAddInt(p, "noop", NOOP_IGNORE);
if (HttpServerSend(s, p) == false) if (HttpServerSend(s, p) == false)
{ {
FreePack(p); FreePack(p);
@ -1387,6 +1406,11 @@ START:
return NULL; return NULL;
} }
goto START;
} else if (noop == NOOP_IGNORE) {
Debug("recv: noop ignore\n");
FreePack(p);
goto START; goto START;
} }

View File

@ -38,6 +38,8 @@
// The number of allowable NOOP // The number of allowable NOOP
#define MAX_NOOP_PER_SESSION 30 #define MAX_NOOP_PER_SESSION 30
#define NOOP 1
#define NOOP_IGNORE 2 // A noop, but don't send a response noop
// VALUE object // VALUE object
struct VALUE struct VALUE