X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=extras%2Fvom%2Fvom%2Fgbp_bridge_domain.cpp;h=c8d42d264a3e425464c112967149266486c2246b;hb=4dd4cf4f9;hp=03be83ddb9f92838480261d2b4ce0c42da4353d1;hpb=420c6bf1a751ad117131ac4148f6950133e44d80;p=vpp.git diff --git a/extras/vom/vom/gbp_bridge_domain.cpp b/extras/vom/vom/gbp_bridge_domain.cpp index 03be83ddb9f..c8d42d264a3 100644 --- a/extras/vom/vom/gbp_bridge_domain.cpp +++ b/extras/vom/vom/gbp_bridge_domain.cpp @@ -21,6 +21,16 @@ namespace VOM { +const gbp_bridge_domain::flags_t gbp_bridge_domain::flags_t::NONE(0, "none"); +const gbp_bridge_domain::flags_t gbp_bridge_domain::flags_t::DO_NOT_LEARN( + 1, + "do-not-learn"); + +gbp_bridge_domain::flags_t::flags_t(int v, const std::string& s) + : enum_base(v, s) +{ +} + /** * A DB of al the interfaces, key on the name */ @@ -32,41 +42,67 @@ gbp_bridge_domain::event_handler gbp_bridge_domain::m_evh; * Construct a new object matching the desried state */ gbp_bridge_domain::gbp_bridge_domain(const bridge_domain& bd, - const interface& bvi) + const interface& bvi, + const flags_t& flags) : m_id(bd.id()) , m_bd(bd.singular()) , m_bvi(bvi.singular()) + , m_uu_fwd() + , m_bm_flood() + , m_flags(flags) { } gbp_bridge_domain::gbp_bridge_domain(const bridge_domain& bd, const interface& bvi, - const interface& uu_fwd) + const interface& uu_fwd, + const interface& bm_flood, + const flags_t& flags) : m_id(bd.id()) , m_bd(bd.singular()) , m_bvi(bvi.singular()) , m_uu_fwd(uu_fwd.singular()) + , m_bm_flood(bm_flood.singular()) + , m_flags(flags) { } gbp_bridge_domain::gbp_bridge_domain(const bridge_domain& bd, const std::shared_ptr bvi, - const std::shared_ptr uu_fwd) + const std::shared_ptr uu_fwd, + const std::shared_ptr bm_flood, + const flags_t& flags) : m_id(bd.id()) , m_bd(bd.singular()) - , m_bvi(bvi->singular()) - , m_uu_fwd(uu_fwd->singular()) + , m_bvi(bvi) + , m_uu_fwd(uu_fwd) + , m_bm_flood(bm_flood) + , m_flags(flags) { + if (m_bvi) + m_bvi = m_bvi->singular(); + if (m_uu_fwd) + m_uu_fwd = m_uu_fwd->singular(); + if (m_bm_flood) + m_bm_flood = m_bm_flood->singular(); } gbp_bridge_domain::gbp_bridge_domain(const bridge_domain& bd, const interface& bvi, - const std::shared_ptr uu_fwd) + const std::shared_ptr uu_fwd, + const std::shared_ptr bm_flood, + const flags_t& flags) : m_id(bd.id()) , m_bd(bd.singular()) , m_bvi(bvi.singular()) - , m_uu_fwd(uu_fwd->singular()) + , m_uu_fwd(uu_fwd) + , m_bm_flood(bm_flood) + , m_flags(flags) { + if (m_uu_fwd) + m_uu_fwd = m_uu_fwd->singular(); + if (m_bm_flood) + m_bm_flood = m_bm_flood->singular(); } gbp_bridge_domain::gbp_bridge_domain(const gbp_bridge_domain& bd) @@ -74,6 +110,8 @@ gbp_bridge_domain::gbp_bridge_domain(const gbp_bridge_domain& bd) , m_bd(bd.m_bd) , m_bvi(bd.m_bvi) , m_uu_fwd(bd.m_uu_fwd) + , m_bm_flood(bd.m_bm_flood) + , m_flags(bd.m_flags) { } @@ -90,13 +128,13 @@ gbp_bridge_domain::id() const } const std::shared_ptr -gbp_bridge_domain::get_bridge_domain() +gbp_bridge_domain::get_bridge_domain() const { return m_bd; } const std::shared_ptr -gbp_bridge_domain::get_bvi() +gbp_bridge_domain::get_bvi() const { return m_bvi; } @@ -120,6 +158,13 @@ gbp_bridge_domain::operator==(const gbp_bridge_domain& b) const else equal = false; + if (m_bm_flood && b.m_bm_flood) + equal &= (m_bm_flood->key() == b.m_bm_flood->key()); + else if (!m_bm_flood && !b.m_bm_flood) + ; + else + equal = false; + return ((m_bd->key() == b.m_bd->key()) && equal); } @@ -138,7 +183,8 @@ gbp_bridge_domain::replay() if (rc_t::OK == m_id.rc()) { HW::enqueue(new gbp_bridge_domain_cmds::create_cmd( m_id, (m_bvi ? m_bvi->handle() : handle_t::INVALID), - (m_uu_fwd ? m_uu_fwd->handle() : handle_t::INVALID))); + (m_uu_fwd ? m_uu_fwd->handle() : handle_t::INVALID), + (m_bm_flood ? m_bm_flood->handle() : handle_t::INVALID), m_flags)); } } @@ -154,7 +200,8 @@ std::string gbp_bridge_domain::to_string() const { std::ostringstream s; - s << "gbp-bridge-domain:[" << m_bd->to_string(); + s << "gbp-bridge-domain:[" << m_bd->to_string() + << " flags:" << m_flags.to_string(); if (m_bvi) s << " bvi:" << m_bvi->to_string(); @@ -181,7 +228,8 @@ gbp_bridge_domain::update(const gbp_bridge_domain& desired) if (rc_t::OK != m_id.rc()) { HW::enqueue(new gbp_bridge_domain_cmds::create_cmd( m_id, (m_bvi ? m_bvi->handle() : handle_t::INVALID), - (m_uu_fwd ? m_uu_fwd->handle() : handle_t::INVALID))); + (m_uu_fwd ? m_uu_fwd->handle() : handle_t::INVALID), + (m_bm_flood ? m_bm_flood->handle() : handle_t::INVALID), m_flags)); } } @@ -220,11 +268,13 @@ gbp_bridge_domain::event_handler::handle_populate(const client_db::key_t& key) std::shared_ptr uu_fwd = interface::find(payload.bd.uu_fwd_sw_if_index); + std::shared_ptr bm_flood = + interface::find(payload.bd.bm_flood_sw_if_index); std::shared_ptr bvi = interface::find(payload.bd.bvi_sw_if_index); - if (uu_fwd && bvi) { - gbp_bridge_domain bd(payload.bd.bd_id, bvi, uu_fwd); + if (uu_fwd && bm_flood && bvi) { + gbp_bridge_domain bd(payload.bd.bd_id, bvi, uu_fwd, bm_flood); OM::commit(key, bd); VOM_LOG(log_level_t::DEBUG) << "dump: " << bd.to_string(); } else if (bvi) {