blob: d9c2a21c743e1f5aac7ea656834565941feaf8bc [file] [log] [blame]
/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
#include "dsp/base.h"
#include "msgbuf.h"
#include <libpldm/base.h>
#include <libpldm/file.h>
#include <libpldm/utils.h>
#include <assert.h>
#include <errno.h>
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
LIBPLDM_ABI_TESTING
int 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)
{
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
if (req == NULL || msg == NULL) {
return -EINVAL;
}
struct pldm_header_info header = { 0 };
header.instance = instance_id;
header.msg_type = PLDM_REQUEST;
header.pldm_type = PLDM_FILE;
header.command = PLDM_FILE_CMD_DF_OPEN;
rc = pack_pldm_header_errno(&header, &(msg->hdr));
if (rc) {
return rc;
}
rc = pldm_msgbuf_init_errno(buf, PLDM_DF_OPEN_REQ_BYTES, msg->payload,
payload_length);
if (rc) {
return rc;
}
pldm_msgbuf_insert(buf, req->file_identifier);
pldm_msgbuf_insert(buf, req->file_attribute.value);
return pldm_msgbuf_complete(buf);
}
LIBPLDM_ABI_TESTING
int decode_pldm_file_df_open_resp(const struct pldm_msg *msg,
size_t payload_length,
struct pldm_file_df_open_resp *resp)
{
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
if (!msg || !resp) {
return -EINVAL;
}
rc = pldm_msg_has_error(msg, payload_length);
if (rc) {
resp->completion_code = rc;
return 0;
}
rc = pldm_msgbuf_init_errno(buf, PLDM_DF_OPEN_RESP_BYTES, msg->payload,
payload_length);
if (rc) {
return rc;
}
pldm_msgbuf_extract(buf, resp->completion_code);
pldm_msgbuf_extract(buf, resp->file_descriptor);
return pldm_msgbuf_complete_consumed(buf);
}