Skip to content

Commit

Permalink
Merge branch 'main' into rg-naming
Browse files Browse the repository at this point in the history
  • Loading branch information
marian-pritsak authored Jun 17, 2024
2 parents d23d89f + 235e43b commit 4d9d7ff
Show file tree
Hide file tree
Showing 24 changed files with 966 additions and 44 deletions.
3 changes: 3 additions & 0 deletions .wordlist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -730,3 +730,6 @@ Gan
Ze
AppDBMemoryEstimation
Ivantsiv
Zhixiong
Niu
validonly
5 changes: 3 additions & 2 deletions dash-pipeline/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,9 @@ sai: sai-headers sai-meta libsai
sai-headers: p4 docker-saithrift-bldr-image-exists | SAI/SAI
@echo "Generate SAI library headers and implementation..."

# Once the specs are checked in, we can use this to revert any local changes before generating the new specs.
# git checkout SAI/specs/*
# Revert any local changes before generating the new specs.
git clean -xf SAI/specs
git checkout SAI/specs/*

mkdir -p SAI/lib

Expand Down
3 changes: 2 additions & 1 deletion dash-pipeline/SAI/sai_api_gen.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@
print("Outputting new SAI spec to " + sai_spec_dir)
yaml_inc_ctor.autoload = False
new_sai_spec = dash_sai_exts.to_sai()
new_sai_spec.serialize(sai_spec_dir)
sai_spec.merge(new_sai_spec)
sai_spec.serialize(sai_spec_dir)

# Generate and update all SAI files
SAIGenerator(dash_sai_exts).generate()
36 changes: 36 additions & 0 deletions dash-pipeline/SAI/specs/dash_outbound_ca_to_pa.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,18 @@ sai_apis:
allow_null: false
valid_only: null
deprecated: null
- !!python/object:utils.sai_spec.sai_attribute.SaiAttribute
name: SAI_OUTBOUND_CA_TO_PA_ENTRY_OVERLAY_SIP_MASK
description: Action parameter OVERLAY_SIP_MASK
type: sai_ip_address_t
attr_value_field: ipaddr
default: 0.0.0.0
isresourcetype: false
flags: CREATE_AND_SET
object_name: null
allow_null: false
valid_only: null
deprecated: null
- !!python/object:utils.sai_spec.sai_attribute.SaiAttribute
name: SAI_OUTBOUND_CA_TO_PA_ENTRY_OVERLAY_DIP
description: Action parameter OVERLAY_DIP
Expand All @@ -157,6 +169,18 @@ sai_apis:
allow_null: false
valid_only: null
deprecated: null
- !!python/object:utils.sai_spec.sai_attribute.SaiAttribute
name: SAI_OUTBOUND_CA_TO_PA_ENTRY_OVERLAY_DIP_MASK
description: Action parameter OVERLAY_DIP_MASK
type: sai_ip_address_t
attr_value_field: ipaddr
default: 0.0.0.0
isresourcetype: false
flags: CREATE_AND_SET
object_name: null
allow_null: false
valid_only: null
deprecated: null
- !!python/object:utils.sai_spec.sai_attribute.SaiAttribute
name: SAI_OUTBOUND_CA_TO_PA_ENTRY_DASH_ENCAPSULATION
description: Action parameter DASH_ENCAPSULATION
Expand Down Expand Up @@ -205,4 +229,16 @@ sai_apis:
allow_null: false
valid_only: null
deprecated: null
- !!python/object:utils.sai_spec.sai_attribute.SaiAttribute
name: SAI_OUTBOUND_CA_TO_PA_ENTRY_DASH_TUNNEL_ID
description: Action parameter DASH_TUNNEL_ID
type: sai_object_id_t
attr_value_field: u16
default: SAI_NULL_OBJECT_ID
isresourcetype: false
flags: CREATE_AND_SET
object_name: SAI_OBJECT_TYPE_DASH_TUNNEL
allow_null: true
valid_only: null
deprecated: null
stats: []
12 changes: 12 additions & 0 deletions dash-pipeline/SAI/specs/dash_outbound_routing.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -273,4 +273,16 @@ sai_apis:
allow_null: false
valid_only: null
deprecated: null
- !!python/object:utils.sai_spec.sai_attribute.SaiAttribute
name: SAI_OUTBOUND_ROUTING_ENTRY_DASH_TUNNEL_ID
description: Action parameter DASH_TUNNEL_ID
type: sai_object_id_t
attr_value_field: u16
default: SAI_NULL_OBJECT_ID
isresourcetype: false
flags: CREATE_AND_SET
object_name: SAI_OBJECT_TYPE_DASH_TUNNEL
allow_null: true
valid_only: null
deprecated: null
stats: []
47 changes: 25 additions & 22 deletions dash-pipeline/SAI/specs/sai_spec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ api_types:
- SAI_API_DASH_TUNNEL
- SAI_API_ROUTE
- SAI_API_DASH_VIP
- SAI_API_DASH_TUNNEL
object_types:
- SAI_OBJECT_TYPE_DASH_ACL_GROUP
- SAI_OBJECT_TYPE_DASH_ACL_RULE
Expand All @@ -33,6 +34,7 @@ object_types:
- SAI_OBJECT_TYPE_DASH_TUNNEL
- SAI_OBJECT_TYPE_ROUTE_ENTRY
- SAI_OBJECT_TYPE_VIP_ENTRY
- SAI_OBJECT_TYPE_DASH_TUNNEL
object_entries:
- !!python/object:utils.sai_spec.sai_struct_entry.SaiStructEntry
name: direction_lookup_entry
Expand Down Expand Up @@ -99,14 +101,22 @@ enums:
name: STANDBY
description: ''
value: '2'
- !!python/object:utils.sai_spec.sai_enum.SaiEnum
name: sai_dash_encapsulation_t
description: ''
members:
- !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember
name: STANDALONE
name: INVALID
description: ''
value: '3'
- !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember
name: SWITCHING_TO_ACTIVE
name: VXLAN
description: ''
value: '4'
value: '1'
- !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember
name: NVGRE
description: ''
value: '2'
- !!python/object:utils.sai_spec.sai_enum.SaiEnum
name: sai_dash_routing_actions_t
description: ''
Expand All @@ -132,49 +142,41 @@ enums:
description: ''
value: '16'
- !!python/object:utils.sai_spec.sai_enum.SaiEnum
name: sai_dash_direction_t
name: sai_dash_tunnel_dscp_mode_t
description: ''
members:
- !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember
name: INVALID
name: PRESERVE_MODEL
description: ''
value: '0'
- !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember
name: OUTBOUND
name: PIPE_MODEL
description: ''
value: '1'
- !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember
name: INBOUND
description: ''
value: '2'
- !!python/object:utils.sai_spec.sai_enum.SaiEnum
name: sai_dash_encapsulation_t
name: sai_dash_ha_role_t
description: ''
members:
- !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember
name: INVALID
name: DEAD
description: ''
value: '0'
- !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember
name: VXLAN
name: ACTIVE
description: ''
value: '1'
- !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember
name: NVGRE
name: STANDBY
description: ''
value: '2'
- !!python/object:utils.sai_spec.sai_enum.SaiEnum
name: sai_dash_tunnel_dscp_mode_t
description: ''
members:
- !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember
name: PRESERVE_MODEL
name: STANDALONE
description: ''
value: '0'
value: '3'
- !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember
name: PIPE_MODEL
name: SWITCHING_TO_ACTIVE
description: ''
value: '1'
value: '4'
port_extenstion: !!python/object:utils.sai_spec.sai_api_extension.SaiApiExtension
attributes: []
stats:
Expand Down Expand Up @@ -264,3 +266,4 @@ api_groups:
- !inc '/SAI/specs/dash_tunnel.yaml'
- !inc '/SAI/specs/route.yaml'
- !inc '/SAI/specs/dash_vip.yaml'
- !inc '/SAI/specs/dash_tunnel.yaml'
53 changes: 40 additions & 13 deletions dash-pipeline/SAI/src/objectidmanager.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
#include "objectidmanager.h"
#include "logger.h"

extern "C" {
#include "saimetadata.h"
}

#define SAI_OBJECT_ID_BITS_SIZE (8 * sizeof(sai_object_id_t))

static_assert(SAI_OBJECT_ID_BITS_SIZE == 64, "sai_object_id_t must have 64 bits");
static_assert(sizeof(sai_object_id_t) == sizeof(uint64_t), "SAI object ID size should be uint64_t");

#define DASH_OID_RESERVED_BITS_SIZE ( 8 )
#define DASH_OID_RESERVED_BITS_SIZE ( 7 )

#define DASH_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE ( 1 )
#define DASH_OBJECT_TYPE_EXTENSIONS_FLAG_MAX ( (1ULL << DASH_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE) - 1 )
#define DASH_OBJECT_TYPE_EXTENSIONS_FLAG_MASK (DASH_OBJECT_TYPE_EXTENSIONS_FLAG_MAX)

#define DASH_OBJECT_TYPE_BITS_SIZE ( 8 )
#define DASH_OBJECT_TYPE_MASK ( (1ULL << DASH_OBJECT_TYPE_BITS_SIZE) - 1 )
Expand All @@ -20,24 +28,28 @@ static_assert(sizeof(sai_object_id_t) == sizeof(uint64_t), "SAI object ID size s
#define DASH_OBJECT_INDEX_MASK ( (1ULL << DASH_OBJECT_INDEX_BITS_SIZE) - 1 )
#define DASH_OBJECT_INDEX_MAX (DASH_OBJECT_INDEX_MASK)

#define DASH_OBJECT_ID_BITS_SIZE (DASH_OID_RESERVED_BITS_SIZE + DASH_OBJECT_TYPE_BITS_SIZE + DASH_SWITCH_INDEX_BITS_SIZE + DASH_OBJECT_INDEX_BITS_SIZE)
#define DASH_OBJECT_ID_BITS_SIZE ( \
DASH_OID_RESERVED_BITS_SIZE + \
DASH_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + \
DASH_OBJECT_TYPE_BITS_SIZE + \
DASH_SWITCH_INDEX_BITS_SIZE + \
DASH_OBJECT_INDEX_BITS_SIZE)

static_assert(DASH_OBJECT_ID_BITS_SIZE == SAI_OBJECT_ID_BITS_SIZE, "dash object id size must be equal to SAI object id size");

static_assert(DASH_OBJECT_TYPE_MAX == 0xff, "invalid object type max size");
static_assert(DASH_SWITCH_INDEX_MAX == 0xff, "invalid switch index max size");
static_assert(DASH_OBJECT_INDEX_MAX == 0xffffffffff, "invalid object index max");

/*
* This condition must be met, since we need to be able to encode SAI object
* type in object id on defined number of bits.
*/
static_assert(SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END < DASH_OBJECT_TYPE_MAX, "dash max object type value must be greater than supported SAI max objeect type value");
static_assert(SAI_OBJECT_TYPE_MAX < 256, "object type must be possible to encode on 1 byte");
static_assert((SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START) < 256,
"extensions object type must be possible to encode on 1 byte");

