diff --git a/ansible/roles/test/files/ptftests/vnet_vxlan.py b/ansible/roles/test/files/ptftests/vnet_vxlan.py index f4fd7531d92..a0dc0a264f6 100644 --- a/ansible/roles/test/files/ptftests/vnet_vxlan.py +++ b/ansible/roles/test/files/ptftests/vnet_vxlan.py @@ -22,6 +22,7 @@ from ptf.mask import Mask import datetime import subprocess +import ipaddress from pprint import pprint from ipaddress import ip_address, ip_network @@ -204,15 +205,20 @@ def setUp(self): self.dut_mac = graph['dut_mac'] - ip = None + ipv4 = None + ipv6 = None for data in graph['minigraph_lo_interfaces']: if data['prefixlen'] == 32: - ip = data['addr'] - break - else: + ipv4 = data['addr'] + elif data['prefixlen'] == 128: + ipv6 = data['addr'] + if ipv4 is None: raise Exception("ipv4 lo interface not found") + if ipv6 is None: + raise Exception("ipv6 lo interface not found") - self.loopback_ip = ip + self.loopback_ipv4 = ipv4 + self.loopback_ipv6 = ipv6 self.ptf_mac_addrs = self.readMacs() @@ -263,18 +269,32 @@ def FromVM(self, test): ip_ttl=64) udp_sport = 1234 # Use entropy_hash(pkt) udp_dport = self.vxlan_port - vxlan_pkt = simple_vxlan_packet( - eth_dst=self.dut_mac, - eth_src=self.random_mac, - ip_id=0, - ip_src=test['host'], - ip_dst=self.loopback_ip, - ip_ttl=64, - udp_sport=udp_sport, - udp_dport=udp_dport, - vxlan_vni=int(test['vni']), - with_udp_chksum=False, - inner_frame=pkt) + if isinstance(ip_address(test['host']), ipaddress.IPv4Address): + vxlan_pkt = simple_vxlan_packet( + eth_dst=self.dut_mac, + eth_src=self.random_mac, + ip_id=0, + ip_src=test['host'], + ip_dst=self.loopback_ipv4, + ip_ttl=64, + udp_sport=udp_sport, + udp_dport=udp_dport, + vxlan_vni=int(test['vni']), + with_udp_chksum=False, + inner_frame=pkt) + elif isinstance(ip_address(test['host']), ipaddress.IPv6Address): + vxlan_pkt = simple_vxlanv6_packet( + eth_dst=self.dut_mac, + eth_src=self.random_mac, + ipv6_src=test['host'], + ipv6_dst=self.loopback_ipv6, + udp_sport=udp_sport, + udp_dport=udp_dport, + vxlan_vni=int(test['vni']), + with_udp_chksum=False, + inner_frame=pkt) + else: + raise Exception("Found invalid IP address in test") exp_pkt = simple_tcp_packet( pktlen=pkt_len, eth_src=self.dut_mac, @@ -332,25 +352,42 @@ def FromServer(self, test): ip_ttl=63) udp_sport = 1234 # Use entropy_hash(pkt) udp_dport = self.vxlan_port - encap_pkt = simple_vxlan_packet( - eth_src=self.dut_mac, - eth_dst=self.random_mac, - ip_id=0, - ip_src=self.loopback_ip, - ip_dst=test['host'], - ip_ttl=64, - udp_sport=udp_sport, - udp_dport=udp_dport, - with_udp_chksum=False, - vxlan_vni=vni, - inner_frame=exp_pkt) - encap_pkt[IP].flags = 0x2 + if isinstance(ip_address(test['host']), ipaddress.IPv4Address): + encap_pkt = simple_vxlan_packet( + eth_src=self.dut_mac, + eth_dst=self.random_mac, + ip_id=0, + ip_src=self.loopback_ipv4, + ip_dst=test['host'], + ip_ttl=64, + udp_sport=udp_sport, + udp_dport=udp_dport, + with_udp_chksum=False, + vxlan_vni=vni, + inner_frame=exp_pkt) + encap_pkt[IP].flags = 0x2 + elif isinstance(ip_address(test['host']), ipaddress.IPv6Address): + encap_pkt = simple_vxlanv6_packet( + eth_src=self.dut_mac, + eth_dst=self.random_mac, + ipv6_src=self.loopback_ipv6, + ipv6_dst=test['host'], + udp_sport=udp_sport, + udp_dport=udp_dport, + with_udp_chksum=False, + vxlan_vni=vni, + inner_frame=exp_pkt) + else: + raise Exception("Found invalid IP address in test") send_packet(self, test['port'], str(pkt)) masked_exp_pkt = Mask(encap_pkt) masked_exp_pkt.set_do_not_care_scapy(scapy.Ether, "src") masked_exp_pkt.set_do_not_care_scapy(scapy.Ether, "dst") - masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "ttl") + if isinstance(ip_address(test['host']), ipaddress.IPv4Address): + masked_exp_pkt.set_do_not_care_scapy(scapy.IP, "ttl") + else: + masked_exp_pkt.set_do_not_care_scapy(scapy.IPv6, "hlim") masked_exp_pkt.set_do_not_care_scapy(scapy.UDP, "sport") log_str = "Sending packet from port " + str('eth%d' % test['port']) + " to " + test['dst'] diff --git a/ansible/roles/test/tasks/vnet_vxlan.yml b/ansible/roles/test/tasks/vnet_vxlan.yml index 9388a1f5fe2..73e392a6d28 100644 --- a/ansible/roles/test/tasks/vnet_vxlan.yml +++ b/ansible/roles/test/tasks/vnet_vxlan.yml @@ -3,6 +3,12 @@ #----------------------------------------- - block: + - name: set ipv6 test mode for vxlan + set_fact: + ipv6_vxlan_test: false + when: + - ipv6_vxlan_test is not defined + - fail: msg="Please set ptf_host variable" when: ptf_host is not defined diff --git a/ansible/roles/test/templates/vnet_config.j2 b/ansible/roles/test/templates/vnet_config.j2 index ba62e04987d..c1c2c37d4ce 100644 --- a/ansible/roles/test/templates/vnet_config.j2 +++ b/ansible/roles/test/templates/vnet_config.j2 @@ -1,5 +1,6 @@ {% set num_vnet = 8 %} +{% set vnet_v6_base = 5 %} {% set vlan_id_base = 3001 %} {% set topo_vlan = minigraph_vlans.keys()[0] %} {% set index = 10 %} @@ -20,6 +21,10 @@ vnet_id_list: - Vnet{{ vnet }} {% endfor %} +{% if ipv6_vxlan_test == true %} +vnet_v6_base: {{ vnet_v6_base }} +{% endif %} + vnet_peer_list: - Vnet3: Vnet4 - Vnet4: Vnet3 @@ -60,6 +65,17 @@ vnet_local_routes: - pfx: '60.1.1.0/24' nh: '2.2.10.101' ifname: 'Vlan3002' + - Vnet5_route_list: + - pfx: '50.1.1.0/24' + nh: '5.5.10.101' + ifname: 'Vlan3005' + - pfx: '50.2.2.0/24' + nh: '5.5.10.102' + ifname: 'Vlan3005' + - Vnet6_route_list: + - pfx: '60.1.1.0/24' + nh: '6.6.10.101' + ifname: 'Vlan3006' vnet_route_list: - Vnet1_route_list: @@ -83,3 +99,26 @@ vnet_route_list: - pfx: '4.4.4.10/32' end: '100.1.1.40' mac: '00:00:00:00:02:05' +{% if ipv6_vxlan_test == true %} + - Vnet5_route_list: + - pfx: '1.1.1.10/32' + end: '2000:1::33' + - pfx: '1.1.1.11/32' + end: '2000:1::34' + mac: '00:00:00:00:01:02' + - Vnet6_route_list: + - pfx: '2.2.2.10/32' + end: '2000:1::35' + mac: '00:00:00:00:02:05' + - Vnet7_route_list: + - pfx: '1.1.1.10/32' + end: '2000:1::33' + vni: '12345' + - pfx: '1.1.1.11/32' + end: '2000:1::34' + mac: '00:00:00:00:01:02' + - Vnet8_route_list: + - pfx: '4.4.4.10/32' + end: 'FC00:1::36' + mac: '00:00:00:00:02:05' +{% endif %} diff --git a/ansible/roles/test/templates/vnet_vxlan.j2 b/ansible/roles/test/templates/vnet_vxlan.j2 index 5c176961e50..c6082eb4bfd 100644 --- a/ansible/roles/test/templates/vnet_vxlan.j2 +++ b/ansible/roles/test/templates/vnet_vxlan.j2 @@ -1,6 +1,11 @@ { "VXLAN_TUNNEL": { - "tunnel1": { +{% if ipv6_vxlan_test == true %} + "tunnel_v6": { + "src_ip": "{{ minigraph_lo_interfaces[1]['addr'] }}" + }, +{% endif %} + "tunnel_v4": { "src_ip": "{{ minigraph_lo_interfaces[0]['addr'] }}" } }, @@ -8,7 +13,11 @@ "VNET": { {% for vnet in vnet_id_list %} "{{ vnet }}": { - "vxlan_tunnel": "tunnel1", +{% if (ipv6_vxlan_test == false) or (loop.index < vnet_v6_base) %} + "vxlan_tunnel": "tunnel_v4", +{% else %} + "vxlan_tunnel": "tunnel_v6", +{% endif %} "vni": "{{ vnet | replace("Vnet", "") |int + 10000}}", "peer_list": "" }{{ "," if not loop.last else "" }}