GBP: fix dump and VOM populate 14/16614/2
authorNeale Ranns <nranns@cisco.com>
Mon, 24 Dec 2018 15:26:47 +0000 (07:26 -0800)
committerNeale Ranns <nranns@cisco.com>
Mon, 24 Dec 2018 16:31:24 +0000 (16:31 +0000)
Change-Id: I5440d80333190ebac46d22eac43183939805a24b
Signed-off-by: Neale Ranns <nranns@cisco.com>
13 files changed:
extras/vom/vom/acl_binding.cpp
extras/vom/vom/acl_binding.hpp
extras/vom/vom/acl_ethertype.cpp
extras/vom/vom/bridge_domain.cpp
extras/vom/vom/gbp_bridge_domain.cpp
extras/vom/vom/gbp_contract.cpp
extras/vom/vom/gbp_endpoint.cpp
extras/vom/vom/gbp_endpoint_group.cpp
extras/vom/vom/gbp_ext_itf.cpp
extras/vom/vom/gbp_route_domain.cpp
extras/vom/vom/gbp_vxlan_tunnel.cpp [deleted file]
extras/vom/vom/types.hpp
src/plugins/gbp/gbp_api.c

index 73f015d..d57ed77 100644 (file)
 
 namespace VOM {
 namespace ACL {
+template <>
+dependency_t
+l2_binding::event_handler::order() const
+{
+  return (dependency_t::BINDING);
+}
+
 template <>
 l2_binding::event_handler::event_handler()
 {
+  /* hack to get this function instantiated */
+  order();
+
   OM::register_listener(this);
   inspect::register_handler({ "l2-acl-binding" }, "L2 ACL bindings", this);
 }
@@ -29,6 +39,9 @@ template <>
 void
 l2_binding::event_handler::handle_populate(const client_db::key_t& key)
 {
+  /* hack to get this function instantiated */
+  order();
+
   /*
    * dump VPP Bridge domains
    */
@@ -43,19 +56,36 @@ l2_binding::event_handler::handle_populate(const client_db::key_t& key)
 
     std::shared_ptr<interface> itf = interface::find(payload.sw_if_index);
 
-    for (int ii = 0; ii < payload.count; ii++) {
-      std::shared_ptr<l2_list> acl = l2_list::find(payload.acls[ii]);
+    if (itf) {
+      for (int ii = 0; ii < payload.count; ii++) {
+        std::shared_ptr<l2_list> acl = l2_list::find(payload.acls[ii]);
 
-      l2_binding binding(direction_t::INPUT, *itf, *acl);
-
-      OM::commit(key, binding);
+        if (acl) {
+          l2_binding binding(direction_t::INPUT, *itf, *acl);
+          OM::commit(key, binding);
+        } else {
+          VOM_LOG(log_level_t::ERROR) << "no ACL id:" << payload.acls[ii];
+        }
+      }
+    } else {
+      VOM_LOG(log_level_t::ERROR) << "no interface:" << payload.sw_if_index;
     }
   }
 }
 
+template <>
+dependency_t
+l3_binding::event_handler::order() const
+{
+  return (dependency_t::BINDING);
+}
+
 template <>
 l3_binding::event_handler::event_handler()
 {
+  /* hack to get this function instantiated */
+  order();
+
   OM::register_listener(this);
   inspect::register_handler({ "l3-acl-binding" }, "L3 ACL bindings", this);
 }
@@ -64,6 +94,9 @@ template <>
 void
 l3_binding::event_handler::handle_populate(const client_db::key_t& key)
 {
+  /* hack to get this function instantiated */
+  order();
+
   std::shared_ptr<binding_cmds::l3_dump_cmd> cmd =
     std::make_shared<binding_cmds::l3_dump_cmd>();
 
@@ -76,17 +109,25 @@ l3_binding::event_handler::handle_populate(const client_db::key_t& key)
     std::shared_ptr<interface> itf = interface::find(payload.sw_if_index);
     uint8_t n_input = payload.n_input;
 
-    for (int ii = 0; ii < payload.count; ii++) {
-      std::shared_ptr<l3_list> acl = l3_list::find(payload.acls[ii]);
-
-      if (n_input) {
-        l3_binding binding(direction_t::INPUT, *itf, *acl);
-        n_input--;
-        OM::commit(key, binding);
-      } else {
-        l3_binding binding(direction_t::OUTPUT, *itf, *acl);
-        OM::commit(key, binding);
+    if (itf) {
+      for (int ii = 0; ii < payload.count; ii++) {
+        std::shared_ptr<l3_list> acl = l3_list::find(payload.acls[ii]);
+
+        if (acl) {
+          if (n_input) {
+            l3_binding binding(direction_t::INPUT, *itf, *acl);
+            n_input--;
+            OM::commit(key, binding);
+          } else {
+            l3_binding binding(direction_t::OUTPUT, *itf, *acl);
+            OM::commit(key, binding);
+          }
+        } else {
+          VOM_LOG(log_level_t::ERROR) << "no ACL id:" << payload.acls[ii];
+        }
       }
+    } else {
+      VOM_LOG(log_level_t::ERROR) << "no interface:" << payload.sw_if_index;
     }
   }
 }
index 89db0ee..3a123a8 100644 (file)
@@ -129,7 +129,7 @@ private:
     /**
      * Get the sortable Id of the listener
      */
-    dependency_t order() const { return (dependency_t::BINDING); }
+    dependency_t order() const;
   };
 
   /**
index 9092517..81ed7a2 100644 (file)
@@ -225,6 +225,8 @@ acl_ethertype::event_handler::handle_populate(const client_db::key_t& key)
         VOM_LOG(log_level_t::DEBUG) << "ethertype dump: " << a_e.to_string();
         OM::commit(key, a_e);
       }
+    } else {
+      VOM_LOG(log_level_t::ERROR) << "no interface:" << payload.sw_if_index;
     }
   }
 }
index a2cf656..1cc5531 100644 (file)
@@ -215,6 +215,9 @@ bridge_domain::event_handler::handle_populate(const client_db::key_t& key)
       l2_binding l2(*uu_fwd_itf, bd,
                     l2_binding::l2_port_type_t::L2_PORT_TYPE_UU_FWD);
       OM::commit(key, l2);
+    } else {
+      VOM_LOG(log_level_t::ERROR) << "no uu-fwd interface:"
+                                  << payload.uu_fwd_sw_if_index;
     }
 
     /**
@@ -226,6 +229,9 @@ bridge_domain::event_handler::handle_populate(const client_db::key_t& key)
       if (itf) {
         l2_binding l2(*itf, bd);
         OM::commit(key, l2);
+      } else {
+        VOM_LOG(log_level_t::ERROR) << "no interface:"
+                                    << payload.sw_if_details[ii].sw_if_index;
       }
     }
   }
index d9ea487..03be83d 100644 (file)
@@ -207,7 +207,7 @@ void
 gbp_bridge_domain::event_handler::handle_populate(const client_db::key_t& key)
 {
   /*
-   * dump VPP Bridge domains
+   * dump GBP Bridge domains
    */
   std::shared_ptr<gbp_bridge_domain_cmds::dump_cmd> cmd =
     std::make_shared<gbp_bridge_domain_cmds::dump_cmd>();
@@ -231,6 +231,10 @@ gbp_bridge_domain::event_handler::handle_populate(const client_db::key_t& key)
       gbp_bridge_domain bd(payload.bd.bd_id, *bvi);
       OM::commit(key, bd);
       VOM_LOG(log_level_t::DEBUG) << "dump: " << bd.to_string();
+    } else {
+      VOM_LOG(log_level_t::ERROR)
+        << "no BVI:" << payload.bd.bvi_sw_if_index
+        << " nor uu-fwd:" << payload.bd.uu_fwd_sw_if_index;
     }
   }
 }
