lkml.org 
[lkml]   [2022]   [Apr]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 223/475] tcp: ensure PMTU updates are processed during fastopen
    Date
    From: Jakub Kicinski <kuba@kernel.org>

    [ Upstream commit ed0c99dc0f499ff8b6e75b5ae6092ab42be1ad39 ]

    tp->rx_opt.mss_clamp is not populated, yet, during TFO send so we
    rise it to the local MSS. tp->mss_cache is not updated, however:

    tcp_v6_connect():
    tp->rx_opt.mss_clamp = IPV6_MIN_MTU - headers;
    tcp_connect():
    tcp_connect_init():
    tp->mss_cache = min(mtu, tp->rx_opt.mss_clamp)
    tcp_send_syn_data():
    tp->rx_opt.mss_clamp = tp->advmss

    After recent fixes to ICMPv6 PTB handling we started dropping
    PMTU updates higher than tp->mss_cache. Because of the stale
    tp->mss_cache value PMTU updates during TFO are always dropped.

    Thanks to Wei for helping zero in on the problem and the fix!

    Fixes: c7bb4b89033b ("ipv6: tcp: drop silly ICMPv6 packet too big messages")
    Reported-by: Andre Nash <alnash@fb.com>
    Reported-by: Neil Spring <ntspring@fb.com>
    Reviewed-by: Wei Wang <weiwan@google.com>
    Acked-by: Yuchung Cheng <ycheng@google.com>
    Acked-by: Martin KaFai Lau <kafai@fb.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Link: https://lore.kernel.org/r/20220321165957.1769954-1-kuba@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    net/ipv4/tcp_output.c | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
    index 638d7b49ad71..139e962d1aef 100644
    --- a/net/ipv4/tcp_output.c
    +++ b/net/ipv4/tcp_output.c
    @@ -3492,6 +3492,7 @@ static void tcp_connect_queue_skb(struct sock *sk, struct sk_buff *skb)
    */
    static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn)
    {
    + struct inet_connection_sock *icsk = inet_csk(sk);
    struct tcp_sock *tp = tcp_sk(sk);
    struct tcp_fastopen_request *fo = tp->fastopen_req;
    int space, err = 0;
    @@ -3506,8 +3507,10 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn)
    * private TCP options. The cost is reduced data space in SYN :(
    */
    tp->rx_opt.mss_clamp = tcp_mss_clamp(tp, tp->rx_opt.mss_clamp);
    + /* Sync mss_cache after updating the mss_clamp */
    + tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);

    - space = __tcp_mtu_to_mss(sk, inet_csk(sk)->icsk_pmtu_cookie) -
    + space = __tcp_mtu_to_mss(sk, icsk->icsk_pmtu_cookie) -
    MAX_TCP_OPTION_SPACE;

    space = min_t(size_t, space, fo->size);
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-04-14 17:09    [W:4.104 / U:1.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site