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
State Superseded
Headers show
Series sctp: improve the pmtu probe in Search Complete state | expand

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) {