Skip to content

Commit ea6bfbd

Browse files
authored
Add support for stp instance (sonic-net#142)
* Add support for stp instance * Enable missing vlan mirror attribute * Fix if/else for stp
1 parent 5c4d9d9 commit ea6bfbd

File tree

8 files changed

+117
-3
lines changed

8 files changed

+117
-3
lines changed

meta/sai_meta_sanity.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ std::unordered_map<int32_t, std::unordered_map<int32_t, std::string>> get_attr_n
619619
ATTR_MAP_SET(MIRROR,SAI_MIRROR_SESSION_ATTR_VLAN_TPID);
620620
ATTR_MAP_SET(MIRROR,SAI_MIRROR_SESSION_ATTR_VLAN_ID);
621621
ATTR_MAP_SET(MIRROR,SAI_MIRROR_SESSION_ATTR_VLAN_PRI);
622-
//ATTR_MAP_SET(MIRROR,SAI_MIRROR_SESSION_ATTR_VLAN_CFI);
622+
ATTR_MAP_SET(MIRROR,SAI_MIRROR_SESSION_ATTR_VLAN_CFI);
623623
ATTR_MAP_SET(MIRROR,SAI_MIRROR_SESSION_ATTR_ENCAP_TYPE);
624624
ATTR_MAP_SET(MIRROR,SAI_MIRROR_SESSION_ATTR_IPHDR_VERSION);
625625
ATTR_MAP_SET(MIRROR,SAI_MIRROR_SESSION_ATTR_TOS);

saiplayer/saiplayer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,7 @@ void performNotifySyncd(const std::string& request, const std::string response)
10111011

10121012
if (status != response_status)
10131013
{
1014-
SWSS_LOG_ERROR("response status %s is differnt than syncd status %s", responseStatus.c_str(), sai_serialize_status(status).c_str());
1014+
SWSS_LOG_ERROR("response status %s is different than syncd status %s", responseStatus.c_str(), sai_serialize_status(status).c_str());
10151015
exit(EXIT_FAILURE);
10161016
}
10171017

syncd/syncd.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -970,11 +970,13 @@ void clearTempView()
970970
}
971971
}
972972

973-
void syncdApplyView()
973+
sai_status_t syncdApplyView()
974974
{
975975
SWSS_LOG_ENTER();
976976

977977
SWSS_LOG_ERROR("apply view is not implemented yet");
978+
979+
return SAI_STATUS_NOT_IMPLEMENTED;
978980
}
979981

980982
sai_status_t notifySyncd(const std::string& op)

syncd/syncd.h

