Skip to content

Commit

Permalink
fix BcmLabeledEgressTest on TH4
Browse files Browse the repository at this point in the history
Summary:
as titled, this diff fixes BcmLabeledEgressTest on TH4 by calling new bcm ecmp
egress traverse api on TH4.

Reviewed By: phshaikh

Differential Revision: D25130941

fbshipit-source-id: 629559e8f9ed174a2405f163ad3804fb1f6960f8
  • Loading branch information
Wei Dai authored and facebook-github-bot committed Nov 21, 2020
1 parent 1dc844c commit dd5b647
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 41 deletions.
46 changes: 46 additions & 0 deletions fboss/agent/hw/bcm/BcmEcmpUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,52 @@ int getEcmpSizeInHw(const BcmSwitch* hw, bcm_if_t ecmp, int sizeInSw) {
return getEcmpGroupInHw(hw, ecmp, sizeInSw).size();
}

template <typename T>
bcm_if_t toIntfId(T egress) {
return egress;
}

#ifdef BCM_L3_ECMP_MEMBER_WEIGHTED
template <>
bcm_if_t toIntfId(bcm_l3_ecmp_member_t egress) {
return egress.egress_if;
}
#endif

template <typename T>
int bcm_l3_ecmp_traverse_cb(
int /*unit*/,
bcm_l3_egress_ecmp_t* /*ecmp*/,
int memberCount,
T* memberArray,
void* userData) {
if (!userData) {
return 0;
}
auto* outvec = reinterpret_cast<std::vector<bcm_if_t>*>(userData);
for (auto i = 0; i < memberCount; i++) {
outvec->push_back(toIntfId<T>(memberArray[i]));
}
return 0;
}

std::vector<bcm_if_t> getEcmpMembersInHw(const BcmSwitch* hw) {
std::vector<bcm_if_t> ecmpMembers;
if (hw->getPlatform()->getAsic()->isSupported(
HwAsic::Feature::WEIGHTED_NEXTHOPGROUP_MEMBER)) {
#ifdef BCM_L3_ECMP_MEMBER_WEIGHTED
bcm_l3_ecmp_traverse(
hw->getUnit(),
bcm_l3_ecmp_traverse_cb<bcm_l3_ecmp_member_t>,
&ecmpMembers);
#endif
} else {
bcm_l3_egress_ecmp_traverse(
hw->getUnit(), bcm_l3_ecmp_traverse_cb<bcm_if_t>, &ecmpMembers);
}
return ecmpMembers;
}