@@ -250,7 +254,7 @@ gbp_bridge_domain::event_handler::handle_replay()
 dependency_t
 gbp_bridge_domain::event_handler::order() const
 {
-  return (dependency_t::TABLE);
+  return (dependency_t::VIRTUAL_TABLE);
 }
 
 void
index 6cd2fad..f372acf 100644 (file)
@@ -210,6 +210,8 @@ gbp_contract::event_handler::handle_populate(const client_db::key_t& key)
       OM::commit(key, gbpc);
 
       VOM_LOG(log_level_t::DEBUG) << "read: " << gbpc.to_string();
+    } else {
+      VOM_LOG(log_level_t::ERROR) << " no ACL:" << payload.contract.acl_index;
     }
   }
 }
index 236a961..b39e9f9 100644 (file)
@@ -170,6 +170,10 @@ gbp_endpoint::event_handler::handle_populate(const client_db::key_t& key)
       OM::commit(key, gbpe);
 
       VOM_LOG(log_level_t::DEBUG) << "read: " << gbpe.to_string();
+    } else {
+      VOM_LOG(log_level_t::ERROR)
+        << "no interface:" << payload.endpoint.sw_if_index
+        << "or epg:" << payload.endpoint.epg_id;
     }
   }
 }
index 78fdeea..5f09ed1 100644 (file)
@@ -198,6 +198,15 @@ gbp_endpoint_group::event_handler::handle_populate(const client_db::key_t& key)
       OM::commit(key, gbpe);
 
       VOM_LOG(log_level_t::DEBUG) << "read: " << gbpe.to_string();
