From 088f0e221c05b7b1cd59b61442eaf595e22e2fef Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Fri, 1 Dec 2017 00:19:43 -0800 Subject: VOM: fixes for interface recreate on agent restart and L2 re-binding Change-Id: I14c838ee99f9bc2db66bb2e775039d2cb2e7924f Signed-off-by: Neale Ranns --- src/vpp-api/vom/interface.cpp | 10 +++++++--- src/vpp-api/vom/l2_binding.cpp | 19 +++++++++++++++---- src/vpp-api/vom/l2_binding.hpp | 4 ++-- src/vpp-api/vom/l2_binding_cmds.cpp | 1 - 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/vpp-api/vom/interface.cpp b/src/vpp-api/vom/interface.cpp index 10728ceddc4..9fa96af2d97 100644 --- a/src/vpp-api/vom/interface.cpp +++ b/src/vpp-api/vom/interface.cpp @@ -250,6 +250,8 @@ interface::mk_create_cmd(std::queue& q) q.push(new interface_cmds::af_packet_create_cmd(m_hdl, m_name)); } else if (type_t::TAP == m_type) { q.push(new interface_cmds::tap_create_cmd(m_hdl, m_name)); + } else { + m_hdl.set(rc_t::OK); } return (q); @@ -365,9 +367,11 @@ interface::set(const oper_state_t& state) void interface::enable_stats_i(interface::stat_listener& el) { - m_stats.reset(new interface_cmds::stats_enable_cmd(el, handle_i())); - HW::enqueue(m_stats); - HW::write(); + if (!m_stats) { + m_stats.reset(new interface_cmds::stats_enable_cmd(el, handle_i())); + HW::enqueue(m_stats); + HW::write(); + } } void diff --git a/src/vpp-api/vom/l2_binding.cpp b/src/vpp-api/vom/l2_binding.cpp index cc0e84a5492..749557ce3cd 100644 --- a/src/vpp-api/vom/l2_binding.cpp +++ b/src/vpp-api/vom/l2_binding.cpp @@ -152,17 +152,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)); diff --git a/src/vpp-api/vom/l2_binding.hpp b/src/vpp-api/vom/l2_binding.hpp index ba97cab512c..d24f69ee33d 100644 --- a/src/vpp-api/vom/l2_binding.hpp +++ b/src/vpp-api/vom/l2_binding.hpp @@ -185,12 +185,12 @@ private: * interface is bound to. By holding the reference here, we can * guarantee that this object will outlive the BD. */ - const std::shared_ptr m_bd; + std::shared_ptr m_bd; /** * HW configuration for the binding. The bool representing the * do/don't bind. - */ + */ HW::item m_binding; /** diff --git a/src/vpp-api/vom/l2_binding_cmds.cpp b/src/vpp-api/vom/l2_binding_cmds.cpp index 6b67c7096e8..0f91e4b3b7a 100644 --- a/src/vpp-api/vom/l2_binding_cmds.cpp +++ b/src/vpp-api/vom/l2_binding_cmds.cpp @@ -143,7 +143,6 @@ set_vtr_op_cmd::issue(connection& con) VAPI_CALL(req.execute()); wait(); - m_hw_item.set(rc_t::NOOP); return (rc_t::OK); } -- cgit 1.2.3-korg