@@ -38,6 +38,8 @@ namespace facebook::fboss {
38
38
template <typename AddrT>
39
39
class AgentSflowMirrorTest : public AgentHwTest {
40
40
public:
41
+ // Index in the sample ports where data traffic is expected!
42
+ const int kDataTrafficPortIndex {0 };
41
43
std::vector<production_features::ProductionFeature>
42
44
getProductionFeaturesVerified () const override {
43
45
if constexpr (std::is_same_v<AddrT, folly::IPAddressV4>) {
@@ -63,6 +65,7 @@ class AgentSflowMirrorTest : public AgentHwTest {
63
65
if (asic->isSupported (HwAsic::Feature::EVENTOR_PORT_FOR_SFLOW)) {
64
66
utility::addEventorVoqConfig (&cfg, cfg::StreamType::UNICAST);
65
67
}
68
+ utility::setTTLZeroCpuConfig (ensemble.getL3Asics (), cfg);
66
69
return cfg;
67
70
}
68
71
@@ -265,13 +268,38 @@ class AgentSflowMirrorTest : public AgentHwTest {
265
268
}
266
269
}
267
270
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
+
268
296
std::unique_ptr<facebook::fboss::TxPacket> genPacket (
269
297
int portIndex,
270
298
size_t payloadSize) {
271
299
auto vlanId = utility::firstVlanID (getProgrammedState ());
272
300
auto intfMac = utility::getFirstInterfaceMac (getProgrammedState ());
273
301
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)};
275
303
uint16_t sport = 9701 ;
276
304
uint16_t dport = 9801 ;
277
305
std::vector<uint8_t > payload (payloadSize, 0xff );
@@ -449,42 +477,43 @@ class AgentSflowMirrorTest : public AgentHwTest {
449
477
}
450
478
451
479
uint64_t getSampleCount (const std::map<PortID, HwPortStats>& stats) {
452
- auto portStats = stats.at (getPortsForSampling ()[ 0 ] );
480
+ const auto & portStats = stats.at (getNonSflowSampledInterfacePort () );
453
481
return *portStats.outUnicastPkts_ ();
454
482
}
455
483
484
+ const PortID getDataTrafficPort () {
485
+ return getPortsForSampling ()[kDataTrafficPortIndex ];
486
+ }
487
+
456
488
uint64_t getExpectedSampleCount (const std::map<PortID, HwPortStats>& stats) {
457
489
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_ ();
467
494
return expectedSampleCount;
468
495
}
469
496
470
497
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*/ );
476
502
getAgentEnsemble ()->sendPacketAsync (
477
- std::move (pkt), PortDescriptor (ports[i]), std::nullopt);
478
- getAgentEnsemble ()->waitForLineRateOnPort (ports[i]);
503
+ std::move (pkt), PortDescriptor (trafficPort), std::nullopt);
479
504
}
505
+ getAgentEnsemble ()->waitForLineRateOnPort (trafficPort);
480
506
507
+ auto ports = getPortsForSampling ();
481
508
getAgentEnsemble ()->bringDownPorts (
482
509
std::vector<PortID>(ports.begin () + 1 , ports.end ()));
483
-
510
+ ports. push_back ( getNonSflowSampledInterfacePort ());
484
511
WITH_RETRIES ({
485
- auto stats = getLatestPortStats (getPortsForSampling () );
512
+ auto stats = getLatestPortStats (ports );
486
513
auto actualSampleCount = getSampleCount (stats);
487
514
auto expectedSampleCount = getExpectedSampleCount (stats);
515
+ XLOG (DBG2) << " Number of sflow samples expected: " << expectedSampleCount
516
+ << " , samples seen: " << actualSampleCount;
488
517
auto difference = (expectedSampleCount > actualSampleCount)
489
518
? (expectedSampleCount - actualSampleCount)
490
519
: (actualSampleCount - expectedSampleCount);
@@ -493,8 +522,6 @@ class AgentSflowMirrorTest : public AgentHwTest {
493
522
}
494
523
auto percentError = (difference * 100 ) / actualSampleCount;
495
524
EXPECT_EVENTUALLY_LE (percentError, kDefaultPercentErrorThreshold );
496
- XLOG (DBG2) << " expected number of " << expectedSampleCount << " samples" ;
497
- XLOG (DBG2) << " captured number of " << actualSampleCount << " samples" ;
498
525
});
499
526
500
527
getAgentEnsemble ()->bringUpPorts (
@@ -527,9 +554,9 @@ class AgentSflowMirrorTest : public AgentHwTest {
527
554
auto config = initialConfig (*getAgentEnsemble ());
528
555
configureMirror (config);
529
556
configSampling (config, FLAGS_sflow_test_rate);
530
- configureTrapAcl (config);
531
557
applyNewConfig (config);
532
558
resolveRouteForMirrorDestination ();
559
+ setupEcmpTraffic ();
533
560
};
534
561
auto verify = [=, this ]() { verifySampledPacketRate (); };
535
562
verifyAcrossWarmBoots (setup, verify);
0 commit comments