meta/saiserialize.h (190 lines of code) (raw):

/** * Copyright (c) 2014 Microsoft Open Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT * LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS * FOR A PARTICULAR PURPOSE, MERCHANTABILITY OR NON-INFRINGEMENT. * * See the Apache Version 2.0 License for specific language governing * permissions and limitations under the License. * * Microsoft would like to thank the following companies for their review and * assistance with these files: Intel Corporation, Mellanox Technologies Ltd, * Dell Products, L.P., Facebook, Inc., Marvell International Ltd. * * @file saiserialize.h * * @brief This module defines SAI Serialize methods */ #ifndef __SAISERIALIZE_H_ #define __SAISERIALIZE_H_ /** * @defgroup SAISERIALIZE SAI - Serialize Definitions * * @{ */ /** * @def SAI_SERIALIZE_ERROR * * Returned from serialize/deserialize methods on any error. * Meta log functions are used to produce specific error message. */ #define SAI_SERIALIZE_ERROR (-1) /** * @def SAI_CHARDATA_LENGTH * * Defines size of char data inside sai_attribute_value_t union. */ #define SAI_CHARDATA_LENGTH 32 /** * @brief Is char allowed. * * Function checks if given char is one of the following: * - '\0', '"', ',', ']', '}' * * Since serialization is done to json format, after each value * there may be some characters specific to json format, like: * * * quote, if value was in quotes (string) * * comma, if value was without quotes but an item in array (number, bool) * * square bracket, if item was last item in array (number, bool) * * curly bracket, if item was last item in object (number, bool) * * This means that deserialize is "relaxed", so each item don't need to end * as zero '\0' but it can end on any of those characters. This allows us to * deserialize json string reading it directly without creating json object * tree and without any extra string copy. For example if we have item: * {"foo":true}, we can just read value "true}" and ignore last character and * still value will be deserialized correctly. * * This is not ideal solution, but in this case it will work just fine. * * NOTE: All auto generated methods will enforce to check extra characters at * the end of each value. */ bool sai_serialize_is_char_allowed( _In_ char c); /** * @brief Serialize bool value. * * @param[out] buffer Output buffer for serialized value. * @param[in] flag Bool flag to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_bool( _Out_ char *buffer, _In_ bool flag); /** * @brief Deserialize bool value. * * @param[in] buffer Input buffer to be examined. * @param[out] flag Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_bool( _In_ const char *buffer, _Out_ bool *flag); /** * @brief Serialize char data value. * * All printable characters (isprint) are allowed except '\' and '"'. * * @param[out] buffer Output buffer for serialized value. * @param[in] data Data to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_chardata( _Out_ char *buffer, _In_ const char data[SAI_CHARDATA_LENGTH]); /** * @brief Deserialize char data value. * * @param[in] buffer Input buffer to be examined. * @param[out] data Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_chardata( _In_ const char *buffer, _Out_ char data[SAI_CHARDATA_LENGTH]); /** * @brief Serialize 8 bit unsigned integer. * * @param[out] buffer Output buffer for serialized value. * @param[in] u8 Deserialized value. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_uint8( _Out_ char *buffer, _In_ uint8_t u8); /** * @brief Deserialize 8 bit unsigned integer. * * @param[in] buffer Input buffer to be examined. * @param[out] u8 Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_uint8( _In_ const char *buffer, _Out_ uint8_t *u8); /** * @brief Serialize 8 bit signed integer. * * @param[out] buffer Output buffer for serialized value. * @param[in] u8 Integer to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_int8( _Out_ char *buffer, _In_ int8_t u8); /** * @brief Deserialize 8 bit signed integer. * * @param[in] buffer Input buffer to be examined. * @param[out] s8 Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_int8( _In_ const char *buffer, _Out_ int8_t *s8); /** * @brief Serialize 16 bit unsigned integer. * * @param[out] buffer Output buffer for serialized value. * @param[in] u16 Integer to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_uint16( _Out_ char *buffer, _In_ uint16_t u16); /** * @brief Deserialize 16 bit unsigned integer. * * @param[in] buffer Input buffer to be examined. * @param[out] u16 Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_uint16( _In_ const char *buffer, _Out_ uint16_t *u16); /** * @brief Serialize 16 bit signed integer. * * @param[out] buffer Output buffer for serialized value. * @param[in] s16 Integer to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_int16( _Out_ char *buffer, _In_ int16_t s16); /** * @brief Deserialize 16 bit signed integer. * * @param[in] buffer Input buffer to be examined. * @param[out] s16 Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_int16( _In_ const char *buffer, _Out_ int16_t *s16); /** * @brief Serialize 32 bit unsigned integer. * * @param[out] buffer Output buffer for serialized value. * @param[in] u32 Integer to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_uint32( _Out_ char *buffer, _In_ uint32_t u32); /** * @brief Deserialize 32 bit unsigned integer. * * @param[in] buffer Input buffer to be examined. * @param[out] u32 Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_uint32( _In_ const char *buffer, _Out_ uint32_t *u32); /** * @brief Serialize 32 bit signed integer. * * @param[out] buffer Output buffer for serialized value. * @param[in] s32 Integer to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_int32( _Out_ char *buffer, _In_ int32_t s32); /** * @brief Deserialize 32 bit signed integer. * * @param[in] buffer Input buffer to be examined. * @param[out] s32 Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_int32( _In_ const char *buffer, _Out_ int32_t *s32); /** * @brief Serialize 64 bit unsigned integer. * * @param[out] buffer Output buffer for serialized value. * @param[in] u64 Integer to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_uint64( _Out_ char *buffer, _In_ uint64_t u64); /** * @brief Deserialize 64 bit unsigned integer. * * @param[in] buffer Input buffer to be examined. * @param[out] u64 Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_uint64( _In_ const char *buffer, _Out_ uint64_t *u64); /** * @brief Serialize 64 bit signed integer. * * @param[out] buffer Output buffer for serialized value. * @param[in] s64 Integer to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_int64( _Out_ char *buffer, _In_ int64_t s64); /** * @brief Deserialize 64 bit signed integer. * * @param[in] buffer Input buffer to be examined. * @param[out] s64 Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_int64( _In_ const char *buffer, _Out_ int64_t *s64); /** * @brief Serialize sai_size_t. * * @param[out] buffer Output buffer for serialized value. * @param[in] size Size to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_size( _Out_ char *buffer, _In_ sai_size_t size); /** * @brief Deserialize sai_size_t. * * @param[in] buffer Input buffer to be examined. * @param[out] size Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_size( _In_ const char *buffer, _Out_ sai_size_t *size); /** * @brief Serialize object ID. * * @param[out] buffer Output buffer for serialized value. * @param[in] object_id Object ID to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_object_id( _Out_ char *buffer, _In_ sai_object_id_t object_id); /** * @brief Deserialize object Id. * * @param[in] buffer Input buffer to be examined. * @param[out] object_id Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_object_id( _In_ const char *buffer, _Out_ sai_object_id_t *object_id); /** * @brief Serialize MAC address. * * @param[out] buffer Output buffer for serialized value. * @param[in] mac_address MAC address to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_mac( _Out_ char *buffer, _In_ const sai_mac_t mac_address); /** * @brief Deserialize MAC address. * * @param[in] buffer Input buffer to be examined. * @param[out] mac Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_mac( _In_ const char *buffer, _Out_ sai_mac_t mac); /** * @brief Serialize encrypt_key. * * @param[out] buffer Output buffer for serialized value. * @param[in] key The encrypt_key to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_encrypt_key( _Out_ char *buffer, _In_ const sai_encrypt_key_t key); /** * @brief Deserialize encrypt_key. * * @param[in] buffer Input buffer to be examined. * @param[out] key The encrypt_key deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_encrypt_key( _In_ const char *buffer, _Out_ sai_encrypt_key_t key); /** * @brief Serialize auth_key. * * @param[out] buffer Output buffer for serialized value. * @param[in] auth The auth_key to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_auth_key( _Out_ char *buffer, _In_ const sai_auth_key_t auth); /** * @brief Deserialize auth_key. * * @param[in] buffer Input buffer to be examined. * @param[out] auth The auth_key deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_auth_key( _In_ const char *buffer, _Out_ sai_auth_key_t auth); /** * @brief Serialize macsec_sak. * * @param[out] buffer Output buffer for serialized value. * @param[in] sak The macsec_sak to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_macsec_sak( _Out_ char *buffer, _In_ const sai_macsec_sak_t sak); /** * @brief Deserialize macsec_sak. * * @param[in] buffer Input buffer to be examined. * @param[out] sak The macsec_sak deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_macsec_sak( _In_ const char *buffer, _Out_ sai_macsec_sak_t sak); /** * @brief Serialize macsec_auth_key. * * @param[out] buffer Output buffer for serialized value. * @param[in] auth The macsec_auth_key to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_macsec_auth_key( _Out_ char *buffer, _In_ const sai_macsec_auth_key_t auth); /** * @brief Deserialize macsec_auth_key. * * @param[in] buffer Input buffer to be examined. * @param[out] auth The macsec_auth_key deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_macsec_auth_key( _In_ const char *buffer, _Out_ sai_macsec_auth_key_t auth); /** * @brief Serialize macsec_salt. * * @param[out] buffer Output buffer for serialized value. * @param[in] salt The macsec_salt to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_macsec_salt( _Out_ char *buffer, _In_ const sai_macsec_salt_t salt); /** * @brief Deserialize macsec_salt. * * @param[in] buffer Input buffer to be examined. * @param[out] salt The macsec_salt Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_macsec_salt( _In_ const char *buffer, _Out_ sai_macsec_salt_t salt); /** * @brief Serialize enum value. * * Buffer will contain actual enum name of number if enum * value was not found in specified enum metadata. * * @param[out] buffer Output buffer for serialized value. * @param[in] meta Enum metadata for serialization info. * @param[in] value Enum value to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_enum( _Out_ char *buffer, _In_ const sai_enum_metadata_t *meta, _In_ int32_t value); /** * @brief Deserialize enum value. * * If buffer will not contain valid enum name, function will attempt to * deserialize value as signed 32 bit integer. * * @param[in] buffer Input buffer to be examined. * @param[in] meta Enum metadata. * @param[out] value Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_enum( _In_ const char *buffer, _In_ const sai_enum_metadata_t *meta, _Out_ int32_t *value); /** * @brief Serialize IPv4 address. * * @param[out] buffer Output buffer for serialized value. * @param[in] ip4 IP address to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_ip4( _Out_ char *buffer, _In_ const sai_ip4_t ip4); /** * @brief Deserialize IPv4 address. * * @param[in] buffer Input buffer to be examined. * @param[out] ip4 Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_ip4( _In_ const char *buffer, _Out_ sai_ip4_t *ip4); /** * @brief Serialize IPv6 address. * * @param[out] buffer Output buffer for serialized value. * @param[in] ip6 IP address to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_ip6( _Out_ char *buffer, _In_ const sai_ip6_t ip6); /** * @brief Deserialize IPv6 address. * * @param[in] buffer Input buffer to be examined. * @param[out] ip6 Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_ip6( _In_ const char *buffer, _Out_ sai_ip6_t ip6); /** * @brief Serialize IP address. * * @param[out] buffer Output buffer for serialized value. * @param[in] ip_address IP address to be serialized * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_ip_address( _Out_ char *buffer, _In_ const sai_ip_address_t *ip_address); /** * @brief Deserialize IP address. * * @param[in] buffer Input buffer to be examined. * @param[out] ip_address Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_ip_address( _In_ const char *buffer, _Out_ sai_ip_address_t *ip_address); /** * @brief Serialize IP prefix. * * @param[out] buffer Output buffer for serialized value. * @param[in] ip_prefix IP prefix to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_ip_prefix( _Out_ char *buffer, _In_ const sai_ip_prefix_t *ip_prefix); /** * @brief Deserialize IP prefix. * * @param[in] buffer Input buffer to be examined. * @param[out] ip_prefix Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_ip_prefix( _In_ const char *buffer, _Out_ sai_ip_prefix_t *ip_prefix); /** * @brief Serialize IPv4 mask. * * Mask will be serialized as single number like. * Holes in mask are not supported. * * @param[out] buffer Output buffer for serialized value. * @param[in] ip4_mask IPv4 mask to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_ip4_mask( _Out_ char *buffer, _In_ sai_ip4_t ip4_mask); /** * @brief Deserialize IPv4 mask. * * @param[in] buffer Input buffer to be examined. * @param[out] ip4_mask Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_ip4_mask( _In_ const char *buffer, _Out_ sai_ip4_t *ip4_mask); /** * @brief Serialize IPv6 mask. * * Mask will be serialized as single number like. * Holes in mask are not supported. * * @param[out] buffer Output buffer for serialized value. * @param[in] ip6_mask IPv6 mask to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_ip6_mask( _Out_ char *buffer, _In_ const sai_ip6_t ip6_mask); /** * @brief Deserialize IPv6 mask. * * @param[in] buffer Input buffer to be examined. * @param[out] ip6_mask Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_ip6_mask( _In_ const char *buffer, _Out_ sai_ip6_t ip6_mask); /** * @brief Serialize pointer. * * @param[out] buffer Output buffer for serialized value. * @param[in] pointer Pointer to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_pointer( _Out_ char *buffer, _In_ const sai_pointer_t pointer); /** * @brief Deserialize pointer. * * @param[in] buffer Input buffer to be examined. * @param[out] pointer Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_pointer( _In_ const char *buffer, _Out_ sai_pointer_t *pointer); /** * @brief Serialize enum list. * * If enum metadata is null, then list is serialized using * sai_serialize_s32_list and it will not contain quotes. * * @param[out] buffer Output buffer for serialized value. * @param[in] meta Enum metadata used to serialize. * @param[in] s32_list List of enum values to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_enum_list( _Out_ char *buffer, _In_ const sai_enum_metadata_t *meta, _In_ const sai_s32_list_t *s32_list); /** * @brief Deserialize enum list. * * If enum metadata is null, then list is deserialized using * sai_deserialize_s32_list and it will not contain quotes. * * @param[in] buffer Input buffer to be examined. * @param[in] meta Enum metadata. * @param[out] s32_list Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_enum_list( _In_ const char *buffer, _In_ const sai_enum_metadata_t *meta, _Out_ sai_s32_list_t *s32_list); /** * @brief Serialize attribute id. * * @param[out] buffer Output buffer for serialized value. * @param[in] meta Attribute metadata. * @param[in] attr_id Attribute id to be serialized * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_attr_id( _Out_ char *buffer, _In_ const sai_attr_metadata_t *meta, _In_ sai_attr_id_t attr_id); /** * @brief Deserialize attribute id. * * Metadata is not needed since attribute ID is serialized as string, and it * can point to unique attribute metadata. * * @param[in] buffer Input buffer to be examined. * @param[out] attr_id Deserialized attribute id. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_attr_id( _In_ const char *buffer, _Out_ sai_attr_id_t *attr_id); /** * @brief Serialize SAI attribute. * * @param[out] buffer Output buffer for serialized value. * @param[in] meta Attribute metadata. * @param[in] attribute Attribute to be serialized. * * @return Number of characters written to buffer excluding '\0', * or #SAI_SERIALIZE_ERROR on error. */ int sai_serialize_attribute( _Out_ char *buffer, _In_ const sai_attr_metadata_t *meta, _In_ const sai_attribute_t *attribute); /** * @brief Deserialize SAI attribute. * * Metadata is not needed since attribute ID is serialized as string, and it * can point to unique attribute metadata. * * @param[in] buffer Input buffer to be examined. * @param[out] attribute Deserialized value. * * @return Number of characters consumed from the buffer, * or #SAI_SERIALIZE_ERROR on error. */ int sai_deserialize_attribute( _In_ const char *buffer, _Out_ sai_attribute_t *attribute); /** * @brief Free SAI attribute. * * @param[in] meta Attribute metadata. * @param[in] attribute Attribute to be freed. */ void sai_free_attribute( _In_ const sai_attr_metadata_t *meta, _In_ const sai_attribute_t *attribute); /** * @} */ #endif /** __SAISERIALIZE_H_ */