Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 31 additions & 14 deletions ansible/roles/test/files/ptftests/fib_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,12 @@ def setUp(self):
- ipv4/ipv6: enable ipv4/ipv6 tests

Other test parameters:
- ttl: ttl of test pkts. Auto decrease 1 for expected pkts.
- ip_options enable ip option header in ipv4 pkts. Default: False(disable)
- src_vid vlan tag id of src pkts. Default: None(untag)
- dst_vid vlan tag id of dst pkts. Default: None(untag)
- ignore_ttl: mask the ttl field in the expected packet
- ttl: ttl of test pkts. Auto decrease 1 for expected pkts.
- ip_options enable ip option header in ipv4 pkts. Default: False(disable)
- src_vid vlan tag id of src pkts. Default: None(untag)
- dst_vid vlan tag id of dst pkts. Default: None(untag)
- ignore_ttl: mask the ttl field in the expected packet
- single_fib_for_duts: have a single fib file for all DUTs in multi-dut case. Default: False
'''
self.dataplane = ptf.dataplane_instance

Expand Down Expand Up @@ -134,6 +135,7 @@ def setUp(self):
self.src_ports = [int(port) for port in self.ptf_test_port_map.keys()]

self.ignore_ttl = self.test_params.get('ignore_ttl', False)
self.single_fib = self.test_params.get('single_fib_for_duts', False)

def check_ip_ranges(self, ipv4=True):
for dut_index, fib in enumerate(self.fibs):
Expand All @@ -157,7 +159,10 @@ def check_ip_ranges(self, ipv4=True):
def get_src_and_exp_ports(self, dst_ip):
while True:
src_port = int(random.choice(self.src_ports))
active_dut_index = self.ptf_test_port_map[str(src_port)]['target_dut']
if self.single_fib:
active_dut_index = 0
else:
active_dut_index = self.ptf_test_port_map[str(src_port)]['target_dut']
next_hop = self.fibs[active_dut_index][dst_ip]
exp_port_list = next_hop.get_next_hop_list()
if src_port in exp_port_list:
Expand Down Expand Up @@ -237,7 +242,6 @@ def check_ipv4_route(self, src_port, dst_ip_addr, dst_port_list):
src_mac = self.dataplane.get_mac(0, src_port)

router_mac = self.ptf_test_port_map[str(src_port)]['target_mac']
exp_router_mac = self.router_macs[self.ptf_test_port_map[str(src_port)]['target_dut']]

pkt = simple_tcp_packet(
pktlen=self.pktlen,
Expand All @@ -253,7 +257,6 @@ def check_ipv4_route(self, src_port, dst_ip_addr, dst_port_list):
vlan_vid=self.src_vid or 0)
exp_pkt = simple_tcp_packet(
self.pktlen,
eth_src=exp_router_mac,
ip_src=ip_src,
ip_dst=ip_dst,
tcp_sport=sport,
Expand All @@ -264,6 +267,7 @@ def check_ipv4_route(self, src_port, dst_ip_addr, dst_port_list):
vlan_vid=self.dst_vid or 0)
masked_exp_pkt = Mask(exp_pkt)
masked_exp_pkt.set_do_not_care_scapy(scapy.Ether, "dst")
masked_exp_pkt.set_do_not_care_scapy(scapy.Ether, "src")

# mask the chksum also if masking the ttl
if self.ignore_ttl:
Expand All @@ -281,15 +285,22 @@ def check_ipv4_route(self, src_port, dst_ip_addr, dst_port_list):
dport,
src_port))
logging.info('Expect Ether(src={}, dst={})/IP(src={}, dst={})/TCP(sport={}, dport={})'\
.format(exp_router_mac,
.format('any',
'any',
ip_src,
ip_dst,
sport,
dport))

if self.pkt_action == self.ACTION_FWD:
return verify_packet_any_port(self, masked_exp_pkt, dst_port_list)
rcvd_port, rcvd_pkt = verify_packet_any_port(self,masked_exp_pkt,dst_port_list)
exp_src_mac = self.router_macs[self.ptf_test_port_map[str(dst_port_list[rcvd_port])]['target_dut']]
actual_src_mac = Ether(rcvd_pkt).src
if exp_src_mac != actual_src_mac:
raise Exception("Pkt sent from {} to {} on port {} was rcvd pkt on {} which is one of the expected ports, "
"but the src mac doesn't match, expected {}, got {}".
format(ip_src, ip_dst, src_port, dst_port_list[rcvd_port], exp_src_mac, actual_src_mac))
return (rcvd_port, rcvd_pkt)
elif self.pkt_action == self.ACTION_DROP:
return verify_no_packet_any(self, masked_exp_pkt, dst_port_list)
#---------------------------------------------------------------------
Expand All @@ -309,7 +320,6 @@ def check_ipv6_route(self, src_port, dst_ip_addr, dst_port_list):
src_mac = self.dataplane.get_mac(0, src_port)

router_mac = self.ptf_test_port_map[str(src_port)]['target_mac']
exp_router_mac = self.router_macs[self.ptf_test_port_map[str(src_port)]['target_dut']]

pkt = simple_tcpv6_packet(
pktlen=self.pktlen,
Expand All @@ -324,7 +334,6 @@ def check_ipv6_route(self, src_port, dst_ip_addr, dst_port_list):
vlan_vid=self.src_vid or 0)
exp_pkt = simple_tcpv6_packet(
pktlen=self.pktlen,
eth_src=exp_router_mac,
ipv6_dst=ip_dst,
ipv6_src=ip_src,
tcp_sport=sport,
Expand All @@ -334,6 +343,7 @@ def check_ipv6_route(self, src_port, dst_ip_addr, dst_port_list):
vlan_vid=self.dst_vid or 0)
masked_exp_pkt = Mask(exp_pkt)
masked_exp_pkt.set_do_not_care_scapy(scapy.Ether,"dst")
masked_exp_pkt.set_do_not_care_scapy(scapy.Ether,"src")

# mask the chksum also if masking the ttl
if self.ignore_ttl:
Expand All @@ -350,15 +360,22 @@ def check_ipv6_route(self, src_port, dst_ip_addr, dst_port_list):
sport,
dport))
logging.info('Expect Ether(src={}, dst={})/IPv6(src={}, dst={})/TCP(sport={}, dport={})'\
.format(exp_router_mac,
.format('any',
'any',
ip_src,
ip_dst,
sport,
dport))

if self.pkt_action == self.ACTION_FWD:
return verify_packet_any_port(self, masked_exp_pkt, dst_port_list)
rcvd_port, rcvd_pkt = verify_packet_any_port(self, masked_exp_pkt, dst_port_list)
exp_src_mac = self.router_macs[self.ptf_test_port_map[str(dst_port_list[rcvd_port])]['target_dut']]
actual_src_mac = Ether(rcvd_pkt).src
if actual_src_mac != exp_src_mac:
raise Exception("Pkt sent from {} to {} on port {} was rcvd pkt on {} which is one of the expected ports, "
"but the src mac doesn't match, expected {}, got {}".
format(ip_src, ip_dst, src_port, dst_port_list[rcvd_port], exp_src_mac, actual_src_mac))
return (rcvd_port, rcvd_pkt)
elif self.pkt_action == self.ACTION_DROP:
return verify_no_packet_any(self, masked_exp_pkt, dst_port_list)

Expand Down
35 changes: 25 additions & 10 deletions ansible/roles/test/files/ptftests/hash_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,15 @@ def setUp(self):
self.balancing_test_times = self.test_params.get('balancing_test_times', self.BALANCING_TEST_TIMES)

self.ignore_ttl = self.test_params.get('ignore_ttl', False)
self.single_fib = self.test_params.get('single_fib_for_duts', False)

def get_src_and_exp_ports(self, dst_ip):
while True:
src_port = int(random.choice(self.src_ports))
active_dut_index = self.ptf_test_port_map[str(src_port)]['target_dut']
if self.single_fib:
active_dut_index = 0
else:
active_dut_index = self.ptf_test_port_map[str(src_port)]['target_dut']
next_hop = self.fibs[active_dut_index][dst_ip]
exp_port_list = next_hop.get_next_hop_list()
if src_port in exp_port_list:
Expand Down Expand Up @@ -190,7 +194,6 @@ def check_ipv4_route(self, hash_key, src_port, dst_port_list):
if hash_key == 'src-mac' else base_mac

router_mac = self.ptf_test_port_map[str(src_port)]['target_mac']
exp_router_mac = self.router_macs[self.ptf_test_port_map[str(src_port)]['target_dut']]

vlan_id = random.choice(self.vlan_ids) if hash_key == 'vlan-id' else 0
ip_proto = self._get_ip_proto() if hash_key == 'ip-proto' else None
Expand All @@ -207,7 +210,6 @@ def check_ipv4_route(self, hash_key, src_port, dst_port_list):
tcp_dport=dport,
ip_ttl=64)
exp_pkt = simple_tcp_packet(
eth_src=exp_router_mac,
ip_src=ip_src,
ip_dst=ip_dst,
tcp_sport=sport,
Expand All @@ -224,7 +226,7 @@ def check_ipv4_route(self, hash_key, src_port, dst_port_list):
masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "ttl")
masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "chksum")
masked_exp_pkt.set_do_not_care_scapy(scapy.TCP, "chksum")

masked_exp_pkt.set_do_not_care_scapy(scapy.Ether, "src")

send_packet(self, src_port, pkt)
logging.info('Sent Ether(src={}, dst={})/IP(src={}, dst={})/TCP(sport={}, dport={} on port {})'\
Expand All @@ -236,14 +238,21 @@ def check_ipv4_route(self, hash_key, src_port, dst_port_list):
dport,
src_port))
logging.info('Expect Ether(src={}, dst={})/IP(src={}, dst={})/TCP(sport={}, dport={})'\
.format(exp_router_mac,
.format('any',
'any',
ip_src,
ip_dst,
sport,
dport))

return verify_packet_any_port(self, masked_exp_pkt, dst_port_list)
rcvd_port, rcvd_pkt = verify_packet_any_port(self, masked_exp_pkt, dst_port_list)
exp_src_mac = self.router_macs[self.ptf_test_port_map[str(dst_port_list[rcvd_port])]['target_dut']]
actual_src_mac = Ether(rcvd_pkt).src
if exp_src_mac != actual_src_mac:
raise Exception("Pkt sent from {} to {} on port {} was rcvd pkt on {} which is one of the expected ports, "
"but the src mac doesn't match, expected {}, got {}".
format(ip_src, ip_dst, src_port, dst_port_list[rcvd_port], exp_src_mac, actual_src_mac))
return (rcvd_port, rcvd_pkt)

def check_ipv6_route(self, hash_key, src_port, dst_port_list):
'''
Expand All @@ -263,7 +272,6 @@ def check_ipv6_route(self, hash_key, src_port, dst_port_list):
src_mac = (base_mac[:-5] + "%02x" % random.randint(0, 255) + ":" + "%02x" % random.randint(0, 255)) \
if hash_key == 'src-mac' else base_mac
router_mac = self.ptf_test_port_map[str(src_port)]['target_mac']
exp_router_mac = self.router_macs[self.ptf_test_port_map[str(src_port)]['target_dut']]

