From 160c923f99c2adc103495fab1bfcefe965fe7fb8 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Wed, 19 Jun 2019 06:25:56 -0700 Subject: gbp: VRF scoped contracts Type: feature Change-Id: I01772cfc3a0118a5c49bf346339788824e6931b2 Signed-off-by: Neale Ranns --- extras/vom/CMakeLists.txt | 1 + extras/vom/vom/CMakeLists.txt | 2 ++ extras/vom/vom/gbp_bridge_domain.cpp | 25 ++++++++++++++----- extras/vom/vom/gbp_bridge_domain.hpp | 7 +++++- extras/vom/vom/gbp_bridge_domain_cmds.cpp | 8 +++++-- extras/vom/vom/gbp_bridge_domain_cmds.hpp | 2 ++ extras/vom/vom/gbp_contract.cpp | 35 +++++++++++++++------------ extras/vom/vom/gbp_contract.hpp | 12 +++++++--- extras/vom/vom/gbp_contract_cmds.cpp | 11 +++++++-- extras/vom/vom/gbp_contract_cmds.hpp | 8 ++++++- extras/vom/vom/gbp_endpoint_group.hpp | 7 +----- extras/vom/vom/gbp_route_domain.cpp | 32 ++++++++++++++----------- extras/vom/vom/gbp_route_domain.hpp | 6 ++++- extras/vom/vom/gbp_route_domain_cmds.cpp | 7 ++++-- extras/vom/vom/gbp_route_domain_cmds.hpp | 2 ++ extras/vom/vom/gbp_types.hpp | 40 +++++++++++++++++++++++++++++++ 16 files changed, 152 insertions(+), 53 deletions(-) create mode 100644 extras/vom/vom/gbp_types.hpp (limited to 'extras') diff --git a/extras/vom/CMakeLists.txt b/extras/vom/CMakeLists.txt index 4853196b5fe..3a32117882a 100644 --- a/extras/vom/CMakeLists.txt +++ b/extras/vom/CMakeLists.txt @@ -26,6 +26,7 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/lib) set(CMAKE_INSTALL_MESSAGE NEVER) diff --git a/extras/vom/vom/CMakeLists.txt b/extras/vom/vom/CMakeLists.txt index 26dd3e46574..144749968d5 100644 --- a/extras/vom/vom/CMakeLists.txt +++ b/extras/vom/vom/CMakeLists.txt @@ -94,6 +94,7 @@ if(GBP_FILE) gbp_rule.cpp gbp_subnet_cmds.cpp gbp_subnet.cpp + gbp_types.hpp gbp_vxlan.cpp gbp_vxlan_cmds.cpp ) @@ -220,6 +221,7 @@ if(GBP_FILE) gbp_route_domain.hpp gbp_rule.hpp gbp_subnet.hpp + gbp_types.hpp gbp_vxlan.hpp ) endif() diff --git a/extras/vom/vom/gbp_bridge_domain.cpp b/extras/vom/vom/gbp_bridge_domain.cpp index cfa07681545..3e015c379c2 100644 --- a/extras/vom/vom/gbp_bridge_domain.cpp +++ b/extras/vom/vom/gbp_bridge_domain.cpp @@ -51,10 +51,12 @@ 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 gbp_route_domain& rd, const interface& bvi, const flags_t& flags) : m_id(bd.id()) , m_bd(bd.singular()) + , m_rd(rd.singular()) , m_bvi(bvi.singular()) , m_uu_fwd() , m_bm_flood() @@ -63,12 +65,14 @@ gbp_bridge_domain::gbp_bridge_domain(const bridge_domain& bd, } gbp_bridge_domain::gbp_bridge_domain(const bridge_domain& bd, + const gbp_route_domain& rd, const interface& bvi, const interface& uu_fwd, const interface& bm_flood, const flags_t& flags) : m_id(bd.id()) , m_bd(bd.singular()) + , m_rd(rd.singular()) , m_bvi(bvi.singular()) , m_uu_fwd(uu_fwd.singular()) , m_bm_flood(bm_flood.singular()) @@ -77,12 +81,14 @@ gbp_bridge_domain::gbp_bridge_domain(const bridge_domain& bd, } gbp_bridge_domain::gbp_bridge_domain(const bridge_domain& bd, + const gbp_route_domain& rd, const std::shared_ptr bvi, 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_rd(rd.singular()) , m_bvi(bvi) , m_uu_fwd(uu_fwd) , m_bm_flood(bm_flood) @@ -97,12 +103,14 @@ gbp_bridge_domain::gbp_bridge_domain(const bridge_domain& bd, } gbp_bridge_domain::gbp_bridge_domain(const bridge_domain& bd, + const gbp_route_domain& rd, const interface& bvi, 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_rd(rd.singular()) , m_bvi(bvi.singular()) , m_uu_fwd(uu_fwd) , m_bm_flood(bm_flood) @@ -117,6 +125,7 @@ gbp_bridge_domain::gbp_bridge_domain(const bridge_domain& bd, gbp_bridge_domain::gbp_bridge_domain(const gbp_bridge_domain& bd) : m_id(bd.id()) , m_bd(bd.m_bd) + , m_rd(bd.m_rd) , m_bvi(bd.m_bvi) , m_uu_fwd(bd.m_uu_fwd) , m_bm_flood(bd.m_bm_flood) @@ -191,7 +200,7 @@ 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_id, m_rd->id(), (m_bvi ? m_bvi->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)); } @@ -236,7 +245,7 @@ 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_id, m_rd->id(), (m_bvi ? m_bvi->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)); } @@ -281,6 +290,8 @@ gbp_bridge_domain::event_handler::handle_populate(const client_db::key_t& key) interface::find(payload.bd.bm_flood_sw_if_index); std::shared_ptr bvi = interface::find(payload.bd.bvi_sw_if_index); + std::shared_ptr grd = + gbp_route_domain::find(payload.bd.rd_id); flags_t flags = gbp_bridge_domain::flags_t::NONE; if (payload.bd.flags & GBP_BD_API_FLAG_DO_NOT_LEARN) @@ -292,12 +303,13 @@ gbp_bridge_domain::event_handler::handle_populate(const client_db::key_t& key) if (payload.bd.flags & GBP_BD_API_FLAG_UCAST_ARP) flags |= gbp_bridge_domain::flags_t::UCAST_ARP; - if (uu_fwd && bm_flood && bvi) { - gbp_bridge_domain bd(payload.bd.bd_id, bvi, uu_fwd, bm_flood, flags); + if (uu_fwd && bm_flood && bvi && grd) { + gbp_bridge_domain bd(payload.bd.bd_id, *grd, bvi, uu_fwd, bm_flood, + flags); OM::commit(key, bd); VOM_LOG(log_level_t::DEBUG) << "dump: " << bd.to_string(); } else if (bvi) { - gbp_bridge_domain bd(payload.bd.bd_id, *bvi, flags); + gbp_bridge_domain bd(payload.bd.bd_id, *grd, *bvi, flags); OM::commit(key, bd); VOM_LOG(log_level_t::DEBUG) << "dump: " << bd.to_string(); } else { @@ -323,7 +335,8 @@ gbp_bridge_domain::event_handler::handle_replay() dependency_t gbp_bridge_domain::event_handler::order() const { - return (dependency_t::VIRTUAL_TABLE); + /* order after gbp-route-domains */ + return (dependency_t::ACL); } void diff --git a/extras/vom/vom/gbp_bridge_domain.hpp b/extras/vom/vom/gbp_bridge_domain.hpp index 44cf29956ef..264f8b3c031 100644 --- a/extras/vom/vom/gbp_bridge_domain.hpp +++ b/extras/vom/vom/gbp_bridge_domain.hpp @@ -17,9 +17,9 @@ #define __VOM_GBP_BRIDGE_DOMAIN_H__ #include "vom/bridge_domain.hpp" +#include "vom/gbp_route_domain.hpp" #include "vom/interface.hpp" #include "vom/singular_db.hpp" -#include "vom/types.hpp" namespace VOM { @@ -53,19 +53,23 @@ public: * Construct a GBP bridge_domain */ gbp_bridge_domain(const bridge_domain& bd, + const gbp_route_domain& rd, const interface& bvi, const flags_t& flags = flags_t::NONE); gbp_bridge_domain(const bridge_domain& bd, + const gbp_route_domain& rd, const interface& bvi, const interface& uu_fwd, const interface& bm_flood, const flags_t& flags = flags_t::NONE); gbp_bridge_domain(const bridge_domain& bd, + const gbp_route_domain& rd, const std::shared_ptr bvi, const std::shared_ptr uu_fwd, const std::shared_ptr bm_flood, const flags_t& flags = flags_t::NONE); gbp_bridge_domain(const bridge_domain& bd, + const gbp_route_domain& rd, const interface& bvi, const std::shared_ptr uu_fwd, const std::shared_ptr bm_flood, @@ -192,6 +196,7 @@ private: HW::item m_id; std::shared_ptr m_bd; + std::shared_ptr m_rd; std::shared_ptr m_bvi; std::shared_ptr m_uu_fwd; std::shared_ptr m_bm_flood; diff --git a/extras/vom/vom/gbp_bridge_domain_cmds.cpp b/extras/vom/vom/gbp_bridge_domain_cmds.cpp index 082bd4bb48d..05064df6269 100644 --- a/extras/vom/vom/gbp_bridge_domain_cmds.cpp +++ b/extras/vom/vom/gbp_bridge_domain_cmds.cpp @@ -19,11 +19,13 @@ namespace VOM { namespace gbp_bridge_domain_cmds { create_cmd::create_cmd(HW::item& item, + u32 rd_id, const handle_t bvi, const handle_t uu_fwd, const handle_t bm_flood, const gbp_bridge_domain::flags_t& flags) : rpc_cmd(item) + , m_rd_id(rd_id) , m_bvi(bvi) , m_uu_fwd(uu_fwd) , m_bm_flood(bm_flood) @@ -35,8 +37,9 @@ bool create_cmd::operator==(const create_cmd& other) const { return ((m_hw_item.data() == other.m_hw_item.data()) && - (m_bvi == other.m_bvi) && (m_uu_fwd == other.m_uu_fwd) && - (m_bm_flood == other.m_bm_flood) && (m_flags == other.m_flags)); + (m_rd_id == other.m_rd_id) && (m_bvi == other.m_bvi) && + (m_uu_fwd == other.m_uu_fwd) && (m_bm_flood == other.m_bm_flood) && + (m_flags == other.m_flags)); } rc_t @@ -47,6 +50,7 @@ create_cmd::issue(connection& con) auto& payload = req.get_request().get_payload(); payload.bd.bd_id = m_hw_item.data(); + payload.bd.rd_id = m_rd_id; payload.bd.bvi_sw_if_index = m_bvi.value(); payload.bd.uu_fwd_sw_if_index = m_uu_fwd.value(); payload.bd.bm_flood_sw_if_index = m_bm_flood.value(); diff --git a/extras/vom/vom/gbp_bridge_domain_cmds.hpp b/extras/vom/vom/gbp_bridge_domain_cmds.hpp index a4fd0d51b45..6dbe6dcdfed 100644 --- a/extras/vom/vom/gbp_bridge_domain_cmds.hpp +++ b/extras/vom/vom/gbp_bridge_domain_cmds.hpp @@ -35,6 +35,7 @@ public: * Constructor */ create_cmd(HW::item& item, + u32 rd_id, const handle_t bvi, const handle_t uu_fwd, const handle_t bm_flood, @@ -55,6 +56,7 @@ public: bool operator==(const create_cmd& i) const; private: + u32 m_rd_id; const handle_t m_bvi; const handle_t m_uu_fwd; const handle_t m_bm_flood; diff --git a/extras/vom/vom/gbp_contract.cpp b/extras/vom/vom/gbp_contract.cpp index c95c2e8008e..8fcef02da24 100644 --- a/extras/vom/vom/gbp_contract.cpp +++ b/extras/vom/vom/gbp_contract.cpp @@ -24,12 +24,14 @@ singular_db gbp_contract::m_db; gbp_contract::event_handler gbp_contract::m_evh; -gbp_contract::gbp_contract(sclass_t sclass, +gbp_contract::gbp_contract(scope_t scope, + sclass_t sclass, sclass_t dclass, const ACL::l3_list& acl, const gbp_rules_t& rules, const ethertype_set_t& allowed_ethertypes) : m_hw(false) + , m_scope(scope) , m_sclass(sclass) , m_dclass(dclass) , m_acl(acl.singular()) @@ -40,6 +42,7 @@ gbp_contract::gbp_contract(sclass_t sclass, gbp_contract::gbp_contract(const gbp_contract& gbpc) : m_hw(gbpc.m_hw) + , m_scope(gbpc.m_scope) , m_sclass(gbpc.m_sclass) , m_dclass(gbpc.m_dclass) , m_acl(gbpc.m_acl) @@ -59,7 +62,7 @@ gbp_contract::~gbp_contract() const gbp_contract::key_t gbp_contract::key() const { - return (std::make_pair(m_sclass, m_dclass)); + return (std::make_tuple(m_scope, m_sclass, m_dclass)); } bool @@ -72,7 +75,8 @@ void gbp_contract::sweep() { if (m_hw) { - HW::enqueue(new gbp_contract_cmds::delete_cmd(m_hw, m_sclass, m_dclass)); + HW::enqueue( + new gbp_contract_cmds::delete_cmd(m_hw, m_scope, m_sclass, m_dclass)); } HW::write(); } @@ -81,9 +85,9 @@ void gbp_contract::replay() { if (m_hw) { - HW::enqueue(new gbp_contract_cmds::create_cmd(m_hw, m_sclass, m_dclass, - m_acl->handle(), m_gbp_rules, - m_allowed_ethertypes)); + HW::enqueue(new gbp_contract_cmds::create_cmd( + m_hw, m_scope, m_sclass, m_dclass, m_acl->handle(), m_gbp_rules, + m_allowed_ethertypes)); } } @@ -91,8 +95,8 @@ std::string gbp_contract::to_string() const { std::ostringstream s; - s << "gbp-contract:[{" << m_sclass << ", " << m_dclass << "}, " - << m_acl->to_string(); + s << "gbp-contract:[{" << m_scope << ", " << m_sclass << ", " << m_dclass + << "}, " << m_acl->to_string(); if (m_gbp_rules.size()) { auto it = m_gbp_rules.cbegin(); while (it != m_gbp_rules.cend()) { @@ -115,9 +119,9 @@ gbp_contract::update(const gbp_contract& r) * create the table if it is not yet created */ if (rc_t::OK != m_hw.rc()) { - HW::enqueue(new gbp_contract_cmds::create_cmd(m_hw, m_sclass, m_dclass, - m_acl->handle(), m_gbp_rules, - m_allowed_ethertypes)); + HW::enqueue(new gbp_contract_cmds::create_cmd( + m_hw, m_scope, m_sclass, m_dclass, m_acl->handle(), m_gbp_rules, + m_allowed_ethertypes)); } } @@ -207,10 +211,10 @@ gbp_contract::event_handler::handle_populate(const client_db::key_t& key) allowed_ethertypes.insert(ethertype_t::from_numeric_val(et[i])); } - gbp_contract gbpc(payload.contract.sclass, payload.contract.dclass, *acl, - rules, allowed_ethertypes); + gbp_contract gbpc(payload.contract.scope, payload.contract.sclass, + payload.contract.dclass, *acl, rules, + allowed_ethertypes); OM::commit(key, gbpc); - VOM_LOG(log_level_t::DEBUG) << "read: " << gbpc.to_string(); } else { VOM_LOG(log_level_t::ERROR) << " no ACL:" << payload.contract.acl_index; @@ -233,7 +237,8 @@ gbp_contract::event_handler::show(std::ostream& os) std::ostream& operator<<(std::ostream& os, const gbp_contract::key_t& key) { - os << "{ " << key.first << "," << key.second << "}"; + os << "{ " << std::get<0>(key) << "," << std::get<1>(key) << ", " + << std::get<2>(key) << "}"; return (os); } diff --git a/extras/vom/vom/gbp_contract.hpp b/extras/vom/vom/gbp_contract.hpp index 2e8f9d0bc26..caf5a3c5a0e 100644 --- a/extras/vom/vom/gbp_contract.hpp +++ b/extras/vom/vom/gbp_contract.hpp @@ -17,8 +17,8 @@ #define __VOM_GBP_CONTRACT_H__ #include "vom/acl_l3_list.hpp" -#include "vom/gbp_endpoint.hpp" #include "vom/gbp_rule.hpp" +#include "vom/gbp_types.hpp" #include "vom/interface.hpp" #include "vom/singular_db.hpp" #include "vom/types.hpp" @@ -39,7 +39,7 @@ public: /** * The key for a contract is the pair of EPG-IDs */ - typedef std::pair key_t; + typedef std::tuple key_t; /** * A set of allowed ethertypes @@ -49,7 +49,8 @@ public: /** * Construct a GBP contract */ - gbp_contract(sclass_t sclass, + gbp_contract(scope_t scope, + sclass_t sclass, sclass_t dclass, const ACL::l3_list& acl, const gbp_rules_t& gpb_rules, @@ -166,6 +167,11 @@ private: */ HW::item m_hw; + /* + * The scope of the contract + */ + scope_t m_scope; + /** * The source EPG ID */ diff --git a/extras/vom/vom/gbp_contract_cmds.cpp b/extras/vom/vom/gbp_contract_cmds.cpp index 6aed9998e1e..1bb06bdaa69 100644 --- a/extras/vom/vom/gbp_contract_cmds.cpp +++ b/extras/vom/vom/gbp_contract_cmds.cpp @@ -20,12 +20,14 @@ namespace VOM { namespace gbp_contract_cmds { create_cmd::create_cmd(HW::item& item, + scope_t scope, sclass_t sclass, sclass_t dclass, const handle_t& acl, const gbp_contract::gbp_rules_t& gbp_rules, const gbp_contract::ethertype_set_t& allowed_ethertypes) : rpc_cmd(item) + , m_scope(scope) , m_sclass(sclass) , m_dclass(dclass) , m_acl(acl) @@ -38,7 +40,8 @@ bool create_cmd::operator==(const create_cmd& other) const { return ((m_acl == other.m_acl) && (m_sclass == other.m_sclass) && - (m_dclass == other.m_dclass) && (m_gbp_rules == other.m_gbp_rules) && + (m_scope == other.m_scope) && (m_dclass == other.m_dclass) && + (m_gbp_rules == other.m_gbp_rules) && (m_allowed_ethertypes == other.m_allowed_ethertypes)); } @@ -55,6 +58,7 @@ create_cmd::issue(connection& con) auto& payload = req.get_request().get_payload(); payload.is_add = 1; payload.contract.acl_index = m_acl.value(); + payload.contract.scope = m_scope; payload.contract.sclass = m_sclass; payload.contract.dclass = m_dclass; payload.contract.n_rules = n_rules; @@ -117,9 +121,11 @@ create_cmd::to_string() const } delete_cmd::delete_cmd(HW::item& item, + scope_t scope, sclass_t sclass, sclass_t dclass) : rpc_cmd(item) + , m_scope(scope) , m_sclass(sclass) , m_dclass(dclass) { @@ -139,6 +145,7 @@ delete_cmd::issue(connection& con) auto& payload = req.get_request().get_payload(); payload.is_add = 0; payload.contract.acl_index = ~0; + payload.contract.scope = m_scope; payload.contract.sclass = m_sclass; payload.contract.dclass = m_dclass; @@ -151,7 +158,7 @@ std::string delete_cmd::to_string() const { std::ostringstream s; - s << "gbp-contract-delete: " << m_hw_item.to_string() + s << "gbp-contract-delete: " << m_hw_item.to_string() << " scope: " << m_scope << " sclass:" << m_sclass << " dclass:" << m_dclass; return (s.str()); diff --git a/extras/vom/vom/gbp_contract_cmds.hpp b/extras/vom/vom/gbp_contract_cmds.hpp index 3b3fab97a70..d9fe1d74e37 100644 --- a/extras/vom/vom/gbp_contract_cmds.hpp +++ b/extras/vom/vom/gbp_contract_cmds.hpp @@ -35,6 +35,7 @@ public: * Constructor */ create_cmd(HW::item& item, + scope_t scope, sclass_t sclass, sclass_t dclass, const handle_t& acl, @@ -57,6 +58,7 @@ public: bool operator==(const create_cmd& i) const; private: + const scope_t m_scope; const sclass_t m_sclass; const sclass_t m_dclass; const handle_t m_acl; @@ -74,7 +76,10 @@ public: /** * Constructor */ - delete_cmd(HW::item& item, sclass_t sclass, sclass_t dclass); + delete_cmd(HW::item& item, + scope_t scope, + sclass_t sclass, + sclass_t dclass); /** * Issue the command to VPP/HW @@ -92,6 +97,7 @@ public: bool operator==(const delete_cmd& i) const; private: + const scope_t m_scope; const sclass_t m_sclass; const sclass_t m_dclass; }; diff --git a/extras/vom/vom/gbp_endpoint_group.hpp b/extras/vom/vom/gbp_endpoint_group.hpp index 5c061a900b3..e15a1885317 100644 --- a/extras/vom/vom/gbp_endpoint_group.hpp +++ b/extras/vom/vom/gbp_endpoint_group.hpp @@ -22,15 +22,10 @@ #include "vom/gbp_bridge_domain.hpp" #include "vom/gbp_route_domain.hpp" +#include "vom/gbp_types.hpp" namespace VOM { -/** - * EPG IDs are 32 bit integers - */ -typedef uint32_t vnid_t; -typedef uint16_t sclass_t; - /** * A entry in the ARP termination table of a Bridge Domain */ diff --git a/extras/vom/vom/gbp_route_domain.cpp b/extras/vom/vom/gbp_route_domain.cpp index 8f0eae3b3aa..54b51cf88a3 100644 --- a/extras/vom/vom/gbp_route_domain.cpp +++ b/extras/vom/vom/gbp_route_domain.cpp @@ -34,26 +34,31 @@ gbp_route_domain::event_handler gbp_route_domain::m_evh; gbp_route_domain::gbp_route_domain(const gbp_route_domain& rd) : m_id(rd.id()) , m_rd(rd.m_rd) + , m_scope(rd.m_scope) , m_ip4_uu_fwd(rd.m_ip4_uu_fwd) , m_ip6_uu_fwd(rd.m_ip6_uu_fwd) { } gbp_route_domain::gbp_route_domain(const route_domain& rd, + scope_t scope, const interface& ip4_uu_fwd, const interface& ip6_uu_fwd) : m_id(rd.table_id()) , m_rd(rd.singular()) + , m_scope(scope) , m_ip4_uu_fwd(ip4_uu_fwd.singular()) , m_ip6_uu_fwd(ip6_uu_fwd.singular()) { } gbp_route_domain::gbp_route_domain(const route_domain& rd, + scope_t scope, const std::shared_ptr ip4_uu_fwd, const std::shared_ptr ip6_uu_fwd) : m_id(rd.table_id()) , m_rd(rd.singular()) + , m_scope(scope) , m_ip4_uu_fwd(ip4_uu_fwd) , m_ip6_uu_fwd(ip6_uu_fwd) { @@ -63,9 +68,10 @@ gbp_route_domain::gbp_route_domain(const route_domain& rd, m_ip6_uu_fwd = m_ip6_uu_fwd->singular(); } -gbp_route_domain::gbp_route_domain(const route_domain& rd) +gbp_route_domain::gbp_route_domain(const route_domain& rd, scope_t scope) : m_id(rd.table_id()) , m_rd(rd.singular()) + , m_scope(scope) , m_ip4_uu_fwd() , m_ip6_uu_fwd() { @@ -120,7 +126,7 @@ gbp_route_domain::operator==(const gbp_route_domain& b) const else equal = false; - return ((m_rd->key() == b.m_rd->key()) && equal); + return ((m_rd->key() == b.m_rd->key()) && m_scope == b.m_scope && equal); } void @@ -138,10 +144,10 @@ gbp_route_domain::replay() if (rc_t::OK == m_id.rc()) { if (m_ip4_uu_fwd && m_ip6_uu_fwd) HW::enqueue(new gbp_route_domain_cmds::create_cmd( - m_id, m_ip4_uu_fwd->handle(), m_ip6_uu_fwd->handle())); + m_id, m_scope, m_ip4_uu_fwd->handle(), m_ip6_uu_fwd->handle())); else - HW::enqueue(new gbp_route_domain_cmds::create_cmd(m_id, handle_t::INVALID, - handle_t::INVALID)); + HW::enqueue(new gbp_route_domain_cmds::create_cmd( + m_id, m_scope, handle_t::INVALID, handle_t::INVALID)); } } @@ -157,7 +163,7 @@ std::string gbp_route_domain::to_string() const { std::ostringstream s; - s << "gbp-route-domain:[" << m_rd->to_string(); + s << "gbp-route-domain:[" << m_rd->to_string() << "scope:" << m_scope; if (m_ip4_uu_fwd) s << " v4-uu:[" << m_ip4_uu_fwd->to_string() << "]"; @@ -178,16 +184,13 @@ gbp_route_domain::find(const key_t& key) void gbp_route_domain::update(const gbp_route_domain& desired) { - /* - * the desired state is always that the interface should be created - */ if (rc_t::OK != m_id.rc()) { if (m_ip4_uu_fwd && m_ip6_uu_fwd) HW::enqueue(new gbp_route_domain_cmds::create_cmd( - m_id, m_ip4_uu_fwd->handle(), m_ip6_uu_fwd->handle())); + m_id, m_scope, m_ip4_uu_fwd->handle(), m_ip6_uu_fwd->handle())); else - HW::enqueue(new gbp_route_domain_cmds::create_cmd(m_id, handle_t::INVALID, - handle_t::INVALID)); + HW::enqueue(new gbp_route_domain_cmds::create_cmd( + m_id, m_scope, handle_t::INVALID, handle_t::INVALID)); } } @@ -230,11 +233,12 @@ gbp_route_domain::event_handler::handle_populate(const client_db::key_t& key) interface::find(payload.rd.ip4_uu_sw_if_index); if (ip6_uu_fwd && ip4_uu_fwd) { - gbp_route_domain rd(payload.rd.rd_id, *ip4_uu_fwd, *ip6_uu_fwd); + gbp_route_domain rd(payload.rd.rd_id, payload.rd.scope, *ip4_uu_fwd, + *ip6_uu_fwd); OM::commit(key, rd); VOM_LOG(log_level_t::DEBUG) << "dump: " << rd.to_string(); } else { - gbp_route_domain rd(payload.rd.rd_id); + gbp_route_domain rd(payload.rd.rd_id, payload.rd.scope); OM::commit(key, rd); VOM_LOG(log_level_t::DEBUG) << "dump: " << rd.to_string(); } diff --git a/extras/vom/vom/gbp_route_domain.hpp b/extras/vom/vom/gbp_route_domain.hpp index d2dc049deff..dd096738297 100644 --- a/extras/vom/vom/gbp_route_domain.hpp +++ b/extras/vom/vom/gbp_route_domain.hpp @@ -16,6 +16,7 @@ #ifndef __VOM_GBP_ROUTE_DOMAIN_H__ #define __VOM_GBP_ROUTE_DOMAIN_H__ +#include "vom/gbp_types.hpp" #include "vom/interface.hpp" #include "vom/route_domain.hpp" #include "vom/singular_db.hpp" @@ -37,12 +38,14 @@ public: /** * Construct a GBP route_domain */ - gbp_route_domain(const route_domain& rd); + gbp_route_domain(const route_domain& rd, scope_t scope); gbp_route_domain(const route_domain& rd, + scope_t scope, const interface& ip4_uu_fwd, const interface& ip6_uu_fwd); gbp_route_domain(const route_domain& rd, + scope_t scope, const std::shared_ptr ip4_uu_fwd, const std::shared_ptr ip6_uu_fwd); @@ -171,6 +174,7 @@ private: HW::item m_id; std::shared_ptr m_rd; + scope_t m_scope; std::shared_ptr m_ip4_uu_fwd; std::shared_ptr m_ip6_uu_fwd; diff --git a/extras/vom/vom/gbp_route_domain_cmds.cpp b/extras/vom/vom/gbp_route_domain_cmds.cpp index 9b8b4bee3fd..90e81f338e3 100644 --- a/extras/vom/vom/gbp_route_domain_cmds.cpp +++ b/extras/vom/vom/gbp_route_domain_cmds.cpp @@ -19,9 +19,11 @@ namespace VOM { namespace gbp_route_domain_cmds { create_cmd::create_cmd(HW::item& item, + scope_t scope, const handle_t ip4_uu_fwd, const handle_t ip6_uu_fwd) : rpc_cmd(item) + , m_scope(scope) , m_ip4_uu_fwd(ip4_uu_fwd) , m_ip6_uu_fwd(ip6_uu_fwd) { @@ -31,7 +33,7 @@ bool create_cmd::operator==(const create_cmd& other) const { return ((m_hw_item.data() == other.m_hw_item.data()) && - (m_ip4_uu_fwd == other.m_ip4_uu_fwd) && + (m_scope == other.m_scope) && (m_ip4_uu_fwd == other.m_ip4_uu_fwd) && (m_ip6_uu_fwd == other.m_ip6_uu_fwd)); } @@ -43,6 +45,7 @@ create_cmd::issue(connection& con) auto& payload = req.get_request().get_payload(); payload.rd.rd_id = m_hw_item.data(); + payload.rd.scope = m_scope; payload.rd.ip4_table_id = m_hw_item.data(); payload.rd.ip6_table_id = m_hw_item.data(); payload.rd.ip4_uu_sw_if_index = m_ip4_uu_fwd.value(); @@ -57,7 +60,7 @@ std::string create_cmd::to_string() const { std::ostringstream s; - s << "gbp-route-domain: " << m_hw_item.to_string() + s << "gbp-route-domain: " << m_hw_item.to_string() << " scope:" << m_scope << " ip4-uu-fwd:" << m_ip4_uu_fwd.to_string() << " ip6-uu-fwd:" << m_ip6_uu_fwd.to_string(); diff --git a/extras/vom/vom/gbp_route_domain_cmds.hpp b/extras/vom/vom/gbp_route_domain_cmds.hpp index 249ba901329..6ef9fcd3ce9 100644 --- a/extras/vom/vom/gbp_route_domain_cmds.hpp +++ b/extras/vom/vom/gbp_route_domain_cmds.hpp @@ -35,6 +35,7 @@ public: * Constructor */ create_cmd(HW::item& item, + scope_t scope, const handle_t ip4_uu_fwd, const handle_t ip6_uu_fwd); @@ -53,6 +54,7 @@ public: bool operator==(const create_cmd& i) const; private: + const scope_t m_scope; const handle_t m_ip4_uu_fwd; const handle_t m_ip6_uu_fwd; }; diff --git a/extras/vom/vom/gbp_types.hpp b/extras/vom/vom/gbp_types.hpp new file mode 100644 index 00000000000..5b46e08f513 --- /dev/null +++ b/extras/vom/vom/gbp_types.hpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VOM_GBP_TYPES_H__ +#define __VOM_GBP_TYPES_H__ + +#include + +namespace VOM { + +/** + * EPG IDs are 32 bit integers + */ +typedef uint32_t vnid_t; +typedef uint16_t sclass_t; +typedef uint16_t scope_t; + +}; // namespace + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "mozilla") + * End: + */ + +#endif -- cgit 1.2.3-korg