• Eric Dumazet's avatar
    icmp: change the order of rate limits · 8c2bd38b
    Eric Dumazet authored
    ICMP messages are ratelimited :
    
    After the blamed commits, the two rate limiters are applied in this order:
    
    1) host wide ratelimit (icmp_global_allow())
    
    2) Per destination ratelimit (inetpeer based)
    
    In order to avoid side-channels attacks, we need to apply
    the per destination check first.
    
    This patch makes the following change :
    
    1) icmp_global_allow() checks if the host wide limit is reached.
       But credits are not yet consumed. This is deferred to 3)
    
    2) The per destination limit is checked/updated.
       This might add a new node in inetpeer tree.
    
    3) icmp_global_consume() consumes tokens if prior operations succeeded.
    
    This means that host wide ratelimit is still effective
    in keeping inetpeer tree small even under DDOS.
    
    As a bonus, I removed icmp_global.lock as the fast path
    can use a lock-free operation.
    
    Fixes: c0303efe ("net: reduce cycles spend on ICMP replies that gets rate limited")
    Fixes: 4cdf507d ("icmp: add a global rate limitation")
    Reported-by: default avatarKeyu Man <keyu.man@email.ucr.edu>
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
    Cc: Jesper Dangaard Brouer <hawk@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20240829144641.3880376-2-edumazet@google.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    8c2bd38b
icmp.c 37.9 KB