X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Fext%2Fvom_test.cpp;h=3374259cd609ff144df232bcee191d4ac2293cc6;hb=762d83c198c6c24cce4eb94a6d027f520d0b8383;hp=4c72fbc1aaa453fe73f28385d458983d5676ff6e;hpb=812ed39f9da336310e815c361ab5a9f118657d94;p=vpp.git diff --git a/test/ext/vom_test.cpp b/test/ext/vom_test.cpp index 4c72fbc1aaa..3374259cd60 100644 --- a/test/ext/vom_test.cpp +++ b/test/ext/vom_test.cpp @@ -19,28 +19,58 @@ #include "vom/om.hpp" #include "vom/interface.hpp" +#include "vom/interface_cmds.hpp" +#include "vom/bond_interface_cmds.hpp" +#include "vom/bond_group_binding.hpp" +#include "vom/bond_group_binding_cmds.hpp" #include "vom/l2_binding.hpp" +#include "vom/l2_binding_cmds.hpp" +#include "vom/l2_xconnect.hpp" +#include "vom/l2_xconnect_cmds.hpp" #include "vom/l3_binding.hpp" +#include "vom/l3_binding_cmds.hpp" #include "vom/bridge_domain.hpp" #include "vom/bridge_domain_entry.hpp" #include "vom/bridge_domain_arp_entry.hpp" +#include "vom/bridge_domain_cmds.hpp" +#include "vom/bridge_domain_entry_cmds.hpp" +#include "vom/bridge_domain_arp_entry_cmds.hpp" #include "vom/prefix.hpp" #include "vom/route.hpp" +#include "vom/route_cmds.hpp" #include "vom/route_domain.hpp" +#include "vom/route_domain_cmds.hpp" #include "vom/vxlan_tunnel.hpp" +#include "vom/vxlan_tunnel_cmds.hpp" #include "vom/sub_interface.hpp" +#include "vom/sub_interface_cmds.hpp" +#include "vom/acl_ethertype.hpp" +#include "vom/acl_ethertype_cmds.hpp" #include "vom/acl_list.hpp" #include "vom/acl_binding.hpp" +#include "vom/acl_list_cmds.hpp" +#include "vom/acl_binding_cmds.hpp" #include "vom/acl_l3_rule.hpp" #include "vom/acl_l2_rule.hpp" #include "vom/arp_proxy_config.hpp" #include "vom/arp_proxy_binding.hpp" +#include "vom/arp_proxy_config_cmds.hpp" +#include "vom/arp_proxy_binding_cmds.hpp" +#include "vom/ip_punt_redirect.hpp" +#include "vom/ip_punt_redirect_cmds.hpp" #include "vom/ip_unnumbered.hpp" +#include "vom/ip_unnumbered_cmds.hpp" #include "vom/interface_ip6_nd.hpp" #include "vom/interface_span.hpp" +#include "vom/interface_span_cmds.hpp" #include "vom/neighbour.hpp" +#include "vom/neighbour_cmds.hpp" #include "vom/nat_static.hpp" +#include "vom/nat_static_cmds.hpp" #include "vom/nat_binding.hpp" +#include "vom/nat_binding_cmds.hpp" +#include "vom/pipe.hpp" +#include "vom/pipe_cmds.hpp" using namespace boost; using namespace VOM; @@ -61,10 +91,10 @@ public: class MockListener : public interface::event_listener, public interface::stat_listener { - void handle_interface_stat(interface::stats_cmd *cmd) + void handle_interface_stat(interface_cmds::stats_enable_cmd *cmd) { } - void handle_interface_event(interface::events_cmd *cmd) + void handle_interface_event(interface_cmds::events_cmd *cmd) { } }; @@ -145,177 +175,225 @@ public: throw ExpException(1); } - if (typeid(*f_exp) == typeid(interface::af_packet_create_cmd)) + if (typeid(*f_exp) == typeid(interface_cmds::af_packet_create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(interface::loopback_create_cmd)) + else if (typeid(*f_exp) == typeid(interface_cmds::loopback_create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(interface::loopback_delete_cmd)) + else if (typeid(*f_exp) == typeid(interface_cmds::vhost_create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(interface::af_packet_delete_cmd)) + else if (typeid(*f_exp) == typeid(bond_interface_cmds::create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(interface::state_change_cmd)) + else if (typeid(*f_exp) == typeid(interface_cmds::loopback_delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(interface::set_table_cmd)) + else if (typeid(*f_exp) == typeid(interface_cmds::af_packet_delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(interface::set_mac_cmd)) + else if (typeid(*f_exp) == typeid(interface_cmds::vhost_delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(interface::set_tag)) + else if (typeid(*f_exp) == typeid(bond_interface_cmds::delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(route_domain::create_cmd)) + else if (typeid(*f_exp) == typeid(interface_cmds::state_change_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(route_domain::delete_cmd)) + else if (typeid(*f_exp) == typeid(interface_cmds::set_table_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(route::ip_route::update_cmd)) + else if (typeid(*f_exp) == typeid(interface_cmds::set_mac_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(route::ip_route::delete_cmd)) + else if (typeid(*f_exp) == typeid(interface_cmds::set_tag)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(neighbour::create_cmd)) + else if (typeid(*f_exp) == typeid(bond_group_binding_cmds::bind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(neighbour::delete_cmd)) + else if (typeid(*f_exp) == typeid(bond_group_binding_cmds::unbind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(l3_binding::bind_cmd)) + else if (typeid(*f_exp) == typeid(route_domain_cmds::create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(l3_binding::unbind_cmd)) + else if (typeid(*f_exp) == typeid(route_domain_cmds::delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(bridge_domain::create_cmd)) + else if (typeid(*f_exp) == typeid(route::ip_route_cmds::update_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(bridge_domain::delete_cmd)) + else if (typeid(*f_exp) == typeid(route::ip_route_cmds::delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(bridge_domain_entry::create_cmd)) + else if (typeid(*f_exp) == typeid(neighbour_cmds::create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(bridge_domain_entry::delete_cmd)) + else if (typeid(*f_exp) == typeid(neighbour_cmds::delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(bridge_domain_arp_entry::create_cmd)) + else if (typeid(*f_exp) == typeid(l3_binding_cmds::bind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(bridge_domain_arp_entry::delete_cmd)) + else if (typeid(*f_exp) == typeid(l3_binding_cmds::unbind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(l2_binding::bind_cmd)) + else if (typeid(*f_exp) == typeid(bridge_domain_cmds::create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(l2_binding::unbind_cmd)) + else if (typeid(*f_exp) == typeid(bridge_domain_cmds::delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(l2_binding::set_vtr_op_cmd)) + else if (typeid(*f_exp) == typeid(bridge_domain_entry_cmds::create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(vxlan_tunnel::create_cmd)) + else if (typeid(*f_exp) == typeid(bridge_domain_entry_cmds::delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(vxlan_tunnel::delete_cmd)) + else if (typeid(*f_exp) == typeid(bridge_domain_arp_entry_cmds::create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(sub_interface::create_cmd)) + else if (typeid(*f_exp) == typeid(bridge_domain_arp_entry_cmds::delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(sub_interface::delete_cmd)) + else if (typeid(*f_exp) == typeid(l2_binding_cmds::bind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(ACL::l3_list::update_cmd)) + else if (typeid(*f_exp) == typeid(l2_binding_cmds::unbind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(ACL::l3_list::delete_cmd)) + else if (typeid(*f_exp) == typeid(l2_binding_cmds::set_vtr_op_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(ACL::l3_binding::bind_cmd)) + else if (typeid(*f_exp) == typeid(l2_xconnect_cmds::bind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(ACL::l3_binding::unbind_cmd)) + else if (typeid(*f_exp) == typeid(l2_xconnect_cmds::unbind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(ACL::l2_list::update_cmd)) + else if (typeid(*f_exp) == typeid(vxlan_tunnel_cmds::create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(ACL::l2_list::delete_cmd)) + else if (typeid(*f_exp) == typeid(vxlan_tunnel_cmds::delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(ACL::l2_binding::bind_cmd)) + else if (typeid(*f_exp) == typeid(sub_interface_cmds::create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(ACL::l2_binding::unbind_cmd)) + else if (typeid(*f_exp) == typeid(sub_interface_cmds::delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(arp_proxy_binding::bind_cmd)) + else if (typeid(*f_exp) == typeid(ACL::acl_ethertype_cmds::bind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(arp_proxy_binding::unbind_cmd)) + else if (typeid(*f_exp) == typeid(ACL::acl_ethertype_cmds::unbind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(arp_proxy_config::config_cmd)) + else if (typeid(*f_exp) == typeid(ACL::list_cmds::l3_update_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(arp_proxy_config::unconfig_cmd)) + else if (typeid(*f_exp) == typeid(ACL::list_cmds::l3_delete_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(ip_unnumbered::config_cmd)) + else if (typeid(*f_exp) == typeid(ACL::binding_cmds::l3_bind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(ip_unnumbered::unconfig_cmd)) + else if (typeid(*f_exp) == typeid(ACL::binding_cmds::l3_unbind_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(ACL::list_cmds::l2_update_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(ACL::list_cmds::l2_delete_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(ACL::binding_cmds::l2_bind_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(ACL::binding_cmds::l2_unbind_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(arp_proxy_binding_cmds::bind_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(arp_proxy_binding_cmds::unbind_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(arp_proxy_config_cmds::config_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(arp_proxy_config_cmds::unconfig_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(ip_punt_redirect_cmds::config_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(ip_punt_redirect_cmds::unconfig_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(ip_unnumbered_cmds::config_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(ip_unnumbered_cmds::unconfig_cmd)) + { + rc = handle_derived(f_exp, f_act); } else if (typeid(*f_exp) == typeid(ip6nd_ra_config::config_cmd)) { @@ -333,33 +411,41 @@ public: { rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(interface_span::config_cmd)) + else if (typeid(*f_exp) == typeid(interface_span_cmds::config_cmd)) + { + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(interface_span_cmds::unconfig_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(interface_span::unconfig_cmd)) + else if (typeid(*f_exp) == typeid(nat_static_cmds::create_44_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(nat_static::create_44_cmd)) + else if (typeid(*f_exp) == typeid(nat_static_cmds::delete_44_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(nat_static::delete_44_cmd)) + else if (typeid(*f_exp) == typeid(nat_binding_cmds::bind_44_input_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(nat_binding::bind_44_input_cmd)) + else if (typeid(*f_exp) == typeid(nat_binding_cmds::unbind_44_input_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(nat_binding::unbind_44_input_cmd)) + else if (typeid(*f_exp) == typeid(interface_cmds::events_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); } - else if (typeid(*f_exp) == typeid(interface::events_cmd)) + else if (typeid(*f_exp) == typeid(pipe_cmds::create_cmd)) { - rc = handle_derived(f_exp, f_act); + rc = handle_derived(f_exp, f_act); + } + else if (typeid(*f_exp) == typeid(pipe_cmds::delete_cmd)) + { + rc = handle_derived(f_exp, f_act); } else { @@ -453,7 +539,7 @@ public: } }; -BOOST_AUTO_TEST_SUITE(VppOM_test) +BOOST_AUTO_TEST_SUITE(vom) #define TRY_CHECK_RC(stmt) \ { \ @@ -504,16 +590,16 @@ BOOST_AUTO_TEST_CASE(test_interface) { * 2 is the interface handle VPP [mock] assigns */ HW::item hw_ifh(2, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(go, itf1)); HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); TRY_CHECK(OM::remove(go)); @@ -525,79 +611,99 @@ BOOST_AUTO_TEST_CASE(test_interface) { interface::type_t::AFPACKET, interface::admin_state_t::DOWN); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf1_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(go, itf1)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); TRY_CHECK_RC(OM::write(js, itf1b)); TRY_CHECK(OM::remove(go)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); TRY_CHECK(OM::remove(js)); /* * George adds an interface, then we flush all of Geroge's state */ - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf1_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(go, itf1)); TRY_CHECK(OM::mark(go)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); TRY_CHECK(OM::sweep(go)); /* * George adds an interface. mark stale. update the same interface. sweep * and expect no delete */ - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf1_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); TRY_CHECK_RC(OM::write(go, itf1b)); TRY_CHECK(OM::mark(go)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(go, itf1)); TRY_CHECK(OM::sweep(go)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); TRY_CHECK(OM::remove(go)); /* * George adds an insterface, then we mark that state. Add a second interface * an flush the first that is now stale. */ - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf1_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(go, itf1)); TRY_CHECK(OM::mark(go)); std::string itf2_name = "afpacket2"; + std::string itf2_tag = "uuid-of-afpacket2-interface"; interface itf2(itf2_name, interface::type_t::AFPACKET, - interface::admin_state_t::UP); + interface::admin_state_t::UP, + itf2_tag); HW::item hw_ifh2(3, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh2, itf2_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::set_tag(hw_ifh2, itf2_tag)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh2)); TRY_CHECK_RC(OM::write(go, itf2)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); TRY_CHECK(OM::sweep(go)); TRY_CHECK(OM::mark(go)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh2)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh2, itf2_name)); TRY_CHECK(OM::sweep(go)); + + + std::string itf3_name = "/PATH/TO/vhost_user1.sock"; + std::string itf3_tag = "uuid-of-vhost_user1-interface"; + interface itf3(itf3_name, + interface::type_t::VHOST, + interface::admin_state_t::UP, + itf3_tag); + HW::item hw_ifh3(4, rc_t::OK); + + ADD_EXPECT(interface_cmds::vhost_create_cmd(hw_ifh3, itf3_name, itf3_tag)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh3)); + TRY_CHECK_RC(OM::write(go, itf3)); + + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh3)); + ADD_EXPECT(interface_cmds::vhost_delete_cmd(hw_ifh3, itf3_name)); + TRY_CHECK(OM::remove(go)); } BOOST_AUTO_TEST_CASE(test_bvi) { @@ -624,15 +730,15 @@ BOOST_AUTO_TEST_CASE(test_bvi) { HW::item hw_ifh(4, rc_t::OK); HW::item hw_pfx_10(pfx_10, rc_t::OK); - ADD_EXPECT(interface::loopback_create_cmd(hw_ifh, bvi_name)); - ADD_EXPECT(interface::set_tag(hw_ifh, bvi_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::loopback_create_cmd(hw_ifh, bvi_name)); + ADD_EXPECT(interface_cmds::set_tag(hw_ifh, bvi_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(ernest, itf)); l3 = new l3_binding(itf, pfx_10); HW::item hw_l3_bind(true, rc_t::OK); HW::item hw_l3_unbind(false, rc_t::OK); - ADD_EXPECT(l3_binding::bind_cmd(hw_l3_bind, hw_ifh.data(), pfx_10)); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_bind, hw_ifh.data(), pfx_10)); TRY_CHECK_RC(OM::write(ernest, *l3)); // change the MAC address on the BVI @@ -642,7 +748,7 @@ BOOST_AUTO_TEST_CASE(test_bvi) { l2_address_t l2_addr({0,1,2,3,4,5}); HW::item hw_mac(l2_addr, rc_t::OK); itf_new_mac.set(l2_addr); - ADD_EXPECT(interface::set_mac_cmd(hw_mac, hw_ifh)); + ADD_EXPECT(interface_cmds::set_mac_cmd(hw_mac, hw_ifh)); TRY_CHECK_RC(OM::write(ernest, itf_new_mac)); // create/write the interface to the OM again but with an unset MAC @@ -656,13 +762,13 @@ BOOST_AUTO_TEST_CASE(test_bvi) { l2_address_t l2_addr2({0,1,2,3,4,6}); HW::item hw_mac2(l2_addr2, rc_t::OK); itf_new_mac2.set(l2_addr2); - ADD_EXPECT(interface::set_mac_cmd(hw_mac2, hw_ifh)); + ADD_EXPECT(interface_cmds::set_mac_cmd(hw_mac2, hw_ifh)); TRY_CHECK_RC(OM::write(ernest, itf_new_mac2)); delete l3; - ADD_EXPECT(l3_binding::unbind_cmd(hw_l3_unbind, hw_ifh.data(), pfx_10)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::loopback_delete_cmd(hw_ifh)); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_unbind, hw_ifh.data(), pfx_10)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::loopback_delete_cmd(hw_ifh)); TRY_CHECK(OM::remove(ernest)); /* @@ -677,8 +783,8 @@ BOOST_AUTO_TEST_CASE(test_bvi) { HW::item hw_rd4_unbind(route::DEFAULT_TABLE, rc_t::OK); HW::item hw_rd6_bind(1, rc_t::OK); HW::item hw_rd6_unbind(route::DEFAULT_TABLE, rc_t::OK); - ADD_EXPECT(route_domain::create_cmd(hw_rd4_create, l3_proto_t::IPV4, 1)); - ADD_EXPECT(route_domain::create_cmd(hw_rd6_create, l3_proto_t::IPV6, 1)); + ADD_EXPECT(route_domain_cmds::create_cmd(hw_rd4_create, l3_proto_t::IPV4, 1)); + ADD_EXPECT(route_domain_cmds::create_cmd(hw_rd6_create, l3_proto_t::IPV6, 1)); TRY_CHECK_RC(OM::write(graham, rd)); const std::string bvi2_name = "bvi2"; @@ -688,35 +794,110 @@ BOOST_AUTO_TEST_CASE(test_bvi) { rd); HW::item hw_ifh2(5, rc_t::OK); - ADD_EXPECT(interface::loopback_create_cmd(hw_ifh2, bvi2_name)); - ADD_EXPECT(interface::set_tag(hw_ifh2, bvi2_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh2)); - ADD_EXPECT(interface::set_table_cmd(hw_rd4_bind, l3_proto_t::IPV4, hw_ifh2)); - ADD_EXPECT(interface::set_table_cmd(hw_rd6_bind, l3_proto_t::IPV6, hw_ifh2)); + ADD_EXPECT(interface_cmds::loopback_create_cmd(hw_ifh2, bvi2_name)); + ADD_EXPECT(interface_cmds::set_tag(hw_ifh2, bvi2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh2)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd4_bind, l3_proto_t::IPV4, hw_ifh2)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd6_bind, l3_proto_t::IPV6, hw_ifh2)); TRY_CHECK_RC(OM::write(graham, *itf2)); l3 = new l3_binding(*itf2, pfx_10); - ADD_EXPECT(l3_binding::bind_cmd(hw_l3_bind, hw_ifh2.data(), pfx_10)); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_bind, hw_ifh2.data(), pfx_10)); TRY_CHECK_RC(OM::write(graham, *l3)); delete l3; delete itf2; - ADD_EXPECT(l3_binding::unbind_cmd(hw_l3_unbind, hw_ifh2.data(), pfx_10)); - ADD_EXPECT(interface::set_table_cmd(hw_rd4_unbind, l3_proto_t::IPV4, hw_ifh2)); - ADD_EXPECT(interface::set_table_cmd(hw_rd6_unbind, l3_proto_t::IPV6, hw_ifh2)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh2)); - ADD_EXPECT(interface::loopback_delete_cmd(hw_ifh2)); - ADD_EXPECT(route_domain::delete_cmd(hw_rd4_delete, l3_proto_t::IPV4, 1)); - ADD_EXPECT(route_domain::delete_cmd(hw_rd6_delete, l3_proto_t::IPV6, 1)); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_unbind, hw_ifh2.data(), pfx_10)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd4_unbind, l3_proto_t::IPV4, hw_ifh2)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd6_unbind, l3_proto_t::IPV6, hw_ifh2)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh2)); + ADD_EXPECT(interface_cmds::loopback_delete_cmd(hw_ifh2)); + ADD_EXPECT(route_domain_cmds::delete_cmd(hw_rd4_delete, l3_proto_t::IPV4, 1)); + ADD_EXPECT(route_domain_cmds::delete_cmd(hw_rd6_delete, l3_proto_t::IPV6, 1)); TRY_CHECK(OM::remove(graham)); } +BOOST_AUTO_TEST_CASE(test_bond) { + VppInit vi; + const std::string cb = "CarolBerg"; + rc_t rc = rc_t::OK; + + /* + * creates the interfaces + */ + std::string itf1_name = "afpacket1"; + interface itf1(itf1_name, + interface::type_t::AFPACKET, + interface::admin_state_t::UP); + + HW::item hw_ifh(2, rc_t::OK); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + + HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); + + TRY_CHECK_RC(OM::write(cb, itf1)); + + std::string itf2_name = "afpacket2"; + interface itf2(itf2_name, + interface::type_t::AFPACKET, + interface::admin_state_t::UP); + + + HW::item hw_ifh2(4, rc_t::OK); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh2)); + + TRY_CHECK_RC(OM::write(cb, itf2)); + + std::string bond_name = "bond"; + bond_interface bond_itf(bond_name, interface::admin_state_t::UP, + bond_interface::mode_t::LACP); + + HW::item hw_ifh3(6, rc_t::OK); + ADD_EXPECT(bond_interface_cmds::create_cmd(hw_ifh3, bond_name, + bond_interface::mode_t::LACP, bond_interface::lb_t::L2, l2_address_t::ZERO)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh3)); + + TRY_CHECK_RC(OM::write(cb, bond_itf)); + + bond_member *bm1 = new bond_member(itf1, bond_member::mode_t::ACTIVE, + bond_member::rate_t::SLOW); + bond_member *bm2 = new bond_member(itf2, bond_member::mode_t::ACTIVE, + bond_member::rate_t::SLOW); + bond_group_binding *bgb = new bond_group_binding(bond_itf, {*bm1, *bm2}); + + HW::item bond_hw_bind(true, rc_t::OK); + ADD_EXPECT(bond_group_binding_cmds::bind_cmd(bond_hw_bind, hw_ifh3.data(), *bm1)); + ADD_EXPECT(bond_group_binding_cmds::bind_cmd(bond_hw_bind, hw_ifh3.data(), *bm2)); + + TRY_CHECK_RC(OM::write(cb, *bgb)); + + delete bgb; + delete bm2; + delete bm1; + + STRICT_ORDER_OFF(); + HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); + ADD_EXPECT(bond_group_binding_cmds::unbind_cmd(bond_hw_bind, hw_ifh.data())); + ADD_EXPECT(bond_group_binding_cmds::unbind_cmd(bond_hw_bind, hw_ifh2.data())); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh3)); + ADD_EXPECT(bond_interface_cmds::delete_cmd(hw_ifh3)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); + + TRY_CHECK(OM::remove(cb)); +} + BOOST_AUTO_TEST_CASE(test_bridge) { VppInit vi; const std::string franz = "FranzKafka"; const std::string dante = "Dante"; + const std::string jkr = "jkrowling"; rc_t rc = rc_t::OK; /* @@ -732,8 +913,8 @@ BOOST_AUTO_TEST_CASE(test_bridge) { HW::item hw_ifh(3, rc_t::OK); HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf1_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(franz, itf1)); @@ -741,7 +922,11 @@ BOOST_AUTO_TEST_CASE(test_bridge) { bridge_domain bd1(33); HW::item hw_bd(33, rc_t::OK); - ADD_EXPECT(bridge_domain::create_cmd(hw_bd)); + ADD_EXPECT(bridge_domain_cmds::create_cmd(hw_bd, + bridge_domain::learning_mode_t::ON, + bridge_domain::arp_term_mode_t::ON, + bridge_domain::flood_mode_t::ON, + bridge_domain::mac_age_mode_t::OFF)); TRY_CHECK_RC(OM::write(franz, bd1)); @@ -751,7 +936,10 @@ BOOST_AUTO_TEST_CASE(test_bridge) { l2_binding *l2itf = new l2_binding(itf1, bd1); HW::item hw_l2_bind(true, rc_t::OK); - ADD_EXPECT(l2_binding::bind_cmd(hw_l2_bind, hw_ifh.data(), hw_bd.data(), false)); + ADD_EXPECT(l2_binding_cmds::bind_cmd(hw_l2_bind, + hw_ifh.data(), + hw_bd.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_NORMAL)); TRY_CHECK_RC(OM::write(franz, *l2itf)); /* @@ -763,8 +951,8 @@ BOOST_AUTO_TEST_CASE(test_bridge) { interface::admin_state_t::UP); HW::item hw_ifh2(4, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh2, itf2_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh2)); TRY_CHECK_RC(OM::write(dante, itf2)); // BD add is a no-op since it exists @@ -774,32 +962,39 @@ BOOST_AUTO_TEST_CASE(test_bridge) { HW::item hw_set_vtr(l2_binding::l2_vtr_op_t::L2_VTR_POP_1, rc_t::OK); l2itf2->set(l2_binding::l2_vtr_op_t::L2_VTR_POP_1, 68); - ADD_EXPECT(l2_binding::bind_cmd(hw_l2_bind, hw_ifh2.data(), hw_bd.data(), false)); - ADD_EXPECT(l2_binding::set_vtr_op_cmd(hw_set_vtr, hw_ifh2.data(), 68)); + ADD_EXPECT(l2_binding_cmds::bind_cmd(hw_l2_bind, + hw_ifh2.data(), + hw_bd.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_NORMAL)); + ADD_EXPECT(l2_binding_cmds::set_vtr_op_cmd(hw_set_vtr, hw_ifh2.data(), 68)); TRY_CHECK_RC(OM::write(dante, *l2itf2)); // Add some static entries to the bridge-domain HW::item hw_be1(true, rc_t::OK); mac_address_t mac1({0,1,2,3,4,5}); bridge_domain_entry *be1 = new bridge_domain_entry(bd1, mac1, itf2); - ADD_EXPECT(bridge_domain_entry::create_cmd(hw_be1, mac1, bd1.id(), hw_ifh2.data())); + ADD_EXPECT(bridge_domain_entry_cmds::create_cmd(hw_be1, mac1, bd1.id(), hw_ifh2.data(), + false)); TRY_CHECK_RC(OM::write(dante, *be1)); // Add some entries to the bridge-domain ARP termination table HW::item hw_bea1(true, rc_t::OK); boost::asio::ip::address ip1 = boost::asio::ip::address::from_string("10.10.10.10"); - bridge_domain_arp_entry *bea1 = new bridge_domain_arp_entry(bd1, mac1, ip1); - ADD_EXPECT(bridge_domain_arp_entry::create_cmd(hw_be1, bd1.id(), mac1, ip1)); + bridge_domain_arp_entry *bea1 = new bridge_domain_arp_entry(bd1, ip1, mac1); + ADD_EXPECT(bridge_domain_arp_entry_cmds::create_cmd(hw_be1, bd1.id(), mac1, ip1)); TRY_CHECK_RC(OM::write(dante, *bea1)); // flush Franz's state delete l2itf; HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); - ADD_EXPECT(l2_binding::unbind_cmd(hw_l2_bind, hw_ifh.data(), hw_bd.data(), false)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(l2_binding_cmds::unbind_cmd(hw_l2_bind, + hw_ifh.data(), + hw_bd.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_NORMAL)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); TRY_CHECK(OM::remove(franz)); // flush Dante's state - the order the interface and BD are deleted @@ -808,13 +1003,120 @@ BOOST_AUTO_TEST_CASE(test_bridge) { delete be1; delete bea1; STRICT_ORDER_OFF(); - ADD_EXPECT(l2_binding::unbind_cmd(hw_l2_bind, hw_ifh2.data(), hw_bd.data(), false)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh2)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh2, itf2_name)); - ADD_EXPECT(bridge_domain_entry::delete_cmd(hw_be1, mac1, bd1.id())); - ADD_EXPECT(bridge_domain_arp_entry::delete_cmd(hw_be1, bd1.id(), mac1, ip1)); - ADD_EXPECT(bridge_domain::delete_cmd(hw_bd)); + ADD_EXPECT(bridge_domain_arp_entry_cmds::delete_cmd(hw_be1, bd1.id(), mac1, ip1)); + ADD_EXPECT(bridge_domain_entry_cmds::delete_cmd(hw_be1, mac1, bd1.id(), false)); + ADD_EXPECT(l2_binding_cmds::unbind_cmd(hw_l2_bind, + hw_ifh2.data(), + hw_bd.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_NORMAL)); + + ADD_EXPECT(bridge_domain_cmds::delete_cmd(hw_bd)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh2, itf2_name)); TRY_CHECK(OM::remove(dante)); + + // test the BVI entry in l2fib + bridge_domain bd2(99); + + HW::item hw_bd2(99, rc_t::OK); + ADD_EXPECT(bridge_domain_cmds::create_cmd(hw_bd2, + bridge_domain::learning_mode_t::ON, + bridge_domain::arp_term_mode_t::ON, + bridge_domain::flood_mode_t::ON, + bridge_domain::mac_age_mode_t::OFF)); + + TRY_CHECK_RC(OM::write(jkr, bd2)); + + std::string itf3_name = "bvi"; + interface itf3(itf3_name, + interface::type_t::BVI, + interface::admin_state_t::UP); + + HW::item hw_ifh3(5, rc_t::OK); + ADD_EXPECT(interface_cmds::loopback_create_cmd(hw_ifh3, itf3_name)); + ADD_EXPECT(interface_cmds::set_tag(hw_ifh3, itf3_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh3)); + TRY_CHECK_RC(OM::write(jkr, itf3)); + + l2_binding *l2itf3 = new l2_binding(itf3, bd2); + ADD_EXPECT(l2_binding_cmds::bind_cmd(hw_l2_bind, + hw_ifh3.data(), + hw_bd2.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_BVI)); + TRY_CHECK_RC(OM::write(jkr, *l2itf3)); + + HW::item hw_be2(true, rc_t::OK); + mac_address_t mac2({0,1,2,3,4,5}); + bridge_domain_entry *be2 = new bridge_domain_entry(bd2, mac2, itf3); + ADD_EXPECT(bridge_domain_entry_cmds::create_cmd(hw_be2, mac2, bd2.id(), hw_ifh3.data(), true)); + TRY_CHECK_RC(OM::write(jkr, *be2)); + + delete l2itf3; + delete be2; + STRICT_ORDER_OFF(); + ADD_EXPECT(l2_binding_cmds::unbind_cmd(hw_l2_bind, + hw_ifh3.data(), + hw_bd2.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_BVI)); + ADD_EXPECT(bridge_domain_entry_cmds::delete_cmd(hw_be2, mac2, bd2.id(), true)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh3)); + ADD_EXPECT(interface_cmds::loopback_delete_cmd(hw_ifh3)); + ADD_EXPECT(bridge_domain_cmds::delete_cmd(hw_bd2)); + TRY_CHECK(OM::remove(jkr)); +} + +BOOST_AUTO_TEST_CASE(test_l2_xconnect) { + VppInit vi; + const std::string nicholas = "NicholasAbercrombie"; + rc_t rc = rc_t::OK; + + /* + * Interface 1 + */ + std::string itf1_name = "host1"; + interface itf1(itf1_name, + interface::type_t::AFPACKET, + interface::admin_state_t::UP); + HW::item hw_ifh(2, rc_t::OK); + HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); + TRY_CHECK_RC(OM::write(nicholas, itf1)); + + /* + * Interface 2 + */ + std::string itf2_name = "host2"; + interface itf2(itf2_name, + interface::type_t::AFPACKET, + interface::admin_state_t::UP); + + HW::item hw_ifh2(4, rc_t::OK); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh2)); + TRY_CHECK_RC(OM::write(nicholas, itf2)); + + l2_xconnect *l2_xconn = new l2_xconnect(itf1, itf2); + HW::item xconnect_east(true, rc_t::OK); + HW::item xconnect_west(true, rc_t::OK); + HW::item xconnect_east_unbind(false, rc_t::OK); + HW::item xconnect_west_unbind(false, rc_t::OK); + ADD_EXPECT(l2_xconnect_cmds::bind_cmd(xconnect_east, hw_ifh.data(), hw_ifh2.data())); + ADD_EXPECT(l2_xconnect_cmds::bind_cmd(xconnect_west, hw_ifh2.data(), hw_ifh.data())); + TRY_CHECK_RC(OM::write(nicholas, *l2_xconn)); + + delete l2_xconn; + + HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); + STRICT_ORDER_OFF(); + ADD_EXPECT(l2_xconnect_cmds::unbind_cmd(xconnect_east_unbind, hw_ifh.data(), hw_ifh2.data())); + ADD_EXPECT(l2_xconnect_cmds::unbind_cmd(xconnect_west_unbind, hw_ifh2.data(), hw_ifh.data())); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); + + TRY_CHECK(OM::remove(nicholas)); } BOOST_AUTO_TEST_CASE(test_vxlan) { @@ -828,21 +1130,28 @@ BOOST_AUTO_TEST_CASE(test_vxlan) { // VXLAN create vxlan_tunnel::endpoint_t ep(boost::asio::ip::address::from_string("10.10.10.10"), - boost::asio::ip::address::from_string("10.10.10.11"), - 322); + boost::asio::ip::address::from_string("10.10.10.11"), + 322); vxlan_tunnel vxt(ep.src, ep.dst, ep.vni); HW::item hw_vxt(3, rc_t::OK); - ADD_EXPECT(vxlan_tunnel::create_cmd(hw_vxt, "don't-care", ep)); + ADD_EXPECT(vxlan_tunnel_cmds::create_cmd(hw_vxt, "don't-care", ep)); TRY_CHECK_RC(OM::write(franz, vxt)); // bridge-domain create - bridge_domain bd1(33); + bridge_domain bd1(33, bridge_domain::learning_mode_t::OFF, + bridge_domain::arp_term_mode_t::OFF, + bridge_domain::flood_mode_t::OFF, + bridge_domain::mac_age_mode_t::ON); HW::item hw_bd(33, rc_t::OK); - ADD_EXPECT(bridge_domain::create_cmd(hw_bd)); + ADD_EXPECT(bridge_domain_cmds::create_cmd(hw_bd, + bridge_domain::learning_mode_t::OFF, + bridge_domain::arp_term_mode_t::OFF, + bridge_domain::flood_mode_t::OFF, + bridge_domain::mac_age_mode_t::ON)); TRY_CHECK_RC(OM::write(franz, bd1)); @@ -852,16 +1161,22 @@ BOOST_AUTO_TEST_CASE(test_vxlan) { l2_binding *l2itf = new l2_binding(vxt, bd1); HW::item hw_l2_bind(true, rc_t::OK); - ADD_EXPECT(l2_binding::bind_cmd(hw_l2_bind, hw_vxt.data(), hw_bd.data(), false)); + ADD_EXPECT(l2_binding_cmds::bind_cmd(hw_l2_bind, + hw_vxt.data(), + hw_bd.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_NORMAL)); TRY_CHECK_RC(OM::write(franz, *l2itf)); // flush Franz's state delete l2itf; HW::item hw_vxtdel(3, rc_t::NOOP); STRICT_ORDER_OFF(); - ADD_EXPECT(l2_binding::unbind_cmd(hw_l2_bind, hw_vxt.data(), hw_bd.data(), false)); - ADD_EXPECT(bridge_domain::delete_cmd(hw_bd)); - ADD_EXPECT(vxlan_tunnel::delete_cmd(hw_vxtdel, ep)); + ADD_EXPECT(l2_binding_cmds::unbind_cmd(hw_l2_bind, + hw_vxt.data(), + hw_bd.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_NORMAL)); + ADD_EXPECT(bridge_domain_cmds::delete_cmd(hw_bd)); + ADD_EXPECT(vxlan_tunnel_cmds::delete_cmd(hw_vxtdel, ep)); TRY_CHECK(OM::remove(franz)); } @@ -876,10 +1191,10 @@ BOOST_AUTO_TEST_CASE(test_vlan) { interface::admin_state_t::UP); HW::item hw_ifh(2, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(noam, itf1)); @@ -888,18 +1203,18 @@ BOOST_AUTO_TEST_CASE(test_vlan) { 33); HW::item hw_vl33(3, rc_t::OK); - ADD_EXPECT(sub_interface::create_cmd(hw_vl33, itf1_name+".33", hw_ifh.data(), 33)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_vl33)); + ADD_EXPECT(sub_interface_cmds::create_cmd(hw_vl33, itf1_name+".33", hw_ifh.data(), 33)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_vl33)); TRY_CHECK_RC(OM::write(noam, *vl33)); delete vl33; HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); HW::item hw_vl33_down(3, rc_t::NOOP); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_vl33)); - ADD_EXPECT(sub_interface::delete_cmd(hw_vl33_down)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_vl33)); + ADD_EXPECT(sub_interface_cmds::delete_cmd(hw_vl33_down)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); TRY_CHECK(OM::remove(noam)); } @@ -919,10 +1234,19 @@ BOOST_AUTO_TEST_CASE(test_acl) { interface::admin_state_t::UP); HW::item hw_ifh(2, rc_t::OK); HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf1_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(fyodor, itf1)); + ACL::ethertype_rule_t e1(ethertype_t::ARP, direction_t::INPUT); + ACL::ethertype_rule_t e2(ethertype_t::ARP, direction_t::OUTPUT); + ACL::ethertype_rule_t e3(ethertype_t::IPV4, direction_t::INPUT); + ACL::acl_ethertype::ethertype_rules_t l_e = {e1, e2, e3}; + ACL::acl_ethertype *a_e = new ACL::acl_ethertype(itf1, l_e); + HW::item ae_binding(true, rc_t::OK); + ADD_EXPECT(ACL::acl_ethertype_cmds::bind_cmd(ae_binding, hw_ifh.data(), l_e)); + TRY_CHECK_RC(OM::write(fyodor, *a_e)); + route::prefix_t src("10.10.10.10", 32); ACL::l3_rule r1(10, ACL::action_t::PERMIT, src, route::prefix_t::ZERO); ACL::l3_rule r2(20, ACL::action_t::DENY, route::prefix_t::ZERO, route::prefix_t::ZERO); @@ -934,13 +1258,20 @@ BOOST_AUTO_TEST_CASE(test_acl) { ACL::l3_list::rules_t rules = {r1, r2}; HW::item hw_acl(2, rc_t::OK); - ADD_EXPECT(ACL::l3_list::update_cmd(hw_acl, acl_name, rules)); + ADD_EXPECT(ACL::list_cmds::l3_update_cmd(hw_acl, acl_name, rules)); TRY_CHECK_RC(OM::write(fyodor, acl1)); + ACL::l3_rule r3(30, ACL::action_t::PERMIT, route::prefix_t::ZERO, route::prefix_t::ZERO); + ACL::l3_list acl2(acl_name); + acl2.insert(r3); + ACL::l3_list::rules_t rules2 = {r3}; + ADD_EXPECT(ACL::list_cmds::l3_update_cmd(hw_acl, acl_name, rules2)); + TRY_CHECK_RC(OM::write(fyodor, acl2)); + ACL::l3_binding *l3b = new ACL::l3_binding(direction_t::INPUT, itf1, acl1); HW::item hw_binding(true, rc_t::OK); - ADD_EXPECT(ACL::l3_binding::bind_cmd(hw_binding, direction_t::INPUT, - hw_ifh.data(), hw_acl.data())); + ADD_EXPECT(ACL::binding_cmds::l3_bind_cmd(hw_binding, direction_t::INPUT, + hw_ifh.data(), hw_acl.data())); TRY_CHECK_RC(OM::write(fyodor, *l3b)); /** @@ -961,30 +1292,32 @@ BOOST_AUTO_TEST_CASE(test_acl) { ACL::l2_list::rules_t l2_rules = {l2_r1, l2_r2}; HW::item l2_hw_acl(3, rc_t::OK); - ADD_EXPECT(ACL::l2_list::update_cmd(l2_hw_acl, l2_acl_name, l2_rules)); + ADD_EXPECT(ACL::list_cmds::l2_update_cmd(l2_hw_acl, l2_acl_name, l2_rules)); TRY_CHECK_RC(OM::write(leo, l2_acl)); ACL::l2_binding *l2b = new ACL::l2_binding(direction_t::OUTPUT, itf1, l2_acl); HW::item l2_hw_binding(true, rc_t::OK); - ADD_EXPECT(ACL::l2_binding::bind_cmd(l2_hw_binding, direction_t::OUTPUT, + ADD_EXPECT(ACL::binding_cmds::l2_bind_cmd(l2_hw_binding, direction_t::OUTPUT, hw_ifh.data(), l2_hw_acl.data())); TRY_CHECK_RC(OM::write(leo, *l2b)); delete l2b; - ADD_EXPECT(ACL::l2_binding::unbind_cmd(l2_hw_binding, direction_t::OUTPUT, - hw_ifh.data(), l2_hw_acl.data())); - ADD_EXPECT(ACL::l2_list::delete_cmd(l2_hw_acl)); + ADD_EXPECT(ACL::binding_cmds::l2_unbind_cmd(l2_hw_binding, direction_t::OUTPUT, + hw_ifh.data(), l2_hw_acl.data())); + ADD_EXPECT(ACL::list_cmds::l2_delete_cmd(l2_hw_acl)); TRY_CHECK(OM::remove(leo)); delete l3b; + delete a_e; HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); STRICT_ORDER_OFF(); - ADD_EXPECT(ACL::l3_binding::unbind_cmd(hw_binding, direction_t::INPUT, + ADD_EXPECT(ACL::binding_cmds::l3_unbind_cmd(hw_binding, direction_t::INPUT, hw_ifh.data(), hw_acl.data())); - ADD_EXPECT(ACL::l3_list::delete_cmd(hw_acl)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(ACL::list_cmds::l3_delete_cmd(hw_acl)); + ADD_EXPECT(ACL::acl_ethertype_cmds::unbind_cmd(ae_binding, hw_ifh.data())); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); TRY_CHECK(OM::remove(fyodor)); } @@ -999,7 +1332,7 @@ BOOST_AUTO_TEST_CASE(test_arp_proxy) { arp_proxy_config ap(low, high); HW::item hw_ap_cfg(true, rc_t::OK); - ADD_EXPECT(arp_proxy_config::config_cmd(hw_ap_cfg, low, high)); + ADD_EXPECT(arp_proxy_config_cmds::config_cmd(hw_ap_cfg, low, high)); TRY_CHECK_RC(OM::write(kurt, ap)); std::string itf3_name = "host3"; @@ -1008,13 +1341,13 @@ BOOST_AUTO_TEST_CASE(test_arp_proxy) { interface::admin_state_t::UP); HW::item hw_ifh(2, rc_t::OK); HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf3_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf3_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(kurt, itf3)); - arp_proxy_binding *apb = new arp_proxy_binding(itf3, ap); + arp_proxy_binding *apb = new arp_proxy_binding(itf3); HW::item hw_binding(true, rc_t::OK); - ADD_EXPECT(arp_proxy_binding::bind_cmd(hw_binding, hw_ifh.data())); + ADD_EXPECT(arp_proxy_binding_cmds::bind_cmd(hw_binding, hw_ifh.data())); TRY_CHECK_RC(OM::write(kurt, *apb)); delete apb; @@ -1022,14 +1355,66 @@ BOOST_AUTO_TEST_CASE(test_arp_proxy) { HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); STRICT_ORDER_OFF(); - ADD_EXPECT(arp_proxy_binding::unbind_cmd(hw_binding, hw_ifh.data())); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf3_name)); - ADD_EXPECT(arp_proxy_config::unconfig_cmd(hw_ap_cfg, low, high)); + ADD_EXPECT(arp_proxy_binding_cmds::unbind_cmd(hw_binding, hw_ifh.data())); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf3_name)); + ADD_EXPECT(arp_proxy_config_cmds::unconfig_cmd(hw_ap_cfg, low, high)); TRY_CHECK(OM::remove(kurt)); } +BOOST_AUTO_TEST_CASE(test_ip_punt_redirect) { + VppInit vi; + const std::string eliot = "EliotReed"; + rc_t rc = rc_t::OK; + + /* + * Interface 1 is the tx interface + */ + std::string itf1_name = "tx-itf"; + interface itf1(itf1_name, + interface::type_t::AFPACKET, + interface::admin_state_t::UP); + HW::item hw_ifh(2, rc_t::OK); + HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); + TRY_CHECK_RC(OM::write(eliot, itf1)); + + boost::asio::ip::address addr = boost::asio::ip::address::from_string("192.168.0.20"); + + /* + * Interface 2 is the rx interface + */ + std::string itf2_name = "rx-itf"; + interface itf2(itf2_name, + interface::type_t::AFPACKET, + interface::admin_state_t::UP); + + HW::item hw_ifh2(4, rc_t::OK); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh2)); + TRY_CHECK_RC(OM::write(eliot, itf2)); + + ip_punt_redirect *ip_punt = new ip_punt_redirect(itf2, itf1, addr); + HW::item hw_ip_cfg(true, rc_t::OK); + HW::item hw_ip_uncfg(false, rc_t::OK); + ADD_EXPECT(ip_punt_redirect_cmds::config_cmd(hw_ip_cfg, hw_ifh2.data(), hw_ifh.data(), addr)); + TRY_CHECK_RC(OM::write(eliot, *ip_punt)); + + delete ip_punt; + + HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); + STRICT_ORDER_OFF(); + ADD_EXPECT(ip_punt_redirect_cmds::unconfig_cmd(hw_ip_uncfg, hw_ifh2.data(), hw_ifh.data(), addr)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh2, itf2_name)); + + TRY_CHECK(OM::remove(eliot)); +} + BOOST_AUTO_TEST_CASE(test_ip_unnumbered) { VppInit vi; const std::string eric = "EricAmbler"; @@ -1044,15 +1429,15 @@ BOOST_AUTO_TEST_CASE(test_ip_unnumbered) { interface::admin_state_t::UP); HW::item hw_ifh(2, rc_t::OK); HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf1_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(eric, itf1)); route::prefix_t pfx_10("10.10.10.10", 24); l3_binding *l3 = new l3_binding(itf1, pfx_10); HW::item hw_l3_bind(true, rc_t::OK); HW::item hw_l3_unbind(false, rc_t::OK); - ADD_EXPECT(l3_binding::bind_cmd(hw_l3_bind, hw_ifh.data(), pfx_10)); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_bind, hw_ifh.data(), pfx_10)); TRY_CHECK_RC(OM::write(eric, *l3)); /* @@ -1064,14 +1449,14 @@ BOOST_AUTO_TEST_CASE(test_ip_unnumbered) { interface::admin_state_t::UP); HW::item hw_ifh2(4, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh2, itf2_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh2)); TRY_CHECK_RC(OM::write(eric, itf2)); ip_unnumbered *ipun = new ip_unnumbered(itf2, itf1); HW::item hw_ip_cfg(true, rc_t::OK); HW::item hw_ip_uncfg(false, rc_t::OK); - ADD_EXPECT(ip_unnumbered::config_cmd(hw_ip_cfg, hw_ifh2.data(), hw_ifh.data())); + ADD_EXPECT(ip_unnumbered_cmds::config_cmd(hw_ip_cfg, hw_ifh2.data(), hw_ifh.data())); TRY_CHECK_RC(OM::write(eric, *ipun)); delete l3; @@ -1079,12 +1464,12 @@ BOOST_AUTO_TEST_CASE(test_ip_unnumbered) { HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); STRICT_ORDER_OFF(); - ADD_EXPECT(ip_unnumbered::unconfig_cmd(hw_ip_uncfg, hw_ifh2.data(), hw_ifh.data())); - ADD_EXPECT(l3_binding::unbind_cmd(hw_l3_unbind, hw_ifh.data(), pfx_10)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh2)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh2, itf2_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(ip_unnumbered_cmds::unconfig_cmd(hw_ip_uncfg, hw_ifh2.data(), hw_ifh.data())); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_unbind, hw_ifh.data(), pfx_10)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); TRY_CHECK(OM::remove(eric)); } @@ -1103,15 +1488,15 @@ BOOST_AUTO_TEST_CASE(test_ip6nd) { interface::admin_state_t::UP); HW::item hw_ifh(3, rc_t::OK); HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(paulo, itf)); route::prefix_t pfx_10("fd8f:69d8:c12c:ca62::3", 128); l3_binding *l3 = new l3_binding(itf, pfx_10); HW::item hw_l3_bind(true, rc_t::OK); HW::item hw_l3_unbind(false, rc_t::OK); - ADD_EXPECT(l3_binding::bind_cmd(hw_l3_bind, hw_ifh.data(), pfx_10)); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_bind, hw_ifh.data(), pfx_10)); TRY_CHECK_RC(OM::write(paulo, *l3)); ra_config ra(0, 1, 0, 4); @@ -1142,9 +1527,9 @@ BOOST_AUTO_TEST_CASE(test_ip6nd) { STRICT_ORDER_OFF(); ADD_EXPECT(ip6nd_ra_config::unconfig_cmd(hw_ip6nd_ra_config_unconfig, hw_ifh.data(), ra)); - ADD_EXPECT(l3_binding::unbind_cmd(hw_l3_unbind, hw_ifh.data(), pfx_10)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf_name)); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_unbind, hw_ifh.data(), pfx_10)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf_name)); TRY_CHECK(OM::remove(paulo)); } @@ -1163,8 +1548,8 @@ BOOST_AUTO_TEST_CASE(test_interface_span) { interface::admin_state_t::UP); HW::item hw_ifh(2, rc_t::OK); HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf1_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(elif, itf1)); /* @@ -1178,14 +1563,14 @@ BOOST_AUTO_TEST_CASE(test_interface_span) { HW::item hw_ifh2(4, rc_t::OK); HW::item hw_as_up2(interface::admin_state_t::UP, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh2, itf2_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up2, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up2, hw_ifh2)); TRY_CHECK_RC(OM::write(elif, itf2)); interface_span *itf_span = new interface_span(itf1, itf2, interface_span::state_t::TX_RX_ENABLED); HW::item hw_is_cfg(true, rc_t::OK); HW::item hw_is_uncfg(true, rc_t::OK); - ADD_EXPECT(interface_span::config_cmd(hw_is_cfg, hw_ifh.data(), hw_ifh2.data(), interface_span::state_t::TX_RX_ENABLED)); + ADD_EXPECT(interface_span_cmds::config_cmd(hw_is_cfg, hw_ifh.data(), hw_ifh2.data(), interface_span::state_t::TX_RX_ENABLED)); TRY_CHECK_RC(OM::write(elif, *itf_span)); HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); @@ -1193,11 +1578,11 @@ BOOST_AUTO_TEST_CASE(test_interface_span) { delete itf_span; STRICT_ORDER_OFF(); - ADD_EXPECT(interface_span::unconfig_cmd(hw_is_uncfg, hw_ifh.data(), hw_ifh2.data())); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf1_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down2, hw_ifh2)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_span_cmds::unconfig_cmd(hw_is_uncfg, hw_ifh.data(), hw_ifh2.data())); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down2, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh2, itf2_name)); TRY_CHECK(OM::remove(elif)); } @@ -1219,8 +1604,8 @@ BOOST_AUTO_TEST_CASE(test_routing) { HW::item hw_rd4_unbind(route::DEFAULT_TABLE, rc_t::OK); HW::item hw_rd6_bind(1, rc_t::OK); HW::item hw_rd7_unbind(route::DEFAULT_TABLE, rc_t::OK); - ADD_EXPECT(route_domain::create_cmd(hw_rd4_create, l3_proto_t::IPV4, 1)); - ADD_EXPECT(route_domain::create_cmd(hw_rd6_create, l3_proto_t::IPV6, 1)); + ADD_EXPECT(route_domain_cmds::create_cmd(hw_rd4_create, l3_proto_t::IPV4, 1)); + ADD_EXPECT(route_domain_cmds::create_cmd(hw_rd6_create, l3_proto_t::IPV6, 1)); TRY_CHECK_RC(OM::write(ian, rd4)); /* @@ -1233,8 +1618,8 @@ BOOST_AUTO_TEST_CASE(test_routing) { HW::item hw_ifh(2, rc_t::OK); HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf1_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(ian, itf1)); std::string itf2_name = "af2"; @@ -1246,10 +1631,10 @@ BOOST_AUTO_TEST_CASE(test_routing) { HW::item hw_ifh2(4, rc_t::OK); HW::item hw_as_up2(interface::admin_state_t::UP, rc_t::OK); HW::item hw_as_down2(interface::admin_state_t::DOWN, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh2, itf2_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up2, hw_ifh2)); - ADD_EXPECT(interface::set_table_cmd(hw_rd4_bind, l3_proto_t::IPV4, hw_ifh2)); - ADD_EXPECT(interface::set_table_cmd(hw_rd6_bind, l3_proto_t::IPV6, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up2, hw_ifh2)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd4_bind, l3_proto_t::IPV4, hw_ifh2)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd6_bind, l3_proto_t::IPV6, hw_ifh2)); TRY_CHECK_RC(OM::write(ian, *itf2)); /* @@ -1259,13 +1644,13 @@ BOOST_AUTO_TEST_CASE(test_routing) { l3_binding *l3_10 = new l3_binding(itf1, pfx_10); HW::item hw_l3_10_bind(true, rc_t::OK); HW::item hw_l3_10_unbind(false, rc_t::OK); - ADD_EXPECT(l3_binding::bind_cmd(hw_l3_10_bind, hw_ifh.data(), pfx_10)); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_10_bind, hw_ifh.data(), pfx_10)); TRY_CHECK_RC(OM::write(ian, *l3_10)); route::prefix_t pfx_11("11.11.11.11", 24); l3_binding *l3_11 = new l3_binding(*itf2, pfx_11); HW::item hw_l3_11_bind(true, rc_t::OK); HW::item hw_l3_11_unbind(false, rc_t::OK); - ADD_EXPECT(l3_binding::bind_cmd(hw_l3_11_bind, hw_ifh2.data(), pfx_11)); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_11_bind, hw_ifh2.data(), pfx_11)); TRY_CHECK_RC(OM::write(ian, *l3_11)); /* @@ -1277,7 +1662,7 @@ BOOST_AUTO_TEST_CASE(test_routing) { route::ip_route *route_5 = new route::ip_route(pfx_5); route_5->add(*path_10); HW::item hw_route_5(true, rc_t::OK); - ADD_EXPECT(route::ip_route::update_cmd(hw_route_5, 0, pfx_5, {*path_10})); + ADD_EXPECT(route::ip_route_cmds::update_cmd(hw_route_5, 0, pfx_5, {*path_10})); TRY_CHECK_RC(OM::write(ian, *route_5)); /* @@ -1288,7 +1673,7 @@ BOOST_AUTO_TEST_CASE(test_routing) { route::ip_route *route_5_2 = new route::ip_route(rd4, pfx_5); route_5_2->add(*path_11); HW::item hw_route_5_2(true, rc_t::OK); - ADD_EXPECT(route::ip_route::update_cmd(hw_route_5_2, 1, pfx_5, {*path_11})); + ADD_EXPECT(route::ip_route_cmds::update_cmd(hw_route_5_2, 1, pfx_5, {*path_11})); TRY_CHECK_RC(OM::write(ian, *route_5_2)); /* @@ -1296,8 +1681,8 @@ BOOST_AUTO_TEST_CASE(test_routing) { */ HW::item hw_neighbour(true, rc_t::OK); mac_address_t mac_n({0,1,2,4,5,6}); - neighbour *ne = new neighbour(itf1, mac_n, nh_10); - ADD_EXPECT(neighbour::create_cmd(hw_neighbour, hw_ifh.data(), mac_n, nh_10)); + neighbour *ne = new neighbour(itf1, nh_10, mac_n); + ADD_EXPECT(neighbour_cmds::create_cmd(hw_neighbour, hw_ifh.data(), mac_n, nh_10)); TRY_CHECK_RC(OM::write(ian, *ne)); /* @@ -1308,7 +1693,7 @@ BOOST_AUTO_TEST_CASE(test_routing) { route::ip_route *route_dvr = new route::ip_route(pfx_6); route_dvr->add(*path_l2); HW::item hw_route_dvr(true, rc_t::OK); - ADD_EXPECT(route::ip_route::update_cmd(hw_route_dvr, 0, pfx_6, {*path_l2})); + ADD_EXPECT(route::ip_route_cmds::update_cmd(hw_route_dvr, 0, pfx_6, {*path_l2})); TRY_CHECK_RC(OM::write(ian, *route_dvr)); STRICT_ORDER_OFF(); @@ -1324,20 +1709,20 @@ BOOST_AUTO_TEST_CASE(test_routing) { delete route_dvr; delete path_l2; delete ne; - ADD_EXPECT(neighbour::delete_cmd(hw_neighbour, hw_ifh.data(), mac_n, nh_10)); - ADD_EXPECT(route::ip_route::delete_cmd(hw_route_dvr, 0, pfx_6)); - ADD_EXPECT(route::ip_route::delete_cmd(hw_route_5_2, 1, pfx_5)); - ADD_EXPECT(route::ip_route::delete_cmd(hw_route_5, 0, pfx_5)); - ADD_EXPECT(l3_binding::unbind_cmd(hw_l3_10_unbind, hw_ifh.data(), pfx_10)); - ADD_EXPECT(l3_binding::unbind_cmd(hw_l3_11_unbind, hw_ifh2.data(), pfx_11)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf1_name)); - ADD_EXPECT(interface::set_table_cmd(hw_rd4_unbind, l3_proto_t::IPV4, hw_ifh2)); - ADD_EXPECT(interface::set_table_cmd(hw_rd4_unbind, l3_proto_t::IPV6, hw_ifh2)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down2, hw_ifh2)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh2, itf2_name)); - ADD_EXPECT(route_domain::delete_cmd(hw_rd4_delete, l3_proto_t::IPV4, 1)); - ADD_EXPECT(route_domain::delete_cmd(hw_rd6_delete, l3_proto_t::IPV6, 1)); + ADD_EXPECT(neighbour_cmds::delete_cmd(hw_neighbour, hw_ifh.data(), mac_n, nh_10)); + ADD_EXPECT(route::ip_route_cmds::delete_cmd(hw_route_dvr, 0, pfx_6)); + ADD_EXPECT(route::ip_route_cmds::delete_cmd(hw_route_5_2, 1, pfx_5)); + ADD_EXPECT(route::ip_route_cmds::delete_cmd(hw_route_5, 0, pfx_5)); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_10_unbind, hw_ifh.data(), pfx_10)); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_11_unbind, hw_ifh2.data(), pfx_11)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf1_name)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd4_unbind, l3_proto_t::IPV4, hw_ifh2)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd4_unbind, l3_proto_t::IPV6, hw_ifh2)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down2, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh2, itf2_name)); + ADD_EXPECT(route_domain_cmds::delete_cmd(hw_rd4_delete, l3_proto_t::IPV4, 1)); + ADD_EXPECT(route_domain_cmds::delete_cmd(hw_rd6_delete, l3_proto_t::IPV6, 1)); TRY_CHECK(OM::remove(ian)); } @@ -1357,8 +1742,8 @@ BOOST_AUTO_TEST_CASE(test_nat) { HW::item hw_ifh(2, rc_t::OK); HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh, itf_in_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh, itf_in_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh)); TRY_CHECK_RC(OM::write(gs, itf_in)); /* @@ -1373,8 +1758,8 @@ BOOST_AUTO_TEST_CASE(test_nat) { HW::item hw_as_up2(interface::admin_state_t::UP, rc_t::OK); HW::item hw_as_down2(interface::admin_state_t::DOWN, rc_t::OK); - ADD_EXPECT(interface::af_packet_create_cmd(hw_ifh2, itf_out_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_up2, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh2, itf_out_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up2, hw_ifh2)); TRY_CHECK_RC(OM::write(gs, itf_out)); /* @@ -1386,7 +1771,7 @@ BOOST_AUTO_TEST_CASE(test_nat) { nat_static ns(in_addr, out_addr); HW::item hw_ns(true, rc_t::OK); - ADD_EXPECT(nat_static::create_44_cmd(hw_ns, 0, in_addr.to_v4(), out_addr)); + ADD_EXPECT(nat_static_cmds::create_44_cmd(hw_ns, 0, in_addr.to_v4(), out_addr)); TRY_CHECK_RC(OM::write(gs, ns)); /* @@ -1398,8 +1783,9 @@ BOOST_AUTO_TEST_CASE(test_nat) { nat_binding::zone_t::INSIDE); HW::item hw_nb_in(true, rc_t::OK); - ADD_EXPECT(nat_binding::bind_44_input_cmd(hw_nb_in, hw_ifh.data().value(), - nat_binding::zone_t::INSIDE)); + ADD_EXPECT(nat_binding_cmds::bind_44_input_cmd(hw_nb_in, + hw_ifh.data().value(), + nat_binding::zone_t::INSIDE)); TRY_CHECK_RC(OM::write(gs, *nb_in)); nat_binding *nb_out = new nat_binding(itf_out, @@ -1408,23 +1794,26 @@ BOOST_AUTO_TEST_CASE(test_nat) { nat_binding::zone_t::OUTSIDE); HW::item hw_nb_out(true, rc_t::OK); - ADD_EXPECT(nat_binding::bind_44_input_cmd(hw_nb_out, hw_ifh2.data().value(), - nat_binding::zone_t::OUTSIDE)); + ADD_EXPECT(nat_binding_cmds::bind_44_input_cmd(hw_nb_out, + hw_ifh2.data().value(), + nat_binding::zone_t::OUTSIDE)); TRY_CHECK_RC(OM::write(gs, *nb_out)); STRICT_ORDER_OFF(); delete nb_in; delete nb_out; - ADD_EXPECT(nat_binding::unbind_44_input_cmd(hw_nb_in, hw_ifh.data().value(), - nat_binding::zone_t::INSIDE)); - ADD_EXPECT(nat_binding::unbind_44_input_cmd(hw_nb_out, hw_ifh2.data().value(), - nat_binding::zone_t::OUTSIDE)); - ADD_EXPECT(nat_static::delete_44_cmd(hw_ns, 0, in_addr.to_v4(), out_addr)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down, hw_ifh)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh, itf_in_name)); - ADD_EXPECT(interface::state_change_cmd(hw_as_down2, hw_ifh2)); - ADD_EXPECT(interface::af_packet_delete_cmd(hw_ifh2, itf_out_name)); + ADD_EXPECT(nat_binding_cmds::unbind_44_input_cmd(hw_nb_in, + hw_ifh.data().value(), + nat_binding::zone_t::INSIDE)); + ADD_EXPECT(nat_binding_cmds::unbind_44_input_cmd(hw_nb_out, + hw_ifh2.data().value(), + nat_binding::zone_t::OUTSIDE)); + ADD_EXPECT(nat_static_cmds::delete_44_cmd(hw_ns, 0, in_addr.to_v4(), out_addr)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh, itf_in_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down2, hw_ifh2)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh2, itf_out_name)); TRY_CHECK(OM::remove(gs)); } @@ -1435,13 +1824,206 @@ BOOST_AUTO_TEST_CASE(test_interface_events) { HW::item hw_want(true, rc_t::OK); - ADD_EXPECT(interface::events_cmd(ml)); - cmd* itf = new interface::events_cmd(ml); + ADD_EXPECT(interface_cmds::events_cmd(ml)); + cmd* itf = new interface_cmds::events_cmd(ml); HW::enqueue(itf); HW::write(); +} + +BOOST_AUTO_TEST_CASE(test_interface_route_domain_change) { + VppInit vi; + const std::string rene = "ReneGoscinny"; + rc_t rc = rc_t::OK; + + /* + * Create an interface with two IP addresses + */ + std::string itf1_name = "host1"; + interface itf1(itf1_name, + interface::type_t::AFPACKET, + interface::admin_state_t::UP); + HW::item hw_ifh1(2, rc_t::OK); + HW::item hw_as_up(interface::admin_state_t::UP, rc_t::OK); + HW::item hw_as_down(interface::admin_state_t::DOWN, rc_t::OK); + ADD_EXPECT(interface_cmds::af_packet_create_cmd(hw_ifh1, itf1_name)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_ifh1)); + TRY_CHECK_RC(OM::write(rene, itf1)); + + route::prefix_t pfx_10("10.10.10.10", 24); + l3_binding *l3_1 = new l3_binding(itf1, pfx_10); + HW::item hw_l3_bind1(true, rc_t::OK); + HW::item hw_l3_unbind1(false, rc_t::OK); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_bind1, hw_ifh1.data(), pfx_10)); + TRY_CHECK_RC(OM::write(rene, *l3_1)); + + route::prefix_t pfx_11("10.10.11.11", 24); + l3_binding *l3_2 = new l3_binding(itf1, pfx_11); + HW::item hw_l3_bind2(true, rc_t::OK); + HW::item hw_l3_unbind2(false, rc_t::OK); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_bind2, hw_ifh1.data(), pfx_11)); + TRY_CHECK_RC(OM::write(rene, *l3_2)); + + route_domain rd(1); + HW::item hw_rd_create(true, rc_t::OK); + HW::item hw_rd_delete(false, rc_t::OK); + HW::item hw_rd_bind(1, rc_t::OK); + HW::item hw_rd_unbind(route::DEFAULT_TABLE, rc_t::OK); + ADD_EXPECT(route_domain_cmds::create_cmd(hw_rd_create, l3_proto_t::IPV4, 1)); + ADD_EXPECT(route_domain_cmds::create_cmd(hw_rd_create, l3_proto_t::IPV6, 1)); + TRY_CHECK_RC(OM::write(rene, rd)); + + /* + * update the interface to change to a new route-domain + * expect that the l3-bindings are removed and readded. + */ + interface *itf2 = new interface(itf1_name, + interface::type_t::AFPACKET, + interface::admin_state_t::UP, + rd); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_unbind1, hw_ifh1.data(), pfx_10)); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_unbind2, hw_ifh1.data(), pfx_11)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd_bind, l3_proto_t::IPV4, hw_ifh1)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd_bind, l3_proto_t::IPV6, hw_ifh1)); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_bind1, hw_ifh1.data(), pfx_10)); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_bind2, hw_ifh1.data(), pfx_11)); + TRY_CHECK_RC(OM::write(rene, *itf2)); + + /* + * mve the interface back to the default route-domain + */ + interface itf3(itf1_name, + interface::type_t::AFPACKET, + interface::admin_state_t::UP); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_unbind1, hw_ifh1.data(), pfx_10)); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_unbind2, hw_ifh1.data(), pfx_11)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd_unbind, l3_proto_t::IPV4, hw_ifh1)); + ADD_EXPECT(interface_cmds::set_table_cmd(hw_rd_unbind, l3_proto_t::IPV6, hw_ifh1)); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_bind1, hw_ifh1.data(), pfx_10)); + ADD_EXPECT(l3_binding_cmds::bind_cmd(hw_l3_bind2, hw_ifh1.data(), pfx_11)); + TRY_CHECK_RC(OM::write(rene, itf3)); + + delete l3_1; + delete l3_2; + delete itf2; + + STRICT_ORDER_OFF(); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_unbind1, hw_ifh1.data(), pfx_10)); + ADD_EXPECT(l3_binding_cmds::unbind_cmd(hw_l3_unbind2, hw_ifh1.data(), pfx_11)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_ifh1)); + ADD_EXPECT(interface_cmds::af_packet_delete_cmd(hw_ifh1, itf1_name)); + ADD_EXPECT(route_domain_cmds::delete_cmd(hw_rd_delete, l3_proto_t::IPV4, 1)); + ADD_EXPECT(route_domain_cmds::delete_cmd(hw_rd_delete, l3_proto_t::IPV6, 1)); + + TRY_CHECK(OM::remove(rene)); +} + +BOOST_AUTO_TEST_CASE(test_prefixes) { + route::prefix_t p6_s_16(boost::asio::ip::address::from_string("2001::"), 16); + + BOOST_CHECK(p6_s_16.mask() == boost::asio::ip::address::from_string("ffff::")); + + route::prefix_t p6_s_17(boost::asio::ip::address::from_string("2001:ff00::"), 17); + + BOOST_CHECK(p6_s_17.mask() == boost::asio::ip::address::from_string("ffff:8000::")); + BOOST_CHECK(p6_s_17.low().address() == boost::asio::ip::address::from_string("2001:8000::")); + + route::prefix_t p6_s_15(boost::asio::ip::address::from_string("2001:ff00::"), 15); + BOOST_CHECK(p6_s_15.mask() == boost::asio::ip::address::from_string("fffe::")); + BOOST_CHECK(p6_s_15.low().address() == boost::asio::ip::address::from_string("2000::")); + + route::prefix_t p4_s_16(boost::asio::ip::address::from_string("192.168.0.0"), 16); + + BOOST_CHECK(p4_s_16.mask() == boost::asio::ip::address::from_string("255.255.0.0")); + + route::prefix_t p4_s_17(boost::asio::ip::address::from_string("192.168.127.0"), 17); + + BOOST_CHECK(p4_s_17.mask() == boost::asio::ip::address::from_string("255.255.128.0")); + BOOST_CHECK(p4_s_17.low().address() == boost::asio::ip::address::from_string("192.168.0.0")); + BOOST_CHECK(p4_s_17.high().address() == boost::asio::ip::address::from_string("192.168.127.255")); + + route::prefix_t p4_s_15(boost::asio::ip::address::from_string("192.168.255.255"), 15); + + BOOST_CHECK(p4_s_15.mask() == boost::asio::ip::address::from_string("255.254.0.0")); + BOOST_CHECK(p4_s_15.low().address() == boost::asio::ip::address::from_string("192.168.0.0")); + BOOST_CHECK(p4_s_15.high().address() == boost::asio::ip::address::from_string("192.169.255.255")); + + route::prefix_t p4_s_32(boost::asio::ip::address::from_string("192.168.1.1"), 32); + + BOOST_CHECK(p4_s_32.mask() == boost::asio::ip::address::from_string("255.255.255.255")); + BOOST_CHECK(p4_s_32.low().address() == boost::asio::ip::address::from_string("192.168.1.1")); + BOOST_CHECK(p4_s_32.high().address() == boost::asio::ip::address::from_string("192.168.1.1")); + +} + +BOOST_AUTO_TEST_CASE(test_pipes) { + VppInit vi; + const std::string gk = "GKChesterton"; + + const std::string pipe_name_1 = "pipe1"; + VOM::pipe pipe1(1, interface::admin_state_t::UP); + HW::item hw_hdl(4, rc_t::OK); + HW::item hw_hdl_pair(std::make_pair(5,6), rc_t::OK); + + HW::item hw_as_up(interface::admin_state_t::UP, + rc_t::OK); + HW::item hw_as_down(interface::admin_state_t::DOWN, + rc_t::OK); + ADD_EXPECT(pipe_cmds::create_cmd(hw_hdl, pipe_name_1, 1, hw_hdl_pair)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_up, hw_hdl)); + TRY_CHECK_RC(OM::write(gk, pipe1)); + + pipe1.set_ends(hw_hdl_pair.data()); + + // put each end of the pipe in a BD + bridge_domain bd1(33, bridge_domain::learning_mode_t::OFF, + bridge_domain::arp_term_mode_t::OFF, + bridge_domain::flood_mode_t::OFF, + bridge_domain::mac_age_mode_t::ON); + + HW::item hw_bd(33, rc_t::OK); + ADD_EXPECT(bridge_domain_cmds::create_cmd(hw_bd, + bridge_domain::learning_mode_t::OFF, + bridge_domain::arp_term_mode_t::OFF, + bridge_domain::flood_mode_t::OFF, + bridge_domain::mac_age_mode_t::ON)); + + TRY_CHECK_RC(OM::write(gk, bd1)); + + l2_binding *l2_1 = new l2_binding(*pipe1.east(), bd1); + HW::item hw_l2_1_bind(true, rc_t::OK); + + ADD_EXPECT(l2_binding_cmds::bind_cmd(hw_l2_1_bind, + pipe1.east()->handle(), + hw_bd.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_NORMAL)); + TRY_CHECK_RC(OM::write(gk, *l2_1)); + + l2_binding *l2_2 = new l2_binding(*pipe1.west(), bd1); + HW::item hw_l2_2_bind(true, rc_t::OK); + + ADD_EXPECT(l2_binding_cmds::bind_cmd(hw_l2_2_bind, + pipe1.west()->handle(), + hw_bd.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_NORMAL)); + TRY_CHECK_RC(OM::write(gk, *l2_2)); + + STRICT_ORDER_OFF(); - HW::dequeue(itf); + delete l2_1; + delete l2_2; + ADD_EXPECT(l2_binding_cmds::unbind_cmd(hw_l2_1_bind, + pipe1.east()->handle(), + hw_bd.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_NORMAL)); + ADD_EXPECT(l2_binding_cmds::unbind_cmd(hw_l2_1_bind, + pipe1.west()->handle(), + hw_bd.data(), + l2_binding::l2_port_type_t::L2_PORT_TYPE_NORMAL)); + ADD_EXPECT(interface_cmds::state_change_cmd(hw_as_down, hw_hdl)); + ADD_EXPECT(pipe_cmds::delete_cmd(hw_hdl, hw_hdl_pair)); + ADD_EXPECT(bridge_domain_cmds::delete_cmd(hw_bd)); + TRY_CHECK(OM::remove(gk)); } BOOST_AUTO_TEST_SUITE_END()