Tom Joseph | ff4642c | 2019-04-10 13:41:32 +0530 | [diff] [blame] | 1 | #include <endian.h> |
| 2 | #include <string.h> |
| 3 | |
| 4 | #include "base.h" |
| 5 | |
| 6 | int pack_pldm_header(const struct pldm_header_info *hdr, |
| 7 | struct pldm_msg_hdr *msg) |
| 8 | { |
| 9 | if (msg == NULL || hdr == NULL) { |
| 10 | return PLDM_ERROR_INVALID_DATA; |
| 11 | } |
| 12 | |
| 13 | if (hdr->msg_type != PLDM_RESPONSE && hdr->msg_type != PLDM_REQUEST && |
| 14 | hdr->msg_type != PLDM_ASYNC_REQUEST_NOTIFY) { |
| 15 | return PLDM_ERROR_INVALID_DATA; |
| 16 | } |
| 17 | |
| 18 | if (hdr->instance > PLDM_INSTANCE_MAX) { |
| 19 | return PLDM_ERROR_INVALID_DATA; |
| 20 | } |
| 21 | |
| 22 | if (hdr->pldm_type > (PLDM_MAX_TYPES - 1)) { |
| 23 | return PLDM_ERROR_INVALID_PLDM_TYPE; |
| 24 | } |
| 25 | |
| 26 | uint8_t datagram = (hdr->msg_type == PLDM_ASYNC_REQUEST_NOTIFY) ? 1 : 0; |
| 27 | |
| 28 | if (hdr->msg_type == PLDM_RESPONSE) { |
| 29 | msg->request = PLDM_RESPONSE; |
| 30 | } else if (hdr->msg_type == PLDM_REQUEST || |
| 31 | hdr->msg_type == PLDM_ASYNC_REQUEST_NOTIFY) { |
| 32 | msg->request = PLDM_REQUEST; |
| 33 | } |
| 34 | msg->datagram = datagram; |
| 35 | msg->reserved = 0; |
| 36 | msg->instance_id = hdr->instance; |
| 37 | msg->header_ver = 0; |
| 38 | msg->type = hdr->pldm_type; |
| 39 | msg->command = hdr->command; |
| 40 | |
| 41 | return PLDM_SUCCESS; |
| 42 | } |
| 43 | |
| 44 | int unpack_pldm_header(const struct pldm_msg_hdr *msg, |
| 45 | struct pldm_header_info *hdr) |
| 46 | { |
| 47 | if (msg == NULL) { |
| 48 | return PLDM_ERROR_INVALID_DATA; |
| 49 | } |
| 50 | |
| 51 | if (msg->request == PLDM_RESPONSE) { |
| 52 | hdr->msg_type = PLDM_RESPONSE; |
| 53 | } else { |
| 54 | hdr->msg_type = |
| 55 | msg->datagram ? PLDM_ASYNC_REQUEST_NOTIFY : PLDM_REQUEST; |
| 56 | } |
| 57 | |
| 58 | hdr->instance = msg->instance_id; |
| 59 | hdr->pldm_type = msg->type; |
| 60 | hdr->command = msg->command; |
| 61 | |
| 62 | return PLDM_SUCCESS; |
| 63 | } |