MCPcopy Create free account
hub / github.com/FrameworkComputer/framework-system / pack_request

Function pack_request

framework_lib/src/chromium_ec/portio.rs:188–222  ·  view source on GitHub ↗
(mut request: EcHostRequest, data: &[u8])

Source from the content-addressed store, hash-verified

186}
187
188fn pack_request(mut request: EcHostRequest, data: &[u8]) -> Vec<u8> {
189 let total = EC_LPC_HOST_PACKET_SIZE as usize;
190 let offset = std::mem::size_of::<EcHostRequest>();
191 let mut buffer = vec![0_u8; total];
192 let max_transfer = std::cmp::min(total - offset, data.len());
193 let checksum_size = offset + max_transfer;
194
195 if log_enabled!(Level::Trace) {
196 println!("Total: {:?}", total);
197 println!("Offset: {:?}", offset);
198 println!("checksum_size: {:?}", checksum_size);
199 println!("data.len(): {:?}", data.len());
200 }
201
202 debug_assert!(checksum_size <= total);
203
204 // Copy struct into buffer, then checksum, then copy again
205 // Could avoid copying again by inserting checksum in to the buffer directly,
206 // but I'm too lazy. And that seems less safe.
207 let r_bytes: &[u8] = unsafe { util::any_as_u8_slice(&request) };
208 buffer[..offset].copy_from_slice(&r_bytes[..offset]);
209 if !data.is_empty() {
210 buffer[offset..offset + max_transfer].copy_from_slice(&data[..max_transfer]);
211 }
212 let checksum = checksum_buffer(&buffer[..checksum_size]);
213
214 request.checksum = checksum;
215 let r_bytes: &[u8] = unsafe { util::any_as_u8_slice(&request) };
216 buffer[..offset].copy_from_slice(&r_bytes[..offset]);
217 if !data.is_empty() {
218 buffer[offset..offset + max_transfer].copy_from_slice(&data[..max_transfer]);
219 }
220
221 buffer[..checksum_size].to_vec()
222}
223
224fn unpack_response_header(bytes: &[u8]) -> EcHostResponse {
225 let response: EcHostResponse = unsafe {

Callers 1

send_commandFunction · 0.85

Calls 2

any_as_u8_sliceFunction · 0.85
checksum_bufferFunction · 0.85

Tested by

no test coverage detected