| #include "firmware_update.h" | |
| #include <endian.h> | |
| int encode_query_device_identifiers_req(uint8_t instance_id, | |
| size_t payload_length, | |
| struct pldm_msg *msg) | |
| { | |
| if (msg == NULL) { | |
| return PLDM_ERROR_INVALID_DATA; | |
| } | |
| if (payload_length != PLDM_QUERY_DEVICE_IDENTIFIERS_REQ_BYTES) { | |
| return PLDM_ERROR_INVALID_LENGTH; | |
| } | |
| return encode_pldm_header_only(PLDM_REQUEST, instance_id, PLDM_FWUP, | |
| PLDM_QUERY_DEVICE_IDENTIFIERS, msg); | |
| } | |
| int decode_query_device_identifiers_resp(const struct pldm_msg *msg, | |
| size_t payload_length, | |
| uint8_t *completion_code, | |
| uint32_t *device_identifiers_len, | |
| uint8_t *descriptor_count, | |
| uint8_t **descriptor_data) | |
| { | |
| if (msg == NULL || completion_code == NULL || | |
| device_identifiers_len == NULL || descriptor_count == NULL || | |
| descriptor_data == 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_query_device_identifiers_resp)) { | |
| return PLDM_ERROR_INVALID_LENGTH; | |
| } | |
| struct pldm_query_device_identifiers_resp *response = | |
| (struct pldm_query_device_identifiers_resp *)msg->payload; | |
| *device_identifiers_len = le32toh(response->device_identifiers_len); | |
| if (*device_identifiers_len < PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN) { | |
| return PLDM_ERROR_INVALID_LENGTH; | |
| } | |
| if (payload_length != | |
| sizeof(struct pldm_query_device_identifiers_resp) + | |
| *device_identifiers_len) { | |
| return PLDM_ERROR_INVALID_LENGTH; | |
| } | |
| *descriptor_count = response->descriptor_count; | |
| if (*descriptor_count == 0) { | |
| return PLDM_ERROR_INVALID_DATA; | |
| } | |
| *descriptor_data = | |
| (uint8_t *)(msg->payload + | |
| sizeof(struct pldm_query_device_identifiers_resp)); | |
| return PLDM_SUCCESS; | |
| } |