diff options
author | Matej Klotton <mklotton@cisco.com> | 2017-03-20 09:38:02 +0100 |
---|---|---|
committer | Matej Klotton <mklotton@cisco.com> | 2017-04-26 08:07:35 +0000 |
commit | 955047a8483e6c795a561ecfb7f78d01885b1aa3 (patch) | |
tree | 0bae9d43b6e1301e8b944740403849e8f6dd6947 /resources/traffic_scripts | |
parent | c1100899a339c4aadef7f61dad09e7281963d7b9 (diff) |
Vhost tests
Change-Id: I03722afe13722941e084bc01161f7c2af30e3cb1
Signed-off-by: Matej Klotton <mklotton@cisco.com>
(cherry picked from commit 0fc813b1694a6ae70b759e7ca96741f21f81b051)
Diffstat (limited to 'resources/traffic_scripts')
-rwxr-xr-x | resources/traffic_scripts/send_vxlan_check_vxlan.py | 106 | ||||
-rw-r--r-- | resources/traffic_scripts/vxlan.py | 17 |
2 files changed, 123 insertions, 0 deletions
diff --git a/resources/traffic_scripts/send_vxlan_check_vxlan.py b/resources/traffic_scripts/send_vxlan_check_vxlan.py new file mode 100755 index 0000000000..3bf273d17a --- /dev/null +++ b/resources/traffic_scripts/send_vxlan_check_vxlan.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +# Copyright (c) 2016 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Traffic script that sends an IP ICMPv4/ICMPv6 packet from one interface to +the other one. Dot1q or Dot1ad tagging of the ethernet frame can be set. +""" + +import sys + +import vxlan + +from scapy.layers.inet import IP, UDP, Raw +from scapy.layers.l2 import Ether +from resources.libraries.python.PacketVerifier import RxQueue, TxQueue +from resources.libraries.python.TrafficScriptArg import TrafficScriptArg + + +def main(): + """Send IP ICMPv4/ICMPv6 packet from one traffic generator interface to + the other one. Dot1q or Dot1ad tagging of the ethernet frame can be set. + """ + args = TrafficScriptArg(['tx_src_mac', 'tx_dst_mac', 'tx_src_ip', + 'tx_dst_ip', 'tx_vni', 'rx_src_ip', 'rx_dst_ip', + 'rx_vni']) + + tx_if = args.get_arg('tx_if') + rx_if = args.get_arg('rx_if') + tx_src_mac = args.get_arg('tx_src_mac') + tx_dst_mac = args.get_arg('tx_dst_mac') + tx_src_ip = args.get_arg('tx_src_ip') + tx_dst_ip = args.get_arg('tx_dst_ip') + tx_vni = args.get_arg('tx_vni') + rx_src_ip = args.get_arg('rx_src_ip') + rx_dst_ip = args.get_arg('rx_dst_ip') + rx_vni = args.get_arg('rx_vni') + + rxq = RxQueue(rx_if) + txq = TxQueue(tx_if) + + sent_packets = [] + + tx_pkt_p = (Ether(src='02:00:00:00:00:01', dst='02:00:00:00:00:02') / + IP(src='192.168.1.1', dst='192.168.1.2') / + UDP(sport=12345, dport=1234) / + Raw('rew data')) + + pkt_raw = (Ether(src=tx_src_mac, dst=tx_dst_mac) / + IP(src=tx_src_ip, dst=tx_dst_ip) / + UDP(sport=23456) / + vxlan.VXLAN(vni=int(tx_vni)) / + tx_pkt_p) + + # Send created packet on one interface and receive on the other + sent_packets.append(pkt_raw) + txq.send(pkt_raw) + + ether = rxq.recv(2, ignore=sent_packets) + + # Check whether received packet contains layers Ether, IP and VXLAN + if ether is None: + raise RuntimeError('Packet Rx timeout') + ip = ether.payload + + if ip.src != rx_src_ip: + raise RuntimeError('IP src mismatch {} != {}'.format(ip.src, rx_src_ip)) + if ip.dst != rx_dst_ip: + raise RuntimeError('IP dst mismatch {} != {}'.format(ip.dst, rx_dst_ip)) + if ip.payload.dport != 4789: + raise RuntimeError('VXLAN UDP port mismatch {} != {}'. + format(ip.payload.dport, 4789)) + vxlan_pkt = ip.payload.payload + + if int(vxlan_pkt.vni) != int(rx_vni): + raise RuntimeError('vxlan mismatch') + rx_pkt_p = vxlan_pkt.payload + + if rx_pkt_p.src != tx_pkt_p.src: + raise RuntimeError('RX encapsulated MAC src mismatch {} != {}'. + format(rx_pkt_p.src, tx_pkt_p.src)) + if rx_pkt_p.dst != tx_pkt_p.dst: + raise RuntimeError('RX encapsulated MAC dst mismatch {} != {}'. + format(rx_pkt_p.dst, tx_pkt_p.dst)) + if rx_pkt_p['IP'].src != tx_pkt_p['IP'].src: + raise RuntimeError('RX encapsulated IP src mismatch {} != {}'. + format(rx_pkt_p['IP'].src, tx_pkt_p['IP'].src)) + if rx_pkt_p['IP'].dst != tx_pkt_p['IP'].dst: + raise RuntimeError('RX encapsulated IP dst mismatch {} != {}'. + format(rx_pkt_p['IP'].dst, tx_pkt_p['IP'].dst)) + + # TODO: verify inner Ether() + + sys.exit(0) + +if __name__ == "__main__": + main() diff --git a/resources/traffic_scripts/vxlan.py b/resources/traffic_scripts/vxlan.py new file mode 100644 index 0000000000..bf86f179a8 --- /dev/null +++ b/resources/traffic_scripts/vxlan.py @@ -0,0 +1,17 @@ +from scapy.fields import BitField, XByteField, X3BytesField +from scapy.packet import Packet, bind_layers +from scapy.layers.l2 import Ether +from scapy.layers.inet import UDP + + +class VXLAN(Packet): + name = "VXLAN" + fields_desc = [BitField("flags", 0x08000000, 32), + X3BytesField("vni", 0), + XByteField("reserved", 0x00)] + + def mysummary(self): + return self.sprintf("VXLAN (vni=%VXLAN.vni%)") + +bind_layers(UDP, VXLAN, dport=4789) +bind_layers(VXLAN, Ether) |