xref: /openbmc/libpldm/src/dsp/file.c (revision 58273fb7ee61bdce706ea2504b5eafc24a6b3cbc)
1cf26f2a3SChau Ly /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2cf26f2a3SChau Ly #include "dsp/base.h"
3cf26f2a3SChau Ly #include "msgbuf.h"
4cf26f2a3SChau Ly 
5cf26f2a3SChau Ly #include <libpldm/base.h>
6cf26f2a3SChau Ly #include <libpldm/file.h>
7cf26f2a3SChau Ly #include <libpldm/utils.h>
8cf26f2a3SChau Ly 
9cf26f2a3SChau Ly #include <assert.h>
10cf26f2a3SChau Ly #include <errno.h>
11cf26f2a3SChau Ly #include <stdbool.h>
12cf26f2a3SChau Ly #include <stdint.h>
13cf26f2a3SChau Ly #include <string.h>
14cf26f2a3SChau Ly #include <stdlib.h>
15cf26f2a3SChau Ly 
16cf26f2a3SChau Ly LIBPLDM_ABI_TESTING
encode_pldm_file_df_open_req(uint8_t instance_id,const struct pldm_file_df_open_req * req,struct pldm_msg * msg,size_t payload_length)17cf26f2a3SChau Ly int encode_pldm_file_df_open_req(uint8_t instance_id,
18cf26f2a3SChau Ly 				 const struct pldm_file_df_open_req *req,
19cf26f2a3SChau Ly 				 struct pldm_msg *msg, size_t payload_length)
20cf26f2a3SChau Ly {
21cf26f2a3SChau Ly 	PLDM_MSGBUF_DEFINE_P(buf);
22cf26f2a3SChau Ly 	int rc;
23cf26f2a3SChau Ly 
24cf26f2a3SChau Ly 	if (req == NULL || msg == NULL) {
25cf26f2a3SChau Ly 		return -EINVAL;
26cf26f2a3SChau Ly 	}
27cf26f2a3SChau Ly 
28cf26f2a3SChau Ly 	struct pldm_header_info header = { 0 };
29cf26f2a3SChau Ly 	header.instance = instance_id;
30cf26f2a3SChau Ly 	header.msg_type = PLDM_REQUEST;
31cf26f2a3SChau Ly 	header.pldm_type = PLDM_FILE;
32cf26f2a3SChau Ly 	header.command = PLDM_FILE_CMD_DF_OPEN;
33cf26f2a3SChau Ly 
34cf26f2a3SChau Ly 	rc = pack_pldm_header_errno(&header, &(msg->hdr));
35cf26f2a3SChau Ly 	if (rc) {
36cf26f2a3SChau Ly 		return rc;
37cf26f2a3SChau Ly 	}
38cf26f2a3SChau Ly 
39cf26f2a3SChau Ly 	rc = pldm_msgbuf_init_errno(buf, PLDM_DF_OPEN_REQ_BYTES, msg->payload,
40cf26f2a3SChau Ly 				    payload_length);
41cf26f2a3SChau Ly 	if (rc) {
42cf26f2a3SChau Ly 		return rc;
43cf26f2a3SChau Ly 	}
44cf26f2a3SChau Ly 
45cf26f2a3SChau Ly 	pldm_msgbuf_insert(buf, req->file_identifier);
46cf26f2a3SChau Ly 	pldm_msgbuf_insert(buf, req->file_attribute.value);
47cf26f2a3SChau Ly 
48cf26f2a3SChau Ly 	return pldm_msgbuf_complete(buf);
49cf26f2a3SChau Ly }
50cf26f2a3SChau Ly 
51cf26f2a3SChau Ly LIBPLDM_ABI_TESTING
decode_pldm_file_df_open_resp(const struct pldm_msg * msg,size_t payload_length,struct pldm_file_df_open_resp * resp)52cf26f2a3SChau Ly int decode_pldm_file_df_open_resp(const struct pldm_msg *msg,
53cf26f2a3SChau Ly 				  size_t payload_length,
54cf26f2a3SChau Ly 				  struct pldm_file_df_open_resp *resp)
55cf26f2a3SChau Ly {
56cf26f2a3SChau Ly 	PLDM_MSGBUF_DEFINE_P(buf);
57cf26f2a3SChau Ly 	int rc;
58cf26f2a3SChau Ly 
59cf26f2a3SChau Ly 	if (!msg || !resp) {
60cf26f2a3SChau Ly 		return -EINVAL;
61cf26f2a3SChau Ly 	}
62cf26f2a3SChau Ly 
63cf26f2a3SChau Ly 	rc = pldm_msg_has_error(msg, payload_length);
64cf26f2a3SChau Ly 	if (rc) {
65cf26f2a3SChau Ly 		resp->completion_code = rc;
66cf26f2a3SChau Ly 		return 0;
67cf26f2a3SChau Ly 	}
68cf26f2a3SChau Ly 
69cf26f2a3SChau Ly 	rc = pldm_msgbuf_init_errno(buf, PLDM_DF_OPEN_RESP_BYTES, msg->payload,
70cf26f2a3SChau Ly 				    payload_length);
71cf26f2a3SChau Ly 	if (rc) {
72cf26f2a3SChau Ly 		return rc;
73cf26f2a3SChau Ly 	}
74cf26f2a3SChau Ly 
75cf26f2a3SChau Ly 	pldm_msgbuf_extract(buf, resp->completion_code);
76cf26f2a3SChau Ly 	pldm_msgbuf_extract(buf, resp->file_descriptor);
77cf26f2a3SChau Ly 
78cf26f2a3SChau Ly 	return pldm_msgbuf_complete_consumed(buf);
79cf26f2a3SChau Ly }
807286ca64SChau Ly 
817286ca64SChau Ly LIBPLDM_ABI_TESTING
encode_pldm_file_df_close_req(uint8_t instance_id,const struct pldm_file_df_close_req * req,struct pldm_msg * msg,size_t payload_length)827286ca64SChau Ly int encode_pldm_file_df_close_req(uint8_t instance_id,
837286ca64SChau Ly 				  const struct pldm_file_df_close_req *req,
847286ca64SChau Ly 				  struct pldm_msg *msg, size_t payload_length)
857286ca64SChau Ly {
867286ca64SChau Ly 	PLDM_MSGBUF_DEFINE_P(buf);
877286ca64SChau Ly 	int rc;
887286ca64SChau Ly 
897286ca64SChau Ly 	if (!req || !msg) {
907286ca64SChau Ly 		return -EINVAL;
917286ca64SChau Ly 	}
927286ca64SChau Ly 
937286ca64SChau Ly 	struct pldm_header_info header = { 0 };
947286ca64SChau Ly 	header.instance = instance_id;
957286ca64SChau Ly 	header.msg_type = PLDM_REQUEST;
967286ca64SChau Ly 	header.pldm_type = PLDM_FILE;
977286ca64SChau Ly 	header.command = PLDM_FILE_CMD_DF_CLOSE;
987286ca64SChau Ly 
997286ca64SChau Ly 	rc = pack_pldm_header_errno(&header, &(msg->hdr));
1007286ca64SChau Ly 	if (rc) {
1017286ca64SChau Ly 		return rc;
1027286ca64SChau Ly 	}
1037286ca64SChau Ly 
1047286ca64SChau Ly 	rc = pldm_msgbuf_init_errno(buf, PLDM_DF_CLOSE_REQ_BYTES, msg->payload,
1057286ca64SChau Ly 				    payload_length);
1067286ca64SChau Ly 	if (rc) {
1077286ca64SChau Ly 		return rc;
1087286ca64SChau Ly 	}
1097286ca64SChau Ly 
1107286ca64SChau Ly 	pldm_msgbuf_insert(buf, req->file_descriptor);
1117286ca64SChau Ly 	pldm_msgbuf_insert(buf, req->df_close_options.value);
1127286ca64SChau Ly 
1137286ca64SChau Ly 	return pldm_msgbuf_complete(buf);
1147286ca64SChau Ly }
1157286ca64SChau Ly 
1167286ca64SChau Ly LIBPLDM_ABI_TESTING
decode_pldm_file_df_close_resp(const struct pldm_msg * msg,size_t payload_length,struct pldm_file_df_close_resp * resp)1177286ca64SChau Ly int decode_pldm_file_df_close_resp(const struct pldm_msg *msg,
1187286ca64SChau Ly 				   size_t payload_length,
1197286ca64SChau Ly 				   struct pldm_file_df_close_resp *resp)
1207286ca64SChau Ly {
1217286ca64SChau Ly 	if (!msg || !resp) {
1227286ca64SChau Ly 		return -EINVAL;
1237286ca64SChau Ly 	}
1247286ca64SChau Ly 
1257286ca64SChau Ly 	resp->completion_code = pldm_msg_has_error(msg, payload_length);
1267286ca64SChau Ly 
1277286ca64SChau Ly 	return 0;
1287286ca64SChau Ly }
129*58273fb7SChau Ly 
130*58273fb7SChau Ly LIBPLDM_ABI_TESTING
encode_pldm_file_df_heartbeat_req(uint8_t instance_id,const struct pldm_file_df_heartbeat_req * req,struct pldm_msg * msg,size_t payload_length)131*58273fb7SChau Ly int encode_pldm_file_df_heartbeat_req(
132*58273fb7SChau Ly 	uint8_t instance_id, const struct pldm_file_df_heartbeat_req *req,
133*58273fb7SChau Ly 	struct pldm_msg *msg, size_t payload_length)
134*58273fb7SChau Ly {
135*58273fb7SChau Ly 	PLDM_MSGBUF_DEFINE_P(buf);
136*58273fb7SChau Ly 	int rc;
137*58273fb7SChau Ly 
138*58273fb7SChau Ly 	if (!req || !msg) {
139*58273fb7SChau Ly 		return -EINVAL;
140*58273fb7SChau Ly 	}
141*58273fb7SChau Ly 
142*58273fb7SChau Ly 	struct pldm_header_info header = { 0 };
143*58273fb7SChau Ly 	header.instance = instance_id;
144*58273fb7SChau Ly 	header.msg_type = PLDM_REQUEST;
145*58273fb7SChau Ly 	header.pldm_type = PLDM_FILE;
146*58273fb7SChau Ly 	header.command = PLDM_FILE_CMD_DF_HEARTBEAT;
147*58273fb7SChau Ly 
148*58273fb7SChau Ly 	rc = pack_pldm_header_errno(&header, &(msg->hdr));
149*58273fb7SChau Ly 	if (rc) {
150*58273fb7SChau Ly 		return rc;
151*58273fb7SChau Ly 	}
152*58273fb7SChau Ly 
153*58273fb7SChau Ly 	rc = pldm_msgbuf_init_errno(buf, PLDM_DF_HEARTBEAT_REQ_BYTES,
154*58273fb7SChau Ly 				    msg->payload, payload_length);
155*58273fb7SChau Ly 	if (rc) {
156*58273fb7SChau Ly 		return rc;
157*58273fb7SChau Ly 	}
158*58273fb7SChau Ly 
159*58273fb7SChau Ly 	pldm_msgbuf_insert(buf, req->file_descriptor);
160*58273fb7SChau Ly 	pldm_msgbuf_insert(buf, req->requester_max_interval);
161*58273fb7SChau Ly 
162*58273fb7SChau Ly 	return pldm_msgbuf_complete(buf);
163*58273fb7SChau Ly }
164*58273fb7SChau Ly 
165*58273fb7SChau Ly LIBPLDM_ABI_TESTING
decode_pldm_file_df_heartbeat_resp(const struct pldm_msg * msg,size_t payload_length,struct pldm_file_df_heartbeat_resp * resp)166*58273fb7SChau Ly int decode_pldm_file_df_heartbeat_resp(const struct pldm_msg *msg,
167*58273fb7SChau Ly 				       size_t payload_length,
168*58273fb7SChau Ly 				       struct pldm_file_df_heartbeat_resp *resp)
169*58273fb7SChau Ly {
170*58273fb7SChau Ly 	PLDM_MSGBUF_DEFINE_P(buf);
171*58273fb7SChau Ly 	int rc;
172*58273fb7SChau Ly 
173*58273fb7SChau Ly 	if (!msg || !resp) {
174*58273fb7SChau Ly 		return -EINVAL;
175*58273fb7SChau Ly 	}
176*58273fb7SChau Ly 
177*58273fb7SChau Ly 	rc = pldm_msg_has_error(msg, payload_length);
178*58273fb7SChau Ly 	if (rc) {
179*58273fb7SChau Ly 		resp->completion_code = rc;
180*58273fb7SChau Ly 		return 0;
181*58273fb7SChau Ly 	}
182*58273fb7SChau Ly 
183*58273fb7SChau Ly 	rc = pldm_msgbuf_init_errno(buf, PLDM_DF_HEARTBEAT_RESP_BYTES,
184*58273fb7SChau Ly 				    msg->payload, payload_length);
185*58273fb7SChau Ly 	if (rc) {
186*58273fb7SChau Ly 		return rc;
187*58273fb7SChau Ly 	}
188*58273fb7SChau Ly 
189*58273fb7SChau Ly 	pldm_msgbuf_extract(buf, resp->completion_code);
190*58273fb7SChau Ly 	pldm_msgbuf_extract(buf, resp->responder_max_interval);
191*58273fb7SChau Ly 
192*58273fb7SChau Ly 	return pldm_msgbuf_complete_consumed(buf);
193*58273fb7SChau Ly }
194