libxrdp: work on fastpath input, added fastpath option to xrdp.ini

This commit is contained in:
speidy 2014-02-11 00:28:43 +02:00
parent d36336b7b5
commit 80204e2536
7 changed files with 92 additions and 15 deletions

View File

@ -161,6 +161,7 @@
#define RDP_INPUT_VIRTKEY 2 #define RDP_INPUT_VIRTKEY 2
#define RDP_INPUT_SCANCODE 4 #define RDP_INPUT_SCANCODE 4
#define RDP_INPUT_MOUSE 0x8001 #define RDP_INPUT_MOUSE 0x8001
#define RDP_INPUT_MOUSEX 0x8002
/* Device flags */ /* Device flags */
#define KBD_FLAG_RIGHT 0x0001 #define KBD_FLAG_RIGHT 0x0001

View File

@ -58,7 +58,7 @@ xrdp_fastpath_recv(struct xrdp_fastpath *self, struct stream *s)
int fp_hdr; int fp_hdr;
int len = 0; int len = 0;
int byte; int byte;
int hdr_len = 2; int hdr_len = 2; /* fastpath header lenght - can be 2 or 3 bytes long, depends on length */
DEBUG((" in xrdp_fastpath_recv")); DEBUG((" in xrdp_fastpath_recv"));
/* read the first fastpath byte /* read the first fastpath byte
@ -68,7 +68,7 @@ xrdp_fastpath_recv(struct xrdp_fastpath *self, struct stream *s)
self->numEvents = (fp_hdr & 0x3C) >> 2; self->numEvents = (fp_hdr & 0x3C) >> 2;
self->secFlags = (fp_hdr & 0xC0) >> 6; self->secFlags = (fp_hdr & 0xC0) >> 6;
// receive fastpath first packet length // receive fastpath first length packet
if (xrdp_tcp_recv(self->tcp_layer, s, 1) != 0) if (xrdp_tcp_recv(self->tcp_layer, s, 1) != 0)
{ {
return 1; return 1;
@ -80,7 +80,7 @@ xrdp_fastpath_recv(struct xrdp_fastpath *self, struct stream *s)
{ {
byte &= ~(0x80); byte &= ~(0x80);
len = (byte << 8); len = (byte << 8);
// receive fastpath second packet length // receive fastpath second length packet
if (xrdp_tcp_recv(self->tcp_layer, s, 1) != 0) if (xrdp_tcp_recv(self->tcp_layer, s, 1) != 0)
{ {
return 1; return 1;
@ -94,7 +94,7 @@ xrdp_fastpath_recv(struct xrdp_fastpath *self, struct stream *s)
len = byte; len = byte;
} }
g_writeln("len= %d , numEvents= %d, secFlags= %d, bytesleft: %d", len, self->numEvents, self->secFlags, (s->p - s->data)); //g_writeln("len= %d , numEvents= %d, secFlags= %d, bytesleft: %d", len, self->numEvents, self->secFlags, (s->p - s->data));
// receive the left bytes // receive the left bytes
if (xrdp_tcp_recv(self->tcp_layer, s, len - hdr_len) != 0) if (xrdp_tcp_recv(self->tcp_layer, s, len - hdr_len) != 0)

View File

@ -98,7 +98,7 @@ xrdp_iso_recv_msg(struct xrdp_iso *self, struct stream *s, int *code, int *len)
if (plen == 2) if (plen == 2)
{ {
DEBUG((" xrdp_iso_recv_msg: non-TPKT header detected, we try fastpath")); DEBUG(("xrdp_iso_recv_msg: non-TPKT header detected, we try fastpath"));
return plen; return plen;
} }
@ -164,7 +164,6 @@ xrdp_iso_recv_tpkt_header(struct xrdp_iso *self, struct stream *s)
} }
in_uint8_peek(s, ver); // Peek only so we can use it later in fastpath layer, if needed in_uint8_peek(s, ver); // Peek only so we can use it later in fastpath layer, if needed
g_writeln(" tpkt version: %x", ver); // TODO: delete it
if (ver != 3) if (ver != 3)
{ {

View File

@ -132,7 +132,7 @@ xrdp_mcs_recv(struct xrdp_mcs *self, struct stream *s, int *chan)
if (iso_msg == 2) // non-TPKT header if (iso_msg == 2) // non-TPKT header
{ {
DEBUG((" out xrdp_mcs_recv, non-TPKT header detected, we try fastpath")); DEBUG((" out xrdp_mcs_recv, non-TPKT header detected, we try fastpath"));
return iso_msg; return iso_msg;
} }

View File

@ -118,6 +118,31 @@ xrdp_rdp_read_config(struct xrdp_client_info *client_info)
{ {
client_info->require_credentials = g_text2bool(value); client_info->require_credentials = g_text2bool(value);
} }
else if (g_strcasecmp(item, "use_fastpath") == 0)
{
if (g_strcasecmp(value, "output") == 0)
{
client_info->use_fast_path = 1;
}
else if (g_strcasecmp(value, "input") == 0)
{
client_info->use_fast_path = 2;
}
else if (g_strcasecmp(value, "both") == 0)
{
client_info->use_fast_path = 3;
}
else if (g_strcasecmp(value, "none") == 0)
{
client_info->use_fast_path = 0;
}
else
{
log_message(LOG_LEVEL_ALWAYS,"Warning: Your configured fastpath level is"
"undefined, fastpath will not be used");
client_info->use_fast_path = 0;
}
}
} }
list_delete(items); list_delete(items);
@ -778,7 +803,7 @@ xrdp_rdp_send_demand_active(struct xrdp_rdp *self)
INPUT_FLAG_FASTPATH_INPUT 0x0008 INPUT_FLAG_FASTPATH_INPUT 0x0008
INPUT_FLAG_FASTPATH_INPUT2 0x0020 */ INPUT_FLAG_FASTPATH_INPUT2 0x0020 */
flags = 0x0001 | 0x0004; flags = 0x0001 | 0x0004;
// if (self->client_info.use_fast_path & 2) if (self->client_info.use_fast_path & 2)
flags |= 0x0008 | 0x0020; flags |= 0x0008 | 0x0020;
out_uint16_le(s, flags); out_uint16_le(s, flags);
out_uint8s(s, 82); out_uint8s(s, 82);
@ -1711,6 +1736,9 @@ xrdp_rdp_process_fastpath_data_input(struct xrdp_rdp *self, struct stream *s)
int flags; int flags;
int param2; int param2;
int time; int time;
int pointerFlags;
int xPos;
int yPos;
// process fastpath input events // process fastpath input events
for (i = 0 ; i < self->sec_layer->fastpath_layer->numEvents ; i++) { for (i = 0 ; i < self->sec_layer->fastpath_layer->numEvents ; i++) {
@ -1718,12 +1746,15 @@ xrdp_rdp_process_fastpath_data_input(struct xrdp_rdp *self, struct stream *s)
eventFlags = (eventHeader & 0x1F); eventFlags = (eventHeader & 0x1F);
eventCode = (eventHeader >> 5); eventCode = (eventHeader >> 5);
g_writeln("eventCode= %d, eventFlags= %d, numEvents= %d", eventCode, eventFlags, self->sec_layer->fastpath_layer->numEvents);
//g_writeln("eventCode= %d, eventFlags= %d, numEvents= %d",
// eventCode, eventFlags, self->sec_layer->fastpath_layer->numEvents);
switch (eventCode) switch (eventCode)
{ {
case FASTPATH_INPUT_EVENT_SCANCODE: case FASTPATH_INPUT_EVENT_SCANCODE:
in_uint8(s, code); /* keyCode (1 byte) */ in_uint8(s, code); /* keyCode (1 byte) */
g_writeln("scan code detected: %d", code); //g_writeln("scan code detected: %d", code);
flags = 0; flags = 0;
if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE)) if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE))
flags |= KBD_FLAG_UP; flags |= KBD_FLAG_UP;
@ -1747,15 +1778,58 @@ xrdp_rdp_process_fastpath_data_input(struct xrdp_rdp *self, struct stream *s)
break; break;
case FASTPATH_INPUT_EVENT_MOUSE: case FASTPATH_INPUT_EVENT_MOUSE:
in_uint8s(s, 6); in_uint16_le(s, pointerFlags); /* pointerFlags (2 bytes) */
in_uint16_le(s, xPos); /* xPos (2 bytes) */
in_uint16_le(s, yPos); /* yPos (2 bytes) */
if (self->session->callback != 0)
{
/* msg_type can be
RDP_INPUT_SYNCHRONIZE - 0
RDP_INPUT_SCANCODE - 4
RDP_INPUT_MOUSE - 0x8001
RDP_INPUT_MOUSEX - 0x8002 */
/* call to xrdp_wm.c : callback */
self->session->callback(self->session->id, RDP_INPUT_MOUSE, xPos, yPos,
pointerFlags, 0);
}
break; break;
case FASTPATH_INPUT_EVENT_MOUSEX: case FASTPATH_INPUT_EVENT_MOUSEX:
in_uint8s(s, 6); in_uint16_le(s, pointerFlags); /* pointerFlags (2 bytes) */
in_uint16_le(s, xPos); /* xPos (2 bytes) */
in_uint16_le(s, yPos); /* yPos (2 bytes) */
if (self->session->callback != 0)
{
/* msg_type can be
RDP_INPUT_SYNCHRONIZE - 0
RDP_INPUT_SCANCODE - 4
RDP_INPUT_MOUSE - 0x8001
RDP_INPUT_MOUSEX - 0x8002 */
/* call to xrdp_wm.c : callback */
self->session->callback(self->session->id, RDP_INPUT_MOUSEX, xPos, yPos,
pointerFlags, 0);
}
break; break;
case FASTPATH_INPUT_EVENT_SYNC: case FASTPATH_INPUT_EVENT_SYNC:
/*
* The eventCode bitfield (3 bits in size) MUST be set to FASTPATH_INPUT_EVENT_SYNC (3).
* The eventFlags bitfield (5 bits in size) contains flags indicating the "on"
* status of the keyboard toggle keys.
*/
if (self->session->callback != 0)
{
/* msg_type can be
RDP_INPUT_SYNCHRONIZE - 0
RDP_INPUT_SCANCODE - 4
RDP_INPUT_MOUSE - 0x8001
RDP_INPUT_MOUSEX - 0x8002 */
/* call to xrdp_wm.c : callback */
self->session->callback(self->session->id, RDP_INPUT_SYNCHRONIZE, eventCode, 0,
eventFlags, 0);
}
break; break;
case FASTPATH_INPUT_EVENT_UNICODE: case FASTPATH_INPUT_EVENT_UNICODE:
@ -1763,7 +1837,7 @@ xrdp_rdp_process_fastpath_data_input(struct xrdp_rdp *self, struct stream *s)
break; break;
default: default:
printf("Unknown eventCode %d\n", eventCode); g_writeln("xrdp_rdp_process_fastpath_data_input: unknown eventCode %d", eventCode);
break; break;
} }

View File

@ -774,8 +774,8 @@ xrdp_sec_recv(struct xrdp_sec *self, struct stream *s, int *chan)
if (mcs_msg == 2) if (mcs_msg == 2)
{ {
DEBUG((" out xrdp_sec_recv : non-TPKT msg detected, we try fastpath"));
xrdp_sec_recv_fastpath(self, s); xrdp_sec_recv_fastpath(self, s);
DEBUG((" out xrdp_sec_recv : non-TPKT msg detected, we try fastpath"));
return mcs_msg; return mcs_msg;
} }

View File

@ -37,6 +37,9 @@ tcp_keepalive=yes
#nego_sec_layer=0 #nego_sec_layer=0
allow_multimon=true allow_multimon=true
# fastpath - can be set to input / output / both / none
use_fastpath=input
[Logging] [Logging]
LogFile=xrdp.log LogFile=xrdp.log
LogLevel=DEBUG LogLevel=DEBUG