VOM: vxlan-tunnel takes egress interface for multicast
Change-Id: I23b44d883fbd7919bf55b96b180f97837fd6dae9 Signed-off-by: Neale Ranns <nranns@cisco.com>
This commit is contained in:
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
/*
|
||||
@ -220,6 +215,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
|
||||
*/
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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));
|
||||
|
||||
|
Reference in New Issue
Block a user