vlan_id = random.choice(self.vlan_ids) if hash_key == 'vlan-id' else 0
ip_proto = self._get_ip_proto(ipv6=True) if hash_key == "ip-proto" else None
Expand All @@ -280,7 +288,6 @@ def check_ipv6_route(self, hash_key, src_port, dst_port_list):
tcp_dport=dport,
ipv6_hlim=64)
exp_pkt = simple_tcpv6_packet(
eth_src=exp_router_mac,
ipv6_dst=ip_dst,
ipv6_src=ip_src,
tcp_sport=sport,
Expand All @@ -298,6 +305,7 @@ def check_ipv6_route(self, hash_key, src_port, dst_port_list):
masked_exp_pkt.set_do_not_care_scapy(scapy.IPv6, "hlim")
masked_exp_pkt.set_do_not_care_scapy(scapy.IPv6, "chksum")
masked_exp_pkt.set_do_not_care_scapy(scapy.TCP, "chksum")
masked_exp_pkt.set_do_not_care_scapy(scapy.Ether, "src")

send_packet(self, src_port, pkt)
logging.info('Sent Ether(src={}, dst={})/IPv6(src={}, dst={})/TCP(sport={}, dport={} on port {})'\
Expand All @@ -309,14 +317,21 @@ def check_ipv6_route(self, hash_key, src_port, dst_port_list):
dport,
src_port))
logging.info('Expect Ether(src={}, dst={})/IPv6(src={}, dst={})/TCP(sport={}, dport={})'\
.format(exp_router_mac,
.format('any',
'any',
ip_src,
ip_dst,
sport,
dport))

return verify_packet_any_port(self, masked_exp_pkt, dst_port_list)
rcvd_port, rcvd_pkt = verify_packet_any_port(self, masked_exp_pkt, dst_port_list)
exp_src_mac = self.router_macs[self.ptf_test_port_map[str(dst_port_list[rcvd_port])]['target_dut']]
actual_src_mac = Ether(rcvd_pkt).src
if exp_src_mac != actual_src_mac:
raise Exception("Pkt sent from {} to {} on port {} was rcvd pkt on {} which is one of the expected ports, "
"but the src mac doesn't match, expected {}, got {}".
format(ip_src, ip_dst, src_port, dst_port_list[rcvd_port], exp_src_mac, actual_src_mac))
return (rcvd_port, rcvd_pkt)

def check_within_expected_range(self, actual, expected):
'''
Expand Down
Loading