diff options
Diffstat (limited to 'extras/vom/vom/l2_binding.cpp')
-rw-r--r-- | extras/vom/vom/l2_binding.cpp | 62 |
1 files changed, 45 insertions, 17 deletions
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<l2_binding::l2_port_type_t>(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<l2_binding> @@ -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)); } /* |