@@ -29,14 +29,19 @@ static_assert(sizeof(sai_object_id_t) == sizeof(uint64_t), "SAI object ID size s
2929#define SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX ( (1ULL << SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE) - 1 )
3030#define SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MASK (SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX)
3131
32- #define SAI_REDIS_OBJECT_INDEX_BITS_SIZE ( 39 )
32+ #define SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE ( 1 )
33+ #define SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_MAX ( (1ULL << SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE) - 1 )
34+ #define SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_MASK (SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_MAX)
35+
36+ #define SAI_REDIS_OBJECT_INDEX_BITS_SIZE ( 38 )
3337#define SAI_REDIS_OBJECT_INDEX_MAX ( (1ULL << SAI_REDIS_OBJECT_INDEX_BITS_SIZE) - 1 )
3438#define SAI_REDIS_OBJECT_INDEX_MASK (SAI_REDIS_OBJECT_INDEX_MAX)
3539
3640#define SAI_REDIS_OBJECT_ID_BITS_SIZE ( \
3741 SAI_REDIS_SWITCH_INDEX_BITS_SIZE + \
3842 SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + \
3943 SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + \
44+ SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + \
4045 SAI_REDIS_OBJECT_TYPE_BITS_SIZE + \
4146 SAI_REDIS_OBJECT_INDEX_BITS_SIZE )
4247
@@ -49,6 +54,8 @@ static_assert(SAI_REDIS_OBJECT_ID_BITS_SIZE == SAI_OBJECT_ID_BITS_SIZE, "redis o
4954static_assert (SAI_OBJECT_TYPE_MAX < 256 , " object type must be possible to encode on 1 byte" );
5055static_assert ((SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START) < 256 ,
5156 " extensions object type must be possible to encode on 1 byte" );
57+ static_assert ((SAI_OBJECT_TYPE_CUSTOM_RANGE_END - SAI_OBJECT_TYPE_CUSTOM_RANGE_START) < 256 ,
58+ " custom object type must be possible to encode on 1 byte" );
5259
5360/*
5461 * Current OBJECT ID format:
@@ -57,7 +64,8 @@ static_assert((SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END - SAI_OBJECT_TYPE_EXTENSIONS
5764 * bits 55..48 - SAI object type
5865 * bits 47..40 - global context
5966 * bits 39..39 - object type extensions flag
60- * bits 38..0 - object index
67+ * bits 38..38 - object type custom flag
68+ * bits 37..0 - object index
6169 *
6270 * So large number of bits is required, otherwise we would need to have map of
6371 * OID to some struct that will have all those values. But having all this
@@ -66,33 +74,41 @@ static_assert((SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END - SAI_OBJECT_TYPE_EXTENSIONS
6674 * To be backward compatible with previous sairedis, we will still encode base
6775 * object type on bit's 55..48, and extensions which will now start from range
6876 * 0x20000000, will be encoded from 0x0, but extensions flag will be set to 1.
77+ * Custom types starting from SAI_OBJECT_TYPE_CUSTOM_RANGE_BASE will be encoded
78+ * from 0x0, but custom flag will be set to 1.
6979 *
7080 * For example SAI_OBJECT_TYPE_VIRTUAL_ROUTER oid will be encoded as 0x0003000000000001,
71- * SAI_OBJECT_TYPE_DASH_ACL_GROUP oid will be encoded as 0x0003008000000001.
81+ * SAI_OBJECT_TYPE_DASH_ACL_GROUP oid will be encoded as 0x0003008000000001,
82+ * SAI_OBJECT_TYPE_CUSTOM_RANGE_BASE + n oid will be encoded as 0x0003004000000001.
7283 */
7384
7485#define SAI_REDIS_GET_OBJECT_INDEX (oid ) \
7586 ( ((uint64_t )oid) & ( SAI_REDIS_OBJECT_INDEX_MASK ) )
7687
88+ #define SAI_REDIS_GET_OBJECT_TYPE_CUSTOM_FLAG (oid ) \
89+ ( (((uint64_t )oid) >> (SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_MAX ) )
90+
7791#define SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG (oid ) \
78- ( (((uint64_t )oid) >> (SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX ) )
92+ ( (((uint64_t )oid) >> (SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX ) )
7993
8094#define SAI_REDIS_GET_GLOBAL_CONTEXT (oid ) \
81- ( (((uint64_t )oid) >> (SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_GLOBAL_CONTEXT_MASK ) )
95+ ( (((uint64_t )oid) >> (SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_GLOBAL_CONTEXT_MASK ) )
8296
8397#define SAI_REDIS_GET_OBJECT_TYPE (oid ) \
84- ( (((uint64_t )oid) >> ( SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_OBJECT_TYPE_MASK ) )
98+ ( (((uint64_t )oid) >> ( SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_OBJECT_TYPE_MASK ) )
8599
86100#define SAI_REDIS_GET_SWITCH_INDEX (oid ) \
87- ( (((uint64_t )oid) >> ( SAI_REDIS_OBJECT_TYPE_BITS_SIZE + SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_SWITCH_INDEX_MASK ) )
101+ ( (((uint64_t )oid) >> ( SAI_REDIS_OBJECT_TYPE_BITS_SIZE + SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_SWITCH_INDEX_MASK ) )
88102
89103#define SAI_REDIS_TEST_OID (0x012345e789abcdef )
90104
91105static_assert (SAI_REDIS_GET_SWITCH_INDEX(SAI_REDIS_TEST_OID) == 0x01 , " test switch index" );
92106static_assert (SAI_REDIS_GET_OBJECT_TYPE(SAI_REDIS_TEST_OID) == 0x23 , " test object type" );
93107static_assert (SAI_REDIS_GET_GLOBAL_CONTEXT(SAI_REDIS_TEST_OID) == 0x45 , " test global context" );
94- static_assert (SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG(SAI_REDIS_TEST_OID) == 0x1 , " test object type extensions flag" );
95- static_assert (SAI_REDIS_GET_OBJECT_INDEX(SAI_REDIS_TEST_OID) == 0x6789abcdef , " test object index" );
108+ static_assert (SAI_REDIS_GET_OBJECT_TYPE_CUSTOM_FLAG(SAI_REDIS_TEST_OID) == 0x01 , " test custom flag" );
109+ static_assert (SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG(SAI_REDIS_TEST_OID) == 0x01 , " test extensions flag" );
110+ static_assert (SAI_REDIS_GET_OBJECT_INDEX(SAI_REDIS_TEST_OID) == 0x2789abcdef , " test object index" );
111+ static_assert ((SAI_REDIS_SWITCH_INDEX_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_BITS_SIZE + SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) == 64 , " Total bits must sum to 64" );
96112
97113using namespace sairedis ;
98114
@@ -162,9 +178,22 @@ sai_object_type_t VirtualObjectIdManager::saiObjectTypeQuery(
162178 return SAI_OBJECT_TYPE_NULL;
163179 }
164180
165- sai_object_type_t objectType = SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG (objectId)
166- ? (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START)
167- : (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId));
181+ uint64_t extensionsFlag = SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG (objectId);
182+ uint64_t customFlag = SAI_REDIS_GET_OBJECT_TYPE_CUSTOM_FLAG (objectId);
183+
184+ sai_object_type_t objectType;
185+ if (customFlag)
186+ {
187+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId) + SAI_OBJECT_TYPE_CUSTOM_RANGE_START);
188+ }
189+ else if (extensionsFlag)
190+ {
191+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START);
192+ }
193+ else
194+ {
195+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId));
196+ }
168197
169198 if (sai_metadata_is_object_type_valid (objectType) == false )
170199 {
@@ -379,18 +408,25 @@ sai_object_id_t VirtualObjectIdManager::constructObjectId(
379408 SWSS_LOG_THROW (" FATAL: invalid object type (0x%x), logic error, this is a bug!" , objectType);
380409 }
381410
411+ uint64_t customFlag = (uint64_t )objectType >= SAI_OBJECT_TYPE_CUSTOM_RANGE_START && (uint64_t )objectType < SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START;
382412 uint64_t extensionsFlag = (uint64_t )objectType >= SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START;
383413
384- objectType = extensionsFlag
385- ? (sai_object_type_t )(objectType - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START)
386- : objectType;
414+ if (customFlag)
415+ {
416+ objectType = (sai_object_type_t )(objectType - SAI_OBJECT_TYPE_CUSTOM_RANGE_START);
417+ }
418+ else if (extensionsFlag)
419+ {
420+ objectType = (sai_object_type_t )(objectType - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START);
421+ }
387422
388423 return (sai_object_id_t )(
389- ((uint64_t )switchIndex << (SAI_REDIS_OBJECT_TYPE_BITS_SIZE + SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) |
390- ((uint64_t )objectType << (SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) |
391- ((uint64_t )globalContext << (SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) |
392- ((uint64_t )extensionsFlag << (SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) |
393- objectIndex);
424+ ((uint64_t )switchIndex << (SAI_REDIS_OBJECT_TYPE_BITS_SIZE + SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) |
425+ ((uint64_t )objectType << (SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) |
426+ ((uint64_t )globalContext << (SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) |
427+ ((uint64_t )extensionsFlag << (SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) |
428+ ((uint64_t )customFlag << (SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) |
429+ objectIndex);
394430}
395431
396432sai_object_id_t VirtualObjectIdManager::switchIdQuery (
@@ -434,9 +470,22 @@ sai_object_type_t VirtualObjectIdManager::objectTypeQuery(
434470 return SAI_OBJECT_TYPE_NULL;
435471 }
436472
437- sai_object_type_t objectType = SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG (objectId)
438- ? (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START)
439- : (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId));
473+ uint64_t extensionsFlag = SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG (objectId);
474+ uint64_t customFlag = SAI_REDIS_GET_OBJECT_TYPE_CUSTOM_FLAG (objectId);
475+
476+ sai_object_type_t objectType;
477+ if (customFlag)
478+ {
479+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId) + SAI_OBJECT_TYPE_CUSTOM_RANGE_START);
480+ }
481+ else if (extensionsFlag)
482+ {
483+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START);
484+ }
485+ else
486+ {
487+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId));
488+ }
440489
441490 if (!sai_metadata_is_object_type_valid (objectType))
442491 {
0 commit comments