@@ -376,6 +376,13 @@ bool RouteOrch::validnexthopinNextHopGroup(const NextHopKey &nexthop, uint32_t&
376376 nhgm_attrs.push_back (nhgm_attr);
377377 }
378378
379+ if (m_switchOrch->checkOrderedEcmpEnable ())
380+ {
381+ nhgm_attr.id = SAI_NEXT_HOP_GROUP_MEMBER_ATTR_SEQUENCE_ID;
382+ nhgm_attr.value .u32 = nhopgroup->second .nhopgroup_members [nexthop].seq_id ;
383+ nhgm_attrs.push_back (nhgm_attr);
384+ }
385+
379386 status = sai_next_hop_group_api->create_next_hop_group_member (&nexthop_id, gSwitchId ,
380387 (uint32_t )nhgm_attrs.size (),
381388 nhgm_attrs.data ());
@@ -393,7 +400,7 @@ bool RouteOrch::validnexthopinNextHopGroup(const NextHopKey &nexthop, uint32_t&
393400
394401 ++count;
395402 gCrmOrch ->incCrmResUsedCounter (CrmResourceType::CRM_NEXTHOP_GROUP_MEMBER);
396- nhopgroup->second .nhopgroup_members [nexthop] = nexthop_id;
403+ nhopgroup->second .nhopgroup_members [nexthop]. next_hop_id = nexthop_id;
397404 }
398405
399406 if (!m_fgNhgOrch->validNextHopInNextHopGroup (nexthop))
@@ -421,7 +428,7 @@ bool RouteOrch::invalidnexthopinNextHopGroup(const NextHopKey &nexthop, uint32_t
421428 continue ;
422429 }
423430
424- nexthop_id = nhopgroup->second .nhopgroup_members [nexthop];
431+ nexthop_id = nhopgroup->second .nhopgroup_members [nexthop]. next_hop_id ;
425432 status = sai_next_hop_group_api->remove_next_hop_group_member (nexthop_id);
426433
427434 if (status != SAI_STATUS_SUCCESS)
@@ -1241,7 +1248,7 @@ bool RouteOrch::addNextHopGroup(const NextHopGroupKey &nexthops)
12411248 vector<sai_attribute_t > nhg_attrs;
12421249
12431250 nhg_attr.id = SAI_NEXT_HOP_GROUP_ATTR_TYPE;
1244- nhg_attr.value .s32 = SAI_NEXT_HOP_GROUP_TYPE_ECMP;
1251+ nhg_attr.value .s32 = m_switchOrch-> checkOrderedEcmpEnable () ? SAI_NEXT_HOP_GROUP_TYPE_DYNAMIC_ORDERED_ECMP : SAI_NEXT_HOP_GROUP_TYPE_ECMP;
12451252 nhg_attrs.push_back (nhg_attr);
12461253
12471254 sai_object_id_t next_hop_group_id;
@@ -1295,6 +1302,13 @@ bool RouteOrch::addNextHopGroup(const NextHopGroupKey &nexthops)
12951302 nhgm_attrs.push_back (nhgm_attr);
12961303 }
12971304
1305+ if (m_switchOrch->checkOrderedEcmpEnable ())
1306+ {
1307+ nhgm_attr.id = SAI_NEXT_HOP_GROUP_MEMBER_ATTR_SEQUENCE_ID;
1308+ nhgm_attr.value .u32 = ((uint32_t )i) + 1 ; // To make non-zero sequence id
1309+ nhgm_attrs.push_back (nhgm_attr);
1310+ }
1311+
12981312 gNextHopGroupMemberBulker .create_entry (&nhgm_ids[i],
12991313 (uint32_t )nhgm_attrs.size (),
13001314 nhgm_attrs.data ());
@@ -1319,7 +1333,8 @@ bool RouteOrch::addNextHopGroup(const NextHopGroupKey &nexthops)
13191333 if (nhopgroup_shared_set.find (nhid) != nhopgroup_shared_set.end ())
13201334 {
13211335 auto it = nhopgroup_shared_set[nhid].begin ();
1322- next_hop_group_entry.nhopgroup_members [*it] = nhgm_id;
1336+ next_hop_group_entry.nhopgroup_members [*it].next_hop_id = nhgm_id;
1337+ next_hop_group_entry.nhopgroup_members [*it].seq_id = (uint32_t )i + 1 ;
13231338 nhopgroup_shared_set[nhid].erase (it);
13241339 if (nhopgroup_shared_set[nhid].empty ())
13251340 {
@@ -1328,7 +1343,8 @@ bool RouteOrch::addNextHopGroup(const NextHopGroupKey &nexthops)
13281343 }
13291344 else
13301345 {
1331- next_hop_group_entry.nhopgroup_members [nhopgroup_members_set.find (nhid)->second ] = nhgm_id;
1346+ next_hop_group_entry.nhopgroup_members [nhopgroup_members_set.find (nhid)->second ].next_hop_id = nhgm_id;
1347+ next_hop_group_entry.nhopgroup_members [nhopgroup_members_set.find (nhid)->second ].seq_id = ((uint32_t )i) + 1 ;
13321348 }
13331349 }
13341350
@@ -1373,12 +1389,12 @@ bool RouteOrch::removeNextHopGroup(const NextHopGroupKey &nexthops)
13731389 if (m_neighOrch->isNextHopFlagSet (nhop->first , NHFLAGS_IFDOWN))
13741390 {
13751391 SWSS_LOG_WARN (" NHFLAGS_IFDOWN set for next hop group member %s with next_hop_id %" PRIx64,
1376- nhop->first .to_string ().c_str (), nhop->second );
1392+ nhop->first .to_string ().c_str (), nhop->second . next_hop_id );
13771393 nhop = nhgm.erase (nhop);
13781394 continue ;
13791395 }
13801396
1381- next_hop_ids.push_back (nhop->second );
1397+ next_hop_ids.push_back (nhop->second . next_hop_id );
13821398 nhop = nhgm.erase (nhop);
13831399 }
13841400
0 commit comments