+6
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ extern "C" {
4949
#define HIDDEN "HIDDEN"
5050
#define DEFAULT_VIRTUAL_ROUTER_ID "DEFAULT_VIRTUAL_ROUTER_ID"
5151
#define DEFAULT_TRAP_GROUP_ID "DEFAULT_TRAP_GROUP_ID"
52+
#define DEFAULT_STP_INSTANCE_ID "DEFAULT_STP_INSTANCE_ID"
5253
#define CPU_PORT_ID "CPU_PORT_ID"
5354

5455
#define SAI_COLD_BOOT 0
@@ -75,6 +76,8 @@ std::unordered_map<sai_object_id_t, sai_object_id_t> redisGetRidToVidMap();
7576
std::vector<std::string> redisGetAsicStateKeys();
7677
sai_object_id_t redisGetDefaultVirtualRouterId();
7778
sai_object_id_t redisGetDefaultTrapGroupId();
79+
sai_object_id_t redisGetDefaultStpInstanceId();
80+
sai_object_id_t redisGetCpuId();
7881
void redisClearVidToRidMap();
7982
void redisClearRidToVidMap();
8083

@@ -160,4 +163,7 @@ sai_object_type_t getObjectTypeFromVid(sai_object_id_t sai_object_id);
160163
void start_cli();
161164
void stop_cli();
162165

166+
sai_status_t applyViewTransition();
167+
sai_status_t syncdApplyView();
168+
163169
#endif // __SYNCD_H__

syncd/syncd_hard_reinit.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,13 @@ sai_object_id_t processSingleVid(sai_object_id_t vid)
435435
SWSS_LOG_INFO("default virtual router will not be created, processed VID 0x%lx to RID 0x%lx", vid, rid);
436436
}
437437
}
438+
else if (objectType == SAI_OBJECT_TYPE_STP_INSTANCE)
439+
{
440+
if (shouldSkipCreateion(vid, rid, createObject, [](sai_object_id_t id) { return id == redisGetDefaultStpInstanceId(); }))
441+
{
442+
SWSS_LOG_INFO("default virtual router will not be created, processed VID 0x%lx to RID 0x%lx", vid, rid);
443+
}
444+
}
438445
else if (objectType == SAI_OBJECT_TYPE_QUEUE)
439446
{
440447
if (shouldSkipCreateion(vid, rid, createObject, [&](sai_object_id_t queueId) { return g_defaultQueuesRids.find(queueId) != g_defaultQueuesRids.end(); }))

syncd/syncd_init.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ void initialize_common_api_pointers()
7070
common_create[SAI_OBJECT_TYPE_NEIGHBOR] = NULL;
7171
common_create[SAI_OBJECT_TYPE_ROUTE] = NULL;
7272
common_create[SAI_OBJECT_TYPE_VLAN] = NULL;
73+
common_create[SAI_OBJECT_TYPE_STP_INSTANCE] = (sai_stp_api) ? sai_stp_api->create_stp : NULL;
7374

7475
common_remove[SAI_OBJECT_TYPE_NULL] = NULL;
7576
common_remove[SAI_OBJECT_TYPE_PORT] = NULL;
@@ -105,6 +106,7 @@ void initialize_common_api_pointers()
105106
common_remove[SAI_OBJECT_TYPE_NEIGHBOR] = NULL;
106107
common_remove[SAI_OBJECT_TYPE_ROUTE] = NULL;
107108
common_remove[SAI_OBJECT_TYPE_VLAN] = NULL;
109+
common_remove[SAI_OBJECT_TYPE_STP_INSTANCE] = (sai_stp_api) ? sai_stp_api->remove_stp : NULL;
108110

109111
common_set_attribute[SAI_OBJECT_TYPE_NULL] = NULL;
110112
common_set_attribute[SAI_OBJECT_TYPE_PORT] = (sai_port_api) ? sai_port_api->set_port_attribute : NULL;
@@ -140,6 +142,7 @@ void initialize_common_api_pointers()
140142
common_set_attribute[SAI_OBJECT_TYPE_NEIGHBOR] = NULL;
141143
common_set_attribute[SAI_OBJECT_TYPE_ROUTE] = NULL;
142144
common_set_attribute[SAI_OBJECT_TYPE_VLAN] = NULL;
145+
common_set_attribute[SAI_OBJECT_TYPE_STP_INSTANCE] = (sai_stp_api) ? sai_stp_api->set_stp_attribute: NULL;
143146

144147
common_get_attribute[SAI_OBJECT_TYPE_NULL] = NULL;
145148
common_get_attribute[SAI_OBJECT_TYPE_PORT] = (sai_port_api) ? sai_port_api->get_port_attribute : NULL;
@@ -175,6 +178,7 @@ void initialize_common_api_pointers()
175178
common_get_attribute[SAI_OBJECT_TYPE_NEIGHBOR] = NULL;
176179
common_get_attribute[SAI_OBJECT_TYPE_ROUTE] = NULL;
177180
common_get_attribute[SAI_OBJECT_TYPE_VLAN] = NULL;
181+
common_get_attribute[SAI_OBJECT_TYPE_STP_INSTANCE] = (sai_stp_api) ? sai_stp_api->get_stp_attribute: NULL;
178182
}
179183

180184
void populate_sai_apis()

syncd/syncd_reinit.cpp

+75
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,26 @@ sai_object_id_t saiGetDefaultTrapGroup()
141141
return attr.value.oid;
142142
}
143143

144+
sai_object_id_t saiGetDefaultStpInstance()
145+
{
146+
SWSS_LOG_ENTER();
147+
148+
sai_attribute_t attr;
149+
150+
attr.id = SAI_SWITCH_ATTR_DEFAULT_STP_INST_ID;
151+
152+
sai_status_t status = sai_switch_api->get_switch_attribute(1, &attr);
153+
154+
if (status != SAI_STATUS_SUCCESS)
155+
{
156+
SWSS_LOG_ERROR("failed to get switch default stp instance %d", status);
157+
158+
exit_and_notify(EXIT_FAILURE);
159+
}
160+
161+
return attr.value.oid;
162+
}
163+
144164
sai_object_id_t saiGetDefaultVirtualRouter()
145165
{
146166
SWSS_LOG_ENTER();
@@ -355,6 +375,22 @@ sai_object_id_t redisGetDefaultTrapGroupId()
355375
return vr_id;
356376
}
357377

