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
99 changes: 68 additions & 31 deletions ansible/roles/test/files/ptftests/vnet_vxlan.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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()

Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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']
Expand Down
6 changes: 6 additions & 0 deletions ansible/roles/test/tasks/vnet_vxlan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
39 changes: 39 additions & 0 deletions ansible/roles/test/templates/vnet_config.j2
Original file line number Diff line number Diff line change
@@ -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 %}
Expand All @@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -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 %}
13 changes: 11 additions & 2 deletions ansible/roles/test/templates/vnet_vxlan.j2
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
{
"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'] }}"
}
},

"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 "" }}
Expand Down