aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/vom/vom/Makefile.am3
-rw-r--r--extras/vom/vom/acl_binding_cmds.cpp16
-rw-r--r--extras/vom/vom/acl_binding_cmds.hpp8
-rw-r--r--extras/vom/vom/acl_ethertype_cmds.cpp4
-rw-r--r--extras/vom/vom/acl_ethertype_cmds.hpp10
-rw-r--r--extras/vom/vom/acl_list_cmds.cpp6
-rw-r--r--extras/vom/vom/acl_list_cmds.hpp11
-rw-r--r--extras/vom/vom/arp_proxy_binding_cmds.cpp4
-rw-r--r--extras/vom/vom/arp_proxy_binding_cmds.hpp4
-rw-r--r--extras/vom/vom/arp_proxy_config_cmds.cpp2
-rw-r--r--extras/vom/vom/arp_proxy_config_cmds.hpp5
-rw-r--r--extras/vom/vom/bond_group_binding.cpp2
-rw-r--r--extras/vom/vom/bond_group_binding_cmds.cpp4
-rw-r--r--extras/vom/vom/bond_group_binding_cmds.hpp4
-rw-r--r--extras/vom/vom/bond_interface_cmds.cpp3
-rw-r--r--extras/vom/vom/bridge_domain_arp_entry_cmds.cpp4
-rw-r--r--extras/vom/vom/bridge_domain_arp_entry_cmds.hpp4
-rw-r--r--extras/vom/vom/bridge_domain_cmds.cpp4
-rw-r--r--extras/vom/vom/bridge_domain_cmds.hpp4
-rw-r--r--extras/vom/vom/bridge_domain_entry_cmds.cpp4
-rw-r--r--extras/vom/vom/bridge_domain_entry_cmds.hpp4
-rw-r--r--extras/vom/vom/dhcp_client_cmds.cpp4
-rw-r--r--extras/vom/vom/dhcp_client_cmds.hpp5
-rw-r--r--extras/vom/vom/event_cmd.hpp4
-rw-r--r--extras/vom/vom/gbp_contract_cmds.cpp8
-rw-r--r--extras/vom/vom/gbp_contract_cmds.hpp6
-rw-r--r--extras/vom/vom/gbp_endpoint_cmds.cpp8
-rw-r--r--extras/vom/vom/gbp_endpoint_cmds.hpp6
-rw-r--r--extras/vom/vom/gbp_endpoint_group_cmds.cpp8
-rw-r--r--extras/vom/vom/gbp_endpoint_group_cmds.hpp4
-rw-r--r--extras/vom/vom/gbp_recirc_cmds.cpp8
-rw-r--r--extras/vom/vom/gbp_recirc_cmds.hpp6
-rw-r--r--extras/vom/vom/gbp_subnet_cmds.cpp8
-rw-r--r--extras/vom/vom/gbp_subnet_cmds.hpp6
-rw-r--r--extras/vom/vom/hw_cmds.cpp4
-rw-r--r--extras/vom/vom/hw_cmds.hpp2
-rw-r--r--extras/vom/vom/interface.hpp27
-rw-r--r--extras/vom/vom/interface_cmds.cpp26
-rw-r--r--extras/vom/vom/interface_cmds.hpp18
-rw-r--r--extras/vom/vom/interface_factory.cpp24
-rw-r--r--extras/vom/vom/interface_factory.hpp6
-rw-r--r--extras/vom/vom/interface_ip6_nd.hpp8
-rw-r--r--extras/vom/vom/interface_ip6_nd_cmds.cpp8
-rw-r--r--extras/vom/vom/interface_span_cmds.cpp4
-rw-r--r--extras/vom/vom/interface_span_cmds.hpp4
-rw-r--r--extras/vom/vom/interface_types.cpp4
-rw-r--r--extras/vom/vom/ip_unnumbered_cmds.cpp4
-rw-r--r--extras/vom/vom/ip_unnumbered_cmds.hpp4
-rw-r--r--extras/vom/vom/l2_binding_cmds.cpp8
-rw-r--r--extras/vom/vom/l2_binding_cmds.hpp5
-rw-r--r--extras/vom/vom/l2_emulation_cmds.cpp4
-rw-r--r--extras/vom/vom/l2_emulation_cmds.hpp4
-rw-r--r--extras/vom/vom/l2_xconnect_cmds.cpp2
-rw-r--r--extras/vom/vom/l2_xconnect_cmds.hpp4
-rw-r--r--extras/vom/vom/l3_binding_cmds.cpp4
-rw-r--r--extras/vom/vom/l3_binding_cmds.hpp4
-rw-r--r--extras/vom/vom/lldp_binding_cmds.cpp4
-rw-r--r--extras/vom/vom/lldp_binding_cmds.hpp6
-rw-r--r--extras/vom/vom/lldp_global_cmds.cpp4
-rw-r--r--extras/vom/vom/lldp_global_cmds.hpp2
-rw-r--r--extras/vom/vom/nat_binding_cmds.cpp20
-rw-r--r--extras/vom/vom/nat_binding_cmds.hpp16
-rw-r--r--extras/vom/vom/nat_static_cmds.cpp8
-rw-r--r--extras/vom/vom/nat_static_cmds.hpp8
-rw-r--r--extras/vom/vom/neighbour_cmds.cpp4
-rw-r--r--extras/vom/vom/neighbour_cmds.hpp8
-rw-r--r--extras/vom/vom/pipe.cpp211
-rw-r--r--extras/vom/vom/pipe.hpp171
-rw-r--r--extras/vom/vom/pipe_cmds.cpp153
-rw-r--r--extras/vom/vom/pipe_cmds.hpp131
-rw-r--r--extras/vom/vom/route_cmds.cpp4
-rw-r--r--extras/vom/vom/route_cmds.hpp4
-rw-r--r--extras/vom/vom/route_domain_cmds.cpp4
-rw-r--r--extras/vom/vom/route_domain_cmds.hpp4
-rw-r--r--extras/vom/vom/rpc_cmd.hpp31
-rw-r--r--extras/vom/vom/sub_interface_cmds.cpp2
-rw-r--r--extras/vom/vom/tap_interface_cmds.cpp4
-rw-r--r--extras/vom/vom/types.hpp12
-rw-r--r--extras/vom/vom/vxlan_tunnel.cpp2
-rw-r--r--extras/vom/vom/vxlan_tunnel_cmds.cpp4
-rw-r--r--src/vnet/devices/pipe/pipe.api14
-rw-r--r--src/vnet/devices/pipe/pipe_api.c6
-rw-r--r--test/ext/vom_test.cpp78
-rw-r--r--test/test_pipe.py10
84 files changed, 978 insertions, 316 deletions
diff --git a/extras/vom/vom/Makefile.am b/extras/vom/vom/Makefile.am
index 6c24d01ce7c..f976b6fad90 100644
--- a/extras/vom/vom/Makefile.am
+++ b/extras/vom/vom/Makefile.am
@@ -127,6 +127,8 @@ libvom_la_SOURCES = \
neighbour_cmds.cpp \
object_base.cpp \
om.cpp \
+ pipe.cpp \
+ pipe_cmds.cpp \
prefix.cpp \
ra_config.cpp \
ra_prefix.cpp \
@@ -214,6 +216,7 @@ vominclude_HEADERS = \
neighbour.hpp \
object_base.hpp \
om.hpp \
+ pipe.hpp \
prefix.hpp \
ra_config.hpp \
ra_prefix.hpp \
diff --git a/extras/vom/vom/acl_binding_cmds.cpp b/extras/vom/vom/acl_binding_cmds.cpp
index 8c33cd47b79..062c1b90c9f 100644
--- a/extras/vom/vom/acl_binding_cmds.cpp
+++ b/extras/vom/vom/acl_binding_cmds.cpp
@@ -34,9 +34,7 @@ l3_bind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
template <>
@@ -64,9 +62,7 @@ l3_unbind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
template <>
@@ -116,9 +112,7 @@ l2_bind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
template <>
@@ -145,9 +139,7 @@ l2_unbind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
template <>
diff --git a/extras/vom/vom/acl_binding_cmds.hpp b/extras/vom/vom/acl_binding_cmds.hpp
index b9af66e70c8..8515b4148ac 100644
--- a/extras/vom/vom/acl_binding_cmds.hpp
+++ b/extras/vom/vom/acl_binding_cmds.hpp
@@ -29,7 +29,7 @@ namespace binding_cmds {
* A command class that binds the ACL to the interface
*/
template <typename BIND>
-class bind_cmd : public rpc_cmd<HW::item<bool>, rc_t, BIND>
+class bind_cmd : public rpc_cmd<HW::item<bool>, BIND>
{
public:
/**
@@ -39,7 +39,7 @@ public:
const direction_t& direction,
const handle_t& itf,
const handle_t& acl)
- : rpc_cmd<HW::item<bool>, rc_t, BIND>(item)
+ : rpc_cmd<HW::item<bool>, BIND>(item)
, m_direction(direction)
, m_itf(itf)
, m_acl(acl)
@@ -85,7 +85,7 @@ private:
* A command class that binds the ACL to the interface
*/
template <typename BIND>
-class unbind_cmd : public rpc_cmd<HW::item<bool>, rc_t, BIND>
+class unbind_cmd : public rpc_cmd<HW::item<bool>, BIND>
{
public:
/**
@@ -95,7 +95,7 @@ public:
const direction_t& direction,
const handle_t& itf,
const handle_t& acl)
- : rpc_cmd<HW::item<bool>, rc_t, BIND>(item)
+ : rpc_cmd<HW::item<bool>, BIND>(item)
, m_direction(direction)
, m_itf(itf)
, m_acl(acl)
diff --git a/extras/vom/vom/acl_ethertype_cmds.cpp b/extras/vom/vom/acl_ethertype_cmds.cpp
index c05a428c725..0fa1d6db73e 100644
--- a/extras/vom/vom/acl_ethertype_cmds.cpp
+++ b/extras/vom/vom/acl_ethertype_cmds.cpp
@@ -58,9 +58,7 @@ bind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/acl_ethertype_cmds.hpp b/extras/vom/vom/acl_ethertype_cmds.hpp
index f72a3fb97b5..a294a758056 100644
--- a/extras/vom/vom/acl_ethertype_cmds.hpp
+++ b/extras/vom/vom/acl_ethertype_cmds.hpp
@@ -28,9 +28,8 @@ namespace acl_ethertype_cmds {
/**
* A command class that binds the ethertype list to the interface
*/
-class bind_cmd : public rpc_cmd<HW::item<bool>,
- rc_t,
- vapi::Acl_interface_set_etype_whitelist>
+class bind_cmd
+ : public rpc_cmd<HW::item<bool>, vapi::Acl_interface_set_etype_whitelist>
{
public:
/**
@@ -69,9 +68,8 @@ private:
/**
* A command class that unbinds the ethertype list to the interface
*/
-class unbind_cmd : public rpc_cmd<HW::item<bool>,
- rc_t,
- vapi::Acl_interface_set_etype_whitelist>
+class unbind_cmd
+ : public rpc_cmd<HW::item<bool>, vapi::Acl_interface_set_etype_whitelist>
{
public:
/**
diff --git a/extras/vom/vom/acl_list_cmds.cpp b/extras/vom/vom/acl_list_cmds.cpp
index 2e59763f4fe..343b2e5d513 100644
--- a/extras/vom/vom/acl_list_cmds.cpp
+++ b/extras/vom/vom/acl_list_cmds.cpp
@@ -74,7 +74,8 @@ l3_update_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item = wait();
+ wait();
+
if (m_hw_item.rc() == rc_t::OK)
insert_acl();
@@ -140,7 +141,8 @@ l2_update_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item = wait();
+ wait();
+
if (m_hw_item.rc() == rc_t::OK)
insert_acl();
diff --git a/extras/vom/vom/acl_list_cmds.hpp b/extras/vom/vom/acl_list_cmds.hpp
index d24e75229de..ec69773f857 100644
--- a/extras/vom/vom/acl_list_cmds.hpp
+++ b/extras/vom/vom/acl_list_cmds.hpp
@@ -29,8 +29,7 @@ namespace list_cmds {
* A command class that Create the list
*/
template <typename RULE, typename UPDATE>
-class update_cmd
- : public rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, UPDATE>
+class update_cmd : public rpc_cmd<HW::item<handle_t>, UPDATE>
{
public:
typedef typename list<RULE>::rules_t cmd_rules_t;
@@ -42,7 +41,7 @@ public:
update_cmd(HW::item<handle_t>& item,
const cmd_key_t& key,
const cmd_rules_t& rules)
- : rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, UPDATE>(item)
+ : rpc_cmd<HW::item<handle_t>, UPDATE>(item)
, m_key(key)
, m_rules(rules)
{
@@ -78,7 +77,7 @@ public:
void succeeded()
{
- rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, UPDATE>::succeeded();
+ rpc_cmd<HW::item<handle_t>, UPDATE>::succeeded();
list<RULE>::add(m_key, this->item());
}
@@ -124,14 +123,14 @@ private:
* A cmd class that Deletes an ACL
*/
template <typename RULE, typename DELETE>
-class delete_cmd : public rpc_cmd<HW::item<handle_t>, rc_t, DELETE>
+class delete_cmd : public rpc_cmd<HW::item<handle_t>, DELETE>
{
public:
/**
* Constructor
*/
delete_cmd(HW::item<handle_t>& item)
- : rpc_cmd<HW::item<handle_t>, rc_t, DELETE>(item)
+ : rpc_cmd<HW::item<handle_t>, DELETE>(item)
{
}
diff --git a/extras/vom/vom/arp_proxy_binding_cmds.cpp b/extras/vom/vom/arp_proxy_binding_cmds.cpp
index 2314d531add..6da956c1c38 100644
--- a/extras/vom/vom/arp_proxy_binding_cmds.cpp
+++ b/extras/vom/vom/arp_proxy_binding_cmds.cpp
@@ -41,9 +41,7 @@ bind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/arp_proxy_binding_cmds.hpp b/extras/vom/vom/arp_proxy_binding_cmds.hpp
index fcf0a4a2530..cafc1420f87 100644
--- a/extras/vom/vom/arp_proxy_binding_cmds.hpp
+++ b/extras/vom/vom/arp_proxy_binding_cmds.hpp
@@ -27,7 +27,7 @@ namespace arp_proxy_binding_cmds {
* A command class that binds the LLDP config to the interface
*/
class bind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Proxy_arp_intfc_enable_disable>
+ : public rpc_cmd<HW::item<bool>, vapi::Proxy_arp_intfc_enable_disable>
{
public:
/**
@@ -60,7 +60,7 @@ private:
* A cmd class that Unbinds ArpProxy Config from an interface
*/
class unbind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Proxy_arp_intfc_enable_disable>
+ : public rpc_cmd<HW::item<bool>, vapi::Proxy_arp_intfc_enable_disable>
{
public:
/**
diff --git a/extras/vom/vom/arp_proxy_config_cmds.cpp b/extras/vom/vom/arp_proxy_config_cmds.cpp
index 122c51bdb95..deb52c459b7 100644
--- a/extras/vom/vom/arp_proxy_config_cmds.cpp
+++ b/extras/vom/vom/arp_proxy_config_cmds.cpp
@@ -48,7 +48,7 @@ config_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
+ wait();
return (rc_t::OK);
}
diff --git a/extras/vom/vom/arp_proxy_config_cmds.hpp b/extras/vom/vom/arp_proxy_config_cmds.hpp
index 77abc74556b..d1a0a420411 100644
--- a/extras/vom/vom/arp_proxy_config_cmds.hpp
+++ b/extras/vom/vom/arp_proxy_config_cmds.hpp
@@ -27,7 +27,7 @@ namespace arp_proxy_config_cmds {
/**
* A command class that adds the ARP Proxy config
*/
-class config_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::Proxy_arp_add_del>
+class config_cmd : public rpc_cmd<HW::item<bool>, vapi::Proxy_arp_add_del>
{
public:
/**
@@ -62,8 +62,7 @@ private:
/**
* A cmd class that Unconfigs ArpProxy Config from an interface
*/
-class unconfig_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Proxy_arp_add_del>
+class unconfig_cmd : public rpc_cmd<HW::item<bool>, vapi::Proxy_arp_add_del>
{
public:
/**
diff --git a/extras/vom/vom/bond_group_binding.cpp b/extras/vom/vom/bond_group_binding.cpp
index 60721dd4265..e5d4f3891b5 100644
--- a/extras/vom/vom/bond_group_binding.cpp
+++ b/extras/vom/vom/bond_group_binding.cpp
@@ -161,7 +161,7 @@ bond_group_binding::event_handler::order() const
* We want enslaved interfaces bind to bond after interface
* but before anything else.
*/
- return (dependency_t::BOND_BINDING);
+ return (dependency_t::VIRTUAL_INTERFACE);
}
void
diff --git a/extras/vom/vom/bond_group_binding_cmds.cpp b/extras/vom/vom/bond_group_binding_cmds.cpp
index 3ffe9810173..b257f776373 100644
--- a/extras/vom/vom/bond_group_binding_cmds.cpp
+++ b/extras/vom/vom/bond_group_binding_cmds.cpp
@@ -45,9 +45,7 @@ bind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/bond_group_binding_cmds.hpp b/extras/vom/vom/bond_group_binding_cmds.hpp
index 71c4f9fad64..3d9bfeedc61 100644
--- a/extras/vom/vom/bond_group_binding_cmds.hpp
+++ b/extras/vom/vom/bond_group_binding_cmds.hpp
@@ -26,7 +26,7 @@ namespace bond_group_binding_cmds {
/**
* A command class that binds the slave interface to the bond interface
*/
-class bind_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::Bond_enslave>
+class bind_cmd : public rpc_cmd<HW::item<bool>, vapi::Bond_enslave>
{
public:
/**
@@ -65,7 +65,7 @@ private:
/**
* A cmd class that detach slave from a bond interface
*/
-class unbind_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::Bond_detach_slave>
+class unbind_cmd : public rpc_cmd<HW::item<bool>, vapi::Bond_detach_slave>
{
public:
/**
diff --git a/extras/vom/vom/bond_interface_cmds.cpp b/extras/vom/vom/bond_interface_cmds.cpp
index d59560d4f5f..a43a832222a 100644
--- a/extras/vom/vom/bond_interface_cmds.cpp
+++ b/extras/vom/vom/bond_interface_cmds.cpp
@@ -51,7 +51,8 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item = wait();
+ wait();
+
if (m_hw_item.rc() == rc_t::OK) {
insert_interface();
}
diff --git a/extras/vom/vom/bridge_domain_arp_entry_cmds.cpp b/extras/vom/vom/bridge_domain_arp_entry_cmds.cpp
index 824dcadad02..d404d5d72d8 100644
--- a/extras/vom/vom/bridge_domain_arp_entry_cmds.cpp
+++ b/extras/vom/vom/bridge_domain_arp_entry_cmds.cpp
@@ -49,9 +49,7 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/bridge_domain_arp_entry_cmds.hpp b/extras/vom/vom/bridge_domain_arp_entry_cmds.hpp
index 094de4c7fb6..9637e37a845 100644
--- a/extras/vom/vom/bridge_domain_arp_entry_cmds.hpp
+++ b/extras/vom/vom/bridge_domain_arp_entry_cmds.hpp
@@ -27,7 +27,7 @@ namespace bridge_domain_arp_entry_cmds {
/**
* A command class that creates or updates the bridge domain ARP Entry
*/
-class create_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::Bd_ip_mac_add_del>
+class create_cmd : public rpc_cmd<HW::item<bool>, vapi::Bd_ip_mac_add_del>
{
public:
/**
@@ -62,7 +62,7 @@ private:
/**
* A cmd class that deletes a bridge domain ARP entry
*/
-class delete_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::Bd_ip_mac_add_del>
+class delete_cmd : public rpc_cmd<HW::item<bool>, vapi::Bd_ip_mac_add_del>
{
public:
/**
diff --git a/extras/vom/vom/bridge_domain_cmds.cpp b/extras/vom/vom/bridge_domain_cmds.cpp
index d1d536f6d39..0e533be2899 100644
--- a/extras/vom/vom/bridge_domain_cmds.cpp
+++ b/extras/vom/vom/bridge_domain_cmds.cpp
@@ -55,9 +55,7 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return (rc_t::OK);
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/bridge_domain_cmds.hpp b/extras/vom/vom/bridge_domain_cmds.hpp
index 3257d83dc75..0ab1bfad95c 100644
--- a/extras/vom/vom/bridge_domain_cmds.hpp
+++ b/extras/vom/vom/bridge_domain_cmds.hpp
@@ -28,7 +28,7 @@ namespace bridge_domain_cmds {
* A command class that creates an Bridge-Domain
*/
class create_cmd
- : public rpc_cmd<HW::item<uint32_t>, rc_t, vapi::Bridge_domain_add_del>
+ : public rpc_cmd<HW::item<uint32_t>, vapi::Bridge_domain_add_del>
{
public:
/**
@@ -77,7 +77,7 @@ private:
* A cmd class that Delete an Bridge-Domain
*/
class delete_cmd
- : public rpc_cmd<HW::item<uint32_t>, rc_t, vapi::Bridge_domain_add_del>
+ : public rpc_cmd<HW::item<uint32_t>, vapi::Bridge_domain_add_del>
{
public:
/**
diff --git a/extras/vom/vom/bridge_domain_entry_cmds.cpp b/extras/vom/vom/bridge_domain_entry_cmds.cpp
index f2a3ed9c2cc..ffdd02de0d2 100644
--- a/extras/vom/vom/bridge_domain_entry_cmds.cpp
+++ b/extras/vom/vom/bridge_domain_entry_cmds.cpp
@@ -51,9 +51,7 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/bridge_domain_entry_cmds.hpp b/extras/vom/vom/bridge_domain_entry_cmds.hpp
index dc46719ffda..dfee04f2a0d 100644
--- a/extras/vom/vom/bridge_domain_entry_cmds.hpp
+++ b/extras/vom/vom/bridge_domain_entry_cmds.hpp
@@ -28,7 +28,7 @@ namespace bridge_domain_entry_cmds {
/**
* A command class that creates or updates the bridge_domain
*/
-class create_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::L2fib_add_del>
+class create_cmd : public rpc_cmd<HW::item<bool>, vapi::L2fib_add_del>
{
public:
/**
@@ -65,7 +65,7 @@ private:
/**
* A cmd class that deletes a bridge_domain
*/
-class delete_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::L2fib_add_del>
+class delete_cmd : public rpc_cmd<HW::item<bool>, vapi::L2fib_add_del>
{
public:
/**
diff --git a/extras/vom/vom/dhcp_client_cmds.cpp b/extras/vom/vom/dhcp_client_cmds.cpp
index 181a15f8f96..9b632fe88f9 100644
--- a/extras/vom/vom/dhcp_client_cmds.cpp
+++ b/extras/vom/vom/dhcp_client_cmds.cpp
@@ -63,9 +63,7 @@ bind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/dhcp_client_cmds.hpp b/extras/vom/vom/dhcp_client_cmds.hpp
index e7db38f4e3b..89fe7eefa73 100644
--- a/extras/vom/vom/dhcp_client_cmds.hpp
+++ b/extras/vom/vom/dhcp_client_cmds.hpp
@@ -29,7 +29,7 @@ namespace dhcp_client_cmds {
/**
* A command class that binds the DHCP config to the interface
*/
-class bind_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::Dhcp_client_config>
+class bind_cmd : public rpc_cmd<HW::item<bool>, vapi::Dhcp_client_config>
{
public:
/**
@@ -80,8 +80,7 @@ private:
/**
* A cmd class that Unbinds Dhcp Config from an interface
*/
-class unbind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Dhcp_client_config>
+class unbind_cmd : public rpc_cmd<HW::item<bool>, vapi::Dhcp_client_config>
{
public:
/**
diff --git a/extras/vom/vom/event_cmd.hpp b/extras/vom/vom/event_cmd.hpp
index a0e9b4af112..1120f75b399 100644
--- a/extras/vom/vom/event_cmd.hpp
+++ b/extras/vom/vom/event_cmd.hpp
@@ -36,14 +36,14 @@ namespace VOM {
* The client can then 'pop' these events from this command object.
*/
template <typename WANT, typename EVENT>
-class event_cmd : public rpc_cmd<HW::item<bool>, rc_t, WANT>
+class event_cmd : public rpc_cmd<HW::item<bool>, WANT>
{
public:
/**
* Default constructor
*/
event_cmd(HW::item<bool>& b)
- : rpc_cmd<HW::item<bool>, rc_t, WANT>(b)
+ : rpc_cmd<HW::item<bool>, WANT>(b)
{
}
diff --git a/extras/vom/vom/gbp_contract_cmds.cpp b/extras/vom/vom/gbp_contract_cmds.cpp
index a98dc62bc59..dea5350160d 100644
--- a/extras/vom/vom/gbp_contract_cmds.cpp
+++ b/extras/vom/vom/gbp_contract_cmds.cpp
@@ -49,9 +49,7 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
@@ -94,9 +92,7 @@ delete_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/gbp_contract_cmds.hpp b/extras/vom/vom/gbp_contract_cmds.hpp
index 705c1a0a3db..31b9a00ed14 100644
--- a/extras/vom/vom/gbp_contract_cmds.hpp
+++ b/extras/vom/vom/gbp_contract_cmds.hpp
@@ -27,8 +27,7 @@ namespace gbp_contract_cmds {
/**
* A command class that creates or updates the GBP contract
*/
-class create_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Gbp_contract_add_del>
+class create_cmd : public rpc_cmd<HW::item<bool>, vapi::Gbp_contract_add_del>
{
public:
/**
@@ -63,8 +62,7 @@ private:
/**
* A cmd class that deletes a GBP contract
*/
-class delete_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Gbp_contract_add_del>
+class delete_cmd : public rpc_cmd<HW::item<bool>, vapi::Gbp_contract_add_del>
{
public:
/**
diff --git a/extras/vom/vom/gbp_endpoint_cmds.cpp b/extras/vom/vom/gbp_endpoint_cmds.cpp
index 88d2f377bc7..1f9078f9b7f 100644
--- a/extras/vom/vom/gbp_endpoint_cmds.cpp
+++ b/extras/vom/vom/gbp_endpoint_cmds.cpp
@@ -54,9 +54,7 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
@@ -97,9 +95,7 @@ delete_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/gbp_endpoint_cmds.hpp b/extras/vom/vom/gbp_endpoint_cmds.hpp
index 2893ef51eec..dea4c2c5605 100644
--- a/extras/vom/vom/gbp_endpoint_cmds.hpp
+++ b/extras/vom/vom/gbp_endpoint_cmds.hpp
@@ -27,8 +27,7 @@ namespace gbp_endpoint_cmds {
/**
* A command class that creates or updates the GBP endpoint
*/
-class create_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Gbp_endpoint_add_del>
+class create_cmd : public rpc_cmd<HW::item<bool>, vapi::Gbp_endpoint_add_del>
{
public:
/**
@@ -65,8 +64,7 @@ private:
/**
* A cmd class that deletes a GBP endpoint
*/
-class delete_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Gbp_endpoint_add_del>
+class delete_cmd : public rpc_cmd<HW::item<bool>, vapi::Gbp_endpoint_add_del>
{
public:
/**
diff --git a/extras/vom/vom/gbp_endpoint_group_cmds.cpp b/extras/vom/vom/gbp_endpoint_group_cmds.cpp
index 55e81d3a528..a7b46f8a80b 100644
--- a/extras/vom/vom/gbp_endpoint_group_cmds.cpp
+++ b/extras/vom/vom/gbp_endpoint_group_cmds.cpp
@@ -53,9 +53,7 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
@@ -92,9 +90,7 @@ delete_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/gbp_endpoint_group_cmds.hpp b/extras/vom/vom/gbp_endpoint_group_cmds.hpp
index 4da3a4247b4..4cf88cff116 100644
--- a/extras/vom/vom/gbp_endpoint_group_cmds.hpp
+++ b/extras/vom/vom/gbp_endpoint_group_cmds.hpp
@@ -28,7 +28,7 @@ namespace gbp_endpoint_group_cmds {
* A command class that creates or updates the GBP endpoint_group
*/
class create_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Gbp_endpoint_group_add_del>
+ : public rpc_cmd<HW::item<bool>, vapi::Gbp_endpoint_group_add_del>
{
public:
/**
@@ -66,7 +66,7 @@ private:
* A cmd class that deletes a GBP endpoint_group
*/
class delete_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Gbp_endpoint_group_add_del>
+ : public rpc_cmd<HW::item<bool>, vapi::Gbp_endpoint_group_add_del>
{
public:
/**
diff --git a/extras/vom/vom/gbp_recirc_cmds.cpp b/extras/vom/vom/gbp_recirc_cmds.cpp
index 757fcb99065..b14697c9f6f 100644
--- a/extras/vom/vom/gbp_recirc_cmds.cpp
+++ b/extras/vom/vom/gbp_recirc_cmds.cpp
@@ -49,9 +49,7 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
@@ -88,9 +86,7 @@ delete_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/gbp_recirc_cmds.hpp b/extras/vom/vom/gbp_recirc_cmds.hpp
index fe17834ebf5..3c25d4495ca 100644
--- a/extras/vom/vom/gbp_recirc_cmds.hpp
+++ b/extras/vom/vom/gbp_recirc_cmds.hpp
@@ -27,8 +27,7 @@ namespace gbp_recirc_cmds {
/**
* A command class that creates or updates the GBP recirc
*/
-class create_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Gbp_recirc_add_del>
+class create_cmd : public rpc_cmd<HW::item<bool>, vapi::Gbp_recirc_add_del>
{
public:
/**
@@ -63,8 +62,7 @@ private:
/**
* A cmd class that deletes a GBP recirc
*/
-class delete_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Gbp_recirc_add_del>
+class delete_cmd : public rpc_cmd<HW::item<bool>, vapi::Gbp_recirc_add_del>
{
public:
/**
diff --git a/extras/vom/vom/gbp_subnet_cmds.cpp b/extras/vom/vom/gbp_subnet_cmds.cpp
index d087e5c67d8..3816a596e6d 100644
--- a/extras/vom/vom/gbp_subnet_cmds.cpp
+++ b/extras/vom/vom/gbp_subnet_cmds.cpp
@@ -57,9 +57,7 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
@@ -105,9 +103,7 @@ delete_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/gbp_subnet_cmds.hpp b/extras/vom/vom/gbp_subnet_cmds.hpp
index 3dbc8db2359..118303b7178 100644
--- a/extras/vom/vom/gbp_subnet_cmds.hpp
+++ b/extras/vom/vom/gbp_subnet_cmds.hpp
@@ -27,8 +27,7 @@ namespace gbp_subnet_cmds {
/**
* A command class that creates or updates the GBP subnet
*/
-class create_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Gbp_subnet_add_del>
+class create_cmd : public rpc_cmd<HW::item<bool>, vapi::Gbp_subnet_add_del>
{
public:
/**
@@ -67,8 +66,7 @@ private:
/**
* A cmd class that deletes a GBP subnet
*/
-class delete_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Gbp_subnet_add_del>
+class delete_cmd : public rpc_cmd<HW::item<bool>, vapi::Gbp_subnet_add_del>
{
public:
/**
diff --git a/extras/vom/vom/hw_cmds.cpp b/extras/vom/vom/hw_cmds.cpp
index e628c354d71..429c123e9e9 100644
--- a/extras/vom/vom/hw_cmds.cpp
+++ b/extras/vom/vom/hw_cmds.cpp
@@ -30,9 +30,7 @@ poll::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return (rc_t::OK);
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/hw_cmds.hpp b/extras/vom/vom/hw_cmds.hpp
index b499ccecca0..c10f71e524c 100644
--- a/extras/vom/vom/hw_cmds.hpp
+++ b/extras/vom/vom/hw_cmds.hpp
@@ -27,7 +27,7 @@ namespace hw_cmds {
/**
*A command poll the HW for liveness
*/
-class poll : public rpc_cmd<HW::item<bool>, rc_t, vapi::Control_ping>
+class poll : public rpc_cmd<HW::item<bool>, vapi::Control_ping>
{
public:
/**
diff --git a/extras/vom/vom/interface.hpp b/extras/vom/vom/interface.hpp
index 92e14a791d6..a46b114833e 100644
--- a/extras/vom/vom/interface.hpp
+++ b/extras/vom/vom/interface.hpp
@@ -115,6 +115,16 @@ public:
const static type_t BOND;
/**
+ * pipe-parent type
+ */
+ const static type_t PIPE;
+
+ /**
+ * pipe-end type
+ */
+ const static type_t PIPE_END;
+
+ /**
* Convert VPP's name of the interface to a type
*/
static type_t from_string(const std::string& str);
@@ -271,11 +281,11 @@ public:
* A base class for interface Create commands
*/
template <typename MSG>
- class create_cmd : public rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>
+ class create_cmd : public rpc_cmd<HW::item<handle_t>, MSG>
{
public:
create_cmd(HW::item<handle_t>& item, const std::string& name)
- : rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>(item)
+ : rpc_cmd<HW::item<handle_t>, MSG>(item)
, m_name(name)
{
}
@@ -298,7 +308,7 @@ public:
*/
void succeeded()
{
- rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>::succeeded();
+ rpc_cmd<HW::item<handle_t>, MSG>::succeeded();
interface::add(m_name, this->item());
}
@@ -321,9 +331,7 @@ public:
handle = sw_if_index;
}
- HW::item<handle_t> res(handle, rc);
-
- this->fulfill(res);
+ this->fulfill(HW::item<handle_t>(handle, rc));
return (VAPI_OK);
}
@@ -339,17 +347,17 @@ public:
* Base class for intterface Delete commands
*/
template <typename MSG>
- class delete_cmd : public rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>
+ class delete_cmd : public rpc_cmd<HW::item<handle_t>, MSG>
{
public:
delete_cmd(HW::item<handle_t>& item, const std::string& name)
- : rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>(item)
+ : rpc_cmd<HW::item<handle_t>, MSG>(item)
, m_name(name)
{
}
delete_cmd(HW::item<handle_t>& item)
- : rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>(item)
+ : rpc_cmd<HW::item<handle_t>, MSG>(item)
, m_name()
{
}
@@ -471,6 +479,7 @@ protected:
*/
void set(const handle_t& handle);
friend class interface_factory;
+ friend class pipe;
/**
* The SW interface handle VPP has asigned to the interface
diff --git a/extras/vom/vom/interface_cmds.cpp b/extras/vom/vom/interface_cmds.cpp
index e78ed46272d..9e2772584c0 100644
--- a/extras/vom/vom/interface_cmds.cpp
+++ b/extras/vom/vom/interface_cmds.cpp
@@ -37,7 +37,7 @@ loopback_create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item = wait();
+ wait();
if (m_hw_item.rc() == rc_t::OK) {
insert_interface();
@@ -74,7 +74,7 @@ af_packet_create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item = wait();
+ wait();
if (m_hw_item.rc() == rc_t::OK) {
insert_interface();
@@ -120,7 +120,7 @@ vhost_create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item = wait();
+ wait();
if (m_hw_item.rc() == rc_t::OK) {
insert_interface();
@@ -257,9 +257,7 @@ state_change_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
@@ -299,9 +297,7 @@ set_table_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return (rc_t::OK);
+ return (wait());
}
std::string
@@ -338,9 +334,7 @@ set_mac_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return (rc_t::OK);
+ return (wait());
}
std::string
@@ -380,9 +374,7 @@ collect_detail_stats_change_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return (rc_t::OK);
+ return (wait());
}
std::string
@@ -691,9 +683,7 @@ set_tag::issue(connection& con)
VAPI_CALL(req.execute());
- wait();
-
- return rc_t::OK;
+ return (wait());
}
std::string
set_tag::to_string() const
diff --git a/extras/vom/vom/interface_cmds.hpp b/extras/vom/vom/interface_cmds.hpp
index 1d0c4f543bc..b646e4ec9b8 100644
--- a/extras/vom/vom/interface_cmds.hpp
+++ b/extras/vom/vom/interface_cmds.hpp
@@ -177,7 +177,7 @@ public:
* A command class to set tag on interfaces
*/
class set_tag
- : public rpc_cmd<HW::item<handle_t>, rc_t, vapi::Sw_interface_tag_add_del>
+ : public rpc_cmd<HW::item<handle_t>, vapi::Sw_interface_tag_add_del>
{
public:
/**
@@ -211,7 +211,6 @@ private:
* A cmd class that changes the admin state
*/
class state_change_cmd : public rpc_cmd<HW::item<interface::admin_state_t>,
- rc_t,
vapi::Sw_interface_set_flags>
{
public:
@@ -246,9 +245,8 @@ private:
/**
* A command class that binds an interface to an L3 table
*/
-class set_table_cmd : public rpc_cmd<HW::item<route::table_id_t>,
- rc_t,
- vapi::Sw_interface_set_table>
+class set_table_cmd
+ : public rpc_cmd<HW::item<route::table_id_t>, vapi::Sw_interface_set_table>
{
public:
/**
@@ -289,9 +287,8 @@ private:
/**
* A command class that changes the MAC address on an interface
*/
-class set_mac_cmd : public rpc_cmd<HW::item<l2_address_t>,
- rc_t,
- vapi::Sw_interface_set_mac_address>
+class set_mac_cmd
+ : public rpc_cmd<HW::item<l2_address_t>, vapi::Sw_interface_set_mac_address>
{
public:
/**
@@ -327,7 +324,6 @@ private:
*/
class collect_detail_stats_change_cmd
: public rpc_cmd<HW::item<interface::stats_type_t>,
- rc_t,
vapi::Collect_detailed_interface_stats>
{
public:
@@ -474,9 +470,7 @@ private:
* A command class represents our desire to recieve interface stats
*/
class stats_disable_cmd
- : public rpc_cmd<HW::item<bool>,
- rc_t,
- vapi::Want_per_interface_combined_stats>
+ : public rpc_cmd<HW::item<bool>, vapi::Want_per_interface_combined_stats>
{
public:
/**
diff --git a/extras/vom/vom/interface_factory.cpp b/extras/vom/vom/interface_factory.cpp
index c417c1cc3de..f4425130a4e 100644
--- a/extras/vom/vom/interface_factory.cpp
+++ b/extras/vom/vom/interface_factory.cpp
@@ -79,6 +79,12 @@ interface_factory::new_interface(const vapi_payload_sw_interface_details& vd)
sp = interface::find(hdl);
if (sp && !tag.empty())
sp->set(tag);
+ } else if (interface::type_t::PIPE == type) {
+ /*
+ * there's not enough information in a SW interface record to
+ * construct a pipe. so skip it. They have
+ * their own dump routines
+ */
} else if ((name.find(".") != std::string::npos) && (0 != vd.sub_id)) {
/*
* Sub-interface
@@ -228,6 +234,24 @@ interface_factory::new_bond_member_interface(
bond_member bm(*itf, mode, rate);
return (bm);
}
+
+std::shared_ptr<pipe>
+interface_factory::new_pipe_interface(const vapi_payload_pipe_details& payload)
+{
+ std::shared_ptr<pipe> sp;
+
+ handle_t hdl(payload.sw_if_index);
+ pipe::handle_pair_t hdl_pair(payload.pipe_sw_if_index[0],
+ payload.pipe_sw_if_index[1]);
+
+ sp = pipe(payload.instance, interface::admin_state_t::UP).singular();
+
+ sp->set(hdl);
+ sp->set_ends(hdl_pair);
+
+ return (sp);
+}
+
}; // namespace VOM
/*
diff --git a/extras/vom/vom/interface_factory.hpp b/extras/vom/vom/interface_factory.hpp
index 1bb60a899f0..120816bddba 100644
--- a/extras/vom/vom/interface_factory.hpp
+++ b/extras/vom/vom/interface_factory.hpp
@@ -18,13 +18,16 @@
#include <vapi/vapi.hpp>
+#include "vom/bond_interface.hpp"
#include "vom/bond_member.hpp"
#include "vom/interface.hpp"
+#include "vom/pipe.hpp"
#include "vom/tap_interface.hpp"
#include <vapi/af_packet.api.vapi.hpp>
#include <vapi/bond.api.vapi.hpp>
#include <vapi/interface.api.vapi.hpp>
+#include <vapi/pipe.api.vapi.hpp>
#include <vapi/tap.api.vapi.hpp>
#include <vapi/tapv2.api.vapi.hpp>
#include <vapi/vhost_user.api.vapi.hpp>
@@ -57,6 +60,9 @@ public:
static bond_member new_bond_member_interface(
const vapi_payload_sw_interface_slave_details& vd);
+
+ static std::shared_ptr<pipe> new_pipe_interface(
+ const vapi_payload_pipe_details& payload);
};
};
diff --git a/extras/vom/vom/interface_ip6_nd.hpp b/extras/vom/vom/interface_ip6_nd.hpp
index 22f545acdbb..fa5a479248c 100644
--- a/extras/vom/vom/interface_ip6_nd.hpp
+++ b/extras/vom/vom/interface_ip6_nd.hpp
@@ -131,14 +131,14 @@ public:
/**
* A functor class that binds the ra config to the interface
*/
- class config_cmd : public rpc_cmd<HW::item<bool>, rc_t, CMD>
+ class config_cmd : public rpc_cmd<HW::item<bool>, CMD>
{
public:
/**
* Constructor
*/
config_cmd(HW::item<bool>& item, const handle_t& itf, const class_t& cls)
- : rpc_cmd<HW::item<bool>, rc_t, CMD>(item)
+ : rpc_cmd<HW::item<bool>, CMD>(item)
, m_itf(itf)
, m_cls(cls)
{
@@ -184,14 +184,14 @@ public:
/**
* A cmd class that Unbinds L3 Config from an interface
*/
- class unconfig_cmd : public rpc_cmd<HW::item<bool>, rc_t, CMD>
+ class unconfig_cmd : public rpc_cmd<HW::item<bool>, CMD>
{
public:
/**
* Constructor
*/
unconfig_cmd(HW::item<bool>& item, const handle_t& itf, const class_t& cls)
- : rpc_cmd<HW::item<bool>, rc_t, CMD>(item)
+ : rpc_cmd<HW::item<bool>, CMD>(item)
, m_itf(itf)
, m_cls(cls)
{
diff --git a/extras/vom/vom/interface_ip6_nd_cmds.cpp b/extras/vom/vom/interface_ip6_nd_cmds.cpp
index c6f53f04919..b8909637644 100644
--- a/extras/vom/vom/interface_ip6_nd_cmds.cpp
+++ b/extras/vom/vom/interface_ip6_nd_cmds.cpp
@@ -31,9 +31,7 @@ ip6nd_ra_config::config_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
template <>
@@ -68,9 +66,7 @@ ip6nd_ra_prefix::config_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
template <>
diff --git a/extras/vom/vom/interface_span_cmds.cpp b/extras/vom/vom/interface_span_cmds.cpp
index 3b8b8d25ec7..72bd6100bc0 100644
--- a/extras/vom/vom/interface_span_cmds.cpp
+++ b/extras/vom/vom/interface_span_cmds.cpp
@@ -51,9 +51,7 @@ config_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/interface_span_cmds.hpp b/extras/vom/vom/interface_span_cmds.hpp
index fa8096ebb10..e83ed728fb1 100644
--- a/extras/vom/vom/interface_span_cmds.hpp
+++ b/extras/vom/vom/interface_span_cmds.hpp
@@ -29,7 +29,7 @@ namespace interface_span_cmds {
* A command class that configures the interface span
*/
class config_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_span_enable_disable>
+ : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_span_enable_disable>
{
public:
/**
@@ -73,7 +73,7 @@ private:
* A cmd class that Unconfigs interface span
*/
class unconfig_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_span_enable_disable>
+ : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_span_enable_disable>
{
public:
/**
diff --git a/extras/vom/vom/interface_types.cpp b/extras/vom/vom/interface_types.cpp
index b20a3857146..73400373743 100644
--- a/extras/vom/vom/interface_types.cpp
+++ b/extras/vom/vom/interface_types.cpp
@@ -29,6 +29,8 @@ const interface::type_t interface::type_t::TAP(7, "TAP");
const interface::type_t interface::type_t::TAPV2(8, "TAPV2");
const interface::type_t interface::type_t::VHOST(9, "VHOST");
const interface::type_t interface::type_t::BOND(10, "Bond");
+const interface::type_t interface::type_t::PIPE(11, "Pipe");
+const interface::type_t interface::type_t::PIPE_END(12, "Pipe-end");
const interface::oper_state_t interface::oper_state_t::DOWN(0, "down");
const interface::oper_state_t interface::oper_state_t::UP(1, "up");
@@ -66,6 +68,8 @@ interface::type_t::from_string(const std::string& str)
return interface::type_t::TAPV2;
} else if (str.find("bvi") != std::string::npos) {
return interface::type_t::BVI;
+ } else if (str.find("pipe") != std::string::npos) {
+ return interface::type_t::PIPE;
}
return interface::type_t::UNKNOWN;
diff --git a/extras/vom/vom/ip_unnumbered_cmds.cpp b/extras/vom/vom/ip_unnumbered_cmds.cpp
index fa7a1150cc4..227a1509e7e 100644
--- a/extras/vom/vom/ip_unnumbered_cmds.cpp
+++ b/extras/vom/vom/ip_unnumbered_cmds.cpp
@@ -47,9 +47,7 @@ config_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/ip_unnumbered_cmds.hpp b/extras/vom/vom/ip_unnumbered_cmds.hpp
index 40030139b8c..fdd00520404 100644
--- a/extras/vom/vom/ip_unnumbered_cmds.hpp
+++ b/extras/vom/vom/ip_unnumbered_cmds.hpp
@@ -29,7 +29,7 @@ namespace ip_unnumbered_cmds {
*A command class that configures the IP unnumbered
*/
class config_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_set_unnumbered>
+ : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_set_unnumbered>
{
public:
/**
@@ -66,7 +66,7 @@ private:
* A cmd class that Unconfigs L3 Config from an interface
*/
class unconfig_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_set_unnumbered>
+ : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_set_unnumbered>
{
public:
/**
diff --git a/extras/vom/vom/l2_binding_cmds.cpp b/extras/vom/vom/l2_binding_cmds.cpp
index 0f91e4b3b7a..c072f67fd56 100644
--- a/extras/vom/vom/l2_binding_cmds.cpp
+++ b/extras/vom/vom/l2_binding_cmds.cpp
@@ -49,9 +49,7 @@ bind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return (rc_t::OK);
+ return (wait());
}
std::string
@@ -142,9 +140,7 @@ set_vtr_op_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- wait();
-
- return (rc_t::OK);
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/l2_binding_cmds.hpp b/extras/vom/vom/l2_binding_cmds.hpp
index d105c18a40d..3d138b1d1af 100644
--- a/extras/vom/vom/l2_binding_cmds.hpp
+++ b/extras/vom/vom/l2_binding_cmds.hpp
@@ -29,7 +29,7 @@ namespace l2_binding_cmds {
* A functor class that binds L2 configuration to an interface
*/
class bind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_set_l2_bridge>
+ : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_set_l2_bridge>
{
public:
/**
@@ -72,7 +72,7 @@ private:
* A cmd class that Unbinds L2 configuration from an interface
*/
class unbind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_set_l2_bridge>
+ : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_set_l2_bridge>
{
public:
/**
@@ -118,7 +118,6 @@ private:
* A cmd class sets the VTR operation
*/
class set_vtr_op_cmd : public rpc_cmd<HW::item<l2_binding::l2_vtr_op_t>,
- rc_t,
vapi::L2_interface_vlan_tag_rewrite>
{
public:
diff --git a/extras/vom/vom/l2_emulation_cmds.cpp b/extras/vom/vom/l2_emulation_cmds.cpp
index 27f84830191..fac764a1c66 100644
--- a/extras/vom/vom/l2_emulation_cmds.cpp
+++ b/extras/vom/vom/l2_emulation_cmds.cpp
@@ -42,9 +42,7 @@ enable_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return (rc_t::OK);
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/l2_emulation_cmds.hpp b/extras/vom/vom/l2_emulation_cmds.hpp
index aeff3a8ddd7..aab4af51faa 100644
--- a/extras/vom/vom/l2_emulation_cmds.hpp
+++ b/extras/vom/vom/l2_emulation_cmds.hpp
@@ -27,7 +27,7 @@ namespace l2_emulation_cmds {
/**
* A functor class that enable L2 emulation to an interface
*/
-class enable_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::L2_emulation>
+class enable_cmd : public rpc_cmd<HW::item<bool>, vapi::L2_emulation>
{
public:
/**
@@ -59,7 +59,7 @@ private:
/**
* A cmd class that Unbinds L2 configuration from an interface
*/
-class disable_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::L2_emulation>
+class disable_cmd : public rpc_cmd<HW::item<bool>, vapi::L2_emulation>
{
public:
/**
diff --git a/extras/vom/vom/l2_xconnect_cmds.cpp b/extras/vom/vom/l2_xconnect_cmds.cpp
index dc2c40c3b46..37eca9ecfc8 100644
--- a/extras/vom/vom/l2_xconnect_cmds.cpp
+++ b/extras/vom/vom/l2_xconnect_cmds.cpp
@@ -44,7 +44,7 @@ bind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
+ wait();
return (rc_t::OK);
}
diff --git a/extras/vom/vom/l2_xconnect_cmds.hpp b/extras/vom/vom/l2_xconnect_cmds.hpp
index fbb869f025b..db0e721453f 100644
--- a/extras/vom/vom/l2_xconnect_cmds.hpp
+++ b/extras/vom/vom/l2_xconnect_cmds.hpp
@@ -30,7 +30,7 @@ namespace l2_xconnect_cmds {
* A functor class that binds L2 configuration to an interface
*/
class bind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_set_l2_xconnect>
+ : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_set_l2_xconnect>
{
public:
/**
@@ -70,7 +70,7 @@ private:
* A cmd class that Unbinds L2 configuration from an interface
*/
class unbind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_set_l2_xconnect>
+ : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_set_l2_xconnect>
{
public:
/**
diff --git a/extras/vom/vom/l3_binding_cmds.cpp b/extras/vom/vom/l3_binding_cmds.cpp
index 66691f86059..4afe13e1076 100644
--- a/extras/vom/vom/l3_binding_cmds.cpp
+++ b/extras/vom/vom/l3_binding_cmds.cpp
@@ -48,9 +48,7 @@ bind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/l3_binding_cmds.hpp b/extras/vom/vom/l3_binding_cmds.hpp
index 1387bc47f5d..b7a30f8865c 100644
--- a/extras/vom/vom/l3_binding_cmds.hpp
+++ b/extras/vom/vom/l3_binding_cmds.hpp
@@ -30,7 +30,7 @@ namespace l3_binding_cmds {
* A functor class that binds the L3 config to the interface
*/
class bind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_add_del_address>
+ : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_add_del_address>
{
public:
/**
@@ -70,7 +70,7 @@ private:
* A cmd class that Unbinds L3 Config from an interface
*/
class unbind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_add_del_address>
+ : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_add_del_address>
{
public:
/**
diff --git a/extras/vom/vom/lldp_binding_cmds.cpp b/extras/vom/vom/lldp_binding_cmds.cpp
index 7dacdafe20f..8c27579a643 100644
--- a/extras/vom/vom/lldp_binding_cmds.cpp
+++ b/extras/vom/vom/lldp_binding_cmds.cpp
@@ -49,9 +49,7 @@ bind_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/lldp_binding_cmds.hpp b/extras/vom/vom/lldp_binding_cmds.hpp
index b3038017e06..77ba8ee90e7 100644
--- a/extras/vom/vom/lldp_binding_cmds.hpp
+++ b/extras/vom/vom/lldp_binding_cmds.hpp
@@ -28,8 +28,7 @@ namespace lldp_binding_cmds {
/**
*A command class that binds the LLDP config to the interface
*/
-class bind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_set_lldp>
+class bind_cmd : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_set_lldp>
{
public:
/**
@@ -68,8 +67,7 @@ private:
/**
* A cmd class that Unbinds Lldp Config from an interface
*/
-class unbind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_set_lldp>
+class unbind_cmd : public rpc_cmd<HW::item<bool>, vapi::Sw_interface_set_lldp>
{
public:
/**
diff --git a/extras/vom/vom/lldp_global_cmds.cpp b/extras/vom/vom/lldp_global_cmds.cpp
index 8237114f789..7ea9b7895ea 100644
--- a/extras/vom/vom/lldp_global_cmds.cpp
+++ b/extras/vom/vom/lldp_global_cmds.cpp
@@ -48,9 +48,7 @@ config_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/lldp_global_cmds.hpp b/extras/vom/vom/lldp_global_cmds.hpp
index 621e73ff71d..732c700062f 100644
--- a/extras/vom/vom/lldp_global_cmds.hpp
+++ b/extras/vom/vom/lldp_global_cmds.hpp
@@ -28,7 +28,7 @@ namespace lldp_global_cmds {
/**
* A command class that binds the LLDP global to the interface
*/
-class config_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::Lldp_config>
+class config_cmd : public rpc_cmd<HW::item<bool>, vapi::Lldp_config>
{
public:
/**
diff --git a/extras/vom/vom/nat_binding_cmds.cpp b/extras/vom/vom/nat_binding_cmds.cpp
index 4d98268249a..d67a0828003 100644
--- a/extras/vom/vom/nat_binding_cmds.cpp
+++ b/extras/vom/vom/nat_binding_cmds.cpp
@@ -44,9 +44,7 @@ bind_44_input_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
@@ -86,9 +84,7 @@ unbind_44_input_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
@@ -128,9 +124,7 @@ bind_44_output_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
@@ -170,9 +164,7 @@ unbind_44_output_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
@@ -276,7 +268,7 @@ bind_66_input_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
+ wait();
return rc_t::OK;
}
@@ -318,7 +310,7 @@ unbind_66_input_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
+ wait();
return rc_t::OK;
}
diff --git a/extras/vom/vom/nat_binding_cmds.hpp b/extras/vom/vom/nat_binding_cmds.hpp
index aa5a200515e..9b59d0dbd2c 100644
--- a/extras/vom/vom/nat_binding_cmds.hpp
+++ b/extras/vom/vom/nat_binding_cmds.hpp
@@ -28,7 +28,7 @@ namespace nat_binding_cmds {
* A functor class that binds a NAT configuration to an input interface
*/
class bind_44_input_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Nat44_interface_add_del_feature>
+ : public rpc_cmd<HW::item<bool>, vapi::Nat44_interface_add_del_feature>
{
public:
/**
@@ -68,7 +68,7 @@ private:
* A cmd class that unbinds a NAT configuration from an input interface
*/
class unbind_44_input_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Nat44_interface_add_del_feature>
+ : public rpc_cmd<HW::item<bool>, vapi::Nat44_interface_add_del_feature>
{
public:
/**
@@ -108,9 +108,7 @@ private:
* A functor class that binds a NAT configuration to an output interface
*/
class bind_44_output_cmd
- : public rpc_cmd<HW::item<bool>,
- rc_t,
- vapi::Nat44_interface_add_del_output_feature>
+ : public rpc_cmd<HW::item<bool>, vapi::Nat44_interface_add_del_output_feature>
{
public:
/**
@@ -150,9 +148,7 @@ private:
* A cmd class that unbinds a NAT configuration from an output interface
*/
class unbind_44_output_cmd
- : public rpc_cmd<HW::item<bool>,
- rc_t,
- vapi::Nat44_interface_add_del_output_feature>
+ : public rpc_cmd<HW::item<bool>, vapi::Nat44_interface_add_del_output_feature>
{
public:
/**
@@ -260,7 +256,7 @@ private:
* A functor class that binds a NAT configuration to an input interface
*/
class bind_66_input_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Nat66_add_del_interface>
+ : public rpc_cmd<HW::item<bool>, vapi::Nat66_add_del_interface>
{
public:
/**
@@ -300,7 +296,7 @@ private:
* A cmd class that unbinds a NAT configuration from an input interface
*/
class unbind_66_input_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Nat66_add_del_interface>
+ : public rpc_cmd<HW::item<bool>, vapi::Nat66_add_del_interface>
{
public:
/**
diff --git a/extras/vom/vom/nat_static_cmds.cpp b/extras/vom/vom/nat_static_cmds.cpp
index a80e47416ea..299f2f5f328 100644
--- a/extras/vom/vom/nat_static_cmds.cpp
+++ b/extras/vom/vom/nat_static_cmds.cpp
@@ -55,9 +55,7 @@ create_44_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
@@ -178,9 +176,7 @@ create_66_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/nat_static_cmds.hpp b/extras/vom/vom/nat_static_cmds.hpp
index 95061cae1ad..8d514d85771 100644
--- a/extras/vom/vom/nat_static_cmds.hpp
+++ b/extras/vom/vom/nat_static_cmds.hpp
@@ -28,7 +28,7 @@ namespace nat_static_cmds {
* A command class that creates NAT 44 static mapping
*/
class create_44_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Nat44_add_del_static_mapping>
+ : public rpc_cmd<HW::item<bool>, vapi::Nat44_add_del_static_mapping>
{
public:
/**
@@ -64,7 +64,7 @@ private:
* A cmd class that deletes a NAT 44 static mapping
*/
class delete_44_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Nat44_add_del_static_mapping>
+ : public rpc_cmd<HW::item<bool>, vapi::Nat44_add_del_static_mapping>
{
public:
/**
@@ -133,7 +133,7 @@ private:
* A command class that creates NAT 66 static mapping
*/
class create_66_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Nat66_add_del_static_mapping>
+ : public rpc_cmd<HW::item<bool>, vapi::Nat66_add_del_static_mapping>
{
public:
/**
@@ -169,7 +169,7 @@ private:
* A cmd class that deletes a NAT 66 static mapping
*/
class delete_66_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Nat66_add_del_static_mapping>
+ : public rpc_cmd<HW::item<bool>, vapi::Nat66_add_del_static_mapping>
{
public:
/**
diff --git a/extras/vom/vom/neighbour_cmds.cpp b/extras/vom/vom/neighbour_cmds.cpp
index 63534f3dd94..9bd32923379 100644
--- a/extras/vom/vom/neighbour_cmds.cpp
+++ b/extras/vom/vom/neighbour_cmds.cpp
@@ -49,9 +49,7 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/neighbour_cmds.hpp b/extras/vom/vom/neighbour_cmds.hpp
index fe6dd155cd9..388dbf1b7ba 100644
--- a/extras/vom/vom/neighbour_cmds.hpp
+++ b/extras/vom/vom/neighbour_cmds.hpp
@@ -27,8 +27,8 @@ namespace neighbour_cmds {
/**
* A command class that creates or updates the bridge domain ARP Entry
*/
-class create_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Ip_neighbor_add_del>
+class create_cmd : public rpc_cmd<HW::item<bool>,
+ vapi::Ip_neighbor_add_del>
{
public:
/**
@@ -63,8 +63,8 @@ private:
/**
* A cmd class that deletes a bridge domain ARP entry
*/
-class delete_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Ip_neighbor_add_del>
+class delete_cmd : public rpc_cmd<HW::item<bool>,
+ vapi::Ip_neighbor_add_del>
{
public:
/**
diff --git a/extras/vom/vom/pipe.cpp b/extras/vom/vom/pipe.cpp
new file mode 100644
index 00000000000..9e10aeb4ea6
--- /dev/null
+++ b/extras/vom/vom/pipe.cpp
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2017 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.
+ */
+
+#include "vom/pipe.hpp"
+#include "vom/interface_factory.hpp"
+#include "vom/pipe_cmds.hpp"
+#include "vom/singular_db_funcs.hpp"
+
+namespace VOM {
+
+typedef enum end_t_ {
+ EAST = 0,
+ WEST,
+} end_t;
+#define N_ENDS (WEST + 1)
+
+pipe::event_handler pipe::m_evh;
+
+static const std::string
+pipe_mk_name(uint32_t instance)
+{
+ return ("pipe" + std::to_string(instance));
+}
+
+/**
+ * Construct a new object matching the desried state
+ */
+pipe::pipe(uint32_t instance, admin_state_t state)
+ : interface(pipe_mk_name(instance), type_t::PIPE, state)
+ , m_instance(instance)
+{
+}
+
+pipe::~pipe()
+{
+ sweep();
+ release();
+}
+
+pipe::pipe(const pipe& o)
+ : interface(o)
+ , m_instance(o.m_instance)
+{
+}
+
+std::string
+pipe::to_string(void) const
+{
+ std::ostringstream s;
+
+ s << "[pipe: " << interface::to_string() << " instance:" << m_instance
+ << " ends:[" << m_hdl_pair.rc().to_string() << " "
+ << m_hdl_pair.data().first << ", " << m_hdl_pair.data().second << "]]";
+
+ return (s.str());
+}
+
+std::queue<cmd*>&
+pipe::mk_create_cmd(std::queue<cmd*>& q)
+{
+ q.push(new pipe_cmds::create_cmd(m_hdl, m_name, m_instance, m_hdl_pair));
+
+ return (q);
+}
+
+std::queue<cmd*>&
+pipe::mk_delete_cmd(std::queue<cmd*>& q)
+{
+ q.push(new pipe_cmds::delete_cmd(m_hdl, m_hdl_pair));
+
+ return (q);
+}
+
+std::shared_ptr<pipe>
+pipe::singular() const
+{
+ return std::dynamic_pointer_cast<pipe>(singular_i());
+}
+
+std::shared_ptr<interface>
+pipe::singular_i() const
+{
+ return m_db.find_or_add(key(), *this);
+}
+
+std::shared_ptr<pipe>
+pipe::find(const key_t& k)
+{
+ return std::dynamic_pointer_cast<pipe>(m_db.find(k));
+}
+
+std::shared_ptr<interface>
+pipe::west()
+{
+ if (!m_ends[WEST]) {
+ if (rc_t::OK == m_hdl_pair.rc()) {
+ m_ends[WEST] = pipe_end(*this, WEST).singular();
+ m_ends[WEST]->set(m_hdl_pair.data().first);
+ }
+ }
+
+ return (m_ends[WEST]);
+}
+
+std::shared_ptr<interface>
+pipe::east()
+{
+ if (!m_ends[EAST]) {
+ if (rc_t::OK == m_hdl_pair.rc()) {
+ m_ends[EAST] = pipe_end(*this, EAST).singular();
+ m_ends[EAST]->set(m_hdl_pair.data().first);
+ }
+ }
+
+ return (m_ends[EAST]);
+}
+
+pipe::pipe_end::pipe_end(const pipe& p, uint8_t id)
+ : interface(p.name() + "." + std::to_string(id),
+ interface::type_t::PIPE_END,
+ interface::admin_state_t::UP)
+ , m_pipe(p.singular())
+{
+}
+
+std::queue<cmd*>&
+pipe::pipe_end::mk_create_cmd(std::queue<cmd*>& q)
+{
+ return (q);
+}
+
+std::queue<cmd*>&
+pipe::pipe_end::mk_delete_cmd(std::queue<cmd*>& q)
+{
+ return (q);
+}
+
+void
+pipe::set_ends(const handle_pair_t& p)
+{
+ if (handle_t::INVALID != p.first && handle_t::INVALID != p.second) {
+ m_hdl_pair = { p, rc_t::OK };
+ } else {
+ m_hdl_pair = { p, rc_t::INVALID };
+ }
+}
+
+pipe::event_handler::event_handler()
+{
+ OM::register_listener(this);
+ inspect::register_handler({ "pipe" }, "pipes", this);
+}
+
+void
+pipe::event_handler::handle_replay()
+{
+ // m_db.replay();
+}
+
+void
+pipe::event_handler::handle_populate(const client_db::key_t& key)
+{
+ std::shared_ptr<pipe_cmds::dump_cmd> cmd =
+ std::make_shared<pipe_cmds::dump_cmd>();
+
+ HW::enqueue(cmd);
+ HW::write();
+
+ for (auto& record : *cmd) {
+ std::shared_ptr<pipe> sp;
+
+ sp = interface_factory::new_pipe_interface(record.get_payload());
+
+ VOM_LOG(log_level_t::DEBUG) << " pipe-dump: " << sp->to_string();
+ OM::commit(key, *sp);
+ }
+}
+
+dependency_t
+pipe::event_handler::order() const
+{
+ return (dependency_t::VIRTUAL_INTERFACE);
+}
+
+void
+pipe::event_handler::show(std::ostream& os)
+{
+ db_dump(m_db, os);
+}
+
+}; // namespace VOM
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "mozilla")
+ * End:
+ */
diff --git a/extras/vom/vom/pipe.hpp b/extras/vom/vom/pipe.hpp
new file mode 100644
index 00000000000..7da3a1f162a
--- /dev/null
+++ b/extras/vom/vom/pipe.hpp
@@ -0,0 +1,171 @@
+/*
+ * 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.
+ */
+
+#ifndef __VOM_PIPE_H__
+#define __VOM_PIPE_H__
+
+#include "vom/interface.hpp"
+
+namespace VOM {
+/**
+ * A Pipe interface.
+ * A pipe is composed for 3 'interfaces'.
+ * 1) the 'parent' interface - this is used as the 'key' for the pipe
+ * 2) the two 'ends' of the pipe - these are used to RX/TX packets
+ * form/to. The ends are retreivable using the east()/west() functions.
+ * The east and west end are exactly equivalent, they are merely
+ * named differently for logical purposes.
+ */
+class pipe : public interface
+{
+public:
+ typedef std::pair<handle_t, handle_t> handle_pair_t;
+
+ /**
+ * Construct a new object matching the desried state
+ */
+ pipe(uint32_t instance, admin_state_t state);
+
+ /**
+ * Destructor
+ */
+ ~pipe();
+
+ /**
+ * Copy Constructor
+ */
+ pipe(const pipe& o);
+
+ /**
+ * comparison operator - for UT
+ */
+ bool operator==(const pipe& s) const;
+
+ /**
+ * Return the matching 'singular instance' of the sub-interface
+ */
+ std::shared_ptr<pipe> singular() const;
+
+ /**
+ * Find a subinterface from its key
+ */
+ static std::shared_ptr<pipe> find(const key_t& k);
+
+ /**
+ * The interface that is the east end of the pipe
+ */
+ std::shared_ptr<interface> east();
+
+ /**
+ * The interface that is the west end of the pipe.
+ * The east and west end are exactly equivalent, they are merely
+ * named differently for logical purposes.
+ */
+ std::shared_ptr<interface> west();
+
+ virtual std::string to_string(void) const;
+
+ void set_ends(const handle_pair_t& p);
+
+private:
+ /**
+ * The interface type that forms the ends of the pipe
+ */
+ class pipe_end : public interface
+ {
+ public:
+ pipe_end(const pipe& p, uint8_t id);
+
+ private:
+ virtual std::queue<cmd*>& mk_create_cmd(std::queue<cmd*>& cmds);
+ virtual std::queue<cmd*>& mk_delete_cmd(std::queue<cmd*>& cmds);
+
+ std::shared_ptr<pipe> m_pipe;
+ };
+
+ /**
+*Class definition for listeners to OM events
+*/
+ class event_handler : public OM::listener, public inspect::command_handler
+ {
+ public:
+ event_handler();
+ virtual ~event_handler() = default;
+
+ /**
+ * Handle a populate event
+ */
+ void handle_populate(const client_db::key_t& key);
+
+ /**
+ * Handle a replay event
+ */
+ void handle_replay();
+
+ /**
+ * Show the object in the Singular DB
+ */
+ void show(std::ostream& os);
+
+ /**
+ * Get the sortable Id of the listener
+ */
+ dependency_t order() const;
+ };
+ static event_handler m_evh;
+
+ /**
+ * Return the matching 'instance' of the pipe
+ * over-ride from the base class
+ */
+ std::shared_ptr<interface> singular_i() const;
+
+ /**
+ * Virtual functions to construct an interface create commands.
+ */
+ virtual std::queue<cmd*>& mk_create_cmd(std::queue<cmd*>& cmds);
+
+ /**
+ * Virtual functions to construct an interface delete commands.
+ */
+ virtual std::queue<cmd*>& mk_delete_cmd(std::queue<cmd*>& cmds);
+
+ /**
+ * the handles that are set during the create command
+ */
+ HW::item<handle_pair_t> m_hdl_pair;
+
+ /**
+ * The ends of the pipe
+ */
+ std::shared_ptr<interface> m_ends[2];
+
+ /**
+ * Instance number
+ */
+ uint32_t m_instance;
+};
+
+}; // namespace VOM
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "mozilla")
+ * End:
+ */
+
+#endif
diff --git a/extras/vom/vom/pipe_cmds.cpp b/extras/vom/vom/pipe_cmds.cpp
new file mode 100644
index 00000000000..9215efe635f
--- /dev/null
+++ b/extras/vom/vom/pipe_cmds.cpp
@@ -0,0 +1,153 @@
+/*
+ * 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.
+ */
+
+#include "vom/pipe_cmds.hpp"
+
+DEFINE_VAPI_MSG_IDS_PIPE_API_JSON;
+
+namespace VOM {
+namespace pipe_cmds {
+
+create_cmd::create_cmd(HW::item<handle_t>& item,
+ const std::string& name,
+ uint32_t instance,
+ HW::item<pipe::handle_pair_t>& ends)
+ : interface::create_cmd<vapi::Pipe_create>(item, name)
+ , m_hdl_pair(ends)
+ , m_instance(instance)
+{
+}
+
+bool
+create_cmd::operator==(const create_cmd& other) const
+{
+ return (m_name == other.m_name);
+}
+
+vapi_error_e
+create_cmd::operator()(vapi::Pipe_create& reply)
+{
+ auto& payload = reply.get_response().get_payload();
+
+ VOM_LOG(log_level_t::DEBUG) << to_string() << " " << payload.retval;
+
+ const rc_t& rc = rc_t::from_vpp_retval(payload.retval);
+
+ m_hdl_pair = { pipe::handle_pair_t(payload.pipe_sw_if_index[0],
+ payload.pipe_sw_if_index[1]),
+ rc };
+
+ fulfill(HW::item<handle_t>(payload.sw_if_index, rc));
+
+ return (VAPI_OK);
+}
+rc_t
+create_cmd::issue(connection& con)
+{
+ msg_t req(con.ctx(), std::ref(*this));
+
+ auto& payload = req.get_request().get_payload();
+
+ payload.is_specified = 1;
+ payload.user_instance = m_instance;
+
+ VAPI_CALL(req.execute());
+
+ if (rc_t::OK == wait()) {
+ insert_interface();
+ }
+
+ return rc_t::OK;
+}
+
+std::string
+create_cmd::to_string() const
+{
+ std::ostringstream s;
+
+ s << "pipe-create: " << m_name << " instance:" << m_instance;
+
+ return (s.str());
+}
+
+delete_cmd::delete_cmd(HW::item<handle_t>& item,
+ HW::item<pipe::handle_pair_t>& end_pair)
+ : interface::delete_cmd<vapi::Pipe_delete>(item)
+ , m_hdl_pair(end_pair)
+{
+}
+
+bool
+delete_cmd::operator==(const delete_cmd& other) const
+{
+ return (m_hw_item == other.m_hw_item);
+}
+
+rc_t
+delete_cmd::issue(connection& con)
+{
+ msg_t req(con.ctx(), std::ref(*this));
+
+ VAPI_CALL(req.execute());
+
+ wait();
+ m_hw_item.set(rc_t::NOOP);
+ m_hdl_pair.set(rc_t::NOOP);
+
+ remove_interface();
+
+ return (rc_t::OK);
+}
+
+std::string
+delete_cmd::to_string() const
+{
+ return ("pipe-delete");
+}
+
+bool
+dump_cmd::operator==(const dump_cmd& other) const
+{
+ return (true);
+}
+
+rc_t
+dump_cmd::issue(connection& con)
+{
+ m_dump.reset(new msg_t(con.ctx(), std::ref(*this)));
+
+ VAPI_CALL(m_dump->execute());
+
+ wait();
+
+ return rc_t::OK;
+}
+
+std::string
+dump_cmd::to_string() const
+{
+ return ("pipe-dump");
+}
+
+} // namespace pipe_cmds
+} // namespace VOM
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "mozilla")
+ * End:
+ */
diff --git a/extras/vom/vom/pipe_cmds.hpp b/extras/vom/vom/pipe_cmds.hpp
new file mode 100644
index 00000000000..8c26fd60fd3
--- /dev/null
+++ b/extras/vom/vom/pipe_cmds.hpp
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2017 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.
+ */
+
+#ifndef __VOM_PIPE_CMDS_H__
+#define __VOM_PIPE_CMDS_H__
+
+#include "vom/dump_cmd.hpp"
+#include "vom/pipe.hpp"
+#include "vom/rpc_cmd.hpp"
+
+#include <vapi/pipe.api.vapi.hpp>
+
+namespace VOM {
+namespace pipe_cmds {
+/**
+ * A functor class that creates an interface
+ */
+class create_cmd : public interface::create_cmd<vapi::Pipe_create>
+{
+public:
+ /**
+ * Cstrunctor taking the reference to the parent
+ * and the sub-interface's VLAN
+ */
+ create_cmd(HW::item<handle_t>& item,
+ const std::string& name,
+ uint32_t instance,
+ HW::item<pipe::handle_pair_t>& ends);
+
+ /**
+ * Issue the command to VPP/HW
+ */
+ rc_t issue(connection& con);
+
+ /**
+ * convert to string format for debug purposes
+ */
+ std::string to_string() const;
+
+ /**
+ * Comparison operator - only used for UT
+ */
+ bool operator==(const create_cmd& i) const;
+
+ virtual vapi_error_e operator()(vapi::Pipe_create& reply);
+
+private:
+ HW::item<pipe::handle_pair_t>& m_hdl_pair;
+ uint32_t m_instance;
+};
+
+/**
+ * A cmd class that Delete an interface
+ */
+class delete_cmd : public interface::delete_cmd<vapi::Pipe_delete>
+{
+public:
+ /**
+ * Constructor
+ */
+ delete_cmd(HW::item<handle_t>& item, HW::item<pipe::handle_pair_t>& end_pair);
+
+ /**
+ * Issue the command to VPP/HW
+ */
+ rc_t issue(connection& con);
+
+ /**
+ * convert to string format for debug purposes
+ */
+ std::string to_string() const;
+
+ /**
+ * Comparison operator - only used for UT
+ */
+ bool operator==(const delete_cmd& i) const;
+
+private:
+ HW::item<pipe::handle_pair_t>& m_hdl_pair;
+};
+
+/**
+ * A cmd class that Dumps all the Vpp interfaces
+ */
+class dump_cmd : public VOM::dump_cmd<vapi::Pipe_dump>
+{
+public:
+ /**
+ * Default Constructor
+ */
+ dump_cmd() = default;
+
+ /**
+ * Issue the command to VPP/HW
+ */
+ rc_t issue(connection& con);
+ /**
+ * convert to string format for debug purposes
+ */
+ std::string to_string() const;
+
+ /**
+ * Comparison operator - only used for UT
+ */
+ bool operator==(const dump_cmd& i) const;
+};
+
+}; // namespace pipe_cmds
+}; // namespace VOM
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "mozilla")
+ * End:
+ */
+
+#endif
diff --git a/extras/vom/vom/route_cmds.cpp b/extras/vom/vom/route_cmds.cpp
index 83d44ccc01d..240592f909f 100644
--- a/extras/vom/vom/route_cmds.cpp
+++ b/extras/vom/vom/route_cmds.cpp
@@ -100,9 +100,7 @@ update_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return rc_t::OK;
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/route_cmds.hpp b/extras/vom/vom/route_cmds.hpp
index f2c10ff60ad..2e6ce73068c 100644
--- a/extras/vom/vom/route_cmds.hpp
+++ b/extras/vom/vom/route_cmds.hpp
@@ -29,7 +29,7 @@ namespace ip_route_cmds {
/**
* A command class that creates or updates the route
*/
-class update_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::Ip_add_del_route>
+class update_cmd : public rpc_cmd<HW::item<bool>, vapi::Ip_add_del_route>
{
public:
/**
@@ -64,7 +64,7 @@ private:
/**
* A cmd class that deletes a route
*/
-class delete_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::Ip_add_del_route>
+class delete_cmd : public rpc_cmd<HW::item<bool>, vapi::Ip_add_del_route>
{
public:
/**
diff --git a/extras/vom/vom/route_domain_cmds.cpp b/extras/vom/vom/route_domain_cmds.cpp
index 845497f5989..9eb50436cc2 100644
--- a/extras/vom/vom/route_domain_cmds.cpp
+++ b/extras/vom/vom/route_domain_cmds.cpp
@@ -45,9 +45,7 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item.set(wait());
-
- return (rc_t::OK);
+ return (wait());
}
std::string
diff --git a/extras/vom/vom/route_domain_cmds.hpp b/extras/vom/vom/route_domain_cmds.hpp
index f3911bd59f0..6ac679bd343 100644
--- a/extras/vom/vom/route_domain_cmds.hpp
+++ b/extras/vom/vom/route_domain_cmds.hpp
@@ -27,7 +27,7 @@ namespace route_domain_cmds {
/**
* A command class that creates the IP table
*/
-class create_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::Ip_table_add_del>
+class create_cmd : public rpc_cmd<HW::item<bool>, vapi::Ip_table_add_del>
{
public:
/**
@@ -65,7 +65,7 @@ private:
/**
* A cmd class that Deletes the IP Table
*/
-class delete_cmd : public rpc_cmd<HW::item<bool>, rc_t, vapi::Ip_table_add_del>
+class delete_cmd : public rpc_cmd<HW::item<bool>, vapi::Ip_table_add_del>
{
public:
/**
diff --git a/extras/vom/vom/rpc_cmd.hpp b/extras/vom/vom/rpc_cmd.hpp
index 84b6717c53b..1996f4b3fbe 100644
--- a/extras/vom/vom/rpc_cmd.hpp
+++ b/extras/vom/vom/rpc_cmd.hpp
@@ -34,7 +34,7 @@ namespace VOM {
* The command is templatised on the type of the HW::item to be set by
* the command, and the data returned in the promise,
*/
-template <typename HWITEM, typename DATA, typename MSG>
+template <typename HWITEM, typename MSG>
class rpc_cmd : public cmd
{
public:
@@ -71,34 +71,27 @@ public:
/**
* Fulfill the commands promise. Called from the RX thread
*/
- void fulfill(const DATA& d)
- {
- m_promise.set_value(d);
-
- /*
- * we reset the promise after setting the value to reuse it
- * when we run the retire command from the same cmd object
- */
- // m_promise = std::promise<DATA>();
- }
+ void fulfill(const HWITEM& d) { m_promise.set_value(d); }
/**
* Wait on the commands promise. i.e. block on the completion
* of the command.
*/
- DATA wait()
+ rc_t wait()
{
std::future_status status;
- std::future<DATA> result;
+ std::future<HWITEM> result;
result = m_promise.get_future();
status = result.wait_for(std::chrono::seconds(5));
if (status != std::future_status::ready) {
- return (DATA(rc_t::TIMEOUT));
+ m_hw_item.set(rc_t::TIMEOUT);
+ } else {
+ m_hw_item = result.get();
}
- return (result.get());
+ return (m_hw_item.rc());
}
/**
@@ -116,9 +109,13 @@ public:
*/
virtual vapi_error_e operator()(MSG& reply)
{
+ HWITEM hi = m_hw_item;
int retval = reply.get_response().get_payload().retval;
VOM_LOG(log_level_t::DEBUG) << to_string() << " " << retval;
- fulfill(rc_t::from_vpp_retval(retval));
+
+ /* set a temporary value in this callback thread */
+ hi.set(rc_t::from_vpp_retval(retval));
+ fulfill(hi);
return (VAPI_OK);
}
@@ -137,7 +134,7 @@ protected:
/**
* The promise that implements the synchronous issue
*/
- std::promise<DATA> m_promise;
+ std::promise<HWITEM> m_promise;
};
};
diff --git a/extras/vom/vom/sub_interface_cmds.cpp b/extras/vom/vom/sub_interface_cmds.cpp
index 47af69268d1..853a9b63698 100644
--- a/extras/vom/vom/sub_interface_cmds.cpp
+++ b/extras/vom/vom/sub_interface_cmds.cpp
@@ -49,7 +49,7 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item = wait();
+ wait();
if (m_hw_item.rc() == rc_t::OK) {
insert_interface();
diff --git a/extras/vom/vom/tap_interface_cmds.cpp b/extras/vom/vom/tap_interface_cmds.cpp
index 763ded56bdc..4ebd2be4cf0 100644
--- a/extras/vom/vom/tap_interface_cmds.cpp
+++ b/extras/vom/vom/tap_interface_cmds.cpp
@@ -61,12 +61,12 @@ tap_create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item = wait();
+ wait();
if (m_hw_item.rc() == rc_t::OK) {
insert_interface();
}
- return rc_t::OK;
+ return (m_hw_item.rc());
}
std::string
diff --git a/extras/vom/vom/types.hpp b/extras/vom/vom/types.hpp
index 53654c51ac5..7b08d831352 100644
--- a/extras/vom/vom/types.hpp
+++ b/extras/vom/vom/types.hpp
@@ -53,15 +53,9 @@ enum class dependency_t
INTERFACE,
/**
- * bond group binding is after interfaces but before
- * anything else
+ * virtual interfaces - those that depend on some real interface
*/
- BOND_BINDING,
-
- /**
- * Tunnel or virtual interfaces next
- */
- TUNNEL,
+ VIRTUAL_INTERFACE,
/**
* Tables in which entries are added, e.g bridge/route-domains
@@ -89,8 +83,6 @@ enum class dependency_t
*/
struct rc_t : public enum_base<rc_t>
{
- rc_t(const rc_t& rc) = default;
-
/**
* Destructor
*/
diff --git a/extras/vom/vom/vxlan_tunnel.cpp b/extras/vom/vom/vxlan_tunnel.cpp
index 3d5ed64c5e0..9e7c01d01c6 100644
--- a/extras/vom/vom/vxlan_tunnel.cpp
+++ b/extras/vom/vom/vxlan_tunnel.cpp
@@ -246,7 +246,7 @@ vxlan_tunnel::event_handler::handle_replay()
dependency_t
vxlan_tunnel::event_handler::order() const
{
- return (dependency_t::TUNNEL);
+ return (dependency_t::VIRTUAL_INTERFACE);
}
void
diff --git a/extras/vom/vom/vxlan_tunnel_cmds.cpp b/extras/vom/vom/vxlan_tunnel_cmds.cpp
index ca4ccf3c38a..dcc06e71797 100644
--- a/extras/vom/vom/vxlan_tunnel_cmds.cpp
+++ b/extras/vom/vom/vxlan_tunnel_cmds.cpp
@@ -51,9 +51,9 @@ create_cmd::issue(connection& con)
VAPI_CALL(req.execute());
- m_hw_item = wait();
+ wait();
- if (m_hw_item) {
+ if (rc_t::OK == m_hw_item.rc()) {
insert_interface();
}
diff --git a/src/vnet/devices/pipe/pipe.api b/src/vnet/devices/pipe/pipe.api
index d3dfd16bcd4..55b93fdbd33 100644
--- a/src/vnet/devices/pipe/pipe.api
+++ b/src/vnet/devices/pipe/pipe.api
@@ -38,28 +38,28 @@ define pipe_create
/** \brief Reply for pipe create reply
@param context - returned sender context, to match reply w/ request
@param retval - return code
- @param parent_sw_if_index - software index allocated for the new pipe parent interface
- Use the parent interface for link up/down and to delete
+ @param sw_if_index - software index allocated for the new pipe parent interface
+ Use the parent interface for link up/down and to delete
@param pipe_sw_if_index - the two SW indicies that form the ends of the pipe.
*/
define pipe_create_reply
{
u32 context;
i32 retval;
- u32 parent_sw_if_index;
+ u32 sw_if_index;
u32 pipe_sw_if_index[2];
};
/** \brief Delete pipe interface
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
- @param parnet_sw_if_index - interface index of existing pipe interface
+ @param sw_if_index - interface index of existing pipe interface
*/
autoreply define pipe_delete
{
u32 client_index;
u32 context;
- u32 parent_sw_if_index;
+ u32 sw_if_index;
};
/** \brief Dump pipe interfaces request */
@@ -71,14 +71,14 @@ define pipe_dump
/** \brief Reply for pipe dump request
@param sw_if_index - software index of pipe interface
- @param parent_sw_if_index - software index allocated for the pipe parent interface
+ @param sw_if_index - software index allocated for the pipe parent interface
@param pipe_sw_if_index - the two SW indicies that form the ends of the pipe.
@param instance - instance allocated
*/
define pipe_details
{
u32 context;
- u32 parent_sw_if_index;
+ u32 sw_if_index;
u32 pipe_sw_if_index[2];
u32 instance;
};
diff --git a/src/vnet/devices/pipe/pipe_api.c b/src/vnet/devices/pipe/pipe_api.c
index 46bbea5f275..cb67d1f0404 100644
--- a/src/vnet/devices/pipe/pipe_api.c
+++ b/src/vnet/devices/pipe/pipe_api.c
@@ -59,7 +59,7 @@ vl_api_pipe_create_t_handler (vl_api_pipe_create_t * mp)
/* *INDENT-OFF* */
REPLY_MACRO2(VL_API_PIPE_CREATE_REPLY,
({
- rmp->parent_sw_if_index = ntohl (parent_sw_if_index);
+ rmp->sw_if_index = ntohl (parent_sw_if_index);
rmp->pipe_sw_if_index[0] = ntohl (pipe_sw_if_index[0]);
rmp->pipe_sw_if_index[1] = ntohl (pipe_sw_if_index[1]);
}));
@@ -72,7 +72,7 @@ vl_api_pipe_delete_t_handler (vl_api_pipe_delete_t * mp)
vl_api_pipe_delete_reply_t *rmp;
int rv;
- rv = vnet_delete_pipe_interface (ntohl (mp->parent_sw_if_index));
+ rv = vnet_delete_pipe_interface (ntohl (mp->sw_if_index));
REPLY_MACRO (VL_API_PIPE_DELETE_REPLY);
}
@@ -98,7 +98,7 @@ pipe_send_details (u32 parent_sw_if_index,
mp->context = ctx->context;
mp->instance = ntohl (instance);
- mp->parent_sw_if_index = ntohl (parent_sw_if_index);
+ mp->sw_if_index = ntohl (parent_sw_if_index);
mp->pipe_sw_if_index[0] = ntohl (pipe_sw_if_index[0]);
mp->pipe_sw_if_index[1] = ntohl (pipe_sw_if_index[1]);
diff --git a/test/ext/vom_test.cpp b/test/ext/vom_test.cpp
index 0213c42196e..5ccdf55f5da 100644
--- a/test/ext/vom_test.cpp
+++ b/test/ext/vom_test.cpp
@@ -67,6 +67,8 @@
#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;
@@ -427,6 +429,14 @@ public:
{
rc = handle_derived<interface_cmds::events_cmd>(f_exp, f_act);
}
+ else if (typeid(*f_exp) == typeid(pipe_cmds::create_cmd))
+ {
+ rc = handle_derived<pipe_cmds::create_cmd>(f_exp, f_act);
+ }
+ else if (typeid(*f_exp) == typeid(pipe_cmds::delete_cmd))
+ {
+ rc = handle_derived<pipe_cmds::delete_cmd>(f_exp, f_act);
+ }
else
{
throw ExpException(2);
@@ -1860,4 +1870,72 @@ BOOST_AUTO_TEST_CASE(test_prefixes) {
}
+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<handle_t> hw_hdl(4, rc_t::OK);
+ HW::item<pipe::handle_pair_t> hw_hdl_pair(std::make_pair(5,6), rc_t::OK);
+
+ HW::item<interface::admin_state_t> hw_as_up(interface::admin_state_t::UP,
+ rc_t::OK);
+ HW::item<interface::admin_state_t> 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<uint32_t> 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<bool> 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(), false));
+ TRY_CHECK_RC(OM::write(gk, *l2_1));
+
+ l2_binding *l2_2 = new l2_binding(*pipe1.west(), bd1);
+ HW::item<bool> 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(), false));
+ TRY_CHECK_RC(OM::write(gk, *l2_2));
+
+ STRICT_ORDER_OFF();
+
+ delete l2_1;
+ delete l2_2;
+ ADD_EXPECT(l2_binding_cmds::unbind_cmd(hw_l2_1_bind,
+ pipe1.east()->handle(),
+ hw_bd.data(),
+ false));
+ ADD_EXPECT(l2_binding_cmds::unbind_cmd(hw_l2_1_bind,
+ pipe1.west()->handle(),
+ hw_bd.data(),
+ false));
+ 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()
diff --git a/test/test_pipe.py b/test/test_pipe.py
index a89c1e90236..a2b630fc301 100644
--- a/test/test_pipe.py
+++ b/test/test_pipe.py
@@ -32,11 +32,11 @@ class VppPipe(VppInterface):
self.result = self._test.vapi.pipe_create(
0 if self.instance == 0xffffffff else 1,
self.instance)
- self.set_sw_if_index(self.result.parent_sw_if_index)
+ self.set_sw_if_index(self.result.sw_if_index)
def remove_vpp_config(self):
self._test.vapi.pipe_delete(
- self.result.parent_sw_if_index)
+ self.result.sw_if_index)
def __str__(self):
return self.object_id()
@@ -47,7 +47,7 @@ class VppPipe(VppInterface):
def query_vpp_config(self):
pipes = self._test.vapi.pipe_dump()
for p in pipes:
- if p.parent_sw_if_index == self.result.parent_sw_if_index:
+ if p.sw_if_index == self.result.sw_if_index:
return True
return False
@@ -78,9 +78,7 @@ class TestPipe(VppTestCase):
def test_pipe(self):
""" Pipes """
- pipes = []
- pipes.append(VppPipe(self))
- pipes.append(VppPipe(self, 10))
+ pipes = [VppPipe(self), VppPipe(self, 10)]
for p in pipes:
p.add_vpp_config()