aboutsummaryrefslogtreecommitdiffstats
path: root/resources
diff options
context:
space:
mode:
Diffstat (limited to 'resources')
-rw-r--r--resources/libraries/python/InterfaceUtil.py19
-rw-r--r--resources/libraries/python/ProxyArp.py36
-rw-r--r--resources/libraries/python/TrafficScriptExecutor.py3
-rw-r--r--resources/libraries/robot/traffic.robot76
-rw-r--r--resources/templates/vat/add_proxy_arp.vat1
-rw-r--r--resources/templates/vat/proxy_arp_intfc_enable.vat1
-rwxr-xr-xresources/traffic_scripts/arp_request.py4
7 files changed, 140 insertions, 0 deletions
diff --git a/resources/libraries/python/InterfaceUtil.py b/resources/libraries/python/InterfaceUtil.py
index 7bf0584697..ace4453e54 100644
--- a/resources/libraries/python/InterfaceUtil.py
+++ b/resources/libraries/python/InterfaceUtil.py
@@ -748,3 +748,22 @@ class InterfaceUtil(object):
return {}
return vxlan_gpe_data[0]
+
+ @staticmethod
+ def vpp_proxy_arp_interface_enable(node, interface):
+ """Enable proxy ARP on interface.
+
+ :param node: VPP node to enable proxy ARP on interface.
+ :param interface: Interface to enable proxy ARP.
+ :type node: dict
+ :type interface: str or int
+ """
+ if isinstance(interface, basestring):
+ sw_if_index = InterfaceUtil.get_sw_if_index(node, interface)
+ else:
+ sw_if_index = interface
+
+ with VatTerminal(node) as vat:
+ vat.vat_terminal_exec_cmd_from_template(
+ "proxy_arp_intfc_enable.vat",
+ sw_if_index=sw_if_index)
diff --git a/resources/libraries/python/ProxyArp.py b/resources/libraries/python/ProxyArp.py
new file mode 100644
index 0000000000..4879fe6bae
--- /dev/null
+++ b/resources/libraries/python/ProxyArp.py
@@ -0,0 +1,36 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Proxy ARP library"""
+
+from resources.libraries.python.VatExecutor import VatTerminal
+
+
+class ProxyArp(object):
+ """Proxy ARP utilities."""
+
+ @staticmethod
+ def vpp_add_proxy_arp(node, lo_ip4_addr, hi_ip4_addr):
+ """Enable proxy ARP for a range of IP addresses.
+
+ :param node: VPP node to enable proxy ARP.
+ :param lo_ip4_addr: The lower limit of the IP addresses.
+ :param hi_ip4_addr: The upper limit of the IP addresses.
+ :type node: dict
+ :type lo_ip4_addr: str
+ :type hi_ip4_addr: str
+ """
+ with VatTerminal(node) as vat:
+ vat.vat_terminal_exec_cmd_from_template("add_proxy_arp.vat",
+ lo_ip4_addr=lo_ip4_addr,
+ hi_ip4_addr=hi_ip4_addr)
diff --git a/resources/libraries/python/TrafficScriptExecutor.py b/resources/libraries/python/TrafficScriptExecutor.py
index f730d3a0e3..f4f026addf 100644
--- a/resources/libraries/python/TrafficScriptExecutor.py
+++ b/resources/libraries/python/TrafficScriptExecutor.py
@@ -51,6 +51,7 @@ class TrafficScriptExecutor(object):
:raises RuntimeError: ICMP echo Rx timeout.
:raises RuntimeError: DHCP REQUEST Rx timeout.
:raises RuntimeError: TCP/UDP Rx timeout.
+ :raises RuntimeError: ARP reply timeout.
:raises RuntimeError: Traffic script execution failed.
"""
logger.trace("{}".format(timeout))
@@ -75,6 +76,8 @@ class TrafficScriptExecutor(object):
raise RuntimeError("DHCP REQUEST Rx timeout")
elif "RuntimeError: TCP/UDP Rx timeout" in stderr:
raise RuntimeError("TCP/UDP Rx timeout")
+ elif "Error occurred: ARP reply timeout" in stdout:
+ raise RuntimeError("ARP reply timeout")
else:
raise RuntimeError("Traffic script execution failed")
diff --git a/resources/libraries/robot/traffic.robot b/resources/libraries/robot/traffic.robot
index 90f7ab2805..e468700fc8 100644
--- a/resources/libraries/robot/traffic.robot
+++ b/resources/libraries/robot/traffic.robot
@@ -273,3 +273,79 @@
| | ${rx_port_name}= | Get interface name | ${node} | ${rx_port}
| | ${args}= | Catenate | --rx_if | ${rx_port_name} | --src_mac | ${src_mac}
| | Run Traffic Script On Node | check_ra_packet.py | ${node} | ${args}
+
+| Send ARP Request
+| | [Documentation] | Send ARP Request and check if the ARP Response is received.
+| | ...
+| | ... | *Arguments:*
+| | ...
+| | ... | _NOTE:_ Arguments are based on topology:
+| | ... | 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
+| | ... | - src_mac - Source MAC address of ARP packet (TG-if1).
+| | ... | Type: string
+| | ... | - tgt_mac - Target MAC address which is expected in the response
+| | ... | (DUT-if1). Type: string
+| | ... | - src_ip - Source IP address of ARP packet (TG-if1).
+| | ... | Type: string
+| | ... | - tgt_ip - Target IP address of ARP packet (DUT-if1).
+| | ... | Type: string
+| | ...
+| | ... | *Return:*
+| | ... | - No value returned
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Send ARP Request \| ${nodes['TG']} \| eth3 \
+| | ... | \| 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}
+| | Run Traffic Script On Node | arp_request.py | ${tg_node} | ${args}
+
+| Send ARP Request should failed
+| | [Documentation] | Send ARP Request and
+| | ... | the ARP Response should not be received.
+| | ...
+| | ... | *Arguments:*
+| | ...
+| | ... | _NOTE:_ Arguments are based on topology:
+| | ... | 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
+| | ... | - src_mac - Source MAC address of ARP packet (TG-if1).
+| | ... | Type: string
+| | ... | - tgt_mac - Target MAC address which is expected in the response
+| | ... | (DUT-if1). Type: string
+| | ... | - src_ip - Source IP address of ARP packet (TG-if1).
+| | ... | Type: string
+| | ... | - tgt_ip - Target IP address of ARP packet (DUT-if1).
+| | ... | Type: string
+| | ...
+| | ... | *Return:*
+| | ... | - No value returned
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Send ARP Request should failed \| ${nodes['TG']} \| eth3 \
+| | ... | \| 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}
+| | Run Keyword And Expect Error | ARP reply timeout
+| | ... | Run Traffic Script On Node | arp_request.py | ${tg_node} | ${args}
diff --git a/resources/templates/vat/add_proxy_arp.vat b/resources/templates/vat/add_proxy_arp.vat
new file mode 100644
index 0000000000..42dd3992bb
--- /dev/null
+++ b/resources/templates/vat/add_proxy_arp.vat
@@ -0,0 +1 @@
+proxy_arp_add_del {lo_ip4_addr} - {hi_ip4_addr} \ No newline at end of file
diff --git a/resources/templates/vat/proxy_arp_intfc_enable.vat b/resources/templates/vat/proxy_arp_intfc_enable.vat
new file mode 100644
index 0000000000..e4d2313b70
--- /dev/null
+++ b/resources/templates/vat/proxy_arp_intfc_enable.vat
@@ -0,0 +1 @@
+proxy_arp_intfc_enable_disable sw_if_index {sw_if_index} enable \ No newline at end of file
diff --git a/resources/traffic_scripts/arp_request.py b/resources/traffic_scripts/arp_request.py
index 94d5deabe7..8c5b9c7c47 100755
--- a/resources/traffic_scripts/arp_request.py
+++ b/resources/traffic_scripts/arp_request.py
@@ -47,6 +47,7 @@ def arp_request_test():
"""Send ARP request, expect a reply and verify its fields.
returns: test status
+ :raises RuntimeError: ARP reply timeout.
"""
test_passed = False
(src_if, src_mac, dst_mac, src_ip, dst_ip) = parse_arguments()
@@ -65,6 +66,9 @@ def arp_request_test():
# wait for APR reply
ether = interface.recv_pkt()
+ if not ether:
+ raise RuntimeError("ARP reply timeout")
+
# verify received packet
if not ether.haslayer(ARP):