libpldm: Explicit deprecated, stable and testing ABI classes

Experimenting with new APIs is important, but ABI stability of the
library is also important. We wish to have the freedom to add APIs
without being burdened by them being immediately set in stone.

We implement this wish by introducing three classes of ABI:

1. deprecated
2. stable
3. testing

These are enforced by corresponding function attributes:

1. LIBPLDM_ABI_DEPRECATED
2. LIBPLDM_ABI_STABLE
3. LIBPLDM_ABI_TESTING

Symbol visibility in the library is flipped to 'hidden' by default, so
one of these annotations must be used for the symbol to be exposed.

With these classes in place there are now clear points in time at which
we update the ABI dumps captured under the abi/ directory: When an API
is migrated from the 'testing' class to the 'stable' class, or when
removed from the 'deprecated' class.

Which classes of functions are exposed by the build is controlled by the
new 'abi' meson option. The option is of array type which contains the
list of ABI classes the build should consider. It defaults to enabling
all classes to provide test coverage in CI. The classes used should be
constrained to deprecated and stable (and not test) in any dependent
projects.

Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Change-Id: I25402e20c7be9c9f264f9ccd7ac36b384823734c
diff --git a/src/base.c b/src/base.c
index 90e9c1e..f0bbe82 100644
--- a/src/base.c
+++ b/src/base.c
@@ -1,9 +1,11 @@
+#include "config.h"
 #include "base.h"
 #include "pldm_types.h"
 #include <endian.h>
 #include <stdint.h>
 #include <string.h>
 
