From 8ea109e40a65c1d7696162fa3d4c1e386b6c9414 Mon Sep 17 00:00:00 2001 From: Mohsin Kazmi Date: Fri, 22 Mar 2019 15:13:31 +0100 Subject: [PATCH] gbp: Add bd flags Add flags for unknown unicast drop, multicast and broadcast drop and arp unicast. Change-Id: I1203137510b8bee0a20ecfe5f2efad8043d4bac6 Signed-off-by: Mohsin Kazmi --- extras/vom/vom/gbp_bridge_domain.cpp | 23 ++++++++++++++++++-- extras/vom/vom/gbp_bridge_domain.hpp | 3 +++ extras/vom/vom/gbp_bridge_domain_cmds.cpp | 19 ++++++++++++---- src/plugins/gbp/gbp.api | 3 +++ src/plugins/gbp/gbp_api.c | 7 +++++- src/plugins/gbp/gbp_bridge_domain.c | 36 ++++++++++++++++++++++--------- src/plugins/gbp/gbp_bridge_domain.h | 3 +++ test/test_gbp.py | 6 +++++- 8 files changed, 82 insertions(+), 18 deletions(-) diff --git a/extras/vom/vom/gbp_bridge_domain.cpp b/extras/vom/vom/gbp_bridge_domain.cpp index c8d42d264a3..cfa07681545 100644 --- a/extras/vom/vom/gbp_bridge_domain.cpp +++ b/extras/vom/vom/gbp_bridge_domain.cpp @@ -25,6 +25,15 @@ 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"); +const gbp_bridge_domain::flags_t gbp_bridge_domain::flags_t::UU_FWD_DROP( + 2, + "uu-fwd-drop"); +const gbp_bridge_domain::flags_t gbp_bridge_domain::flags_t::MCAST_DROP( + 4, + "mcast-drop"); +const gbp_bridge_domain::flags_t gbp_bridge_domain::flags_t::UCAST_ARP( + 8, + "ucast-arp"); gbp_bridge_domain::flags_t::flags_t(int v, const std::string& s) : enum_base(v, s) @@ -273,12 +282,22 @@ gbp_bridge_domain::event_handler::handle_populate(const client_db::key_t& key) std::shared_ptr bvi = interface::find(payload.bd.bvi_sw_if_index); + flags_t flags = gbp_bridge_domain::flags_t::NONE; + if (payload.bd.flags & GBP_BD_API_FLAG_DO_NOT_LEARN) + flags |= gbp_bridge_domain::flags_t::DO_NOT_LEARN; + if (payload.bd.flags & GBP_BD_API_FLAG_UU_FWD_DROP) + flags |= gbp_bridge_domain::flags_t::UU_FWD_DROP; + if (payload.bd.flags & GBP_BD_API_FLAG_MCAST_DROP) + flags |= gbp_bridge_domain::flags_t::MCAST_DROP; + 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); + gbp_bridge_domain bd(payload.bd.bd_id, 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); + gbp_bridge_domain bd(payload.bd.bd_id, *bvi, flags); OM::commit(key, bd); VOM_LOG(log_level_t::DEBUG) << "dump: " << bd.to_string(); } else { diff --git a/extras/vom/vom/gbp_bridge_domain.hpp b/extras/vom/vom/gbp_bridge_domain.hpp index 2c470aa3a6e..64429fc730e 100644 --- a/extras/vom/vom/gbp_bridge_domain.hpp +++ b/extras/vom/vom/gbp_bridge_domain.hpp @@ -38,6 +38,9 @@ public: { const static flags_t NONE; const static flags_t DO_NOT_LEARN; + const static flags_t UU_FWD_DROP; + const static flags_t MCAST_DROP; + const static flags_t UCAST_ARP; static const flags_t& from_vpp(int i); diff --git a/extras/vom/vom/gbp_bridge_domain_cmds.cpp b/extras/vom/vom/gbp_bridge_domain_cmds.cpp index 6fa8c49f9e5..082bd4bb48d 100644 --- a/extras/vom/vom/gbp_bridge_domain_cmds.cpp +++ b/extras/vom/vom/gbp_bridge_domain_cmds.cpp @@ -51,10 +51,21 @@ create_cmd::issue(connection& con) payload.bd.uu_fwd_sw_if_index = m_uu_fwd.value(); payload.bd.bm_flood_sw_if_index = m_bm_flood.value(); - payload.bd.flags = GBP_BD_API_FLAG_NONE; - if (gbp_bridge_domain::flags_t::DO_NOT_LEARN == m_flags) - payload.bd.flags = GBP_BD_API_FLAG_DO_NOT_LEARN; - + vapi_enum_gbp_bridge_domain_flags flags = GBP_BD_API_FLAG_NONE; + if (gbp_bridge_domain::flags_t::DO_NOT_LEARN & m_flags) + flags = static_cast( + flags | GBP_BD_API_FLAG_DO_NOT_LEARN); + if (gbp_bridge_domain::flags_t::UU_FWD_DROP & m_flags) + flags = static_cast( + flags | GBP_BD_API_FLAG_UU_FWD_DROP); + if (gbp_bridge_domain::flags_t::MCAST_DROP & m_flags) + flags = static_cast( + flags | GBP_BD_API_FLAG_MCAST_DROP); + if (gbp_bridge_domain::flags_t::UCAST_ARP & m_flags) + flags = static_cast( + flags | GBP_BD_API_FLAG_UCAST_ARP); + + payload.bd.flags = flags; VAPI_CALL(req.execute()); return (wait()); diff --git a/src/plugins/gbp/gbp.api b/src/plugins/gbp/gbp.api index 31bf3f28970..b55d8a86466 100644 --- a/src/plugins/gbp/gbp.api +++ b/src/plugins/gbp/gbp.api @@ -23,6 +23,9 @@ enum gbp_bridge_domain_flags { GBP_BD_API_FLAG_NONE = 0, GBP_BD_API_FLAG_DO_NOT_LEARN = 1, + GBP_BD_API_FLAG_UU_FWD_DROP = 2, + GBP_BD_API_FLAG_MCAST_DROP = 4, + GBP_BD_API_FLAG_UCAST_ARP = 8, }; typedef gbp_bridge_domain diff --git a/src/plugins/gbp/gbp_api.c b/src/plugins/gbp/gbp_api.c index 8878119d766..76f0b218a19 100644 --- a/src/plugins/gbp/gbp_api.c +++ b/src/plugins/gbp/gbp_api.c @@ -325,7 +325,12 @@ gbp_bridge_domain_flags_from_api (vl_api_gbp_bridge_domain_flags_t a) if (a & GBP_BD_API_FLAG_DO_NOT_LEARN) g |= GBP_BD_FLAG_DO_NOT_LEARN; - + if (a & GBP_BD_API_FLAG_UU_FWD_DROP) + g |= GBP_BD_FLAG_UU_FWD_DROP; + if (a & GBP_BD_API_FLAG_MCAST_DROP) + g |= GBP_BD_FLAG_MCAST_DROP; + if (a & GBP_BD_API_FLAG_UCAST_ARP) + g |= GBP_BD_FLAG_UCAST_ARP; return (g); } diff --git a/src/plugins/gbp/gbp_bridge_domain.c b/src/plugins/gbp/gbp_bridge_domain.c index 17ccc345b66..8896669002c 100644 --- a/src/plugins/gbp/gbp_bridge_domain.c +++ b/src/plugins/gbp/gbp_bridge_domain.c @@ -121,7 +121,13 @@ format_gbp_bridge_domain_flags (u8 * s, va_list * args) if (gf) { if (gf & GBP_BD_FLAG_DO_NOT_LEARN) - s = format (s, "do-not-learn"); + s = format (s, "do-not-learn "); + if (gf & GBP_BD_FLAG_UU_FWD_DROP) + s = format (s, "uu-fwd-drop "); + if (gf & GBP_BD_FLAG_MCAST_DROP) + s = format (s, "mcast-drop "); + if (gf & GBP_BD_FLAG_UCAST_ARP) + s = format (s, "ucast-arp "); } else { @@ -183,10 +189,11 @@ gbp_bridge_domain_add_and_lock (u32 bd_id, if (~0 == bd_index) return (VNET_API_ERROR_BD_NOT_MODIFIABLE); - /* - * unset learning in the bridge - */ - bd_set_flags (vlib_get_main (), bd_index, L2_LEARN, 0); + bd_flags_t bd_flags = L2_LEARN; + if (flags & GBP_BD_FLAG_UU_FWD_DROP) + bd_flags |= L2_UU_FLOOD; + if (flags & GBP_BD_FLAG_MCAST_DROP) + bd_flags |= L2_FLOOD; pool_get (gbp_bridge_domain_pool, gb); memset (gb, 0, sizeof (*gb)); @@ -205,13 +212,16 @@ gbp_bridge_domain_add_and_lock (u32 bd_id, set_int_l2_mode (vlib_get_main (), vnet_get_main (), MODE_L2_BRIDGE, gb->gb_bvi_sw_if_index, bd_index, L2_BD_PORT_TYPE_BVI, 0, 0); - if (~0 != gb->gb_uu_fwd_sw_if_index) + + if (!(flags & GBP_BD_FLAG_UU_FWD_DROP) + && ~0 != gb->gb_uu_fwd_sw_if_index) { set_int_l2_mode (vlib_get_main (), vnet_get_main (), MODE_L2_BRIDGE, gb->gb_uu_fwd_sw_if_index, bd_index, L2_BD_PORT_TYPE_UU_FWD, 0, 0); } - if (~0 != gb->gb_bm_flood_sw_if_index) + if (!(flags & GBP_BD_FLAG_MCAST_DROP) + && ~0 != gb->gb_bm_flood_sw_if_index) { set_int_l2_mode (vlib_get_main (), vnet_get_main (), MODE_L2_BRIDGE, gb->gb_bm_flood_sw_if_index, @@ -219,6 +229,11 @@ gbp_bridge_domain_add_and_lock (u32 bd_id, gbp_learn_enable (gb->gb_bm_flood_sw_if_index, GBP_LEARN_MODE_L2); } + /* + * unset learning in the bridge + any flag(s) set above + */ + bd_set_flags (vlib_get_main (), bd_index, bd_flags, 0); + /* * Add the BVI's MAC to the L2FIB */ @@ -343,8 +358,8 @@ gbp_bridge_domain_cli (vlib_main_t * vm, add = 1; else if (unformat (input, "del")) add = 0; - else if (unformat (input, "flags &d", &flags)) - add = 0; + else if (unformat (input, "flags %d", &flags)) + ; else if (unformat (input, "bd %d", &bd_id)) ; else @@ -380,7 +395,8 @@ gbp_bridge_domain_cli (vlib_main_t * vm, /* *INDENT-OFF* */ VLIB_CLI_COMMAND (gbp_bridge_domain_cli_node, static) = { .path = "gbp bridge-domain", - .short_help = "gbp bridge-domain [del] bd bvi uu-flood ", + .short_help = "gbp bridge-domain [del] bd bvi " + " uu-flood [flags ]", .function = gbp_bridge_domain_cli, }; diff --git a/src/plugins/gbp/gbp_bridge_domain.h b/src/plugins/gbp/gbp_bridge_domain.h index 8e6146c7955..dd2798fdafa 100644 --- a/src/plugins/gbp/gbp_bridge_domain.h +++ b/src/plugins/gbp/gbp_bridge_domain.h @@ -27,6 +27,9 @@ typedef enum gbp_bridge_domain_flags_t_ { GBP_BD_FLAG_NONE = 0, GBP_BD_FLAG_DO_NOT_LEARN = (1 << 0), + GBP_BD_FLAG_UU_FWD_DROP = (1 << 1), + GBP_BD_FLAG_MCAST_DROP = (1 << 2), + GBP_BD_FLAG_UCAST_ARP = (1 << 3), } gbp_bridge_domain_flags_t; /** diff --git a/test/test_gbp.py b/test/test_gbp.py index 7f9032970d5..b9bca811cbc 100644 --- a/test/test_gbp.py +++ b/test/test_gbp.py @@ -318,7 +318,7 @@ class VppGbpBridgeDomain(VppObject): """ def __init__(self, test, bd, bvi, uu_fwd=None, - bm_flood=None, learn=True): + bm_flood=None, learn=True, uu_drop=False, bm_drop=False): self._test = test self.bvi = bvi self.uu_fwd = uu_fwd @@ -330,6 +330,10 @@ class VppGbpBridgeDomain(VppObject): self.learn = e.GBP_BD_API_FLAG_NONE else: self.learn = e.GBP_BD_API_FLAG_DO_NOT_LEARN + if (uu_drop): + self.learn |= e.GBP_BD_API_FLAG_UU_FWD_DROP + if (bm_drop): + self.learn |= e.GBP_BD_API_FLAG_MCAST_DROP def add_vpp_config(self): self._test.vapi.gbp_bridge_domain_add( -- 2.16.6