diff options
author | Jan Gelety <jgelety@cisco.com> | 2018-12-03 09:08:09 +0100 |
---|---|---|
committer | Jan Gelety <jgelety@cisco.com> | 2018-12-07 18:27:47 +0100 |
commit | f9041bcdc886ba08800fe11c32e218d98ef6ed33 (patch) | |
tree | 933ba904fd78d3d0a7e84f0ec9971ade010accf5 | |
parent | 6190dd3186cf42543c2c5cd2406c7f4c8f3f2845 (diff) |
VPP_Device - add baseline tests - part I
CSIT-1370
Add following baseline tests to VPP_Device:
- ip4
eth2p-ethip4-ip4base-dev
- ip6
eth2p-ethip6-ip6base-dev
- l2bd
eth2p-eth-l2bdbasemaclrn-dev
Change-Id: Ic20000eb38c5511c27d020f3aa76b2620d7f7ef9
Signed-off-by: Jan Gelety <jgelety@cisco.com>
-rw-r--r-- | resources/libraries/robot/ip/ip4.robot | 253 | ||||
-rw-r--r-- | resources/libraries/robot/ip/ip6.robot | 289 | ||||
-rw-r--r-- | resources/libraries/robot/shared/testing_path.robot | 33 | ||||
-rw-r--r-- | resources/libraries/robot/shared/traffic.robot | 328 | ||||
-rwxr-xr-x | resources/traffic_scripts/icmpv6_echo_req_resp.py | 145 | ||||
-rw-r--r-- | tests/vpp/device/ip4/eth2p-ethip4-ip4base-dev.robot | 121 | ||||
-rw-r--r-- | tests/vpp/device/ip6/eth2p-ethip6-ip6base-dev.robot | 125 | ||||
-rw-r--r-- | tests/vpp/device/l2bd/eth2p-eth-l2bdbasemaclrn-dev.robot | 87 | ||||
-rw-r--r-- | tests/vpp/device/l2xc/eth2p-ethicmp-l2xcbase-dev.robot (renamed from tests/vpp/device/l2xc/eth2p-ethicmp-l2xcbase-device.robot) | 24 |
9 files changed, 1143 insertions, 262 deletions
diff --git a/resources/libraries/robot/ip/ip4.robot b/resources/libraries/robot/ip/ip4.robot index 8fff0846b0..02025156e2 100644 --- a/resources/libraries/robot/ip/ip4.robot +++ b/resources/libraries/robot/ip/ip4.robot @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cisco and/or its affiliates. +# Copyright (c) 2018 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: @@ -10,19 +10,22 @@ # 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. + *** Settings *** -| Resource | resources/libraries/robot/shared/default.robot -| Resource | resources/libraries/robot/shared/counters.robot +| Library | resources.libraries.python.InterfaceUtil | Library | resources.libraries.python.IPv4Util.IPv4Util | Library | resources.libraries.python.IPv4Setup.IPv4Setup | Library | resources.libraries.python.NodePath | Library | resources.libraries.python.Routing | Library | resources.libraries.python.TrafficScriptExecutor -| Library | resources.libraries.python.InterfaceUtil +| Resource | resources/libraries/robot/shared/counters.robot +| Resource | resources/libraries/robot/shared/default.robot +| Resource | resources/libraries/robot/shared/testing_path.robot | Variables | resources/libraries/python/IPv4NodeAddress.py | ${nodes} +| ... +| Documentation | IPv4 keywords *** Keywords *** - | Show IP FIB On All DUTs | | [Documentation] | Show IP FIB on all DUTs. | | ... @@ -52,11 +55,13 @@ | | :FOR | ${link} | IN | @{tg_dut1_links} | | | ${net}= | Get Link Address | ${link} | ${nodes_addr} | | | ${prefix}= | Get Link Prefix | ${link} | ${nodes_addr} -| | | Vpp Route Add | ${dut2} | ${net} | ${prefix} | ${dut1_if_addr} | ${dut2_if} +| | | Vpp Route Add | ${dut2} | ${net} | ${prefix} | ${dut1_if_addr} +| | | ... | ${dut2_if} | | :FOR | ${link} | IN | @{tg_dut2_links} | | | ${net}= | Get Link Address | ${link} | ${nodes_addr} | | | ${prefix}= | Get Link Prefix | ${link} | ${nodes_addr} -| | | Vpp Route Add | ${dut1} | ${net} | ${prefix} | ${dut2_if_addr} | ${dut1_if} +| | | Vpp Route Add | ${dut1} | ${net} | ${prefix} | ${dut2_if_addr} +| | | ... | ${dut1_if} | Configure DUT nodes for IPv4 testing | | Configure IPv4 addresses on all DUTs | ${nodes} | ${nodes_ipv4_addr} @@ -70,19 +75,21 @@ | | ${src_mac}= | Get interface mac | ${from_node} | ${from_port} | | ${dst_mac}= | Get interface mac | ${to_node} | ${to_port} | | ${is_dst_tg}= | Is TG node | ${to_node} -| | ${adj_node} | ${adj_int}= | Get adjacent node and interface | ${nodes} | ${from_node} | ${from_port} +| | ${adj_node} | ${adj_int}= | Get adjacent node and interface | ${nodes} +| | ... | ${from_node} | ${from_port} | | ${from_port_name}= | Get interface name | ${from_node} | ${from_port} | | ${to_port_name}= | Get interface name | ${to_node} | ${to_port} | | ${adj_int_mac}= | Get interface MAC | ${adj_node} | ${adj_int} -| | ${args}= | Traffic Script Gen Arg | ${to_port_name} | ${from_port_name} | ${src_mac} -| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip} -| | ${args}= | Catenate | ${args} | --hops ${hops} | --first_hop_mac ${adj_int_mac} -| | | ... | --is_dst_tg ${is_dst_tg} +| | ${args}= | Traffic Script Gen Arg | ${to_port_name} | ${from_port_name} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Catenate | ${args} | --hops ${hops} +| | ... | --first_hop_mac ${adj_int_mac} | --is_dst_tg ${is_dst_tg} | | Run Traffic Script On Node | ipv4_ping_ttl_check.py | ${from_node} | ${args} | Execute IPv4 ICMP echo sweep | | [Documentation] | Type of the src_node must be TG and dst_node must be DUT -| | [Arguments] | ${src_node} | ${dst_node} | ${start_size} | ${end_size} | ${step} +| | [Arguments] | ${src_node} | ${dst_node} | ${start_size} | ${end_size} +| | ... | ${step} | | Append Nodes | ${src_node} | ${dst_node} | | Compute Path | | ${src_port} | ${src_node}= | First Interface @@ -93,9 +100,9 @@ | | ${dst_mac}= | Get Interface Mac | ${dst_node} | ${dst_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} | | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} -| | | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} -| | ${args}= | Set Variable -| | ... | ${args} --start_size ${start_size} --end_size ${end_size} --step ${step} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Catenate | ${args} | --start_size ${start_size} +| | ... | --end_size ${end_size} | --step ${step} | | Run Traffic Script On Node | ipv4_sweep_ping.py | ${src_node} | ${args} | | ... | timeout=${180} @@ -109,8 +116,8 @@ | | ${src_mac}= | Get node link mac | ${tg_node} | ${link_name} | | ${dst_mac}= | Get node link mac | ${vpp_node} | ${link_name} | | ${src_if_name}= | Get interface name | ${tg_node} | ${src_if} -| | ${args}= | Traffic Script Gen Arg | ${src_if_name} | ${src_if_name} | ${src_mac} -| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Traffic Script Gen Arg | ${src_if_name} | ${src_if_name} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} | | Run Traffic Script On Node | arp_request.py | ${tg_node} | ${args} | Configure IP addresses on interfaces @@ -119,17 +126,17 @@ | | ... | ${prefix}) tuple. | | ... | | ... | *Arguments:* -| | ... | - ${dut_node} - Node where IP address should be set to. +| | ... | - dut_node - Node where IP address should be set to. | | ... | Type: dictionary -| | ... | - ${interface} - Interface name. Type: string -| | ... | - ${address} - IP address. Type: string -| | ... | - ${prefix} - Prefix length. Type: integer +| | ... | - interface - Interface name. Type: string +| | ... | - address - IP address. Type: string +| | ... | - prefix - Prefix length. Type: integer | | ... | | ... | *Example:* | | ... | | ... | \| Configure IP addresses on interfaces \ | | ... | \| ${dut1_node} \| ${dut1_to_dut2} \| 192.168.1.1 \| 24 \| -| | ... | \| ... \| ${dut1_node} \| ${dut1_to_tg} \| 192.168.2.1 \| 24 \| +| | ... | \| ... \| ${dut1_node} \| ${dut1_to_tg} \| 192.168.2.1 \| 24 \| | | ... | | [Arguments] | @{args} | | :FOR | ${dut_node} | ${interface} | ${address} | ${prefix} | IN | @{args} @@ -159,9 +166,203 @@ | | ... | | [Arguments] | ${tg_node} | ${tg_interface} | | ... | ${dst_mac} | ${src_mac} | ${dst_ip} | ${src_ip} | ${timeout}=${10} +| | ... | | ${tg_interface_name}= | Get interface name | ${tg_node} | ${tg_interface} -| | ${args}= | Catenate | --rx_if | ${tg_interface_name} | --tx_if | ${tg_interface_name} -| | ... | --dst_mac | ${dst_mac} | --src_mac | ${src_mac} -| | ... | --dst_ip | ${dst_ip} | --src_ip | ${src_ip} | --timeout | ${timeout} +| | ${args}= | Catenate | --rx_if ${tg_interface_name} +| | ... | --tx_if ${tg_interface_name} | --dst_mac ${dst_mac} +| | ... | --src_mac ${src_mac} | --dst_ip ${dst_ip} | --src_ip ${src_ip} +| | ... | --timeout ${timeout} | | Run Traffic Script On Node | send_icmp_wait_for_reply.py | | ... | ${tg_node} | ${args} + +| Initialize IPv4 forwarding in circular topology +| | [Documentation] +| | ... | Set UP state on VPP interfaces in path on nodes in 2-node / 3-node +| | ... | circular topology. Get the interface MAC addresses and setup ARP on +| | ... | all VPP interfaces. Setup IPv4 addresses with /24 prefix on DUT-TG +| | ... | links. In case of 3-node topology setup IPv4 adresses with /30 prefix +| | ... | on DUT1-DUT2 link and set routing on both DUT nodes with prefix /24 +| | ... | and next hop of neighbour DUT interface IPv4 address. Configure route +| | ... | entries for remote hosts IPv4 addresses if required. +| | ... +| | ... | *Arguments:* +| | ... | - tg_if1_ip4 - IP address of TG interface1. Type: string +| | ... | - tg_if2_ip4 - IP address of TG interface2. Type: string +| | ... | - dut1_if1_ip4 - IP address of DUT1 interface1. Type: string +| | ... | - dut1_if2_ip4 - IP address of DUT1 interface1. Type: string +| | ... | - dut2_if1_ip4 - IP address of DUT2 interface1 (Optional). +| | ... | Type: string +| | ... | - dut2_if2_ip4 - IP address of DUT2 interface2 (Optional). +| | ... | Type: string +| | ... | - remote_host1_ip4 - IP address of remote host1 (Optional). +| | ... | Type: string +| | ... | - remote_host2_ip4 - IP address of remote host2 (Optional). +| | ... | Type: string +| | ... | - remote_host_ip4_prefix - IP address prefix for host IP addresses +| | ... | (Optional). Type: string or integer +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Initialize IPv4 forwarding in circular topology \ +| | ... | \| 10.10.10.2 \| 20.20.20.2 \| 10.10.10.1 \| 20.20.20.1 \| +| | ... | \| Initialize IPv4 forwarding in circular topology \ +| | ... | \| 10.10.10.2 \| 20.20.20.2 \| 10.10.10.1 \| 20.20.20.1 \ +| | ... | \| remote_host1_ip4=192.168.0.1 \| remote_host2_ip4=192.168.0.2 \ +| | ... | \| remote_host_ip4_prefix=32 \| +| | ... | \| Initialize IPv4 forwarding in circular topology \ +| | ... | \| 10.10.10.2 \| 20.20.20.2 \| 10.10.10.1 \| 1.1.1.1 \| 1.1.1.2 \ +| | ... | \| 20.20.20.1 \| +| | ... | \| Initialize IPv4 forwarding in circular topology \ +| | ... | \| 10.10.10.2 \| 20.20.20.2 \| 10.10.10.1 \| 1.1.1.1 \| 1.1.1.2 \ +| | ... | \| 20.20.20.1 \| remote_host1_ip4=192.168.0.1 \ +| | ... | \| remote_host2_ip4=192.168.0.2 \| remote_host_ip4_prefix=32 \| +| | ... +| | [Arguments] | ${tg_if1_ip4} | ${tg_if2_ip4} | ${dut1_if1_ip4} +| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4}=${NONE} | ${dut2_if2_ip4}=${NONE} +| | ... | ${remote_host1_ip4}=${NONE} | ${remote_host2_ip4}=${NONE} +| | ... | ${remote_host_ip4_prefix}=${NONE} +| | ... +| | Set interfaces in path up +| | ... +| | ${dut2_status} | ${value}= | Run Keyword And Ignore Error +| | ... | Variable Should Exist | ${dut2_node} +| | ... +| | Run Keyword If | '${dut2_status}' == 'PASS' +| | ... | Initialize IPv4 forwarding in 3-node circular topology +| | ... | ${tg_if1_ip4} | ${tg_if2_ip4} | ${dut1_if1_ip4} | ${dut1_if2_ip4} +| | ... | ${dut2_if1_ip4} | ${dut2_if2_ip4} | ${remote_host1_ip4} +| | ... | ${remote_host2_ip4} | ${remote_host_ip4_prefix} +| | ... | ELSE +| | ... | Initialize IPv4 forwarding in 2-node circular topology +| | ... | ${tg_if1_ip4} | ${tg_if2_ip4} | ${dut1_if1_ip4} | ${dut1_if2_ip4} +| | ... | remote_host1_ip4=${remote_host1_ip4} +| | ... | remote_host2_ip4=${remote_host2_ip4} +| | ... | remote_host_ip4_prefix=${remote_host_ip4_prefix} + +| Initialize IPv4 forwarding in 2-node circular topology +| | [Documentation] +| | ... | Set UP state on VPP interfaces on DUT node in 2-node circular +| | ... | topology. Get the interface MAC addresses and setup ARP on +| | ... | all VPP interfaces. Setup IPv4 addresses with /24 prefix on DUT-TG +| | ... | links. Configure route entries for remote hosts IPv4 addresses +| | ... | if required. +| | ... +| | ... | *Arguments:* +| | ... | - tg_if1_ip4 - IP address of TG interface1. Type: string +| | ... | - tg_if2_ip4 - IP address of TG interface2. Type: string +| | ... | - dut1_if1_ip4 - IP address of DUT1 interface1. Type: string +| | ... | - dut1_if2_ip4 - IP address of DUT1 interface1. Type: string +| | ... | - remote_host1_ip4 - IP address of remote host1 (Optional). +| | ... | Type: string +| | ... | - remote_host2_ip4 - IP address of remote host2 (Optional). +| | ... | Type: string +| | ... | - remote_host_ip4_prefix - IP address prefix for host IP addresses +| | ... | (Optional). Type: string or integer +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Initialize IPv4 forwarding in circular topology \ +| | ... | \| 10.10.10.2 \| 20.20.20.2 \| 10.10.10.1 \| 20.20.20.1 \| +| | ... | \| Initialize IPv4 forwarding in circular topology \ +| | ... | \| 10.10.10.2 \| 20.20.20.2 \| 10.10.10.1 \| 20.20.20.1 \ +| | ... | \| 192.168.0.1 \| 192.168.0.2 \| 32 \| +| | ... +| | [Arguments] | ${tg_if1_ip4} | ${tg_if2_ip4} | ${dut1_if1_ip4} +| | ... | ${dut1_if2_ip4} | ${remote_host1_ip4}=${NONE} +| | ... | ${remote_host2_ip4}=${NONE} | ${remote_host_ip4_prefix}=${NONE} +| | ... +| | ${dut_tg_ip4_prefix}= | Set Variable | 24 +| | ... +| | Add arp on dut | ${dut_node} | ${dut_to_tg_if1} | ${tg_if1_ip4} +| | ... | ${tg_to_dut_if1_mac} +| | Add arp on dut | ${dut_node} | ${dut_to_tg_if2} | ${tg_if2_ip4} +| | ... | ${tg_to_dut_if2_mac} +| | ... +| | Configure IP addresses on interfaces | ${dut_node} | ${dut_to_tg_if1} +| | ... | ${dut1_if1_ip4} | ${dut_tg_ip4_prefix} +| | Configure IP addresses on interfaces | ${dut_node} | ${dut_to_tg_if2} +| | ... | ${dut1_if2_ip4} | ${dut_tg_ip4_prefix} +| | ... +| | Run Keyword Unless | '${remote_host1_ip4}' == '${NONE}' +| | ... | Vpp Route Add | ${dut_node} | ${remote_host1_ip4} +| | ... | ${remote_host_ip4_prefix} | ${tg_if1_ip4} | ${dut_to_tg_if1} +| | Run Keyword Unless | '${remote_host2_ip4}' == '${NONE}' +| | ... | Vpp Route Add | ${dut_node} | ${remote_host2_ip4} +| | ... | ${remote_host_ip4_prefix} | ${tg_if2_ip4} | ${dut_to_tg_if2} + +| Initialize IPv4 forwarding in 3-node circular topology +| | [Documentation] +| | ... | Set UP state on VPP interfaces in path on nodes in 3-node circular +| | ... | topology. Get the interface MAC addresses and setup ARP on all VPP +| | ... | interfaces. Setup IPv4 addresses with /24 prefix on DUT-TG links. +| | ... | Configure IPv4 adresses with /30 prefix on DUT1-DUT2 link and set +| | ... | routing on both DUT nodes with prefix /24 and next hop of neighbour +| | ... | DUT interface IPv4 address. Configure route entries for remote hosts +| | ... | IPv4 addresses if required. +| | ... +| | ... | *Arguments:* +| | ... | - tg_if1_ip4 - IP address of TG interface1. Type: string +| | ... | - tg_if2_ip4 - IP address of TG interface2. Type: string +| | ... | - dut1_if1_ip4 - IP address of DUT1 interface1. Type: string +| | ... | - dut1_if2_ip4 - IP address of DUT1 interface1. Type: string +| | ... | - dut2_if1_ip4 - IP address of DUT2 interface1. Type: string +| | ... | - dut2_if2_ip4 - IP address of DUT2 interface2. Type: string +| | ... | - remote_host1_ip4 - IP address of remote host1 (Optional). +| | ... | Type: string +| | ... | - remote_host2_ip4 - IP address of remote host2 (Optional). +| | ... | Type: string +| | ... | - remote_host_ip4_prefix - IP address prefix for host IP addresses +| | ... | (Optional). Type: string or integer +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Initialize IPv4 forwarding in circular topology \ +| | ... | \| 10.10.10.2 \| 20.20.20.2 \| 10.10.10.1 \| 1.1.1.1 \| 1.1.1.2 \ +| | ... | \| 20.20.20.1 \| +| | ... | \| Initialize IPv4 forwarding in circular topology \ +| | ... | \| 10.10.10.2 \| 20.20.20.2 \| 10.10.10.1 \| 1.1.1.1 \| 1.1.1.2 \ +| | ... | \| 20.20.20.1 \| 192.168.0.1 \| 192.168.0.2 \| 32 \| +| | ... +| | [Arguments] | ${tg_if1_ip4} | ${tg_if2_ip4} | ${dut1_if1_ip4} +| | ... | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${dut2_if2_ip4} +| | ... | ${remote_host1_ip4}=${NONE} | ${remote_host2_ip4}=${NONE} +| | ... | ${remote_host_ip4_prefix}=${NONE} +| | ... +| | ${dut_tg_ip4_prefix}= | Set Variable | 24 +| | ${dut_link_ip4_prefix}= | Set Variable | 30 +| | ... +| | Add arp on dut | ${dut1_node} | ${dut1_to_tg} | ${tg_if1_ip4} +| | ... | ${tg_to_dut1_mac} +| | Add arp on dut | ${dut1_node} | ${dut1_to_dut2} | ${dut2_if1_ip4} +| | ... | ${dut2_to_dut1_mac} +| | Add arp on dut | ${dut2_node} | ${dut2_to_dut1} | ${dut1_if2_ip4} +| | ... | ${dut1_to_dut2_mac} +| | Add arp on dut | ${dut2_node} | ${dut2_to_tg} | ${tg_if2_ip4} +| | ... | ${tg_to_dut2_mac} +| | ... +| | Configure IP addresses on interfaces | ${dut1_node} | ${dut1_to_tg} +| | ... | ${dut1_if1_ip4} | ${dut_tg_ip4_prefix} +| | Configure IP addresses on interfaces | ${dut1_node} | ${dut1_to_dut2} +| | ... | ${dut1_if2_ip4} | ${dut_link_ip4_prefix} +| | Configure IP addresses on interfaces | ${dut2_node} | ${dut2_to_dut1} +| | ... | ${dut2_if1_ip4} | ${dut_link_ip4_prefix} +| | Configure IP addresses on interfaces | ${dut2_node} | ${dut2_to_tg} +| | ... | ${dut2_if2_ip4} | ${dut_tg_ip4_prefix} +| | ... +| | Vpp Route Add | ${dut1_node} | ${tg_if2_ip4} | ${dut_tg_ip4_prefix} +| | ... | ${dut2_if1_ip4} | ${dut1_to_dut2} +| | Vpp Route Add | ${dut2_node} | ${tg_if1_ip4} | ${dut_tg_ip4_prefix} +| | ... | ${dut1_if2_ip4} | ${dut2_to_dut1} +| | ... +| | Run Keyword Unless | '${remote_host1_ip4}' == '${NONE}' +| | ... | Vpp Route Add | ${dut1_node} | ${remote_host1_ip4} +| | ... | ${remote_host_ip4_prefix} | ${tg_if1_ip4} | ${dut1_to_tg} +| | Run Keyword Unless | '${remote_host2_ip4}' == '${NONE}' +| | ... | Vpp Route Add | ${dut1_node} | ${remote_host2_ip4} +| | ... | ${remote_host_ip4_prefix} | ${dut2_if1_ip4} | ${dut1_to_dut2} +| | Run Keyword Unless | '${remote_host1_ip4}' == '${NONE}' +| | ... | Vpp Route Add | ${dut2_node} | ${remote_host1_ip4} +| | ... | ${remote_host_ip4_prefix} | ${dut1_if2_ip4} | ${dut2_to_dut1} +| | Run Keyword Unless | '${remote_host2_ip4}' == '${NONE}' +| | ... | Vpp Route Add | ${dut2_node} | ${remote_host2_ip4} +| | ... | ${remote_host_ip4_prefix} | ${tg_if2_ip4} | ${dut2_to_tg} diff --git a/resources/libraries/robot/ip/ip6.robot b/resources/libraries/robot/ip/ip6.robot index f80d98f177..9a816c2665 100644 --- a/resources/libraries/robot/ip/ip6.robot +++ b/resources/libraries/robot/ip/ip6.robot @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cisco and/or its affiliates. +# Copyright (c) 2018 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: @@ -11,18 +11,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""IPv6 keywords""" - *** Settings *** +| Library | resources.libraries.python.InterfaceUtil | Library | resources.libraries.python.IPv6Util | Library | resources.libraries.python.IPv6Setup -| Library | resources.libraries.python.TrafficScriptExecutor | Library | resources.libraries.python.NodePath | Library | resources.libraries.python.Routing -| Library | resources.libraries.python.InterfaceUtil | Library | resources.libraries.python.topology.Topology -| Resource | resources/libraries/robot/shared/default.robot +| Library | resources.libraries.python.TrafficScriptExecutor | Resource | resources/libraries/robot/shared/counters.robot +| Resource | resources/libraries/robot/shared/default.robot +| Resource | resources/libraries/robot/shared/testing_path.robot +| ... | Documentation | IPv6 keywords *** Keywords *** @@ -33,13 +33,15 @@ | | Compute Path | | ${src_port} | ${src_node}= | First Interface | | ${dst_port} | ${dst_node}= | Last Interface -| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} | ${nodes_addr} -| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} | ${nodes_addr} +| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} +| | ... | ${nodes_addr} +| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} +| | ... | ${nodes_addr} | | ${src_mac}= | Get Interface Mac | ${src_node} | ${src_port} | | ${dst_mac}= | Get Interface Mac | ${dst_node} | ${dst_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} -| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} | | Run Traffic Script On Node | icmpv6_echo.py | ${tg_node} | ${args} | | Vpp Dump Stats Table | ${dst_node} | | ${ipv6_counter}= | Vpp Get Ipv6 Interface Counter | ${dst_node} @@ -64,8 +66,8 @@ | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} | | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} -| | ${args}= | Set Variable -| | ... | ${args} --start_size ${start_size} --end_size ${end_size} --step ${step} +| | ${args}= | Catenate | ${args} | --start_size ${start_size} +| | ... | --end_size ${end_size} | --step ${step} | | Run Traffic Script On Node | ipv6_sweep_ping.py | ${src_node} | ${args} | | ... | timeout=${180} @@ -77,13 +79,15 @@ | | ${src_port} | ${src_node}= | First Interface | | ${dst_port} | ${dst_node}= | Last Egress Interface | | ${hop_port} | ${hop_node}= | First Ingress Interface -| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} | ${nodes_addr} -| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} | ${nodes_addr} +| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} +| | ... | ${nodes_addr} +| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} +| | ... | ${nodes_addr} | | ${src_mac}= | Get Interface Mac | ${src_node} | ${src_port} | | ${dst_mac}= | Get Interface Mac | ${hop_node} | ${hop_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} -| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} | | Run Traffic Script On Node | icmpv6_echo.py | ${tg_node} | ${args} @@ -95,30 +99,35 @@ | | ${src_port} | ${src_node}= | First Interface | | ${dst_port} | ${dst_node}= | Last Interface | | ${hop_port} | ${hop_node}= | First Ingress Interface -| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} | ${nodes_addr} -| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} | ${nodes_addr} +| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} +| | ... | ${nodes_addr} +| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} +| | ... | ${nodes_addr} | | ${src_mac}= | Get Interface Mac | ${src_node} | ${src_port} | | ${dst_mac}= | Get Interface Mac | ${hop_node} | ${hop_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} -| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} | | Run Traffic Script On Node | icmpv6_echo.py | ${tg_node} | ${args} | Send IPv6 ICMP echo request to DUT2 egress interface via DUT1 and verify answer -| | [Documentation] | Send traffic from TG to second DUT egress interface through first DUT +| | [Documentation] | Send traffic from TG to second DUT egress interface +| | ... | through first DUT | | [Arguments] | ${tg_node} | ${first_dut} | ${second_dut} | ${nodes_addr} | | Append Nodes | ${tg_node} | ${first_dut} | ${second_dut} | ${tg_node} | | Compute Path | | ${src_port} | ${src_node}= | First Interface | | ${dst_port} | ${dst_node}= | Last Egress Interface | | ${hop_port} | ${hop_node}= | First Ingress Interface -| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} | ${nodes_addr} -| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} | ${nodes_addr} +| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} +| | ... | ${nodes_addr} +| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} +| | ... | ${nodes_addr} | | ${src_mac}= | Get Interface Mac | ${src_node} | ${src_port} | | ${dst_mac}= | Get Interface Mac | ${hop_node} | ${hop_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} -| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} | | Run Traffic Script On Node | icmpv6_echo.py | ${tg_node} | ${args} | Ipv6 tg to tg routed @@ -131,16 +140,18 @@ | | ${dst_port} | ${dst_node}= | Last Interface | | ${src_nh_port} | ${src_nh_node}= | First Ingress Interface | | ${dst_nh_port} | ${dst_nh_node}= | Last Egress Interface -| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} | ${nodes_addr} -| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} | ${nodes_addr} +| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} +| | ... | ${nodes_addr} +| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} +| | ... | ${nodes_addr} | | ${src_mac}= | Get Interface Mac | ${src_node} | ${src_port} | | ${dst_mac}= | Get Interface Mac | ${src_node} | ${dst_port} | | ${src_nh_mac}= | Get Interface Mac | ${src_nh_node} | ${src_nh_port} | | ${dst_nh_mac}= | Get Interface Mac | ${dst_nh_node} | ${dst_nh_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} | | ${dst_port_name}= | Get interface name | ${dst_node} | ${dst_port} -| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${dst_port_name} | ${src_mac} -| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Traffic Script Gen Arg | ${dst_port_name} | ${src_port_name} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} | | ${args}= | Catenate | ${args} | --src_nh_mac ${src_nh_mac} | | ... | --dst_nh_mac ${dst_nh_mac} | --h_num 2 | | Run Traffic Script On Node | icmpv6_echo_req_resp.py | ${tg_node} | ${args} @@ -152,13 +163,15 @@ | | Compute Path | | ${src_port} | ${src_node}= | First Interface | | ${dst_port} | ${dst_node}= | Last Interface -| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} | ${nodes_addr} -| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} | ${nodes_addr} +| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} +| | ... | ${nodes_addr} +| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} +| | ... | ${nodes_addr} | | ${src_mac}= | Get Interface Mac | ${src_node} | ${src_port} | | ${dst_mac}= | Get Interface Mac | ${dst_node} | ${dst_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} -| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} | | Run Traffic Script On Node | ipv6_ns.py | ${src_node} | ${args} | Configure IPv6 on all DUTs in topology @@ -171,7 +184,8 @@ | | All Vpp Interfaces Ready Wait | ${nodes} | Suppress ICMPv6 router advertisement message -| | [Documentation] | Suppress ICMPv6 router advertisement message for link scope address +| | [Documentation] | Suppress ICMPv6 router advertisement message for link +| | ... | scope address | | [Arguments] | ${nodes} | | Vpp All Ra Suppress Link Layer | ${nodes} @@ -183,15 +197,214 @@ | | ${tg}= | Set Variable | ${nodes['TG']} | | ${dut1_if} | ${dut1}= | First Interface | | ${dut2_if} | ${dut2}= | Last Interface -| | ${dut1_if_addr}= | Get Node Port Ipv6 Address | ${dut1} | ${dut1_if} | ${nodes_addr} -| | ${dut2_if_addr}= | Get Node Port Ipv6 Address | ${dut2} | ${dut2_if} | ${nodes_addr} +| | ${dut1_if_addr}= | Get Node Port Ipv6 Address | ${dut1} | ${dut1_if} +| | ... | ${nodes_addr} +| | ${dut2_if_addr}= | Get Node Port Ipv6 Address | ${dut2} | ${dut2_if} +| | ... | ${nodes_addr} | | @{tg_dut1_links}= | Get active links connecting "${tg}" and "${dut1}" | | @{tg_dut2_links}= | Get active links connecting "${tg}" and "${dut2}" | | :FOR | ${link} | IN | @{tg_dut1_links} | | | ${net}= | Get Link Address | ${link} | ${nodes_addr} | | | ${prefix}= | Get Link Prefix | ${link} | ${nodes_addr} -| | | Vpp Route Add | ${dut2} | ${net} | ${prefix} | ${dut1_if_addr} | ${dut2_if} +| | | Vpp Route Add | ${dut2} | ${net} | ${prefix} | ${dut1_if_addr} +| | | ... | ${dut2_if} | | :FOR | ${link} | IN | @{tg_dut2_links} | | | ${net}= | Get Link Address | ${link} | ${nodes_addr} | | | ${prefix}= | Get Link Prefix | ${link} | ${nodes_addr} -| | | Vpp Route Add | ${dut1} | ${net} | ${prefix} | ${dut2_if_addr} | ${dut1_if} +| | | Vpp Route Add | ${dut1} | ${net} | ${prefix} | ${dut2_if_addr} +| | | ... | ${dut1_if} + +| Initialize IPv6 forwarding in circular topology +| | [Documentation] +| | ... | Set UP state on VPP interfaces in path on nodes in 2-node / 3-node +| | ... | circular topology. Get the interface MAC addresses and setup ARP on +| | ... | all VPP interfaces. Setup IPv6 addresses with /64 prefix on DUT-TG +| | ... | links. In case of 3-node topology setup IPv6 adresses with /96 prefix +| | ... | on DUT1-DUT2 link and set routing on both DUT nodes with prefix /64 +| | ... | and next hop of neighbour DUT interface IPv6 address. Configure route +| | ... | entries for remote hosts IPv6 addresses if required. +| | ... +| | ... | *Arguments:* +| | ... | - tg_if1_ip6 - IPv6 address of TG interface1. Type: string +| | ... | - tg_if2_ip6 - IPv6 address of TG interface2. Type: string +| | ... | - dut1_if1_ip6 - IPv6 address of DUT1 interface1. Type: string +| | ... | - dut1_if2_ip6 - IPv6 address of DUT1 interface1. Type: string +| | ... | - dut2_if1_ip6 - IPv6 address of DUT2 interface1 (Optional). +| | ... | Type: string +| | ... | - dut2_if2_ip6 - IPv6 address of DUT2 interface2 (Optional). +| | ... | Type: string +| | ... | - remote_host1_ip6 - IPv6 address of remote host1 (Optional). +| | ... | Type: string +| | ... | - remote_host2_ip6 - IPv6 address of remote host2 (Optional). +| | ... | Type: string +| | ... | - remote_host_ip6_prefix - IPv6 address prefix for host IPv6 addresses +| | ... | (Optional). Type: string or integer +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Initialize IPv6 forwarding in circular topology \ +| | ... | \| 2001:1::2 \| 2001:2::2 \| 2001:1::1 \| 2001:2::1 \| +| | ... | \| Initialize IPv6 forwarding in circular topology \ +| | ... | \| 2001:1::2 \| 2001:2::2 \| 2001:1::1 \| 2001:2::1 \ +| | ... | \| remote_host1_ip6=3ffe:5f::1 \| remote_host2_ip6=3ffe:5f::2 \ +| | ... | \| remote_host_ip6_prefix=128 \| +| | ... | \| Initialize IPv6 forwarding in circular topology \ +| | ... | \| 2001:1::2 \| 2001:2::2 \| 2001:1::1 \| 2003:3::1 \| 2003:3::2 \ +| | ... | \| 2001:2::1 \| +| | ... | \| Initialize IPv6 forwarding in circular topology \ +| | ... | \| 2001:1::2 \| 2001:2::2 \| 2001:1::1 \| 2003:3::1 \| 2003:3::2 \ +| | ... | \| 2001:2::1 \| remote_host1_ip4=3ffe:5f::1 \ +| | ... | \| remote_host2_ip4=3ffe:5f::2 \| remote_host_ip4_prefix=128 \| +| | ... +| | [Arguments] | ${tg_if1_ip6} | ${tg_if2_ip6} | ${dut1_if1_ip6} +| | ... | ${dut1_if2_ip6} | ${dut2_if1_ip6}=${NONE} | ${dut2_if2_ip6}=${NONE} +| | ... | ${remote_host1_ip6}=${NONE} | ${remote_host2_ip6}=${NONE} +| | ... | ${remote_host_ip6_prefix}=${NONE} +| | ... +| | ... +| | Set interfaces in path up +| | ... +| | ${dut2_status} | ${value}= | Run Keyword And Ignore Error +| | ... | Variable Should Exist | ${dut2_node} +| | ... +| | Run Keyword If | '${dut2_status}' == 'PASS' +| | ... | Initialize IPv6 forwarding in 3-node circular topology +| | ... | ${tg_if1_ip6} | ${tg_if2_ip6} | ${dut1_if1_ip6} | ${dut1_if2_ip6} +| | ... | ${dut2_if1_ip6} | ${dut2_if2_ip6} | ${remote_host1_ip6} +| | ... | ${remote_host2_ip6} | ${remote_host_ip6_prefix} +| | ... | ELSE +| | ... | Initialize IPv6 forwarding in 2-node circular topology +| | ... | ${tg_if1_ip6} | ${tg_if2_ip6} | ${dut1_if1_ip6} | ${dut1_if2_ip6} +| | ... | remote_host1_ip6=${remote_host1_ip6} +| | ... | remote_host2_ip6=${remote_host2_ip6} +| | ... | remote_host_ip6_prefix=${remote_host_ip6_prefix} + +| Initialize IPv6 forwarding in 2-node circular topology +| | [Documentation] +| | ... | Set UP state on VPP interfaces on DUT node in 2-node circular +| | ... | topology. Get the interface MAC addresses and setup ARP on +| | ... | all VPP interfaces. Setup IPv6 addresses with /64 prefix on DUT-TG +| | ... | links. Configure route entries for remote hosts IPv6 addresses +| | ... | if required. +| | ... +| | ... | *Arguments:* +| | ... | - tg_if1_ip6 - IPv6 address of TG interface1. Type: string +| | ... | - tg_if2_ip6 - IPv6 address of TG interface2. Type: string +| | ... | - dut1_if1_ip6 - IPv6 address of DUT1 interface1. Type: string +| | ... | - dut1_if2_ip6 - IPv6 address of DUT1 interface1. Type: string +| | ... | - remote_host1_ip6 - IPv6 address of remote host1 (Optional). +| | ... | Type: string +| | ... | - remote_host2_ip6 - IPv6 address of remote host2 (Optional). +| | ... | Type: string +| | ... | - remote_host_ip6_prefix - IPv6 address prefix for host IPv6 addresses +| | ... | (Optional). Type: string or integer +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Initialize IPv6 forwarding in circular topology \ +| | ... | \| 2001:1::2 \| 2001:2::2 \| 2001:1::1 \| 2001:2::1 \| +| | ... | \| Initialize IPv6 forwarding in circular topology \ +| | ... | \| 2001:1::2 \| 2001:2::2 \| 2001:1::1 \| 2001:2::1 \ +| | ... | \| remote_host1_ip6=3ffe:5f::1 \| remote_host2_ip6=3ffe:5f::2 \ +| | ... | \| remote_host_ip6_prefix=128 \| +| | ... +| | [Arguments] | ${tg_if1_ip6} | ${tg_if2_ip6} | ${dut1_if1_ip6} +| | ... | ${dut1_if2_ip6} | ${remote_host1_ip6}=${NONE} +| | ... | ${remote_host2_ip6}=${NONE} | ${remote_host_ip6_prefix}=${NONE} +| | ... +| | ${dut_tg_ip6_prefix}= | Set Variable | 64 +| | ... +| | Add IP neighbor | ${dut_node} | ${dut_to_tg_if1} | ${tg_if1_ip6} +| | ... | ${tg_to_dut_if1_mac} +| | Add IP neighbor | ${dut_node} | ${dut_to_tg_if2} | ${tg_if2_ip6} +| | ... | ${tg_to_dut_if2_mac} +| | ... +| | VPP set If IPv6 addr | ${dut_node} | ${dut_to_tg_if1} | ${dut1_if1_ip6} +| | ... | ${dut_tg_ip6_prefix} +| | VPP set If IPv6 addr | ${dut_node} | ${dut_to_tg_if2} | ${dut1_if2_ip6} +| | ... | ${dut_tg_ip6_prefix} +| | ... +| | Run Keyword Unless | '${remote_host1_ip6}' == '${NONE}' +| | ... | Vpp Route Add | ${dut_node} | ${remote_host1_ip6} +| | ... | ${remote_host_ip6_prefix} | ${tg_if1_ip6} | ${dut_to_tg_if1} +| | Run Keyword Unless | '${remote_host2_ip6}' == '${NONE}' +| | ... | Vpp Route Add | ${dut_node} | ${remote_host2_ip6} +| | ... | ${remote_host_ip6_prefix} | ${tg_if2_ip6} | ${dut_to_tg_if2} + +| Initialize IPv6 forwarding in 3-node circular topology +| | [Documentation] +| | ... | Set UP state on VPP interfaces in path on nodes in 3-node circular +| | ... | topology. Get the interface MAC addresses and setup ARP on all VPP +| | ... | interfaces. Setup IPv6 addresses with /64 prefix on DUT-TG links. +| | ... | Configure IPv6 adresses with /96 prefix on DUT1-DUT2 link and set +| | ... | routing on both DUT nodes with prefix /64 and next hop of neighbour +| | ... | DUT interface IPv6 address. Configure route entries for remote hosts +| | ... | IPv6 addresses if required. +| | ... +| | ... | *Arguments:* +| | ... | - tg_if1_ip6 - IPv6 address of TG interface1. Type: string +| | ... | - tg_if2_ip6 - IPv6 address of TG interface2. Type: string +| | ... | - dut1_if1_ip6 - IPv6 address of DUT1 interface1. Type: string +| | ... | - dut1_if2_ip6 - IPv6 address of DUT1 interface1. Type: string +| | ... | - dut2_if1_ip6 - IPv6 address of DUT2 interface1 Type: string +| | ... | - dut2_if2_ip6 - IPv6 address of DUT2 interface2 Type: string +| | ... | - remote_host1_ip6 - IPv6 address of remote host1 (Optional). +| | ... | Type: string +| | ... | - remote_host2_ip6 - IPv6 address of remote host2 (Optional). +| | ... | Type: string +| | ... | - remote_host_ip6_prefix - IPv6 address prefix for host IPv6 addresses +| | ... | (Optional). Type: string or integer +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Initialize IPv6 forwarding in circular topology \ +| | ... | \| 2001:1::2 \| 2001:2::2 \| 2001:1::1 \| 2003:3::1 \| 2003:3::2 \ +| | ... | \| 2001:2::1 \| +| | ... | \| Initialize IPv6 forwarding in circular topology \ +| | ... | \| 2001:1::2 \| 2001:2::2 \| 2001:1::1 \| 2003:3::1 \| 2003:3::2 \ +| | ... | \| 2001:2::1 \| remote_host1_ip4=3ffe:5f::1 \ +| | ... | \| remote_host2_ip4=3ffe:5f::2 \| remote_host_ip4_prefix=128 \| +| | ... +| | [Arguments] | ${tg_if1_ip6} | ${tg_if2_ip6} | ${dut1_if1_ip6} +| | ... | ${dut1_if2_ip6} | ${dut2_if1_ip6} | ${dut2_if2_ip6} +| | ... | ${remote_host1_ip6}=${NONE} | ${remote_host2_ip6}=${NONE} +| | ... | ${remote_host_ip6_prefix}=${NONE} +| | ... +| | ${dut_tg_ip6_prefix}= | Set Variable | 64 +| | ${dut_link_ip6_prefix}= | Set Variable | 96 +| | ... +| | Add IP neighbor | ${dut1_node} | ${dut1_to_tg} | ${tg_if1_ip6} +| | ... | ${tg_to_dut1_mac} +| | Add IP neighbor | ${dut1_node} | ${dut1_to_dut2} | ${dut2_if1_ip6} +| | ... | ${dut2_to_dut1_mac} +| | Add IP neighbor | ${dut2_node} | ${dut2_to_dut1} | ${dut1_if2_ip6} +| | ... | ${dut1_to_dut2_mac} +| | Add IP neighbor | ${dut2_node} | ${dut2_to_tg} | ${tg_if2_ip6} +| | ... | ${tg_to_dut2_mac} +| | ... +| | VPP set If IPv6 addr | ${dut1_node} | ${dut1_to_tg} | ${dut1_if1_ip6} +| | ... | ${dut_tg_ip6_prefix} +| | VPP set If IPv6 addr | ${dut1_node} | ${dut1_to_dut2} | ${dut1_if2_ip6} +| | ... | ${dut_link_ip6_prefix} +| | VPP set If IPv6 addr | ${dut2_node} | ${dut2_to_dut1} | ${dut2_if1_ip6} +| | ... | ${dut_link_ip6_prefix} +| | VPP set If IPv6 addr | ${dut2_node} | ${dut2_to_tg} | ${dut2_if2_ip6} +| | ... | ${dut_tg_ip6_prefix} +| | ... +| | Vpp Route Add | ${dut1_node} | ${tg_if2_ip6} | ${dut_tg_ip6_prefix} +| | ... | ${dut2_if1_ip6} | ${dut1_to_dut2} +| | Vpp Route Add | ${dut2_node} | ${tg_if1_ip6} | ${dut_tg_ip6_prefix} +| | ... | ${dut1_if2_ip6} | ${dut2_to_dut1} +| | ... +| | Run Keyword Unless | '${remote_host1_ip6}' == '${NONE}' +| | ... | Vpp Route Add | ${dut1_node} | ${remote_host1_ip6} +| | ... | ${remote_host_ip6_prefix} | ${tg_if1_ip6} | ${dut1_to_tg} +| | Run Keyword Unless | '${remote_host2_ip6}' == '${NONE}' +| | ... | Vpp Route Add | ${dut1_node} | ${remote_host2_ip6} +| | ... | ${remote_host_ip6_prefix} | ${dut2_if1_ip6} | ${dut1_to_dut2} +| | Run Keyword Unless | '${remote_host1_ip6}' == '${NONE}' +| | ... | Vpp Route Add | ${dut2_node} | ${remote_host1_ip6} +| | ... | ${remote_host_ip6_prefix} | ${dut1_if2_ip6} | ${dut2_to_dut1} +| | Run Keyword Unless | '${remote_host2_ip6}' == '${NONE}' +| | ... | Vpp Route Add | ${dut2_node} | ${remote_host2_ip6} +| | ... | ${remote_host_ip6_prefix} | ${tg_if2_ip6} | ${dut2_to_tg} diff --git a/resources/libraries/robot/shared/testing_path.robot b/resources/libraries/robot/shared/testing_path.robot index b7543e1c4d..ec0c856c81 100644 --- a/resources/libraries/robot/shared/testing_path.robot +++ b/resources/libraries/robot/shared/testing_path.robot @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cisco and/or its affiliates. +# Copyright (c) 2018 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: @@ -329,7 +329,7 @@ | | ... | - No value returned. | | ... | | ... | _NOTE:_ This KW uses test variables sets in -| | ... | "Configure path in double-link 3-node circular topology" KW. +| | ... | "Configure path in double-link 3-node circular topology" KW. | | ... | | ... | *Example:* | | ... @@ -350,4 +350,31 @@ | | Set Interface State | ${dut2_node} | ${dut2_to_dut1_if1} | up | | Set Interface State | ${dut2_node} | ${dut2_to_dut1_if2} | up | | Vpp Node Interfaces Ready Wait | ${dut1_node} -| | Vpp Node Interfaces Ready Wait | ${dut2_node}
\ No newline at end of file +| | Vpp Node Interfaces Ready Wait | ${dut2_node} + +| Set interfaces in path up +| | [Documentation] +| | ... | Set UP state on interfaces in 2-node or 3-node path on nodes and \ +| | ... | wait until all interfaces are ready. +| | ... +| | ... | *Arguments:* +| | ... | - No arguments. +| | ... +| | ... | *Return:* +| | ... | - No value returned. +| | ... +| | ... | _NOTE:_ This KW uses test variables sets in\ +| | ... | "Configure path in 2-node circular topology" or\ +| | ... | "Configure path in 3-node circular topology" KW. +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Set interfaces in path up \| +| | ... +| | ${dut2_status} | ${value}= | Run Keyword And Ignore Error +| | ... | Variable Should Exist | ${dut2} +| | ... +| | Run Keyword If | '${dut2_status}' == 'PASS' +| | ... | Set interfaces in 3-node circular topology up +| | ... | ELSE +| | ... | Set interfaces in 2-node circular topology up diff --git a/resources/libraries/robot/shared/traffic.robot b/resources/libraries/robot/shared/traffic.robot index 3a5cacee50..f002850071 100644 --- a/resources/libraries/robot/shared/traffic.robot +++ b/resources/libraries/robot/shared/traffic.robot @@ -23,19 +23,19 @@ | Library | resources.libraries.python.topology.Topology | Resource | resources/libraries/robot/shared/default.robot | Resource | resources/libraries/robot/shared/counters.robot +| ... | Documentation | Traffic keywords *** Keywords *** | Send packet and verify headers -| | [Documentation] | Sends packet from IP (with source mac) to IP -| | ... | (with dest mac). There has to be 4 MAC addresses -| | ... | when using 2 node + -| | ... | xconnect (one for each eth). +| | [Documentation] | Sends packet from IP (with source mac) to IP\ +| | ... | (with dest mac). There has to be 4 MAC addresses when using\ +| | ... | 2-node + xconnect (one for each eth). | | ... | | ... | *Arguments:* | | ... | | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) +| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) | | ... | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - src_ip - IP of source interface (TG-if1). Type: string @@ -66,17 +66,18 @@ | | ... | \| 32.0.0.1 \| eth2 \| 08:00:27:ee:fd:b3 \| 08:00:27:a2:52:5b \ | | ... | \| eth3 \| 08:00:27:4d:ca:7a \| 08:00:27:7d:fd:10 \| | | ... -| | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_src_port} | +| | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_src_port} | | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_port} | ${rx_src_mac} -| | ... | ${rx_dst_mac} -| | ... | ${encaps_tx}=${EMPTY} | ${vlan_tx}=${EMPTY} | ${vlan_outer_tx}=${EMPTY} -| | ... | ${encaps_rx}=${EMPTY} | ${vlan_rx}=${EMPTY} | ${vlan_outer_rx}=${EMPTY} +| | ... | ${rx_dst_mac} | ${encaps_tx}=${EMPTY} | ${vlan_tx}=${EMPTY} +| | ... | ${vlan_outer_tx}=${EMPTY} | ${encaps_rx}=${EMPTY} +| | ... | ${vlan_rx}=${EMPTY} | ${vlan_outer_rx}=${EMPTY} +| | ... | | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_src_port} | | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} -| | ${args}= | Catenate | --tg_src_mac | ${tx_src_mac} | --tg_dst_mac | -| | ... | ${rx_dst_mac} | --dut_if1_mac | ${tx_dst_mac} | --dut_if2_mac | -| | ... | ${rx_src_mac} | --src_ip | ${src_ip} | --dst_ip | ${dst_ip} | -| | ... | --tx_if | ${tx_port_name} | --rx_if | ${rx_port_name} +| | ${args}= | Catenate | --tg_src_mac ${tx_src_mac} +| | ... | --tg_dst_mac ${rx_dst_mac} | --dut_if1_mac ${tx_dst_mac} +| | ... | --dut_if2_mac ${rx_src_mac} | --src_ip ${src_ip} | --dst_ip ${dst_ip} +| | ... | --tx_if ${tx_port_name} | --rx_if ${rx_port_name} | | ${args}= | Run Keyword If | '${encaps_tx}' == '${EMPTY}' | | | ... | Set Variable | ${args} | | ... | ELSE | Catenate @@ -95,14 +96,14 @@ | | ... | ${args} | Packet transmission from port to port should fail -| | [Documentation] | Sends packet from ip (with specified mac) to ip -| | ... | (with dest mac). Using keyword : Send packet And Check -| | ... | Headers and subsequently checks the return value +| | [Documentation] | Sends packet from ip (with specified mac) to ip\ +| | ... | (with dest mac). Using keyword : Send packet And Check Headers\ +| | ... | and subsequently checks the return value. | | ... | | ... | *Arguments:* | | ... | | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) +| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) | | ... | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - src_ip - IP of source interface (TG-if1). Type: string @@ -119,47 +120,48 @@ | | ... | | ... | *Example:* | | ... -| | ... | \| Packet transmission from port to port should fail \| ${nodes['TG']} \ -| | ... | \| 10.0.0.1 \ \| 32.0.0.1 \| eth2 \| 08:00:27:ee:fd:b3 \ +| | ... | \| Packet transmission from port to port should fail \ +| | ... | \| ${nodes['TG']} \| 10.0.0.1 \ \| 32.0.0.1 \| eth2 \ | | ... | \| 08:00:27:a2:52:5b \| eth3 \| 08:00:27:4d:ca:7a \ -| | ... | \| 08:00:27:7d:fd:10 \| -| | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_src_port} | -| | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_port} | ${rx_src_mac} | +| | ... | \| 08:00:27:ee:fd:b3 \| 08:00:27:7d:fd:10 \| +| | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_src_port} +| | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_port} | ${rx_src_mac} | | ... | ${rx_dst_mac} +| | ... | | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_src_port} | | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} -| | ${args}= | Catenate | --tg_src_mac | ${tx_src_mac} | --tg_dst_mac | -| | ... | ${rx_dst_mac} | --dut_if1_mac | ${tx_dst_mac} | --dut_if2_mac | -| | ... | ${rx_src_mac} | --src_ip | ${src_ip} | --dst_ip | ${dst_ip} | -| | ... | --tx_if | ${tx_port_name} | --rx_if | ${rx_port_name} +| | ${args}= | Catenate | --tg_src_mac ${tx_src_mac} +| | ... | --tg_dst_mac ${rx_dst_mac} | --dut_if1_mac ${tx_dst_mac} +| | ... | --dut_if2_mac ${rx_src_mac} | --src_ip ${src_ip} | --dst_ip ${dst_ip} +| | ... | --tx_if ${tx_port_name} | --rx_if ${rx_port_name} | | Run Keyword And Expect Error | ICMP echo Rx timeout | | | ... | Run Traffic Script On Node | send_icmp_check_headers.py | | ... | ${tg_node} | ${args} | Send packet and verify ARP request | | [Documentation] | Send IP packet from tx_port and check if ARP Request\ -| | ... | packet is received on rx_port. +| | ... | packet is received on rx_port. | | ... | | ... | *Arguments:* | | ... | | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) +| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) | | ... | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - tx_src_ip - Source IP address of transferred packet (TG-if1). -| | ... | Type: string +| | ... | Type: string | | ... | - tx_dst_ip - Destination IP address of transferred packet (TG-if2). -| | ... | Type: string +| | ... | Type: string | | ... | - tx_port - Interface from which the IP packet is sent (TG-if1). -| | ... | Type: string +| | ... | Type: string | | ... | - tx_dst_mac - Destination MAC address of IP packet (DUT-if1). -| | ... | Type: string +| | ... | Type: string | | ... | - rx_port - Interface where the IP packet is received (TG-if2). -| | ... | Type: string +| | ... | Type: string | | ... | - rx_src_mac - Source MAC address of ARP packet (DUT-if2). -| | ... | Type: string +| | ... | Type: string | | ... | - rx_arp_src_ip - Source IP address of ARP packet (DUT-if2). -| | ... | Type: string +| | ... | Type: string | | ... | - rx_arp_dst_ip - Destination IP address of ARP packet. Type: string | | ... | | ... | *Return:* @@ -174,23 +176,24 @@ | | [Arguments] | ${tg_node} | ${tx_src_ip} | ${tx_dst_ip} | ${tx_port} | | ... | ${tx_dst_mac} | ${rx_port} | ${rx_src_mac} | ${rx_arp_src_ip} | | ... | ${rx_arp_dst_ip} +| | ... | | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_port} | | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} -| | ${args}= | Catenate -| | ... | --tx_dst_mac | ${tx_dst_mac} | --rx_src_mac | ${rx_src_mac} -| | ... | --tx_src_ip | ${tx_src_ip} | --tx_dst_ip | ${tx_dst_ip} -| | ... | --tx_if | ${tx_port_name} | --rx_if | ${rx_port_name} -| | ... | --rx_arp_src_ip ${rx_arp_src_ip} | --rx_arp_dst_ip ${rx_arp_dst_ip} +| | ${args}= | Catenate | --tx_dst_mac ${tx_dst_mac} +| | ... | --rx_src_mac ${rx_src_mac} | --tx_src_ip ${tx_src_ip} +| | ... | --tx_dst_ip ${tx_dst_ip} | --tx_if ${tx_port_name} +| | ... | --rx_if ${rx_port_name} | --rx_arp_src_ip ${rx_arp_src_ip} +| | ... | --rx_arp_dst_ip ${rx_arp_dst_ip} | | Run Traffic Script On Node | send_icmp_check_arp.py | ${tg_node} | ${args} | Send TCP or UDP packet and verify received packet -| | [Documentation] | Sends TCP or UDP packet with specified source -| | ... | and destination port. +| | [Documentation] | Sends TCP or UDP packet with specified source\ +| | ... | and destination port. | | ... | | ... | *Arguments:* | | ... | | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) +| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) | | ... | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - src_ip - IP of source interface (TG-if1). Type: integer @@ -208,35 +211,33 @@ | | ... | | ... | *Example:* | | ... -| | ... | \| Send TCP or UDP packet and verify received packet \| ${nodes['TG']} \ -| | ... | \| 16.0.0.1 \| 32.0.0.1 \| eth2 \| 08:00:27:cc:4f:54 \ -| | ... | \| eth4 \| 08:00:27:c9:6a:d5 \| TCP \| 20 \| 80 \| +| | ... | \| Send TCP or UDP packet and verify received packet \ +| | ... | \| ${nodes['TG']} \| 16.0.0.1 \| 32.0.0.1 \| eth2 \ +| | ... | \| 08:00:27:cc:4f:54 \| eth4 \| 08:00:27:c9:6a:d5 \| TCP \| 20 \ +| | ... | 80 \| | | ... -| | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_port} | -| | ... | ${tx_mac} | ${rx_port} | ${rx_mac} | ${protocol} | ${source_port} +| | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_port} | ${tx_mac} +| | ... | ${rx_port} | ${rx_mac} | ${protocol} | ${source_port} | | ... | ${destination_port} +| | ... | | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_port} | | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} -| | ${args}= | Catenate | --tx_mac | ${tx_mac} -| | ... | --rx_mac | ${rx_mac} -| | ... | --src_ip | ${src_ip} -| | ... | --dst_ip | ${dst_ip} -| | ... | --tx_if | ${tx_port_name} -| | ... | --rx_if | ${rx_port_name} -| | ... | --protocol | ${protocol} -| | ... | --source_port | ${source_port} -| | ... | --destination_port | ${destination_port} +| | ${args}= | Catenate | --tx_mac ${tx_mac} | --rx_mac ${rx_mac} +| | ... | --src_ip ${src_ip} | --dst_ip ${dst_ip} +| | ... | --tx_if ${tx_port_name} | --rx_if ${rx_port_name} +| | ... | --protocol ${protocol} | --source_port ${source_port} +| | ... | --destination_port ${destination_port} | | Run Traffic Script On Node | send_tcp_udp.py | | ... | ${tg_node} | ${args} | TCP or UDP packet transmission should fail -| | [Documentation] | Sends TCP or UDP packet with specified source -| | ... | and destination port. +| | [Documentation] | Sends TCP or UDP packet with specified source\ +| | ... | and destination port. | | ... | | ... | *Arguments:* | | ... | | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) +| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) | | ... | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - src_ip - IP of source interface (TG-if1). Type: integer @@ -258,34 +259,30 @@ | | ... | \| 16.0.0.1 \| 32.0.0.1 \| eth2 \| 08:00:27:cc:4f:54 \ | | ... | \| eth4 \| 08:00:27:c9:6a:d5 \| TCP \| 20 \| 80 \| | | ... -| | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_port} | -| | ... | ${tx_mac} | ${rx_port} | ${rx_mac} | ${protocol} | ${source_port} +| | [Arguments] | ${tg_node} | ${src_ip} | ${dst_ip} | ${tx_port} | ${tx_mac} +| | ... | ${rx_port} | ${rx_mac} | ${protocol} | ${source_port} | | ... | ${destination_port} +| | ... | | ${tx_port_name}= | Get interface name | ${tg_node} | ${tx_port} | | ${rx_port_name}= | Get interface name | ${tg_node} | ${rx_port} -| | ${args}= | Catenate | --tx_mac | ${tx_mac} -| | ... | --rx_mac | ${rx_mac} -| | ... | --src_ip | ${src_ip} -| | ... | --dst_ip | ${dst_ip} -| | ... | --tx_if | ${tx_port_name} -| | ... | --rx_if | ${rx_port_name} -| | ... | --protocol | ${protocol} -| | ... | --source_port | ${source_port} -| | ... | --destination_port | ${destination_port} +| | ${args}= | Catenate | --tx_mac ${tx_mac} | --rx_mac ${rx_mac} +| | ... | --src_ip ${src_ip} | --dst_ip ${dst_ip} | --tx_if ${tx_port_name} +| | ... | --rx_if ${rx_port_name} | --protocol ${protocol} +| | ... | --source_port ${source_port} | --destination_port ${destination_port} | | Run Keyword And Expect Error | TCP/UDP Rx timeout | | ... | Run Traffic Script On Node | send_tcp_udp.py | | ... | ${tg_node} | ${args} | Receive and verify router advertisement packet | | [Documentation] | Wait until RA packet is received and then verify\ -| | ... | specific fields of received RA packet. +| | ... | specific fields of received RA packet. | | ... | | ... | *Arguments:* | | ... | | ... | - node - Node where to check for RA packet. Type: dictionary | | ... | - rx_port - Interface where the packet is received. Type: string | | ... | - src_mac - MAC address of source interface from which the link-local\ -| | ... | IPv6 address is constructed and checked. Type: string +| | ... | IPv6 address is constructed and checked. Type: string | | ... | - interval - Configured retransmit interval. Optional. Type: integer | | ... | | ... | *Return:* @@ -297,16 +294,15 @@ | | ... | \| ${nodes['DUT1']} \| eth2 \| 08:00:27:cc:4f:54 \| | | ... | | [Arguments] | ${node} | ${rx_port} | ${src_mac} | ${interval}=${0} +| | ... | | ${rx_port_name}= | Get interface name | ${node} | ${rx_port} -| | ${args}= | Catenate -| | ... | --rx_if ${rx_port_name} -| | ... | --src_mac ${src_mac} +| | ${args}= | Catenate | --rx_if ${rx_port_name} | --src_mac ${src_mac} | | ... | --interval ${interval} | | Run Traffic Script On Node | check_ra_packet.py | ${node} | ${args} | Send router solicitation and verify response | | [Documentation] | Send RS packet, wait for response and then verify\ -| | ... | specific fields of received RA packet. +| | ... | specific fields of received RA packet. | | ... | | ... | *Arguments:* | | ... @@ -328,36 +324,36 @@ | | ... | | [Arguments] | ${tg_node} | ${dut_node} | ${tx_port} | ${rx_port} | | ... | ${src_ip}='' +| | ... | | ${src_mac}= | Get Interface Mac | ${tg_node} | ${tx_port} | | ${dst_mac}= | Get Interface Mac | ${dut_node} | ${rx_port} | | ${src_int_name}= | Get interface name | ${tg_node} | ${tx_port} | | ${dst_int_name}= | Get interface name | ${dut_node} | ${rx_port} -| | ${args}= | catenate -| | ... | --rx_if ${dst_int_name} --tx_if ${src_int_name} -| | ... | --src_mac ${src_mac} | --dst_mac ${dst_mac} -| | ... | --src_ip ${src_ip} +| | ${args}= | Catenate | --rx_if ${dst_int_name} | --tx_if ${src_int_name} +| | ... | --src_mac ${src_mac} | --dst_mac ${dst_mac} | --src_ip ${src_ip} | | Run Traffic Script On Node | send_rs_check_ra.py | | ... | ${tg_node} | ${args} | Send ARP Request -| | [Documentation] | Send ARP Request and check if the ARP Response is received. +| | [Documentation] | Send ARP Request and check if the ARP Response is\ +| | ... | received. | | ... | | ... | *Arguments:* | | ... | | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)<->(if1)DUT +| | ... | TG(if1)<->(if1)DUT | | ... | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - tx_port - Interface from which the ARP packet is sent (TG-if1). -| | ... | Type: string +| | ... | Type: string | | ... | - src_mac - Source MAC address of ARP packet (TG-if1). -| | ... | Type: string +| | ... | Type: string | | ... | - tgt_mac - Target MAC address which is expected in the response -| | ... | (DUT-if1). Type: string +| | ... | (DUT-if1). Type: string | | ... | - src_ip - Source IP address of ARP packet (TG-if1). -| | ... | Type: string +| | ... | Type: string | | ... | - tgt_ip - Target IP address of ARP packet (DUT-if1). -| | ... | Type: string +| | ... | Type: string | | ... | | ... | *Return:* | | ... | - No value returned @@ -368,34 +364,33 @@ | | ... | \| 08:00:27:cc:4f:54 \| 08:00:27:c9:6a:d5 \ | | ... | \| 10.0.0.100 \| 192.168.1.5 \| | | ... -| | [Arguments] | ${tg_node} | ${tx_port} -| | ... | ${src_mac} | ${tgt_mac} -| | ... | ${src_ip} | ${tgt_ip} -| | ${args}= | Catenate | --tx_if | ${tx_port} -| | ... | --src_mac | ${src_mac} | --dst_mac | ${tgt_mac} -| | ... | --src_ip | ${src_ip} | --dst_ip | ${tgt_ip} +| | [Arguments] | ${tg_node} | ${tx_port} | ${src_mac} | ${tgt_mac} | ${src_ip} +| | ... | ${tgt_ip} +| | ... +| | ${args}= | Catenate | --tx_if ${tx_port} | --src_mac ${src_mac} +| | ... | --dst_mac ${tgt_mac} | --src_ip ${src_ip} | --dst_ip ${tgt_ip} | | Run Traffic Script On Node | arp_request.py | ${tg_node} | ${args} | ARP request should fail -| | [Documentation] | Send ARP Request and -| | ... | the ARP Response should not be received. +| | [Documentation] | Send ARP Request and the ARP Response should not\ +| | ... | be received. | | ... | | ... | *Arguments:* | | ... | | ... | _NOTE:_ Arguments are based on topology: -| | ... | TG(if1)<->(if1)DUT +| | ... | TG(if1)<->(if1)DUT | | ... | | ... | - tg_node - Node to execute scripts on (TG). Type: dictionary | | ... | - tx_port - Interface from which the ARP packet is sent (TG-if1). -| | ... | Type: string +| | ... | Type: string | | ... | - src_mac - Source MAC address of ARP packet (TG-if1). -| | ... | Type: string +| | ... | Type: string | | ... | - tgt_mac - Target MAC address which is expected in the response -| | ... | (DUT-if1). Type: string +| | ... | (DUT-if1). Type: string | | ... | - src_ip - Source IP address of ARP packet (TG-if1). -| | ... | Type: string +| | ... | Type: string | | ... | - tgt_ip - Target IP address of ARP packet (DUT-if1). -| | ... | Type: string +| | ... | Type: string | | ... | | ... | *Return:* | | ... | - No value returned @@ -406,18 +401,17 @@ | | ... | \| 08:00:27:cc:4f:54 \| 08:00:27:c9:6a:d5 \ | | ... | \| 10.0.0.100 \| 192.168.1.5 \| | | ... -| | [Arguments] | ${tg_node} | ${tx_port} -| | ... | ${src_mac} | ${tgt_mac} -| | ... | ${src_ip} | ${tgt_ip} -| | ${args}= | Catenate | --tx_if | ${tx_port} -| | ... | --src_mac | ${src_mac} | --dst_mac | ${tgt_mac} -| | ... | --src_ip | ${src_ip} | --dst_ip | ${tgt_ip} +| | [Arguments] | ${tg_node} | ${tx_port} | ${src_mac} | ${tgt_mac} | ${src_ip} +| | ... | ${tgt_ip} +| | ... +| | ${args}= | Catenate | --tx_if ${tx_port} | --src_mac ${src_mac} +| | ... | --dst_mac ${tgt_mac} | --src_ip ${src_ip} | --dst_ip ${tgt_ip} | | Run Keyword And Expect Error | ARP reply timeout | | ... | Run Traffic Script On Node | arp_request.py | ${tg_node} | ${args} | Send packets and verify multipath routing | | [Documentation] | Send 100 IP ICMP packets traffic and check if it is\ -| | ... | divided into two paths. +| | ... | divided into two paths. | | ... | | ... | *Arguments:* | | ... @@ -446,14 +440,116 @@ | | ... | \| 02:00:00:00:00:02 \| 02:00:00:00:00:03 \| | | ... | | [Arguments] | ${tg_node} | ${src_port} | ${dst_port} | ${src_ip} | ${dst_ip} -| | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_src_mac} -| | ... | ${rx_dst_mac_1} | ${rx_dst_mac_2} +| | ... | ${tx_src_mac} | ${tx_dst_mac} | ${rx_src_mac} | ${rx_dst_mac_1} +| | ... | ${rx_dst_mac_2} +| | ... | | ${src_port_name}= | Get interface name | ${tg_node} | ${src_port} | | ${dst_port_name}= | Get interface name | ${tg_node} | ${dst_port} -| | ${args}= | Catenate | --tx_if | ${src_port_name} -| | ... | --rx_if | ${dst_port_name} | --src_ip | ${src_ip} -| | ... | --dst_ip | ${dst_ip} | --tg_if1_mac | ${tx_src_mac} -| | ... | --dut_if1_mac | ${tx_dst_mac} | --dut_if2_mac | ${rx_src_mac} -| | ... | --path_1_mac | ${rx_dst_mac_1} | --path_2_mac | ${rx_dst_mac_2} +| | ${args}= | Catenate | --tx_if ${src_port_name} +| | ... | --rx_if ${dst_port_name} | --src_ip ${src_ip} | --dst_ip ${dst_ip} +| | ... | --tg_if1_mac ${tx_src_mac} | --dut_if1_mac ${tx_dst_mac} +| | ... | --dut_if2_mac ${rx_src_mac} | --path_1_mac ${rx_dst_mac_1} +| | ... | --path_2_mac ${rx_dst_mac_2} | | Run Traffic Script On Node | send_icmp_check_multipath.py | ${tg_node} | | ... | ${args} + +| Send IPv4 ping packet and verify headers +| | [Documentation] | Send ICMP Echo Request message from source port of source\ +| | ... | node to destination port of destination node and check the received\ +| | ... | ICMP Echo Reply message for correctness inlcuding source and\ +| | ... | destination IPv4 and MAC addresses and ttl value. If the destination\ +| | ... | node is TG type the ttl of received ICMP Echo Request message is\ +| | ... | checked too and corresponding ICMP Echo Reply message is created. +| | ... +| | ... | *Arguments:* +| | ... +| | ... | _NOTE:_ Arguments are based on topology: +| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) +| | ... +| | ... | - tx_node - Source node to execute scripts on (mostly TG). +| | ... | Type: dictionary +| | ... | - tx_port - Source interface of tx_node. Type: string +| | ... | - rx_node - Destinantion node. Type: dictionary +| | ... | - rx_port - Destination interface of rx_node. Type: string +| | ... | - src_ip - IP address of source interface or source remote host. +| | ... | Type: string +| | ... | - dst_ip - IP address of destination interface or destination remote +| | ... | host. Type: string +| | ... | - first_hop_mac - Destination MAC address for the first hop in +| | ... | the path. Type: string +| | ... | - hops - Expected number of hops. Type: string or integer +| | ... +| | ... | *Return:* +| | ... | - No value returned +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Send IPv4 ping packet and verify headers \| ${nodes['TG']} \ +| | ... | \| eth2 \| ${nodes['DUT1']} \| eth3 \| 16.0.0.1 \| 32.0.0.1 \ +| | ... | \| 08:00:27:cc:4f:54 \| 1 \| +| | ... +| | [Arguments] | ${tx_node} | ${tx_port} | ${rx_node} | ${rx_port} +| | ... | ${src_ip} | ${dst_ip} | ${first_hop_mac} | ${hops} +| | ... +| | ${src_mac}= | Get interface MAC | ${tx_node} | ${tx_port} +| | ${dst_mac}= | Get interface MAC | ${rx_node} | ${rx_port} +| | ${is_dst_tg}= | Is TG node | ${rx_node} +| | ${tx_port_name}= | Get interface name | ${tx_node} | ${tx_port} +| | ${rx_port_name}= | Get interface name | ${rx_node} | ${rx_port} +| | ${args}= | Traffic Script Gen Arg | ${rx_port_name} | ${tx_port_name} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Catenate | ${args} | --hops ${hops} +| | ... | --first_hop_mac ${first_hop_mac} | --is_dst_tg ${is_dst_tg} +| | Run Traffic Script On Node | ipv4_ping_ttl_check.py | ${tx_node} | ${args} + +| Send IPv6 echo request packet and verify headers +| | [Documentation] | Send ICMPv6 Echo Request message from source port of\ +| | ... | source node to destination port of destination node and check\ +| | ... | the received ICMPv6 Echo Reply message for correctness inlcuding\ +| | ... | source and destination IPv4 and MAC addresses and hlim value. If\ +| | ... | the destination node is TG type the hlim of received ICMP Echo\ +| | ... | Request message is checked too and corresponding ICMP Echo Reply\ +| | ... | message is created and sent. +| | ... +| | ... | *Arguments:* +| | ... +| | ... | _NOTE:_ Arguments are based on topology: +| | ... | TG(if1)->(if1)DUT(if2)->TG(if2) +| | ... +| | ... | - tx_node - Source node to execute scripts on (mostly TG). +| | ... | Type: dictionary +| | ... | - tx_port - Source interface of tx_node. Type: string +| | ... | - rx_node - Destinantion node. Type: dictionary +| | ... | - rx_port - Destination interface of rx_node. Type: string +| | ... | - src_ip - IPv6 address of source interface or source remote host. +| | ... | Type: string +| | ... | - dst_ip - IPv6 address of destination interface or destination remote +| | ... | host. Type: string +| | ... | - src_nh_mac - Destination MAC address for the first hop in +| | ... | the path in direction from source node. Type: string +| | ... | - hops - Expected number of hops. Type: string or integer +| | ... | - dst_nh_mac - Destination MAC address for the first hop in +| | ... | the path in direction from destination node (Optional). Type: string +| | ... +| | ... | *Return:* +| | ... | - No value returned +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Send IPv6 echo request packet and verify headers \ +| | ... | \| ${nodes['TG']} \| eth2 \| ${nodes['DUT1']} \| eth3 \| 3ffe:5f::1 \ +| | ... | \| 3ffe:5f::2 \| 08:00:27:cc:4f:54 \| 1 \| +| | ... +| | [Arguments] | ${tx_node} | ${tx_port} | ${rx_node} | ${rx_port} | ${src_ip} +| | ... | ${dst_ip} | ${src_nh_mac} | ${hops} | ${dst_nh_mac}=${NONE} +| | ... +| | ${src_mac}= | Get interface MAC | ${tx_node} | ${tx_port} +| | ${dst_mac}= | Get interface MAC | ${rx_node} | ${rx_port} +| | ${is_dst_tg}= | Is TG node | ${rx_node} +| | ${tx_port_name}= | Get interface name | ${tx_node} | ${tx_port} +| | ${rx_port_name}= | Get interface name | ${rx_node} | ${rx_port} +| | ${args}= | Traffic Script Gen Arg | ${rx_port_name} | ${tx_port_name} +| | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Catenate | ${args} | --h_num ${hops} | --src_nh_mac ${src_nh_mac} +| | ... | --dst_nh_mac ${dst_nh_mac} | --is_dst_tg ${is_dst_tg} +| | Run Traffic Script On Node | icmpv6_echo_req_resp.py | ${tx_node} | ${args} diff --git a/resources/traffic_scripts/icmpv6_echo_req_resp.py b/resources/traffic_scripts/icmpv6_echo_req_resp.py index ec9cf94a67..195f666b38 100755 --- a/resources/traffic_scripts/icmpv6_echo_req_resp.py +++ b/resources/traffic_scripts/icmpv6_echo_req_resp.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Copyright (c) 2016 Cisco and/or its affiliates. +# Copyright (c) 2018 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: @@ -13,8 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Send ICMPv6 echo request from one TG port to another through DUT nodes and - send reply back. Also verify hop limit processing.""" +"""Send ICMPv6 echo request from one TG port to DUT port or to another TG port + through DUT node(s) and send reply back. Also verify hop limit processing.""" import sys import logging @@ -35,12 +35,10 @@ from resources.libraries.python.TrafficScriptArg import TrafficScriptArg def main(): args = TrafficScriptArg(['src_mac', 'dst_mac', 'src_nh_mac', 'dst_nh_mac', - 'src_ip', 'dst_ip', 'h_num']) + 'src_ip', 'dst_ip', 'h_num'], ['is_dst_tg']) - src_rxq = RxQueue(args.get_arg('rx_if')) - src_txq = TxQueue(args.get_arg('rx_if')) - dst_rxq = RxQueue(args.get_arg('tx_if')) - dst_txq = TxQueue(args.get_arg('tx_if')) + src_rxq = RxQueue(args.get_arg('tx_if')) + src_txq = TxQueue(args.get_arg('tx_if')) src_mac = args.get_arg('src_mac') dst_mac = args.get_arg('dst_mac') @@ -49,6 +47,11 @@ def main(): src_ip = args.get_arg('src_ip') dst_ip = args.get_arg('dst_ip') hop_num = int(args.get_arg('h_num')) + + is_dst_tg = True if args.get_arg('is_dst_tg') in ['True', ''] else False + dst_rxq = RxQueue(args.get_arg('rx_if')) if is_dst_tg else None + dst_txq = TxQueue(args.get_arg('rx_if')) if is_dst_tg else None + hop_limit = 64 echo_id = 0xa echo_seq = 0x1 @@ -63,12 +66,15 @@ def main(): ICMPv6NDOptDstLLAddr(lladdr=src_mac)) src_sent_packets.append(pkt_send) src_txq.send(pkt_send) - pkt_send = (Ether(src=dst_mac, dst='ff:ff:ff:ff:ff:ff') / - IPv6(src=dst_ip, dst='ff02::1:ff00:2') / - ICMPv6ND_NA(tgt=dst_ip, R=0) / - ICMPv6NDOptDstLLAddr(lladdr=dst_mac)) - dst_sent_packets.append(pkt_send) - dst_txq.send(pkt_send) + + if is_dst_tg: + # send ICMPv6 neighbor advertisement message + pkt_send = (Ether(src=dst_mac, dst='ff:ff:ff:ff:ff:ff') / + IPv6(src=dst_ip, dst='ff02::1:ff00:2') / + ICMPv6ND_NA(tgt=dst_ip, R=0) / + ICMPv6NDOptDstLLAddr(lladdr=dst_mac)) + dst_sent_packets.append(pkt_send) + dst_txq.send(pkt_send) # send ICMPv6 echo request from first TG interface pkt_send = (Ether(src=src_mac, dst=src_nh_mac) / @@ -77,56 +83,58 @@ def main(): src_sent_packets.append(pkt_send) src_txq.send(pkt_send) - # receive ICMPv6 echo request on second TG interface - while True: - ether = dst_rxq.recv(2, dst_sent_packets) - if ether is None: - raise RuntimeError('ICMPv6 echo reply Rx timeout') - - if ether.haslayer(ICMPv6ND_NS): - # read another packet in the queue if the current one is ICMPv6ND_NS - continue - else: - # otherwise process the current packet - break - - if not ether.haslayer(IPv6): - raise RuntimeError('Unexpected packet with no IPv6 received: {0}'. - format(ether.__repr__())) - - ipv6 = ether[IPv6] - - # verify hop limit processing - if ipv6.hlim != (hop_limit - hop_num): - raise RuntimeError('Invalid hop limit {0} should be {1}'. - format(ipv6.hlim,hop_limit - hop_num)) - - if not ipv6.haslayer(ICMPv6EchoRequest): - raise RuntimeError('Unexpected packet with no IPv6 ICMP received {0}'. - format(ipv6.__repr__())) - - icmpv6 = ipv6[ICMPv6EchoRequest] - - # check identifier and sequence number - if icmpv6.id != echo_id or icmpv6.seq != echo_seq: - raise RuntimeError('Invalid ICMPv6 echo reply received ID {0} ' - 'seq {1} should be ID {2} seq {3}'. - format(icmpv6.id, icmpv6.seq, echo_id, echo_seq)) - - # verify checksum - cksum = icmpv6.cksum - del icmpv6.cksum - tmp = ICMPv6EchoRequest(str(icmpv6)) - if not checksum_equal(tmp.cksum, cksum): - raise RuntimeError('Invalid checksum {0} should be {1}'. - format(cksum, tmp.cksum)) - - # send ICMPv6 echo reply from second TG interface - pkt_send = (Ether(src=dst_mac, dst=dst_nh_mac) / - IPv6(src=dst_ip, dst=src_ip) / - ICMPv6EchoReply(id=echo_id, seq=echo_seq)) - dst_sent_packets.append(pkt_send) - dst_txq.send(pkt_send) + if is_dst_tg: + # receive ICMPv6 echo request on second TG interface + while True: + ether = dst_rxq.recv(2, dst_sent_packets) + if ether is None: + raise RuntimeError('ICMPv6 echo reply Rx timeout') + + if ether.haslayer(ICMPv6ND_NS): + # read another packet in the queue if the current one is + # ICMPv6ND_NS + continue + else: + # otherwise process the current packet + break + + if not ether.haslayer(IPv6): + raise RuntimeError('Unexpected packet with no IPv6 received: {0}'. + format(ether.__repr__())) + + ipv6 = ether[IPv6] + + # verify hop limit processing + if ipv6.hlim != (hop_limit - hop_num): + raise RuntimeError('Invalid hop limit {0} should be {1}'. + format(ipv6.hlim, hop_limit - hop_num)) + + if not ipv6.haslayer(ICMPv6EchoRequest): + raise RuntimeError('Unexpected packet with no IPv6 ICMP received ' + '{0}'.format(ipv6.__repr__())) + + icmpv6 = ipv6[ICMPv6EchoRequest] + + # check identifier and sequence number + if icmpv6.id != echo_id or icmpv6.seq != echo_seq: + raise RuntimeError('Invalid ICMPv6 echo reply received ID {0} ' + 'seq {1} should be ID {2} seq {3}'. + format(icmpv6.id, icmpv6.seq, echo_id, echo_seq)) + + # verify checksum + cksum = icmpv6.cksum + del icmpv6.cksum + tmp = ICMPv6EchoRequest(str(icmpv6)) + if not checksum_equal(tmp.cksum, cksum): + raise RuntimeError('Invalid checksum {0} should be {1}'. + format(cksum, tmp.cksum)) + + # send ICMPv6 echo reply from second TG interface + pkt_send = (Ether(src=dst_mac, dst=dst_nh_mac) / + IPv6(src=dst_ip, dst=src_ip, hlim=(ipv6.hlim - 1)) / + ICMPv6EchoReply(id=echo_id, seq=echo_seq)) + dst_sent_packets.append(pkt_send) + dst_txq.send(pkt_send) # receive ICMPv6 echo reply on first TG interface while True: @@ -147,10 +155,13 @@ def main(): ipv6 = ether[IPv6] - # verify hop limit processing - if ipv6.hlim != (hop_limit - hop_num): + # verify hop limit processing; destination node decrements hlim by one in + # outgoing ICMPv6 Echo Reply + directions = 2 if is_dst_tg else 1 + hop_limit_reply = hop_limit - directions * hop_num - 1 + if ipv6.hlim != hop_limit_reply: raise RuntimeError('Invalid hop limit {0} should be {1}'. - format(ipv6.hlim, hop_limit - hop_num)) + format(ipv6.hlim, hop_limit_reply)) if not ipv6.haslayer(ICMPv6EchoReply): raise RuntimeError('Unexpected packet with no IPv6 ICMP received {0}'. diff --git a/tests/vpp/device/ip4/eth2p-ethip4-ip4base-dev.robot b/tests/vpp/device/ip4/eth2p-ethip4-ip4base-dev.robot new file mode 100644 index 0000000000..4ae23528f6 --- /dev/null +++ b/tests/vpp/device/ip4/eth2p-ethip4-ip4base-dev.robot @@ -0,0 +1,121 @@ +# Copyright (c) 2018 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. + +*** Settings *** +| Resource | resources/libraries/robot/ip/ip4.robot +| Resource | resources/libraries/robot/shared/default.robot +| Resource | resources/libraries/robot/shared/interfaces.robot +| Resource | resources/libraries/robot/shared/traffic.robot +| ... +| Force Tags | 2_NODE_SINGLE_LINK_TOPO | DEVICETEST | HW_ENV | DCR_ENV +| ... | FUNCTEST | IP4FWD | BASE | ETH | IP4BASE +| ... +| Test Setup | Set up VPP device test +| ... +| Test Teardown | Tear down VPP device test +| ... +| Documentation | *IPv4 routing test cases* +| ... +| ... | *[Top] Network Topologies:* TG-DUT1-TG 2-node circular topology\ +| ... | with single links between nodes. +| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for IPv4 routing on both\ +| ... | links. +| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv4 routing and two\ +| ... | static IPv4 /24 route entries. +| ... | *[Ver] TG verification:* Test ICMPv4 Echo Request packets are sent in\ +| ... | one direction by TG on links to DUT1; on receive TG verifies packets\ +| ... | for correctness and their IPv4 src-addr, dst-addr and MAC addresses. +| ... | *[Ref] Applicable standard specifications:* RFC791, RFC826, RFC792 + +*** Variables *** +| ${tg_to_dut_if1_ip4}= | 10.10.10.2 +| ${tg_to_dut_if2_ip4}= | 20.20.20.2 +| ${dut_to_tg_if1_ip4}= | 10.10.10.1 +| ${dut_to_tg_if2_ip4}= | 20.20.20.1 +| ${remote_host1_ip4}= | 192.168.0.1 +| ${remote_host2_ip4}= | 192.168.0.2 +| ${remote_host_ip4_prefix}= | 32 + +*** Test Cases *** +| tc01-eth2p-ethicmpv4-ip4base-device_echo-req-to-dut-ingress-interface +| | [Documentation] +| | ... | Make TG send ICMPv4 Echo Req to DUT1 ingress interface. Make TG\ +| | ... | verify ICMP Echo Reply is correct. +| | ... +| | ${hops}= | Set Variable | ${0} +| | ... +| | Given Configure path in 2-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} +| | And Initialize IPv4 forwarding in circular topology | ${tg_to_dut_if1_ip4} +| | ... | ${tg_to_dut_if2_ip4} | ${dut_to_tg_if1_ip4} | ${dut_to_tg_if2_ip4} +| | When All Vpp Interfaces Ready Wait | ${nodes} +| | Then Send IPv4 ping packet and verify headers | ${tg_node} +| | ... | ${tg_to_dut_if1} | ${dut_node} | ${dut_to_tg_if1} +| | ... | ${tg_to_dut_if1_ip4} | ${dut_to_tg_if1_ip4} | ${dut_to_tg_if1_mac} +| | ... | ${hops} + +| tc02-eth2p-ethicmpv4-ip4base-device_echo-req-to-dut-egress-interface +| | [Documentation] +| | ... | Make TG send ICMPv4 Echo Req towards DUT1 egress interface. Make TG\ +| | ... | verify ICMP Echo Reply is correct. +| | ... +| | ${hops}= | Set Variable | ${0} +| | ... +| | Given Configure path in 2-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} +| | And Initialize IPv4 forwarding in circular topology | ${tg_to_dut_if1_ip4} +| | ... | ${tg_to_dut_if2_ip4} | ${dut_to_tg_if1_ip4} | ${dut_to_tg_if2_ip4} +| | When All Vpp Interfaces Ready Wait | ${nodes} +| | Then Send IPv4 ping packet and verify headers | ${tg_node} +| | ... | ${tg_to_dut_if1} | ${dut_node} | ${dut_to_tg_if2} +| | ... | ${tg_to_dut_if1_ip4} | ${dut_to_tg_if2_ip4} | ${dut_to_tg_if1_mac} +| | ... | ${hops} + +| tc03-eth2p-ethicmpv4-ip4base-device_echo-req-to-tg-interface-for-local-ipv4-address +| | [Documentation] +| | ... | Make TG send ICMPv4 Echo Req between its interfaces across DUT1 for\ +| | ... | locally connected IPv4 addresses. Make TG verify ICMPv4 Echo Replies\ +| | ... | are correct. +| | ... +| | ${hops}= | Set Variable | ${1} +| | ... +| | Given Configure path in 2-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} +| | And Initialize IPv4 forwarding in circular topology | ${tg_to_dut_if1_ip4} +| | ... | ${tg_to_dut_if2_ip4} | ${dut_to_tg_if1_ip4} | ${dut_to_tg_if2_ip4} +| | When All Vpp Interfaces Ready Wait | ${nodes} +| | Then Send IPv4 ping packet and verify headers | ${tg_node} +| | ... | ${tg_to_dut_if1} | ${tg_node} | ${tg_to_dut_if2} +| | ... | ${tg_to_dut_if1_ip4} | ${tg_to_dut_if2_ip4} | ${dut_to_tg_if1_mac} +| | ... | ${hops} + +| tc04-eth2p-ethicmpv4-ip4base-device_echo-req-to-tg-interface-for-remote-host-ipv4-address +| | [Documentation] +| | ... | Make TG send ICMPv4 Echo Req between its interfaces across DUT1 for\ +| | ... | remote host IPv4 addresses. Make TG verify ICMPv4 Echo Replies are\ +| | ... | correct. +| | ... +| | ${hops}= | Set Variable | ${1} +| | ... +| | Given Configure path in 2-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} +| | And Initialize IPv4 forwarding in circular topology | ${tg_to_dut_if1_ip4} +| | ... | ${tg_to_dut_if2_ip4} | ${dut_to_tg_if1_ip4} | ${dut_to_tg_if2_ip4} +| | ... | remote_host1_ip4=${remote_host1_ip4} +| | ... | remote_host2_ip4=${remote_host2_ip4} +| | ... | remote_host_ip4_prefix=${remote_host_ip4_prefix} +| | When All Vpp Interfaces Ready Wait | ${nodes} +| | Then Send IPv4 ping packet and verify headers | ${tg_node} +| | ... | ${tg_to_dut_if1} | ${tg_node} | ${tg_to_dut_if2} +| | ... | ${remote_host1_ip4} | ${remote_host2_ip4} | ${dut_to_tg_if1_mac} +| | ... | ${hops} diff --git a/tests/vpp/device/ip6/eth2p-ethip6-ip6base-dev.robot b/tests/vpp/device/ip6/eth2p-ethip6-ip6base-dev.robot new file mode 100644 index 0000000000..c045acd06b --- /dev/null +++ b/tests/vpp/device/ip6/eth2p-ethip6-ip6base-dev.robot @@ -0,0 +1,125 @@ +# Copyright (c) 2018 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. + +*** Settings *** +| Resource | resources/libraries/robot/ip/ip6.robot +| Resource | resources/libraries/robot/shared/default.robot +| Resource | resources/libraries/robot/shared/interfaces.robot +| Resource | resources/libraries/robot/shared/traffic.robot +| ... +| Force Tags | 2_NODE_SINGLE_LINK_TOPO | DEVICETEST | HW_ENV | DCR_ENV +| ... | FUNCTEST | IP6FWD | BASE | ETH | IP6BASE +| ... +| Test Setup | Set up VPP device test +| ... +| Test Teardown | Tear down VPP device test +| ... +| Documentation | *IPv6 routing test cases* +| ... +| ... | *[Top] Network Topologies:* TG-DUT1-TG 2-node circular topology\ +| ... | with single links between nodes. +| ... | *[Enc] Packet Encapsulations:* Eth-IPv6-ICMPv6 for IPv6 routing on both\ +| ... | links. +| ... | *[Cfg] DUT configuration:* DUT1 is configured with IPv6 routing and two\ +| ... | static IPv6 /64 route entries. +| ... | *[Ver] TG verification:* Test ICMPv6 Echo Request packets are sent in\ +| ... | one direction by TG on links to DUT1; on receive TG verifies packets\ +| ... | for correctness and their IPv6 src-addr, dst-addr and MAC addresses. +| ... | *[Ref] Applicable standard specifications:* RFC2460, RFC4443, RFC4861 + +*** Variables *** +| ${tg_to_dut_if1_ip6}= | 2001:1::2 +| ${tg_to_dut_if2_ip6}= | 2001:2::2 +| ${dut_to_tg_if1_ip6}= | 2001:1::1 +| ${dut_to_tg_if2_ip6}= | 2001:2::1 +| ${remote_host1_ip6}= | 3ffe:5f::1 +| ${remote_host2_ip6}= | 3ffe:5f::2 +| ${remote_host_ip6_prefix}= | 128 + +*** Test Cases *** +| tc01-eth2p-ethicmpv6-ip6base-device_echo-req-to-dut-ingress-interface +| | [Documentation] +| | ... | Make TG send ICMPv6 Echo Req to DUT1 ingress interface. Make TG\ +| | ... | verify ICMPv6 Echo Reply is correct. +| | ... +| | ${hops}= | Set Variable | ${0} +| | ... +| | Given Configure path in 2-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} +| | And Initialize IPv6 forwarding in circular topology | ${tg_to_dut_if1_ip6} +| | ... | ${tg_to_dut_if2_ip6} | ${dut_to_tg_if1_ip6} | ${dut_to_tg_if2_ip6} +| | And Suppress ICMPv6 router advertisement message | ${nodes} +| | When All Vpp Interfaces Ready Wait | ${nodes} +| | Then Send IPv6 echo request packet and verify headers | ${tg_node} +| | ... | ${tg_to_dut_if1} | ${dut_node} | ${dut_to_tg_if1} +| | ... | ${tg_to_dut_if1_ip6} | ${dut_to_tg_if1_ip6} | ${dut_to_tg_if1_mac} +| | ... | ${hops} + +| tc02-eth2p-ethicmpv6-ip6base-device_echo-req-to-dut-egress-interface +| | [Documentation] +| | ... | Make TG send ICMPv6 Echo Req towards DUT1 egress interface. Make TG\ +| | ... | verify ICMPv6 Echo Reply is correct. +| | ... +| | ${hops}= | Set Variable | ${0} +| | ... +| | Given Configure path in 2-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} +| | And Initialize IPv6 forwarding in circular topology | ${tg_to_dut_if1_ip6} +| | ... | ${tg_to_dut_if2_ip6} | ${dut_to_tg_if1_ip6} | ${dut_to_tg_if2_ip6} +| | And Suppress ICMPv6 router advertisement message | ${nodes} +| | When All Vpp Interfaces Ready Wait | ${nodes} +| | Then Send IPv6 echo request packet and verify headers | ${tg_node} +| | ... | ${tg_to_dut_if1} | ${dut_node} | ${dut_to_tg_if2} +| | ... | ${tg_to_dut_if1_ip6} | ${dut_to_tg_if2_ip6} | ${dut_to_tg_if1_mac} +| | ... | ${hops} + +| tc03-eth2p-ethicmpv6-ip6base-device_echo-req-to-tg-interface-for-local-ipv4-address +| | [Documentation] +| | ... | Make TG send ICMPv6 Echo Req between its interfaces across DUT1 for\ +| | ... | locally connected IPv6 addresses. Make TG verify ICMPv6 Echo Replies\ +| | ... | are correct. +| | ... +| | ${hops}= | Set Variable | ${1} +| | ... +| | Given Configure path in 2-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} +| | And Initialize IPv6 forwarding in circular topology | ${tg_to_dut_if1_ip6} +| | ... | ${tg_to_dut_if2_ip6} | ${dut_to_tg_if1_ip6} | ${dut_to_tg_if2_ip6} +| | And Suppress ICMPv6 router advertisement message | ${nodes} +| | When All Vpp Interfaces Ready Wait | ${nodes} +| | Then Send IPv6 echo request packet and verify headers | ${tg_node} +| | ... | ${tg_to_dut_if1} | ${tg_node} | ${tg_to_dut_if2} +| | ... | ${tg_to_dut_if1_ip6} | ${tg_to_dut_if2_ip6} | ${dut_to_tg_if1_mac} +| | ... | ${hops} | ${dut_to_tg_if2_mac} + +| tc04-eth2p-ethicmpv6-ip6base-device_echo-req-to-tg-interface-for-remote-host-ipv4-address +| | [Documentation] +| | ... | Make TG send ICMPv6 Echo Req between its interfaces across DUT1 for\ +| | ... | remote host IPv6 addresses. Make TG verify ICMPv6 Echo Replies are\ +| | ... | correct. +| | ... +| | ${hops}= | Set Variable | ${1} +| | ... +| | Given Configure path in 2-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} +| | And Initialize IPv6 forwarding in circular topology | ${tg_to_dut_if1_ip6} +| | ... | ${tg_to_dut_if2_ip6} | ${dut_to_tg_if1_ip6} | ${dut_to_tg_if2_ip6} +| | ... | remote_host1_ip6=${remote_host1_ip6} +| | ... | remote_host2_ip6=${remote_host2_ip6} +| | ... | remote_host_ip6_prefix=${remote_host_ip6_prefix} +| | And Suppress ICMPv6 router advertisement message | ${nodes} +| | When All Vpp Interfaces Ready Wait | ${nodes} +| | Then Send IPv6 echo request packet and verify headers | ${tg_node} +| | ... | ${tg_to_dut_if1} | ${tg_node} | ${tg_to_dut_if2} +| | ... | ${remote_host1_ip6} | ${remote_host2_ip6} | ${dut_to_tg_if1_mac} +| | ... | ${hops} | ${dut_to_tg_if2_mac} diff --git a/tests/vpp/device/l2bd/eth2p-eth-l2bdbasemaclrn-dev.robot b/tests/vpp/device/l2bd/eth2p-eth-l2bdbasemaclrn-dev.robot new file mode 100644 index 0000000000..553ed17029 --- /dev/null +++ b/tests/vpp/device/l2bd/eth2p-eth-l2bdbasemaclrn-dev.robot @@ -0,0 +1,87 @@ +# Copyright (c) 2018 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. + +*** Settings *** +| Resource | resources/libraries/robot/l2/l2_bridge_domain.robot +| Resource | resources/libraries/robot/l2/l2_traffic.robot +| Resource | resources/libraries/robot/shared/default.robot +| Resource | resources/libraries/robot/shared/interfaces.robot +| Resource | resources/libraries/robot/shared/testing_path.robot +| ... +| Force Tags | 2_NODE_SINGLE_LINK_TOPO | DEVICETEST | HW_ENV | DCR_ENV +| ... | FUNCTEST | L2BDMACLRN | BASE | ETH | ICMP +| ... +| Test Setup | Set up VPP device test +| ... +| Test Teardown | Tear down VPP device test +| ... +| Documentation | *L2 bridge-domain test cases* +| ... +| ... | *[Top] Network Topologies:* TG-DUT1-TG 2-node circular topology\ +| ... | with single links between nodes. +| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-ICMPv4 for L2 switching of\ +| ... | IPv4; Eth-IPv6-ICMPv6 for L2 switching of IPv6 use. Both apply to all\ +| ... | links. +| ... | *[Cfg] DUT configuration:* DUT1 is configured with L2 bridge-domain\ +| ... | switching. +| ... | *[Ver] TG verification:* Test ICMPv4 (or ICMPv6) Echo Request packets\ +| ... | are sent in both directions by TG on links to DUT1; on receive TG\ +| ... | verifies packets for correctness and their IPv4 (IPv6) src-addr,\ +| ... | dst-addr and MAC addresses. +| ... | *[Ref] Applicable standard specifications:* RFC792 + +*** Variables *** +| ${bd_id}= | 1 + +*** Test Cases *** +| tc01-eth2p-ethicmpv4-l2bdbase-device +| | [Documentation] +| | ... | [Top] TG-DUT1-TG. [Enc] Eth-IPv4-ICMPv4. +| | ... | [Cfg] Configure L2 bridge-domain (L2BD) with MAC learning enabled on\ +| | ... | DUT1. Add both interfaces towards TG to this L2BD. +| | ... | [Ver] Make TG send ICMPv4 Echo Req in both directions between two of\ +| | ... | its interfaces to be switched by DUT1; verify all packets are\ +| | ... | received. +| | ... +| | Given Configure path in 2-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} +| | And Set interfaces in path up +| | And Create bridge domain | ${dut_node} | ${bd_id} +| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if1} +| | ... | ${bd_id} +| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if2} +| | ... | ${bd_id} +| | When All Vpp Interfaces Ready Wait | ${nodes} +| | Then Send ICMPv4 bidirectionally and verify received packets | ${tg_node} +| | ... | ${tg_to_dut_if1} | ${tg_to_dut_if2} + +| tc02-eth2p-ethicmpv6-l2bdbase-device +| | [Documentation] +| | ... | [Top] TG-DUT1-TG. [Enc] Eth-IPv6-ICMPv6. +| | ... | [Cfg] Configure L2 bridge-domain (L2BD) with MAC learning enabled on\ +| | ... | DUT1. Add both interfaces towards TG to this L2BD. +| | ... | [Ver] Make TG send ICMPv6 Echo Req in both directions between two of\ +| | ... | its interfaces to be switched by DUT1; verify all packets are\ +| | ... | received. +| | ... +| | Given Configure path in 2-node circular topology +| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} +| | And Set interfaces in path up +| | And Create bridge domain | ${dut_node} | ${bd_id} +| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if1} +| | ... | ${bd_id} +| | And Add interface to bridge domain | ${dut_node} | ${dut_to_tg_if2} +| | ... | ${bd_id} +| | When All Vpp Interfaces Ready Wait | ${nodes} +| | Then Send ICMPv6 bidirectionally and verify received packets +| | ... | ${tg_node} | ${tg_to_dut_if1} | ${tg_to_dut_if2} diff --git a/tests/vpp/device/l2xc/eth2p-ethicmp-l2xcbase-device.robot b/tests/vpp/device/l2xc/eth2p-ethicmp-l2xcbase-dev.robot index b18ce7bb77..19920e604c 100644 --- a/tests/vpp/device/l2xc/eth2p-ethicmp-l2xcbase-device.robot +++ b/tests/vpp/device/l2xc/eth2p-ethicmp-l2xcbase-dev.robot @@ -18,7 +18,7 @@ | Resource | resources/libraries/robot/shared/testing_path.robot | ... | Force Tags | 2_NODE_SINGLE_LINK_TOPO | DEVICETEST | HW_ENV | DCR_ENV -| ... | L2XCFWD | ICMP +| ... | FUNCTEST | L2XCFWD | BASE | ETH | ICMP | ... | Test Setup | Set up VPP device test | ... @@ -37,21 +37,21 @@ | ... | are sent in both directions by TG on links to DUT1; on receive TG\ | ... | verifies packets for correctness and their IPv4 (IPv6) src-addr,\ | ... | dst-addr and MAC addresses. -| ... | *[Ref] Applicable standard specifications: rfc792* +| ... | *[Ref] Applicable standard specifications:* RFC792 *** Test Cases *** | tc01-eth2p-ethicmpv4-l2xcbase-device | | [Documentation] | | ... | [Top] TG-DUT1-TG. [Enc] Eth-IPv4-ICMPv4. -| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC), with both interfaces\ -| | ... | to TG. +| | ... | [Cfg] Configure L2 cross-connects (L2XC) between both interfaces\ +| | ... | towards TG on DUT1. | | ... | [Ver] Make TG send ICMPv4 Echo Req in both directions between two of\ -| | ... | its interfaces to be switched by DUT1; verify all packets are +| | ... | its interfaces to be switched by DUT1; verify all packets are\ | | ... | received. | | ... | | Given Configure path in 2-node circular topology | | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} -| | And Set Interfaces In 2-node Circular Topology Up +| | And Set interfaces in path up | | And Configure L2XC | ${dut_node} | ${dut_to_tg_if1} | ${dut_to_tg_if2} | | When All Vpp Interfaces Ready Wait | ${nodes} | | Then Send ICMPv4 bidirectionally and verify received packets @@ -59,16 +59,16 @@ | tc02-eth2p-ethicmpv6-l2xcbase-device | | [Documentation] -| | ... | [Top] TG-DUT1-TG. [Enc] Eth-IPv4-ICMPv6. -| | ... | [Cfg] On DUT1 configure L2 cross-connect (L2XC), with both interfaces\ -| | ... | to TG. -| | ... | [Ver] Make TG send ICMPv4 Echo Req in both directions between two of\ -| | ... | its interfaces to be switched by DUT1; verify all packets are +| | ... | [Top] TG-DUT1-TG. [Enc] Eth-IPv6-ICMPv6. +| | ... | [Cfg] Configure L2 cross-connects (L2XC) between both interfaces\ +| | ... | towards TG on DUT1. +| | ... | [Ver] Make TG send ICMPv6 Echo Req in both directions between two of\ +| | ... | its interfaces to be switched by DUT1; verify all packets are\ | | ... | received. | | ... | | Given Configure path in 2-node circular topology | | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']} -| | And Set Interfaces In 2-node Circular Topology Up +| | And Set interfaces in path up | | And Configure L2XC | ${dut_node} | ${dut_to_tg_if1} | ${dut_to_tg_if2} | | When All Vpp Interfaces Ready Wait | ${nodes} | | Then Send ICMPv6 bidirectionally and verify received packets |