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_SCANCODE 4
#define RDP_INPUT_MOUSE 0x8001
#define RDP_INPUT_MOUSEX 0x8002
/* Device flags */
#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 len = 0;
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"));
/* 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->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)
{
return 1;
@ -80,7 +80,7 @@ xrdp_fastpath_recv(struct xrdp_fastpath *self, struct stream *s)
{
byte &= ~(0x80);
len = (byte << 8);
// receive fastpath second packet length
// receive fastpath second length packet
if (xrdp_tcp_recv(self->tcp_layer, s, 1) != 0)
{
return 1;
@ -94,7 +94,7 @@ xrdp_fastpath_recv(struct xrdp_fastpath *self, struct stream *s)
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
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)
{
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;
}
@ -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
g_writeln(" tpkt version: %x", ver); // TODO: delete it
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
{
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;
}

View File

@ -118,6 +118,31 @@ xrdp_rdp_read_config(struct xrdp_client_info *client_info)
{
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);
@ -778,7 +803,7 @@ xrdp_rdp_send_demand_active(struct xrdp_rdp *self)
INPUT_FLAG_FASTPATH_INPUT 0x0008
INPUT_FLAG_FASTPATH_INPUT2 0x0020 */
flags = 0x0001 | 0x0004;
// if (self->client_info.use_fast_path & 2)
if (self->client_info.use_fast_path & 2)
flags |= 0x0008 | 0x0020;
out_uint16_le(s, flags);
out_uint8s(s, 82);
@ -1711,6 +1736,9 @@ xrdp_rdp_process_fastpath_data_input(struct xrdp_rdp *self, struct stream *s)
int flags;
int param2;
int time;
int pointerFlags;
int xPos;
int yPos;
// process fastpath input events
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);
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)
{
case FASTPATH_INPUT_EVENT_SCANCODE:
in_uint8(s, code); /* keyCode (1 byte) */
g_writeln("scan code detected: %d", code);
//g_writeln("scan code detected: %d", code);
flags = 0;
if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE))
flags |= KBD_FLAG_UP;
@ -1747,15 +1778,58 @@ xrdp_rdp_process_fastpath_data_input(struct xrdp_rdp *self, struct stream *s)
break;
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;
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;
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;
case FASTPATH_INPUT_EVENT_UNICODE:
@ -1763,7 +1837,7 @@ xrdp_rdp_process_fastpath_data_input(struct xrdp_rdp *self, struct stream *s)
break;
default:
printf("Unknown eventCode %d\n", eventCode);
g_writeln("xrdp_rdp_process_fastpath_data_input: unknown eventCode %d", eventCode);
break;
}

View File

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

View File

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