Re: [RFC v3 13/27] lib: rspdm: Support SPDM get_capabilities
From: Wilfred Mallawa
Date: Tue Feb 10 2026 - 23:09:32 EST
[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