On Fri, Oct 24, 2025 at 2:51 PM Dean Marx <dmarx@iol.unh.edu> wrote:

+    @requires(topology_type=LinkTopology.TWO_LINKS)
+    @func_test
+    def pvp_loop(self) -> None:
+        """Test vhost/virtio physical-virtual-physical topology.
+
+        Steps:
+            * Launch testpmd session with a physical NIC and virtio-user vdev
+                connected to a vhost-net socket.
+            * Configure the tap interface that is created with IP address and
+                set link state to UP.
+            * Launch second testpmd session with af_packet vdev connected to
+                the tap interface.
+            * Start packet forwarding on both testpmd sessions.
+            * Send 100 packets to the physical interface from external tester.
+            * Capture packets on the same physical interface.
+
+        Verify:
+            * Vhost session receives/forwards 100+ packets.
+            * Physical interface receives all 100 sent packets.
+        """
+        self.sut_node = self._ctx.sut_node
+        if not isinstance(self.sut_node.main_session, LinuxSession):
+            verify(False, "Must be running on a Linux environment.")
+        with TestPmd(
+            prefix="virtio",
+            vdevs=[VirtualDevice("virtio_user0,path=/dev/vhost-net,queues=1,queue_size=1024")],
+        ) as virtio:
+            self.sut_node.main_session.set_interface_link_up(name="tap0")

Is it the case that if I already have tap0 created on my SUT machine, this testsuite will create a tap1 and then the testsuite will fail to run properly on the line above (because tap1 won't be brought up)? If there is no way of getting around this limitation, we should add a new capability for "tap interface names available" or something and skip if tap0 is found in "ip a" or a similar solution.
 
+            with TestPmd(
+                prefix="vhost", no_pci=True, vdevs=[VirtualDevice("net_af_packet0,iface=tap0")]
+            ) as vhost:
+                virtio.set_forward_mode(SimpleForwardingModes.mac)
+                vhost.set_forward_mode(SimpleForwardingModes.mac)
+                vhost.start()
+                virtio.start()
+
+                packet = Ether() / IP()
+                packets = [packet] * 100
+                captured_packets = send_packets_and_capture(packets)
+
+                vhost.stop()
+                virtio.stop()
+
+                vhost_forwarding_stats, vhost_raw_output = vhost.show_port_stats_all()
+
+                rx_packets = vhost_forwarding_stats[0].rx_packets
+                tx_packets = vhost_forwarding_stats[0].tx_packets
+
+                log(f"Vhost forwarding statistics:\n{vhost_raw_output}")
+
+                verify(
+                    rx_packets >= 100 and tx_packets >= 100,
+                    f"PVP loop forwarding verification failed: vhost interface RX={rx_packets},"
+                    f" TX={tx_packets} (expected ≥100 each).",
+                )
+
+                verify(
+                    len(captured_packets) >= 100, "Sent packets not received on physical interface."
+                )
--
2.51.0



Otherwise, change the pvp requirement to ONE_LINK, set portlist to 0, 2, 1 (2 is the vdev) when 2 link topology, and 0, 1 when 1 link, and set forwarding to chained mode so that the packet forwarding works as expected regardless of whether we have 1 or 2 physical interfaces the testpmd instance is using.

Thanks.

Reviewed-by: Patrick Robb <probb@iol.unh.edu>