| From | Wilfred Mallawa <> | | Subject | Re: [RFC v3 13/27] lib: rspdm: Support SPDM get_capabilities | | Date | Wed, 11 Feb 2026 04:08:32 +0000 |
| |
[snip] > + > + /// Obtain the supported capabilities from an SPDM session and > store the > + /// information in the `SpdmState`. > + pub(crate) fn get_capabilities(&mut self) -> Result<(), Error> { > + let mut request = GetCapabilitiesReq::default(); > + request.version = self.version; > + > + let (req_sz, rsp_sz) = match self.version { > + SPDM_VER_10 => (4, 8), > + SPDM_VER_11 => (8, 8), > + _ => { > + request.data_transfer_size = > self.transport_sz.to_le(); > + request.max_spdm_msg_size = > request.data_transfer_size; > + > + ( > + core::mem::size_of::<GetCapabilitiesReq>(), > + core::mem::size_of::<GetCapabilitiesRsp>(), > + ) > + } > + }; > + > + // SAFETY: `request` is repr(C) and packed, so we can > convert it to a slice > + let request_buf = unsafe { from_raw_parts_mut(&mut request > as *mut _ as *mut u8, req_sz) }; > + > + let mut response_vec: KVec<u8> = KVec::with_capacity(rsp_sz, > GFP_KERNEL)?; > + // SAFETY: `request` is repr(C) and packed, so we can > convert it to a slice
Same here about the SAFETY comment.
> + let response_buf = unsafe { > from_raw_parts_mut(response_vec.as_mut_ptr(), rsp_sz) }; > + > + let rc = self.spdm_exchange(request_buf, response_buf)?; > + > + if rc < (rsp_sz as i32) { > + pr_err!("Truncated capabilities response\n"); > + to_result(-(bindings::EIO as i32))?; > + } > + > + // SAFETY: `rc` is the length of data read, which will be > smaller > + // then the capacity of the vector > + unsafe { response_vec.inc_len(rc as usize) }; > + > + let response: &mut GetCapabilitiesRsp = > + Untrusted::new_mut(&mut response_vec).validate_mut()?; > + > + self.rsp_caps = u32::from_le(response.flags); > + if (self.rsp_caps & SPDM_RSP_MIN_CAPS) != SPDM_RSP_MIN_CAPS > {
Might be useful for debugging to have a pr_err() here.
Wilfred
|