Message ID | 20250107052906.249973-4-wilfred.mallawa@wdc.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Add SPDM over Storage transport support for NVMe | expand |
On Wed, Jan 8, 2025 at 12:04 AM Wilfred Mallawa via <qemu-devel@nongnu.org> wrote: > > This is to support uni-directional transports such as SPDM > over Storage. As specified by the DMTF DSP0286. > > Signed-off-by: Wilfred Mallawa <wilfred.mallawa@wdc.com> > --- > backends/spdm-socket.c | 25 +++++++++++++++++++++++++ > include/system/spdm-socket.h | 35 +++++++++++++++++++++++++++++++++++ > 2 files changed, 60 insertions(+) > > diff --git a/backends/spdm-socket.c b/backends/spdm-socket.c > index 2c709c68c8..4421b5c532 100644 > --- a/backends/spdm-socket.c > +++ b/backends/spdm-socket.c > @@ -184,6 +184,31 @@ int spdm_socket_connect(uint16_t port, Error **errp) > return client_socket; > } > > +uint32_t spdm_socket_receive(const int socket, uint32_t transport_type, > + void *rsp, uint32_t rsp_len) > +{ > + uint32_t command; > + bool result; > + > + result = receive_platform_data(socket, transport_type, &command, > + (uint8_t *)rsp, &rsp_len); > + > + if (!result) { > + return 0; > + } > + > + assert(command != 0); This should return an error instead of assert > + > + return rsp_len; > +} > + > +bool spdm_socket_send(const int socket, uint32_t socket_cmd, > + uint32_t transport_type, void *req, uint32_t req_len) > +{ > + return send_platform_data(socket, transport_type, > + socket_cmd, req, req_len); > +} > + > uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type, > void *req, uint32_t req_len, > void *rsp, uint32_t rsp_len) > diff --git a/include/system/spdm-socket.h b/include/system/spdm-socket.h > index 5d8bd9aa4e..2b7d03f82d 100644 > --- a/include/system/spdm-socket.h > +++ b/include/system/spdm-socket.h > @@ -50,6 +50,35 @@ uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type, > void *req, uint32_t req_len, > void *rsp, uint32_t rsp_len); > > +/** > + * spdm_socket_rsp: Receive a message from an SPDM server > + * @socket: socket returned from spdm_socket_connect() > + * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro > + * @rsp: response buffer > + * @rsp_len: response buffer length > + * > + * Receives a message from the SPDM server and returns the number of bytes > + * received or 0 on failure. This can be used to receive a message from the SPDM > + * server without sending anything first. > + */ > +uint32_t spdm_socket_receive(const int socket, uint32_t transport_type, > + void *rsp, uint32_t rsp_len); > + > +/** > + * spdm_socket_rsp: Sends a message to an SPDM server > + * @socket: socket returned from spdm_socket_connect() > + * @socket_cmd: socket command type (normal/if_recv/if_send etc...) > + * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro > + * @req: request buffer > + * @req_len: request buffer length > + * > + * Sends platform data to a SPDM server on socket, returns true on success. > + * The response from the server must then be fetched by using > + * spdm_socket_receive(). > + */ > +bool spdm_socket_send(const int socket, uint32_t socket_cmd, > + uint32_t transport_type, void *req, uint32_t req_len); > + > /** > * spdm_socket_close: send a shutdown command to the server > * @socket: socket returned from spdm_socket_connect() > @@ -60,6 +89,9 @@ uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type, > void spdm_socket_close(const int socket, uint32_t transport_type); > > #define SPDM_SOCKET_COMMAND_NORMAL 0x0001 > +#define SPDM_SOCKET_STORAGE_CMD_IF_SEND 0x0002 > +#define SPDM_SOCKET_STORAGE_CMD_IF_RECV 0x0003 > +#define SOCKET_SPDM_STORAGE_ACK_STATUS 0x0004 > #define SPDM_SOCKET_COMMAND_OOB_ENCAP_KEY_UPDATE 0x8001 > #define SPDM_SOCKET_COMMAND_CONTINUE 0xFFFD > #define SPDM_SOCKET_COMMAND_SHUTDOWN 0xFFFE > @@ -68,7 +100,10 @@ void spdm_socket_close(const int socket, uint32_t transport_type); > > #define SPDM_SOCKET_TRANSPORT_TYPE_MCTP 0x01 > #define SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE 0x02 > +#define SPDM_SOCKET_TRANSPORT_TYPE_SCSI 0x03 > +#define SPDM_SOCKET_TRANSPORT_TYPE_NVME 0x04 This should be in a different patch Alistair > > #define SPDM_SOCKET_MAX_MESSAGE_BUFFER_SIZE 0x1200 > +#define SPDM_SOCKET_MAX_MSG_STATUS_LEN 0x02 > > #endif > -- > 2.47.1 > >
On Wed, 2025-01-15 at 12:28 +1000, Alistair Francis wrote: > On Wed, Jan 8, 2025 at 12:04 AM Wilfred Mallawa via > <qemu-devel@nongnu.org> wrote: > > > > This is to support uni-directional transports such as SPDM > > over Storage. As specified by the DMTF DSP0286. > > > > Signed-off-by: Wilfred Mallawa <wilfred.mallawa@wdc.com> > > --- > > backends/spdm-socket.c | 25 +++++++++++++++++++++++++ > > include/system/spdm-socket.h | 35 > > +++++++++++++++++++++++++++++++++++ > > 2 files changed, 60 insertions(+) > > > > diff --git a/backends/spdm-socket.c b/backends/spdm-socket.c > > index 2c709c68c8..4421b5c532 100644 > > --- a/backends/spdm-socket.c > > +++ b/backends/spdm-socket.c > > @@ -184,6 +184,31 @@ int spdm_socket_connect(uint16_t port, Error > > **errp) > > return client_socket; > > } > > > > +uint32_t spdm_socket_receive(const int socket, uint32_t > > transport_type, > > + void *rsp, uint32_t rsp_len) > > +{ > > + uint32_t command; > > + bool result; > > + > > + result = receive_platform_data(socket, transport_type, > > &command, > > + (uint8_t *)rsp, &rsp_len); > > + > > + if (!result) { > > + return 0; > > + } > > + > > + assert(command != 0); > > This should return an error instead of assert > > > + > > + return rsp_len; > > +} > > + > > +bool spdm_socket_send(const int socket, uint32_t socket_cmd, > > + uint32_t transport_type, void *req, uint32_t > > req_len) > > +{ > > + return send_platform_data(socket, transport_type, > > + socket_cmd, req, req_len); > > +} > > + > > uint32_t spdm_socket_rsp(const int socket, uint32_t > > transport_type, > > void *req, uint32_t req_len, > > void *rsp, uint32_t rsp_len) > > diff --git a/include/system/spdm-socket.h b/include/system/spdm- > > socket.h > > index 5d8bd9aa4e..2b7d03f82d 100644 > > --- a/include/system/spdm-socket.h > > +++ b/include/system/spdm-socket.h > > @@ -50,6 +50,35 @@ uint32_t spdm_socket_rsp(const int socket, > > uint32_t transport_type, > > void *req, uint32_t req_len, > > void *rsp, uint32_t rsp_len); > > > > +/** > > + * spdm_socket_rsp: Receive a message from an SPDM server > > + * @socket: socket returned from spdm_socket_connect() > > + * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro > > + * @rsp: response buffer > > + * @rsp_len: response buffer length > > + * > > + * Receives a message from the SPDM server and returns the number > > of bytes > > + * received or 0 on failure. This can be used to receive a message > > from the SPDM > > + * server without sending anything first. > > + */ > > +uint32_t spdm_socket_receive(const int socket, uint32_t > > transport_type, > > + void *rsp, uint32_t rsp_len); > > + > > +/** > > + * spdm_socket_rsp: Sends a message to an SPDM server > > + * @socket: socket returned from spdm_socket_connect() > > + * @socket_cmd: socket command type (normal/if_recv/if_send > > etc...) > > + * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro > > + * @req: request buffer > > + * @req_len: request buffer length > > + * > > + * Sends platform data to a SPDM server on socket, returns true on > > success. > > + * The response from the server must then be fetched by using > > + * spdm_socket_receive(). > > + */ > > +bool spdm_socket_send(const int socket, uint32_t socket_cmd, > > + uint32_t transport_type, void *req, uint32_t > > req_len); > > + > > /** > > * spdm_socket_close: send a shutdown command to the server > > * @socket: socket returned from spdm_socket_connect() > > @@ -60,6 +89,9 @@ uint32_t spdm_socket_rsp(const int socket, > > uint32_t transport_type, > > void spdm_socket_close(const int socket, uint32_t transport_type); > > > > #define SPDM_SOCKET_COMMAND_NORMAL 0x0001 > > +#define SPDM_SOCKET_STORAGE_CMD_IF_SEND 0x0002 > > +#define SPDM_SOCKET_STORAGE_CMD_IF_RECV 0x0003 > > +#define SOCKET_SPDM_STORAGE_ACK_STATUS 0x0004 > > #define SPDM_SOCKET_COMMAND_OOB_ENCAP_KEY_UPDATE 0x8001 > > #define SPDM_SOCKET_COMMAND_CONTINUE 0xFFFD > > #define SPDM_SOCKET_COMMAND_SHUTDOWN 0xFFFE > > @@ -68,7 +100,10 @@ void spdm_socket_close(const int socket, > > uint32_t transport_type); > > > > #define SPDM_SOCKET_TRANSPORT_TYPE_MCTP 0x01 > > #define SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE 0x02 > > +#define SPDM_SOCKET_TRANSPORT_TYPE_SCSI 0x03 > > +#define SPDM_SOCKET_TRANSPORT_TYPE_NVME 0x04 > > This should be in a different patch > > Alistair > Sounds good, will send a separate patch with the assert fixed. > > > > #define SPDM_SOCKET_MAX_MESSAGE_BUFFER_SIZE 0x1200 > > +#define SPDM_SOCKET_MAX_MSG_STATUS_LEN 0x02 > > > > #endif > > -- > > 2.47.1 > > > > >
diff --git a/backends/spdm-socket.c b/backends/spdm-socket.c index 2c709c68c8..4421b5c532 100644 --- a/backends/spdm-socket.c +++ b/backends/spdm-socket.c @@ -184,6 +184,31 @@ int spdm_socket_connect(uint16_t port, Error **errp) return client_socket; } +uint32_t spdm_socket_receive(const int socket, uint32_t transport_type, + void *rsp, uint32_t rsp_len) +{ + uint32_t command; + bool result; + + result = receive_platform_data(socket, transport_type, &command, + (uint8_t *)rsp, &rsp_len); + + if (!result) { + return 0; + } + + assert(command != 0); + + return rsp_len; +} + +bool spdm_socket_send(const int socket, uint32_t socket_cmd, + uint32_t transport_type, void *req, uint32_t req_len) +{ + return send_platform_data(socket, transport_type, + socket_cmd, req, req_len); +} + uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type, void *req, uint32_t req_len, void *rsp, uint32_t rsp_len) diff --git a/include/system/spdm-socket.h b/include/system/spdm-socket.h index 5d8bd9aa4e..2b7d03f82d 100644 --- a/include/system/spdm-socket.h +++ b/include/system/spdm-socket.h @@ -50,6 +50,35 @@ uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type, void *req, uint32_t req_len, void *rsp, uint32_t rsp_len); +/** + * spdm_socket_rsp: Receive a message from an SPDM server + * @socket: socket returned from spdm_socket_connect() + * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro + * @rsp: response buffer + * @rsp_len: response buffer length + * + * Receives a message from the SPDM server and returns the number of bytes + * received or 0 on failure. This can be used to receive a message from the SPDM + * server without sending anything first. + */ +uint32_t spdm_socket_receive(const int socket, uint32_t transport_type, + void *rsp, uint32_t rsp_len); + +/** + * spdm_socket_rsp: Sends a message to an SPDM server + * @socket: socket returned from spdm_socket_connect() + * @socket_cmd: socket command type (normal/if_recv/if_send etc...) + * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro + * @req: request buffer + * @req_len: request buffer length + * + * Sends platform data to a SPDM server on socket, returns true on success. + * The response from the server must then be fetched by using + * spdm_socket_receive(). + */ +bool spdm_socket_send(const int socket, uint32_t socket_cmd, + uint32_t transport_type, void *req, uint32_t req_len); + /** * spdm_socket_close: send a shutdown command to the server * @socket: socket returned from spdm_socket_connect() @@ -60,6 +89,9 @@ uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type, void spdm_socket_close(const int socket, uint32_t transport_type); #define SPDM_SOCKET_COMMAND_NORMAL 0x0001 +#define SPDM_SOCKET_STORAGE_CMD_IF_SEND 0x0002 +#define SPDM_SOCKET_STORAGE_CMD_IF_RECV 0x0003 +#define SOCKET_SPDM_STORAGE_ACK_STATUS 0x0004 #define SPDM_SOCKET_COMMAND_OOB_ENCAP_KEY_UPDATE 0x8001 #define SPDM_SOCKET_COMMAND_CONTINUE 0xFFFD #define SPDM_SOCKET_COMMAND_SHUTDOWN 0xFFFE @@ -68,7 +100,10 @@ void spdm_socket_close(const int socket, uint32_t transport_type); #define SPDM_SOCKET_TRANSPORT_TYPE_MCTP 0x01 #define SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE 0x02 +#define SPDM_SOCKET_TRANSPORT_TYPE_SCSI 0x03 +#define SPDM_SOCKET_TRANSPORT_TYPE_NVME 0x04 #define SPDM_SOCKET_MAX_MESSAGE_BUFFER_SIZE 0x1200 +#define SPDM_SOCKET_MAX_MSG_STATUS_LEN 0x02 #endif
This is to support uni-directional transports such as SPDM over Storage. As specified by the DMTF DSP0286. Signed-off-by: Wilfred Mallawa <wilfred.mallawa@wdc.com> --- backends/spdm-socket.c | 25 +++++++++++++++++++++++++ include/system/spdm-socket.h | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+)