blob: 07a283cba73f42aad659db5c13c6d540af7ebb1b [file] [log] [blame]
Chau Lycf26f2a2025-03-18 10:39:03 +00001/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2#include "dsp/base.h"
3#include "msgbuf.h"
4
5#include <libpldm/base.h>
6#include <libpldm/file.h>
7#include <libpldm/utils.h>
8
9#include <assert.h>
10#include <errno.h>
11#include <stdbool.h>
12#include <stdint.h>
13#include <string.h>
14#include <stdlib.h>
15
Chau Ly26c8eb22025-07-30 06:56:33 +000016LIBPLDM_ABI_STABLE
Chau Lycf26f2a2025-03-18 10:39:03 +000017int encode_pldm_file_df_open_req(uint8_t instance_id,
18 const struct pldm_file_df_open_req *req,
Chau Ly530d1a32025-08-15 05:14:15 +000019 struct pldm_msg *msg, size_t *payload_length)
Chau Lycf26f2a2025-03-18 10:39:03 +000020{
21 PLDM_MSGBUF_DEFINE_P(buf);
22 int rc;
23
24 if (req == NULL || msg == NULL) {
25 return -EINVAL;
26 }
27
28 struct pldm_header_info header = { 0 };
29 header.instance = instance_id;
30 header.msg_type = PLDM_REQUEST;
31 header.pldm_type = PLDM_FILE;
32 header.command = PLDM_FILE_CMD_DF_OPEN;
33
34 rc = pack_pldm_header_errno(&header, &(msg->hdr));
35 if (rc) {
36 return rc;
37 }
38
39 rc = pldm_msgbuf_init_errno(buf, PLDM_DF_OPEN_REQ_BYTES, msg->payload,
Chau Ly530d1a32025-08-15 05:14:15 +000040 *payload_length);
Chau Lycf26f2a2025-03-18 10:39:03 +000041 if (rc) {
42 return rc;
43 }
44
45 pldm_msgbuf_insert(buf, req->file_identifier);
46 pldm_msgbuf_insert(buf, req->file_attribute.value);
47
Chau Ly530d1a32025-08-15 05:14:15 +000048 return pldm_msgbuf_complete_used(buf, *payload_length, payload_length);
Chau Lycf26f2a2025-03-18 10:39:03 +000049}
50
51LIBPLDM_ABI_TESTING
John Chung76c9b192025-07-09 22:35:36 -050052int decode_pldm_file_df_open_req(const struct pldm_msg *msg,
53 size_t payload_length,
54 struct pldm_file_df_open_req *req)
55{
56 PLDM_MSGBUF_DEFINE_P(buf);
57 int rc;
58
59 if (!msg || !req) {
60 return -EINVAL;
61 }
62
63 rc = pldm_msgbuf_init_errno(buf, PLDM_DF_OPEN_REQ_BYTES, msg->payload,
64 payload_length);
65 if (rc) {
66 return rc;
67 }
68
69 pldm_msgbuf_extract(buf, req->file_identifier);
70 pldm_msgbuf_extract(buf, req->file_attribute.value);
71
72 return pldm_msgbuf_complete_consumed(buf);
73}
74
75LIBPLDM_ABI_TESTING
76int encode_pldm_file_df_open_resp(uint8_t instance_id,
77 const struct pldm_file_df_open_resp *resp,
78 struct pldm_msg *msg, size_t *payload_length)
79{
80 PLDM_MSGBUF_DEFINE_P(buf);
81 int rc;
82
83 if (!msg || !resp) {
84 return -EINVAL;
85 }
86
87 struct pldm_header_info header = { 0 };
88 header.instance = instance_id;
89 header.msg_type = PLDM_RESPONSE;
90 header.pldm_type = PLDM_FILE;
91 header.command = PLDM_FILE_CMD_DF_OPEN;
92
93 rc = pack_pldm_header_errno(&header, &(msg->hdr));
94 if (rc) {
95 return rc;
96 }
97
98 rc = pldm_msgbuf_init_errno(buf, PLDM_DF_OPEN_RESP_BYTES, msg->payload,
99 *payload_length);
100 if (rc) {
101 return rc;
102 }
103
104 pldm_msgbuf_insert(buf, resp->completion_code);
105 if (resp->completion_code == PLDM_SUCCESS) {
106 pldm_msgbuf_insert(buf, resp->file_descriptor);
107 }
108
109 return pldm_msgbuf_complete_used(buf, *payload_length, payload_length);
110}
111
Chau Ly26c8eb22025-07-30 06:56:33 +0000112LIBPLDM_ABI_STABLE
Chau Lycf26f2a2025-03-18 10:39:03 +0000113int decode_pldm_file_df_open_resp(const struct pldm_msg *msg,
114 size_t payload_length,
115 struct pldm_file_df_open_resp *resp)
116{
117 PLDM_MSGBUF_DEFINE_P(buf);
118 int rc;
119
120 if (!msg || !resp) {
121 return -EINVAL;
122 }
123
124 rc = pldm_msg_has_error(msg, payload_length);
125 if (rc) {
126 resp->completion_code = rc;
127 return 0;
128 }
129
130 rc = pldm_msgbuf_init_errno(buf, PLDM_DF_OPEN_RESP_BYTES, msg->payload,
131 payload_length);
132 if (rc) {
133 return rc;
134 }
135
136 pldm_msgbuf_extract(buf, resp->completion_code);
John Chung76c9b192025-07-09 22:35:36 -0500137 if (resp->completion_code != PLDM_SUCCESS) {
138 // Return the CC directly without decoding the rest of the payload
139 return pldm_msgbuf_complete(buf);
140 }
141
Chau Lycf26f2a2025-03-18 10:39:03 +0000142 pldm_msgbuf_extract(buf, resp->file_descriptor);
143
144 return pldm_msgbuf_complete_consumed(buf);
145}
Chau Ly7286ca62025-03-26 05:47:18 +0000146
Chau Ly26c8eb22025-07-30 06:56:33 +0000147LIBPLDM_ABI_STABLE
Chau Ly7286ca62025-03-26 05:47:18 +0000148int encode_pldm_file_df_close_req(uint8_t instance_id,
149 const struct pldm_file_df_close_req *req,
Chau Ly530d1a32025-08-15 05:14:15 +0000150 struct pldm_msg *msg, size_t *payload_length)
Chau Ly7286ca62025-03-26 05:47:18 +0000151{
152 PLDM_MSGBUF_DEFINE_P(buf);
153 int rc;
154
155 if (!req || !msg) {
156 return -EINVAL;
157 }
158
159 struct pldm_header_info header = { 0 };
160 header.instance = instance_id;
161 header.msg_type = PLDM_REQUEST;
162 header.pldm_type = PLDM_FILE;
163 header.command = PLDM_FILE_CMD_DF_CLOSE;
164
165 rc = pack_pldm_header_errno(&header, &(msg->hdr));
166 if (rc) {
167 return rc;
168 }
169
170 rc = pldm_msgbuf_init_errno(buf, PLDM_DF_CLOSE_REQ_BYTES, msg->payload,
Chau Ly530d1a32025-08-15 05:14:15 +0000171 *payload_length);
Chau Ly7286ca62025-03-26 05:47:18 +0000172 if (rc) {
173 return rc;
174 }
175
176 pldm_msgbuf_insert(buf, req->file_descriptor);
177 pldm_msgbuf_insert(buf, req->df_close_options.value);
178
Chau Ly530d1a32025-08-15 05:14:15 +0000179 return pldm_msgbuf_complete_used(buf, *payload_length, payload_length);
Chau Ly7286ca62025-03-26 05:47:18 +0000180}
181
182LIBPLDM_ABI_TESTING
John Chung76c9b192025-07-09 22:35:36 -0500183int decode_pldm_file_df_close_req(const struct pldm_msg *msg,
184 size_t payload_length,
185 struct pldm_file_df_close_req *req)
186{
187 PLDM_MSGBUF_DEFINE_P(buf);
188 int rc;
189
190 if (!msg || !req) {
191 return -EINVAL;
192 }
193
194 rc = pldm_msgbuf_init_errno(buf, PLDM_DF_CLOSE_REQ_BYTES, msg->payload,
195 payload_length);
196 if (rc) {
197 return rc;
198 }
199
200 pldm_msgbuf_extract(buf, req->file_descriptor);
201 pldm_msgbuf_extract(buf, req->df_close_options.value);
202
203 return pldm_msgbuf_complete_consumed(buf);
204}
205
206LIBPLDM_ABI_TESTING
207int encode_pldm_file_df_close_resp(uint8_t instance_id,
208 const struct pldm_file_df_close_resp *resp,
209 struct pldm_msg *msg, size_t *payload_length)
210{
211 PLDM_MSGBUF_DEFINE_P(buf);
212 int rc;
213
214 if (!msg || !resp) {
215 return -EINVAL;
216 }
217
218 struct pldm_header_info header = { 0 };
219 header.instance = instance_id;
220 header.msg_type = PLDM_RESPONSE;
221 header.pldm_type = PLDM_FILE;
222 header.command = PLDM_FILE_CMD_DF_CLOSE;
223
224 rc = pack_pldm_header_errno(&header, &(msg->hdr));
225 if (rc) {
226 return rc;
227 }
228
229 rc = pldm_msgbuf_init_errno(buf, PLDM_DF_CLOSE_RESP_BYTES, msg->payload,
230 *payload_length);
231 if (rc) {
232 return rc;
233 }
234
235 pldm_msgbuf_insert(buf, resp->completion_code);
236
237 return pldm_msgbuf_complete_used(buf, *payload_length, payload_length);
238}
239
Chau Ly26c8eb22025-07-30 06:56:33 +0000240LIBPLDM_ABI_STABLE
Chau Ly7286ca62025-03-26 05:47:18 +0000241int decode_pldm_file_df_close_resp(const struct pldm_msg *msg,
242 size_t payload_length,
243 struct pldm_file_df_close_resp *resp)
244{
245 if (!msg || !resp) {
246 return -EINVAL;
247 }
248
249 resp->completion_code = pldm_msg_has_error(msg, payload_length);
250
251 return 0;
252}
Chau Ly58273fb2025-03-26 08:26:49 +0000253
Chau Ly26c8eb22025-07-30 06:56:33 +0000254LIBPLDM_ABI_STABLE
Chau Ly58273fb2025-03-26 08:26:49 +0000255int encode_pldm_file_df_heartbeat_req(
256 uint8_t instance_id, const struct pldm_file_df_heartbeat_req *req,
Chau Ly530d1a32025-08-15 05:14:15 +0000257 struct pldm_msg *msg, size_t *payload_length)
Chau Ly58273fb2025-03-26 08:26:49 +0000258{
259 PLDM_MSGBUF_DEFINE_P(buf);
260 int rc;
261
262 if (!req || !msg) {
263 return -EINVAL;
264 }
265
266 struct pldm_header_info header = { 0 };
267 header.instance = instance_id;
268 header.msg_type = PLDM_REQUEST;
269 header.pldm_type = PLDM_FILE;
270 header.command = PLDM_FILE_CMD_DF_HEARTBEAT;
271
272 rc = pack_pldm_header_errno(&header, &(msg->hdr));
273 if (rc) {
274 return rc;
275 }
276
277 rc = pldm_msgbuf_init_errno(buf, PLDM_DF_HEARTBEAT_REQ_BYTES,
Chau Ly530d1a32025-08-15 05:14:15 +0000278 msg->payload, *payload_length);
Chau Ly58273fb2025-03-26 08:26:49 +0000279 if (rc) {
280 return rc;
281 }
282
283 pldm_msgbuf_insert(buf, req->file_descriptor);
284 pldm_msgbuf_insert(buf, req->requester_max_interval);
285
Chau Ly530d1a32025-08-15 05:14:15 +0000286 return pldm_msgbuf_complete_used(buf, *payload_length, payload_length);
Chau Ly58273fb2025-03-26 08:26:49 +0000287}
288
Chau Ly26c8eb22025-07-30 06:56:33 +0000289LIBPLDM_ABI_STABLE
Chau Ly58273fb2025-03-26 08:26:49 +0000290int decode_pldm_file_df_heartbeat_resp(const struct pldm_msg *msg,
291 size_t payload_length,
292 struct pldm_file_df_heartbeat_resp *resp)
293{
294 PLDM_MSGBUF_DEFINE_P(buf);
295 int rc;
296
297 if (!msg || !resp) {
298 return -EINVAL;
299 }
300
301 rc = pldm_msg_has_error(msg, payload_length);
302 if (rc) {
303 resp->completion_code = rc;
304 return 0;
305 }
306
307 rc = pldm_msgbuf_init_errno(buf, PLDM_DF_HEARTBEAT_RESP_BYTES,
308 msg->payload, payload_length);
309 if (rc) {
310 return rc;
311 }
312
313 pldm_msgbuf_extract(buf, resp->completion_code);
314 pldm_msgbuf_extract(buf, resp->responder_max_interval);
315
316 return pldm_msgbuf_complete_consumed(buf);
317}