Skip to content

Commit d7df974

Browse files
committed
Server-side support for VMEM packet payload size != 192
1 parent adf5ed2 commit d7df974

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

include/vmem/vmem_server.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ typedef struct {
5656
struct {
5757
uint64_t address;
5858
uint64_t length;
59+
uint16_t mtu;
5960
} data3;
6061
struct {
6162
uint8_t vmem_id;

src/vmem/vmem_client.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@ int vmem_download_progress(int node, int timeout, uint64_t address, uint32_t len
4646
vmem_request_t * request = (void *) packet->data;
4747
request->version = version;
4848
request->type = VMEM_SERVER_DOWNLOAD;
49-
if (version == 2) {
49+
if (version == 3) {
50+
request->data3.address = htobe64(address);
51+
request->data3.length = htobe64(length);
52+
request->data3.mtu = htobe16(VMEM_SERVER_MTU);
53+
} else if (version == 2) {
5054
request->data2.address = htobe64(address);
5155
request->data2.length = htobe32(length);
5256
} else {

src/vmem/vmem_server.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,18 @@ void vmem_server_handler(csp_conn_t * conn)
8989

9090
uint64_t length;
9191
uint64_t address;
92+
uint16_t mtu = VMEM_SERVER_MTU;
93+
const uint16_t mtu_max = CSP_BUFFER_SIZE - sizeof(csp_crc32_t) - 5; /* 5 bytes for RDP header */
9294

9395
if (request->version == 3) {
9496
address = be64toh(request->data3.address);
9597
length = be64toh(request->data3.length);
98+
if (packet->length > offsetof(vmem_request_t, data3.mtu)) {
99+
mtu = be16toh(request->data3.mtu);
100+
if (mtu == 0 || mtu > CSP_BUFFER_SIZE) {
101+
mtu = CSP_BUFFER_SIZE;
102+
}
103+
}
96104
} else if (request->version == 2) {
97105
address = be64toh(request->data2.address);
98106
length = be32toh(request->data2.length);
@@ -101,6 +109,10 @@ void vmem_server_handler(csp_conn_t * conn)
101109
length = be32toh(request->data.length);
102110
}
103111

112+
if (mtu > mtu_max) {
113+
mtu = mtu_max;
114+
}
115+
104116
//printf("Download from:");
105117
//printf(" Addr %"PRIx64"\n", address);
106118
//printf(" Length %"PRIu32"\n", length);
@@ -114,11 +126,11 @@ void vmem_server_handler(csp_conn_t * conn)
114126

115127
while((count < length) && csp_conn_is_active(conn)) {
116128
/* Prepare packet */
117-
csp_packet_t * packet = csp_buffer_get(VMEM_SERVER_MTU);
129+
csp_packet_t * packet = csp_buffer_get(mtu);
118130
if (packet == NULL) {
119131
break;
120132
}
121-
packet->length = VMEM_MIN(VMEM_SERVER_MTU, length - count);
133+
packet->length = VMEM_MIN(mtu, length - count);
122134

123135
/* Get data */
124136
vmem_read(packet->data, address + count, packet->length);
@@ -131,7 +143,7 @@ void vmem_server_handler(csp_conn_t * conn)
131143
} else if (type == VMEM_SERVER_CALCULATE_CRC32) {
132144

133145
/* Do the CRC32 calculation on the address area (vmem) using the request packet as the buffer */
134-
uint32_t crc = vmem_calc_crc32(address, length, &packet->data[0], VMEM_SERVER_MTU);
146+
uint32_t crc = vmem_calc_crc32(address, length, &packet->data[0], mtu);
135147

136148
/* Convert to network byte order */
137149
crc = htobe32(crc);

0 commit comments

Comments
 (0)