summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenoît Ganne <bganne@cisco.com>2019-06-26 13:58:09 +0200
committerNeale Ranns <nranns@cisco.com>2019-07-02 14:18:59 +0000
commit2ec825937b7ac856f67d086ce6814dd21c5e9bd7 (patch)
treeadd7b051c3ff3f1f4437efbf2f3a3e8279f79b4f
parent12df497bb6b7f60513f48c0dacca9ad99d717192 (diff)
gbp: disable L2 BD learning per-interface
Disable L2 BD learning for each GBP interface instead of at the bridge level. This does not change the current behavior (learning is disabled for all GBP interfaces) but enables turning it on selectively for future features such as anonymous l3-out. Type: refactor Change-Id: Id88644277941d703600acf97d49cbc3332ae3f68 Signed-off-by: Benoît Ganne <bganne@cisco.com>
-rw-r--r--src/plugins/gbp/gbp_bridge_domain.c60
-rw-r--r--src/plugins/gbp/gbp_bridge_domain.h6
-rw-r--r--src/plugins/gbp/gbp_endpoint_group.c11
-rw-r--r--src/plugins/gbp/gbp_itf.c11
4 files changed, 51 insertions, 37 deletions
diff --git a/src/plugins/gbp/gbp_bridge_domain.c b/src/plugins/gbp/gbp_bridge_domain.c
index 6c14fbcbfdd..3e6d7ef66b6 100644
--- a/src/plugins/gbp/gbp_bridge_domain.c
+++ b/src/plugins/gbp/gbp_bridge_domain.c
@@ -174,6 +174,28 @@ format_gbp_bridge_domain (u8 * s, va_list * args)
return (s);
}
+void
+gbp_bridge_domain_itf_add (u32 sw_if_index, u32 bd_index,
+ l2_bd_port_type_t type)
+{
+ set_int_l2_mode (vlib_get_main (), vnet_get_main (), MODE_L2_BRIDGE,
+ sw_if_index, bd_index, type, 0, 0);
+ /*
+ * adding an interface to the bridge enable learning on the
+ * interface. Disable learning on the interface by default for gbp
+ * interfaces
+ */
+ l2input_intf_bitmap_enable (sw_if_index, L2INPUT_FEAT_LEARN, 0);
+}
+
+void
+gbp_bridge_domain_itf_del (u32 sw_if_index, u32 bd_index,
+ l2_bd_port_type_t type)
+{
+ set_int_l2_mode (vlib_get_main (), vnet_get_main (), MODE_L3, sw_if_index,
+ bd_index, type, 0, 0);
+}
+
int
gbp_bridge_domain_add_and_lock (u32 bd_id,
u32 rd_id,
@@ -197,7 +219,7 @@ gbp_bridge_domain_add_and_lock (u32 bd_id,
if (~0 == bd_index)
return (VNET_API_ERROR_BD_NOT_MODIFIABLE);
- bd_flags_t bd_flags = L2_LEARN;
+ bd_flags_t bd_flags = L2_NONE;
if (flags & GBP_BD_FLAG_UU_FWD_DROP)
bd_flags |= L2_UU_FLOOD;
if (flags & GBP_BD_FLAG_MCAST_DROP)
@@ -225,29 +247,24 @@ gbp_bridge_domain_add_and_lock (u32 bd_id,
/*
* Set the BVI and uu-flood interfaces into the BD
*/
- 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);
+ gbp_bridge_domain_itf_add (gb->gb_bvi_sw_if_index, bd_index,
+ L2_BD_PORT_TYPE_BVI);
if ((!(flags & GBP_BD_FLAG_UU_FWD_DROP)
|| (flags & GBP_BD_FLAG_UCAST_ARP))
&& ~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);
- }
+ gbp_bridge_domain_itf_add (gb->gb_uu_fwd_sw_if_index, bd_index,
+ L2_BD_PORT_TYPE_UU_FWD);
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,
- bd_index, L2_BD_PORT_TYPE_NORMAL, 0, 0);
+ gbp_bridge_domain_itf_add (gb->gb_bm_flood_sw_if_index, bd_index,
+ L2_BD_PORT_TYPE_NORMAL);
gbp_learn_enable (gb->gb_bm_flood_sw_if_index, GBP_LEARN_MODE_L2);
}
/*
- * unset learning in the bridge + any flag(s) set above
+ * unset any flag(s) set above
*/
bd_set_flags (vlib_get_main (), bd_index, bd_flags, 0);
@@ -296,20 +313,15 @@ gbp_bridge_domain_unlock (index_t index)
(vnet_get_main (), gb->gb_bvi_sw_if_index),
gb->gb_bd_index, gb->gb_bvi_sw_if_index);
- set_int_l2_mode (vlib_get_main (), vnet_get_main (),
- MODE_L3, gb->gb_bvi_sw_if_index,
- gb->gb_bd_index, L2_BD_PORT_TYPE_BVI, 0, 0);
+ gbp_bridge_domain_itf_del (gb->gb_bvi_sw_if_index, gb->gb_bd_index,
+ L2_BD_PORT_TYPE_BVI);
if (~0 != gb->gb_uu_fwd_sw_if_index)
- {
- set_int_l2_mode (vlib_get_main (), vnet_get_main (),
- MODE_L3, gb->gb_uu_fwd_sw_if_index,
- gb->gb_bd_index, L2_BD_PORT_TYPE_UU_FWD, 0, 0);
- }
+ gbp_bridge_domain_itf_del (gb->gb_uu_fwd_sw_if_index, gb->gb_bd_index,
+ L2_BD_PORT_TYPE_UU_FWD);
if (~0 != gb->gb_bm_flood_sw_if_index)
{
- set_int_l2_mode (vlib_get_main (), vnet_get_main (),
- MODE_L3, gb->gb_bm_flood_sw_if_index,
- gb->gb_bd_index, L2_BD_PORT_TYPE_NORMAL, 0, 0);
+ gbp_bridge_domain_itf_del (gb->gb_bm_flood_sw_if_index,
+ gb->gb_bd_index, L2_BD_PORT_TYPE_NORMAL);
gbp_learn_enable (gb->gb_bm_flood_sw_if_index, GBP_LEARN_MODE_L2);
}
diff --git a/src/plugins/gbp/gbp_bridge_domain.h b/src/plugins/gbp/gbp_bridge_domain.h
index 5bfa099f31d..67043685ea3 100644
--- a/src/plugins/gbp/gbp_bridge_domain.h
+++ b/src/plugins/gbp/gbp_bridge_domain.h
@@ -19,6 +19,7 @@
#include <plugins/gbp/gbp_types.h>
#include <vnet/fib/fib_types.h>
+#include <vnet/l2/l2_bd.h>
/**
* Bridge Domain Flags
@@ -84,6 +85,11 @@ typedef struct gbp_bridge_domain_t_
u32 gb_locks;
} gbp_bridge_domain_t;
+extern void gbp_bridge_domain_itf_add (u32 sw_if_index, u32 bd_index,
+ l2_bd_port_type_t type);
+extern void gbp_bridge_domain_itf_del (u32 sw_if_index, u32 bd_index,
+ l2_bd_port_type_t type);
+
extern int gbp_bridge_domain_add_and_lock (u32 bd_id,
u32 rd_id,
gbp_bridge_domain_flags_t flags,
diff --git a/src/plugins/gbp/gbp_endpoint_group.c b/src/plugins/gbp/gbp_endpoint_group.c
index 85afee2da72..bacbb0cfb5e 100644
--- a/src/plugins/gbp/gbp_endpoint_group.c
+++ b/src/plugins/gbp/gbp_endpoint_group.c
@@ -138,9 +138,8 @@ gbp_endpoint_group_add_and_lock (vnid_t vnid,
* Add the uplink to the BD
* packets direct from the uplink have had policy applied
*/
- set_int_l2_mode (vlib_get_main (), vnet_get_main (),
- MODE_L2_BRIDGE, gg->gg_uplink_sw_if_index,
- gg->gg_bd_index, L2_BD_PORT_TYPE_NORMAL, 0, 0);
+ gbp_bridge_domain_itf_add (gg->gg_uplink_sw_if_index,
+ gg->gg_bd_index, L2_BD_PORT_TYPE_NORMAL);
l2input_intf_bitmap_enable (gg->gg_uplink_sw_if_index,
L2INPUT_FEAT_GBP_NULL_CLASSIFY, 1);
}
@@ -179,10 +178,8 @@ gbp_endpoint_group_unlock (index_t ggi)
if (~0 != gg->gg_uplink_sw_if_index)
{
- set_int_l2_mode (vlib_get_main (), vnet_get_main (),
- MODE_L3, gg->gg_uplink_sw_if_index,
- gg->gg_bd_index, L2_BD_PORT_TYPE_NORMAL, 0, 0);
-
+ gbp_bridge_domain_itf_del (gg->gg_uplink_sw_if_index,
+ gg->gg_bd_index, L2_BD_PORT_TYPE_NORMAL);
l2input_intf_bitmap_enable (gg->gg_uplink_sw_if_index,
L2INPUT_FEAT_GBP_NULL_CLASSIFY, 0);
}
diff --git a/src/plugins/gbp/gbp_itf.c b/src/plugins/gbp/gbp_itf.c
index 4944f278144..59c96291279 100644
--- a/src/plugins/gbp/gbp_itf.c
+++ b/src/plugins/gbp/gbp_itf.c
@@ -14,6 +14,7 @@
*/
#include <plugins/gbp/gbp_itf.h>
+#include <plugins/gbp/gbp_bridge_domain.h>
/**
* Attributes and configurations attached to interfaces by GBP
@@ -66,10 +67,8 @@ gbp_itf_add_and_lock (u32 sw_if_index, u32 bd_index)
gi->gi_bd_index = bd_index;
if (~0 != gi->gi_bd_index)
- set_int_l2_mode (vlib_get_main (), vnet_get_main (),
- MODE_L2_BRIDGE, sw_if_index, bd_index,
- L2_BD_PORT_TYPE_NORMAL, 0, 0);
-
+ gbp_bridge_domain_itf_add (sw_if_index, bd_index,
+ L2_BD_PORT_TYPE_NORMAL);
}
gi->gi_locks++;
@@ -89,8 +88,8 @@ gbp_itf_unlock (index_t gii)
if (0 == gi->gi_locks)
{
if (~0 != gi->gi_bd_index)
- set_int_l2_mode (vlib_get_main (), vnet_get_main (), MODE_L3,
- gi->gi_sw_if_index, 0, L2_BD_PORT_TYPE_NORMAL, 0, 0);
+ gbp_bridge_domain_itf_del (gi->gi_sw_if_index, gi->gi_bd_index,
+ L2_BD_PORT_TYPE_NORMAL);
vec_free (gi->gi_l2_input_fbs);
vec_free (gi->gi_l2_output_fbs);
s="p">(res_gro[0]) self.pg2.coalesce_enable() self.pg3.coalesce_enable() @classmethod def tearDownClass(self): super(TestGRO, self).tearDownClass() def setUp(self): super(TestGRO, self).setUp() for i in self.pg_interfaces: i.admin_up() i.config_ip4() i.config_ip6() i.disable_ipv6_ra() i.resolve_arp() i.resolve_ndp() def tearDown(self): super(TestGRO, self).tearDown() if not self.vpp_dead: for i in self.pg_interfaces: i.unconfig_ip4() i.unconfig_ip6() i.admin_down() def test_gro(self): """ GRO test """ n_packets = 124 # # Send 1500 bytes frame with gro disabled # p4 = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4, flags='DF') / TCP(sport=1234, dport=4321) / Raw(b'\xa5' * 1460)) rxs = self.send_and_expect(self.pg0, n_packets * p4, self.pg1) for rx in rxs: self.assertEqual(rx[Ether].src, self.pg1.local_mac) self.assertEqual(rx[Ether].dst, self.pg1.remote_mac) self.assertEqual(rx[IP].src, self.pg0.remote_ip4) self.assertEqual(rx[IP].dst, self.pg1.remote_ip4) self.assertEqual(rx[TCP].sport, 1234) self.assertEqual(rx[TCP].dport, 4321) # # Send 1500 bytes frame with gro enabled on # output interfaces support GRO # p = [] s = 0 for n in range(0, n_packets): p.append((Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg2.remote_ip4, flags='DF') / TCP(sport=1234, dport=4321, seq=s, ack=n, flags='A') / Raw(b'\xa5' * 1460))) s += 1460 rxs = self.send_and_expect(self.pg0, p, self.pg2, n_rx=2) i = 0 for rx in rxs: i += 1 self.assertEqual(rx[Ether].src, self.pg2.local_mac) self.assertEqual(rx[Ether].dst, self.pg2.remote_mac) self.assertEqual(rx[IP].src, self.pg0.remote_ip4) self.assertEqual(rx[IP].dst, self.pg2.remote_ip4) self.assertEqual(rx[IP].len, 64280) # 1460 * 44 + 40 < 65536 self.assertEqual(rx[TCP].sport, 1234) self.assertEqual(rx[TCP].dport, 4321) self.assertEqual(rx[TCP].ack, (44*i - 1)) p4_temp = (Ether(src=self.pg2.remote_mac, dst=self.pg2.local_mac) / IP(src=self.pg2.remote_ip4, dst=self.pg0.remote_ip4, flags='DF') / TCP(sport=1234, dport=4321, flags='F')) rxs = self.send_and_expect(self.pg2, 100*[p4_temp], self.pg0, n_rx=100) rx_coalesce = self.pg2.get_capture(1, timeout=1) rx0 = rx_coalesce[0] self.assertEqual(rx0[Ether].src, self.pg2.local_mac) self.assertEqual(rx0[Ether].dst, self.pg2.remote_mac) self.assertEqual(rx0[IP].src, self.pg0.remote_ip4) self.assertEqual(rx0[IP].dst, self.pg2.remote_ip4) self.assertEqual(rx0[IP].len, 52600) # 1460 * 36 + 40 self.assertEqual(rx0[TCP].sport, 1234) self.assertEqual(rx0[TCP].dport, 4321) for rx in rxs: self.assertEqual(rx[Ether].src, self.pg0.local_mac) self.assertEqual(rx[Ether].dst, self.pg0.remote_mac) self.assertEqual(rx[IP].src, self.pg2.remote_ip4) self.assertEqual(rx[IP].dst, self.pg0.remote_ip4) self.assertEqual(rx[IP].len, 40) self.assertEqual(rx[TCP].sport, 1234) self.assertEqual(rx[TCP].dport, 4321) if __name__ == '__main__': unittest.main(testRunner=VppTestRunner)