+LIBPLDM_ABI_STABLE
 uint8_t pack_pldm_header(const struct pldm_header_info *hdr,
 			 struct pldm_msg_hdr *msg)
 {
@@ -42,6 +44,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t unpack_pldm_header(const struct pldm_msg_hdr *msg,
 			   struct pldm_header_info *hdr)
 {
@@ -63,6 +66,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_types_req(uint8_t instance_id, struct pldm_msg *msg)
 {
 	if (msg == NULL) {
@@ -77,6 +81,7 @@
 	return pack_pldm_header(&header, &(msg->hdr));
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_commands_req(uint8_t instance_id, uint8_t type, ver32_t version,
 			    struct pldm_msg *msg)
 {
@@ -103,6 +108,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_types_resp(uint8_t instance_id, uint8_t completion_code,
 			  const bitfield8_t *types, struct pldm_msg *msg)
 {
@@ -133,6 +139,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_commands_req(const struct pldm_msg *msg, size_t payload_length,
 			    uint8_t *type, ver32_t *version)
 {
@@ -151,6 +158,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_commands_resp(uint8_t instance_id, uint8_t completion_code,
 			     const bitfield8_t *commands, struct pldm_msg *msg)
 {
@@ -181,6 +189,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_types_resp(const struct pldm_msg *msg, size_t payload_length,
 			  uint8_t *completion_code, bitfield8_t *types)
 {
@@ -205,6 +214,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_commands_resp(const struct pldm_msg *msg, size_t payload_length,
 			     uint8_t *completion_code, bitfield8_t *commands)
 {
@@ -230,6 +240,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_version_req(uint8_t instance_id, uint32_t transfer_handle,
 			   uint8_t transfer_opflag, uint8_t type,
 			   struct pldm_msg *msg)
@@ -259,6 +270,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_version_resp(uint8_t instance_id, uint8_t completion_code,
 			    uint32_t next_transfer_handle,
 			    uint8_t transfer_flag, const ver32_t *version_data,
@@ -291,6 +303,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_version_req(const struct pldm_msg *msg, size_t payload_length,
 			   uint32_t *transfer_handle, uint8_t *transfer_opflag,
 			   uint8_t *type)
@@ -307,6 +320,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_version_resp(const struct pldm_msg *msg, size_t payload_length,
 			    uint8_t *completion_code,
 			    uint32_t *next_transfer_handle,
@@ -336,6 +350,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_tid_req(uint8_t instance_id, struct pldm_msg *msg)
 {
 	if (msg == NULL) {
@@ -349,6 +364,8 @@
 
 	return pack_pldm_header(&header, &(msg->hdr));
 }
+
+LIBPLDM_ABI_STABLE
 int encode_get_tid_resp(uint8_t instance_id, uint8_t completion_code,
 			uint8_t tid, struct pldm_msg *msg)
 {
@@ -374,6 +391,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_tid_resp(const struct pldm_msg *msg, size_t payload_length,
 			uint8_t *completion_code, uint8_t *tid)
 {
@@ -398,6 +416,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_set_tid_req(uint8_t instance_id, uint8_t tid, struct pldm_msg *msg)
 {
 	if (msg == NULL) {
@@ -425,6 +444,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_multipart_receive_req(const struct pldm_msg *msg,
 				 size_t payload_length, uint8_t *pldm_type,
 				 uint8_t *transfer_opflag,
@@ -478,6 +498,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_cc_only_resp(uint8_t instance_id, uint8_t type, uint8_t command,
 			uint8_t cc, struct pldm_msg *msg)
 {
@@ -501,6 +522,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_pldm_header_only(uint8_t msg_type, uint8_t instance_id,
 			    uint8_t pldm_type, uint8_t command,
 			    struct pldm_msg *msg)
diff --git a/src/bios.c b/src/bios.c
index 70f4d28..d833293 100644
--- a/src/bios.c
+++ b/src/bios.c
@@ -1,9 +1,11 @@
+#include "config.h"
 #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) {
@@ -18,6 +20,7 @@
 	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,
@@ -53,6 +56,7 @@
 	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,
@@ -86,6 +90,7 @@
 	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,
@@ -125,6 +130,7 @@
 	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)
@@ -154,6 +160,7 @@
 	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)
 {
@@ -182,6 +189,7 @@
 	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)
 {
@@ -201,6 +209,7 @@
 	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,
@@ -239,6 +248,7 @@
 	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)
@@ -267,6 +277,7 @@
 	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)
@@ -289,6 +300,7 @@
 	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,
@@ -323,6 +335,7 @@
 	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)
@@ -352,6 +365,7 @@
 	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,
@@ -386,6 +400,7 @@
 	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,
@@ -410,6 +425,7 @@
 	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,
@@ -447,6 +463,8 @@
 	}
 	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,
@@ -479,6 +497,7 @@
 	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,
@@ -507,6 +526,7 @@
 	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,
@@ -530,6 +550,7 @@
 	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,
@@ -558,6 +579,7 @@
 	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,
@@ -593,6 +615,7 @@
 	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)
@@ -619,6 +642,7 @@
 	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)
@@ -646,6 +670,7 @@
 	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)
diff --git a/src/bios_table.c b/src/bios_table.c
index ceb26b1..945cdbe 100644
--- a/src/bios_table.c
+++ b/src/bios_table.c
@@ -1,3 +1,4 @@
+#include "config.h"
 #include "bios_table.h"
 #include "base.h"
 #include "bios.h"
@@ -44,12 +45,14 @@
 	return handle++;
 }
 
+LIBPLDM_ABI_STABLE
 size_t pldm_bios_table_string_entry_encode_length(uint16_t string_length)
 {
 	return sizeof(struct pldm_bios_string_table_entry) -
 	       MEMBER_SIZE(pldm_bios_string_table_entry, name) + string_length;
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_bios_table_string_entry_encode(void *entry, size_t entry_length,
 					 const char *str, uint16_t str_length)
 {
@@ -61,6 +64,7 @@
 	memcpy(string_entry->name, str, str_length);
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_string_entry_encode_check(void *entry, size_t entry_length,
 					      const char *str,
 					      uint16_t str_length)
@@ -77,18 +81,21 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_string_entry_decode_handle(
 	const struct pldm_bios_string_table_entry *entry)
 {
 	return le16toh(entry->string_handle);
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_string_entry_decode_string_length(
 	const struct pldm_bios_string_table_entry *entry)
 {
 	return le16toh(entry->string_length);
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_string_entry_decode_string(
 	const struct pldm_bios_string_table_entry *entry, char *buffer,
 	size_t size)
@@ -101,6 +108,7 @@
 	return length;
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_string_entry_decode_string_check(
 	const struct pldm_bios_string_table_entry *entry, char *buffer,
 	size_t size)
@@ -140,24 +148,28 @@
 	attr_entry->string_handle = htole16(string_handle);
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_attr_entry_decode_attribute_handle(
 	const struct pldm_bios_attr_table_entry *entry)
 {
 	return le16toh(entry->attr_handle);
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t pldm_bios_table_attr_entry_decode_attribute_type(
 	const struct pldm_bios_attr_table_entry *entry)
 {
 	return entry->attr_type;
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_attr_entry_decode_string_handle(
 	const struct pldm_bios_attr_table_entry *entry)
 {
 	return le16toh(entry->string_handle);
 }
 
+LIBPLDM_ABI_STABLE
 size_t pldm_bios_table_attr_entry_enum_encode_length(uint8_t pv_num,
 						     uint8_t def_num)
 {
@@ -167,6 +179,7 @@
 	       def_num;
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_bios_table_attr_entry_enum_encode(
 	void *entry, size_t entry_length,
 	const struct pldm_bios_table_attr_entry_enum_info *info)
@@ -193,6 +206,7 @@
 	       info->def_index, info->def_num);
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_entry_enum_encode_check(
 	void *entry, size_t entry_length,
 	const struct pldm_bios_table_attr_entry_enum_info *info)
@@ -212,12 +226,14 @@
 			return PLDM_ERROR_INVALID_DATA;                        \
 	} while (0)
 
+LIBPLDM_ABI_STABLE
 uint8_t pldm_bios_table_attr_entry_enum_decode_pv_num(
 	const struct pldm_bios_attr_table_entry *entry)
 {
 	return entry->metadata[0];
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_entry_enum_decode_pv_num_check(
 	const struct pldm_bios_attr_table_entry *entry, uint8_t *pv_num)
 {
@@ -228,6 +244,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t pldm_bios_table_attr_entry_enum_decode_def_num(
 	const struct pldm_bios_attr_table_entry *entry)
 {
@@ -236,6 +253,7 @@
 			       sizeof(uint16_t) * pv_num];
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_entry_enum_decode_def_num_check(
 	const struct pldm_bios_attr_table_entry *entry, uint8_t *def_num)
 {
@@ -246,6 +264,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t pldm_bios_table_attr_entry_enum_decode_pv_hdls(
 	const struct pldm_bios_attr_table_entry *entry, uint16_t *pv_hdls,
 	uint8_t pv_num)
@@ -261,6 +280,7 @@
 	return num;
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_entry_enum_decode_pv_hdls_check(
 	const struct pldm_bios_attr_table_entry *entry, uint16_t *pv_hdls,
 	uint8_t pv_num)
@@ -276,6 +296,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t pldm_bios_table_attr_entry_enum_decode_def_indices(
 	const struct pldm_bios_attr_table_entry *entry, uint8_t *def_indices,
 	uint8_t def_num)
@@ -308,6 +329,7 @@
 	uint8_t def_string[1];
 } __attribute__((packed));
 
+LIBPLDM_ABI_STABLE
 size_t pldm_bios_table_attr_entry_string_encode_length(uint16_t def_str_len)
 {
 	return sizeof(struct pldm_bios_attr_table_entry) -
@@ -317,6 +339,7 @@
 	       def_str_len;
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_bios_table_attr_entry_string_encode(
 	void *entry, size_t entry_length,
 	const struct pldm_bios_table_attr_entry_string_info *info)
@@ -344,6 +367,7 @@
 #define PLDM_STRING_TYPE_MAX	5
 #define PLDM_STRING_TYPE_VENDOR 0xff
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_entry_string_info_check(
 	const struct pldm_bios_table_attr_entry_string_info *info,
 	const char **errmsg)
@@ -377,6 +401,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_entry_string_encode_check(
 	void *entry, size_t entry_length,
 	const struct pldm_bios_table_attr_entry_string_info *info)
@@ -394,6 +419,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_attr_entry_string_decode_def_string_length(
 	const struct pldm_bios_attr_table_entry *entry)
 {
@@ -402,6 +428,7 @@
 	return le16toh(fields->def_length);
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_entry_string_decode_def_string_length_check(
 	const struct pldm_bios_attr_table_entry *entry,
 	uint16_t *def_string_length)
@@ -415,6 +442,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t pldm_bios_table_attr_entry_string_decode_string_type(
 	const struct pldm_bios_attr_table_entry *entry)
 {
@@ -423,6 +451,7 @@
 	return fields->string_type;
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_attr_entry_string_decode_max_length(
 	const struct pldm_bios_attr_table_entry *entry)
 {
@@ -431,6 +460,7 @@
 	return le16toh(fields->max_length);
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_attr_entry_string_decode_min_length(
 	const struct pldm_bios_attr_table_entry *entry)
 {
@@ -439,6 +469,7 @@
 	return le16toh(fields->min_length);
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_attr_entry_string_decode_def_string(
 	const struct pldm_bios_attr_table_entry *entry, char *buffer,
 	size_t size)
@@ -471,12 +502,14 @@
 	uint64_t default_value;
 } __attribute__((packed));
 
+LIBPLDM_ABI_STABLE
 size_t pldm_bios_table_attr_entry_integer_encode_length(void)
 {
 	return sizeof(struct pldm_bios_attr_table_entry) - 1 +
 	       sizeof(struct attr_table_integer_entry_fields);
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_bios_table_attr_entry_integer_encode(
 	void *entry, size_t entry_length,
 	const struct pldm_bios_table_attr_entry_integer_info *info)
@@ -496,6 +529,7 @@
 	attr_fields->default_value = htole64(info->default_value);
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_entry_integer_info_check(
 	const struct pldm_bios_table_attr_entry_integer_info *info,
 	const char **errmsg)
@@ -535,6 +569,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_entry_integer_encode_check(
 	void *entry, size_t entry_length,
 	const struct pldm_bios_table_attr_entry_integer_info *info)
@@ -551,6 +586,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_bios_table_attr_entry_integer_decode(
 	const struct pldm_bios_attr_table_entry *entry, uint64_t *lower,
 	uint64_t *upper, uint32_t *scalar, uint64_t *def)
@@ -618,24 +654,28 @@
 	return attr_table_entry->entry_length_handler(entry);
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_attr_value_entry_decode_attribute_handle(
 	const struct pldm_bios_attr_val_table_entry *entry)
 {
 	return le16toh(entry->attr_handle);
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t pldm_bios_table_attr_value_entry_decode_attribute_type(
 	const struct pldm_bios_attr_val_table_entry *entry)
 {
 	return entry->attr_type;
 }
 
+LIBPLDM_ABI_STABLE
 size_t pldm_bios_table_attr_value_entry_encode_enum_length(uint8_t count)
 {
 	return sizeof(struct pldm_bios_attr_val_table_entry) - 1 +
 	       sizeof(count) + count;
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_bios_table_attr_value_entry_encode_enum(
 	void *entry, size_t entry_length, uint16_t attr_handle,
 	uint8_t attr_type, uint8_t count, const uint8_t *handles)
@@ -653,12 +693,14 @@
 	}
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t pldm_bios_table_attr_value_entry_enum_decode_number(
 	const struct pldm_bios_attr_val_table_entry *entry)
 {
 	return entry->value[0];
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t pldm_bios_table_attr_value_entry_enum_decode_handles(
 	const struct pldm_bios_attr_val_table_entry *entry, uint8_t *handles,
 	uint8_t number)
@@ -671,6 +713,7 @@
 	return number;
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_value_entry_encode_enum_check(
 	void *entry, size_t entry_length, uint16_t attr_handle,
 	uint8_t attr_type, uint8_t count, uint8_t *handles)
@@ -695,6 +738,7 @@
 	return pldm_bios_table_attr_value_entry_encode_enum_length(number);
 }
 
+LIBPLDM_ABI_STABLE
 size_t
 pldm_bios_table_attr_value_entry_encode_string_length(uint16_t string_length)
 {
@@ -702,6 +746,7 @@
 	       sizeof(string_length) + string_length;
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_bios_table_attr_value_entry_encode_string(
 	void *entry, size_t entry_length, uint16_t attr_handle,
 	uint8_t attr_type, uint16_t str_length, const char *str)
@@ -721,6 +766,7 @@
 	memcpy(table_entry->value, &str_length, sizeof(str_length));
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_attr_value_entry_string_decode_length(
 	const struct pldm_bios_attr_val_table_entry *entry)
 {
@@ -729,6 +775,7 @@
 	return le16toh(str_length);
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_bios_table_attr_value_entry_string_decode_string(
 	const struct pldm_bios_attr_val_table_entry *entry,
 	struct variable_field *current_string)
@@ -739,6 +786,7 @@
 		entry->value + sizeof(uint16_t); // sizeof(CurrentStringLength)
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_value_entry_encode_string_check(
 	void *entry, size_t entry_length, uint16_t attr_handle,
 	uint8_t attr_type, uint16_t str_length, const char *str)
@@ -764,11 +812,14 @@
 		str_length);
 }
 
+LIBPLDM_ABI_STABLE
 size_t pldm_bios_table_attr_value_entry_encode_integer_length(void)
 {
 	return sizeof(struct pldm_bios_attr_val_table_entry) - 1 +
 	       sizeof(uint64_t);
 }
+
+LIBPLDM_ABI_STABLE
 void pldm_bios_table_attr_value_entry_encode_integer(void *entry,
 						     size_t entry_length,
 						     uint16_t attr_handle,
@@ -786,6 +837,7 @@
 	memcpy(table_entry->value, &cv, sizeof(uint64_t));
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_value_entry_encode_integer_check(void *entry,
 							  size_t entry_length,
 							  uint16_t attr_handle,
@@ -802,6 +854,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 uint64_t pldm_bios_table_attr_value_entry_integer_decode_cv(
 	const struct pldm_bios_attr_val_table_entry *entry)
 {
@@ -845,12 +898,14 @@
 	return entry_length->entry_length_handler(entry);
 }
 
+LIBPLDM_ABI_STABLE
 size_t pldm_bios_table_attr_value_entry_length(
 	const struct pldm_bios_attr_val_table_entry *entry)
 {
 	return attr_value_table_entry_length(entry);
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t pldm_bios_table_attr_value_entry_decode_handle(
 	const struct pldm_bios_attr_val_table_entry *entry)
 {
@@ -879,6 +934,7 @@
 	return table_end + sizeof(checksum);
 }
 
+LIBPLDM_ABI_STABLE
 size_t pldm_bios_table_pad_checksum_size(size_t size_without_pad)
 {
 	size_t size = pad_size_get(size_without_pad) +
@@ -886,6 +942,7 @@
 	return size;
 }
 
+LIBPLDM_ABI_STABLE
 size_t pldm_bios_table_append_pad_checksum(void *table, size_t size,
 					   size_t size_without_pad)
 {
@@ -911,6 +968,7 @@
 	size_t (*entry_length_handler)(const void *table_entry);
 };
 
+LIBPLDM_ABI_STABLE
 struct pldm_bios_table_iter *
 pldm_bios_table_iter_create(const void *table, size_t length,
 			    enum pldm_bios_table_types type)
@@ -936,12 +994,14 @@
 	return iter;
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_bios_table_iter_free(struct pldm_bios_table_iter *iter)
 {
 	free(iter);
 }
 
 #define pad_and_check_max 7
+LIBPLDM_ABI_STABLE
 bool pldm_bios_table_iter_is_end(const struct pldm_bios_table_iter *iter)
 {
 	if (iter->table_len - iter->current_pos <= pad_and_check_max) {
@@ -950,6 +1010,7 @@
 	return false;
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_bios_table_iter_next(struct pldm_bios_table_iter *iter)
 {
 	if (pldm_bios_table_iter_is_end(iter)) {
@@ -959,6 +1020,7 @@
 	iter->current_pos += iter->entry_length_handler(entry);
 }
 
+LIBPLDM_ABI_STABLE
 const void *pldm_bios_table_iter_value(struct pldm_bios_table_iter *iter)
 {
 	return iter->table_data + iter->current_pos;
@@ -1005,6 +1067,7 @@
 	return false;
 }
 
+LIBPLDM_ABI_STABLE
 const struct pldm_bios_string_table_entry *
 pldm_bios_table_string_find_by_handle(const void *table, size_t length,
 				      uint16_t handle)
@@ -1034,6 +1097,7 @@
 	return true;
 }
 
+LIBPLDM_ABI_STABLE
 const struct pldm_bios_string_table_entry *
 pldm_bios_table_string_find_by_string(const void *table, size_t length,
 				      const char *str)
@@ -1053,6 +1117,7 @@
 	       handle;
 }
 
+LIBPLDM_ABI_STABLE
 const struct pldm_bios_attr_table_entry *
 pldm_bios_table_attr_find_by_handle(const void *table, size_t length,
 				    uint16_t handle)
@@ -1069,6 +1134,7 @@
 	return pldm_bios_table_attr_entry_decode_string_handle(entry) == handle;
 }
 
+LIBPLDM_ABI_STABLE
 const struct pldm_bios_attr_table_entry *
 pldm_bios_table_attr_find_by_string_handle(const void *table, size_t length,
 					   uint16_t handle)
@@ -1084,6 +1150,7 @@
 	return pldm_bios_table_attr_value_entry_decode_handle(entry) == handle;
 }
 
+LIBPLDM_ABI_STABLE
 const struct pldm_bios_attr_val_table_entry *
 pldm_bios_table_attr_value_find_by_handle(const void *table, size_t length,
 					  uint16_t handle)
@@ -1093,6 +1160,7 @@
 		attr_value_table_handle_equal, &handle);
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_bios_table_attr_value_copy_and_update(
 	const void *src_table, size_t src_length, void *dest_table,
 	size_t *dest_length, const void *entry, size_t entry_length)
@@ -1144,6 +1212,7 @@
 	return rc;
 }
 
+LIBPLDM_ABI_STABLE
 bool pldm_bios_table_checksum(const uint8_t *table, size_t size)
 {
 	if (table == NULL) {
diff --git a/src/firmware_update.c b/src/firmware_update.c
index 91fbb33..df58faa 100644
--- a/src/firmware_update.c
+++ b/src/firmware_update.c
@@ -1,3 +1,4 @@
+#include "config.h"
 #include "firmware_update.h"
 #include "utils.h"
 #include <endian.h>
@@ -296,6 +297,7 @@
 	}
 }
 
+LIBPLDM_ABI_STABLE
 int decode_pldm_package_header_info(
 	const uint8_t *data, size_t length,
 	struct pldm_package_header_information *package_header_info,
@@ -351,6 +353,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_firmware_device_id_record(
 	const uint8_t *data, size_t length,
 	uint16_t component_bitmap_bit_length,
@@ -443,6 +446,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_descriptor_type_length_value(const uint8_t *data, size_t length,
 					uint16_t *descriptor_type,
 					struct variable_field *descriptor_data)
@@ -481,6 +485,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_vendor_defined_descriptor_value(
 	const uint8_t *data, size_t length, uint8_t *descriptor_title_str_type,
 	struct variable_field *descriptor_title_str,
@@ -526,6 +531,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_pldm_comp_image_info(
 	const uint8_t *data, size_t length,
 	struct pldm_component_image_information *pldm_comp_image_info,
@@ -590,6 +596,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_query_device_identifiers_req(uint8_t instance_id,
 					size_t payload_length,
 					struct pldm_msg *msg)
@@ -606,6 +613,7 @@
 				       PLDM_QUERY_DEVICE_IDENTIFIERS, msg);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_query_device_identifiers_resp(const struct pldm_msg *msg,
 					 size_t payload_length,
 					 uint8_t *completion_code,
@@ -653,6 +661,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_firmware_parameters_req(uint8_t instance_id,
 				       size_t payload_length,
 				       struct pldm_msg *msg)
@@ -669,6 +678,7 @@
 				       PLDM_GET_FIRMWARE_PARAMETERS, msg);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_firmware_parameters_resp(
 	const struct pldm_msg *msg, size_t payload_length,
 	struct pldm_get_firmware_parameters_resp *resp_data,
@@ -767,6 +777,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_firmware_parameters_resp_comp_entry(
 	const uint8_t *data, size_t length,
 	struct pldm_component_parameter_entry *component_data,
@@ -842,6 +853,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_request_update_req(uint8_t instance_id, uint32_t max_transfer_size,
 			      uint16_t num_of_comp,
 			      uint8_t max_outstanding_transfer_req,
@@ -901,6 +913,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_request_update_resp(const struct pldm_msg *msg,
 			       size_t payload_length, uint8_t *completion_code,
 			       uint16_t *fd_meta_data_len,
@@ -930,6 +943,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_pass_component_table_req(uint8_t instance_id, uint8_t transfer_flag,
 				    uint16_t comp_classification,
 				    uint16_t comp_identifier,
@@ -989,6 +1003,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_pass_component_table_resp(const struct pldm_msg *msg,
 				     const size_t payload_length,
 				     uint8_t *completion_code,
@@ -1026,6 +1041,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_update_component_req(
 	uint8_t instance_id, uint16_t comp_classification,
 	uint16_t comp_identifier, uint8_t comp_classification_index,
@@ -1084,6 +1100,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_update_component_resp(const struct pldm_msg *msg,
 				 size_t payload_length,
 				 uint8_t *completion_code,
@@ -1131,6 +1148,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_request_firmware_data_req(const struct pldm_msg *msg,
 				     size_t payload_length, uint32_t *offset,
 				     uint32_t *length)
@@ -1153,6 +1171,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_request_firmware_data_resp(uint8_t instance_id,
 				      uint8_t completion_code,
 				      struct pldm_msg *msg,
@@ -1177,6 +1196,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_transfer_complete_req(const struct pldm_msg *msg,
 				 size_t payload_length,
 				 uint8_t *transfer_result)
@@ -1193,6 +1213,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_transfer_complete_resp(uint8_t instance_id, uint8_t completion_code,
 				  struct pldm_msg *msg, size_t payload_length)
 {
@@ -1219,6 +1240,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_verify_complete_req(const struct pldm_msg *msg,
 			       size_t payload_length, uint8_t *verify_result)
 {
@@ -1234,6 +1256,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_verify_complete_resp(uint8_t instance_id, uint8_t completion_code,
 				struct pldm_msg *msg, size_t payload_length)
 {
@@ -1260,6 +1283,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_apply_complete_req(const struct pldm_msg *msg, size_t payload_length,
 			      uint8_t *apply_result,
 			      bitfield16_t *comp_activation_methods_modification)
@@ -1288,6 +1312,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_apply_complete_resp(uint8_t instance_id, uint8_t completion_code,
 			       struct pldm_msg *msg, size_t payload_length)
 {
@@ -1314,6 +1339,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_activate_firmware_req(uint8_t instance_id,
 				 bool8_t self_contained_activation_req,
 				 struct pldm_msg *msg, size_t payload_length)
@@ -1349,6 +1375,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_activate_firmware_resp(const struct pldm_msg *msg,
 				  size_t payload_length,
 				  uint8_t *completion_code,
@@ -1377,6 +1404,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_status_req(uint8_t instance_id, struct pldm_msg *msg,
 			  size_t payload_length)
 {
@@ -1401,6 +1429,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_status_resp(const struct pldm_msg *msg, size_t payload_length,
 			   uint8_t *completion_code, uint8_t *current_state,
 			   uint8_t *previous_state, uint8_t *aux_state,
@@ -1467,6 +1496,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_cancel_update_component_req(uint8_t instance_id,
 				       struct pldm_msg *msg,
 				       size_t payload_length)
@@ -1492,6 +1522,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_cancel_update_component_resp(const struct pldm_msg *msg,
 					size_t payload_length,
 					uint8_t *completion_code)
@@ -1508,6 +1539,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_cancel_update_req(uint8_t instance_id, struct pldm_msg *msg,
 			     size_t payload_length)
 {
@@ -1532,6 +1564,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_cancel_update_resp(const struct pldm_msg *msg, size_t payload_length,
 			      uint8_t *completion_code,
 			      bool8_t *non_functioning_component_indication,
diff --git a/src/fru.c b/src/fru.c
index 684a559..de66074 100644
--- a/src/fru.c
+++ b/src/fru.c
@@ -1,3 +1,5 @@
+#include "config.h"
+
 #include <assert.h>
 #include <endian.h>
 #include <stdbool.h>
@@ -8,6 +10,7 @@
 #include "fru.h"
 #include "utils.h"
 
+LIBPLDM_ABI_STABLE
 int encode_get_fru_record_table_metadata_req(uint8_t instance_id,
 					     struct pldm_msg *msg,
 					     size_t payload_length)
@@ -29,6 +32,7 @@
 	return pack_pldm_header(&header, &(msg->hdr));
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_fru_record_table_metadata_resp(
 	const struct pldm_msg *msg, size_t payload_length,
 	uint8_t *completion_code, uint8_t *fru_data_major_version,
@@ -68,6 +72,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_fru_record_table_metadata_resp(
 	uint8_t instance_id, uint8_t completion_code,
 	uint8_t fru_data_major_version, uint8_t fru_data_minor_version,
@@ -108,6 +113,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_fru_record_table_req(const struct pldm_msg *msg,
 				    size_t payload_length,
 				    uint32_t *data_transfer_handle,
@@ -131,6 +137,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_fru_record_table_resp(uint8_t instance_id,
 				     uint8_t completion_code,
 				     uint32_t next_data_transfer_handle,
@@ -166,6 +173,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_fru_record(uint8_t *fru_table, size_t total_size, size_t *curr_size,
 		      uint16_t record_set_id, uint8_t record_type,
 		      uint8_t num_frus, uint8_t encoding, uint8_t *tlvs,
@@ -205,6 +213,7 @@
 							    table_size);
 }
 
+LIBPLDM_ABI_STABLE
 void get_fru_record_by_option(const uint8_t *table, size_t table_size,
 			      uint8_t *record_table, size_t *record_size,
 			      uint16_t rsi, uint8_t rt, uint8_t ft)
@@ -265,6 +274,7 @@
 	*record_size = pos - record_table;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_fru_record_by_option_req(
 	uint8_t instance_id, uint32_t data_transfer_handle,
 	uint16_t fru_table_handle, uint16_t record_set_identifier,
@@ -303,6 +313,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_fru_record_by_option_req(
 	const struct pldm_msg *msg, size_t payload_length,
 	uint32_t *data_transfer_handle, uint16_t *fru_table_handle,
@@ -333,6 +344,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_fru_record_by_option_resp(uint8_t instance_id,
 					 uint8_t completion_code,
 					 uint32_t next_data_transfer_handle,
@@ -374,6 +386,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_fru_record_by_option_resp(
 	const struct pldm_msg *msg, size_t payload_length,
 	uint8_t *completion_code, uint32_t *next_transfer_handle,
@@ -406,6 +419,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_fru_record_table_req(uint8_t instance_id,
 				    uint32_t data_transfer_handle,
 				    uint8_t transfer_operation_flag,
@@ -438,6 +452,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_fru_record_table_resp_safe(
 	const struct pldm_msg *msg, size_t payload_length,
 	uint8_t *completion_code, uint32_t *next_data_transfer_handle,
@@ -477,6 +492,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_fru_record_table_resp(const struct pldm_msg *msg,
 				     size_t payload_length,
 				     uint8_t *completion_code,
@@ -491,6 +507,7 @@
 		(size_t)-1);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_set_fru_record_table_req(const struct pldm_msg *msg,
 				    size_t payload_length,
 				    uint32_t *data_transfer_handle,
@@ -519,6 +536,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_set_fru_record_table_resp(uint8_t instance_id,
 				     uint8_t completion_code,
 				     uint32_t next_data_transfer_handle,
diff --git a/src/oem/ibm/file_io.c b/src/oem/ibm/file_io.c
index 10af817..01d3e43 100644
--- a/src/oem/ibm/file_io.c
+++ b/src/oem/ibm/file_io.c
@@ -1,8 +1,10 @@
+#include "config.h"
 #include "libpldm/file_io.h"
 #include "base.h"
 #include <endian.h>
 #include <string.h>
 
+LIBPLDM_ABI_STABLE
 int decode_rw_file_memory_req(const struct pldm_msg *msg, size_t payload_length,
 			      uint32_t *file_handle, uint32_t *offset,
 			      uint32_t *length, uint64_t *address)
@@ -27,6 +29,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_rw_file_memory_resp(uint8_t instance_id, uint8_t command,
 			       uint8_t completion_code, uint32_t length,
 			       struct pldm_msg *msg)
@@ -55,6 +58,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_rw_file_memory_req(uint8_t instance_id, uint8_t command,
 			      uint32_t file_handle, uint32_t offset,
 			      uint32_t length, uint64_t address,
@@ -83,6 +87,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_rw_file_memory_resp(const struct pldm_msg *msg,
 			       size_t payload_length, uint8_t *completion_code,
 			       uint32_t *length)
@@ -105,6 +110,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_file_table_req(const struct pldm_msg *msg, size_t payload_length,
 			      uint32_t *transfer_handle,
 			      uint8_t *transfer_opflag, uint8_t *table_type)
@@ -128,6 +134,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_file_table_resp(uint8_t instance_id, uint8_t completion_code,
 			       uint32_t next_transfer_handle,
 			       uint8_t transfer_flag, const uint8_t *table_data,
@@ -160,6 +167,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_file_table_req(uint8_t instance_id, uint32_t transfer_handle,
 			      uint8_t transfer_opflag, uint8_t table_type,
 			      struct pldm_msg *msg)
@@ -187,6 +195,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_file_table_resp(const struct pldm_msg *msg,
 			       size_t payload_length, uint8_t *completion_code,
 			       uint32_t *next_transfer_handle,
@@ -224,6 +233,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_read_file_req(const struct pldm_msg *msg, size_t payload_length,
 			 uint32_t *file_handle, uint32_t *offset,
 			 uint32_t *length)
@@ -247,6 +257,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_read_file_req(uint8_t instance_id, uint32_t file_handle,
 			 uint32_t offset, uint32_t length, struct pldm_msg *msg)
 {
@@ -278,6 +289,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_read_file_resp(const struct pldm_msg *msg, size_t payload_length,
 			  uint8_t *completion_code, uint32_t *length,
 			  size_t *file_data_offset)
@@ -305,6 +317,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_read_file_resp(uint8_t instance_id, uint8_t completion_code,
 			  uint32_t length, struct pldm_msg *msg)
 {
@@ -333,6 +346,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_write_file_req(const struct pldm_msg *msg, size_t payload_length,
 			  uint32_t *file_handle, uint32_t *offset,
 			  uint32_t *length, size_t *file_data_offset)
@@ -360,6 +374,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_write_file_req(uint8_t instance_id, uint32_t file_handle,
 			  uint32_t offset, uint32_t length,
 			  struct pldm_msg *msg)
@@ -392,6 +407,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_write_file_resp(const struct pldm_msg *msg, size_t payload_length,
 			   uint8_t *completion_code, uint32_t *length)
 {
@@ -414,6 +430,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_write_file_resp(uint8_t instance_id, uint8_t completion_code,
 			   uint32_t length, struct pldm_msg *msg)
 {
@@ -442,6 +459,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_rw_file_by_type_memory_req(const struct pldm_msg *msg,
 				      size_t payload_length,
 				      uint16_t *file_type,
@@ -468,6 +486,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_rw_file_by_type_memory_resp(uint8_t instance_id, uint8_t command,
 				       uint8_t completion_code, uint32_t length,
 				       struct pldm_msg *msg)
@@ -496,6 +515,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_rw_file_by_type_memory_req(uint8_t instance_id, uint8_t command,
 				      uint16_t file_type, uint32_t file_handle,
 				      uint32_t offset, uint32_t length,
@@ -526,6 +546,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_rw_file_by_type_memory_resp(const struct pldm_msg *msg,
 				       size_t payload_length,
 				       uint8_t *completion_code,
@@ -549,6 +570,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_new_file_req(const struct pldm_msg *msg, size_t payload_length,
 			uint16_t *file_type, uint32_t *file_handle,
 			uint64_t *length)
@@ -571,6 +593,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_new_file_resp(uint8_t instance_id, uint8_t completion_code,
 			 struct pldm_msg *msg)
 {
@@ -595,6 +618,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_new_file_req(uint8_t instance_id, uint16_t file_type,
 			uint32_t file_handle, uint64_t length,
 			struct pldm_msg *msg)
@@ -622,6 +646,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_new_file_resp(const struct pldm_msg *msg, size_t payload_length,
 			 uint8_t *completion_code)
 {
@@ -640,6 +665,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_rw_file_by_type_req(const struct pldm_msg *msg,
 			       size_t payload_length, uint16_t *file_type,
 			       uint32_t *file_handle, uint32_t *offset,
@@ -664,6 +690,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_rw_file_by_type_resp(uint8_t instance_id, uint8_t command,
 				uint8_t completion_code, uint32_t length,
 				struct pldm_msg *msg)
@@ -696,6 +723,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_rw_file_by_type_req(uint8_t instance_id, uint8_t command,
 			       uint16_t file_type, uint32_t file_handle,
 			       uint32_t offset, uint32_t length,
@@ -729,6 +757,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_rw_file_by_type_resp(const struct pldm_msg *msg,
 				size_t payload_length, uint8_t *completion_code,
 				uint32_t *length)
@@ -751,6 +780,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_file_ack_req(const struct pldm_msg *msg, size_t payload_length,
 			uint16_t *file_type, uint32_t *file_handle,
 			uint8_t *file_status)
@@ -772,6 +802,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_file_ack_resp(uint8_t instance_id, uint8_t completion_code,
 			 struct pldm_msg *msg)
 {
@@ -796,6 +827,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_file_ack_req(uint8_t instance_id, uint16_t file_type,
 			uint32_t file_handle, uint8_t file_status,
 			struct pldm_msg *msg)
@@ -823,6 +855,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_file_ack_resp(const struct pldm_msg *msg, size_t payload_length,
 			 uint8_t *completion_code)
 {
@@ -841,6 +874,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_file_ack_with_meta_data_req(
 	uint8_t instance_id, uint16_t file_type, uint32_t file_handle,
 	uint8_t file_status, uint32_t file_meta_data_1,
@@ -874,6 +908,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_file_ack_with_meta_data_resp(const struct pldm_msg *msg,
 					size_t payload_length,
 					uint8_t *completion_code)
@@ -893,6 +928,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_file_ack_with_meta_data_req(
 	const struct pldm_msg *msg, size_t payload_length, uint16_t *file_type,
 	uint32_t *file_handle, uint8_t *file_status, uint32_t *file_meta_data_1,
@@ -920,6 +956,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_file_ack_with_meta_data_resp(uint8_t instance_id,
 					uint8_t completion_code,
 					struct pldm_msg *msg)
@@ -945,6 +982,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_new_file_with_metadata_req(uint8_t instance_id, uint16_t file_type,
 				      uint32_t file_handle, uint64_t length,
 				      uint32_t file_meta_data_1,
@@ -980,6 +1018,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_new_file_with_metadata_resp(const struct pldm_msg *msg,
 				       size_t payload_length,
 				       uint8_t *completion_code)
@@ -1003,6 +1042,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_new_file_with_metadata_req(
 	const struct pldm_msg *msg, size_t payload_length, uint16_t *file_type,
 	uint32_t *file_handle, uint64_t *length, uint32_t *file_meta_data_1,
@@ -1032,6 +1072,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_new_file_with_metadata_resp(uint8_t instance_id,
 				       uint8_t completion_code,
 				       struct pldm_msg *msg)
diff --git a/src/oem/ibm/host.c b/src/oem/ibm/host.c
index 6534e5b..d2c297a 100644
--- a/src/oem/ibm/host.c
+++ b/src/oem/ibm/host.c
@@ -1,3 +1,4 @@
+#include "config.h"
 #include "base.h"
 #include <endian.h>
 #include <stdint.h>
@@ -5,6 +6,7 @@
 
 #include "libpldm/host.h"
 
+LIBPLDM_ABI_STABLE
 int encode_get_alert_status_req(uint8_t instance_id, uint8_t version_id,
 				struct pldm_msg *msg, size_t payload_length)
 {
@@ -31,6 +33,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_alert_status_resp(const struct pldm_msg *msg,
 				 size_t payload_length,
 				 uint8_t *completion_code, uint32_t *rack_entry,
@@ -59,6 +62,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_alert_status_req(const struct pldm_msg *msg,
 				size_t payload_length, uint8_t *version_id)
 {
@@ -75,6 +79,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_alert_status_resp(uint8_t instance_id, uint8_t completion_code,
 				 uint32_t rack_entry, uint32_t pri_cec_node,
 				 struct pldm_msg *msg, size_t payload_length)
diff --git a/src/oem/ibm/platform.c b/src/oem/ibm/platform.c
index 9f68bce..ab18671 100644
--- a/src/oem/ibm/platform.c
+++ b/src/oem/ibm/platform.c
@@ -1,7 +1,9 @@
+#include "config.h"
 #include "libpldm/platform.h"
 #include "libpldm/platform_oem_ibm.h"
 #include <string.h>
 
+LIBPLDM_ABI_STABLE
 int encode_bios_attribute_update_event_req(uint8_t instance_id,
 					   uint8_t format_version, uint8_t tid,
 					   uint8_t num_handles,
diff --git a/src/pdr.c b/src/pdr.c
index 232dd89..68342ef 100644
--- a/src/pdr.c
+++ b/src/pdr.c
@@ -1,3 +1,4 @@
+#include "config.h"
 #include "pdr.h"
 #include "platform.h"
 #include <assert.h>
@@ -97,6 +98,7 @@
 	return record;
 }
 
+LIBPLDM_ABI_STABLE
 uint32_t pldm_pdr_add(pldm_pdr *repo, const uint8_t *data, uint32_t size,
 		      uint32_t record_handle, bool is_remote,
 		      uint16_t terminus_handle)
@@ -111,6 +113,7 @@
 	return record->record_handle;
 }
 
+LIBPLDM_ABI_STABLE
 pldm_pdr *pldm_pdr_init(void)
 {
 	pldm_pdr *repo = malloc(sizeof(pldm_pdr));
@@ -123,6 +126,7 @@
 	return repo;
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_pdr_destroy(pldm_pdr *repo)
 {
 	assert(repo != NULL);
@@ -140,6 +144,7 @@
 	free(repo);
 }
 
+LIBPLDM_ABI_STABLE
 const pldm_pdr_record *pldm_pdr_find_record(const pldm_pdr *repo,
 					    uint32_t record_handle,
 					    uint8_t **data, uint32_t *size,
@@ -170,6 +175,7 @@
 	return NULL;
 }
 
+LIBPLDM_ABI_STABLE
 const pldm_pdr_record *
 pldm_pdr_get_next_record(const pldm_pdr *repo,
 			 const pldm_pdr_record *curr_record, uint8_t **data,
@@ -194,6 +200,7 @@
 	return curr_record->next;
 }
 
+LIBPLDM_ABI_STABLE
 const pldm_pdr_record *
 pldm_pdr_find_record_by_type(const pldm_pdr *repo, uint8_t pdr_type,
 			     const pldm_pdr_record *curr_record, uint8_t **data,
@@ -223,6 +230,7 @@
 	return NULL;
 }
 
+LIBPLDM_ABI_STABLE
 uint32_t pldm_pdr_get_record_count(const pldm_pdr *repo)
 {
 	assert(repo != NULL);
@@ -230,6 +238,7 @@
 	return repo->record_count;
 }
 
+LIBPLDM_ABI_STABLE
 uint32_t pldm_pdr_get_repo_size(const pldm_pdr *repo)
 {
 	assert(repo != NULL);
@@ -237,6 +246,7 @@
 	return repo->size;
 }
 
+LIBPLDM_ABI_STABLE
 uint32_t pldm_pdr_get_record_handle(const pldm_pdr *repo,
 				    const pldm_pdr_record *record)
 {
@@ -246,13 +256,15 @@
 	return record->record_handle;
 }
 
-inline bool pldm_pdr_record_is_remote(const pldm_pdr_record *record)
+LIBPLDM_ABI_STABLE
+bool pldm_pdr_record_is_remote(const pldm_pdr_record *record)
 {
 	assert(record != NULL);
 
 	return record->is_remote;
 }
 
+LIBPLDM_ABI_STABLE
 uint32_t pldm_pdr_add_fru_record_set(pldm_pdr *repo, uint16_t terminus_handle,
 				     uint16_t fru_rsi, uint16_t entity_type,
 				     uint16_t entity_instance_num,
@@ -282,6 +294,7 @@
 			    terminus_handle);
 }
 
+LIBPLDM_ABI_STABLE
 const pldm_pdr_record *pldm_pdr_fru_record_set_find_by_rsi(
 	const pldm_pdr *repo, uint16_t fru_rsi, uint16_t *terminus_handle,
 	uint16_t *entity_type, uint16_t *entity_instance_num,
@@ -322,6 +335,7 @@
 	return NULL;
 }
 
+LIBPLDM_ABI_STABLE
 /* NOLINTNEXTLINE(readability-identifier-naming) */
 void pldm_pdr_update_TL_pdr(const pldm_pdr *repo, uint16_t terminus_handle,
 			    uint8_t tid, uint8_t tl_eid, bool valid_bit)
@@ -372,6 +386,7 @@
 	return ++tree->last_used_container_id;
 }
 
+LIBPLDM_ABI_STABLE
 pldm_entity pldm_entity_extract(pldm_entity_node *node)
 {
 	assert(node != NULL);
@@ -379,6 +394,7 @@
 	return node->entity;
 }
 
+LIBPLDM_ABI_STABLE
 pldm_entity_association_tree *pldm_entity_association_tree_init(void)
 {
 	pldm_entity_association_tree *tree =
@@ -411,6 +427,7 @@
 	return start;
 }
 
+LIBPLDM_ABI_STABLE
 pldm_entity_node *pldm_entity_association_tree_add(
 	pldm_entity_association_tree *tree, pldm_entity *entity,
 	uint16_t entity_instance_number, pldm_entity_node *parent,
@@ -505,6 +522,7 @@
 	entity_association_tree_visit(node->first_child, entities, index);
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_entity_association_tree_visit(pldm_entity_association_tree *tree,
 					pldm_entity **entities, size_t *size)
 {
@@ -532,6 +550,7 @@
 	free(node);
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_entity_association_tree_destroy(pldm_entity_association_tree *tree)
 {
 	assert(tree != NULL);
@@ -540,21 +559,24 @@
 	free(tree);
 }
 
-inline bool pldm_entity_is_node_parent(pldm_entity_node *node)
+LIBPLDM_ABI_STABLE
+bool pldm_entity_is_node_parent(pldm_entity_node *node)
 {
 	assert(node != NULL);
 
 	return node->first_child != NULL;
 }
 
-inline pldm_entity pldm_entity_get_parent(pldm_entity_node *node)
+LIBPLDM_ABI_STABLE
+pldm_entity pldm_entity_get_parent(pldm_entity_node *node)
 {
 	assert(node != NULL);
 
 	return node->parent;
 }
 
-inline bool pldm_entity_is_exist_parent(pldm_entity_node *node)
+LIBPLDM_ABI_STABLE
+bool pldm_entity_is_exist_parent(pldm_entity_node *node)
 {
 	assert(node != NULL);
 
@@ -567,6 +589,7 @@
 	return true;
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t pldm_entity_get_num_children(pldm_entity_node *node,
 				     uint8_t association_type)
 {
@@ -587,6 +610,7 @@
 	return count;
 }
 
+LIBPLDM_ABI_STABLE
 bool pldm_is_current_parent_child(pldm_entity_node *parent, pldm_entity *node)
 {
 	assert(parent != NULL);
@@ -689,6 +713,7 @@
 	}
 }
 
+LIBPLDM_ABI_STABLE
 bool is_present(pldm_entity entity, pldm_entity **entities, size_t num_entities)
 {
 	if (entities == NULL || num_entities == 0) {
@@ -724,6 +749,7 @@
 				   num_entities, is_remote, terminus_handle);
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_entity_association_pdr_add(pldm_entity_association_tree *tree,
 				     pldm_pdr *repo, bool is_remote,
 				     uint16_t terminus_handle)
@@ -735,6 +761,7 @@
 				   terminus_handle);
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_entity_association_pdr_add_from_node(
 	pldm_entity_node *node, pldm_pdr *repo, pldm_entity **entities,
 	size_t num_entities, bool is_remote, uint16_t terminus_handle)
@@ -745,6 +772,7 @@
 				   is_remote, terminus_handle);
 }
 
+LIBPLDM_ABI_STABLE
 void find_entity_ref_in_tree(pldm_entity_node *tree_node, pldm_entity entity,
 			     pldm_entity_node **node)
 {
@@ -763,6 +791,7 @@
 	find_entity_ref_in_tree(tree_node->next_sibling, entity, node);
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_find_entity_ref_in_tree(pldm_entity_association_tree *tree,
 				  pldm_entity entity, pldm_entity_node **node)
 {
@@ -770,6 +799,7 @@
 	find_entity_ref_in_tree(tree->root, entity, node);
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_pdr_remove_pdrs_by_terminus_handle(pldm_pdr *repo,
 					     uint16_t terminus_handle)
 {
@@ -817,6 +847,8 @@
 		}
 	}
 }
+
+LIBPLDM_ABI_STABLE
 void pldm_pdr_remove_remote_pdrs(pldm_pdr *repo)
 {
 	assert(repo != NULL);
@@ -864,6 +896,7 @@
 	}
 }
 
+LIBPLDM_ABI_STABLE
 void entity_association_tree_find(pldm_entity_node *node, pldm_entity *entity,
 				  pldm_entity_node **out)
 {
@@ -882,6 +915,7 @@
 	entity_association_tree_find(node->first_child, entity, out);
 }
 
+LIBPLDM_ABI_STABLE
 pldm_entity_node *
 pldm_entity_association_tree_find(pldm_entity_association_tree *tree,
 				  pldm_entity *entity)
@@ -911,6 +945,7 @@
 				     &((*new_node)->next_sibling));
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_entity_association_tree_copy_root(
 	pldm_entity_association_tree *org_tree,
 	pldm_entity_association_tree *new_tree)
@@ -919,6 +954,7 @@
 	entity_association_tree_copy(org_tree->root, &(new_tree->root));
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_entity_association_tree_destroy_root(
 	pldm_entity_association_tree *tree)
 {
@@ -928,11 +964,13 @@
 	tree->root = NULL;
 }
 
+LIBPLDM_ABI_STABLE
 bool pldm_is_empty_entity_assoc_tree(pldm_entity_association_tree *tree)
 {
 	return ((tree->root == NULL) ? true : false);
 }
 
+LIBPLDM_ABI_STABLE
 void pldm_entity_association_pdr_extract(const uint8_t *pdr, uint16_t pdr_len,
 					 size_t *num_entities,
 					 pldm_entity **entities)
diff --git a/src/platform.c b/src/platform.c
index c6f3cf6..775b181 100644
--- a/src/platform.c
+++ b/src/platform.c
@@ -1,3 +1,4 @@
+#include "config.h"
 #include "msgbuf/platform.h"
 #include "base.h"
 #include "msgbuf.h"
@@ -22,6 +23,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_state_effecter_pdr(
 	struct pldm_state_effecter_pdr *const effecter,
 	const size_t allocation_size,
@@ -92,6 +94,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_state_sensor_pdr(
 	struct pldm_state_sensor_pdr *const sensor,
 	const size_t allocation_size,
@@ -159,6 +162,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_set_state_effecter_states_resp(uint8_t instance_id,
 					  uint8_t completion_code,
 					  struct pldm_msg *msg)
@@ -183,6 +187,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_set_state_effecter_states_req(uint8_t instance_id,
 					 uint16_t effecter_id,
 					 uint8_t comp_effecter_count,
@@ -220,6 +225,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_set_state_effecter_states_resp(const struct pldm_msg *msg,
 					  size_t payload_length,
 					  uint8_t *completion_code)
@@ -241,6 +247,7 @@
 }
 
 #define PLDM_SET_STATE_EFFECTER_STATES_MIN_SIZE 3
+LIBPLDM_ABI_STABLE
 int decode_set_state_effecter_states_req(const struct pldm_msg *msg,
 					 size_t payload_length,
 					 uint16_t *effecter_id,
@@ -282,6 +289,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_pdr_req(const struct pldm_msg *msg, size_t payload_length,
 		       uint32_t *record_hndl, uint32_t *data_transfer_hndl,
 		       uint8_t *transfer_op_flag, uint16_t *request_cnt,
@@ -316,6 +324,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_pdr_resp(uint8_t instance_id, uint8_t completion_code,
 			uint32_t next_record_hndl,
 			uint32_t next_data_transfer_hndl, uint8_t transfer_flag,
@@ -361,6 +370,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_pdr_repository_info_resp(
 	uint8_t instance_id, uint8_t completion_code, uint8_t repository_state,
 	const uint8_t *update_time, const uint8_t *oem_update_time,
@@ -407,6 +417,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_pdr_repository_info_resp(
 	const struct pldm_msg *msg, size_t payload_length,
 	uint8_t *completion_code, uint8_t *repository_state,
@@ -452,6 +463,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_pdr_req(uint8_t instance_id, uint32_t record_hndl,
 		       uint32_t data_transfer_hndl, uint8_t transfer_op_flag,
 		       uint16_t request_cnt, uint16_t record_chg_num,
@@ -487,6 +499,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_pdr_resp(const struct pldm_msg *msg, size_t payload_length,
 			uint8_t *completion_code, uint32_t *next_record_hndl,
 			uint32_t *next_data_transfer_hndl,
@@ -537,6 +550,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_set_numeric_effecter_value_req(const struct pldm_msg *msg,
 					  size_t payload_length,
 					  uint16_t *effecter_id,
@@ -575,6 +589,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_set_numeric_effecter_value_resp(uint8_t instance_id,
 					   uint8_t completion_code,
 					   struct pldm_msg *msg,
@@ -604,6 +619,7 @@
 	return rc;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_set_numeric_effecter_value_req(uint8_t instance_id,
 					  uint16_t effecter_id,
 					  uint8_t effecter_data_size,
@@ -668,6 +684,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_set_numeric_effecter_value_resp(const struct pldm_msg *msg,
 					   size_t payload_length,
 					   uint8_t *completion_code)
@@ -685,6 +702,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_state_sensor_readings_resp(uint8_t instance_id,
 					  uint8_t completion_code,
 					  uint8_t comp_sensor_count,
@@ -721,6 +739,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_state_sensor_readings_req(uint8_t instance_id,
 					 uint16_t sensor_id,
 					 bitfield8_t sensor_rearm,
@@ -751,6 +770,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_state_sensor_readings_resp(const struct pldm_msg *msg,
 					  size_t payload_length,
 					  uint8_t *completion_code,
@@ -802,6 +822,7 @@
 	return pldm_msgbuf_destroy_consumed(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_state_sensor_readings_req(const struct pldm_msg *msg,
 					 size_t payload_length,
 					 uint16_t *sensor_id,
@@ -829,6 +850,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_sensor_event_data(
 	struct pldm_sensor_event_data *const event_data,
 	const size_t event_data_size, const uint16_t sensor_id,
@@ -864,6 +886,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_platform_event_message_req(const struct pldm_msg *msg,
 				      size_t payload_length,
 				      uint8_t *format_version, uint8_t *tid,
@@ -894,6 +917,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_poll_for_platform_event_message_req(
 	const struct pldm_msg *msg, size_t payload_length,
 	uint8_t *format_version, uint8_t *transfer_operation_flag,
@@ -940,6 +964,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_platform_event_message_resp(uint8_t instance_id,
 				       uint8_t completion_code,
 				       uint8_t platform_event_status,
@@ -972,6 +997,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_poll_for_platform_event_message_resp(
 	uint8_t instance_id, uint8_t completion_code, uint8_t tid,
 	uint16_t event_id, uint32_t next_data_transfer_handle,
@@ -1037,6 +1063,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_platform_event_message_req(
 	uint8_t instance_id, uint8_t format_version, uint8_t tid,
 	uint8_t event_class, const uint8_t *event_data,
@@ -1086,6 +1113,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_platform_event_message_resp(const struct pldm_msg *msg,
 				       size_t payload_length,
 				       uint8_t *completion_code,
@@ -1127,6 +1155,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_event_message_buffer_size_req(uint8_t instance_id,
 					 uint16_t event_receiver_max_buffer_size,
 					 struct pldm_msg *msg)
@@ -1150,6 +1179,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_event_message_buffer_size_resp(const struct pldm_msg *msg,
 					  size_t payload_length,
 					  uint8_t *completion_code,
@@ -1184,6 +1214,7 @@
 	return pldm_msgbuf_destroy_consumed(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_event_message_supported_req(uint8_t instance_id,
 				       uint8_t format_version,
 				       struct pldm_msg *msg)
@@ -1214,6 +1245,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_event_message_supported_resp(const struct pldm_msg *msg,
 					size_t payload_length,
 					uint8_t *completion_code,
@@ -1280,6 +1312,7 @@
 	return pldm_msgbuf_destroy_consumed(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_sensor_event_data(const uint8_t *event_data,
 			     size_t event_data_length, uint16_t *sensor_id,
 			     uint8_t *sensor_event_class_type,
@@ -1331,6 +1364,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_sensor_op_data(const uint8_t *sensor_data, size_t sensor_data_length,
 			  uint8_t *present_op_state, uint8_t *previous_op_state)
 {
@@ -1355,6 +1389,7 @@
 	return pldm_msgbuf_destroy_consumed(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_state_sensor_data(const uint8_t *sensor_data,
 			     size_t sensor_data_length, uint8_t *sensor_offset,
 			     uint8_t *event_state,
@@ -1383,6 +1418,7 @@
 	return pldm_msgbuf_destroy_consumed(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_numeric_sensor_data(const uint8_t *sensor_data,
 			       size_t sensor_data_length, uint8_t *event_state,
 			       uint8_t *previous_event_state,
@@ -1473,6 +1509,7 @@
 }
 
 #define PLDM_NUMERIC_SENSOR_VALUE_PDR_MIN_SIZE 69
+LIBPLDM_ABI_STABLE
 int decode_numeric_sensor_pdr_data(
 	const void *pdr_data, size_t pdr_data_length,
 	struct pldm_numeric_sensor_value_pdr *pdr_value)
@@ -1573,6 +1610,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_numeric_effecter_value_req(uint8_t instance_id,
 					  uint16_t effecter_id,
 					  struct pldm_msg *msg)
@@ -1599,6 +1637,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_numeric_effecter_value_resp(
 	uint8_t instance_id, uint8_t completion_code,
 	uint8_t effecter_data_size, uint8_t effecter_oper_state,
@@ -1679,6 +1718,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_numeric_effecter_value_req(const struct pldm_msg *msg,
 					  size_t payload_length,
 					  uint16_t *effecter_id)
@@ -1702,6 +1742,7 @@
 	return pldm_msgbuf_destroy_consumed(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_numeric_effecter_value_resp(const struct pldm_msg *msg,
 					   size_t payload_length,
 					   uint8_t *completion_code,
@@ -1762,6 +1803,7 @@
 	return pldm_msgbuf_destroy_consumed(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_pldm_pdr_repository_chg_event_data(
 	uint8_t event_data_format, uint8_t number_of_change_records,
 	const uint8_t *event_data_operations,
@@ -1825,6 +1867,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_pldm_pdr_repository_chg_event_data(const uint8_t *event_data,
 					      size_t event_data_size,
 					      uint8_t *event_data_format,
@@ -1855,6 +1898,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_TESTING
 int decode_pldm_message_poll_event_data(const uint8_t *event_data,
 					size_t event_data_length,
 					uint8_t *format_version,
@@ -1891,6 +1935,7 @@
 	return pldm_msgbuf_destroy_consumed(buf);
 }
 
+LIBPLDM_ABI_TESTING
 int encode_pldm_message_poll_event_data(uint8_t format_version,
 					uint16_t event_id,
 					uint32_t data_transfer_handle,
@@ -1920,6 +1965,8 @@
 
 	return pldm_msgbuf_destroy(buf);
 }
+
+LIBPLDM_ABI_STABLE
 int decode_pldm_pdr_repository_change_record_data(
 	const uint8_t *change_record_data, size_t change_record_data_size,
 	uint8_t *event_data_operation, uint8_t *number_of_change_entries,
@@ -1949,6 +1996,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_sensor_reading_req(uint8_t instance_id, uint16_t sensor_id,
 				  uint8_t rearm_event_state,
 				  struct pldm_msg *msg)
@@ -1977,6 +2025,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_sensor_reading_resp(
 	const struct pldm_msg *msg, size_t payload_length,
 	uint8_t *completion_code, uint8_t *sensor_data_size,
@@ -2032,6 +2081,7 @@
 	return pldm_msgbuf_destroy_consumed(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_get_sensor_reading_resp(uint8_t instance_id, uint8_t completion_code,
 				   uint8_t sensor_data_size,
 				   uint8_t sensor_operational_state,
@@ -2102,6 +2152,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_get_sensor_reading_req(const struct pldm_msg *msg,
 				  size_t payload_length, uint16_t *sensor_id,
 				  uint8_t *rearm_event_state)
@@ -2126,6 +2177,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int encode_set_event_receiver_req(uint8_t instance_id,
 				  uint8_t event_message_global_enable,
 				  uint8_t transport_protocol_type,
@@ -2170,6 +2222,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int decode_set_event_receiver_resp(const struct pldm_msg *msg,
 				   size_t payload_length,
 				   uint8_t *completion_code)
@@ -2193,6 +2246,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_set_event_receiver_req(const struct pldm_msg *msg,
 				  size_t payload_length,
 				  uint8_t *event_message_global_enable,
@@ -2236,6 +2290,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_set_event_receiver_resp(uint8_t instance_id, uint8_t completion_code,
 				   struct pldm_msg *msg)
 
@@ -2260,6 +2315,7 @@
 	return PLDM_SUCCESS;
 }
 
+LIBPLDM_ABI_STABLE
 int encode_poll_for_platform_event_message_req(uint8_t instance_id,
 					       uint8_t format_version,
 					       uint8_t transfer_operation_flag,
@@ -2302,6 +2358,7 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
+LIBPLDM_ABI_STABLE
 int decode_poll_for_platform_event_message_resp(
 	const struct pldm_msg *msg, size_t payload_length,
 	uint8_t *completion_code, uint8_t *tid, uint16_t *event_id,
diff --git a/src/requester/instance-id.c b/src/requester/instance-id.c
index 82e3ed1..10d5988 100644
--- a/src/requester/instance-id.c
+++ b/src/requester/instance-id.c
@@ -1,5 +1,6 @@
 // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
 #define _GNU_SOURCE
+#include "config.h"
 #include "libpldm/instance-id.h"
 #include "libpldm/pldm.h"
 #include <errno.h>
@@ -30,6 +31,7 @@
 	return (cur + 1) % PLDM_INST_ID_MAX;
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_instance_db_init(struct pldm_instance_db **ctx, const char *dbpath)
 {
 	struct pldm_instance_db *l_ctx;
@@ -78,12 +80,14 @@
 	return 0;
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_instance_db_init_default(struct pldm_instance_db **ctx)
 {
 	return pldm_instance_db_init(ctx,
 				     "/usr/share/libpldm/instance-db/default");
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_instance_db_destroy(struct pldm_instance_db *ctx)
 {
 	if (!ctx) {
@@ -94,6 +98,7 @@
 	return 0;
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_instance_id_alloc(struct pldm_instance_db *ctx, pldm_tid_t tid,
 			   pldm_instance_id_t *iid)
 {
@@ -182,6 +187,7 @@
 	return -EAGAIN;
 }
 
+LIBPLDM_ABI_STABLE
 int pldm_instance_id_free(struct pldm_instance_db *ctx, pldm_tid_t tid,
 			  pldm_instance_id_t iid)
 {
diff --git a/src/requester/pldm.c b/src/requester/pldm.c
index 21e402e..b50dbbf 100644
--- a/src/requester/pldm.c
+++ b/src/requester/pldm.c
@@ -1,3 +1,4 @@
+#include "config.h"
 #include "libpldm/requester/pldm.h"
 #include "base.h"
 #include "libpldm/transport.h"
@@ -25,6 +26,7 @@
  */
 static struct pldm_transport_mctp_demux *open_transport;
 
+LIBPLDM_ABI_STABLE
 pldm_requester_rc_t pldm_open(void)
 {
 	int fd;
@@ -86,6 +88,7 @@
 		return rc;                                                       \
 	} while (0)
 
+LIBPLDM_ABI_STABLE
 pldm_requester_rc_t pldm_recv_any(mctp_eid_t eid, int mctp_fd,
 				  uint8_t **pldm_resp_msg, size_t *resp_msg_len)
 {
@@ -93,6 +96,7 @@
 		    (void **)pldm_resp_msg, resp_msg_len);
 }
 
+LIBPLDM_ABI_STABLE
 pldm_requester_rc_t pldm_recv(mctp_eid_t eid, int mctp_fd,
 			      __attribute__((unused)) uint8_t instance_id,
 			      uint8_t **pldm_resp_msg, size_t *resp_msg_len)
@@ -108,6 +112,7 @@
 	return rc;
 }
 
+LIBPLDM_ABI_STABLE
 pldm_requester_rc_t pldm_send_recv(mctp_eid_t eid, int mctp_fd,
 				   const uint8_t *pldm_req_msg,
 				   size_t req_msg_len, uint8_t **pldm_resp_msg,
@@ -117,6 +122,7 @@
 		    req_msg_len, (void **)pldm_resp_msg, resp_msg_len);
 }
 
+LIBPLDM_ABI_STABLE
 pldm_requester_rc_t pldm_send(mctp_eid_t eid, int mctp_fd,
 			      const uint8_t *pldm_req_msg, size_t req_msg_len)
 {
@@ -126,6 +132,7 @@
 
 /* Adding this here for completeness in the case we can't smoothly
  * transition apps over to the new api */
+LIBPLDM_ABI_STABLE
 void pldm_close(void)
 {
 	if (open_transport) {
diff --git a/src/transport/af-mctp.c b/src/transport/af-mctp.c
index f499a72..5084f7d 100644
--- a/src/transport/af-mctp.c
+++ b/src/transport/af-mctp.c
@@ -1,4 +1,5 @@
-#include "../mctp-defines.h"
+#include "config.h"
+#include "mctp-defines.h"
 #include "base.h"
 #include "container-of.h"
 #include "libpldm/pldm.h"
@@ -25,12 +26,14 @@
 #define transport_to_af_mctp(ptr)                                              \
 	container_of(ptr, struct pldm_transport_af_mctp, transport)
 
+LIBPLDM_ABI_TESTING
 struct pldm_transport *
 pldm_transport_af_mctp_core(struct pldm_transport_af_mctp *ctx)
 {
 	return &ctx->transport;
 }
 
+LIBPLDM_ABI_TESTING
 int pldm_transport_af_mctp_init_pollfd(struct pldm_transport *t,
 				       struct pollfd *pollfd)
 {
@@ -54,6 +57,7 @@
 	return -1;
 }
 
+LIBPLDM_ABI_TESTING
 int pldm_transport_af_mctp_map_tid(struct pldm_transport_af_mctp *ctx,
 				   pldm_tid_t tid, mctp_eid_t eid)
 {
@@ -62,6 +66,7 @@
 	return 0;
 }
 
+LIBPLDM_ABI_TESTING
 int pldm_transport_af_mctp_unmap_tid(struct pldm_transport_af_mctp *ctx,
 				     __attribute__((unused)) pldm_tid_t tid,
 				     mctp_eid_t eid)
@@ -122,6 +127,7 @@
 	return PLDM_REQUESTER_SUCCESS;
 }
 
+LIBPLDM_ABI_TESTING
 int pldm_transport_af_mctp_init(struct pldm_transport_af_mctp **ctx)
 {
 	if (!ctx || *ctx) {
@@ -147,6 +153,7 @@
 	return 0;
 }
 
+LIBPLDM_ABI_TESTING
 void pldm_transport_af_mctp_destroy(struct pldm_transport_af_mctp *ctx)
 {
 	if (!ctx) {
diff --git a/src/transport/mctp-demux.c b/src/transport/mctp-demux.c
index 91946d2..466d33c 100644
--- a/src/transport/mctp-demux.c
+++ b/src/transport/mctp-demux.c
@@ -1,4 +1,5 @@
-#include "../mctp-defines.h"
+#include "config.h"
+#include "mctp-defines.h"
 #include "base.h"
 #include "container-of.h"
 #include "libpldm/pldm.h"
@@ -28,6 +29,7 @@
 #define transport_to_demux(ptr)                                                \
 	container_of(ptr, struct pldm_transport_mctp_demux, transport)
 
+LIBPLDM_ABI_TESTING
 struct pldm_transport *
 pldm_transport_mctp_demux_core(struct pldm_transport_mctp_demux *ctx)
 {
@@ -61,6 +63,7 @@
 	return fd;
 }
 
+LIBPLDM_ABI_TESTING
 int pldm_transport_mctp_demux_init_pollfd(struct pldm_transport *t,
 					  struct pollfd *pollfd)
 {
@@ -85,6 +88,7 @@
 	return -1;
 }
 
+LIBPLDM_ABI_TESTING
 int pldm_transport_mctp_demux_map_tid(struct pldm_transport_mctp_demux *ctx,
 				      pldm_tid_t tid, mctp_eid_t eid)
 {
@@ -93,6 +97,7 @@
 	return 0;
 }
 
+LIBPLDM_ABI_TESTING
 int pldm_transport_mctp_demux_unmap_tid(struct pldm_transport_mctp_demux *ctx,
 					__attribute__((unused)) pldm_tid_t tid,
 					mctp_eid_t eid)
@@ -183,6 +188,7 @@
 	return PLDM_REQUESTER_SUCCESS;
 }
 
+LIBPLDM_ABI_TESTING
 int pldm_transport_mctp_demux_init(struct pldm_transport_mctp_demux **ctx)
 {
 	if (!ctx || *ctx) {
@@ -209,6 +215,7 @@
 	return 0;
 }
 
+LIBPLDM_ABI_TESTING
 void pldm_transport_mctp_demux_destroy(struct pldm_transport_mctp_demux *ctx)
 {
 	if (!ctx) {
@@ -219,6 +226,7 @@
 }
 
 /* Temporary for old API */
+LIBPLDM_ABI_TESTING
 struct pldm_transport_mctp_demux *
 pldm_transport_mctp_demux_init_with_fd(int mctp_fd)
 {
@@ -244,6 +252,7 @@
 	return demux;
 }
 
+LIBPLDM_ABI_TESTING
 int pldm_transport_mctp_demux_get_socket_fd(
 	struct pldm_transport_mctp_demux *ctx)
 {
diff --git a/src/transport/transport.c b/src/transport/transport.c
index 77a33f8..0cbef29 100644
--- a/src/transport/transport.c
+++ b/src/transport/transport.c
@@ -1,3 +1,4 @@
+#include "config.h"
 #include "libpldm/transport.h"
 #include "base.h"
 #include "libpldm/requester/pldm.h"
@@ -29,6 +30,7 @@
 }
 #endif
 
+LIBPLDM_ABI_TESTING
 pldm_requester_rc_t pldm_transport_poll(struct pldm_transport *transport,
 					int timeout)
 {
@@ -50,6 +52,7 @@
 	return PLDM_REQUESTER_SUCCESS;
 }
 
+LIBPLDM_ABI_TESTING
 pldm_requester_rc_t pldm_transport_send_msg(struct pldm_transport *transport,
 					    pldm_tid_t tid,
 					    const void *pldm_req_msg,
@@ -71,6 +74,7 @@
 	return transport->send(transport, tid, pldm_req_msg, req_msg_len);
 }
 
+LIBPLDM_ABI_TESTING
 pldm_requester_rc_t pldm_transport_recv_msg(struct pldm_transport *transport,
 					    pldm_tid_t tid,
 					    void **pldm_resp_msg,
@@ -146,6 +150,7 @@
 	return 0;
 }
 
+LIBPLDM_ABI_TESTING
 pldm_requester_rc_t
 pldm_transport_send_recv_msg(struct pldm_transport *transport, pldm_tid_t tid,
 			     const void *pldm_req_msg, size_t req_msg_len,
diff --git a/src/utils.c b/src/utils.c
index 6fe93d1..5547002 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -1,3 +1,4 @@
+#include "config.h"
 #include "utils.h"
 #include "base.h"
 #include <limits.h>
@@ -83,6 +84,7 @@
 	0xfa, 0xfd, 0xf4, 0xf3
 };
 
+LIBPLDM_ABI_STABLE
 uint32_t crc32(const void *data, size_t size)
 {
 	const uint8_t *p = data;
@@ -93,6 +95,7 @@
 	return crc ^ ~0U;
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t crc8(const void *data, size_t size)
 {
 	const uint8_t *p = data;
@@ -114,6 +117,8 @@
 		}                                                              \
 	}
 #define INSERT_INT(i, b, n) INSERT_CHAR(AS_CHAR(i), (b), (n))
+
+LIBPLDM_ABI_STABLE
 ssize_t ver2str(const ver32_t *version, char *buffer, size_t buffer_size)
 {
 	ssize_t remaining;
@@ -158,37 +163,44 @@
 	return (ssize_t)buffer_size - remaining;
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t bcd2dec8(uint8_t bcd)
 {
 	return (bcd >> 4) * 10 + (bcd & 0x0f);
 }
 
+LIBPLDM_ABI_STABLE
 uint8_t dec2bcd8(uint8_t dec)
 {
 	return ((dec / 10) << 4) + (dec % 10);
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t bcd2dec16(uint16_t bcd)
 {
 	return bcd2dec8(bcd >> 8) * 100 + bcd2dec8(bcd & 0xff);
 }
 
+LIBPLDM_ABI_STABLE
 uint16_t dec2bcd16(uint16_t dec)
 {
 	return dec2bcd8(dec % 100) | ((uint16_t)(dec2bcd8(dec / 100)) << 8);
 }
 
+LIBPLDM_ABI_STABLE
 uint32_t bcd2dec32(uint32_t bcd)
 {
 	return bcd2dec16(bcd >> 16) * 10000 + bcd2dec16(bcd & 0xffff);
 }
 
+LIBPLDM_ABI_STABLE
 uint32_t dec2bcd32(uint32_t dec)
 {
 	return dec2bcd16(dec % 10000) |
 	       ((uint32_t)(dec2bcd16(dec / 10000)) << 16);
 }
 
+LIBPLDM_ABI_STABLE
 bool is_time_legal(uint8_t seconds, uint8_t minutes, uint8_t hours, uint8_t day,
 		   uint8_t month, uint16_t year)
 {
@@ -209,6 +221,7 @@
 	return true;
 }
 
+LIBPLDM_ABI_STABLE
 bool is_transfer_flag_valid(uint8_t transfer_flag)
 {
 	switch (transfer_flag) {