mptcp: fix 32 bit DSN expansion
authorPaolo Abeni <pabeni@redhat.com>
Fri, 18 Jun 2021 22:02:21 +0000 (15:02 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 21 Jun 2021 21:21:28 +0000 (14:21 -0700)
The current implementation of 32 bit DSN expansion is buggy.
After the previous patch, we can simply reuse the newly
introduced helper to do the expansion safely.

Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/120
Fixes: 648ef4b88673 ("mptcp: Implement MPTCP receive path")
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/subflow.c

index be1de40..037fba4 100644 (file)
@@ -775,15 +775,6 @@ enum mapping_status {
        MAPPING_DUMMY
 };
 
-static u64 expand_seq(u64 old_seq, u16 old_data_len, u64 seq)
-{
-       if ((u32)seq == (u32)old_seq)
-               return old_seq;
-
-       /* Assume map covers data not mapped yet. */
-       return seq | ((old_seq + old_data_len + 1) & GENMASK_ULL(63, 32));
-}
-
 static void dbg_bad_map(struct mptcp_subflow_context *subflow, u32 ssn)
 {
        pr_debug("Bad mapping: ssn=%d map_seq=%d map_data_len=%d",
@@ -907,13 +898,7 @@ static enum mapping_status get_mapping_status(struct sock *ssk,
                data_len--;
        }
 
-       if (!mpext->dsn64) {
-               map_seq = expand_seq(subflow->map_seq, subflow->map_data_len,
-                                    mpext->data_seq);
-               pr_debug("expanded seq=%llu", subflow->map_seq);
-       } else {
-               map_seq = mpext->data_seq;
-       }
+       map_seq = mptcp_expand_seq(READ_ONCE(msk->ack_seq), mpext->data_seq, mpext->dsn64);
        WRITE_ONCE(mptcp_sk(subflow->conn)->use_64bit_ack, !!mpext->dsn64);
 
        if (subflow->map_valid) {