lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 013/757] net: mptcp: make DACK4/DACK8 usage consistent among all subflows
    Date
    From: Davide Caratti <dcaratti@redhat.com>

    [ Upstream commit 37198e93ced70733f0b993dff28b7c33857e254f ]

    using packetdrill it's possible to observe the same MPTCP DSN being acked
    by different subflows with DACK4 and DACK8. This is in contrast with what
    specified in RFC8684 §3.3.2: if an MPTCP endpoint transmits a 64-bit wide
    DSN, it MUST be acknowledged with a 64-bit wide DACK. Fix 'use_64bit_ack'
    variable to make it a property of MPTCP sockets, not TCP subflows.

    Fixes: a0c1d0eafd1e ("mptcp: Use 32-bit DATA_ACK when possible")
    Acked-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Davide Caratti <dcaratti@redhat.com>
    Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/mptcp/options.c | 2 +-
    net/mptcp/protocol.h | 2 +-
    net/mptcp/subflow.c | 3 +--
    3 files changed, 3 insertions(+), 4 deletions(-)

    --- a/net/mptcp/options.c
    +++ b/net/mptcp/options.c
    @@ -516,7 +516,7 @@ static bool mptcp_established_options_ds
    return ret;
    }

    - if (subflow->use_64bit_ack) {
    + if (READ_ONCE(msk->use_64bit_ack)) {
    ack_size = TCPOLEN_MPTCP_DSS_ACK64;
    opts->ext_copy.data_ack = READ_ONCE(msk->ack_seq);
    opts->ext_copy.ack64 = 1;
    --- a/net/mptcp/protocol.h
    +++ b/net/mptcp/protocol.h
    @@ -203,6 +203,7 @@ struct mptcp_sock {
    bool fully_established;
    bool rcv_data_fin;
    bool snd_data_fin_enable;
    + bool use_64bit_ack; /* Set when we received a 64-bit DSN */
    spinlock_t join_list_lock;
    struct work_struct work;
    struct list_head conn_list;
    @@ -295,7 +296,6 @@ struct mptcp_subflow_context {
    backup : 1,
    data_avail : 1,
    rx_eof : 1,
    - use_64bit_ack : 1, /* Set when we received a 64-bit DSN */
    can_ack : 1; /* only after processing the remote a key */
    u32 remote_nonce;
    u64 thmac;
    --- a/net/mptcp/subflow.c
    +++ b/net/mptcp/subflow.c
    @@ -781,12 +781,11 @@ static enum mapping_status get_mapping_s
    if (!mpext->dsn64) {
    map_seq = expand_seq(subflow->map_seq, subflow->map_data_len,
    mpext->data_seq);
    - subflow->use_64bit_ack = 0;
    pr_debug("expanded seq=%llu", subflow->map_seq);
    } else {
    map_seq = mpext->data_seq;
    - subflow->use_64bit_ack = 1;
    }
    + WRITE_ONCE(mptcp_sk(subflow->conn)->use_64bit_ack, !!mpext->dsn64);

    if (subflow->map_valid) {
    /* Allow replacing only with an identical map */

    \
     
     \ /
      Last update: 2020-10-27 16:22    [W:2.613 / U:0.720 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site