Skip to content
  • Martynas Pumputis's avatar
    netfilter: nf_nat: skip nat clash resolution for same-origin entries · 4e35c1cb
    Martynas Pumputis authored
    
    
    It is possible that two concurrent packets originating from the same
    socket of a connection-less protocol (e.g. UDP) can end up having
    different IP_CT_DIR_REPLY tuples which results in one of the packets
    being dropped.
    
    To illustrate this, consider the following simplified scenario:
    
    1. Packet A and B are sent at the same time from two different threads
       by same UDP socket.  No matching conntrack entry exists yet.
       Both packets cause allocation of a new conntrack entry.
    2. get_unique_tuple gets called for A.  No clashing entry found.
       conntrack entry for A is added to main conntrack table.
    3. get_unique_tuple is called for B and will find that the reply
       tuple of B is already taken by A.
       It will allocate a new UDP source port for B to resolve the clash.
    4. conntrack entry for B cannot be added to main conntrack table
       because its ORIGINAL direction is clashing with A and the REPLY
       directions of A and B are not the same anymore due to UDP source
       port reallocation done in step 3.
    
    This patch modifies nf_conntrack_tuple_taken so it doesn't consider
    colliding reply tuples if the IP_CT_DIR_ORIGINAL tuples are equal.
    
    [ Florian: simplify patch to not use .allow_clash setting
      and always ignore identical flows ]
    
    Signed-off-by: default avatarMartynas Pumputis <martynas@weave.works>
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    4e35c1cb