X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=extras%2Fvom%2Fvom%2Fl2_binding.cpp;h=9e2c7228dd0cfb8d5083d961fa732a8c10c17519;hb=762d83c198c6c24cce4eb94a6d027f520d0b8383;hp=4118f74065a92ea7f2145dfca03337e5f2e9426d;hpb=539663c401b087e4576e41af35144e73e1907c9d;p=vpp.git diff --git a/extras/vom/vom/l2_binding.cpp b/extras/vom/vom/l2_binding.cpp index 4118f74065a..9e2c7228dd0 100644 --- a/extras/vom/vom/l2_binding.cpp +++ b/extras/vom/vom/l2_binding.cpp @@ -55,12 +55,43 @@ l2_binding::l2_vtr_op_t::l2_vtr_op_t(int v, const std::string s) { } +const l2_binding::l2_port_type_t + l2_binding::l2_port_type_t::L2_PORT_TYPE_NORMAL(0, "normal"); +const l2_binding::l2_port_type_t l2_binding::l2_port_type_t::L2_PORT_TYPE_BVI( + 1, + "bvi"); +const l2_binding::l2_port_type_t + l2_binding::l2_port_type_t::L2_PORT_TYPE_UU_FWD(2, "uu-fwd"); + +l2_binding::l2_port_type_t::l2_port_type_t(int v, const std::string s) + : enum_base(v, s) +{ +} + /** * Construct a new object matching the desried state */ l2_binding::l2_binding(const interface& itf, const bridge_domain& bd) : m_itf(itf.singular()) , m_bd(bd.singular()) + , m_port_type(l2_port_type_t::L2_PORT_TYPE_NORMAL) + , m_binding(0) + , m_vtr_op(l2_vtr_op_t::L2_VTR_DISABLED, rc_t::UNSET) + , m_vtr_op_tag(0) +{ + if (interface::type_t::BVI == m_itf->type()) + m_port_type = l2_port_type_t::L2_PORT_TYPE_BVI; +} + +/** + * Construct a new object matching the desried state + */ +l2_binding::l2_binding(const interface& itf, + const bridge_domain& bd, + const l2_port_type_t& port_type) + : m_itf(itf.singular()) + , m_bd(bd.singular()) + , m_port_type(port_type) , m_binding(0) , m_vtr_op(l2_vtr_op_t::L2_VTR_DISABLED, rc_t::UNSET) , m_vtr_op_tag(0) @@ -70,6 +101,7 @@ l2_binding::l2_binding(const interface& itf, const bridge_domain& bd) l2_binding::l2_binding(const l2_binding& o) : m_itf(o.m_itf) , m_bd(o.m_bd) + , m_port_type(o.m_port_type) , m_binding(0) , m_vtr_op(o.m_vtr_op) , m_vtr_op_tag(o.m_vtr_op_tag) @@ -85,7 +117,8 @@ l2_binding::key() const bool l2_binding::operator==(const l2_binding& l) const { - return ((*m_itf == *l.m_itf) && (*m_bd == *l.m_bd)); + return ((*m_itf == *l.m_itf) && (*m_bd == *l.m_bd) && + (m_port_type == l.m_port_type)); } std::shared_ptr @@ -98,9 +131,8 @@ void l2_binding::sweep() { if (m_binding && handle_t::INVALID != m_itf->handle()) { - HW::enqueue( - new l2_binding_cmds::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(), m_port_type)); } // no need to undo the VTR operation. @@ -111,9 +143,8 @@ void l2_binding::replay() { if (m_binding && handle_t::INVALID != m_itf->handle()) { - HW::enqueue( - new l2_binding_cmds::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(), m_port_type)); } if (m_vtr_op && handle_t::INVALID != m_itf->handle()) { @@ -135,7 +166,7 @@ l2_binding::to_string() const { std::ostringstream s; s << "L2-binding:[" << m_itf->to_string() << " " << m_bd->to_string() << " " - << m_binding.to_string() << "]"; + << m_port_type.to_string() << " " << m_binding.to_string() << "]"; return (s.str()); } @@ -156,20 +187,17 @@ l2_binding::update(const l2_binding& desired) * 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())); + HW::enqueue(new l2_binding_cmds::bind_cmd(m_binding, m_itf->handle(), + m_bd->id(), m_port_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())); + HW::enqueue(new l2_binding_cmds::unbind_cmd(m_binding, m_itf->handle(), + m_bd->id(), m_port_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())); + HW::enqueue(new l2_binding_cmds::bind_cmd(m_binding, m_itf->handle(), + m_bd->id(), m_port_type)); } /*