]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
mptcp: ADD_ADDRs with echo bit are smaller
authorMatthieu Baerts <matthieu.baerts@tessares.net>
Sat, 3 Oct 2020 15:36:56 +0000 (17:36 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 4 Oct 2020 00:36:37 +0000 (17:36 -0700)
The MPTCP ADD_ADDR suboption with echo-flag=1 has no HMAC, the size is
smaller than the one initially sent without echo-flag=1. We then need to
use the correct size everywhere when we need this echo bit.

Before this patch, the wrong size was reserved but the correct amount of
bytes were written (and read): the remaining bytes contained garbage.

Fixes: 6a6c05a8b016 ("mptcp: send out ADD_ADDR with echo flag")
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/95
Reported-and-tested-by: Davide Caratti <dcaratti@redhat.com>
Acked-by: Geliang Tang <geliangtang@gmail.com>
Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/options.c
net/mptcp/pm.c
net/mptcp/protocol.h

index 411fd4a4179607e4339c65317f9a444e8207bc14..03794f89efeb8a58bec071050fed3de205e16f85 100644 (file)
@@ -587,7 +587,7 @@ static bool mptcp_established_options_add_addr(struct sock *sk,
            !(mptcp_pm_add_addr_signal(msk, remaining, &saddr, &echo)))
                return false;
 
-       len = mptcp_add_addr_len(saddr.family);
+       len = mptcp_add_addr_len(saddr.family, echo);
        if (remaining < len)
                return false;
 
index 7e81f53d1e5d2cfa31c1c1cd0fbca4d8d5247b95..e19e1525ecbb0086f301176fc0fdf32be72150a4 100644 (file)
@@ -183,11 +183,12 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
        if (!mptcp_pm_should_add_signal(msk))
                goto out_unlock;
 
-       if (remaining < mptcp_add_addr_len(msk->pm.local.family))
+       *echo = READ_ONCE(msk->pm.add_addr_echo);
+
+       if (remaining < mptcp_add_addr_len(msk->pm.local.family, *echo))
                goto out_unlock;
 
        *saddr = msk->pm.local;
-       *echo = READ_ONCE(msk->pm.add_addr_echo);
        WRITE_ONCE(msk->pm.add_addr_signal, false);
        ret = true;
 
index 7cfe52aeb2b8351733da4d30f51f5ce3932e5ecf..6eef4db9ee5cb1a8f0c6f7c80cb3a78933721e8a 100644 (file)
@@ -464,11 +464,12 @@ static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
        return READ_ONCE(msk->pm.rm_addr_signal);
 }
 
-static inline unsigned int mptcp_add_addr_len(int family)
+static inline unsigned int mptcp_add_addr_len(int family, bool echo)
 {
        if (family == AF_INET)
-               return TCPOLEN_MPTCP_ADD_ADDR;
-       return TCPOLEN_MPTCP_ADD_ADDR6;
+               return echo ? TCPOLEN_MPTCP_ADD_ADDR_BASE
+                           : TCPOLEN_MPTCP_ADD_ADDR;
+       return echo ? TCPOLEN_MPTCP_ADD_ADDR6_BASE : TCPOLEN_MPTCP_ADD_ADDR6;
 }
 
 bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,