summaryrefslogtreecommitdiffstats
path: root/libxrdp/xrdp_fastpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'libxrdp/xrdp_fastpath.c')
-rw-r--r--libxrdp/xrdp_fastpath.c289
1 files changed, 151 insertions, 138 deletions
diff --git a/libxrdp/xrdp_fastpath.c b/libxrdp/xrdp_fastpath.c
index 9a147b1b..35d90407 100644
--- a/libxrdp/xrdp_fastpath.c
+++ b/libxrdp/xrdp_fastpath.c
@@ -20,177 +20,190 @@
#include "libxrdp.h"
/*****************************************************************************/
-struct xrdp_fastpath* APP_CC
-xrdp_fastpath_create(struct xrdp_session* session)
+struct xrdp_fastpath *APP_CC
+xrdp_fastpath_create(struct xrdp_session *session)
{
- struct xrdp_fastpath* self;
-
- self = (struct xrdp_fastpath*)g_malloc(sizeof(struct xrdp_fastpath), 1);
- self->tcp_layer =
- ((struct xrdp_rdp*)session->rdp)->sec_layer->
- mcs_layer->iso_layer->tcp_layer;
- make_stream(self->out_s);
- init_stream(self->out_s, FASTPATH_MAX_PACKET_SIZE);
- return self;
+ struct xrdp_fastpath *self;
+
+ self = (struct xrdp_fastpath *)g_malloc(sizeof(struct xrdp_fastpath), 1);
+ self->tcp_layer =
+ ((struct xrdp_rdp *)session->rdp)->sec_layer->
+ mcs_layer->iso_layer->tcp_layer;
+ make_stream(self->out_s);
+ init_stream(self->out_s, FASTPATH_MAX_PACKET_SIZE);
+ return self;
}
/*****************************************************************************/
void APP_CC
-xrdp_fastpath_delete(struct xrdp_fastpath* self)
+xrdp_fastpath_delete(struct xrdp_fastpath *self)
{
- if (self == 0)
- {
- return;
- }
- free_stream(self->out_s);
- g_free(self);
+ if (self == 0)
+ {
+ return;
+ }
+
+ free_stream(self->out_s);
+ g_free(self);
}
/*****************************************************************************/
/* returns error */
int APP_CC
-xrdp_fastpath_reset(struct xrdp_fastpath* self)
+xrdp_fastpath_reset(struct xrdp_fastpath *self)
{
- return 0;
+ return 0;
}
int APP_CC
-xrdp_fastpath_init(struct xrdp_fastpath* self)
+xrdp_fastpath_init(struct xrdp_fastpath *self)
{
- return 0;
+ return 0;
}
/*****************************************************************************/
int APP_CC
-xrdp_fastpath_send_update_pdu(struct xrdp_fastpath* self, tui8 updateCode,
- struct stream* s)
+xrdp_fastpath_send_update_pdu(struct xrdp_fastpath *self, tui8 updateCode,
+ struct stream *s)
{
- tui16 len;
- tui16 maxLen;
- tui32 payloadLeft;
- tui8 fragment;
- struct stream* s_send;
- int compression;
- int i;
- int i32;
-
- compression = 0;
- s_send = self->out_s;
- maxLen = FASTPATH_MAX_PACKET_SIZE - 6; /* 6 bytes for header */
- payloadLeft = (s->end - s->data);
- for (i = 0; payloadLeft > 0; i++)
- {
- if (payloadLeft > maxLen)
- {
- len = maxLen;
- }
- else
- {
- len = payloadLeft;
- }
- payloadLeft -= len;
- if (payloadLeft == 0)
- {
- fragment = i ? FASTPATH_FRAGMENT_LAST : FASTPATH_FRAGMENT_SINGLE;
- }
- else
- {
- fragment = i ? FASTPATH_FRAGMENT_NEXT : FASTPATH_FRAGMENT_FIRST;
- }
- init_stream(s_send, 0);
- out_uint8(s_send, 0); /* fOutputHeader */
- i32 = ((len + 6) >> 8) | 0x80;
- out_uint8(s_send, i32); /* use 2 bytes for length even length < 128 ??? */
- i32 = (len + 6) & 0xff;
- out_uint8(s_send, i32);
- i32 = (updateCode & 0x0f) | ((fragment & 0x03) << 4) |
- ((compression & 0x03) << 6);
- out_uint8(s_send, i32);
- out_uint16_le(s_send, len);
- s_copy(s_send, s, len);
- s_mark_end(s_send);
- if (xrdp_tcp_send(self->tcp_layer, s_send) != 0)
+ tui16 len;
+ tui16 maxLen;
+ tui32 payloadLeft;
+ tui8 fragment;
+ struct stream *s_send;
+ int compression;
+ int i;
+ int i32;
+
+ compression = 0;
+ s_send = self->out_s;
+ maxLen = FASTPATH_MAX_PACKET_SIZE - 6; /* 6 bytes for header */
+ payloadLeft = (s->end - s->data);
+
+ for (i = 0; payloadLeft > 0; i++)
{
- return 1;
+ if (payloadLeft > maxLen)
+ {
+ len = maxLen;
+ }
+ else
+ {
+ len = payloadLeft;
+ }
+
+ payloadLeft -= len;
+
+ if (payloadLeft == 0)
+ {
+ fragment = i ? FASTPATH_FRAGMENT_LAST : FASTPATH_FRAGMENT_SINGLE;
+ }
+ else
+ {
+ fragment = i ? FASTPATH_FRAGMENT_NEXT : FASTPATH_FRAGMENT_FIRST;
+ }
+
+ init_stream(s_send, 0);
+ out_uint8(s_send, 0); /* fOutputHeader */
+ i32 = ((len + 6) >> 8) | 0x80;
+ out_uint8(s_send, i32); /* use 2 bytes for length even length < 128 ??? */
+ i32 = (len + 6) & 0xff;
+ out_uint8(s_send, i32);
+ i32 = (updateCode & 0x0f) | ((fragment & 0x03) << 4) |
+ ((compression & 0x03) << 6);
+ out_uint8(s_send, i32);
+ out_uint16_le(s_send, len);
+ s_copy(s_send, s, len);
+ s_mark_end(s_send);
+
+ if (xrdp_tcp_send(self->tcp_layer, s_send) != 0)
+ {
+ return 1;
+ }
}
- }
- return 0;
+
+ return 0;
}
/*****************************************************************************/
int
-xrdp_fastpath_process_update(struct xrdp_fastpath* self, tui8 updateCode,
- tui32 size, struct stream* s)
+xrdp_fastpath_process_update(struct xrdp_fastpath *self, tui8 updateCode,
+ tui32 size, struct stream *s)
{
- switch (updateCode)
- {
- case FASTPATH_UPDATETYPE_ORDERS:
- case FASTPATH_UPDATETYPE_BITMAP:
- case FASTPATH_UPDATETYPE_PALETTE:
- case FASTPATH_UPDATETYPE_SYNCHRONIZE:
- case FASTPATH_UPDATETYPE_SURFCMDS:
- case FASTPATH_UPDATETYPE_PTR_NULL:
- case FASTPATH_UPDATETYPE_PTR_DEFAULT:
- case FASTPATH_UPDATETYPE_PTR_POSITION:
- case FASTPATH_UPDATETYPE_COLOR:
- case FASTPATH_UPDATETYPE_CACHED:
- case FASTPATH_UPDATETYPE_POINTER:
- break;
- default:
- g_writeln("xrdp_fastpath_process_update: unknown updateCode 0x%X",
- updateCode);
- break;
- }
-
- return 0;
+ switch (updateCode)
+ {
+ case FASTPATH_UPDATETYPE_ORDERS:
+ case FASTPATH_UPDATETYPE_BITMAP:
+ case FASTPATH_UPDATETYPE_PALETTE:
+ case FASTPATH_UPDATETYPE_SYNCHRONIZE:
+ case FASTPATH_UPDATETYPE_SURFCMDS:
+ case FASTPATH_UPDATETYPE_PTR_NULL:
+ case FASTPATH_UPDATETYPE_PTR_DEFAULT:
+ case FASTPATH_UPDATETYPE_PTR_POSITION:
+ case FASTPATH_UPDATETYPE_COLOR:
+ case FASTPATH_UPDATETYPE_CACHED:
+ case FASTPATH_UPDATETYPE_POINTER:
+ break;
+ default:
+ g_writeln("xrdp_fastpath_process_update: unknown updateCode 0x%X",
+ updateCode);
+ break;
+ }
+
+ return 0;
}
/*****************************************************************************/
int APP_CC
-xrdp_fastpath_process_data(struct xrdp_fastpath* self, struct stream* s,
+xrdp_fastpath_process_data(struct xrdp_fastpath *self, struct stream *s,
tui8 header)
{
- tui8 encryptionFlags;
- tui8 numberEvents;
- tui8 length2;
- tui8 updateHeader;
- tui8 updateCode;
- tui8 updateFrag;
- tui8 updateComp;
- tui16 length;
- tui32 size;
-
- encryptionFlags = (header & 0xc0) >> 6;
- numberEvents = (header & 0x3c) >> 2;
- xrdp_tcp_recv(self->tcp_layer, s, 1);
- in_uint8(s, length);
- if (length & 0x80)
- {
+ tui8 encryptionFlags;
+ tui8 numberEvents;
+ tui8 length2;
+ tui8 updateHeader;
+ tui8 updateCode;
+ tui8 updateFrag;
+ tui8 updateComp;
+ tui16 length;
+ tui32 size;
+
+ encryptionFlags = (header & 0xc0) >> 6;
+ numberEvents = (header & 0x3c) >> 2;
xrdp_tcp_recv(self->tcp_layer, s, 1);
- in_uint8(s, length2);
- length = (length & 0x7f) << 8 + length2 - 3;
- }
- else
- {
- length -= 2;
- }
- xrdp_tcp_recv(self->tcp_layer, s, length);
- if (encryptionFlags != 0)
- {
- /* TODO decryption ...*/
- }
- /* parse updateHeader */
- in_uint8(s, updateHeader);
- updateCode = (updateHeader & 0x0f);
- updateFrag = (updateHeader & 0x30) >> 4;
- updateComp = (updateHeader & 0xc0) >> 6;
- if (updateFrag && updateComp)
- {
- /* TODO */
- g_writeln("xrdp_fastpath_process_data: updateFrag=%d, updateComp=%d",
- updateFrag,updateComp);
- return 1;
- }
- in_uint16_le(s, size);
- return xrdp_fastpath_process_update(self, updateCode, size, s);
+ in_uint8(s, length);
+
+ if (length & 0x80)
+ {
+ xrdp_tcp_recv(self->tcp_layer, s, 1);
+ in_uint8(s, length2);
+ length = (length & 0x7f) << 8 + length2 - 3;
+ }
+ else
+ {
+ length -= 2;
+ }
+
+ xrdp_tcp_recv(self->tcp_layer, s, length);
+
+ if (encryptionFlags != 0)
+ {
+ /* TODO decryption ...*/
+ }
+
+ /* parse updateHeader */
+ in_uint8(s, updateHeader);
+ updateCode = (updateHeader & 0x0f);
+ updateFrag = (updateHeader & 0x30) >> 4;
+ updateComp = (updateHeader & 0xc0) >> 6;
+
+ if (updateFrag && updateComp)
+ {
+ /* TODO */
+ g_writeln("xrdp_fastpath_process_data: updateFrag=%d, updateComp=%d",
+ updateFrag, updateComp);
+ return 1;
+ }
+
+ in_uint16_le(s, size);
+ return xrdp_fastpath_process_update(self, updateCode, size, s);
}