#include "bios.h"
#include "base.h"
#include "utils.h"
#include <endian.h>
#include <string.h>

LIBPLDM_ABI_STABLE
int encode_get_date_time_req(uint8_t instance_id, struct pldm_msg *msg)
{
	if (msg == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	struct pldm_header_info header = { 0 };
	header.msg_type = PLDM_REQUEST;
	header.instance = instance_id;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_GET_DATE_TIME;
	return pack_pldm_header(&header, &(msg->hdr));
}

LIBPLDM_ABI_STABLE
int encode_get_date_time_resp(uint8_t instance_id, uint8_t completion_code,
			      uint8_t seconds, uint8_t minutes, uint8_t hours,
			      uint8_t day, uint8_t month, uint16_t year,
			      struct pldm_msg *msg)
{
	if (msg == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	struct pldm_header_info header = { 0 };
	header.msg_type = PLDM_RESPONSE;
	header.instance = instance_id;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_GET_DATE_TIME;

	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
	if (rc != PLDM_SUCCESS) {
		return rc;
	}

	struct pldm_get_date_time_resp *response =
		(struct pldm_get_date_time_resp *)msg->payload;
	response->completion_code = completion_code;
	if (response->completion_code == PLDM_SUCCESS) {
		response->completion_code = completion_code;
		response->seconds = seconds;
		response->minutes = minutes;
		response->hours = hours;
		response->day = day;
		response->month = month;
		response->year = htole16(year);
	}
	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int decode_get_date_time_resp(const struct pldm_msg *msg, size_t payload_length,
			      uint8_t *completion_code, uint8_t *seconds,
			      uint8_t *minutes, uint8_t *hours, uint8_t *day,
			      uint8_t *month, uint16_t *year)
{
	if (msg == NULL || seconds == NULL || minutes == NULL ||
	    hours == NULL || day == NULL || month == NULL || year == NULL ||
	    completion_code == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	*completion_code = msg->payload[0];
	if (PLDM_SUCCESS != *completion_code) {
		return PLDM_SUCCESS;
	}

	if (payload_length != PLDM_GET_DATE_TIME_RESP_BYTES) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	struct pldm_get_date_time_resp *response =
		(struct pldm_get_date_time_resp *)msg->payload;

	*seconds = response->seconds;
	*minutes = response->minutes;
	*hours = response->hours;
	*day = response->day;
	*month = response->month;
	*year = le16toh(response->year);

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int encode_set_date_time_req(uint8_t instance_id, uint8_t seconds,
			     uint8_t minutes, uint8_t hours, uint8_t day,
			     uint8_t month, uint16_t year, struct pldm_msg *msg,
			     size_t payload_length)
{
	if (msg == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}
	if (payload_length != sizeof(struct pldm_set_date_time_req)) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	if (!is_time_legal(seconds, minutes, hours, day, month, year)) {
		return PLDM_ERROR_INVALID_DATA;
	}

	struct pldm_header_info header = { 0 };
	header.instance = instance_id;
	header.msg_type = PLDM_REQUEST;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_SET_DATE_TIME;

	uint8_t rc = pack_pldm_header(&header, &msg->hdr);
	if (rc != PLDM_SUCCESS) {
		return rc;
	}

	struct pldm_set_date_time_req *request =
		(struct pldm_set_date_time_req *)msg->payload;
	request->seconds = dec2bcd8(seconds);
	request->minutes = dec2bcd8(minutes);
	request->hours = dec2bcd8(hours);
	request->day = dec2bcd8(day);
	request->month = dec2bcd8(month);
	request->year = htole16(dec2bcd16(year));

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int decode_set_date_time_req(const struct pldm_msg *msg, size_t payload_length,
			     uint8_t *seconds, uint8_t *minutes, uint8_t *hours,
			     uint8_t *day, uint8_t *month, uint16_t *year)
{
	if (msg == NULL || seconds == NULL || minutes == NULL ||
	    hours == NULL || day == NULL || month == NULL || year == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}
	if (payload_length != sizeof(struct pldm_set_date_time_req)) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	const struct pldm_set_date_time_req *request =
		(struct pldm_set_date_time_req *)msg->payload;

	*seconds = bcd2dec8(request->seconds);
	*minutes = bcd2dec8(request->minutes);
	*hours = bcd2dec8(request->hours);
	*day = bcd2dec8(request->day);
	*month = bcd2dec8(request->month);
	*year = bcd2dec16(le16toh(request->year));

	if (!is_time_legal(*seconds, *minutes, *hours, *day, *month, *year)) {
		return PLDM_ERROR_INVALID_DATA;
	}

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int encode_set_date_time_resp(uint8_t instance_id, uint8_t completion_code,
			      struct pldm_msg *msg, size_t payload_length)
{
	if (msg == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}
	if (payload_length != sizeof(struct pldm_only_cc_resp)) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	struct pldm_header_info header = { 0 };
	header.instance = instance_id;
	header.msg_type = PLDM_RESPONSE;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_SET_DATE_TIME;

	uint8_t rc = pack_pldm_header(&header, &msg->hdr);
	if (rc != PLDM_SUCCESS) {
		return rc;
	}

	struct pldm_only_cc_resp *response =
		(struct pldm_only_cc_resp *)msg->payload;
	response->completion_code = completion_code;

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int decode_set_date_time_resp(const struct pldm_msg *msg, size_t payload_length,
			      uint8_t *completion_code)
{
	if (msg == NULL || completion_code == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	*completion_code = msg->payload[0];
	if (PLDM_SUCCESS != *completion_code) {
		return PLDM_SUCCESS;
	}

	if (payload_length != sizeof(struct pldm_only_cc_resp)) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int encode_get_bios_table_resp(uint8_t instance_id, uint8_t completion_code,
			       uint32_t next_transfer_handle,
			       uint8_t transfer_flag, uint8_t *table_data,
			       size_t payload_length, struct pldm_msg *msg)
{
	if (msg == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	struct pldm_header_info header = { 0 };
	header.msg_type = PLDM_RESPONSE;
	header.instance = instance_id;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_GET_BIOS_TABLE;

	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
	if (rc != PLDM_SUCCESS) {
		return rc;
	}

	struct pldm_get_bios_table_resp *response =
		(struct pldm_get_bios_table_resp *)msg->payload;
	response->completion_code = completion_code;
	if (response->completion_code == PLDM_SUCCESS) {
		response->next_transfer_handle = htole32(next_transfer_handle);
		response->transfer_flag = transfer_flag;
		if (table_data != NULL &&
		    payload_length > (sizeof(struct pldm_msg_hdr) +
				      PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES)) {
			memcpy(response->table_data, table_data,
			       payload_length -
				       (sizeof(struct pldm_msg_hdr) +
					PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES));
		}
	}
	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int encode_get_bios_table_req(uint8_t instance_id, uint32_t transfer_handle,
			      uint8_t transfer_op_flag, uint8_t table_type,
			      struct pldm_msg *msg)
{
	if (msg == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	struct pldm_header_info header = { 0 };
	header.msg_type = PLDM_REQUEST;
	header.instance = instance_id;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_GET_BIOS_TABLE;

	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
	if (rc != PLDM_SUCCESS) {
		return rc;
	}

	struct pldm_get_bios_table_req *request =
		(struct pldm_get_bios_table_req *)msg->payload;

	request->transfer_handle = htole32(transfer_handle);
	request->transfer_op_flag = transfer_op_flag;
	request->table_type = table_type;
	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int decode_get_bios_table_req(const struct pldm_msg *msg, size_t payload_length,
			      uint32_t *transfer_handle,
			      uint8_t *transfer_op_flag, uint8_t *table_type)
{
	if (msg == NULL || transfer_op_flag == NULL || table_type == NULL ||
	    transfer_handle == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	if (payload_length != PLDM_GET_BIOS_TABLE_REQ_BYTES) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	struct pldm_get_bios_table_req *request =
		(struct pldm_get_bios_table_req *)msg->payload;
	*transfer_handle = le32toh(request->transfer_handle);
	*transfer_op_flag = request->transfer_op_flag;
	*table_type = request->table_type;

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int decode_get_bios_table_resp(const struct pldm_msg *msg,
			       size_t payload_length, uint8_t *completion_code,
			       uint32_t *next_transfer_handle,
			       uint8_t *transfer_flag,
			       size_t *bios_table_offset)

{
	if (msg == NULL || transfer_flag == NULL ||
	    next_transfer_handle == NULL || completion_code == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}
	if (payload_length <= PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	struct pldm_get_bios_table_resp *response =
		(struct pldm_get_bios_table_resp *)msg->payload;

	*completion_code = response->completion_code;

	if (PLDM_SUCCESS != *completion_code) {
		return PLDM_SUCCESS;
	}

	*next_transfer_handle = le32toh(response->next_transfer_handle);
	*transfer_flag = response->transfer_flag;

	*bios_table_offset = sizeof(*completion_code) +
			     sizeof(*next_transfer_handle) +
			     sizeof(*transfer_flag);

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int encode_get_bios_attribute_current_value_by_handle_req(
	uint8_t instance_id, uint32_t transfer_handle, uint8_t transfer_op_flag,
	uint16_t attribute_handle, struct pldm_msg *msg)
{
	if (msg == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	struct pldm_header_info header = { 0 };
	header.msg_type = PLDM_REQUEST;
	header.instance = instance_id;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_GET_BIOS_ATTRIBUTE_CURRENT_VALUE_BY_HANDLE;

	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
	if (rc != PLDM_SUCCESS) {
		return rc;
	}

	struct pldm_get_bios_attribute_current_value_by_handle_req *request =
		(struct pldm_get_bios_attribute_current_value_by_handle_req *)
			msg->payload;

	request->transfer_handle = htole32(transfer_handle);
	request->transfer_op_flag = transfer_op_flag;
	request->attribute_handle = htole16(attribute_handle);
	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int decode_get_bios_attribute_current_value_by_handle_resp(
	const struct pldm_msg *msg, size_t payload_length,
	uint8_t *completion_code, uint32_t *next_transfer_handle,
	uint8_t *transfer_flag, struct variable_field *attribute_data)
{
	if (msg == NULL || transfer_flag == NULL ||
	    next_transfer_handle == NULL || completion_code == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	struct pldm_get_bios_attribute_current_value_by_handle_resp *response =
		(struct pldm_get_bios_attribute_current_value_by_handle_resp *)
			msg->payload;

	*completion_code = response->completion_code;

	if (PLDM_SUCCESS != *completion_code) {
		return PLDM_SUCCESS;
	}

	if (payload_length <=
	    PLDM_GET_BIOS_ATTR_CURR_VAL_BY_HANDLE_MIN_RESP_BYTES) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	*next_transfer_handle = le32toh(response->next_transfer_handle);
	*transfer_flag = response->transfer_flag;

	attribute_data->ptr = response->attribute_data;
	attribute_data->length = payload_length - sizeof(*response) + 1;

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int decode_get_bios_attribute_current_value_by_handle_req(
	const struct pldm_msg *msg, size_t payload_length,
	uint32_t *transfer_handle, uint8_t *transfer_op_flag,
	uint16_t *attribute_handle)
{
	if (msg == NULL || transfer_handle == NULL ||
	    transfer_op_flag == NULL || attribute_handle == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	if (payload_length != PLDM_GET_BIOS_ATTR_CURR_VAL_BY_HANDLE_REQ_BYTES) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	struct pldm_get_bios_attribute_current_value_by_handle_req *request =
		(struct pldm_get_bios_attribute_current_value_by_handle_req *)
			msg->payload;
	*transfer_handle = le32toh(request->transfer_handle);
	*transfer_op_flag = request->transfer_op_flag;
	*attribute_handle = le16toh(request->attribute_handle);

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int encode_get_bios_current_value_by_handle_resp(uint8_t instance_id,
						 uint8_t completion_code,
						 uint32_t next_transfer_handle,
						 uint8_t transfer_flag,
						 const uint8_t *attribute_data,
						 size_t attribute_length,
						 struct pldm_msg *msg)
{
	if (msg == NULL || attribute_data == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	struct pldm_header_info header = { 0 };
	header.msg_type = PLDM_RESPONSE;
	header.instance = instance_id;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_GET_BIOS_ATTRIBUTE_CURRENT_VALUE_BY_HANDLE;

	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
	if (rc != PLDM_SUCCESS) {
		return rc;
	}

	struct pldm_get_bios_attribute_current_value_by_handle_resp *response =
		(struct pldm_get_bios_attribute_current_value_by_handle_resp *)
			msg->payload;
	response->completion_code = completion_code;
	if (response->completion_code == PLDM_SUCCESS) {
		response->next_transfer_handle = htole32(next_transfer_handle);
		response->transfer_flag = transfer_flag;
		if (attribute_data != NULL) {
			memcpy(response->attribute_data, attribute_data,
			       attribute_length);
		}
	}
	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int encode_set_bios_attribute_current_value_req(
	uint8_t instance_id, uint32_t transfer_handle, uint8_t transfer_flag,
	const uint8_t *attribute_data, size_t attribute_length,
	struct pldm_msg *msg, size_t payload_length)
{
	if (msg == NULL || attribute_data == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}
	if (PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES + attribute_length !=
	    payload_length) {
		return PLDM_ERROR_INVALID_LENGTH;
	}
	struct pldm_header_info header = { 0 };
	header.instance = instance_id;
	header.msg_type = PLDM_REQUEST;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_SET_BIOS_ATTRIBUTE_CURRENT_VALUE;

	uint8_t rc = pack_pldm_header(&header, &msg->hdr);
	if (rc != PLDM_SUCCESS) {
		return rc;
	}

	struct pldm_set_bios_attribute_current_value_req *request =
		(struct pldm_set_bios_attribute_current_value_req *)msg->payload;
	request->transfer_handle = htole32(transfer_handle);
	request->transfer_flag = transfer_flag;
	memcpy(request->attribute_data, attribute_data, attribute_length);

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int decode_set_bios_attribute_current_value_resp(const struct pldm_msg *msg,
						 size_t payload_length,
						 uint8_t *completion_code,
						 uint32_t *next_transfer_handle)
{
	if (msg == NULL || completion_code == NULL ||
	    next_transfer_handle == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	*completion_code = msg->payload[0];
	if (PLDM_SUCCESS != *completion_code) {
		return PLDM_SUCCESS;
	}

	if (payload_length != PLDM_SET_BIOS_ATTR_CURR_VAL_RESP_BYTES) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	struct pldm_set_bios_attribute_current_value_resp *response =
		(struct pldm_set_bios_attribute_current_value_resp *)
			msg->payload;

	*next_transfer_handle = le32toh(response->next_transfer_handle);

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int decode_set_bios_attribute_current_value_req(
	const struct pldm_msg *msg, size_t payload_length,
	uint32_t *transfer_handle, uint8_t *transfer_flag,
	struct variable_field *attribute)
{
	if (msg == NULL || transfer_handle == NULL || transfer_flag == NULL ||
	    attribute == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}
	if (payload_length < PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	struct pldm_set_bios_attribute_current_value_req *request =
		(struct pldm_set_bios_attribute_current_value_req *)msg->payload;
	*transfer_handle = le32toh(request->transfer_handle);
	*transfer_flag = request->transfer_flag;
	attribute->length =
		payload_length - PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES;
	attribute->ptr = request->attribute_data;
	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int encode_set_bios_attribute_current_value_resp(uint8_t instance_id,
						 uint8_t completion_code,
						 uint32_t next_transfer_handle,
						 struct pldm_msg *msg)
{
	if (msg == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}
	struct pldm_header_info header = { 0 };
	header.instance = instance_id;
	header.msg_type = PLDM_RESPONSE;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_SET_BIOS_ATTRIBUTE_CURRENT_VALUE;

	uint8_t rc = pack_pldm_header(&header, &msg->hdr);
	if (rc != PLDM_SUCCESS) {
		return rc;
	}

	struct pldm_set_bios_attribute_current_value_resp *response =
		(struct pldm_set_bios_attribute_current_value_resp *)
			msg->payload;
	response->completion_code = completion_code;
	response->next_transfer_handle = htole32(next_transfer_handle);

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int encode_set_bios_table_req(uint8_t instance_id, uint32_t transfer_handle,
			      uint8_t transfer_flag, uint8_t table_type,
			      const uint8_t *table_data, size_t table_length,
			      struct pldm_msg *msg, size_t payload_length)
{
	if (msg == NULL || table_data == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	if (PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES + table_length !=
	    payload_length) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	struct pldm_header_info header = { 0 };
	header.instance = instance_id;
	header.msg_type = PLDM_REQUEST;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_SET_BIOS_TABLE;

	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
	if (rc != PLDM_SUCCESS) {
		return rc;
	}

	struct pldm_set_bios_table_req *request =
		(struct pldm_set_bios_table_req *)msg->payload;
	request->transfer_handle = htole32(transfer_handle);
	request->transfer_flag = transfer_flag;
	request->table_type = table_type;
	memcpy(request->table_data, table_data, table_length);

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int decode_set_bios_table_resp(const struct pldm_msg *msg,
			       size_t payload_length, uint8_t *completion_code,
			       uint32_t *next_transfer_handle)
{
	if (msg == NULL || completion_code == NULL ||
	    next_transfer_handle == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	*completion_code = msg->payload[0];
	if (PLDM_SUCCESS != *completion_code) {
		return PLDM_SUCCESS;
	}

	if (payload_length != PLDM_SET_BIOS_TABLE_RESP_BYTES) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	struct pldm_set_bios_table_resp *response =
		(struct pldm_set_bios_table_resp *)msg->payload;

	*next_transfer_handle = le32toh(response->next_transfer_handle);

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int encode_set_bios_table_resp(uint8_t instance_id, uint8_t completion_code,
			       uint32_t next_transfer_handle,
			       struct pldm_msg *msg)
{
	if (msg == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	struct pldm_header_info header = { 0 };
	header.instance = instance_id;
	header.msg_type = PLDM_RESPONSE;
	header.pldm_type = PLDM_BIOS;
	header.command = PLDM_SET_BIOS_TABLE;

	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
	if (rc != PLDM_SUCCESS) {
		return rc;
	}

	struct pldm_set_bios_table_resp *response =
		(struct pldm_set_bios_table_resp *)msg->payload;
	response->completion_code = completion_code;
	response->next_transfer_handle = htole32(next_transfer_handle);

	return PLDM_SUCCESS;
}

LIBPLDM_ABI_STABLE
int decode_set_bios_table_req(const struct pldm_msg *msg, size_t payload_length,
			      uint32_t *transfer_handle, uint8_t *transfer_flag,
			      uint8_t *table_type, struct variable_field *table)
{
	if (msg == NULL || transfer_handle == NULL || transfer_flag == NULL ||
	    table_type == NULL || table == NULL) {
		return PLDM_ERROR_INVALID_DATA;
	}

	if (payload_length < PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES) {
		return PLDM_ERROR_INVALID_LENGTH;
	}

	struct pldm_set_bios_table_req *request =
		(struct pldm_set_bios_table_req *)msg->payload;
	*transfer_handle = le32toh(request->transfer_handle);
	*transfer_flag = request->transfer_flag;
	*table_type = request->table_type;
	table->length = payload_length - PLDM_SET_BIOS_TABLE_MIN_REQ_BYTES;
	table->ptr = request->table_data;

	return PLDM_SUCCESS;
}
