Skip to content

Commit 6be5e52

Browse files
Nivin Lawrencefacebook-github-bot
authored andcommitted
Fix sflow test for sampledPacketrate
Summary: Sflow sampled packet rate test needs line rate traffic on one port and then sampling to another port. Fixing up a few missing pieces to get the test passing for most platforms. Reviewed By: jasmeetbagga Differential Revision: D68845277 fbshipit-source-id: e3878782c0923c04a3fb499c7002e64bd700a84b
1 parent a249fd3 commit 6be5e52

File tree

1 file changed

+50
-23
lines changed

1 file changed

+50
-23
lines changed

fboss/agent/test/agent_hw_tests/AgentSflowMirrorTest.cpp

Lines changed: 50 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ namespace facebook::fboss {
3838
template <typename AddrT>
3939
class AgentSflowMirrorTest : public AgentHwTest {
4040
public:
41+
// Index in the sample ports where data traffic is expected!
42+
const int kDataTrafficPortIndex{0};
4143
std::vector<production_features::ProductionFeature>
4244
getProductionFeaturesVerified() const override {
4345
if constexpr (std::is_same_v<AddrT, folly::IPAddressV4>) {
@@ -63,6 +65,7 @@ class AgentSflowMirrorTest : public AgentHwTest {
6365
if (asic->isSupported(HwAsic::Feature::EVENTOR_PORT_FOR_SFLOW)) {
6466
utility::addEventorVoqConfig(&cfg, cfg::StreamType::UNICAST);
6567
}
68+
utility::setTTLZeroCpuConfig(ensemble.getL3Asics(), cfg);
6669
return cfg;
6770
}
6871

@@ -265,13 +268,38 @@ class AgentSflowMirrorTest : public AgentHwTest {
265268
}
266269
}
267270

271+
std::string getTrafficDestinationIp(int portIndex) {
272+
return folly::to<std::string>(kIpStr, portIndex, "::1");
273+
}
274+
275+
void setupEcmpTraffic() {
276+
utility::EcmpSetupTargetedPorts6 ecmpHelper{
277+
getProgrammedState(),
278+
utility::getFirstInterfaceMac(getProgrammedState())};
279+
280+
const PortDescriptor port(getDataTrafficPort());
281+
RoutePrefixV6 route{
282+
folly::IPAddressV6(getTrafficDestinationIp(kDataTrafficPortIndex)),
283+
128};
284+
285+
applyNewState([&](const std::shared_ptr<SwitchState>& state) {
286+
return ecmpHelper.resolveNextHops(state, {port});
287+
});
288+
289+
auto routeUpdater = getSw()->getRouteUpdater();
290+
ecmpHelper.programRoutes(&routeUpdater, {port}, {route});
291+
292+
utility::ttlDecrementHandlingForLoopbackTraffic(
293+
getAgentEnsemble(), ecmpHelper.getRouterId(), ecmpHelper.nhop(port));
294+
}
295+
268296
std::unique_ptr<facebook::fboss::TxPacket> genPacket(
269297
int portIndex,
270298
size_t payloadSize) {
271299
auto vlanId = utility::firstVlanID(getProgrammedState());
272300
auto intfMac = utility::getFirstInterfaceMac(getProgrammedState());
273301
folly::IPAddressV6 sip{"2401:db00:dead:beef::2401"};
274-
folly::IPAddressV6 dip{folly::to<std::string>(kIpStr, portIndex, "::1")};
302+
folly::IPAddressV6 dip{getTrafficDestinationIp(portIndex)};
275303
uint16_t sport = 9701;
276304
uint16_t dport = 9801;
277305
std::vector<uint8_t> payload(payloadSize, 0xff);
@@ -449,42 +477,43 @@ class AgentSflowMirrorTest : public AgentHwTest {
449477
}
450478

451479
uint64_t getSampleCount(const std::map<PortID, HwPortStats>& stats) {
452-
auto portStats = stats.at(getPortsForSampling()[0]);
480+
const auto& portStats = stats.at(getNonSflowSampledInterfacePort());
453481
return *portStats.outUnicastPkts_();
454482
}
455483

484+
const PortID getDataTrafficPort() {
485+
return getPortsForSampling()[kDataTrafficPortIndex];
486+
}
487+
456488
uint64_t getExpectedSampleCount(const std::map<PortID, HwPortStats>& stats) {
457489
uint64_t expectedSampleCount = 0;
458-
uint64_t allPortRx = 0;
459-
for (auto i = 1; i < getPortsForSampling().size(); i++) {
460-
auto port = getPortsForSampling()[i];
461-
auto portStats = stats.at(port);
462-
allPortRx += *portStats.inUnicastPkts_();
463-
expectedSampleCount +=
464-
(*portStats.inUnicastPkts_() / FLAGS_sflow_test_rate);
465-
}
466-
XLOG(DBG2) << "total packets rx " << allPortRx;
490+
auto port = getDataTrafficPort();
491+
const auto& portStats = stats.at(port);
492+
expectedSampleCount = (*portStats.inUnicastPkts_() / FLAGS_sflow_test_rate);
493+
XLOG(DBG2) << "total packets rx " << *portStats.inUnicastPkts_();
467494
return expectedSampleCount;
468495
}
469496

470497
void verifySampledPacketRate() {
471-
auto ports = getPortsForSampling();
472-
473-
auto pkt = genPacket(1, 256);
474-
475-
for (auto i = 1; i < ports.size(); i++) {
498+
auto trafficPort = getDataTrafficPort();
499+
for (int i = 0; i < getAgentEnsemble()->getMinPktsForLineRate(trafficPort);
500+
i++) {
501+
auto pkt = genPacket(kDataTrafficPortIndex, 256 /*payloadSize*/);
476502
getAgentEnsemble()->sendPacketAsync(
477-
std::move(pkt), PortDescriptor(ports[i]), std::nullopt);
478-
getAgentEnsemble()->waitForLineRateOnPort(ports[i]);
503+
std::move(pkt), PortDescriptor(trafficPort), std::nullopt);
479504
}
505+
getAgentEnsemble()->waitForLineRateOnPort(trafficPort);
480506

507+
auto ports = getPortsForSampling();
481508
getAgentEnsemble()->bringDownPorts(
482509
std::vector<PortID>(ports.begin() + 1, ports.end()));
483-
510+
ports.push_back(getNonSflowSampledInterfacePort());
484511
WITH_RETRIES({
485-
auto stats = getLatestPortStats(getPortsForSampling());
512+
auto stats = getLatestPortStats(ports);
486513
auto actualSampleCount = getSampleCount(stats);
487514
auto expectedSampleCount = getExpectedSampleCount(stats);
515+
XLOG(DBG2) << "Number of sflow samples expected: " << expectedSampleCount
516+
<< ", samples seen: " << actualSampleCount;
488517
auto difference = (expectedSampleCount > actualSampleCount)
489518
? (expectedSampleCount - actualSampleCount)
490519
: (actualSampleCount - expectedSampleCount);
@@ -493,8 +522,6 @@ class AgentSflowMirrorTest : public AgentHwTest {
493522
}
494523
auto percentError = (difference * 100) / actualSampleCount;
495524
EXPECT_EVENTUALLY_LE(percentError, kDefaultPercentErrorThreshold);
496-
XLOG(DBG2) << "expected number of " << expectedSampleCount << " samples";
497-
XLOG(DBG2) << "captured number of " << actualSampleCount << " samples";
498525
});
499526

500527
getAgentEnsemble()->bringUpPorts(
@@ -527,9 +554,9 @@ class AgentSflowMirrorTest : public AgentHwTest {
527554
auto config = initialConfig(*getAgentEnsemble());
528555
configureMirror(config);
529556
configSampling(config, FLAGS_sflow_test_rate);
530-
configureTrapAcl(config);
531557
applyNewConfig(config);
532558
resolveRouteForMirrorDestination();
559+
setupEcmpTraffic();
533560
};
534561
auto verify = [=, this]() { verifySampledPacketRate(); };
535562
verifyAcrossWarmBoots(setup, verify);

0 commit comments

Comments
 (0)