libxrdp: work on fastpath input, added fastpath option to xrdp.ini
This commit is contained in:
parent
d36336b7b5
commit
80204e2536
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user