in ptf/sainexthopgroup.py [0:0]
def runTest(self):
print("l3IPv6EcmpHashPortLagTest")
print("Limit ECMP IPv6 hash to SRC_IP only.")
# for our test it will disable LB.
self.setupECMPIPv6Hash([SAI_NATIVE_HASH_FIELD_SRC_IP])
try:
count = [0, 0, 0, 0, 0, 0, 0, 0]
dst_ip = socket.inet_pton(socket.AF_INET6, '1000:1:1:0:0:0:0:1')
dst_ip_arr = list(dst_ip)
src_mac_start = '00:22:22:22:{0}:{1}'
for i in range(0, MAX_ITRS):
dst_ip_addr = socket.inet_ntop(socket.AF_INET6, dst_ip)
src_mac = src_mac_start.format(
str(i).zfill(4)[:2],
str(i).zfill(4)[2:])
src_mac = '00:22:22:22:22:22'
pkt = simple_tcpv6_packet(eth_dst=ROUTER_MAC,
eth_src=src_mac,
ipv6_dst=dst_ip_addr,
ipv6_src='5000:1:1:0:0:0:0:1',
ipv6_hlim=64)
exp_pkt1 = simple_tcpv6_packet(eth_dst='00:11:11:11:11:11',
eth_src=ROUTER_MAC,
ipv6_dst=dst_ip_addr,
ipv6_src='5000:1:1:0:0:0:0:1',
ipv6_hlim=63)
exp_pkt2 = simple_tcpv6_packet(eth_dst='00:22:22:22:22:22',
eth_src=ROUTER_MAC,
ipv6_dst=dst_ip_addr,
ipv6_src='5000:1:1:0:0:0:0:1',
ipv6_hlim=63)
exp_pkt3 = simple_tcpv6_packet(eth_dst='00:33:33:33:33:33',
eth_src=ROUTER_MAC,
ipv6_dst=dst_ip_addr,
ipv6_src='5000:1:1:0:0:0:0:1',
ipv6_hlim=63)
exp_pkt4 = simple_tcpv6_packet(eth_dst='00:44:44:44:44:44',
eth_src=ROUTER_MAC,
ipv6_dst=dst_ip_addr,
ipv6_src='5000:1:1:0:0:0:0:1',
ipv6_hlim=63)
send_packet(self, self.dev_port15, pkt)
ports_to_verify = [
self.dev_port11,
self.dev_port12,
self.dev_port4, # LAG1 ports
self.dev_port5,
self.dev_port6,
self.dev_port7, # LAG2 ports
self.dev_port8,
self.dev_port9
]
rcv_idx = verify_any_packet_any_port(
self, [exp_pkt1, exp_pkt2, exp_pkt3, exp_pkt4],
ports_to_verify)
count[rcv_idx] += 1
dst_ip_arr[15] = dst_ip_arr[15] + 1
dst_ip = bytearray(dst_ip_arr)
print("PORT lb counts:", count)
ecmp_count = [
count[0],
count[1],
(count[2] + count[3] + count[4]),
(count[5] + count[6] + count[7])]
print("ECMP count:", ecmp_count)
# Traffic should not be ballanced, should apear on single port or
# LAG
if ecmp_count[0] != 0:
self.assertTrue(
ecmp_count[0] == MAX_ITRS,
"100 % traffic({}) expected on port: {}, but received only"
"{} packets".format(MAX_ITRS, self.dev_port11,
ecmp_count[0])) # port 11
self.assertTrue(
ecmp_count[1] == 0,
"No traffic expected on port:{}".format(
self.dev_port12)) # port 12
self.assertTrue(ecmp_count[2] == 0,
"No traffic expected on ports: {}"
.format([self.dev_port4, self.dev_port5,
self.dev_port6])) # LAG 1
self.assertTrue(ecmp_count[3] == 0,
"No traffic expected on ports:{}"
.format([self.dev_port7, self.dev_port8,
self.dev_port9])) # LAG 2
elif ecmp_count[1] != 0:
self.assertTrue(
ecmp_count[0] == 0,
"No traffic expected on port:{}"
.format(self.dev_port11))
self.assertTrue(
ecmp_count[1] == MAX_ITRS,
"100 % traffic({}) expected on port: {}, but received"
"only {} packets".format(MAX_ITRS, self.dev_port12,
ecmp_count[1]))
self.assertTrue(ecmp_count[2] == 0,
"No traffic expected on ports:{}"
.format([self.dev_port4, self.dev_port5,
self.dev_port6]))
self.assertTrue(ecmp_count[3] == 0,
"No traffic expected on ports:{}"
.format([self.dev_port7, self.dev_port8,
self.dev_port9]))
elif ecmp_count[2] != 0:
self.assertTrue(
ecmp_count[0] == 0,
"No traffic expected on port:{}".format(self.dev_port11))
self.assertTrue(
ecmp_count[1] == 0,
"No traffic expected on port:{}".format(self.dev_port12))
self.assertTrue(
ecmp_count[2] == MAX_ITRS,
"100 % traffic({}) expected on ports: {}, but received"
"only {} packets".format(MAX_ITRS,
[self.dev_port4, self.dev_port5,
self.dev_port6],
ecmp_count[2]))
self.assertTrue(ecmp_count[3] == 0,
"No traffic expected on ports:{}"
.format([self.dev_port7, self.dev_port8,
self.dev_port9]))
elif ecmp_count[3] != 0:
self.assertTrue(
ecmp_count[0] == 0,
"No traffic expected on port:{}".format(self.dev_port11))
self.assertTrue(
ecmp_count[1] == 0,
"No traffic expected on port:{}".format(self.dev_port12))
self.assertTrue(ecmp_count[2] == 0,
"No traffic expected on ports:{}"
.format([self.dev_port4, self.dev_port5,
self.dev_port6]))
self.assertTrue(
ecmp_count[3] == MAX_ITRS,
"100 % traffic({}) expected on ports: {}, but received"
"only {} pakets".format(MAX_ITRS,
[self.dev_port7, self.dev_port8,
self.dev_port9], ecmp_count[3]))
# enable LB back to IPv4 full fields list
print("Enable ECMP IPv6 LB")
self.setupECMPIPv6Hash()
count = [0, 0, 0, 0, 0, 0, 0, 0]
dst_ip = socket.inet_pton(socket.AF_INET6, '1000:1:1:0:0:0:0:1')
dst_ip_arr = list(dst_ip)
src_mac_start = '00:22:22:22:{0}:{1}'
for i in range(0, MAX_ITRS):
dst_ip_addr = socket.inet_ntop(socket.AF_INET6, dst_ip)
src_mac = src_mac_start.format(
str(i).zfill(4)[:2],
str(i).zfill(4)[2:])
src_mac = '00:22:22:22:22:22'
pkt = simple_tcpv6_packet(eth_dst=ROUTER_MAC,
eth_src=src_mac,
ipv6_dst=dst_ip_addr,
ipv6_src='5000:1:1:0:0:0:0:1',
ipv6_hlim=64)
exp_pkt1 = simple_tcpv6_packet(eth_dst='00:11:11:11:11:11',
eth_src=ROUTER_MAC,
ipv6_dst=dst_ip_addr,
ipv6_src='5000:1:1:0:0:0:0:1',
ipv6_hlim=63)
exp_pkt2 = simple_tcpv6_packet(eth_dst='00:22:22:22:22:22',
eth_src=ROUTER_MAC,
ipv6_dst=dst_ip_addr,
ipv6_src='5000:1:1:0:0:0:0:1',
ipv6_hlim=63)
exp_pkt3 = simple_tcpv6_packet(eth_dst='00:33:33:33:33:33',
eth_src=ROUTER_MAC,
ipv6_dst=dst_ip_addr,
ipv6_src='5000:1:1:0:0:0:0:1',
ipv6_hlim=63)
exp_pkt4 = simple_tcpv6_packet(eth_dst='00:44:44:44:44:44',
eth_src=ROUTER_MAC,
ipv6_dst=dst_ip_addr,
ipv6_src='5000:1:1:0:0:0:0:1',
ipv6_hlim=63)
send_packet(self, self.dev_port15, pkt)
ports_to_verify = [
self.dev_port11,
self.dev_port12,
self.dev_port4, # LAG1 ports
self.dev_port5,
self.dev_port6,
self.dev_port7, # LAG2 ports
self.dev_port8,
self.dev_port9
]
rcv_idx = verify_any_packet_any_port(
self, [exp_pkt1, exp_pkt2, exp_pkt3, exp_pkt4],
ports_to_verify)
count[rcv_idx] += 1
dst_ip_arr[15] = dst_ip_arr[15] + 1
dst_ip = bytearray(dst_ip_arr)
print("PORT lb counts:", count)
ecmp_count = [
count[0],
count[1],
(count[2] + count[3] + count[4]),
(count[5] + count[6] + count[7])]
print("ECMP count:", ecmp_count)
# Traffic should equally be ballanced, should apear on all port or
# LAG
for i in range(0, 4):
print("ecmp_count=", ecmp_count, (MAX_ITRS / 4) * 0.5)
self.assertTrue((ecmp_count[i] >= ((MAX_ITRS / 4) * 0.5)),
"Ecmp paths are not equally balanced")
finally:
pass