Merge pull request #11856 from akallabeth/tcp-nodelay

[core,tcp] unify setting of TCP_NODELAY
This commit is contained in:
akallabeth
2025-09-12 11:29:24 +02:00
committed by GitHub
5 changed files with 50 additions and 40 deletions

View File

@@ -1443,44 +1443,14 @@ const char* freerdp_peer_os_minor_type_string(freerdp_peer* client)
freerdp_peer* freerdp_peer_new(int sockfd)
{
UINT32 option_value = 0;
socklen_t option_len = 0;
freerdp_peer* client = (freerdp_peer*)calloc(1, sizeof(freerdp_peer));
if (!client)
return NULL;
option_value = TRUE;
option_len = sizeof(option_value);
if (sockfd >= 0)
{
int type = -1;
socklen_t typelen = sizeof(type);
const int rc = getsockopt(sockfd, SOL_SOCKET, SO_TYPE, &type, &typelen);
if (rc < 0)
{
char buffer[128] = { 0 };
WLog_DBG(TAG, "can't get SOL_SOCKET|SO_TYPE, continuing anyway (%s)",
winpr_strerror(errno, buffer, sizeof(buffer)));
}
else if (type == SOCK_STREAM)
{
const int sr =
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void*)&option_value, option_len);
if (sr < 0)
{
/* local unix sockets don't have the TCP_NODELAY implemented, so don't make this
* error fatal */
char buffer[128] = { 0 };
WLog_DBG(TAG, "can't set TCP_NODELAY, continuing anyway (%s)",
winpr_strerror(errno, buffer, sizeof(buffer)));
}
}
else
{
WLog_DBG(TAG, "Socket SOL_SOCKET|SO_TYPE %d unsupported, continuing anyway", type);
}
(void)freerdp_tcp_set_nodelay(WLog_Get(TAG), WLOG_DEBUG, sockfd);
}
if (client)

View File

@@ -1115,8 +1115,6 @@ int freerdp_tcp_default_connect(rdpContext* context, rdpSettings* settings, cons
int port, DWORD timeout)
{
int sockfd = 0;
UINT32 optval = 0;
socklen_t optlen = 0;
BOOL ipcSocket = FALSE;
BOOL useExternalDefinedSocket = FALSE;
@@ -1287,16 +1285,14 @@ int freerdp_tcp_default_connect(rdpContext* context, rdpSettings* settings, cons
}
}
optval = 1;
optlen = sizeof(optval);
if (!ipcSocket && !useExternalDefinedSocket)
{
if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void*)&optval, optlen) < 0)
WLog_ERR(TAG, "unable to set TCP_NODELAY");
(void)freerdp_tcp_set_nodelay(WLog_Get(TAG), WLOG_ERROR, sockfd);
}
/* receive buffer must be a least 32 K */
UINT32 optval = 0;
socklen_t optlen = 0;
if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (void*)&optval, &optlen) == 0)
{
if (optval < (1024 * 32))
@@ -1512,3 +1508,41 @@ fail:
transport_layer_free(layer);
return NULL;
}
BOOL freerdp_tcp_set_nodelay(wLog* log, DWORD level, int sockfd)
{
WINPR_ASSERT(log);
int type = -1;
socklen_t typelen = sizeof(type);
const int rc = getsockopt(sockfd, SOL_SOCKET, SO_TYPE, &type, &typelen);
if (rc < 0)
{
char buffer[128] = { 0 };
WLog_Print(log, level, "can't get SOL_SOCKET|SO_TYPE (%s)",
winpr_strerror(errno, buffer, sizeof(buffer)));
return FALSE;
}
else if (type == SOCK_STREAM)
{
int option_value = -1;
const socklen_t option_len = sizeof(option_value);
const int sr =
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void*)&option_value, option_len);
if (sr < 0)
{
/* local unix sockets don't have the TCP_NODELAY implemented, so don't make this
* error fatal */
char buffer[128] = { 0 };
WLog_Print(log, level, "can't set TCP_NODELAY (%s)",
winpr_strerror(errno, buffer, sizeof(buffer)));
return FALSE;
}
}
else
{
WLog_Print(log, level, "Socket SOL_SOCKET|SO_TYPE %d unsupported", type);
return FALSE;
}
return TRUE;
}

View File

@@ -112,4 +112,6 @@ FREERDP_LOCAL struct addrinfo* freerdp_tcp_resolve_host(const char* hostname, in
int ai_flags);
FREERDP_LOCAL char* freerdp_tcp_address_to_string(const struct sockaddr_storage* addr, BOOL* pIPv6);
FREERDP_LOCAL BOOL freerdp_tcp_set_nodelay(wLog* log, DWORD level, int sockfd);
#endif /* FREERDP_LIB_CORE_TCP_H */

View File

@@ -706,8 +706,6 @@ static PfChannelResult DynvcTrackerPeekFn(ChannelStateTracker* tracker, BOOL fir
UINT32 flags = lastPacket ? CHANNEL_FLAG_LAST : 0;
if (firstPacket)
flags |= CHANNEL_FLAG_FIRST;
proxyData* pdata = channelTracker_getPData(tracker);
WINPR_ASSERT(pdata);
{
wStream* currentPacket = channelTracker_getCurrentPacket(tracker);

View File

@@ -530,6 +530,12 @@ error:
static BOOL pf_modules_load_dynamic_module(const char* module_path, proxyModule* module,
void* userdata)
{
if (!winpr_PathFileExists(module_path))
{
WLog_DBG(TAG, "failed loading external library: file '%s' does not exist", module_path);
return FALSE;
}
HANDLE handle = LoadLibraryX(module_path);
if (handle == NULL)