/*
* Current OBJECT ID format:
*
* bits 63..56 - reserved (must be zero)
* bits 63..57 - reserved (must be zero)
* bits 56..56 - object type extensions flag
* bits 55..48 - SAI object type
* bits 47..40 - switch index
* bits 39..0 - object index
Expand All @@ -56,8 +68,12 @@ static_assert(SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END < DASH_OBJECT_TYPE_MAX, "dash
#define DASH_GET_OBJECT_TYPE(oid) \
( (((uint64_t)oid) >> ( DASH_SWITCH_INDEX_BITS_SIZE + DASH_OBJECT_INDEX_BITS_SIZE ) ) & ( DASH_OBJECT_TYPE_MASK ) )

#define DASH_GET_OBJECT_TYPE_EXTENSIONS_FLAG(oid) \
( (((uint64_t)oid) >> ( DASH_OBJECT_TYPE_BITS_SIZE + DASH_SWITCH_INDEX_BITS_SIZE + DASH_OBJECT_INDEX_BITS_SIZE) ) & ( DASH_OBJECT_TYPE_EXTENSIONS_FLAG_MAX ) )

#define DASH_TEST_OID (0x0123456789abcdef)

static_assert(DASH_GET_OBJECT_TYPE_EXTENSIONS_FLAG(DASH_TEST_OID) == 0x1, "object type extension flag");
static_assert(DASH_GET_OBJECT_TYPE(DASH_TEST_OID) == 0x23, "test object type");
static_assert(DASH_GET_SWITCH_INDEX(DASH_TEST_OID) == 0x45, "test switch index");
static_assert(DASH_GET_OBJECT_INDEX(DASH_TEST_OID) == 0x6789abcdef, "test object index");
Expand Down Expand Up @@ -103,9 +119,11 @@ sai_object_type_t ObjectIdManager::saiObjectTypeQuery(
return SAI_OBJECT_TYPE_NULL;
}

sai_object_type_t objectType = (sai_object_type_t)(DASH_GET_OBJECT_TYPE(objectId));
sai_object_type_t objectType = DASH_GET_OBJECT_TYPE_EXTENSIONS_FLAG(objectId)
? (sai_object_type_t)(DASH_GET_OBJECT_TYPE(objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START)
: (sai_object_type_t)(DASH_GET_OBJECT_TYPE(objectId));

if (objectType == SAI_OBJECT_TYPE_NULL || objectType >= (sai_object_type_t)SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END)
if (sai_metadata_is_object_type_valid(objectType) == false)
{
DASH_LOG_ERROR("invalid object id 0x%lx", objectId);

Expand Down Expand Up @@ -149,7 +167,7 @@ sai_object_id_t ObjectIdManager::allocateNewObjectId(
{
DASH_LOG_ENTER();

if ((objectType <= SAI_OBJECT_TYPE_NULL) || (objectType >= (sai_object_type_t)SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END))
if (sai_metadata_is_object_type_valid(objectType) == false)
{
DASH_LOG_ERROR("invalid objct type: %d", objectType);

Expand Down Expand Up @@ -250,7 +268,14 @@ sai_object_id_t ObjectIdManager::constructObjectId(
{
DASH_LOG_ENTER();

uint64_t extensionsFlag = (uint64_t)objectType >= SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START;

objectType = extensionsFlag
? (sai_object_type_t)(objectType - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START)
: objectType;

return (sai_object_id_t)(
(((uint64_t)extensionsFlag & DASH_OBJECT_TYPE_EXTENSIONS_FLAG_MASK) << ( DASH_OBJECT_TYPE_BITS_SIZE + DASH_SWITCH_INDEX_BITS_SIZE + DASH_OBJECT_INDEX_BITS_SIZE )) |
(((uint64_t)objectType & DASH_OBJECT_TYPE_MASK)<< ( DASH_SWITCH_INDEX_BITS_SIZE + DASH_OBJECT_INDEX_BITS_SIZE))|
(((uint64_t)switchIndex & DASH_SWITCH_INDEX_MASK)<< ( DASH_OBJECT_INDEX_BITS_SIZE )) |
(objectIndex & DASH_OBJECT_INDEX_MASK));
Expand Down Expand Up @@ -295,9 +320,11 @@ sai_object_type_t ObjectIdManager::objectTypeQuery(
return SAI_OBJECT_TYPE_NULL;
}

sai_object_type_t objectType = (sai_object_type_t)(DASH_GET_OBJECT_TYPE(objectId));
sai_object_type_t objectType = DASH_GET_OBJECT_TYPE_EXTENSIONS_FLAG(objectId)
? (sai_object_type_t)(DASH_GET_OBJECT_TYPE(objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START)
: (sai_object_type_t)(DASH_GET_OBJECT_TYPE(objectId));

if (objectType == SAI_OBJECT_TYPE_NULL || objectType >= (sai_object_type_t)SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END)
if (sai_metadata_is_object_type_valid(objectType) == false)
{
DASH_LOG_ERROR("invalid object id 0x%lx", objectId);

Expand Down
10 changes: 10 additions & 0 deletions dash-pipeline/SAI/utils/sai_spec/sai_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from .sai_attribute import SaiAttribute
from .sai_enum import SaiEnum
from .sai_struct import SaiStruct
from . import sai_spec_utils


class SaiApi(SaiCommon):
Expand All @@ -17,3 +18,12 @@ def __init__(self, name: str, description: str, is_object: bool = False):
self.structs: List[SaiStruct] = []
self.attributes: List[SaiAttribute] = []
self.stats: List[SaiAttribute] = []

def merge(self, other: "SaiCommon"):
super().merge(other)

self.is_object = other.is_object
sai_spec_utils.merge_sai_common_lists(self.enums, other.enums)
sai_spec_utils.merge_sai_common_lists(self.structs, other.structs)
sai_spec_utils.merge_sai_common_lists(self.attributes, other.attributes)
sai_spec_utils.merge_sai_common_lists(self.stats, other.stats)
5 changes: 5 additions & 0 deletions dash-pipeline/SAI/utils/sai_spec/sai_api_extension.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from typing import List
from .sai_attribute import SaiAttribute
from . import sai_spec_utils


class SaiApiExtension:
Expand All @@ -12,3 +13,7 @@ class SaiApiExtension:
def __init__(self):
self.attributes: List[SaiAttribute] = []
self.stats: List[SaiAttribute] = []

def merge(self, other: "SaiApiExtension"):
sai_spec_utils.merge_sai_common_lists(self.attributes, other.attributes)
sai_spec_utils.merge_sai_common_lists(self.stats, other.stats)
18 changes: 18 additions & 0 deletions dash-pipeline/SAI/utils/sai_spec/sai_api_group.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from typing import List
from .sai_common import SaiCommon
from .sai_api import SaiApi
from . import sai_spec_utils


class SaiApiGroup(SaiCommon):
Expand All @@ -11,3 +12,20 @@ class SaiApiGroup(SaiCommon):
def __init__(self, name: str, description: str):
super().__init__(name, description)
self.sai_apis: List[SaiApi] = []

def merge(self, other: "SaiCommon"):
super().merge(other)
sai_spec_utils.merge_sai_common_lists(self.sai_apis, other.sai_apis)

def deprecate(self) -> bool:
"""
Deprecate API group.
When deprecating the API group, we can safely remove it from the list as the
net effect is the same as keeping it:
- The old API type, object type and object entries will not be changed.
- The SAI headers will not be changed, because their API groups are present.
- The DASH libsai will not be generated anymore, but it is ok, since we will not
use them in the BMv2 anyway.
"""
return True
Loading

0 comments on commit 4d9d7ff

Please sign in to comment.