X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvpp-api%2Fvom%2Fl2_binding.cpp;h=4118f74065a92ea7f2145dfca03337e5f2e9426d;hb=756cd9441752fc8f84104c9ee19099506ba89f85;hp=3bdc8f9cd0b2f785ec1f4a190f3159c48cf3b2fb;hpb=812ed39f9da336310e815c361ab5a9f118657d94;p=vpp.git diff --git a/src/vpp-api/vom/l2_binding.cpp b/src/vpp-api/vom/l2_binding.cpp index 3bdc8f9cd0b..4118f74065a 100644 --- a/src/vpp-api/vom/l2_binding.cpp +++ b/src/vpp-api/vom/l2_binding.cpp @@ -14,13 +14,14 @@ */ #include "vom/l2_binding.hpp" -#include "vom/cmd.hpp" +#include "vom/l2_binding_cmds.hpp" +#include "vom/singular_db_funcs.hpp" namespace VOM { /** * A DB of all the L2 Configs */ -singular_db l2_binding::m_db; +singular_db l2_binding::m_db; l2_binding::event_handler l2_binding::m_evh; @@ -75,12 +76,31 @@ l2_binding::l2_binding(const l2_binding& o) { } +const l2_binding::key_t& +l2_binding::key() const +{ + return (m_itf->key()); +} + +bool +l2_binding::operator==(const l2_binding& l) const +{ + return ((*m_itf == *l.m_itf) && (*m_bd == *l.m_bd)); +} + +std::shared_ptr +l2_binding::find(const key_t& key) +{ + return (m_db.find(key)); +} + void l2_binding::sweep() { if (m_binding && handle_t::INVALID != m_itf->handle()) { - HW::enqueue(new unbind_cmd(m_binding, m_itf->handle(), m_bd->id(), - interface::type_t::BVI == m_itf->type())); + HW::enqueue( + new l2_binding_cmds::unbind_cmd(m_binding, m_itf->handle(), m_bd->id(), + interface::type_t::BVI == m_itf->type())); } // no need to undo the VTR operation. @@ -91,12 +111,14 @@ void l2_binding::replay() { if (m_binding && handle_t::INVALID != m_itf->handle()) { - HW::enqueue(new bind_cmd(m_binding, m_itf->handle(), m_bd->id(), - interface::type_t::BVI == m_itf->type())); + HW::enqueue( + new l2_binding_cmds::bind_cmd(m_binding, m_itf->handle(), m_bd->id(), + interface::type_t::BVI == m_itf->type())); } if (m_vtr_op && handle_t::INVALID != m_itf->handle()) { - HW::enqueue(new set_vtr_op_cmd(m_vtr_op, m_itf->handle(), m_vtr_op_tag)); + HW::enqueue(new l2_binding_cmds::set_vtr_op_cmd(m_vtr_op, m_itf->handle(), + m_vtr_op_tag)); } } @@ -105,14 +127,14 @@ l2_binding::~l2_binding() sweep(); // not in the DB anymore. - m_db.release(m_itf->handle(), this); + m_db.release(m_itf->key(), this); } std::string l2_binding::to_string() const { std::ostringstream s; - s << "L2-config:[" << m_itf->to_string() << " " << m_bd->to_string() << " " + s << "L2-binding:[" << m_itf->to_string() << " " << m_bd->to_string() << " " << m_binding.to_string() << "]"; return (s.str()); @@ -131,25 +153,38 @@ void l2_binding::update(const l2_binding& desired) { /* - * the desired state is always that the interface should be created - */ + * the desired state is always that the interface should be created + */ if (rc_t::OK != m_binding.rc()) { - HW::enqueue(new bind_cmd(m_binding, m_itf->handle(), m_bd->id(), - interface::type_t::BVI == m_itf->type())); + HW::enqueue( + new l2_binding_cmds::bind_cmd(m_binding, m_itf->handle(), m_bd->id(), + interface::type_t::BVI == m_itf->type())); + } else if (!(*m_bd == *desired.m_bd)) { + /* + * re-binding to a different BD. do unbind, bind. + */ + HW::enqueue( + new l2_binding_cmds::unbind_cmd(m_binding, m_itf->handle(), m_bd->id(), + interface::type_t::BVI == m_itf->type())); + m_bd = desired.m_bd; + HW::enqueue( + new l2_binding_cmds::bind_cmd(m_binding, m_itf->handle(), m_bd->id(), + interface::type_t::BVI == m_itf->type())); } /* - * set the VTR operation is request - */ + * set the VTR operation if request + */ if (m_vtr_op.update(desired.m_vtr_op)) { - HW::enqueue(new set_vtr_op_cmd(m_vtr_op, m_itf->handle(), m_vtr_op_tag)); + HW::enqueue(new l2_binding_cmds::set_vtr_op_cmd(m_vtr_op, m_itf->handle(), + m_vtr_op_tag)); } } std::shared_ptr l2_binding::find_or_add(const l2_binding& temp) { - return (m_db.find_or_add(temp.m_itf->handle(), temp)); + return (m_db.find_or_add(temp.m_itf->key(), temp)); } std::shared_ptr @@ -161,7 +196,7 @@ l2_binding::singular() const void l2_binding::dump(std::ostream& os) { - m_db.dump(os); + db_dump(m_db, os); } l2_binding::event_handler::event_handler() @@ -180,8 +215,8 @@ void l2_binding::event_handler::handle_populate(const client_db::key_t& key) { /** - * This is done while populating the bridge-domain - */ + * This is done while populating the bridge-domain + */ } dependency_t @@ -193,7 +228,7 @@ l2_binding::event_handler::order() const void l2_binding::event_handler::show(std::ostream& os) { - m_db.dump(os); + db_dump(m_db, os); } }