Fixes for 'make UNATTENDED=yes CC=clang CXX=clang verify'
[vpp.git] / src / vpp-api / vom / bridge_domain_entry.cpp
index 7a1245b..241de95 100644 (file)
@@ -14,6 +14,8 @@
  */
 
 #include "vom/bridge_domain_entry.hpp"
+#include "vom/bridge_domain_entry_cmds.hpp"
+#include "vom/singular_db_funcs.hpp"
 
 namespace VOM {
 singular_db<bridge_domain_entry::key_t, bridge_domain_entry>
@@ -54,19 +56,32 @@ bridge_domain_entry::bridge_domain_entry(const bridge_domain_entry& bde)
 {
 }
 
+const bridge_domain_entry::key_t
+bridge_domain_entry::key() const
+{
+  return (std::make_pair(m_bd->key(), m_mac));
+}
+
+bool
+bridge_domain_entry::operator==(const bridge_domain_entry& bde) const
+{
+  return ((key() == bde.key()) && (m_tx_itf == bde.m_tx_itf));
+}
+
 bridge_domain_entry::~bridge_domain_entry()
 {
   sweep();
 
   // not in the DB anymore.
-  m_db.release(std::make_pair(m_bd->id(), m_mac), this);
+  m_db.release(key(), this);
 }
 
 void
 bridge_domain_entry::sweep()
 {
   if (m_hw) {
-    HW::enqueue(new delete_cmd(m_hw, m_mac, m_bd->id()));
+    HW::enqueue(new bridge_domain_entry_cmds::delete_cmd(
+      m_hw, m_mac, m_bd->id(), interface::type_t::BVI == m_tx_itf->type()));
   }
   HW::write();
 }
@@ -75,7 +90,9 @@ void
 bridge_domain_entry::replay()
 {
   if (m_hw) {
-    HW::enqueue(new create_cmd(m_hw, m_mac, m_bd->id(), m_tx_itf->handle()));
+    HW::enqueue(new bridge_domain_entry_cmds::create_cmd(
+      m_hw, m_mac, m_bd->id(), m_tx_itf->handle(),
+      interface::type_t::BVI == m_tx_itf->type()));
   }
 }
 std::string
@@ -95,14 +112,22 @@ bridge_domain_entry::update(const bridge_domain_entry& r)
    * create the table if it is not yet created
    */
   if (rc_t::OK != m_hw.rc()) {
-    HW::enqueue(new create_cmd(m_hw, m_mac, m_bd->id(), m_tx_itf->handle()));
+    HW::enqueue(new bridge_domain_entry_cmds::create_cmd(
+      m_hw, m_mac, m_bd->id(), m_tx_itf->handle(),
+      interface::type_t::BVI == m_tx_itf->type()));
   }
 }
 
 std::shared_ptr<bridge_domain_entry>
 bridge_domain_entry::find_or_add(const bridge_domain_entry& temp)
 {
-  return (m_db.find_or_add(std::make_pair(temp.m_bd->id(), temp.m_mac), temp));
+  return (m_db.find_or_add(temp.key(), temp));
+}
+
+std::shared_ptr<bridge_domain_entry>
+bridge_domain_entry::find(const key_t& k)
+{
+  return (m_db.find(k));
 }
 
 std::shared_ptr<bridge_domain_entry>
@@ -114,7 +139,7 @@ bridge_domain_entry::singular() const
 void
 bridge_domain_entry::dump(std::ostream& os)
 {
-  m_db.dump(os);
+  db_dump(m_db, os);
 }
 
 bridge_domain_entry::event_handler::event_handler()
@@ -133,8 +158,8 @@ bridge_domain_entry::event_handler::handle_replay()
 void
 bridge_domain_entry::event_handler::handle_populate(const client_db::key_t& key)
 {
-  std::shared_ptr<bridge_domain_entry::dump_cmd> cmd(
-    new bridge_domain_entry::dump_cmd());
+  std::shared_ptr<bridge_domain_entry_cmds::dump_cmd> cmd =
+    std::make_shared<bridge_domain_entry_cmds::dump_cmd>();
 
   HW::enqueue(cmd);
   HW::write();
@@ -144,11 +169,21 @@ bridge_domain_entry::event_handler::handle_populate(const client_db::key_t& key)
 
     std::shared_ptr<interface> itf = interface::find(payload.sw_if_index);
     std::shared_ptr<bridge_domain> bd = bridge_domain::find(payload.bd_id);
+
+    if (!bd || !itf) {
+      VOM_LOG(log_level_t::ERROR) << "bridge-domain-entry dump:"
+                                  << " itf:" << payload.sw_if_index
+                                  << " bd:" << payload.bd_id;
+      continue;
+    }
+
     mac_address_t mac(payload.mac);
     bridge_domain_entry bd_e(*bd, mac, *itf);
 
-    VOM_LOG(log_level_t::DEBUG) << "bd-entry-dump: " << bd->to_string()
-                                << mac.to_string() << itf->to_string();
+    VOM_LOG(log_level_t::DEBUG) << "bridge-domain-entry dump:"
+                                << " " << bd->to_string() << " "
+                                << itf->to_string() << " mac:["
+                                << mac.to_string() << "]";
 
     /*
      * Write each of the discovered interfaces into the OM,
@@ -168,7 +203,7 @@ bridge_domain_entry::event_handler::order() const
 void
 bridge_domain_entry::event_handler::show(std::ostream& os)
 {
-  m_db.dump(os);
+  db_dump(m_db, os);
 }
 
 std::ostream&