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