378+
sai_object_id_t redisGetDefaultStpInstanceId()
379+
{
380+
SWSS_LOG_ENTER();
381+
382+
auto redisStpId = g_redisClient->hget(HIDDEN, DEFAULT_STP_INSTANCE_ID);
383+
384+
if (redisStpId == NULL)
385+
return SAI_NULL_OBJECT_ID;
386+
387+
sai_object_id_t stp_id;
388+
389+
sai_deserialize_object_id(*redisStpId, stp_id);
390+
391+
return stp_id;
392+
}
393+
358394
sai_object_id_t redisGetCpuId()
359395
{
360396
SWSS_LOG_ENTER();
@@ -389,6 +425,15 @@ void redisSetDefaultTrapGroup(sai_object_id_t vr_id)
389425
g_redisClient->hset(HIDDEN, DEFAULT_TRAP_GROUP_ID, strVrId);
390426
}
391427

428+
void redisSetDefaultStpInstance(sai_object_id_t stp_id)
429+
{
430+
SWSS_LOG_ENTER();
431+
432+
std::string strStpId = sai_serialize_object_id(stp_id);
433+
434+
g_redisClient->hset(HIDDEN, DEFAULT_STP_INSTANCE_ID, strStpId);
435+
}
436+
392437
void redisCreateRidAndVidMapping(sai_object_id_t rid, sai_object_id_t vid)
393438
{
394439
SWSS_LOG_ENTER();
@@ -484,6 +529,34 @@ void helperCheckDefaultTrapGroup()
484529
}
485530
}
486531

532+
void helperCheckDefaultStpInstance()
533+
{
534+
SWSS_LOG_ENTER();
535+
536+
sai_object_id_t stpId = saiGetDefaultStpInstance();
537+
538+
sai_object_id_t redisStpId = redisGetDefaultStpInstanceId();
539+
540+
if (redisStpId == SAI_NULL_OBJECT_ID)
541+
{
542+
redisSetDummyAsicStateForRealObjectId(stpId);
543+
544+
SWSS_LOG_INFO("redis default stp instance id is not defined yet");
545+
546+
redisSetDefaultStpInstance(stpId);
547+
548+
redisStpId = stpId;
549+
}
550+
551+
if (stpId != redisStpId)
552+
{
553+
// if this happens, we need to remap VIDTORID and RIDTOVID
554+
SWSS_LOG_ERROR("FIXME: default stp instance id differs: 0x%lx vs 0x%lx, ids must be remapped", stpId, redisStpId);
555+
556+
exit_and_notify(EXIT_FAILURE);
557+
}
558+
}
559+
487560
void redisSetCpuId(sai_object_id_t cpuId)
488561
{
489562
SWSS_LOG_ENTER();
@@ -923,6 +996,8 @@ void onSyncdStart(bool warmStart)
923996

924997
helperCheckDefaultTrapGroup();
925998

999+
helperCheckDefaultStpInstance();
1000+
9261001
helperCheckVlanId();
9271002

9281003
helperCheckPortIds();

vslib/src/sai_vs_init.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,24 @@ sai_status_t create_default_virtual_router()
206206
return vs_generic_set_switch(&attr);
207207
}
208208

209+
sai_status_t create_default_stp_instance()
210+
{
211+
SWSS_LOG_ENTER();
212+
213+
SWSS_LOG_INFO("create default stp instance");
214+
215+
sai_object_id_t stp_instance_id;
216+
217+
CHECK_STATUS(vs_generic_create(SAI_OBJECT_TYPE_STP_INSTANCE, &stp_instance_id, 0, NULL));
218+
219+
sai_attribute_t attr;
220+
221+
attr.id = SAI_SWITCH_ATTR_DEFAULT_STP_INST_ID;
222+
attr.value.oid = stp_instance_id;
223+
224+
return vs_generic_set_switch(&attr);
225+
}
226+
209227
sai_status_t create_vlan_members_for_default_vlan(
210228
std::vector<sai_object_id_t>& port_list,
211229
std::vector<sai_object_id_t>& vlan_member_list)
@@ -641,6 +659,8 @@ sai_status_t initialize_default_objects()
641659

642660
CHECK_STATUS(create_default_virtual_router());
643661

662+
CHECK_STATUS(create_default_stp_instance());
663+
644664
std::vector<sai_object_id_t> vlan_member_list;
645665

646666
CHECK_STATUS(create_vlan_members_for_default_vlan(port_list, vlan_member_list));

0 commit comments

Comments
 (0)