Fixes for 'make UNATTENDED=yes CC=clang CXX=clang verify'
[vpp.git] / src / vpp-api / vom / bridge_domain_entry.cpp
index 4041e31..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>
@@ -39,8 +41,8 @@ bridge_domain_entry::bridge_domain_entry(const mac_address_t& mac,
   , m_tx_itf(tx_itf.singular())
 {
   /*
- * the route goes in the default table
- */
+   * the entry goes in the default bridge-domain
  */
   bridge_domain bd(bridge_domain::DEFAULT_TABLE);
 
   m_bd = bd.singular();
@@ -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
@@ -92,17 +109,25 @@ void
 bridge_domain_entry::update(const bridge_domain_entry& r)
 {
   /*
- * create the table if it is not yet created
- */
  * 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,17 +169,27 @@ 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,
- * but disable the HW Command q whilst we do, so that no
- * commands are sent to VPP
- */
    * Write each of the discovered interfaces into the OM,
    * but disable the HW Command q whilst we do, so that no
    * commands are sent to VPP
    */
     OM::commit(key, bd_e);
   }
 }
@@ -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&