Skip to content

Commit b9fa29d

Browse files
Neale RannsJohn Lo
authored andcommitted
L2-flood: no clone for 1 replication
Change-Id: If178dd38e7920f35588f5d821ff097168b078026 Signed-off-by: Neale Ranns <[email protected]>
1 parent 9974391 commit b9fa29d

File tree

2 files changed

+102
-59
lines changed

2 files changed

+102
-59
lines changed

src/vnet/l2/l2_flood.c

Lines changed: 69 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -209,77 +209,87 @@ l2flood_node_fn (vlib_main_t * vm,
209209
bi0, L2FLOOD_NEXT_DROP);
210210
continue;
211211
}
212-
213-
vec_validate (msm->clones[thread_index], n_clones);
214-
vec_reset_length (msm->clones[thread_index]);
215-
216-
/*
217-
* the header offset needs to be large enough to incorporate
218-
* all the L3 headers that could be touched when doing BVI
219-
* processing. So take the current l2 length plus 2 * IPv6
220-
* headers (for tunnel encap)
221-
*/
222-
n_cloned = vlib_buffer_clone (vm, bi0,
223-
msm->clones[thread_index],
224-
n_clones,
225-
(vnet_buffer (b0)->l2.l2_len +
226-
sizeof (udp_header_t) +
227-
2 * sizeof (ip6_header_t)));
228-
229-
if (PREDICT_FALSE (n_cloned != n_clones))
212+
else if (n_clones > 1)
230213
{
231-
b0->error = node->errors[L2FLOOD_ERROR_REPL_FAIL];
232-
}
214+
vec_validate (msm->clones[thread_index], n_clones);
215+
vec_reset_length (msm->clones[thread_index]);
216+
217+
/*
218+
* the header offset needs to be large enough to incorporate
219+
* all the L3 headers that could be touched when doing BVI
220+
* processing. So take the current l2 length plus 2 * IPv6
221+
* headers (for tunnel encap)
222+
*/
223+
n_cloned = vlib_buffer_clone (vm, bi0,
224+
msm->clones[thread_index],
225+
n_clones,
226+
(vnet_buffer (b0)->l2.l2_len +
227+
sizeof (udp_header_t) +
228+
2 * sizeof (ip6_header_t)));
229+
230+
if (PREDICT_FALSE (n_cloned != n_clones))
231+
{
232+
b0->error = node->errors[L2FLOOD_ERROR_REPL_FAIL];
233+
}
233234

234-
/*
235-
* for all but the last clone, these are not BVI bound
236-
*/
237-
for (clone0 = 0; clone0 < n_cloned - 1; clone0++)
238-
{
239-
member = msm->members[thread_index][clone0];
240-
ci0 = msm->clones[thread_index][clone0];
241-
c0 = vlib_get_buffer (vm, ci0);
235+
/*
236+
* for all but the last clone, these are not BVI bound
237+
*/
238+
for (clone0 = 0; clone0 < n_cloned - 1; clone0++)
239+
{
240+
member = msm->members[thread_index][clone0];
241+
ci0 = msm->clones[thread_index][clone0];
242+
c0 = vlib_get_buffer (vm, ci0);
242243

243-
to_next[0] = ci0;
244-
to_next += 1;
245-
n_left_to_next -= 1;
244+
to_next[0] = ci0;
245+
to_next += 1;
246+
n_left_to_next -= 1;
246247

247-
if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE) &&
248-
(b0->flags & VLIB_BUFFER_IS_TRACED)))
249-
{
250-
ethernet_header_t *h0;
251-
l2flood_trace_t *t;
252-
253-
if (c0 != b0)
254-
vlib_buffer_copy_trace_flag (vm, b0, ci0);
255-
256-
t = vlib_add_trace (vm, node, c0, sizeof (*t));
257-
h0 = vlib_buffer_get_current (c0);
258-
t->sw_if_index = sw_if_index0;
259-
t->bd_index = vnet_buffer (c0)->l2.bd_index;
260-
clib_memcpy (t->src, h0->src_address, 6);
261-
clib_memcpy (t->dst, h0->dst_address, 6);
262-
}
248+
if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE) &&
249+
(b0->flags & VLIB_BUFFER_IS_TRACED)))
250+
{
251+
ethernet_header_t *h0;
252+
l2flood_trace_t *t;
253+
254+
if (c0 != b0)
255+
vlib_buffer_copy_trace_flag (vm, b0, ci0);
256+
257+
t = vlib_add_trace (vm, node, c0, sizeof (*t));
258+
h0 = vlib_buffer_get_current (c0);
259+
t->sw_if_index = sw_if_index0;
260+
t->bd_index = vnet_buffer (c0)->l2.bd_index;
261+
clib_memcpy (t->src, h0->src_address, 6);
262+
clib_memcpy (t->dst, h0->dst_address, 6);
263+
}
263264

