[MPTCP][PATCH net] mptcp: fix static checker warnings in mptcp_pm_add_timer
by Geliang Tang
Fix the following Smatch complaint:
net/mptcp/pm_netlink.c:213 mptcp_pm_add_timer()
warn: variable dereferenced before check 'msk' (see line 208)
net/mptcp/pm_netlink.c
207 struct mptcp_sock *msk = entry->sock;
208 struct sock *sk = (struct sock *)msk;
209 struct net *net = sock_net(sk);
^^
"msk" dereferenced here.
210
211 pr_debug("msk=%p", msk);
212
213 if (!msk)
^^^^
Too late.
214 return;
215
Fixes: 00cfd77b9063 ("mptcp: retransmit ADD_ADDR when timeout")
Reported-by: Dan Carpenter <dan.carpenter(a)oracle.com>
Signed-off-by: Geliang Tang <geliangtang(a)gmail.com>
---
net/mptcp/pm_netlink.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 6180a8b39a3f..03f2c28f11f5 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -206,7 +206,6 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
struct mptcp_pm_add_entry *entry = from_timer(entry, timer, add_timer);
struct mptcp_sock *msk = entry->sock;
struct sock *sk = (struct sock *)msk;
- struct net *net = sock_net(sk);
pr_debug("msk=%p", msk);
@@ -235,7 +234,7 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
if (entry->retrans_times < ADD_ADDR_RETRANS_MAX)
sk_reset_timer(sk, timer,
- jiffies + mptcp_get_add_addr_timeout(net));
+ jiffies + mptcp_get_add_addr_timeout(sock_net(sk)));
spin_unlock_bh(&msk->pm.lock);
--
2.26.2
1 year, 7 months
[bug report] mptcp: retransmit ADD_ADDR when timeout
by Dan Carpenter
Hello Geliang Tang,
This is a semi-automatic email about new static checker warnings.
The patch 00cfd77b9063: "mptcp: retransmit ADD_ADDR when timeout"
from Sep 24, 2020, leads to the following Smatch complaint:
net/mptcp/pm_netlink.c:213 mptcp_pm_add_timer()
warn: variable dereferenced before check 'msk' (see line 208)
net/mptcp/pm_netlink.c
207 struct mptcp_sock *msk = entry->sock;
208 struct sock *sk = (struct sock *)msk;
209 struct net *net = sock_net(sk);
^^
"msk" dereferenced here.
210
211 pr_debug("msk=%p", msk);
212
213 if (!msk)
^^^^
Too late.
214 return;
215
regards,
dan carpenter
1 year, 7 months
[MPTCP][PATCH v3 mptcp-next 00/12] ADD_ADDR: ports support
by Geliang Tang
v3:
- add two new patches, 8 and 11
- add more IS_ENABLED(CONFIG_MPTCP_IPV6) in patch 2
- define TCPOLEN_MPTCP_ADD_ADDR_HMAC in patch 4
- add flags check in patch 10
- update the testcases
v2:
- change mptcp_out_options's port field in CPU bype order.
- keep mptcp_options_received's port field in CPU bype order.
- add two new patches to simplify ADD_ADDR suboption writing.
- update mptcp_add_addr_len helper use adding up size.
- add more commit messages.
v1:
This series is the first version of ADD_ADDR ports support. I have solved
the listener problem which I mentioned at the meeting on 15th of October
by adding a new listening socket from the userspace (see patch 8). Up to
now this patchset works well.
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/54
Geliang Tang (12):
mptcp: unify ADD_ADDR and echo suboptions writing
mptcp: unify ADD_ADDR and ADD_ADDR6 suboptions writing
mptcp: add port support for ADD_ADDR suboption writing
mptcp: use adding up size to get ADD_ADDR length
mptcp: add the outgoing ADD_ADDR port support
mptcp: send out dedicated packet for ADD_ADDR using port
mptcp: add port parameter for mptcp_pm_announce_addr
mptcp: print out port and ahmac when receiving ADD_ADDR
mptcp: deal with MPTCP_PM_ADDR_ATTR_PORT in PM netlink
selftests: mptcp: add port argument for pm_nl_ctl
mptcp: add the mib for ADD_ADDR with port
selftests: mptcp: add testcases for ADD_ADDR with port
include/net/mptcp.h | 1 +
net/mptcp/mib.c | 1 +
net/mptcp/mib.h | 1 +
net/mptcp/options.c | 104 +++++++++++-------
net/mptcp/pm.c | 14 ++-
net/mptcp/pm_netlink.c | 28 ++++-
net/mptcp/protocol.h | 37 +++++--
.../testing/selftests/net/mptcp/mptcp_join.sh | 61 +++++++++-
tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 24 +++-
9 files changed, 207 insertions(+), 64 deletions(-)
--
2.26.2
1 year, 7 months
[Weekly meetings] MoM - 5th of November 2020
by Matthieu Baerts
Hello everyone,
Last Thursday, we had our 123rd meeting with Mat and Ossama (Intel OTC),
Christoph (Apple), Davide, Paolo and Florian (RedHat) and myself (Tessares).
Thanks again for this new good meeting!
Here are the minutes of the meeting:
Accepted patches:
- The list of accepted patches can be seen on PatchWork:
https://patchwork.ozlabs.org/project/mptcp/list/?state=3
netdev (if mptcp ML is in cc) (Davide Caratti, Mat Martineau):
1393323 [net-next,v2,7/7] selftests: mptcp: add ADD_ADDR timeout test case
1393322 [net-next,v2,6/7] docs: networking: mptcp: Add MPTCP sysctl entries
1393321 [net-next,v2,5/7] mptcp: add a new sysctl add_addr_timeout
1393318 [net-next,v2,4/7] mptcp: split mptcp_clean_una function
1393320 [net-next,v2,3/7] tcp: propagate MPTCP skb extensions on xmit
splits
1393319 [net-next,v2,2/7] mptcp: use _fast lock version in
__mptcp_move_skbs
1393317 [net-next,v2,1/7] mptcp: adjust mptcp receive buffer limit if
subflow...
1392003 [net] mptcp: token: fix unititialized variable
our repo (by: Geliang Tang):
1390711 [v2,mptcp-next] Squash to "mptcp: change add_addr_signal type"
Pending patches:
- The list of pending patches can be seen on PatchWork:
https://patchwork.ozlabs.org/project/mptcp/list/?state=*
netdev (if mptcp ML is in cc) (by: /):
/
our repo (by: Florian Westphal, Geliang Tang, Mat Martineau, Paolo
Abeni):
1370700: RFC: [RFC,2/4] tcp: move selected mptcp helpers to tcp.h/mptcp.h
1370701: RFC: [RFC,3/4] mptcp: add mptcp reset option support
1370702: RFC: [RFC,4/4] tcp: parse tcp options contained in reset packets:
- WIP, same as last week
1375893: RFC: [RFC,mptpcp-next] mptcp: add ooo prune support:
- WIP, same as last week
1387845: RFC: MPTCP stream performances:
- can be drop
1390270: RFC: [RFC] mptcp: refine MPTCP-level ack scheduling:
- can be drop, v1 sent
1392576: Changes Requested: [mptcp-next] docs: networking: mptcp: Add
MPTCP sysctl entries:
- applied
1394437: New: [net-next] Squash-to "mptcp: refactor shutdown and close":
- depends on some local changes Paolo has on his side
- v2 needed to have something building
1394439: New: [v1] mptcp: refine MPTCP-level ack scheduling
- can be reviewed: this has a fix from an issue mentioned earlier
1394788: New: [v3,mptcp-next,01/12] mptcp: unify ADD_ADDR and echo
suboptions writing
1394789: New: [v3,mptcp-next,02/12] mptcp: unify ADD_ADDR and ADD_ADDR6
suboptions writing
1394790: New: [v3,mptcp-next,03/12] mptcp: add port support for ADD_ADDR
suboption writing
1394791: New: [v3,mptcp-next,04/12] mptcp: use adding up size to get
ADD_ADDR length
1394792: New: [v3,mptcp-next,05/12] mptcp: add the outgoing ADD_ADDR
port support
1394793: New: [v3,mptcp-next,06/12] mptcp: send out dedicated packet for
ADD_ADDR using port
1394794: New: [v3,mptcp-next,07/12] mptcp: add port parameter for
mptcp_pm_announce_addr
1394795: New: [v3,mptcp-next,08/12] mptcp: print out port and ahmac when
receiving ADD_ADDR
1394796: New: [v3,mptcp-next,09/12] mptcp: deal with
MPTCP_PM_ADDR_ATTR_PORT in PM netlink
1394797: New: [v3,mptcp-next,10/12] selftests: mptcp: add port argument
for pm_nl_ctl
1394798: New: [v3,mptcp-next,11/12] mptcp: add the mib for ADD_ADDR with
port
1394799: New: [v3,mptcp-next,12/12] selftests: mptcp: add testcases for
ADD_ADDR with port:
- for the listen part, we need to bind on another port
- should be fine if we make sure the binaries are the same, from
the same user (maybe problematic) and in the same NS
- but can we easily check that? Is it safe?
- idea: have mptcpd creating this listen socket (and announce the
port)?
- how can we ensure only trusted application can open these other
ports?
- goal (security): avoid having another app opening a port to
bypass some rules limiting an app on a specific port
- maybe safer: the application should tell the kernel
(netlink/sockopt) to accept MP_JOIN from another ports (and maybe
interface/IP) and ask to announce ADD_ADDR over another port
1394896: New: [RFC,mptcp-next,1/6] mptcp: add the outgoing MP_PRIO support
1394898: New: [RFC,mptcp-next,2/6] mptcp: add the incoming MP_PRIO support
1394899: New: [RFC,mptcp-next,3/6] mptcp: add prio_changed flag
1394900: New: [RFC,mptcp-next,4/6] mptcp: send out MP_PRIO before RM_ADDR
1394901: New: [RFC,mptcp-next,5/6] mptcp: add the mib for MP_PRIO
1394902: New: [RFC,mptcp-next,6/6] selftests: mptcp: add MP_PRIO check
in chk_rm_nr
Note:
- Florian has some patches related to MP_FASTCLOSE
- he will send them after the meeting
Issues on Github:
https://github.com/multipath-tcp/mptcp_net-next/issues/
Recently opened (latest from last week: 104)
106 [syzkaller] BUG: Bad page state [bug] [syzkaller]:
- might be linked to 104 where there is a reproducer
- no reproducer for 106 but the trace looks the same as the 104
105 warning in `mptcp_reset_timer()` with `mptcp_connect.sh -m mmap`
[bug]:
- can be linked to 70
- *Matth:* to check
Bugs (opened, flagged as "bug" and assigned)
94 Packetdrill: after a received DATA_FIN, no new packets can be
treated [bug] @dcaratti:
- WIP
85 Packetdrill: multiple timeout reported by the CI [bug] @matttbe:
- for the moment, only issue with mp_join (timeout after 2 minutes)
Bugs (opened and flagged as "bug" and not assigned)
106 [syzkaller] BUG: Bad page state [bug] [syzkaller]
105 warning in `mptcp_reset_timer()` with `mptcp_connect.sh -m mmap`
[bug]
104 [syzkaller] general protection fault in skb_release_data [bug]
[syzkaller]
103 [syzkaller] WARNING in inet_csk_listen_stop [bug] [syzkaller]
99 simult_flows selftest is unstable: remaining sockets in
TIME-WAIT state [bug]
70 [syzkaller] WARNING in mptcp_reset_timer [bug] [syzkaller]
65 clearing properly the status in listen() [bug]
56 msk connection state set without msk lock [bug]
In Progress (opened and assigned)
96 Python: add support for IPPROTO_MPTCP [enhancement] @matttbe
76 [gs]etsockopt per subflow: BPF [enhancement] @matttbe
54 ADD_ADDR: ports support [enhancement] @geliangtang
51 MP_PRIO support [enhancement] @geliangtang
49: MP_FASTCLOSE
- Florian is working on that
43 [syzkaller] Change syzkaller to exercise MPTCP inet_diag
interface [enhancement] [syzkaller] @cpaasch
Recently closed (since last week)
None.
Warnings (WARN_ON):
- We should be careful about them, especially for the benign ones
- It is costly (especially if you have them in a loop)
- Some people use a sysctl to panic on a warning
Refactoring:
- Paolo is working on (yet another) refactoring :-)
- → getting rid of a workqueue for the receiving part
Commits to send to Netdev:
- Paolo would like to some patches to be sent
- he will send a proposition later
Davide on Fedora:
- goal: send mptcpd to have it in Fedora 34
- spec are ready but need to be validated
- https://gitlab.com/dcaratti/mptcpd/-/blob/main/mptcpd.spec
- not sure if other distro are packaging it
- there is a git hook that triggers a build when we commit on the
gitlab repo
- ideally, it could be nice to have a githook from the official
mptcpd github repo to trigger a build in case of new tag
- Could be good to also propose packages for other distro like
Debian (Ubuntu) → Matth? :)
FYI: Current Roadmap:
- Bugs: https://github.com/multipath-tcp/mptcp_net-next/projects/2
- Current merge window (5.11):
https://github.com/multipath-tcp/mptcp_net-next/projects/6
- For later: https://github.com/multipath-tcp/mptcp_net-next/projects/4
Extra tests:
- news about Syzkaller? (Christoph):
- See Github ↑
- news about interop with mptcp.org? (Christoph):
- Had some issues last week, will retry
- news about Intel's kbuild? (Mat):
- haven't receive any new build report
- Mat will investigate why the builds have stopped
- packetdrill (Davide):
- See Github ↑
- CI (Matth):
- tests looks a bit more stable but still some are failing
(packetdrill, see above)
CGroup BPF hook on socket creation:
- Mat looked at that
- it would be a bit different from the others (we don't have the
socket, we then cannot retrieve the cgroup from the "usual" way)
Next meeting:
- We propose to have the next meeting on Thursday, the 12th of
November.
- Usual UTC time: 16:00 UTC (8am PST, 5pm CET, Midnight CST)
- Still open to everyone!
- https://annuel2.framapad.org/p/mptcp_upstreaming_20201112
Feel free to comment on these points and propose new ones for the next
meeting!
Talk to you on Thursday,
Matt
--
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net
1 year, 7 months
[PATCH v1] mptcp: refine MPTCP-level ack scheduling
by Paolo Abeni
Send timely MPTCP-level ack is somewhat when the insertion
into the msk receive level is performed by the worker.
It needs TCP-level dup-ack to notify the MPTCP-level
ack_seq increase, as both the TCP-level ack seq and the
rcv window are unchanged.
We can actually avoid processing incoming data with the
worker, and let the subflow or recevmsg() send ack as needed.
When recvmsg() moves the skbs inside the msk receive queue,
the msk space is still unchanged, so tcp_cleanup_rbuf() could
end-up skipping TCP-level ack generation. Anyway, when
__mptcp_move_skbs() is invoked, a known amount of bytes is
going to be consumed soon: we update rcv wnd computation taking
them in account.
Additionally we need to explicitly trigger tcp_cleanup_rbuf()
when recvmsg() consumes a significant amount of the receive buffer.
Signed-off-by: Paolo Abeni <pabeni(a)redhat.com>
---
RFC -> v1:
- removed unneeded deltas in __mptcp_move_skbs()
---
net/mptcp/options.c | 1 +
net/mptcp/protocol.c | 66 +++++++++++++++++---------------------------
net/mptcp/protocol.h | 7 +++++
net/mptcp/subflow.c | 4 +--
4 files changed, 35 insertions(+), 43 deletions(-)
diff --git a/net/mptcp/options.c b/net/mptcp/options.c
index 248e3930c0cb..8a59b3e44599 100644
--- a/net/mptcp/options.c
+++ b/net/mptcp/options.c
@@ -530,6 +530,7 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb,
opts->ext_copy.ack64 = 0;
}
opts->ext_copy.use_ack = 1;
+ WRITE_ONCE(msk->old_wspace, __mptcp_space((struct sock *)msk));
/* Add kind/length/subtype/flag overhead if mapping is not populated */
if (dss_size == 0)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 1ef980d4a646..c02760302e46 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -405,7 +405,7 @@ static void mptcp_set_timeout(const struct sock *sk, const struct sock *ssk)
mptcp_sk(sk)->timer_ival = tout > 0 ? tout : TCP_RTO_MIN;
}
-static void mptcp_send_ack(struct mptcp_sock *msk)
+static void mptcp_send_ack(struct mptcp_sock *msk, bool force)
{
struct mptcp_subflow_context *subflow;
@@ -413,8 +413,13 @@ static void mptcp_send_ack(struct mptcp_sock *msk)
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
lock_sock(ssk);
- tcp_send_ack(ssk);
+ if (force)
+ tcp_send_ack(ssk);
+ else
+ tcp_cleanup_rbuf(ssk, 1);
release_sock(ssk);
+ if (!force)
+ break;
}
}
@@ -466,7 +471,7 @@ static bool mptcp_check_data_fin(struct sock *sk)
ret = true;
mptcp_set_timeout(sk, NULL);
- mptcp_send_ack(msk);
+ mptcp_send_ack(msk, true);
if (sock_flag(sk, SOCK_DEAD))
return ret;
@@ -489,7 +494,6 @@ static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk,
unsigned int moved = 0;
bool more_data_avail;
struct tcp_sock *tp;
- u32 old_copied_seq;
bool done = false;
int sk_rbuf;
@@ -506,7 +510,6 @@ static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk,
pr_debug("msk=%p ssk=%p", msk, ssk);
tp = tcp_sk(ssk);
- old_copied_seq = tp->copied_seq;
do {
u32 map_remaining, offset;
u32 seq = tp->copied_seq;
@@ -572,9 +575,6 @@ static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk,
} while (more_data_avail);
*bytes += moved;
- if (tp->copied_seq != old_copied_seq)
- tcp_cleanup_rbuf(ssk, 1);
-
return done;
}
@@ -678,19 +678,8 @@ void mptcp_data_ready(struct sock *sk, struct sock *ssk)
if (atomic_read(&sk->sk_rmem_alloc) > sk_rbuf)
goto wake;
- if (move_skbs_to_msk(msk, ssk))
- goto wake;
-
- /* mptcp socket is owned, release_cb should retry */
- if (!test_and_set_bit(TCP_DELACK_TIMER_DEFERRED,
- &sk->sk_tsq_flags)) {
- sock_hold(sk);
+ move_skbs_to_msk(msk, ssk);
- /* need to try again, its possible release_cb() has already
- * been called after the test_and_set_bit() above.
- */
- move_skbs_to_msk(msk, ssk);
- }
wake:
if (wake)
sk->sk_data_ready(sk);
@@ -1526,7 +1515,7 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied)
msk->rcvq_space.time = mstamp;
}
-static bool __mptcp_move_skbs(struct mptcp_sock *msk)
+static bool __mptcp_move_skbs(struct mptcp_sock *msk, unsigned int rcv)
{
unsigned int moved = 0;
bool done;
@@ -1545,12 +1534,16 @@ static bool __mptcp_move_skbs(struct mptcp_sock *msk)
slowpath = lock_sock_fast(ssk);
done = __mptcp_move_skbs_from_subflow(msk, ssk, &moved);
+ if (moved && rcv) {
+ WRITE_ONCE(msk->rmem_pending, min(rcv, moved));
+ tcp_cleanup_rbuf(ssk, 1);
+ WRITE_ONCE(msk->rmem_pending, 0);
+ }
unlock_sock_fast(ssk, slowpath);
} while (!done);
if (mptcp_ofo_queue(msk) || moved > 0) {
- if (!mptcp_check_data_fin((struct sock *)msk))
- mptcp_send_ack(msk);
+ mptcp_check_data_fin((struct sock *)msk);
return true;
}
return false;
@@ -1574,8 +1567,8 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
__mptcp_flush_join_list(msk);
- while (len > (size_t)copied) {
- int bytes_read;
+ for (;;) {
+ int bytes_read, old_space;
bytes_read = __mptcp_recvmsg_mskq(msk, msg, len - copied);
if (unlikely(bytes_read < 0)) {
@@ -1587,9 +1580,14 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
copied += bytes_read;
if (skb_queue_empty(&sk->sk_receive_queue) &&
- __mptcp_move_skbs(msk))
+ __mptcp_move_skbs(msk, len - copied))
continue;
+ /* be sure to advertize window change */
+ old_space = READ_ONCE(msk->old_wspace);
+ if ((tcp_space(sk) - old_space) >= old_space)
+ mptcp_send_ack(msk, false);
+
/* only the master socket status is relevant here. The exit
* conditions mirror closely tcp_recvmsg()
*/
@@ -1642,7 +1640,7 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
/* .. race-breaker: ssk might have gotten new data
* after last __mptcp_move_skbs() returned false.
*/
- if (unlikely(__mptcp_move_skbs(msk)))
+ if (unlikely(__mptcp_move_skbs(msk, 0)))
set_bit(MPTCP_DATA_READY, &msk->flags);
} else if (unlikely(!test_bit(MPTCP_DATA_READY, &msk->flags))) {
/* data to read but mptcp_wait_data() cleared DATA_READY */
@@ -1874,7 +1872,6 @@ static void mptcp_worker(struct work_struct *work)
if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags))
__mptcp_close_subflow(msk);
- __mptcp_move_skbs(msk);
if (mptcp_send_head(sk))
mptcp_push_pending(sk, 0);
@@ -2496,8 +2493,7 @@ static int mptcp_getsockopt(struct sock *sk, int level, int optname,
return -EOPNOTSUPP;
}
-#define MPTCP_DEFERRED_ALL (TCPF_DELACK_TIMER_DEFERRED | \
- TCPF_WRITE_TIMER_DEFERRED)
+#define MPTCP_DEFERRED_ALL (TCPF_WRITE_TIMER_DEFERRED)
/* this is very alike tcp_release_cb() but we must handle differently a
* different set of events
@@ -2515,16 +2511,6 @@ static void mptcp_release_cb(struct sock *sk)
sock_release_ownership(sk);
- if (flags & TCPF_DELACK_TIMER_DEFERRED) {
- struct mptcp_sock *msk = mptcp_sk(sk);
- struct sock *ssk;
-
- ssk = mptcp_subflow_recv_lookup(msk);
- if (!ssk || sk->sk_state == TCP_CLOSE ||
- !schedule_work(&msk->work))
- __sock_put(sk);
- }
-
if (flags & TCPF_WRITE_TIMER_DEFERRED) {
mptcp_retransmit_handler(sk);
__sock_put(sk);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index d29c6a4749eb..d65a4c161945 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -221,10 +221,12 @@ struct mptcp_sock {
u64 rcv_data_fin_seq;
struct sock *last_snd;
int snd_burst;
+ int old_wspace;
atomic64_t snd_una;
atomic64_t wnd_end;
unsigned long timer_ival;
u32 token;
+ int rmem_pending;
unsigned long flags;
bool can_ack;
bool fully_established;
@@ -259,6 +261,11 @@ static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)
return (struct mptcp_sock *)sk;
}
+static inline int __mptcp_space(const struct sock *sk)
+{
+ return tcp_space(sk) + READ_ONCE(mptcp_sk(sk)->rmem_pending);
+}
+
static inline struct mptcp_data_frag *mptcp_send_head(const struct sock *sk)
{
const struct mptcp_sock *msk = mptcp_sk(sk);
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index fd356dc9d580..02d757e0ddb7 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -850,8 +850,6 @@ static void mptcp_subflow_discard_data(struct sock *ssk, struct sk_buff *skb,
sk_eat_skb(ssk, skb);
if (mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len)
subflow->map_valid = 0;
- if (incr)
- tcp_cleanup_rbuf(ssk, incr);
}
static bool subflow_check_data_avail(struct sock *ssk)
@@ -973,7 +971,7 @@ void mptcp_space(const struct sock *ssk, int *space, int *full_space)
const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
const struct sock *sk = subflow->conn;
- *space = tcp_space(sk);
+ *space = __mptcp_space(sk);
*full_space = tcp_full_space(sk);
}
--
2.26.2
1 year, 7 months
[MPTCP][PATCH v2 mptcp-next 00/10] ADD_ADDR: ports support
by Geliang Tang
v2:
- change mptcp_out_options's port field in CPU bype order.
- keep mptcp_options_received's port field in CPU bype order.
- add two new patches to simplify ADD_ADDR suboption writing.
- update mptcp_add_addr_len helper use adding up size.
- add more commit messages.
v1:
This series is the first version of ADD_ADDR ports support. I have solved
the listener problem which I mentioned at the meeting on 15th of October
by adding a new listening socket from the userspace (see patch 8). Up to
now this patchset works well.
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/54
Geliang Tang (10):
mptcp: unify ADD_ADDR and echo suboptions writing
mptcp: unify ADD_ADDR and ADD_ADDR6 suboptions writing
mptcp: add port support for ADD_ADDR suboption writing
mptcp: use adding up size when get ADD_ADDR length
mptcp: add the outgoing ADD_ADDR port support
mptcp: send out dedicated packet for ADD_ADDR using port
mptcp: add port parameter for mptcp_pm_announce_addr
mptcp: deal with MPTCP_PM_ADDR_ATTR_PORT in PM netlink
selftests: mptcp: add port argument for pm_nl_ctl
selftests: mptcp: add testcases for ADD_ADDR with port
include/net/mptcp.h | 1 +
net/mptcp/options.c | 89 +++++++++++--------
net/mptcp/pm.c | 14 +--
net/mptcp/pm_netlink.c | 28 ++++--
net/mptcp/protocol.h | 36 +++++---
.../testing/selftests/net/mptcp/mptcp_join.sh | 26 +++++-
tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 18 ++++
7 files changed, 153 insertions(+), 59 deletions(-)
--
2.26.2
1 year, 7 months
[PATCH net-next v2 0/7] mptcp: Miscellaneous MPTCP fixes
by Mat Martineau
This is a collection of small fixup and minor enhancement patches that
have accumulated in the MPTCP tree while net-next was closed. These are
prerequisites for larger changes we have queued up.
Patch 1 refines receive buffer autotuning.
Patches 2 and 4 are some minor locking and refactoring changes.
Patch 3 improves GRO and RX coalescing with MPTCP skbs.
Patches 5-7 add a sysctl for tuning ADD_ADDR retransmission timeout,
corresponding test code, and documentation.
v2: Add sysctl documentation and fix signoff tags.
Florian Westphal (3):
mptcp: adjust mptcp receive buffer limit if subflow has larger one
mptcp: use _fast lock version in __mptcp_move_skbs
mptcp: split mptcp_clean_una function
Geliang Tang (2):
mptcp: add a new sysctl add_addr_timeout
selftests: mptcp: add ADD_ADDR timeout test case
Mat Martineau (1):
docs: networking: mptcp: Add MPTCP sysctl entries
Paolo Abeni (1):
tcp: propagate MPTCP skb extensions on xmit splits
Documentation/networking/index.rst | 1 +
Documentation/networking/mptcp-sysctl.rst | 26 +++++
MAINTAINERS | 1 +
include/net/mptcp.h | 21 ++++-
net/ipv4/tcp_output.c | 3 +
net/mptcp/ctrl.c | 14 +++
net/mptcp/pm_netlink.c | 8 +-
net/mptcp/protocol.c | 67 +++++++++----
net/mptcp/protocol.h | 1 +
tools/testing/selftests/net/mptcp/config | 10 ++
.../testing/selftests/net/mptcp/mptcp_join.sh | 94 ++++++++++++++-----
11 files changed, 199 insertions(+), 47 deletions(-)
create mode 100644 Documentation/networking/mptcp-sysctl.rst
base-commit: 6d89076e6ef09337a29a7b1ea4fdf2d892be9650
--
2.29.2
1 year, 7 months
[PATCH net-next] Squash-to "mptcp: refactor shutdown and close"
by Paolo Abeni
The msk status for fallback socket is not tracked correctly.
We must switch to close only after the subflow is moved
there, or the worker will not run and pending mptcp data
will not be spooled after close()
Signed-off-by: Paolo Abeni <pabeni(a)redhat.com>
---
net/mptcp/protocol.c | 13 +++++++++----
net/mptcp/subflow.c | 1 -
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index a6bd06c724d5..1ef980d4a646 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -764,8 +764,10 @@ static void mptcp_check_for_eof(struct mptcp_sock *msk)
mptcp_for_each_subflow(msk, subflow)
receivers += !subflow->rx_eof;
+ if (receivers)
+ return;
- if (!receivers && !(sk->sk_shutdown & RCV_SHUTDOWN)) {
+ if (!(sk->sk_shutdown & RCV_SHUTDOWN)) {
/* hopefully temporary hack: propagate shutdown status
* to msk, when all subflows agree on it
*/
@@ -775,6 +777,8 @@ static void mptcp_check_for_eof(struct mptcp_sock *msk)
set_bit(MPTCP_DATA_READY, &msk->flags);
sk->sk_data_ready(sk);
}
+ if (sk->sk_state != TCP_CLOSE && sk->sk_shutdown == SHUTDOWN_MASK)
+ inet_sk_state_store(sk, TCP_CLOSE);
}
static bool mptcp_ext_cache_refill(struct mptcp_sock *msk)
@@ -2157,11 +2161,12 @@ static void mptcp_close(struct sock *sk, long timeout)
lock_sock(sk);
sk->sk_shutdown = SHUTDOWN_MASK;
- if (sk->sk_state == TCP_LISTEN ||
- __mptcp_check_fallback((struct mptcp_sock *)sk)) {
+ if ((1 << sk->sk_state) & (TCPF_LISTEN | TCP_CLOSE)) {
inet_sk_state_store(sk, TCP_CLOSE);
goto cleanup;
- } else if (sk->sk_state == TCP_CLOSE) {
+ } else if (__mptcp_check_fallback((struct mptcp_sock *)sk)) {
+ if (!mptcp_send_pending(sk))
+ inet_sk_state_store(sk, TCP_CLOSE);
goto cleanup;
}
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index 1e9a72af67dc..fd356dc9d580 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -1282,7 +1282,6 @@ static void subflow_state_change(struct sock *sk)
mptcp_data_ready(parent, sk);
if (__mptcp_check_fallback(mptcp_sk(parent)) &&
- !(parent->sk_shutdown & RCV_SHUTDOWN) &&
!subflow->rx_eof && subflow_is_done(sk)) {
subflow->rx_eof = 1;
mptcp_subflow_eof(parent);
--
2.26.2
1 year, 7 months
[PATCH net] mptcp: token: fix unititialized variable
by Davide Caratti
gcc complains about use of uninitialized 'num'. Fix it by doing the first
assignment of 'num' when the variable is declared.
Fixes: 96d890daad05 ("mptcp: add msk interations helper")
Signed-off-by: Davide Caratti <dcaratti(a)redhat.com>
---
net/mptcp/token.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/mptcp/token.c b/net/mptcp/token.c
index 8b47c4bb1c6b..feb4b9ffd462 100644
--- a/net/mptcp/token.c
+++ b/net/mptcp/token.c
@@ -291,7 +291,7 @@ struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_slot,
{
struct mptcp_sock *ret = NULL;
struct hlist_nulls_node *pos;
- int slot, num;
+ int slot, num = 0;
for (slot = *s_slot; slot <= token_mask; *s_num = 0, slot++) {
struct token_bucket *bucket = &token_hash[slot];
--
2.26.2
1 year, 7 months