summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/vom/vom/vxlan_gbp_tunnel_cmds.cpp6
-rw-r--r--extras/vom/vom/vxlan_gbp_tunnel_cmds.hpp4
-rw-r--r--extras/vom/vom/vxlan_tunnel.cpp31
-rw-r--r--extras/vom/vom/vxlan_tunnel.hpp15
-rw-r--r--extras/vom/vom/vxlan_tunnel_cmds.cpp6
-rw-r--r--extras/vom/vom/vxlan_tunnel_cmds.hpp4
-rw-r--r--test/ext/vom_test.cpp3
7 files changed, 51 insertions, 18 deletions
diff --git a/extras/vom/vom/vxlan_gbp_tunnel_cmds.cpp b/extras/vom/vom/vxlan_gbp_tunnel_cmds.cpp
index 14470806665..a646eac34a0 100644
--- a/extras/vom/vom/vxlan_gbp_tunnel_cmds.cpp
+++ b/extras/vom/vom/vxlan_gbp_tunnel_cmds.cpp
@@ -23,9 +23,11 @@ namespace vxlan_gbp_tunnel_cmds {
create_cmd::create_cmd(HW::item<handle_t>& item,
const std::string& name,
- const vxlan_tunnel::endpoint_t& ep)
+ const vxlan_tunnel::endpoint_t& ep,
+ handle_t mcast_itf)
: interface::create_cmd<vapi::Vxlan_gbp_tunnel_add_del>(item, name)
, m_ep(ep)
+ , m_mcast_itf(mcast_itf)
{
}
@@ -46,7 +48,7 @@ create_cmd::issue(connection& con)
to_api(m_ep.src, payload.tunnel.src);
to_api(m_ep.src, payload.tunnel.dst);
- payload.tunnel.mcast_sw_if_index = ~0;
+ payload.tunnel.mcast_sw_if_index = m_mcast_itf.value();
payload.tunnel.encap_table_id = 0;
payload.tunnel.vni = m_ep.vni;
diff --git a/extras/vom/vom/vxlan_gbp_tunnel_cmds.hpp b/extras/vom/vom/vxlan_gbp_tunnel_cmds.hpp
index 34407f61bda..c7ec87245df 100644
--- a/extras/vom/vom/vxlan_gbp_tunnel_cmds.hpp
+++ b/extras/vom/vom/vxlan_gbp_tunnel_cmds.hpp
@@ -37,7 +37,8 @@ public:
*/
create_cmd(HW::item<handle_t>& item,
const std::string& name,
- const vxlan_tunnel::endpoint_t& ep);
+ const vxlan_tunnel::endpoint_t& ep,
+ handle_t mcast_itf);
/**
* Issue the command to VPP/HW
@@ -58,6 +59,7 @@ private:
* Enpoint values of the tunnel to be created
*/
const vxlan_tunnel::endpoint_t m_ep;
+ handle_t m_mcast_itf;
};
/**
diff --git a/extras/vom/vom/vxlan_tunnel.cpp b/extras/vom/vom/vxlan_tunnel.cpp
index 2abff7615eb..2bc386c1ba7 100644
--- a/extras/vom/vom/vxlan_tunnel.cpp
+++ b/extras/vom/vom/vxlan_tunnel.cpp
@@ -91,6 +91,21 @@ vxlan_tunnel::vxlan_tunnel(const boost::asio::ip::address& src,
interface::admin_state_t::UP)
, m_tep(src, dst, vni)
, m_mode(mode)
+ , m_mcast_itf()
+{
+}
+
+vxlan_tunnel::vxlan_tunnel(const boost::asio::ip::address& src,
+ const boost::asio::ip::address& dst,
+ uint32_t vni,
+ const interface& mcast_itf,
+ const mode_t& mode)
+ : interface(mk_name(src, dst, mode, vni),
+ interface::type_t::VXLAN,
+ interface::admin_state_t::UP)
+ , m_tep(src, dst, vni)
+ , m_mode(mode)
+ , m_mcast_itf(mcast_itf.singular())
{
}
@@ -130,9 +145,13 @@ vxlan_tunnel::replay()
{
if (m_hdl) {
if (mode_t::STANDARD == m_mode)
- HW::enqueue(new vxlan_tunnel_cmds::create_cmd(m_hdl, name(), m_tep));
+ HW::enqueue(new vxlan_tunnel_cmds::create_cmd(
+ m_hdl, name(), m_tep,
+ (m_mcast_itf ? m_mcast_itf->handle() : handle_t::INVALID)));
else if (mode_t::GBP == m_mode)
- HW::enqueue(new vxlan_gbp_tunnel_cmds::create_cmd(m_hdl, name(), m_tep));
+ HW::enqueue(new vxlan_gbp_tunnel_cmds::create_cmd(
+ m_hdl, name(), m_tep,
+ (m_mcast_itf ? m_mcast_itf->handle() : handle_t::INVALID)));
}
}
@@ -160,9 +179,13 @@ vxlan_tunnel::update(const vxlan_tunnel& desired)
*/
if (!m_hdl) {
if (mode_t::STANDARD == m_mode)
- HW::enqueue(new vxlan_tunnel_cmds::create_cmd(m_hdl, name(), m_tep));
+ HW::enqueue(new vxlan_tunnel_cmds::create_cmd(
+ m_hdl, name(), m_tep,
+ (m_mcast_itf ? m_mcast_itf->handle() : handle_t::INVALID)));
else if (mode_t::GBP == m_mode)
- HW::enqueue(new vxlan_gbp_tunnel_cmds::create_cmd(m_hdl, name(), m_tep));
+ HW::enqueue(new vxlan_gbp_tunnel_cmds::create_cmd(
+ m_hdl, name(), m_tep,
+ (m_mcast_itf ? m_mcast_itf->handle() : handle_t::INVALID)));
}
}
diff --git a/extras/vom/vom/vxlan_tunnel.hpp b/extras/vom/vom/vxlan_tunnel.hpp
index 136f0380e6d..63124e73426 100644
--- a/extras/vom/vom/vxlan_tunnel.hpp
+++ b/extras/vom/vom/vxlan_tunnel.hpp
@@ -97,15 +97,10 @@ public:
const boost::asio::ip::address& dst,
uint32_t vni,
const mode_t& mode = mode_t::STANDARD);
-
- /**
- * Construct a new object matching the desried state with a handle
- * read from VPP
- */
- vxlan_tunnel(const handle_t& hdl,
- const boost::asio::ip::address& src,
+ vxlan_tunnel(const boost::asio::ip::address& src,
const boost::asio::ip::address& dst,
uint32_t vni,
+ const interface& mcast_itf,
const mode_t& mode = mode_t::STANDARD);
/*
@@ -221,6 +216,12 @@ private:
mode_t m_mode;
/**
+ * The interface on which to send the packets if the destination
+ * is multicast
+ */
+ std::shared_ptr<interface> m_mcast_itf;
+
+ /**
* Construct a unique name for the tunnel
*/
static std::string mk_name(const boost::asio::ip::address& src,
diff --git a/extras/vom/vom/vxlan_tunnel_cmds.cpp b/extras/vom/vom/vxlan_tunnel_cmds.cpp
index dcc06e71797..e45b6046355 100644
--- a/extras/vom/vom/vxlan_tunnel_cmds.cpp
+++ b/extras/vom/vom/vxlan_tunnel_cmds.cpp
@@ -22,9 +22,11 @@ namespace vxlan_tunnel_cmds {
create_cmd::create_cmd(HW::item<handle_t>& item,
const std::string& name,
- const vxlan_tunnel::endpoint_t& ep)
+ const vxlan_tunnel::endpoint_t& ep,
+ handle_t mcast_itf)
: interface::create_cmd<vapi::Vxlan_add_del_tunnel>(item, name)
, m_ep(ep)
+ , m_mcast_itf(mcast_itf)
{
}
@@ -44,7 +46,7 @@ create_cmd::issue(connection& con)
payload.is_ipv6 = 0;
to_bytes(m_ep.src, &payload.is_ipv6, payload.src_address);
to_bytes(m_ep.dst, &payload.is_ipv6, payload.dst_address);
- payload.mcast_sw_if_index = ~0;
+ payload.mcast_sw_if_index = m_mcast_itf.value();
payload.encap_vrf_id = 0;
payload.decap_next_index = ~0;
payload.vni = m_ep.vni;
diff --git a/extras/vom/vom/vxlan_tunnel_cmds.hpp b/extras/vom/vom/vxlan_tunnel_cmds.hpp
index 4a8e5990391..423fcdac950 100644
--- a/extras/vom/vom/vxlan_tunnel_cmds.hpp
+++ b/extras/vom/vom/vxlan_tunnel_cmds.hpp
@@ -38,7 +38,8 @@ public:
*/
create_cmd(HW::item<handle_t>& item,
const std::string& name,
- const vxlan_tunnel::endpoint_t& ep);
+ const vxlan_tunnel::endpoint_t& ep,
+ handle_t mcast_itf);
/**
* Issue the command to VPP/HW
@@ -59,6 +60,7 @@ private:
* Enpoint values of the tunnel to be created
*/
const vxlan_tunnel::endpoint_t m_ep;
+ handle_t m_mcast_itf;
};
/**
diff --git a/test/ext/vom_test.cpp b/test/ext/vom_test.cpp
index f17d749f3f3..fa51c38215d 100644
--- a/test/ext/vom_test.cpp
+++ b/test/ext/vom_test.cpp
@@ -1156,7 +1156,8 @@ BOOST_AUTO_TEST_CASE(test_vxlan) {
vxlan_tunnel vxt(ep.src, ep.dst, ep.vni);
HW::item<handle_t> hw_vxt(3, rc_t::OK);
- ADD_EXPECT(vxlan_tunnel_cmds::create_cmd(hw_vxt, "don't-care", ep));
+ ADD_EXPECT(vxlan_tunnel_cmds::create_cmd(hw_vxt, "don't-care", ep,
+ handle_t::INVALID));
TRY_CHECK_RC(OM::write(franz, vxt));