summaryrefslogtreecommitdiffstats
path: root/src/vpp-api/vom/l2_binding.cpp
diff options
context:
space:
mode:
authorNeale Ranns <neale.ranns@cisco.com>2017-12-01 00:19:43 -0800
committerDamjan Marion <dmarion.lists@gmail.com>2017-12-01 11:14:18 +0000
commit088f0e221c05b7b1cd59b61442eaf595e22e2fef (patch)
treeb545fe5118a0a47bfef399e272ef1e5e7d11c490 /src/vpp-api/vom/l2_binding.cpp
parent47bcca2ec8b3fb21b099a4f19a260a4783068e63 (diff)
VOM: fixes for interface recreate on agent restart and L2 re-binding
Change-Id: I14c838ee99f9bc2db66bb2e775039d2cb2e7924f Signed-off-by: Neale Ranns <neale.ranns@cisco.com>
Diffstat (limited to 'src/vpp-api/vom/l2_binding.cpp')
-rw-r--r--src/vpp-api/vom/l2_binding.cpp19
1 files changed, 15 insertions, 4 deletions
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));