264-
/* Do normal L2 forwarding */
265-
vnet_buffer (c0)->sw_if_index[VLIB_TX] = member->sw_if_index;
265+
/* Do normal L2 forwarding */
266+
vnet_buffer (c0)->sw_if_index[VLIB_TX] =
267+
member->sw_if_index;
266268

267-
vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
268-
to_next, n_left_to_next,
269-
ci0, next0);
270-
if (PREDICT_FALSE (0 == n_left_to_next))
271-
{
272-
vlib_put_next_frame (vm, node, next_index, n_left_to_next);
273-
vlib_get_next_frame (vm, node, next_index,
274-
to_next, n_left_to_next);
269+
vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
270+
to_next, n_left_to_next,
271+
ci0, next0);
272+
if (PREDICT_FALSE (0 == n_left_to_next))
273+
{
274+
vlib_put_next_frame (vm, node, next_index,
275+
n_left_to_next);
276+
vlib_get_next_frame (vm, node, next_index, to_next,
277+
n_left_to_next);
278+
}
275279
}
280+
member = msm->members[thread_index][clone0];
281+
ci0 = msm->clones[thread_index][clone0];
282+
}
283+
else
284+
{
285+
/* one clone */
286+
ci0 = bi0;
287+
member = msm->members[thread_index][0];
276288
}
277289

278290
/*
279291
* the last clone that might go to a BVI
280292
*/
281-
member = msm->members[thread_index][clone0];
282-
ci0 = msm->clones[thread_index][clone0];
283293
c0 = vlib_get_buffer (vm, ci0);
284294

285295
to_next[0] = ci0;

test/test_l2_flood.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,39 @@ def test_flood(self):
144144

145145
self.vapi.bridge_domain_add_del(1, is_add=0)
146146

147+
def test_flood_one(self):
148+
""" L2 no-Flood Test """
149+
150+
#
151+
# Create a single bridge Domain
152+
#
153+
self.vapi.bridge_domain_add_del(1)
154+
155+
#
156+
# add 2 interfaces to the BD. this means a flood goes to only
157+
# one member
158+
#
159+
for i in self.pg_interfaces[:2]:
160+
self.vapi.sw_interface_set_l2_bridge(i.sw_if_index, 1, 0)
161+
162+
p = (Ether(dst="ff:ff:ff:ff:ff:ff",
163+
src="00:00:de:ad:be:ef") /
164+
IP(src="10.10.10.10", dst="1.1.1.1") /
165+
UDP(sport=1234, dport=1234) /
166+
Raw('\xa5' * 100))
167+
168+
#
169+
# input on pg0 expect copies on pg1
170+
#
171+
self.send_and_expect(self.pg0, p*65, self.pg1)
172+
173+
#
174+
# cleanup
175+
#
176+
for i in self.pg_interfaces[:2]:
177+
self.vapi.sw_interface_set_l2_bridge(i.sw_if_index, 1, enable=0)
178+
self.vapi.bridge_domain_add_del(1, is_add=0)
179+
147180
def test_uu_fwd(self):
148181
""" UU Flood """
149182

0 commit comments

Comments
 (0)