aboutsummaryrefslogtreecommitdiffstats
path: root/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpproxy-func.robot
diff options
context:
space:
mode:
Diffstat (limited to 'tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpproxy-func.robot')
-rw-r--r--tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpproxy-func.robot93
1 files changed, 93 insertions, 0 deletions
diff --git a/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpproxy-func.robot b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpproxy-func.robot
new file mode 100644
index 0000000000..9df4174ba9
--- /dev/null
+++ b/tests/vpp/func/ip4/eth2p-ethip4-ip4base-ip4dhcpproxy-func.robot
@@ -0,0 +1,93 @@
+# 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.
+
+*** Settings ***
+| Resource | resources/libraries/robot/shared/default.robot
+| Resource | resources/libraries/robot/shared/testing_path.robot
+| Resource | resources/libraries/robot/features/dhcp_proxy.robot
+| Resource | resources/libraries/robot/ip/ip4.robot
+| Library | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV | 3_NODE_DOUBLE_LINK_TOPO | SKIP_VPP_PATCH
+| Test Setup | Set up functional test
+| Test Teardown | Tear down functional test
+| Documentation | *DHCPv4 proxy test cases*
+| ...
+| ... | *[Top] Network Topologies:* TG = DUT
+| ... | with two links between the nodes.
+| ... | *[Enc] Packet Encapsulations:* Eth-IPv4-UDP-BOOTP-DHCP
+| ... | *[Cfg] DUT configuration:* DUT is configured with DHCPv4 proxy.
+| ... | *[Ver] TG verification:* Test DHCPv4 packets are sent
+| ... | on TG on first link to DUT and received on TG on second link.
+| ... | On receive TG verifies if DHCPv4 packets are valid.
+
+*** Variables ***
+| ${dut_to_tg_if1_ip}= | 172.16.0.1
+| ${dut_to_tg_if2_ip}= | 192.168.0.1
+| ${dhcp_server_ip}= | 192.168.0.100
+| ${client_ip}= | 172.16.0.2
+| ${prefix_length}= | 24
+
+| ${discover_src_ip}= | 0.0.0.0
+| ${valid_discover_dst_ip}= | 255.255.255.255
+| ${invalid_discover_dst_ip}= | 255.255.255.1
+
+*** Test Cases ***
+| TC01: VPP proxies valid DHCPv4 request to DHCPv4 server
+| | [Documentation] |
+| | ... | [Top] TG=DUT \
+| | ... | [Enc] Eth-IPv4-UDP-BOOTP-DHCP
+| | ... | [Cfg] On DUT setup DHCPv4 proxy.
+| | ... | [Ver] Make TG verify matching DHCPv4 packets between client and DHCPv4
+| | ... | server through DHCP proxy.
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And VPP Route Add | ${dut_node} | 255.255.255.255 | 32 | ${NONE} | local
+| | ... | ${FALSE} | ${NONE}
+| | And Set Interface Address | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if2} | ${dhcp_server_ip}
+| | ... | ${tg_to_dut_if2_mac}
+| | When DHCP Proxy Config | ${dut_node} | ${dhcp_server_ip}
+| | ... | ${dut_to_tg_if1_ip}
+| | Then Send DHCP messages and check answer | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${dhcp_server_ip} | ${tg_to_dut_if2_mac}
+| | ... | ${client_ip} | ${tg_to_dut_if1_mac} | ${dut_to_tg_if1_ip}
+
+| TC02: VPP proxy ignores invalid DHCPv4 request
+| | [Documentation] |
+| | ... | [Top] TG=DUT \
+| | ... | [Enc] Eth-IPv4-UDP-BOOTP-DHCP
+| | ... | [Cfg] On DUT setup DHCPv4 proxy.
+| | ... | [Ver] Make TG verify matching invalid DHCPv4 packets are dropped.
+| | ...
+| | Given Configure path in 2-node circular topology
+| | ... | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | And Set interfaces in 2-node circular topology up
+| | And VPP Route Add | ${dut_node} | 255.255.255.255 | 32 | ${NONE} | local
+| | ... | ${FALSE} | ${NONE}
+| | And Set Interface Address | ${dut_node}
+| | ... | ${dut_to_tg_if1} | ${dut_to_tg_if1_ip} | ${prefix_length}
+| | And Set Interface Address | ${dut_node}
+| | ... | ${dut_to_tg_if2} | ${dut_to_tg_if2_ip} | ${prefix_length}
+| | And Add Arp On Dut | ${dut_node} | ${dut_to_tg_if2} | ${dhcp_server_ip}
+| | ... | ${tg_to_dut_if2_mac}
+| | When DHCP Proxy Config | ${dut_node} | ${dhcp_server_ip}
+| | ... | ${dut_to_tg_if1_ip}
+| | Then Send DHCP DISCOVER and check answer | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${discover_src_ip} | ${valid_discover_dst_ip}
+| | And DHCP DISCOVER should fail | ${tg_node} | ${tg_to_dut_if1}
+| | ... | ${tg_to_dut_if2} | ${discover_src_ip} | ${invalid_discover_dst_ip}
(), this); } void ip_unnumbered::sweep() { if (m_config) { HW::enqueue( new unconfig_cmd(m_config, m_itf->handle(), m_l3_itf->handle())); } HW::write(); } void ip_unnumbered::dump(std::ostream& os) { m_db.dump(os); } void ip_unnumbered::replay() { if (m_config) { HW::enqueue(new config_cmd(m_config, m_itf->handle(), m_l3_itf->handle())); } } std::string ip_unnumbered::to_string() const { std::ostringstream s; s << "IP Unnumbered-config:" << " itf:" << m_itf->to_string() << " l3-itf:" << m_l3_itf->to_string(); return (s.str()); } void ip_unnumbered::update(const ip_unnumbered& desired) { if (!m_config) { HW::enqueue(new config_cmd(m_config, m_itf->handle(), m_l3_itf->handle())); } } std::shared_ptr<ip_unnumbered> ip_unnumbered::find_or_add(const ip_unnumbered& temp) { return (m_db.find_or_add(temp.m_itf->key(), temp)); } std::shared_ptr<ip_unnumbered> ip_unnumbered::singular() const { return find_or_add(*this); } ip_unnumbered::event_handler::event_handler() { OM::register_listener(this); inspect::register_handler({ "ip-un" }, "IP unnumbered configurations", this); } void ip_unnumbered::event_handler::handle_replay() { m_db.replay(); } void ip_unnumbered::event_handler::handle_populate(const client_db::key_t& key) { // VPP provides no dump for IP unnumbered } dependency_t ip_unnumbered::event_handler::order() const { return (dependency_t::BINDING); } void ip_unnumbered::event_handler::show(std::ostream& os) { m_db.dump(os); } } /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "mozilla") * End: */