blob: 4322ef28b9fd255664ab983a7fc5d76263fa0c8a [file] [log] [blame]
Patrick Williams691668f2023-11-01 08:19:10 -05001/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
Andrew Jeffery9c766792022-08-10 23:12:49 +09302#include "base.h"
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05303#include "pldm_types.h"
4#include <endian.h>
5#include <stdint.h>
6#include <string.h>
Andrew Jeffery9c766792022-08-10 23:12:49 +09307
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +09308LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +09309uint8_t pack_pldm_header(const struct pldm_header_info *hdr,
10 struct pldm_msg_hdr *msg)
11{
12 if (msg == NULL || hdr == NULL) {
13 return PLDM_ERROR_INVALID_DATA;
14 }
15
16 if (hdr->msg_type != PLDM_RESPONSE && hdr->msg_type != PLDM_REQUEST &&
17 hdr->msg_type != PLDM_ASYNC_REQUEST_NOTIFY) {
18 return PLDM_ERROR_INVALID_DATA;
19 }
20
21 if (hdr->instance > PLDM_INSTANCE_MAX) {
22 return PLDM_ERROR_INVALID_DATA;
23 }
24
25 if (hdr->pldm_type > (PLDM_MAX_TYPES - 1)) {
26 return PLDM_ERROR_INVALID_PLDM_TYPE;
27 }
28
29 uint8_t datagram = (hdr->msg_type == PLDM_ASYNC_REQUEST_NOTIFY) ? 1 : 0;
30
31 if (hdr->msg_type == PLDM_RESPONSE) {
32 msg->request = PLDM_RESPONSE;
33 } else if (hdr->msg_type == PLDM_REQUEST ||
34 hdr->msg_type == PLDM_ASYNC_REQUEST_NOTIFY) {
35 msg->request = PLDM_REQUEST;
36 }
37 msg->datagram = datagram;
38 msg->reserved = 0;
39 msg->instance_id = hdr->instance;
40 msg->header_ver = PLDM_CURRENT_VERSION;
41 msg->type = hdr->pldm_type;
42 msg->command = hdr->command;
43
44 return PLDM_SUCCESS;
45}
46
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +093047LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +093048uint8_t unpack_pldm_header(const struct pldm_msg_hdr *msg,
49 struct pldm_header_info *hdr)
50{
51 if (msg == NULL) {
52 return PLDM_ERROR_INVALID_DATA;
53 }
54
55 if (msg->request == PLDM_RESPONSE) {
56 hdr->msg_type = PLDM_RESPONSE;
57 } else {
Andrew Jeffery37dd6a32023-05-12 16:04:06 +093058 hdr->msg_type = msg->datagram ? PLDM_ASYNC_REQUEST_NOTIFY :
59 PLDM_REQUEST;
Andrew Jeffery9c766792022-08-10 23:12:49 +093060 }
61
62 hdr->instance = msg->instance_id;
63 hdr->pldm_type = msg->type;
64 hdr->command = msg->command;
65
66 return PLDM_SUCCESS;
67}
68
Andrew Jeffery5239d9a2023-10-16 10:51:53 +103069LIBPLDM_ABI_STABLE
Andrew Jeffery91c06e92023-09-22 15:22:54 +093070bool pldm_msg_hdr_correlate_response(const struct pldm_msg_hdr *req,
71 const struct pldm_msg_hdr *resp)
72{
73 return req->instance_id == resp->instance_id && req->request &&
74 !resp->request && req->type == resp->type &&
75 req->command == resp->command;
76}
77
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +093078LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +093079int encode_get_types_req(uint8_t instance_id, struct pldm_msg *msg)
80{
81 if (msg == NULL) {
82 return PLDM_ERROR_INVALID_DATA;
83 }
84
Andrew Jeffery37dd6a32023-05-12 16:04:06 +093085 struct pldm_header_info header = { 0 };
Andrew Jeffery9c766792022-08-10 23:12:49 +093086 header.instance = instance_id;
87 header.msg_type = PLDM_REQUEST;
88 header.command = PLDM_GET_PLDM_TYPES;
89
90 return pack_pldm_header(&header, &(msg->hdr));
91}
92
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +093093LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +093094int encode_get_commands_req(uint8_t instance_id, uint8_t type, ver32_t version,
95 struct pldm_msg *msg)
96{
97 if (msg == NULL) {
98 return PLDM_ERROR_INVALID_DATA;
99 }
100
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930101 struct pldm_header_info header = { 0 };
Andrew Jeffery9c766792022-08-10 23:12:49 +0930102 header.instance = instance_id;
103 header.msg_type = PLDM_REQUEST;
104 header.command = PLDM_GET_PLDM_COMMANDS;
105
106 uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
107 if (rc != PLDM_SUCCESS) {
108 return rc;
109 }
110
111 struct pldm_get_commands_req *request =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930112 (struct pldm_get_commands_req *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930113
114 request->type = type;
115 request->version = version;
116
117 return PLDM_SUCCESS;
118}
119
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930120LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930121int encode_get_types_resp(uint8_t instance_id, uint8_t completion_code,
122 const bitfield8_t *types, struct pldm_msg *msg)
123{
124 if (msg == NULL) {
125 return PLDM_ERROR_INVALID_DATA;
126 }
127
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930128 struct pldm_header_info header = { 0 };
Andrew Jeffery9c766792022-08-10 23:12:49 +0930129 header.instance = instance_id;
130 header.msg_type = PLDM_RESPONSE;
131 header.command = PLDM_GET_PLDM_TYPES;
132
133 uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
134 if (rc != PLDM_SUCCESS) {
135 return rc;
136 }
137
138 struct pldm_get_types_resp *response =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930139 (struct pldm_get_types_resp *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930140 response->completion_code = completion_code;
141 if (response->completion_code == PLDM_SUCCESS) {
142 if (types == NULL) {
143 return PLDM_ERROR_INVALID_DATA;
144 }
145 memcpy(response->types, &(types->byte), PLDM_MAX_TYPES / 8);
146 }
147
148 return PLDM_SUCCESS;
149}
150
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930151LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930152int decode_get_commands_req(const struct pldm_msg *msg, size_t payload_length,
153 uint8_t *type, ver32_t *version)
154{
155 if (msg == NULL || type == NULL || version == NULL) {
156 return PLDM_ERROR_INVALID_DATA;
157 }
158
159 if (payload_length != PLDM_GET_COMMANDS_REQ_BYTES) {
160 return PLDM_ERROR_INVALID_LENGTH;
161 }
162
163 struct pldm_get_commands_req *request =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930164 (struct pldm_get_commands_req *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930165 *type = request->type;
166 *version = request->version;
167 return PLDM_SUCCESS;
168}
169
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930170LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930171int encode_get_commands_resp(uint8_t instance_id, uint8_t completion_code,
172 const bitfield8_t *commands, struct pldm_msg *msg)
173{
174 if (msg == NULL) {
175 return PLDM_ERROR_INVALID_DATA;
176 }
177
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930178 struct pldm_header_info header = { 0 };
Andrew Jeffery9c766792022-08-10 23:12:49 +0930179 header.instance = instance_id;
180 header.msg_type = PLDM_RESPONSE;
181 header.command = PLDM_GET_PLDM_COMMANDS;
182 uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
183 if (rc != PLDM_SUCCESS) {
184 return rc;
185 }
186
187 struct pldm_get_commands_resp *response =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930188 (struct pldm_get_commands_resp *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930189 response->completion_code = completion_code;
190 if (response->completion_code == PLDM_SUCCESS) {
191 if (commands == NULL) {
192 return PLDM_ERROR_INVALID_DATA;
193 }
194 memcpy(response->commands, &(commands->byte),
195 PLDM_MAX_CMDS_PER_TYPE / 8);
196 }
197
198 return PLDM_SUCCESS;
199}
200
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930201LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930202int decode_get_types_resp(const struct pldm_msg *msg, size_t payload_length,
203 uint8_t *completion_code, bitfield8_t *types)
204{
205 if (msg == NULL || types == NULL || completion_code == NULL) {
206 return PLDM_ERROR_INVALID_DATA;
207 }
208
209 *completion_code = msg->payload[0];
210 if (PLDM_SUCCESS != *completion_code) {
211 return PLDM_SUCCESS;
212 }
213
214 if (payload_length != PLDM_GET_TYPES_RESP_BYTES) {
215 return PLDM_ERROR_INVALID_LENGTH;
216 }
217
218 struct pldm_get_types_resp *response =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930219 (struct pldm_get_types_resp *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930220
221 memcpy(&(types->byte), response->types, PLDM_MAX_TYPES / 8);
222
223 return PLDM_SUCCESS;
224}
225
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930226LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930227int decode_get_commands_resp(const struct pldm_msg *msg, size_t payload_length,
228 uint8_t *completion_code, bitfield8_t *commands)
229{
230 if (msg == NULL || commands == NULL || completion_code == NULL) {
231 return PLDM_ERROR_INVALID_DATA;
232 }
233
234 *completion_code = msg->payload[0];
235 if (PLDM_SUCCESS != *completion_code) {
236 return PLDM_SUCCESS;
237 }
238
239 if (payload_length != PLDM_GET_COMMANDS_RESP_BYTES) {
240 return PLDM_ERROR_INVALID_LENGTH;
241 }
242
243 struct pldm_get_commands_resp *response =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930244 (struct pldm_get_commands_resp *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930245
246 memcpy(&(commands->byte), response->commands,
247 PLDM_MAX_CMDS_PER_TYPE / 8);
248
249 return PLDM_SUCCESS;
250}
251
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930252LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930253int encode_get_version_req(uint8_t instance_id, uint32_t transfer_handle,
254 uint8_t transfer_opflag, uint8_t type,
255 struct pldm_msg *msg)
256{
257 if (NULL == msg) {
258 return PLDM_ERROR_INVALID_DATA;
259 }
260
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930261 struct pldm_header_info header = { 0 };
Andrew Jeffery9c766792022-08-10 23:12:49 +0930262 header.msg_type = PLDM_REQUEST;
263 header.instance = instance_id;
264 header.pldm_type = PLDM_BASE;
265 header.command = PLDM_GET_PLDM_VERSION;
266
267 uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
268 if (rc != PLDM_SUCCESS) {
269 return rc;
270 }
271
272 struct pldm_get_version_req *request =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930273 (struct pldm_get_version_req *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930274 transfer_handle = htole32(transfer_handle);
275 request->transfer_handle = transfer_handle;
276 request->transfer_opflag = transfer_opflag;
277 request->type = type;
278
279 return PLDM_SUCCESS;
280}
281
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930282LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930283int encode_get_version_resp(uint8_t instance_id, uint8_t completion_code,
284 uint32_t next_transfer_handle,
285 uint8_t transfer_flag, const ver32_t *version_data,
286 size_t version_size, struct pldm_msg *msg)
287{
288 if (NULL == msg) {
289 return PLDM_ERROR_INVALID_DATA;
290 }
291
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930292 struct pldm_header_info header = { 0 };
Andrew Jeffery9c766792022-08-10 23:12:49 +0930293 header.msg_type = PLDM_RESPONSE;
294 header.instance = instance_id;
295 header.pldm_type = PLDM_BASE;
296 header.command = PLDM_GET_PLDM_VERSION;
297
298 uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
299 if (rc != PLDM_SUCCESS) {
300 return rc;
301 }
302
303 struct pldm_get_version_resp *response =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930304 (struct pldm_get_version_resp *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930305 response->completion_code = completion_code;
306 if (response->completion_code == PLDM_SUCCESS) {
307 response->next_transfer_handle = htole32(next_transfer_handle);
308 response->transfer_flag = transfer_flag;
309 memcpy(response->version_data, (uint8_t *)version_data,
310 version_size);
311 }
312 return PLDM_SUCCESS;
313}
314
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930315LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930316int decode_get_version_req(const struct pldm_msg *msg, size_t payload_length,
317 uint32_t *transfer_handle, uint8_t *transfer_opflag,
318 uint8_t *type)
319{
Andrew Jeffery9c766792022-08-10 23:12:49 +0930320 if (payload_length != PLDM_GET_VERSION_REQ_BYTES) {
321 return PLDM_ERROR_INVALID_LENGTH;
322 }
323
324 struct pldm_get_version_req *request =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930325 (struct pldm_get_version_req *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930326 *transfer_handle = le32toh(request->transfer_handle);
327 *transfer_opflag = request->transfer_opflag;
328 *type = request->type;
329 return PLDM_SUCCESS;
330}
331
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930332LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930333int decode_get_version_resp(const struct pldm_msg *msg, size_t payload_length,
334 uint8_t *completion_code,
335 uint32_t *next_transfer_handle,
336 uint8_t *transfer_flag, ver32_t *version)
337{
338 if (msg == NULL || next_transfer_handle == NULL ||
339 transfer_flag == NULL || completion_code == NULL) {
340 return PLDM_ERROR_INVALID_DATA;
341 }
342
343 *completion_code = msg->payload[0];
344 if (PLDM_SUCCESS != *completion_code) {
345 return PLDM_SUCCESS;
346 }
347
348 if (payload_length < PLDM_GET_VERSION_RESP_BYTES) {
349 return PLDM_ERROR_INVALID_LENGTH;
350 }
351
352 struct pldm_get_version_resp *response =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930353 (struct pldm_get_version_resp *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930354
355 *next_transfer_handle = le32toh(response->next_transfer_handle);
356 *transfer_flag = response->transfer_flag;
357 memcpy(version, (uint8_t *)response->version_data, sizeof(ver32_t));
358
359 return PLDM_SUCCESS;
360}
361
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930362LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930363int encode_get_tid_req(uint8_t instance_id, struct pldm_msg *msg)
364{
365 if (msg == NULL) {
366 return PLDM_ERROR_INVALID_DATA;
367 }
368
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930369 struct pldm_header_info header = { 0 };
Andrew Jeffery9c766792022-08-10 23:12:49 +0930370 header.instance = instance_id;
371 header.msg_type = PLDM_REQUEST;
372 header.command = PLDM_GET_TID;
373
374 return pack_pldm_header(&header, &(msg->hdr));
375}
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930376
377LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930378int encode_get_tid_resp(uint8_t instance_id, uint8_t completion_code,
379 uint8_t tid, struct pldm_msg *msg)
380{
381 if (msg == NULL) {
382 return PLDM_ERROR_INVALID_DATA;
383 }
384
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930385 struct pldm_header_info header = { 0 };
Andrew Jeffery9c766792022-08-10 23:12:49 +0930386 header.instance = instance_id;
387 header.msg_type = PLDM_RESPONSE;
388 header.command = PLDM_GET_TID;
389
390 uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
391 if (rc != PLDM_SUCCESS) {
392 return rc;
393 }
394
395 struct pldm_get_tid_resp *response =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930396 (struct pldm_get_tid_resp *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930397 response->completion_code = completion_code;
398 response->tid = tid;
399
400 return PLDM_SUCCESS;
401}
402
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930403LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930404int decode_get_tid_resp(const struct pldm_msg *msg, size_t payload_length,
405 uint8_t *completion_code, uint8_t *tid)
406{
407 if (msg == NULL || tid == NULL || completion_code == NULL) {
408 return PLDM_ERROR_INVALID_DATA;
409 }
410
411 *completion_code = msg->payload[0];
412 if (PLDM_SUCCESS != *completion_code) {
413 return PLDM_SUCCESS;
414 }
415
416 if (payload_length != PLDM_GET_TID_RESP_BYTES) {
417 return PLDM_ERROR_INVALID_LENGTH;
418 }
419
420 struct pldm_get_tid_resp *response =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930421 (struct pldm_get_tid_resp *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930422
423 *tid = response->tid;
424
425 return PLDM_SUCCESS;
426}
427
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930428LIBPLDM_ABI_STABLE
Gilbert Chen6c9c9172022-10-18 17:07:29 +0800429int encode_set_tid_req(uint8_t instance_id, uint8_t tid, struct pldm_msg *msg)
430{
431 if (msg == NULL) {
432 return PLDM_ERROR_INVALID_DATA;
433 }
434
435 if (tid == 0x0 || tid == 0xff) {
436 return PLDM_ERROR_INVALID_DATA;
437 }
438
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930439 struct pldm_header_info header = { 0 };
Gilbert Chen6c9c9172022-10-18 17:07:29 +0800440 header.instance = instance_id;
441 header.msg_type = PLDM_REQUEST;
442 header.command = PLDM_SET_TID;
443
444 uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
445 if (rc != PLDM_SUCCESS) {
446 return rc;
447 }
448
449 struct pldm_set_tid_req *request =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930450 (struct pldm_set_tid_req *)msg->payload;
Gilbert Chen6c9c9172022-10-18 17:07:29 +0800451 request->tid = tid;
452
453 return PLDM_SUCCESS;
454}
455
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930456LIBPLDM_ABI_STABLE
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930457int decode_multipart_receive_req(const struct pldm_msg *msg,
458 size_t payload_length, uint8_t *pldm_type,
459 uint8_t *transfer_opflag,
460 uint32_t *transfer_ctx,
461 uint32_t *transfer_handle,
462 uint32_t *section_offset,
463 uint32_t *section_length)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930464{
465 if (msg == NULL || pldm_type == NULL || transfer_opflag == NULL ||
466 transfer_ctx == NULL || transfer_handle == NULL ||
467 section_offset == NULL || section_length == NULL) {
468 return PLDM_ERROR_INVALID_DATA;
469 }
470
471 if (payload_length != PLDM_MULTIPART_RECEIVE_REQ_BYTES) {
472 return PLDM_ERROR_INVALID_LENGTH;
473 }
474
475 struct pldm_multipart_receive_req *request =
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930476 (struct pldm_multipart_receive_req *)msg->payload;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930477
478 if (request->pldm_type != PLDM_BASE) {
479 return PLDM_ERROR_INVALID_PLDM_TYPE;
480 }
481
482 // Any enum value above PLDM_XFER_CURRENT_PART is invalid.
483 if (request->transfer_opflag > PLDM_XFER_CURRENT_PART) {
484 return PLDM_INVALID_TRANSFER_OPERATION_FLAG;
485 }
486
487 // A section offset of 0 is only valid on FIRST_PART or COMPLETE Xfers.
488 uint32_t sec_offset = le32toh(request->section_offset);
489 if (sec_offset == 0 &&
490 (request->transfer_opflag != PLDM_XFER_FIRST_PART &&
491 request->transfer_opflag != PLDM_XFER_COMPLETE)) {
492 return PLDM_ERROR_INVALID_DATA;
493 }
494
495 uint32_t handle = le32toh(request->transfer_handle);
496 if (handle == 0 && request->transfer_opflag != PLDM_XFER_COMPLETE) {
497 return PLDM_ERROR_INVALID_DATA;
498 }
499
500 *pldm_type = request->pldm_type;
501 *transfer_opflag = request->transfer_opflag;
502 *transfer_ctx = request->transfer_ctx;
503 *transfer_handle = handle;
504 *section_offset = sec_offset;
505 *section_length = le32toh(request->section_length);
506
507 return PLDM_SUCCESS;
508}
509
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930510LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930511int encode_cc_only_resp(uint8_t instance_id, uint8_t type, uint8_t command,
512 uint8_t cc, struct pldm_msg *msg)
513{
514 if (msg == NULL) {
515 return PLDM_ERROR_INVALID_DATA;
516 }
517
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930518 struct pldm_header_info header = { 0 };
Andrew Jeffery9c766792022-08-10 23:12:49 +0930519 header.instance = instance_id;
520 header.msg_type = PLDM_RESPONSE;
521 header.pldm_type = type;
522 header.command = command;
523
524 uint8_t rc = pack_pldm_header(&header, &msg->hdr);
525 if (rc != PLDM_SUCCESS) {
526 return rc;
527 }
528
529 msg->payload[0] = cc;
530
531 return PLDM_SUCCESS;
532}
533
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +0930534LIBPLDM_ABI_STABLE
Andrew Jeffery9c766792022-08-10 23:12:49 +0930535int encode_pldm_header_only(uint8_t msg_type, uint8_t instance_id,
536 uint8_t pldm_type, uint8_t command,
537 struct pldm_msg *msg)
538{
539 if (msg == NULL) {
540 return PLDM_ERROR_INVALID_DATA;
541 }
542
Andrew Jeffery37dd6a32023-05-12 16:04:06 +0930543 struct pldm_header_info header = { 0 };
Andrew Jeffery9c766792022-08-10 23:12:49 +0930544 header.msg_type = msg_type;
545 header.instance = instance_id;
546 header.pldm_type = pldm_type;
547 header.command = command;
548 return pack_pldm_header(&header, &(msg->hdr));
549}