+    } else if (bd && rd) {
+      gbp_endpoint_group gbpe(payload.epg.epg_id, *rd, *bd);
+      OM::commit(key, gbpe);
+
+      VOM_LOG(log_level_t::DEBUG) << "read: " << gbpe.to_string();
+    } else {
+      VOM_LOG(log_level_t::ERROR) << "no itf:" << payload.epg.uplink_sw_if_index
+                                  << " or BD:" << payload.epg.bd_id
+                                  << " or RD:" << payload.epg.rd_id;
     }
   }
 }
index 4b7302d..9169735 100644 (file)
@@ -167,6 +167,10 @@ gbp_ext_itf::event_handler::handle_populate(const client_db::key_t& key)
       OM::commit(key, ext_itf);
 
       VOM_LOG(log_level_t::DEBUG) << "read: " << ext_itf.to_string();
+    } else {
+      VOM_LOG(log_level_t::ERROR) << "no itf:" << payload.ext_itf.sw_if_index
+                                  << " or BD:" << payload.ext_itf.bd_id
+                                  << " or RD:" << payload.ext_itf.rd_id;
     }
   }
 }
index 873cea6..8e44db5 100644 (file)
@@ -237,7 +237,7 @@ gbp_route_domain::event_handler::handle_replay()
 dependency_t
 gbp_route_domain::event_handler::order() const
 {
-  return (dependency_t::TABLE);
+  return (dependency_t::VIRTUAL_TABLE);
 }
 
 void
