There was a race within packet buffering that could
result in first packt being dropped. It could happen
under following conditions and topology:
S1 == R1 == public == R2 == S2
SNAT on R1 and DGP on port connecting R1 with public.

1) The GARP is sent for the GDP SNAT
2) The GARP is delayed on R2 because it's multicast
3) Some traffic that get's buffered on S2
4) An ARP is sent as consequence of the buffering
5) The delayed MAC binding is added to SB
6) Response for the ARP is ignored because the MAC binding
already exists
7) The buffered packet is never sent out and times out

In order to prevent this behavior add new node that will
keep track of all recently changed MAC bindings. Those
recently changed MAC bindings are kept around for a longer
time than the buffered packets which should ensure that we
can find them even if they are created before the packet
is actually buffered.

At the same time simplify the packet buffering process
and move it to mac-learn module.

Ales Musil (3):
  pinctrl: Simplify packet buffering
  controller: Add I-P node for recent MAC bindings
  controller: Prevent race in packet buffering

 controller/mac-learn.c      | 171 ++++++++++++++++--
 controller/mac-learn.h      |  50 +++++-
 controller/ovn-controller.c | 208 +++++++++++++++++++++-
 controller/pinctrl.c        | 336 ++++++++----------------------------
 controller/pinctrl.h        |   5 +-
 5 files changed, 483 insertions(+), 287 deletions(-)

-- 
2.39.2

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to