From 420c6bf1a751ad117131ac4148f6950133e44d80 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Mon, 24 Dec 2018 07:26:47 -0800 Subject: [PATCH] GBP: fix dump and VOM populate Change-Id: I5440d80333190ebac46d22eac43183939805a24b Signed-off-by: Neale Ranns --- extras/vom/vom/acl_binding.cpp | 71 ++++++++++--- extras/vom/vom/acl_binding.hpp | 2 +- extras/vom/vom/acl_ethertype.cpp | 2 + extras/vom/vom/bridge_domain.cpp | 6 ++ extras/vom/vom/gbp_bridge_domain.cpp | 8 +- extras/vom/vom/gbp_contract.cpp | 2 + extras/vom/vom/gbp_endpoint.cpp | 4 + extras/vom/vom/gbp_endpoint_group.cpp | 9 ++ extras/vom/vom/gbp_ext_itf.cpp | 4 + extras/vom/vom/gbp_route_domain.cpp | 2 +- extras/vom/vom/gbp_vxlan_tunnel.cpp | 186 ---------------------------------- extras/vom/vom/types.hpp | 5 + src/plugins/gbp/gbp_api.c | 4 +- 13 files changed, 98 insertions(+), 207 deletions(-) delete mode 100644 extras/vom/vom/gbp_vxlan_tunnel.cpp diff --git a/extras/vom/vom/acl_binding.cpp b/extras/vom/vom/acl_binding.cpp index 73f015df377..d57ed7741e5 100644 --- a/extras/vom/vom/acl_binding.cpp +++ b/extras/vom/vom/acl_binding.cpp @@ -18,9 +18,19 @@ 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 itf = interface::find(payload.sw_if_index); - for (int ii = 0; ii < payload.count; ii++) { - std::shared_ptr acl = l2_list::find(payload.acls[ii]); + if (itf) { + for (int ii = 0; ii < payload.count; ii++) { + std::shared_ptr 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 cmd = std::make_shared(); @@ -76,17 +109,25 @@ l3_binding::event_handler::handle_populate(const client_db::key_t& key) std::shared_ptr 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 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 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; } } } diff --git a/extras/vom/vom/acl_binding.hpp b/extras/vom/vom/acl_binding.hpp index 89db0eea219..3a123a853cd 100644 --- a/extras/vom/vom/acl_binding.hpp +++ b/extras/vom/vom/acl_binding.hpp @@ -129,7 +129,7 @@ private: /** * Get the sortable Id of the listener */ - dependency_t order() const { return (dependency_t::BINDING); } + dependency_t order() const; }; /** diff --git a/extras/vom/vom/acl_ethertype.cpp b/extras/vom/vom/acl_ethertype.cpp index 9092517194e..81ed7a28a7a 100644 --- a/extras/vom/vom/acl_ethertype.cpp +++ b/extras/vom/vom/acl_ethertype.cpp @@ -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; } } } diff --git a/extras/vom/vom/bridge_domain.cpp b/extras/vom/vom/bridge_domain.cpp index a2cf656a6ad..1cc55316bc0 100644 --- a/extras/vom/vom/bridge_domain.cpp +++ b/extras/vom/vom/bridge_domain.cpp @@ -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; } } } diff --git a/extras/vom/vom/gbp_bridge_domain.cpp b/extras/vom/vom/gbp_bridge_domain.cpp index d9ea4876a65..03be83ddb9f 100644 --- a/extras/vom/vom/gbp_bridge_domain.cpp +++ b/extras/vom/vom/gbp_bridge_domain.cpp @@ -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 cmd = std::make_shared(); @@ -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 diff --git a/extras/vom/vom/gbp_contract.cpp b/extras/vom/vom/gbp_contract.cpp index 6cd2fad43f2..f372acf2e4c 100644 --- a/extras/vom/vom/gbp_contract.cpp +++ b/extras/vom/vom/gbp_contract.cpp @@ -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; } } } diff --git a/extras/vom/vom/gbp_endpoint.cpp b/extras/vom/vom/gbp_endpoint.cpp index 236a961ae20..b39e9f934e6 100644 --- a/extras/vom/vom/gbp_endpoint.cpp +++ b/extras/vom/vom/gbp_endpoint.cpp @@ -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; } } } diff --git a/extras/vom/vom/gbp_endpoint_group.cpp b/extras/vom/vom/gbp_endpoint_group.cpp index 78fdeeab1c8..5f09ed1ffc3 100644 --- a/extras/vom/vom/gbp_endpoint_group.cpp +++ b/extras/vom/vom/gbp_endpoint_group.cpp @@ -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; } } } diff --git a/extras/vom/vom/gbp_ext_itf.cpp b/extras/vom/vom/gbp_ext_itf.cpp index 4b7302ddaaa..91697352cd5 100644 --- a/extras/vom/vom/gbp_ext_itf.cpp +++ b/extras/vom/vom/gbp_ext_itf.cpp @@ -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; } } } diff --git a/extras/vom/vom/gbp_route_domain.cpp b/extras/vom/vom/gbp_route_domain.cpp index 873cea6f0e8..8e44db5a4f8 100644 --- a/extras/vom/vom/gbp_route_domain.cpp +++ b/extras/vom/vom/gbp_route_domain.cpp @@ -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 index 2219c04b1c2..00000000000 --- a/extras/vom/vom/gbp_vxlan_tunnel.cpp +++ /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 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::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::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::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 cmd = - std::make_shared(); - - 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: - */ diff --git a/extras/vom/vom/types.hpp b/extras/vom/vom/types.hpp index 56759d5e741..383735b2756 100644 --- a/extras/vom/vom/types.hpp +++ b/extras/vom/vom/types.hpp @@ -62,6 +62,11 @@ enum class dependency_t */ TABLE, + /** + * virtual tables - tables with a dependency on another table + */ + VIRTUAL_TABLE, + /** * ACLs */ diff --git a/src/plugins/gbp/gbp_api.c b/src/plugins/gbp/gbp_api.c index 8ea5a0e6d0a..85473674de4 100644 --- a/src/plugins/gbp/gbp_api.c +++ b/src/plugins/gbp/gbp_api.c @@ -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); -- 2.16.6