xfreerdp-server: set TCP_NODELAY

This commit is contained in:
Marc-André Moreau 2012-03-18 13:13:34 -04:00
parent 0f54e1c778
commit 4d665b116d
5 changed files with 52 additions and 16 deletions

View File

@ -29,4 +29,6 @@ FREERDP_API int freerdp_tcp_read(int sockfd, uint8* data, int length);
FREERDP_API int freerdp_tcp_write(int sockfd, uint8* data, int length);
FREERDP_API int freerdp_tcp_disconnect(int sockfd);
FREERDP_API int freerdp_tcp_set_no_delay(int sockfd, boolean no_delay);
#endif /* FREERDP_TCP_UTILS_H */

View File

@ -153,13 +153,13 @@ static boolean freerdp_listener_get_fds(freerdp_listener* instance, void** rfds,
static boolean freerdp_listener_check_fds(freerdp_listener* instance)
{
rdpListener* listener = (rdpListener*)instance->listener;
struct sockaddr_storage peer_addr;
socklen_t peer_addr_size;
int peer_sockfd;
int i;
freerdp_peer* client;
void* sin_addr;
int peer_sockfd;
freerdp_peer* client;
socklen_t peer_addr_size;
struct sockaddr_storage peer_addr;
rdpListener* listener = (rdpListener*) instance->listener;
if (listener->num_sockfds < 1)
return false;
@ -167,7 +167,7 @@ static boolean freerdp_listener_check_fds(freerdp_listener* instance)
for (i = 0; i < listener->num_sockfds; i++)
{
peer_addr_size = sizeof(peer_addr);
peer_sockfd = accept(listener->sockfds[i], (struct sockaddr *)&peer_addr, &peer_addr_size);
peer_sockfd = accept(listener->sockfds[i], (struct sockaddr*) &peer_addr, &peer_addr_size);
if (peer_sockfd == -1)
{
@ -188,9 +188,10 @@ static boolean freerdp_listener_check_fds(freerdp_listener* instance)
client = freerdp_peer_new(peer_sockfd);
if (peer_addr.ss_family == AF_INET)
sin_addr = &(((struct sockaddr_in*)&peer_addr)->sin_addr);
sin_addr = &(((struct sockaddr_in*) &peer_addr)->sin_addr);
else
sin_addr = &(((struct sockaddr_in6*)&peer_addr)->sin6_addr);
sin_addr = &(((struct sockaddr_in6*) &peer_addr)->sin6_addr);
inet_ntop(peer_addr.ss_family, sin_addr, client->hostname, sizeof(client->hostname));
IFCALL(instance->PeerAccepted, instance, client);
@ -213,7 +214,7 @@ freerdp_listener* freerdp_listener_new(void)
listener = xnew(rdpListener);
listener->instance = instance;
instance->listener = (void*)listener;
instance->listener = (void*) listener;
return instance;
}
@ -222,7 +223,7 @@ void freerdp_listener_free(freerdp_listener* instance)
{
rdpListener* listener;
listener = (rdpListener*)instance->listener;
listener = (rdpListener*) instance->listener;
xfree(listener);
xfree(instance);

View File

@ -18,6 +18,7 @@
*/
#include "certificate.h"
#include <freerdp/utils/tcp.h>
#include "peer.h"
@ -25,7 +26,9 @@ static boolean freerdp_peer_initialize(freerdp_peer* client)
{
client->context->rdp->settings->server_mode = true;
client->context->rdp->state = CONNECTION_STATE_INITIAL;
if (client->context->rdp->settings->rdp_key_file != NULL) {
if (client->context->rdp->settings->rdp_key_file != NULL)
{
client->context->rdp->settings->server_key =
key_new(client->context->rdp->settings->rdp_key_file);
}
@ -43,12 +46,13 @@ static boolean freerdp_peer_get_fds(freerdp_peer* client, void** rfds, int* rcou
static boolean freerdp_peer_check_fds(freerdp_peer* client)
{
rdpRdp* rdp;
int status;
rdpRdp* rdp;
rdp = client->context->rdp;
status = rdp_check_fds(rdp);
if (status < 0)
return false;
@ -63,7 +67,6 @@ static boolean peer_recv_data_pdu(freerdp_peer* client, STREAM* s)
uint8 compressed_type;
uint16 compressed_len;
if (!rdp_read_share_data_header(s, &length, &type, &share_id, &compressed_type, &compressed_len))
return false;
@ -89,8 +92,10 @@ static boolean peer_recv_data_pdu(freerdp_peer* client, STREAM* s)
break;
case DATA_PDU_TYPE_FONT_LIST:
if (!rdp_server_accept_client_font_list_pdu(client->context->rdp, s))
return false;
if (client->PostConnect)
{
if (!client->PostConnect(client))
@ -101,12 +106,14 @@ static boolean peer_recv_data_pdu(freerdp_peer* client, STREAM* s)
*/
client->PostConnect = NULL;
}
if (client->Activate)
{
/* Activate will be called everytime after the client is activated/reactivated. */
if (!client->Activate(client))
return false;
}
break;
case DATA_PDU_TYPE_SHUTDOWN_REQUEST:
@ -123,7 +130,7 @@ static boolean peer_recv_data_pdu(freerdp_peer* client, STREAM* s)
static boolean peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s)
{
rdpRdp *rdp;
rdpRdp* rdp;
uint16 length;
uint16 pduType;
uint16 pduLength;
@ -142,6 +149,7 @@ static boolean peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s)
if (rdp->settings->encryption)
{
rdp_read_security_header(s, &securityFlags);
if (securityFlags & SEC_ENCRYPT)
{
if (!rdp_decrypt(rdp, s, length - 4, securityFlags))
@ -181,8 +189,8 @@ static boolean peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s)
static boolean peer_recv_fastpath_pdu(freerdp_peer* client, STREAM* s)
{
uint16 length;
rdpRdp* rdp;
uint16 length;
rdpFastPath* fastpath;
rdp = client->context->rdp;
@ -254,7 +262,9 @@ static boolean peer_recv_callback(rdpTransport* transport, STREAM* s, void* extr
case CONNECTION_STATE_ESTABLISH_KEYS:
if (!rdp_server_accept_client_info(client->context->rdp, s))
return false;
IFCALL(client->Capabilities, client);
if (!rdp_send_demand_active(client->context->rdp))
return false;
break;
@ -332,6 +342,8 @@ freerdp_peer* freerdp_peer_new(int sockfd)
client = xnew(freerdp_peer);
freerdp_tcp_set_no_delay(sockfd, true);
if (client != NULL)
{
client->sockfd = sockfd;
@ -354,4 +366,3 @@ void freerdp_peer_free(freerdp_peer* client)
xfree(client);
}
}

View File

@ -171,3 +171,16 @@ int freerdp_tcp_disconnect(int sockfd)
return 0;
}
int freerdp_tcp_set_no_delay(int sockfd, boolean no_delay)
{
uint32 option_value;
socklen_t option_len;
option_value = no_delay;
option_len = sizeof(option_value);
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void*) &option_value, option_len);
return 0;
}

View File

@ -44,11 +44,15 @@ void xf_input_keyboard_event(rdpInput* input, uint16 flags, uint16 code)
#ifdef WITH_XTEST
pthread_mutex_lock(&(xfp->mutex));
XTestGrabControl(xfi->display, True);
if (flags & KBD_FLAGS_DOWN)
XTestFakeKeyEvent(xfi->display, keycode, True, 0);
else if (flags & KBD_FLAGS_RELEASE)
XTestFakeKeyEvent(xfi->display, keycode, False, 0);
XTestGrabControl(xfi->display, False);
pthread_mutex_unlock(&(xfp->mutex));
#endif
}
@ -68,6 +72,7 @@ void xf_input_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
pthread_mutex_lock(&(xfp->mutex));
#ifdef WITH_XTEST
XTestGrabControl(xfi->display, True);
if (flags & PTR_FLAGS_WHEEL)
{
@ -99,6 +104,8 @@ void xf_input_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
if (button != 0)
XTestFakeButtonEvent(xfi->display, button, down, 0);
}
XTestGrabControl(xfi->display, False);
#endif
pthread_mutex_unlock(&(xfp->mutex));
}
@ -110,7 +117,9 @@ void xf_input_extended_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint
pthread_mutex_lock(&(xfp->mutex));
#ifdef WITH_XTEST
XTestGrabControl(xfi->display, True);
XTestFakeMotionEvent(xfi->display, 0, x, y, CurrentTime);
XTestGrabControl(xfi->display, False);
#endif
pthread_mutex_unlock(&(xfp->mutex));
}