@@ -89,10 +89,14 @@ void vmem_server_handler(csp_conn_t * conn)
8989
9090 uint64_t length ;
9191 uint64_t address ;
92+ uint32_t mtu = VMEM_SERVER_MTU ;
9293
9394 if (request -> version == 3 ) {
9495 address = be64toh (request -> data3 .address );
9596 length = be64toh (request -> data3 .length );
97+ if (packet -> length > offsetof(vmem_request_t , data3 .packet_length )) {
98+ mtu = request -> data3 .packet_length ;
99+ }
96100 } else if (request -> version == 2 ) {
97101 address = be64toh (request -> data2 .address );
98102 length = be32toh (request -> data2 .length );
@@ -114,11 +118,11 @@ void vmem_server_handler(csp_conn_t * conn)
114118
115119 while ((count < length ) && csp_conn_is_active (conn )) {
116120 /* Prepare packet */
117- csp_packet_t * packet = csp_buffer_get (VMEM_SERVER_MTU );
121+ csp_packet_t * packet = csp_buffer_get (mtu );
118122 if (packet == NULL ) {
119123 break ;
120124 }
121- packet -> length = VMEM_MIN (VMEM_SERVER_MTU , length - count );
125+ packet -> length = VMEM_MIN (mtu , length - count );
122126
123127 /* Get data */
124128 vmem_read (packet -> data , address + count , packet -> length );
@@ -131,7 +135,7 @@ void vmem_server_handler(csp_conn_t * conn)
131135 } else if (type == VMEM_SERVER_CALCULATE_CRC32 ) {
132136
133137 /* 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 );
138+ uint32_t crc = vmem_calc_crc32 (address , length , & packet -> data [0 ], mtu );
135139
136140 /* Convert to network byte order */
137141 crc = htobe32 (crc );
0 commit comments