platform: pldm_msgbuf for decode_get_sensor_reading_resp()

Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Change-Id: Ib059858cdec0e02acccffe93c50629d610aa5ada
diff --git a/src/msgbuf/platform.h b/src/msgbuf/platform.h
index 69403db..bc296b8 100644
--- a/src/msgbuf/platform.h
+++ b/src/msgbuf/platform.h
@@ -48,6 +48,33 @@
 	return -PLDM_ERROR_INVALID_DATA;
 }
 
+/*
+ * This API is bad, but it's because the caller's APIs are also bad. They should
+ * have used the approach used by callers of pldm_msgbuf_extract_sensor_data()
+ * above
+ */
+__attribute__((always_inline)) static inline int
+pldm_msgbuf_extract_sensor_value(struct pldm_msgbuf *ctx,
+				 enum pldm_effecter_data_size tag, uint8_t *val)
+{
+	switch (tag) {
+	case PLDM_SENSOR_DATA_SIZE_UINT8:
+		return pldm_msgbuf_extract_uint8(ctx, (uint8_t *)val);
+	case PLDM_SENSOR_DATA_SIZE_SINT8:
+		return pldm_msgbuf_extract_int8(ctx, (int8_t *)val);
+	case PLDM_SENSOR_DATA_SIZE_UINT16:
+		return pldm_msgbuf_extract_uint16(ctx, (uint16_t *)val);
+	case PLDM_SENSOR_DATA_SIZE_SINT16:
+		return pldm_msgbuf_extract_int16(ctx, (int16_t *)val);
+	case PLDM_SENSOR_DATA_SIZE_UINT32:
+		return pldm_msgbuf_extract_uint32(ctx, (uint32_t *)val);
+	case PLDM_SENSOR_DATA_SIZE_SINT32:
+		return pldm_msgbuf_extract_int32(ctx, (int32_t *)val);
+	}
+
+	return -PLDM_ERROR_INVALID_DATA;
+}
+
 __attribute__((always_inline)) static inline int
 pldm_msgbuf_extract_range_field_format(struct pldm_msgbuf *ctx,
 				       enum pldm_range_field_format tag,
diff --git a/src/platform.c b/src/platform.c
index e4110cf..58e516f 100644
--- a/src/platform.c
+++ b/src/platform.c
@@ -1790,6 +1790,10 @@
     uint8_t *sensor_event_message_enable, uint8_t *present_state,
     uint8_t *previous_state, uint8_t *event_state, uint8_t *present_reading)
 {
+	struct pldm_msgbuf _buf;
+	struct pldm_msgbuf *buf = &_buf;
+	int rc;
+
 	if (msg == NULL || completion_code == NULL ||
 	    sensor_data_size == NULL || sensor_operational_state == NULL ||
 	    sensor_event_message_enable == NULL || present_state == NULL ||
@@ -1798,58 +1802,40 @@
 		return PLDM_ERROR_INVALID_DATA;
 	}
 
-	*completion_code = msg->payload[0];
+	rc = pldm_msgbuf_init(buf, PLDM_GET_SENSOR_READING_MIN_RESP_BYTES,
+			      msg->payload, payload_length);
+	if (rc) {
+		return rc;
+	}
+
+	rc = pldm_msgbuf_extract(buf, completion_code);
+	if (rc) {
+		return rc;
+	}
+
 	if (PLDM_SUCCESS != *completion_code) {
 		return PLDM_SUCCESS;
 	}
 
-	if (payload_length < PLDM_GET_SENSOR_READING_MIN_RESP_BYTES) {
-		return PLDM_ERROR_INVALID_LENGTH;
+	rc = pldm_msgbuf_extract(buf, sensor_data_size);
+	if (rc) {
+		return rc;
 	}
 
-	struct pldm_get_sensor_reading_resp *response =
-	    (struct pldm_get_sensor_reading_resp *)msg->payload;
-
-	if (response->sensor_data_size > PLDM_SENSOR_DATA_SIZE_SINT32) {
+	if (*sensor_data_size > PLDM_SENSOR_DATA_SIZE_SINT32) {
 		return PLDM_ERROR_INVALID_DATA;
 	}
 
-	*sensor_data_size = response->sensor_data_size;
-	*sensor_operational_state = response->sensor_operational_state;
-	*sensor_event_message_enable = response->sensor_event_message_enable;
-	*present_state = response->present_state;
-	*previous_state = response->previous_state;
-	*event_state = response->event_state;
+	pldm_msgbuf_extract(buf, sensor_operational_state);
+	pldm_msgbuf_extract(buf, sensor_event_message_enable);
+	pldm_msgbuf_extract(buf, present_state);
+	pldm_msgbuf_extract(buf, previous_state);
+	pldm_msgbuf_extract(buf, event_state);
 
-	if (*sensor_data_size == PLDM_EFFECTER_DATA_SIZE_UINT8 ||
-	    *sensor_data_size == PLDM_EFFECTER_DATA_SIZE_SINT8) {
-		if (payload_length != PLDM_GET_SENSOR_READING_MIN_RESP_BYTES) {
-			return PLDM_ERROR_INVALID_LENGTH;
-		}
-		*present_reading = response->present_reading[0];
+	pldm_msgbuf_extract_sensor_value(buf, *sensor_data_size,
+					 present_reading);
 
-	} else if (*sensor_data_size == PLDM_EFFECTER_DATA_SIZE_UINT16 ||
-		   *sensor_data_size == PLDM_EFFECTER_DATA_SIZE_SINT16) {
-		if (payload_length !=
-		    PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 1) {
-			return PLDM_ERROR_INVALID_LENGTH;
-		}
-		memcpy(present_reading, response->present_reading, 2);
-		uint16_t *val = (uint16_t *)(present_reading);
-		*val = le16toh(*val);
-
-	} else if (*sensor_data_size == PLDM_EFFECTER_DATA_SIZE_UINT32 ||
-		   *sensor_data_size == PLDM_EFFECTER_DATA_SIZE_SINT32) {
-		if (payload_length !=
-		    PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3) {
-			return PLDM_ERROR_INVALID_LENGTH;
-		}
-		memcpy(present_reading, response->present_reading, 4);
-		uint32_t *val = (uint32_t *)(present_reading);
-		*val = le32toh(*val);
-	}
-
-	return PLDM_SUCCESS;
+	return pldm_msgbuf_destroy_consumed(buf);
 }
 
 int encode_get_sensor_reading_resp(