diff mbox series

[net,2/2] sctp: send pmtu probe only if packet loss in Search Complete state

Message ID b27420c3db63969d3faf00a2e866126dae3b870c.1626713549.git.lucien.xin@gmail.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series sctp: improve the pmtu probe in Search Complete state | expand

Checks

Context Check Description
netdev/cover_letter success Link
netdev/fixes_present fail Series targets non-next tree, but doesn't contain any Fixes tags
netdev/patch_count success Link
netdev/tree_selection success Clearly marked for net
netdev/subject_prefix success Link
netdev/cc_maintainers warning 2 maintainers not CCed: vyasevich@gmail.com nhorman@tuxdriver.com
netdev/source_inline success Was 0 now: 0
netdev/verify_signedoff success Link
netdev/module_param success Was 0 now: 0
netdev/build_32bit success Errors and warnings before: 42 this patch: 42
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/verify_fixes success Link
netdev/checkpatch warning WARNING: line length of 86 exceeds 80 columns
netdev/build_allmodconfig_warn success Errors and warnings before: 42 this patch: 42
netdev/header_inline success Link

Commit Message

Xin Long July 19, 2021, 4:53 p.m. UTC
This patch is to introduce last_rtx_chunks into sctp_transport to detect
if there's any packet retransmission/loss happened by checking against
asoc's rtx_data_chunks in sctp_transport_pl_send().

If there is, namely, transport->last_rtx_chunks != asoc->rtx_data_chunks,
the pmtu probe will be sent out. Otherwise, increment the pl.raise_count
and return when it's in Search Complete state.

With this patch, if in Search Complete state, which is a long period, it
doesn't need to keep probing the current pmtu unless there's data packet
loss. This will save quite some traffic.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
 include/net/sctp/structs.h | 1 +
 net/sctp/transport.c       | 6 +++++-
 2 files changed, 6 insertions(+), 1 deletion(-)

Comments

Jakub Kicinski July 20, 2021, 10:50 a.m. UTC | #1
On Mon, 19 Jul 2021 12:53:23 -0400, Xin Long wrote:
> This patch is to introduce last_rtx_chunks into sctp_transport to detect
> if there's any packet retransmission/loss happened by checking against
> asoc's rtx_data_chunks in sctp_transport_pl_send().
> 
> If there is, namely, transport->last_rtx_chunks != asoc->rtx_data_chunks,
> the pmtu probe will be sent out. Otherwise, increment the pl.raise_count
> and return when it's in Search Complete state.
> 
> With this patch, if in Search Complete state, which is a long period, it
> doesn't need to keep probing the current pmtu unless there's data packet
> loss. This will save quite some traffic.
> 
> Signed-off-by: Xin Long <lucien.xin@gmail.com>

Can we get a Fixes tag, please?
Xin Long July 20, 2021, 2:16 p.m. UTC | #2
On Tue, Jul 20, 2021 at 6:50 AM Jakub Kicinski <kuba@kernel.org> wrote:
>
> On Mon, 19 Jul 2021 12:53:23 -0400, Xin Long wrote:
> > This patch is to introduce last_rtx_chunks into sctp_transport to detect
> > if there's any packet retransmission/loss happened by checking against
> > asoc's rtx_data_chunks in sctp_transport_pl_send().
> >
> > If there is, namely, transport->last_rtx_chunks != asoc->rtx_data_chunks,
> > the pmtu probe will be sent out. Otherwise, increment the pl.raise_count
> > and return when it's in Search Complete state.
> >
> > With this patch, if in Search Complete state, which is a long period, it
> > doesn't need to keep probing the current pmtu unless there's data packet
> > loss. This will save quite some traffic.
> >
> > Signed-off-by: Xin Long <lucien.xin@gmail.com>
>
> Can we get a Fixes tag, please?
Fixes: 0dac127c0557 ("sctp: do black hole detection in search complete state")

Should I repost?
diff mbox series

Patch

diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
index f3d414ed208e..651bba654d77 100644
--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -984,6 +984,7 @@  struct sctp_transport {
 	} cacc;
 
 	struct {
+		__u32 last_rtx_chunks;
 		__u16 pmtu;
 		__u16 probe_size;
 		__u16 probe_high;
diff --git a/net/sctp/transport.c b/net/sctp/transport.c
index 23e7bd3e3bd4..a3d3ca6dd63d 100644
--- a/net/sctp/transport.c
+++ b/net/sctp/transport.c
@@ -263,6 +263,7 @@  bool sctp_transport_pl_send(struct sctp_transport *t)
 	if (t->pl.probe_count < SCTP_MAX_PROBES)
 		goto out;
 
+	t->pl.last_rtx_chunks = t->asoc->rtx_data_chunks;
 	t->pl.probe_count = 0;
 	if (t->pl.state == SCTP_PL_BASE) {
 		if (t->pl.probe_size == SCTP_BASE_PLPMTU) { /* BASE_PLPMTU Confirmation Failed */
@@ -298,8 +299,10 @@  bool sctp_transport_pl_send(struct sctp_transport *t)
 
 out:
 	if (t->pl.state == SCTP_PL_COMPLETE && t->pl.raise_count < 30 &&
-	    !t->pl.probe_count)
+	    !t->pl.probe_count && t->pl.last_rtx_chunks == t->asoc->rtx_data_chunks) {
 		t->pl.raise_count++;
+		return false;
+	}
 
 	pr_debug("%s: PLPMTUD: transport: %p, state: %d, pmtu: %d, size: %d, high: %d\n",
 		 __func__, t, t->pl.state, t->pl.pmtu, t->pl.probe_size, t->pl.probe_high);
@@ -313,6 +316,7 @@  bool sctp_transport_pl_recv(struct sctp_transport *t)
 	pr_debug("%s: PLPMTUD: transport: %p, state: %d, pmtu: %d, size: %d, high: %d\n",
 		 __func__, t, t->pl.state, t->pl.pmtu, t->pl.probe_size, t->pl.probe_high);
 
+	t->pl.last_rtx_chunks = t->asoc->rtx_data_chunks;
 	t->pl.pmtu = t->pl.probe_size;
 	t->pl.probe_count = 0;
 	if (t->pl.state == SCTP_PL_BASE) {