From fb91234eaccbd85ac378904f3cf633e81eb87358 Mon Sep 17 00:00:00 2001 From: Yue Gao Date: Thu, 26 Feb 2026 14:56:28 -0500 Subject: [PATCH 1/4] Workaround scapy bfd issue in python 3.11 Signed-off-by: Yue Gao --- .../test/files/ptftests/py3/bfd_responder.py | 45 ++++++++++++++----- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/ansible/roles/test/files/ptftests/py3/bfd_responder.py b/ansible/roles/test/files/ptftests/py3/bfd_responder.py index 2375118b660..fbcb0e5d596 100644 --- a/ansible/roles/test/files/ptftests/py3/bfd_responder.py +++ b/ansible/roles/test/files/ptftests/py3/bfd_responder.py @@ -3,11 +3,14 @@ # Line 1: list of port indices to monitor # Line 2: list of ip addresses to respond to. +import logging import ptf import time import ptf.packet as scapy from ptf.base_tests import BaseTest from scapy.contrib.bfd import BFD +from scapy.layers.inet import IP +from scapy.layers.inet6 import IPv6 from ptf.testutils import (send_packet, test_params_get) from ipaddress import ip_address, IPv4Address, IPv6Address session_timeout = 1 @@ -161,19 +164,37 @@ def craft_bfd_packet(self, bfd_remote_disc, bfd_state): ethpart = scapy.Ether(data) - bfdpart = BFD(bytes(ethpart.payload.payload.payload)) + + # Parse only the mandatory 24-byte BFD header; ignore any + # trailing data such as Simple Password authentication. + bfdpart = BFD(bytes(ethpart.payload.payload.payload)[:24]) bfdpart.my_discriminator = my_discriminator bfdpart.your_discriminator = bfd_remote_disc bfdpart.sta = bfd_state - ethpart.payload.payload.payload = bfdpart - ethpart.src = mac_dst - ethpart.dst = mac_src - ethpart.payload.src = ip_dst - ethpart.payload.dst = ip_src - - # recompute UDP checksum - ethpart.payload.payload.chksum = None - ethpart.show() - - return ethpart + # If the A (Auth Present) flag is set, scapy auto-creates a + # phantom OptionalAuth with default auth_key=b'password' even + # when no auth bytes exist on the wire. Clear both to prevent + # the 11-byte auth trailer from being serialized into the + # response packet. + bfdpart.flags = bfdpart.flags & ~0x04 + bfdpart.optional_auth = None + + udp_sport = ethpart[scapy.UDP].sport + udp_dport = ethpart[scapy.UDP].dport + + # Build the response packet from scratch so no cached raw + # bytes (e.g. auth trailing data) leak from the parsed packet. + if ethpart.type == 0x86dd: # IPv6 + pkt = (scapy.Ether(src=mac_dst, dst=mac_src, type=0x86dd) / + IPv6(src=ip_dst, dst=ip_src, hlim=255) / + scapy.UDP(sport=udp_sport, dport=udp_dport) / + bfdpart) + else: # IPv4 + pkt = (scapy.Ether(src=mac_dst, dst=mac_src, type=0x0800) / + IP(src=ip_dst, dst=ip_src, ttl=255) / + scapy.UDP(sport=udp_sport, dport=udp_dport) / + bfdpart) + + pkt.show() + return pkt From 56d1b87ad97e3fbd572cc124a7a29b8289f252f7 Mon Sep 17 00:00:00 2001 From: Yue Gao Date: Thu, 26 Feb 2026 15:44:34 -0500 Subject: [PATCH 2/4] Add debug output Signed-off-by: Yue Gao --- tests/vxlan/test_vxlan_ecmp.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/vxlan/test_vxlan_ecmp.py b/tests/vxlan/test_vxlan_ecmp.py index 24c125f6e8b..6c5c78e7822 100644 --- a/tests/vxlan/test_vxlan_ecmp.py +++ b/tests/vxlan/test_vxlan_ecmp.py @@ -481,6 +481,9 @@ def dump_self_info_and_run_ptf(self, "show ipv6 bgp summary"] if self.vxlan_test_setup['enable_bfd']: cmds.append("show bfd summary") + if self.vxlan_test_setup['duthost'].facts["asic_type"] == "vpp": + cmds.append("docker exec syncd vppctl show errors") + for cmd in cmds: self.vxlan_test_setup['duthost'].shell(cmd) From 294e2165f60a2eda2b95097cd1d80c0b9676e209 Mon Sep 17 00:00:00 2001 From: Yue Gao Date: Thu, 26 Feb 2026 16:51:47 -0500 Subject: [PATCH 3/4] Fix unused import Signed-off-by: Yue Gao --- ansible/roles/test/files/ptftests/py3/bfd_responder.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ansible/roles/test/files/ptftests/py3/bfd_responder.py b/ansible/roles/test/files/ptftests/py3/bfd_responder.py index fbcb0e5d596..0a22442b0de 100644 --- a/ansible/roles/test/files/ptftests/py3/bfd_responder.py +++ b/ansible/roles/test/files/ptftests/py3/bfd_responder.py @@ -3,7 +3,6 @@ # Line 1: list of port indices to monitor # Line 2: list of ip addresses to respond to. -import logging import ptf import time import ptf.packet as scapy From a5661bb4a61b094952214b7676a5494b45cd8cf4 Mon Sep 17 00:00:00 2001 From: Yue Gao Date: Fri, 27 Feb 2026 10:27:29 -0500 Subject: [PATCH 4/4] Remove debug output Signed-off-by: Yue Gao --- tests/vxlan/test_vxlan_ecmp.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/vxlan/test_vxlan_ecmp.py b/tests/vxlan/test_vxlan_ecmp.py index 6c5c78e7822..24c125f6e8b 100644 --- a/tests/vxlan/test_vxlan_ecmp.py +++ b/tests/vxlan/test_vxlan_ecmp.py @@ -481,9 +481,6 @@ def dump_self_info_and_run_ptf(self, "show ipv6 bgp summary"] if self.vxlan_test_setup['enable_bfd']: cmds.append("show bfd summary") - if self.vxlan_test_setup['duthost'].facts["asic_type"] == "vpp": - cmds.append("docker exec syncd vppctl show errors") - for cmd in cmds: self.vxlan_test_setup['duthost'].shell(cmd)