bcm_if_t getEgressIdForRoute(
const BcmSwitch* hw,
const folly::IPAddress& ip,
Expand Down
3 changes: 3 additions & 0 deletions fboss/agent/hw/bcm/BcmEcmpUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#pragma once

#include <set>
#include <vector>

extern "C" {
#include <bcm/l3.h>
Expand All @@ -31,6 +32,8 @@ int getEcmpSizeInHw(const BcmSwitch* hw, bcm_if_t ecmp, int sizeInSw);
std::multiset<bcm_if_t>
getEcmpGroupInHw(const BcmSwitch* hw, bcm_if_t ecmp, int sizeInSw);

std::vector<bcm_if_t> getEcmpMembersInHw(const BcmSwitch* hw);

bcm_if_t getEgressIdForRoute(
const BcmSwitch* hw,
const folly::IPAddress& ip,
Expand Down
47 changes: 6 additions & 41 deletions fboss/agent/hw/bcm/tests/BcmLabeledEgressTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include "fboss/agent/hw/bcm/BcmLabeledEgress.h"

#include "fboss/agent/hw/bcm/BcmEcmpUtils.h"
#include "fboss/agent/hw/bcm/BcmEgressManager.h"
#include "fboss/agent/hw/bcm/BcmHost.h"
#include "fboss/agent/hw/bcm/BcmIntf.h"
Expand Down Expand Up @@ -90,22 +91,6 @@ class BcmLabeledEgressTest : public BcmTest {
return 0;
}

static int bcm_l3_egress_ecmp_traverse_cb(
int /*unit*/,
bcm_l3_egress_ecmp_t* /*ecmp*/,
int intf_count,
bcm_if_t* intf_array,
void* user_data) {
if (!user_data) {
return 0;
}
auto* outvec = reinterpret_cast<std::vector<bcm_if_t>*>(user_data);
for (auto i = 0; i < intf_count; i++) {
outvec->push_back(intf_array[i]);
}
return 0;
}

BcmLabeledEgress* makeLabeledEgress(bcm_mpls_label_t label) {
auto var = std::make_unique<BcmLabeledEgress>(getHwSwitch(), label);
auto* rv = var.get();
Expand Down Expand Up @@ -252,11 +237,7 @@ TEST_F(BcmLabeledEgressTest, LabeledEgressWithEcmp) {
return state;
};
auto verify = [=]() {
std::vector<bcm_if_t> ecmpMembers;
bcm_l3_egress_ecmp_traverse(
getHwSwitch()->getUnit(),
&BcmLabeledEgressTest::bcm_l3_egress_ecmp_traverse_cb,
&ecmpMembers);
auto ecmpMembers = utility::getEcmpMembersInHw(getHwSwitch());

EXPECT_EQ(ecmpMembers.size(), 4);

Expand Down Expand Up @@ -294,11 +275,7 @@ TEST_F(BcmLabeledEgressTest, labeledTunnelEgressWithEcmp) {
return state;
};
auto verify = [=]() {
std::vector<bcm_if_t> ecmpMembers;
bcm_l3_egress_ecmp_traverse(
getHwSwitch()->getUnit(),
&BcmLabeledEgressTest::bcm_l3_egress_ecmp_traverse_cb,
&ecmpMembers);
auto ecmpMembers = utility::getEcmpMembersInHw(getHwSwitch());

EXPECT_EQ(ecmpMembers.size(), 4);

Expand Down Expand Up @@ -340,11 +317,7 @@ TEST_F(BcmLabeledEgressTest, labeledTunnelEgressCommonTunnel) {
return state;
};
auto verify = [=]() {
std::vector<bcm_if_t> ecmpMembers;
bcm_l3_egress_ecmp_traverse(
getHwSwitch()->getUnit(),
&BcmLabeledEgressTest::bcm_l3_egress_ecmp_traverse_cb,
&ecmpMembers);
auto ecmpMembers = utility::getEcmpMembersInHw(getHwSwitch());

EXPECT_EQ(ecmpMembers.size(), 4);

Expand Down Expand Up @@ -383,11 +356,7 @@ TEST_F(BcmLabeledEgressTest, labeledTunnelEgressWithOneLabel) {
return state;
};
auto verify = [=]() {
std::vector<bcm_if_t> ecmpMembers;
bcm_l3_egress_ecmp_traverse(
getHwSwitch()->getUnit(),
&BcmLabeledEgressTest::bcm_l3_egress_ecmp_traverse_cb,
&ecmpMembers);
auto ecmpMembers = utility::getEcmpMembersInHw(getHwSwitch());

EXPECT_EQ(ecmpMembers.size(), 4);

Expand Down Expand Up @@ -423,11 +392,7 @@ TEST_F(BcmLabeledEgressTest, LabeledUnlabeledEgressWithEcmp) {
return state;
};
auto verify = [=]() {
std::vector<bcm_if_t> ecmpMembers;
bcm_l3_egress_ecmp_traverse(
getHwSwitch()->getUnit(),
&BcmLabeledEgressTest::bcm_l3_egress_ecmp_traverse_cb,
&ecmpMembers);
auto ecmpMembers = utility::getEcmpMembersInHw(getHwSwitch());

EXPECT_EQ(ecmpMembers.size(), 4);

Expand Down

0 comments on commit dd5b647

Please sign in to comment.