<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Wed, Apr 23, 2025 at 3:40 PM Nicholas Pratte <<a href="mailto:npratte@iol.unh.edu">npratte@iol.unh.edu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
+<br>
def send_packets_and_capture(<br>
self,<br>
packets: list[Packet],<br>
diff --git a/dts/framework/testbed_model/traffic_generator/performance_traffic_generator.py b/dts/framework/testbed_model/traffic_generator/performance_traffic_generator.py<br>
new file mode 100644<br>
index 0000000000..7a384cf6e0<br>
--- /dev/null<br>
+++ b/dts/framework/testbed_model/traffic_generator/performance_traffic_generator.py<br>
@@ -0,0 +1,62 @@<br>
+"""Performance testing capable traffic generatiors."""<br>
+<br>
+from abc import ABC, abstractmethod<br>
+from dataclasses import dataclass<br>
+from typing import Callable<br>
+<br>
+from scapy.packet import Packet<br>
+<br>
+from framework.testbed_model.traffic_generator.traffic_generator import TrafficGenerator<br></blockquote><div><br></div><div>I think this can become: </div><div><br></div><div>from .traffic_generator import TrafficGenerator</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+<br>
+@dataclass(slots=True)<br>
+class PerformanceTrafficStats(ABC):<br>
+ """Data structure for stats offered by a given traffic generator."""<br>
+<br>
+ frame_size: int<br></blockquote><div><br></div><div>Do we need to add an optional number of packet descriptors attribute? I realize that is a SUT testpmd param, not a TREX param, but presumably when we gather stats, we want to store the descriptor count with it.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+<br>
+class PerformanceTrafficGenerator(TrafficGenerator):<br>
+ """An Abstract Base Class for all performance-oriented traffic generators.<br>
+<br>
+ Provides an intermediary interface for performance-based traffic generator.<br>
+ """<br>
+<br>
+ _test_stats: list[PerformanceTrafficStats]<br>
+<br>
+ @property<br>
+ def is_capturing(self) -> bool:<br>
+ """Used for synchronization."""<br>
+ return False<br>
+<br>
+ @property<br>
+ def last_results(self) -> PerformanceTrafficStats | None:<br>
+ """Get the latest set of results from TG instance.<br>
+<br>
+ Returns:<br>
+ The most recent set of traffic statistics.<br>
+ """<br>
+ return self._test_stats.pop(0)<br>
+<br>
+ def generate_traffic_and_stats(<br>
+ self,<br>
+ packet: Packet,<br>
+ duration: float, # Default of 60 (in seconds).<br></blockquote><div><br></div><div>Should it be float = 60, so the default is coming from the function, and not a "default" which is coming from the testsuite? If not, I guess the "default" comment belongs in the testsuite?</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+ ) -> PerformanceTrafficStats:<br>
+ """Send packet traffic and acquire associated statistics."""<br>
+ return self._calculate_traffic_stats(packet, duration, self._generate_traffic)<br>
+<br>
+ def setup(self, ports):<br>
+ """Preliminary port setup prior to TG execution."""<br>
+ for port in self._tg_node.ports:<br>
+ self._tg_node.main_session.configure_port_mtu(2000, port)<br></blockquote><div><br></div><div>Okay just checking... so if we do not do this, even after binding the port to vfio-pci we cannot send traffic up to 2000 bytes?</div><div> </div><div>Reviewed-by: Patrick Robb <<a href="mailto:probb@iol.unh.edu">probb@iol.unh.edu</a>></div></div></div>