Skip to content

Commit 8da1d50

Browse files
authored
Verify BFD traffic egress queue and default ToS (#10048)
* BFD queue 7 test * Fixed sanity checks * Addressed comments * Update bfd_responder to check BFD packet's ToS value
1 parent 78885c2 commit 8da1d50

2 files changed

Lines changed: 37 additions & 4 deletions

File tree

ansible/roles/test/files/helpers/bfd_responder.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ def poll(self):
7878
class BFDResponder(object):
7979
def __init__(self, sessions):
8080
self.sessions = sessions
81+
self.bfd_default_ip_tos = 192
8182
return
8283

8384
def action(self, interface):
@@ -110,9 +111,13 @@ def extract_bfd_info(self, data):
110111
mac_dst = ether.dst
111112
ip_src = ether.payload.src
112113
ip_dst = ether.payload.dst
114+
ip_tos = ether.payload.tos
113115
bfdpkt = BFD(ether.payload.payload.payload.load)
114116
bfd_remote_disc = bfdpkt.my_discriminator
115117
bfd_state = bfdpkt.sta
118+
if ip_tos != self.bfd_default_ip_tos:
119+
raise RuntimeError("Received BFD packet with incorrect tos: {}".format(ip_tos))
120+
logging.debug('BFD packet info: sip {}, dip {}, tos {}'.format(ip_src, ip_dst, ip_tos))
116121
return mac_src, mac_dst, ip_src, ip_dst, bfd_remote_disc, bfd_state
117122

118123
def craft_bfd_packet(self, session, data, mac_src, mac_dst, ip_src, ip_dst, bfd_remote_disc, bfd_state):

tests/bfd/test_bfd.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
import random
33
import time
44
import json
5+
import logging
56

67
from tests.common.dualtor.mux_simulator_control import toggle_all_simulator_ports_to_rand_selected_tor_m # noqa F401
8+
from tests.common.snappi_tests.common_helpers import get_egress_queue_count
79

810
pytestmark = [
911
pytest.mark.topology('t1')
@@ -12,6 +14,8 @@
1214
BFD_RESPONDER_SCRIPT_SRC_PATH = '../ansible/roles/test/files/helpers/bfd_responder.py'
1315
BFD_RESPONDER_SCRIPT_DEST_PATH = '/opt/bfd_responder.py'
1416

17+
logger = logging.getLogger(__name__)
18+
1519

1620
def is_dualtor(tbinfo):
1721
"""Check if the testbed is dualtor."""
@@ -141,6 +145,7 @@ def get_neighbors_multihop(duthost, tbinfo, ipv6=False, count=1):
141145
index = random.sample(list(range(len(t0_intfs))), k=1)[0]
142146
port_intf = t0_intfs[index]
143147
ptf_intf = ptf_ports[index]
148+
logger.debug("BFD multihop, DUT interface name: {}".format(port_intf))
144149
nexthop_ip = ""
145150
neighbour_dev_name = mg_facts['minigraph_neighbors'][port_intf]['name']
146151
for bgpinfo in mg_facts['minigraph_bgp']:
@@ -162,7 +167,7 @@ def get_neighbors_multihop(duthost, tbinfo, ipv6=False, count=1):
162167
else:
163168
neighbor_addrs.append(t0_ipv4_pattern.format((idx % 250), idx2))
164169

165-
return loopback_addr, ptf_intf, nexthop_ip, neighbor_addrs
170+
return loopback_addr, ptf_intf, nexthop_ip, neighbor_addrs, port_intf
166171

167172

168173
def init_ptf_bfd(ptfhost):
@@ -263,6 +268,7 @@ def create_bfd_sessions_multihop(ptfhost, duthost, loopback_addr, ptf_intf, neig
263268
bfd_config = []
264269
ptf_config = []
265270
for neighbor_addr in neighbor_addrs:
271+
logger.info("create BFD sessions, loopback {} neighbor ip {}".format(loopback_addr, neighbor_addr))
266272
bfd_config.append({
267273
"BFD_SESSION_TABLE:default:default:{}".format(neighbor_addr): {
268274
"local_addr": loopback_addr,
@@ -299,6 +305,8 @@ def create_bfd_sessions_multihop(ptfhost, duthost, loopback_addr, ptf_intf, neig
299305
ptfhost.command('supervisorctl reread')
300306
ptfhost.command('supervisorctl update')
301307
ptfhost.command('supervisorctl start bfd_responder')
308+
temp = duthost.shell('show bfd summary')
309+
logger.info("BFD Summary dump: {}".format(temp['stdout']))
302310

303311

304312
def remove_bfd_sessions(duthost, neighbor_addrs):
@@ -330,6 +338,23 @@ def update_bfd_state(ptfhost, neighbor_addr, local_addr, state):
330338
ptfhost.shell("bfdd-control session local {} remote {} {}".format(neighbor_addr, local_addr, state))
331339

332340

341+
def verify_bfd_queue_counters(duthost, dut_intf):
342+
queue_output = duthost.shell("show queue counters {}".format(dut_intf))
343+
logger.debug("Queue output: {}".format(queue_output['stdout']))
344+
345+
for queue_val in range(0, 7):
346+
queue_pkt_count, _ = get_egress_queue_count(duthost, dut_intf, int(queue_val))
347+
logger.debug("Interface {}, Queue {}, counter {}".format(dut_intf, queue_val, queue_pkt_count))
348+
if queue_pkt_count != 0:
349+
pytest.fail('Queue {} count is not zero, BFD packets might use this'.format(queue_val))
350+
351+
bfd_queue = 7
352+
queue_pkt_count, _ = get_egress_queue_count(duthost, dut_intf, int(bfd_queue))
353+
logger.debug("Queue counters: {}".format(queue_pkt_count))
354+
if queue_pkt_count == 0:
355+
pytest.fail('Queue 7 packet count is zero, no BFD traffic')
356+
357+
333358
@pytest.mark.parametrize('dut_init_first', [True, False], ids=['dut_init_first', 'ptf_init_first'])
334359
@pytest.mark.parametrize('ipv6', [False, True], ids=['ipv4', 'ipv6'])
335360
def test_bfd_basic(request, rand_selected_dut, ptfhost, tbinfo, ipv6, dut_init_first):
@@ -419,8 +444,8 @@ def test_bfd_multihop(request, rand_selected_dut, ptfhost, tbinfo,
419444
duthost = rand_selected_dut
420445

421446
bfd_session_cnt = int(request.config.getoption('--num_sessions'))
422-
loopback_addr, ptf_intf, nexthop_ip, neighbor_addrs = get_neighbors_multihop(duthost, tbinfo, ipv6,
423-
count=bfd_session_cnt)
447+
loopback_addr, ptf_intf, nexthop_ip, neighbor_addrs, dut_intf = get_neighbors_multihop(duthost, tbinfo, ipv6,
448+
count=bfd_session_cnt)
424449
try:
425450
cmd_buffer = ""
426451
for neighbor in neighbor_addrs:
@@ -432,7 +457,10 @@ def test_bfd_multihop(request, rand_selected_dut, ptfhost, tbinfo,
432457
time.sleep(1)
433458
for neighbor_addr in neighbor_addrs:
434459
check_dut_bfd_status(duthost, neighbor_addr, "Up")
435-
460+
duthost.shell("sonic-clear queuecounters")
461+
# sleep for 10 seconds to check queue counters
462+
time.sleep(10)
463+
verify_bfd_queue_counters(duthost, dut_intf)
436464
finally:
437465
remove_bfd_sessions(duthost, neighbor_addrs)
438466
cmd_buffer = ""

0 commit comments

Comments
 (0)