From patchwork Mon Nov 13 20:28:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Spewock X-Patchwork-Id: 134182 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id CFB7A4331E; Mon, 13 Nov 2023 21:29:19 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3BCD140A67; Mon, 13 Nov 2023 21:28:57 +0100 (CET) Received: from mail-wm1-f97.google.com (mail-wm1-f97.google.com [209.85.128.97]) by mails.dpdk.org (Postfix) with ESMTP id 8C40D402E6 for ; Mon, 13 Nov 2023 21:28:53 +0100 (CET) Received: by mail-wm1-f97.google.com with SMTP id 5b1f17b1804b1-40839807e82so28613005e9.0 for ; Mon, 13 Nov 2023 12:28:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1699907333; x=1700512133; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hdJVf3ypWMnb9Qt4IiEySc5/AHylOmI4+9ZLJPRV+8A=; b=CzEyDqBfZrtprRxg4XcGvjei2mFp+W9dgogniWGJ4Uz0DsRCKSE7ZuBK19CgK2Pxtr oXemV9uWHH7jj4x5jNNK3vN0oL/974o3AF+339ZxyiQ0AmLF1z3I9n8p7CwGsVBMlswI 3PzBVfrUeH9qfi2VSRkQJHskMLqni5KhPqOlk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1699907333; x=1700512133; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hdJVf3ypWMnb9Qt4IiEySc5/AHylOmI4+9ZLJPRV+8A=; b=LXxfqkeHVRtklB+6iXpIgDkWIlpMhwby1s909dBmMtk/o97pxXiEYN9cVTnhr+1eOh 4RoyG016z0RtwZG6d5m9bpIl2zqZoySgwfU1zrwMfOjgY0cUzmYf8gn91XHAe2pHrhrJ 2BZd32CiF9PvidEjM7lVgRe6wFH1SqqCpTChmMy5aS1h4ljszVjSDrr426QIpCuR/SAk yeqeYrLlRFVCa4HKllW4Tc2VQCKTkIhIdeYnMSLDH20OpntV80GiNAQd6lDrSiuAd0KR HJ7YMwhSMVO8BGtKugRluqARbWcGJQTj2kPL2H8OtMR6ZhS2wNMufCi2riJq5ztk9K1B QVVQ== X-Gm-Message-State: AOJu0YzrCt5cMaAxTcA/odGIuLazZBY3OpcUQ1uKoCFDVGxI8KsezYNJ 2MZjSnl9VMzBnEhzfb5CkM0vE32zGi2s7+gQIYRV8U0r81Fv2sn6eoDfczKm1KShjQ== X-Google-Smtp-Source: AGHT+IE2EelwBhJOpnr8+luaWmXM4uqOULMXNlbIgr3aMUzPhqXN7Jw5bLIGSU4Qg2HoD6oKbx+27NpemTdS X-Received: by 2002:a05:600c:5025:b0:3fe:d67d:5040 with SMTP id n37-20020a05600c502500b003fed67d5040mr465943wmr.5.1699907333126; Mon, 13 Nov 2023 12:28:53 -0800 (PST) Received: from postal.iol.unh.edu (postal.iol.unh.edu. [2606:4100:3880:1234::84]) by smtp-relay.gmail.com with ESMTPS id r22-20020a05600c159600b0040654dc5913sm5582331wmf.26.2023.11.13.12.28.52 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Nov 2023 12:28:53 -0800 (PST) X-Relaying-Domain: iol.unh.edu Received: from iol.unh.edu (unknown [IPv6:2606:4100:3880:1271:90f9:1b64:f6e6:867f]) by postal.iol.unh.edu (Postfix) with ESMTP id DBAA4605C345; Mon, 13 Nov 2023 15:28:51 -0500 (EST) From: jspewock@iol.unh.edu To: Honnappa.Nagarahalli@arm.com, juraj.linkes@pantheon.tech, thomas@monjalon.net, wathsala.vithanage@arm.com, probb@iol.unh.edu, paul.szczepanek@arm.com, yoan.picchi@foss.arm.com, ferruh.yigit@amd.com, andrew.rybchenko@oktetlabs.ru Cc: dev@dpdk.org, Jeremy Spewock Subject: [PATCH v3 5/7] dts: add optional packet filtering to scapy sniffer Date: Mon, 13 Nov 2023 15:28:10 -0500 Message-ID: <20231113202833.12900-6-jspewock@iol.unh.edu> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231113202833.12900-1-jspewock@iol.unh.edu> References: <20231113202833.12900-1-jspewock@iol.unh.edu> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Jeremy Spewock Added the options to filter out LLDP and ARP packets when sniffing for packets with scapy. This was done using BPF filters to ensure that the noise these packets provide does not interfere with test cases. Signed-off-by: Jeremy Spewock --- dts/framework/test_suite.py | 13 +++++++++++-- .../testbed_model/capturing_traffic_generator.py | 12 +++++++++++- dts/framework/testbed_model/scapy.py | 11 ++++++++++- dts/framework/testbed_model/tg_node.py | 4 +++- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/dts/framework/test_suite.py b/dts/framework/test_suite.py index 3b890c0451..3222f172f3 100644 --- a/dts/framework/test_suite.py +++ b/dts/framework/test_suite.py @@ -152,7 +152,11 @@ def _configure_ipv4_forwarding(self, enable: bool) -> None: self.sut_node.configure_ipv4_forwarding(enable) def send_packet_and_capture( - self, packet: Packet, duration: float = 1 + self, + packet: Packet, + duration: float = 1, + no_lldp: bool = True, + no_arp: bool = True, ) -> list[Packet]: """ Send a packet through the appropriate interface and @@ -162,7 +166,12 @@ def send_packet_and_capture( """ packet = self._adjust_addresses(packet) return self.tg_node.send_packet_and_capture( - packet, self._tg_port_egress, self._tg_port_ingress, duration + packet, + self._tg_port_egress, + self._tg_port_ingress, + duration, + no_lldp, + no_arp, ) def get_expected_packet(self, packet: Packet) -> Packet: diff --git a/dts/framework/testbed_model/capturing_traffic_generator.py b/dts/framework/testbed_model/capturing_traffic_generator.py index ab98987f8e..0a0d0f7d0d 100644 --- a/dts/framework/testbed_model/capturing_traffic_generator.py +++ b/dts/framework/testbed_model/capturing_traffic_generator.py @@ -52,6 +52,8 @@ def send_packet_and_capture( send_port: Port, receive_port: Port, duration: float, + no_lldp: bool, + no_arp: bool, capture_name: str = _get_default_capture_name(), ) -> list[Packet]: """Send a packet, return received traffic. @@ -71,7 +73,7 @@ def send_packet_and_capture( A list of received packets. May be empty if no packets are captured. """ return self.send_packets_and_capture( - [packet], send_port, receive_port, duration, capture_name + [packet], send_port, receive_port, duration, no_lldp, no_arp, capture_name ) def send_packets_and_capture( @@ -80,6 +82,8 @@ def send_packets_and_capture( send_port: Port, receive_port: Port, duration: float, + no_lldp: bool, + no_arp: bool, capture_name: str = _get_default_capture_name(), ) -> list[Packet]: """Send packets, return received traffic. @@ -93,6 +97,8 @@ def send_packets_and_capture( send_port: The egress port on the TG node. receive_port: The ingress port in the TG node. duration: Capture traffic for this amount of time after sending the packets. + no_lldp: Option to disable capturing LLDP packets + no_arp: Option to disable capturing ARP packets capture_name: The name of the .pcap file where to store the capture. Returns: @@ -108,6 +114,8 @@ def send_packets_and_capture( send_port, receive_port, duration, + no_lldp, + no_arp, ) self._logger.debug( @@ -123,6 +131,8 @@ def _send_packets_and_capture( send_port: Port, receive_port: Port, duration: float, + no_lldp: bool, + no_arp: bool, ) -> list[Packet]: """ The extended classes must implement this method which diff --git a/dts/framework/testbed_model/scapy.py b/dts/framework/testbed_model/scapy.py index af0d4dbb25..58f01af21a 100644 --- a/dts/framework/testbed_model/scapy.py +++ b/dts/framework/testbed_model/scapy.py @@ -69,6 +69,7 @@ def scapy_send_packets_and_capture( send_iface: str, recv_iface: str, duration: float, + sniff_filter: str, ) -> list[bytes]: """RPC function to send and capture packets. @@ -90,6 +91,7 @@ def scapy_send_packets_and_capture( iface=recv_iface, store=True, started_callback=lambda *args: scapy.all.sendp(scapy_packets, iface=send_iface), + filter=sniff_filter, ) sniffer.start() time.sleep(duration) @@ -264,10 +266,16 @@ def _send_packets_and_capture( send_port: Port, receive_port: Port, duration: float, + no_lldp: bool, + no_arp: bool, capture_name: str = _get_default_capture_name(), ) -> list[Packet]: binary_packets = [packet.build() for packet in packets] - + sniff_filter = [] + if no_lldp: + sniff_filter.append("ether[12:2] != 0x88cc") + if no_arp: + sniff_filter.append("ether[12:2] != 0x0806") xmlrpc_packets: list[ xmlrpc.client.Binary ] = self.rpc_server_proxy.scapy_send_packets_and_capture( @@ -275,6 +283,7 @@ def _send_packets_and_capture( send_port.logical_name, receive_port.logical_name, duration, + " && ".join(sniff_filter), ) # type: ignore[assignment] scapy_packets = [Ether(packet.data) for packet in xmlrpc_packets] diff --git a/dts/framework/testbed_model/tg_node.py b/dts/framework/testbed_model/tg_node.py index 27025cfa31..98e55b7831 100644 --- a/dts/framework/testbed_model/tg_node.py +++ b/dts/framework/testbed_model/tg_node.py @@ -56,6 +56,8 @@ def send_packet_and_capture( send_port: Port, receive_port: Port, duration: float = 1, + no_lldp: bool = True, + no_arp: bool = True, ) -> list[Packet]: """Send a packet, return received traffic. @@ -73,7 +75,7 @@ def send_packet_and_capture( A list of received packets. May be empty if no packets are captured. """ return self.traffic_generator.send_packet_and_capture( - packet, send_port, receive_port, duration + packet, send_port, receive_port, duration, no_lldp, no_arp ) def close(self) -> None: