VOM: vxlan-tunnel mcast interface fix
[vpp.git] / extras / vom / vom / vxlan_tunnel.cpp
index 2abff76..248aadf 100644 (file)
@@ -26,8 +26,8 @@ const std::string VXLAN_TUNNEL_NAME = "vxlan-tunnel-itf";
 vxlan_tunnel::event_handler vxlan_tunnel::m_evh;
 
 const vxlan_tunnel::mode_t vxlan_tunnel::mode_t::STANDARD(0, "standard");
-const vxlan_tunnel::mode_t vxlan_tunnel::mode_t::GBP(0, "GBP");
-const vxlan_tunnel::mode_t vxlan_tunnel::mode_t::GPE(0, "GPE");
+const vxlan_tunnel::mode_t vxlan_tunnel::mode_t::GBP(1, "GBP");
+const vxlan_tunnel::mode_t vxlan_tunnel::mode_t::GPE(2, "GPE");
 
 vxlan_tunnel::mode_t::mode_t(int v, const std::string s)
   : enum_base<vxlan_tunnel::mode_t>(v, s)
@@ -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())
 {
 }
 
@@ -98,7 +113,15 @@ vxlan_tunnel::vxlan_tunnel(const vxlan_tunnel& o)
   : interface(o)
   , m_tep(o.m_tep)
   , m_mode(o.m_mode)
+  , m_mcast_itf(o.m_mcast_itf)
+{
+}
+
+bool
+vxlan_tunnel::operator==(const vxlan_tunnel& other) const
 {
+  return ((m_tep == other.m_tep) && (m_mode == other.m_mode) &&
+          (m_mcast_itf == other.m_mcast_itf));
 }
 
 const handle_t&
@@ -130,9 +153,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)));
   }
 }
 
@@ -148,6 +175,8 @@ vxlan_tunnel::to_string() const
   std::ostringstream s;
   s << "vxlan-tunnel: " << m_hdl.to_string() << " " << m_mode.to_string() << " "
     << m_tep.to_string();
+  if (m_mcast_itf)
+    s << " " << m_mcast_itf->to_string();
 
   return (s.str());
 }
@@ -158,11 +187,15 @@ vxlan_tunnel::update(const vxlan_tunnel& desired)
   /*
    * the desired state is always that the interface should be created
    */
-  if (!m_hdl) {
+  if (rc_t::OK != m_hdl.rc()) {
     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)));
   }
 }