Skip to content

Commit 7d31204

Browse files
authored
Add fabric port test to vslib. (sonic-net#737)
Signed-off-by: ngocdo <[email protected]>
1 parent b10b5dd commit 7d31204

File tree

6 files changed

+127
-0
lines changed

6 files changed

+127
-0
lines changed

vslib/inc/Sai.h

+2
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,8 @@ namespace saivs
416416

417417
std::shared_ptr<LaneMapContainer> m_laneMapContainer;
418418

419+
std::shared_ptr<LaneMapContainer> m_fabricLaneMapContainer;
420+
419421
std::shared_ptr<ResourceLimiterContainer> m_resourceLimiterContainer;
420422

421423
std::shared_ptr<CorePortIndexMapContainer> m_corePortIndexMapContainer;

vslib/inc/SwitchConfig.h

+2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ namespace saivs
7777

7878
std::shared_ptr<LaneMap> m_laneMap;
7979

80+
std::shared_ptr<LaneMap> m_fabricLaneMap;
81+
8082
std::shared_ptr<EventQueue> m_eventQueue;
8183

8284
std::shared_ptr<ResourceLimiter> m_resourceLimiter;

vslib/inc/SwitchStateBase.h

+6
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ namespace saivs
6161

6262
virtual sai_status_t set_port_list();
6363

64+
virtual sai_status_t create_fabric_ports();
65+
66+
virtual sai_status_t set_fabric_port_list();
67+
6468
virtual sai_status_t create_default_virtual_router();
6569

6670
virtual sai_status_t create_default_stp_instance();
@@ -565,6 +569,8 @@ namespace saivs
565569
std::vector<sai_object_id_t> m_port_list;
566570
std::vector<sai_object_id_t> m_bridge_port_list_port_based;
567571

572+
std::vector<sai_object_id_t> m_fabric_port_list;
573+
568574
std::vector<sai_acl_action_type_t> m_ingress_acl_action_list;
569575
std::vector<sai_acl_action_type_t> m_egress_acl_action_list;
570576

vslib/inc/saivs.h

+12
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,18 @@ extern "C" {
3333
*/
3434
#define SAI_KEY_VS_RESOURCE_LIMITER_FILE "SAI_VS_RESOURCE_LIMITER_FILE"
3535

36+
/**
37+
* @def SAI_KEY_VS_INTERFACE_FABRIC_LANE_MAP_FILE
38+
*
39+
* If specified in profile.ini it should point to fabric port to lane map.
40+
*
41+
* Example:
42+
* fabric0:1
43+
* fabric1:2
44+
*
45+
*/
46+
#define SAI_KEY_VS_INTERFACE_FABRIC_LANE_MAP_FILE "SAI_VS_INTERFACE_FABRIC_LANE_MAP_FILE"
47+
3648
/**
3749
* @def SAI_KEY_VS_HOSTIF_USE_TAP_DEVICE
3850
*

vslib/src/Sai.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,12 @@ sai_status_t Sai::initialize(
113113

114114
m_laneMapContainer = LaneMapFileParser::parseLaneMapFile(laneMapFile);
115115

116+
auto *fabricLaneMapFile = service_method_table->profile_get_value(0, SAI_KEY_VS_INTERFACE_FABRIC_LANE_MAP_FILE);
117+
if (fabricLaneMapFile)
118+
{
119+
m_fabricLaneMapContainer = LaneMapFileParser::parseLaneMapFile(fabricLaneMapFile);
120+
}
121+
116122
auto *corePortIndexMapFile = service_method_table->profile_get_value(0, SAI_KEY_VS_CORE_PORT_INDEX_MAP_FILE);
117123

118124
m_corePortIndexMapContainer = CorePortIndexMapFileParser::parseCorePortIndexMapFile(corePortIndexMapFile);
@@ -157,6 +163,10 @@ sai_status_t Sai::initialize(
157163
sc->m_switchIndex = 0;
158164
sc->m_useTapDevice = useTapDevice;
159165
sc->m_laneMap = m_laneMapContainer->getLaneMap(sc->m_switchIndex);
166+
if (m_fabricLaneMapContainer)
167+
{
168+
sc->m_fabricLaneMap = m_fabricLaneMapContainer->getLaneMap(sc->m_switchIndex);
169+
}
160170
sc->m_eventQueue = m_eventQueue;
161171
sc->m_resourceLimiter = m_resourceLimiterContainer->getResourceLimiter(sc->m_switchIndex);
162172
sc->m_corePortIndexMap = m_corePortIndexMapContainer->getCorePortIndexMap(sc->m_switchIndex);

vslib/src/SwitchStateBase.cpp

+95
Original file line numberDiff line numberDiff line change
@@ -1768,6 +1768,9 @@ sai_status_t SwitchStateBase::refresh_port_list(
17681768

17691769
const sai_object_id_t cpu_port_id = attr.value.oid;
17701770

1771+
std::unordered_set<sai_object_id_t> fabric_port_set(m_fabric_port_list.begin(),
1772+
m_fabric_port_list.end());
1773+
17711774
m_port_list.clear();
17721775

17731776
// iterate via ASIC state to find all the ports
@@ -1782,6 +1785,10 @@ sai_status_t SwitchStateBase::refresh_port_list(
17821785
if (port_id == cpu_port_id)
17831786
continue;
17841787

1788+
// don't put fabric ports on the list
1789+
if (fabric_port_set.find(port_id) != fabric_port_set.end())
1790+
continue;
1791+
17851792
m_port_list.push_back(port_id);
17861793
}
17871794

@@ -1907,6 +1914,10 @@ sai_status_t SwitchStateBase::refresh_read_only(
19071914
case SAI_SWITCH_ATTR_SYSTEM_PORT_LIST:
19081915
return refresh_system_port_list(meta);
19091916

1917+
case SAI_SWITCH_ATTR_NUMBER_OF_FABRIC_PORTS:
1918+
case SAI_SWITCH_ATTR_FABRIC_PORT_LIST:
1919+
return SAI_STATUS_SUCCESS;
1920+
19101921
case SAI_SWITCH_ATTR_SUPPORTED_OBJECT_TYPE_LIST:
19111922
return SAI_STATUS_SUCCESS;
19121923
}
@@ -1934,6 +1945,9 @@ sai_status_t SwitchStateBase::refresh_read_only(
19341945

19351946
case SAI_PORT_ATTR_OPER_STATUS:
19361947
return SAI_STATUS_SUCCESS;
1948+
1949+
case SAI_PORT_ATTR_FABRIC_ATTACHED:
1950+
return SAI_STATUS_SUCCESS;
19371951
}
19381952
}
19391953

@@ -2652,6 +2666,10 @@ sai_status_t SwitchStateBase::initialize_voq_switch_objects(
26522666

26532667
CHECK_STATUS(set_system_port_list());
26542668

2669+
CHECK_STATUS(create_fabric_ports());
2670+
2671+
CHECK_STATUS(set_fabric_port_list());
2672+
26552673
return SAI_STATUS_SUCCESS;
26562674
}
26572675

@@ -2783,6 +2801,83 @@ sai_status_t SwitchStateBase::refresh_system_port_list(
27832801
return SAI_STATUS_SUCCESS;
27842802
}
27852803

2804+
sai_status_t SwitchStateBase::create_fabric_ports()
2805+
{
2806+
SWSS_LOG_ENTER();
2807+
2808+
SWSS_LOG_INFO("create fabric ports");
2809+
2810+
auto map = m_switchConfig->m_fabricLaneMap;
2811+
2812+
if (!map)
2813+
{
2814+
SWSS_LOG_ERROR("fabric lane map for switch %s is NULL",
2815+
sai_serialize_object_id(m_switch_id).c_str());
2816+
2817+
return SAI_STATUS_FAILURE;
2818+
}
2819+
2820+
auto& lanesVector = map->getLaneVector();
2821+
2822+
uint32_t fabric_port_count = (uint32_t)lanesVector.size();
2823+
2824+
m_fabric_port_list.clear();
2825+
2826+
for (uint32_t i = 0; i < fabric_port_count; i++)
2827+
{
2828+
SWSS_LOG_DEBUG("create fabric port index %u", i);
2829+
2830+
sai_object_id_t fabric_port_id;
2831+
2832+
CHECK_STATUS(create(SAI_OBJECT_TYPE_PORT, &fabric_port_id, m_switch_id, 0, NULL));
2833+
m_fabric_port_list.push_back(fabric_port_id);
2834+
2835+
sai_attribute_t attr;
2836+
2837+
attr.id = SAI_PORT_ATTR_FABRIC_ATTACHED;
2838+
attr.value.booldata = false;
2839+
2840+
CHECK_STATUS(set(SAI_OBJECT_TYPE_PORT, fabric_port_id, &attr));
2841+
2842+
std::vector<uint32_t> lanes = lanesVector.at(i);
2843+
2844+
attr.id = SAI_PORT_ATTR_HW_LANE_LIST;
2845+
attr.value.u32list.count = (uint32_t)lanes.size();
2846+
attr.value.u32list.list = lanes.data();
2847+
2848+
CHECK_STATUS(set(SAI_OBJECT_TYPE_PORT, fabric_port_id, &attr));
2849+
2850+
attr.id = SAI_PORT_ATTR_TYPE;
2851+
attr.value.s32 = SAI_PORT_TYPE_FABRIC;
2852+
2853+
CHECK_STATUS(set(SAI_OBJECT_TYPE_PORT, fabric_port_id, &attr));
2854+
}
2855+
2856+
return SAI_STATUS_SUCCESS;
2857+
}
2858+
2859+
sai_status_t SwitchStateBase::set_fabric_port_list()
2860+
{
2861+
SWSS_LOG_ENTER();
2862+
2863+
SWSS_LOG_INFO("set fabric port list");
2864+
2865+
sai_attribute_t attr;
2866+
2867+
uint32_t fabric_port_count = (uint32_t)m_fabric_port_list.size();
2868+
2869+
attr.id = SAI_SWITCH_ATTR_FABRIC_PORT_LIST;
2870+
attr.value.objlist.count = fabric_port_count;
2871+
attr.value.objlist.list = m_fabric_port_list.data();
2872+
2873+
CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr));
2874+
2875+
attr.id = SAI_SWITCH_ATTR_NUMBER_OF_FABRIC_PORTS;
2876+
attr.value.u32 = fabric_port_count;
2877+
2878+
return set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr);
2879+
}
2880+
27862881
sai_status_t SwitchStateBase::createVoqSystemNeighborEntry(
27872882
_In_ const std::string &serializedObjectId,
27882883
_In_ sai_object_id_t switch_id,

0 commit comments

Comments
 (0)