VOM: deprecate TAP add ip-punt redirect dump
[vpp.git] / extras / vom / vom / ip_punt_redirect.cpp
index 195b591..853546f 100644 (file)
@@ -14,6 +14,7 @@
  */
 
 #include "vom/ip_punt_redirect.hpp"
+#include "vom/api_types.hpp"
 #include "vom/ip_punt_redirect_cmds.hpp"
 #include "vom/singular_db_funcs.hpp"
 
@@ -34,6 +35,14 @@ ip_punt_redirect::ip_punt_redirect(const interface& rx_itf,
 {
 }
 
+ip_punt_redirect::ip_punt_redirect(const interface& tx_itf,
+                                   const boost::asio::ip::address& addr)
+  : m_rx_itf(nullptr)
+  , m_tx_itf(tx_itf.singular())
+  , m_addr(addr)
+{
+}
+
 ip_punt_redirect::ip_punt_redirect(const ip_punt_redirect& o)
   : m_rx_itf(o.m_rx_itf)
   , m_tx_itf(o.m_tx_itf)
@@ -47,7 +56,16 @@ ip_punt_redirect::~ip_punt_redirect()
   sweep();
 
   // not in the DB anymore.
-  m_db.release(m_rx_itf->key(), this);
+  m_db.release(key(), this);
+}
+
+const ip_punt_redirect::key_t
+ip_punt_redirect::key() const
+{
+  if (m_rx_itf)
+    return m_rx_itf->key();
+  else
+    return ("ALL");
 }
 
 void
@@ -55,7 +73,8 @@ ip_punt_redirect::sweep()
 {
   if (m_config) {
     HW::enqueue(new ip_punt_redirect_cmds::unconfig_cmd(
-      m_config, m_rx_itf->handle(), m_tx_itf->handle(), m_addr));
+      m_config, (m_rx_itf ? m_rx_itf->handle() : handle_t::INVALID),
+      m_tx_itf->handle(), m_addr));
   }
   HW::write();
 }
@@ -71,7 +90,8 @@ ip_punt_redirect::replay()
 {
   if (m_config) {
     HW::enqueue(new ip_punt_redirect_cmds::config_cmd(
-      m_config, m_rx_itf->handle(), m_tx_itf->handle(), m_addr));
+      m_config, (m_rx_itf ? m_rx_itf->handle() : handle_t::INVALID),
+      m_tx_itf->handle(), m_addr));
   }
 }
 
@@ -79,9 +99,9 @@ std::string
 ip_punt_redirect::to_string() const
 {
   std::ostringstream s;
-  s << "IP-punt-redirect-config:"
-    << " rx-itf:" << m_rx_itf->to_string()
-    << " tx-itf:" << m_tx_itf->to_string() << " next-hop:" << m_addr;
+  s << "IP-punt-redirect:"
+    << " rx-itf:" << key() << " tx-itf:" << m_tx_itf->to_string()
+    << " next-hop:" << m_addr;
 
   return (s.str());
 }
@@ -91,14 +111,15 @@ ip_punt_redirect::update(const ip_punt_redirect& desired)
 {
   if (!m_config) {
     HW::enqueue(new ip_punt_redirect_cmds::config_cmd(
-      m_config, m_rx_itf->handle(), m_tx_itf->handle(), m_addr));
+      m_config, (m_rx_itf ? m_rx_itf->handle() : handle_t::INVALID),
+      m_tx_itf->handle(), m_addr));
   }
 }
 
 std::shared_ptr<ip_punt_redirect>
 ip_punt_redirect::find_or_add(const ip_punt_redirect& temp)
 {
-  return (m_db.find_or_add(temp.m_rx_itf->key(), temp));
+  return (m_db.find_or_add(temp.key(), temp));
 }
 
 std::shared_ptr<ip_punt_redirect>
@@ -123,6 +144,35 @@ ip_punt_redirect::event_handler::handle_replay()
 void
 ip_punt_redirect::event_handler::handle_populate(const client_db::key_t& key)
 {
+  std::shared_ptr<ip_punt_redirect_cmds::dump_cmd> cmd =
+    std::make_shared<ip_punt_redirect_cmds::dump_cmd>();
+
+  HW::enqueue(cmd);
+  HW::write();
+
+  for (auto& record : *cmd) {
+    auto& payload = record.get_payload();
+
+    std::shared_ptr<interface> tx_itf =
+      interface::find(payload.punt.tx_sw_if_index);
+    std::shared_ptr<interface> rx_itf =
+      interface::find(payload.punt.rx_sw_if_index);
+    boost::asio::ip::address nh = from_api(payload.punt.nh);
+
+    VOM_LOG(log_level_t::DEBUG) << "data: [" << payload.punt.tx_sw_if_index
+                                << ", " << payload.punt.rx_sw_if_index << ", "
+                                << nh << "]";
+
+    if (rx_itf && tx_itf) {
+      ip_punt_redirect ipr(*rx_itf, *tx_itf, nh);
+      OM::commit(key, ipr);
+      VOM_LOG(log_level_t::DEBUG) << "read: " << ipr.to_string();
+    } else if (tx_itf) {
+      ip_punt_redirect ipr(*tx_itf, nh);
+      OM::commit(key, ipr);
+      VOM_LOG(log_level_t::DEBUG) << "read: " << ipr.to_string();
+    }
+  }
 }
 
 dependency_t