diff --git a/fboss/agent/hw/test/HwSwitchEnsemble.cpp b/fboss/agent/hw/test/HwSwitchEnsemble.cpp index cc1c9cace38db..190580fbfce52 100644 --- a/fboss/agent/hw/test/HwSwitchEnsemble.cpp +++ b/fboss/agent/hw/test/HwSwitchEnsemble.cpp @@ -407,7 +407,11 @@ void HwSwitchEnsemble::applyInitialConfig(const cfg::SwitchConfig& initCfg) { CHECK(haveFeature(HwSwitchEnsemble::LINKSCAN)) << "Link scan feature must be enabled for exercising " << "applyInitialConfig"; + linkToggler_->applyInitialConfig(initCfg); + /* link togglers apply config with ports down and bring ports up differently + */ + currentConfig_ = initCfg; } void HwSwitchEnsemble::linkStateChanged( diff --git a/fboss/agent/hw/test/dataplane_tests/HwLoadBalancerTests.h b/fboss/agent/hw/test/dataplane_tests/HwLoadBalancerTests.h index ba720606a7ea0..f47f0fb557d33 100644 --- a/fboss/agent/hw/test/dataplane_tests/HwLoadBalancerTests.h +++ b/fboss/agent/hw/test/dataplane_tests/HwLoadBalancerTests.h @@ -47,9 +47,18 @@ class HwLoadBalancerTest bool loopThroughFrontPanel = false, bool loadBalanceExpected = true, uint8_t deviation = 25) { + /* TODO: remove this hack. + * apply thrift config relies on sdk version in switch config to determine + * how to compute load balancer seeds. however sdk version is unavailable in + * hw tests unlike agent tests. remove this hack when hw tests can inject + * sdk version in thrift config. + */ + auto lbConfig = loadBalancer; + auto seed = getHwSwitch()->generateDeterministicSeed(*lbConfig.id()); + lbConfig.seed() = seed; Runner::runLoadBalanceTest( ecmpWidth, - loadBalancer, + lbConfig, weights, loopThroughFrontPanel, loadBalanceExpected, @@ -63,9 +72,12 @@ class HwLoadBalancerTest bool loopThroughFrontPanel = false, bool loadBalanceExpected = true, uint8_t deviation = 25) { + auto lbConfig = loadBalancer; + auto seed = getHwSwitch()->generateDeterministicSeed(*lbConfig.id()); + lbConfig.seed() = seed; Runner::runDynamicLoadBalanceTest( ecmpWidth, - loadBalancer, + lbConfig, weights, loopThroughFrontPanel, loadBalanceExpected, diff --git a/fboss/agent/test/utils/EcmpDataPlaneTestUtil.cpp b/fboss/agent/test/utils/EcmpDataPlaneTestUtil.cpp index 3dd8e637f99cf..d4ae05033e740 100644 --- a/fboss/agent/test/utils/EcmpDataPlaneTestUtil.cpp +++ b/fboss/agent/test/utils/EcmpDataPlaneTestUtil.cpp @@ -101,27 +101,25 @@ bool HwEcmpDataPlaneTestUtil::isLoadBalanced( template void HwEcmpDataPlaneTestUtil::programLoadBalancer( const cfg::LoadBalancer& lb) { + if (ensemble_->getHwAsicTable() + ->getSwitchIDs(HwAsic::Feature::HASH_FIELDS_CUSTOMIZATION) + .empty()) { + return; + } + auto config = ensemble_->getCurrentConfig(); + config.loadBalancers()->clear(); + config.loadBalancers()->push_back(lb); if (ensemble_->isSai()) { // always program half lag hash for sai switches, see CS00012317640 - ensemble_->applyNewState( - [this, lb](const std::shared_ptr& state) { - return utility::addLoadBalancers( - ensemble_, - state, - {lb, - utility::getTrunkHalfHashConfig( - *ensemble_->getHwAsicTable()->getHwAsic(SwitchID(0)))}, - ensemble_->scopeResolver()); - }, - "program lb"); - } else { - ensemble_->applyNewState( - [this, lb](const std::shared_ptr& state) { - return utility::setLoadBalancer( - ensemble_, state, lb, ensemble_->scopeResolver()); - }, - "program lb"); + auto switchIds = ensemble_->getHwAsicTable()->getSwitchIDs( + HwAsic::Feature::SAI_LAG_HASH); + if (!switchIds.empty()) { + config.loadBalancers()->push_back(utility::getTrunkHalfHashConfig( + *ensemble_->getHwAsicTable()->getHwAsic(*switchIds.begin()))); + } } + XLOG(INFO) << "Programming load balancer: " << *lb.id(); + ensemble_->applyNewConfig(config); } template diff --git a/fboss/agent/test/utils/LoadBalancerTestRunner.h b/fboss/agent/test/utils/LoadBalancerTestRunner.h index 0a21ae816c4fe..d3311a7ebe694 100644 --- a/fboss/agent/test/utils/LoadBalancerTestRunner.h +++ b/fboss/agent/test/utils/LoadBalancerTestRunner.h @@ -244,11 +244,7 @@ class HwLoadBalancerTestRunner { // verfiy the Dlb fail packets is zero EXPECT_EQ(l3EcmpDlbFailPackets, 0); - auto cfg = utility::onePortPerInterfaceConfig( - getEnsemble(), getMasterLogicalPortIds()); - cfg.udfConfig() = utility::addUdfFlowletAclConfig(); - // Add flowlet config to convert flowlet QUALITY to PER_PACKET_QUALITY - // run the load balance test and verify again + auto cfg = getEnsemble()->getCurrentConfig(); utility::addFlowletConfigs( cfg, getMasterLogicalPortIds(),