msgbuf: Define a separate msgbuf structure for encode/decode function
Define separate msgbuf structures to avoid casting away const-qualifiers
in the msgbuf constructor function:
* pldm_msgbuf_rw: for encode functions with non const-qualified buffer
* pldm_msgbuf_ro: for decode functions with const-qualified buffer
Further, use _Generic() to keep the API ergonomic while still yielding a
compile error when wrong msgbuf type is passed.
Change-Id: I71dbcb7996e9fb402b49870fce539a939c1497e5
Signed-off-by: John Chung <john.chung@arm.com>
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
diff --git a/src/msgbuf/platform.h b/src/msgbuf/platform.h
index 897c199..695ab1e 100644
--- a/src/msgbuf/platform.h
+++ b/src/msgbuf/platform.h
@@ -9,7 +9,7 @@
LIBPLDM_CC_NONNULL
LIBPLDM_CC_ALWAYS_INLINE int
-pldm_msgbuf_extract_value_pdr_hdr(struct pldm_msgbuf *ctx,
+pldm_msgbuf_extract_value_pdr_hdr(struct pldm_msgbuf_ro *ctx,
struct pldm_value_pdr_hdr *hdr, size_t lower,
size_t upper)
{
@@ -36,7 +36,7 @@
}
LIBPLDM_CC_ALWAYS_INLINE int
-pldm_msgbuf_extract_sensor_data(struct pldm_msgbuf *ctx,
+pldm_msgbuf_extract_sensor_data(struct pldm_msgbuf_ro *ctx,
enum pldm_sensor_readings_data_type tag,
union_sensor_data_size *dst)
{
@@ -64,7 +64,7 @@
* above
*/
LIBPLDM_CC_ALWAYS_INLINE int
-pldm_msgbuf_extract_sensor_value(struct pldm_msgbuf *ctx,
+pldm_msgbuf_extract_sensor_value(struct pldm_msgbuf_ro *ctx,
enum pldm_sensor_readings_data_type tag,
void *val)
{
@@ -91,7 +91,7 @@
pldm__msgbuf_extract_range_field_format, \
dst, ctx, tag, (void *)&(dst))
LIBPLDM_CC_ALWAYS_INLINE int pldm__msgbuf_extract_range_field_format(
- struct pldm_msgbuf *ctx, enum pldm_range_field_format tag, void *rff)
+ struct pldm_msgbuf_ro *ctx, enum pldm_range_field_format tag, void *rff)
{
switch (tag) {
case PLDM_RANGE_FIELD_FORMAT_UINT8:
@@ -129,7 +129,7 @@
/* This API is bad, but it's because the caller's APIs are also bad */
LIBPLDM_CC_ALWAYS_INLINE int
-pldm_msgbuf_extract_effecter_value(struct pldm_msgbuf *ctx,
+pldm_msgbuf_extract_effecter_value(struct pldm_msgbuf_ro *ctx,
enum pldm_effecter_data_size tag, void *dst)
{
switch (tag) {
@@ -155,7 +155,7 @@
pldm__msgbuf_extract_range_field_format, \
dst, ctx, tag, (void *)&(dst))
LIBPLDM_CC_ALWAYS_INLINE int
-pldm__msgbuf_extract_effecter_data(struct pldm_msgbuf *ctx,
+pldm__msgbuf_extract_effecter_data(struct pldm_msgbuf_ro *ctx,
enum pldm_effecter_data_size tag, void *ed)
{
switch (tag) {
@@ -192,8 +192,10 @@
#include <type_traits>
template <typename T>
-static inline int pldm_msgbuf_typecheck_range_field_format(
- struct pldm_msgbuf *ctx, enum pldm_range_field_format tag, void *_rff)
+static inline int
+pldm_msgbuf_typecheck_range_field_format(struct pldm_msgbuf_ro *ctx,
+ enum pldm_range_field_format tag,
+ void *_rff)
{
static_assert(std::is_same<union_range_field_format, T>::value);
return pldm__msgbuf_extract_range_field_format(ctx, tag, _rff);