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=e380760805cb8ee121adf9ab3b2a3509af4fc4fd;hpb=9ef1c0adbf9399c55deeede3cf629dd4e8c20304;p=vpp.git diff --git a/src/vpp-api/vom/l2_binding.cpp b/src/vpp-api/vom/l2_binding.cpp index e380760805c..4118f74065a 100644 --- a/src/vpp-api/vom/l2_binding.cpp +++ b/src/vpp-api/vom/l2_binding.cpp @@ -15,12 +15,13 @@ #include "vom/l2_binding.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,6 +76,24 @@ 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() { @@ -108,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()); @@ -134,17 +153,28 @@ 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 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 l2_binding_cmds::set_vtr_op_cmd(m_vtr_op, m_itf->handle(), m_vtr_op_tag)); @@ -154,7 +184,7 @@ l2_binding::update(const l2_binding& desired) 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 @@ -166,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() @@ -185,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 @@ -198,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); } }