@@ -8,6 +8,14 @@ extern "C" {
88#include " saimetadata.h"
99}
1010
11+ #ifndef SAI_OBJECT_TYPE_CUSTOM_RANGE_START
12+ #define SAI_OBJECT_TYPE_CUSTOM_RANGE_START SAI_OBJECT_TYPE_CUSTOM_RANGE_BASE
13+ #endif
14+
15+ #ifndef SAI_OBJECT_TYPE_CUSTOM_RANGE_END
16+ #define SAI_OBJECT_TYPE_CUSTOM_RANGE_END SAI_OBJECT_TYPE_CUSTOM_RANGE_BASE
17+ #endif
18+
1119#define SAI_OBJECT_ID_BITS_SIZE (8 * sizeof (sai_object_id_t ))
1220
1321static_assert (SAI_OBJECT_ID_BITS_SIZE == 64 , " sai_object_id_t must have 64 bits" );
@@ -29,14 +37,19 @@ static_assert(sizeof(sai_object_id_t) == sizeof(uint64_t), "SAI object ID size s
2937#define SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX ( (1ULL << SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE) - 1 )
3038#define SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MASK (SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX)
3139
32- #define SAI_REDIS_OBJECT_INDEX_BITS_SIZE ( 39 )
40+ #define SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE ( 1 )
41+ #define SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_MAX ( (1ULL << SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE) - 1 )
42+ #define SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_MASK (SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_MAX)
43+
44+ #define SAI_REDIS_OBJECT_INDEX_BITS_SIZE ( 38 )
3345#define SAI_REDIS_OBJECT_INDEX_MAX ( (1ULL << SAI_REDIS_OBJECT_INDEX_BITS_SIZE) - 1 )
3446#define SAI_REDIS_OBJECT_INDEX_MASK (SAI_REDIS_OBJECT_INDEX_MAX)
3547
3648#define SAI_REDIS_OBJECT_ID_BITS_SIZE ( \
3749 SAI_REDIS_SWITCH_INDEX_BITS_SIZE + \
3850 SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + \
3951 SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + \
52+ SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + \
4053 SAI_REDIS_OBJECT_TYPE_BITS_SIZE + \
4154 SAI_REDIS_OBJECT_INDEX_BITS_SIZE )
4255
@@ -49,6 +62,8 @@ static_assert(SAI_REDIS_OBJECT_ID_BITS_SIZE == SAI_OBJECT_ID_BITS_SIZE, "redis o
4962static_assert (SAI_OBJECT_TYPE_MAX < 256 , " object type must be possible to encode on 1 byte" );
5063static_assert ((SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START) < 256 ,
5164 " extensions object type must be possible to encode on 1 byte" );
65+ static_assert ((SAI_OBJECT_TYPE_CUSTOM_RANGE_END - SAI_OBJECT_TYPE_CUSTOM_RANGE_START) < 256 ,
66+ " custom object type must be possible to encode on 1 byte" );
5267
5368/*
5469 * Current OBJECT ID format:
@@ -57,7 +72,8 @@ static_assert((SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END - SAI_OBJECT_TYPE_EXTENSIONS
5772 * bits 55..48 - SAI object type
5873 * bits 47..40 - global context
5974 * bits 39..39 - object type extensions flag
60- * bits 38..0 - object index
75+ * bits 38..38 - object type custom flag
76+ * bits 37..0 - object index
6177 *
6278 * So large number of bits is required, otherwise we would need to have map of
6379 * OID to some struct that will have all those values. But having all this
@@ -66,33 +82,41 @@ static_assert((SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END - SAI_OBJECT_TYPE_EXTENSIONS
6682 * To be backward compatible with previous sairedis, we will still encode base
6783 * object type on bit's 55..48, and extensions which will now start from range
6884 * 0x20000000, will be encoded from 0x0, but extensions flag will be set to 1.
85+ * Custom types starting from SAI_OBJECT_TYPE_CUSTOM_RANGE_BASE will be encoded
86+ * from 0x0, but custom flag will be set to 1.
6987 *
7088 * 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.
89+ * SAI_OBJECT_TYPE_DASH_ACL_GROUP oid will be encoded as 0x0003008000000001,
90+ * SAI_OBJECT_TYPE_CUSTOM_RANGE_BASE + n oid will be encoded as 0x0003004000000001.
7291 */
7392
7493#define SAI_REDIS_GET_OBJECT_INDEX (oid ) \
7594 ( ((uint64_t )oid) & ( SAI_REDIS_OBJECT_INDEX_MASK ) )
7695
96+ #define SAI_REDIS_GET_OBJECT_TYPE_CUSTOM_FLAG (oid ) \
97+ ( (((uint64_t )oid) >> (SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_MAX ) )
98+
7799#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 ) )
100+ ( (((uint64_t )oid) >> (SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX ) )
79101
80102#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 ) )
103+ ( (((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 ) )
82104
83105#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 ) )
106+ ( (((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 ) )
85107
86108#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 ) )
109+ ( (((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 ) )
88110
89111#define SAI_REDIS_TEST_OID (0x012345e789abcdef )
90112
91113static_assert (SAI_REDIS_GET_SWITCH_INDEX(SAI_REDIS_TEST_OID) == 0x01 , " test switch index" );
92114static_assert (SAI_REDIS_GET_OBJECT_TYPE(SAI_REDIS_TEST_OID) == 0x23 , " test object type" );
93115static_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" );
116+ static_assert (SAI_REDIS_GET_OBJECT_TYPE_CUSTOM_FLAG(SAI_REDIS_TEST_OID) == 0x01 , " test custom flag" );
117+ static_assert (SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG(SAI_REDIS_TEST_OID) == 0x01 , " test extensions flag" );
118+ static_assert (SAI_REDIS_GET_OBJECT_INDEX(SAI_REDIS_TEST_OID) == 0x2789abcdef , " test object index" );
119+ 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" );
96120
97121using namespace sairedis ;
98122
@@ -162,9 +186,22 @@ sai_object_type_t VirtualObjectIdManager::saiObjectTypeQuery(
162186 return SAI_OBJECT_TYPE_NULL;
163187 }
164188
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));
189+ uint64_t extensionsFlag = SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG (objectId);
190+ uint64_t customFlag = SAI_REDIS_GET_OBJECT_TYPE_CUSTOM_FLAG (objectId);
191+
192+ sai_object_type_t objectType;
193+ if (customFlag)
194+ {
195+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId) + SAI_OBJECT_TYPE_CUSTOM_RANGE_START);
196+ }
197+ else if (extensionsFlag)
198+ {
199+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START);
200+ }
201+ else
202+ {
203+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId));
204+ }
168205
169206 if (sai_metadata_is_object_type_valid (objectType) == false )
170207 {
@@ -379,18 +416,25 @@ sai_object_id_t VirtualObjectIdManager::constructObjectId(
379416 SWSS_LOG_THROW (" FATAL: invalid object type (0x%x), logic error, this is a bug!" , objectType);
380417 }
381418
419+ uint64_t customFlag = (uint64_t )objectType >= SAI_OBJECT_TYPE_CUSTOM_RANGE_START && (uint64_t )objectType < SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START;
382420 uint64_t extensionsFlag = (uint64_t )objectType >= SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START;
383421
384- objectType = extensionsFlag
385- ? (sai_object_type_t )(objectType - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START)
386- : objectType;
422+ if (customFlag)
423+ {
424+ objectType = (sai_object_type_t )(objectType - SAI_OBJECT_TYPE_CUSTOM_RANGE_START);
425+ }
426+ else if (extensionsFlag)
427+ {
428+ objectType = (sai_object_type_t )(objectType - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START);
429+ }
387430
388431 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);
432+ ((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)) |
433+ ((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)) |
434+ ((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)) |
435+ ((uint64_t )extensionsFlag << (SAI_REDIS_OBJECT_TYPE_CUSTOM_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) |
436+ ((uint64_t )customFlag << (SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) |
437+ objectIndex);
394438}
395439
396440sai_object_id_t VirtualObjectIdManager::switchIdQuery (
@@ -434,9 +478,22 @@ sai_object_type_t VirtualObjectIdManager::objectTypeQuery(
434478 return SAI_OBJECT_TYPE_NULL;
435479 }
436480
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));
481+ uint64_t extensionsFlag = SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG (objectId);
482+ uint64_t customFlag = SAI_REDIS_GET_OBJECT_TYPE_CUSTOM_FLAG (objectId);
483+
484+ sai_object_type_t objectType;
485+ if (customFlag)
486+ {
487+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId) + SAI_OBJECT_TYPE_CUSTOM_RANGE_START);
488+ }
489+ else if (extensionsFlag)
490+ {
491+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START);
492+ }
493+ else
494+ {
495+ objectType = (sai_object_type_t )(SAI_REDIS_GET_OBJECT_TYPE (objectId));
496+ }
440497
441498 if (!sai_metadata_is_object_type_valid (objectType))
442499 {
0 commit comments