+
def send_packets_and_capture(
self,
packets: list[Packet],
diff --git a/dts/framework/testbed_model/traffic_generator/performance_traffic_generator.py b/dts/framework/testbed_model/traffic_generator/performance_traffic_generator.py
new file mode 100644
index 0000000000..7a384cf6e0
--- /dev/null
+++ b/dts/framework/testbed_model/traffic_generator/performance_traffic_generator.py
@@ -0,0 +1,62 @@
+"""Performance testing capable traffic generatiors."""
+
+from abc import ABC, abstractmethod
+from dataclasses import dataclass
+from typing import Callable
+
+from scapy.packet import Packet
+
+from framework.testbed_model.traffic_generator.traffic_generator import TrafficGenerator
I think this can become:
from .traffic_generator import TrafficGenerator
+
+
+@dataclass(slots=True)
+class PerformanceTrafficStats(ABC):
+ """Data structure for stats offered by a given traffic generator."""
+
+ frame_size: int
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.
+
+
+class PerformanceTrafficGenerator(TrafficGenerator):
+ """An Abstract Base Class for all performance-oriented traffic generators.
+
+ Provides an intermediary interface for performance-based traffic generator.
+ """
+
+ _test_stats: list[PerformanceTrafficStats]
+
+ @property
+ def is_capturing(self) -> bool:
+ """Used for synchronization."""
+ return False
+
+ @property
+ def last_results(self) -> PerformanceTrafficStats | None:
+ """Get the latest set of results from TG instance.
+
+ Returns:
+ The most recent set of traffic statistics.
+ """
+ return self._test_stats.pop(0)
+
+ def generate_traffic_and_stats(
+ self,
+ packet: Packet,
+ duration: float, # Default of 60 (in seconds).
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?
+ ) -> PerformanceTrafficStats:
+ """Send packet traffic and acquire associated statistics."""
+ return self._calculate_traffic_stats(packet, duration, self._generate_traffic)
+
+ def setup(self, ports):
+ """Preliminary port setup prior to TG execution."""
+ for port in self._tg_node.ports:
+ self._tg_node.main_session.configure_port_mtu(2000, port)
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?