diff --git a/extras/vom/vom/gbp_vxlan_tunnel.cpp b/extras/vom/vom/gbp_vxlan_tunnel.cpp
deleted file mode 100644 (file)
index 2219c04..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 2017 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "vom/gbp_vxlan_tunnel.hpp"
-#include "vom/gbp_vxlan_tunnel_cmds.hpp"
-#include "vom/interface.hpp"
-#include "vom/singular_db_funcs.hpp"
-
-namespace VOM {
-
-/**
- * A DB of al the interfaces, key on the name
- */
-singular_db<uint32_t, gbp_vxlan_tunnel> gbp_vxlan_tunnel::m_db;
-
-gbp_vxlan_tunnel::event_handler gbp_vxlan_tunnel::m_evh;
-
-/**
- * Construct a new object matching the desried state
- */
-gbp_vxlan_tunnel::gbp_vxlan_tunnel(const vxlan_tunnel& vt)
-  : interface(vt)
-  , m_vni(vt.m_vni)
-{
-}
-
-gbp_vxlan_tunnel::gbp_vxlan_tunnel(uint32_t vni)
-  : interface(mk_name(vni),
-              interface::type_t::UNKNOWN,
-              interface::admin_state_t::UP)
-  , m_vni(vt.m_vni)
-{
-}
-
-const gbp_vxlan_tunnel::key_t
-gbp_vxlan_tunnel::key() const
-{
-  return (m_vni);
-}
-
-bool
-gbp_vxlan_tunnel::operator==(const gbp_vxlan_tunnel& vt) const
-{
-  return (m_vni == vt.m_vni);
-}
-
-void
-gbp_vxlan_tunnel::sweep()
-{
-  if (rc_t::OK == m_id.rc()) {
-    HW::enqueue(new gbp_vxlan_tunnel_cmds::delete_cmd(m_vni));
-  }
-  HW::write();
-}
-
-void
-gbp_vxlan_tunnel::replay()
-{
-  if (rc_t::OK == m_hdl) {
-    HW::enqueue(new gbp_vxlan_tunnel_cmds::create_cmd(m_vni));
-  }
-}
-
-gbp_vxlan_tunnel::~gbp_vxlan_tunnel()
-{
-  sweep();
-  m_db.release(m_id.data(), this);
-}
-
-std::string
-gbp_vxlan_tunnel::to_string() const
-{
-  std::ostringstream s;
-  s << "gbp-vxlan:[" << m_vni << "]";
-
-  return (s.str());
-}
-
-std::shared_ptr<gbp_vxlan_tunnel>
-gbp_vxlan_tunnel::find(const key_t& key)
-{
-  return (m_db.find(key));
-}
-
-void
-gbp_vxlan_tunnel::update(const gbp_vxlan_tunnel& desired)
-{
-  /*
-   * the desired state is always that the interface should be created
-   */
-  if (rc_t::OK != m_hdl) {
-    HW::enqueue(new gbp_vxlan_tunnel_cmds::create_cmd(m_vni));
-  }
-}
-
-std::shared_ptr<gbp_vxlan_tunnel>
-gbp_vxlan_tunnel::find_or_add(const gbp_vxlan_tunnel& temp)
-{
-  return (m_db.find_or_add(temp.m_id.data(), temp));
-}
-
-std::shared_ptr<gbp_vxlan_tunnel>
-gbp_vxlan_tunnel::singular() const
-{
-  return find_or_add(*this);
-}
-
-void
-gbp_vxlan_tunnel::dump(std::ostream& os)
-{
-  db_dump(m_db, os);
-}
-
-void
-gbp_vxlan_tunnel::event_handler::handle_populate(const client_db::key_t& key)
-{
-  /*
-   * dump VPP Bridge domains
-   */
-  std::shared_ptr<gbp_vxlan_tunnel_cmds::dump_cmd> cmd =
-    std::make_shared<gbp_vxlan_tunnel_cmds::dump_cmd>();
-
-  HW::enqueue(cmd);
-  HW::write();
-
-  for (auto& record : *cmd) {
-    auto& payload = record.get_payload();
-
-    gbp_vxlan_tunnel vt(payload.tunnel.vni, );
-    OM::commit(key, vt);
-    VOM_LOG(log_level_t::DEBUG) << "dump: " << vt.to_string();
-  }
-  else
-  {
-    gbp_vxlan_tunnel vt(payload.vt.vt_id);
-    OM::commit(key, vt);
-    VOM_LOG(log_level_t::DEBUG) << "dump: " << vt.to_string();
-  }
-}
-}
-
-gbp_vxlan_tunnel::event_handler::event_handler()
-{
-  OM::register_listener(this);
-  inspect::register_handler({ "gvt", "gbp-vxlan-tunnel" }, "GBP VXLAN Tunnels",
-                            this);
-}
-
-void
-gbp_vxlan_tunnel::event_handler::handle_replay()
-{
-  m_db.replay();
-}
-
-dependency_t
-gbp_vxlan_tunnel::event_handler::order() const
-{
-  return (dependency_t::INTERFACE);
-}
-
-void
-gbp_vxlan_tunnel::event_handler::show(std::ostream& os)
-{
-  db_dump(m_db, os);
-}
-}
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "mozilla")
- * End:
- */
index 56759d5..383735b 100644 (file)
@@ -62,6 +62,11 @@ enum class dependency_t
    */
   TABLE,
 
+  /**
+   * virtual tables - tables with a dependency on another table
+   */
+  VIRTUAL_TABLE,
+
   /**
    * ACLs
    */
index 8ea5a0e..8547367 100644 (file)
@@ -524,7 +524,7 @@ gbp_endpoint_group_send_details (gbp_endpoint_group_t * gg, void *args)
   mp->epg.uplink_sw_if_index = ntohl (gg->gg_uplink_sw_if_index);
   mp->epg.epg_id = ntohs (gg->gg_id);
   mp->epg.bd_id = ntohl (gbp_endpoint_group_get_bd_id (gg));
-  mp->epg.rd_id = ntohl (gg->gg_rd);
+  mp->epg.rd_id = ntohl (gbp_route_domain_get_rd_id (gg->gg_rd));
 
   vl_api_send_msg (ctx->reg, (u8 *) mp);
 
@@ -672,7 +672,7 @@ gbp_recirc_send_details (gbp_recirc_t * gr, void *args)
 
   mp->recirc.epg_id = ntohs (gr->gr_epg);
   mp->recirc.sw_if_index = ntohl (gr->gr_sw_if_index);
-  mp->recirc.is_ext = ntohl (gr->gr_is_ext);
+  mp->recirc.is_ext = gr->gr_is_ext;
 
   vl_api_send_msg (ctx->reg, (u8 *) mp);