diff mbox series

[net-next,1/2] sctp: do black hole detection in search complete state

Message ID 08344e5d9b0eb31c1b777f44cd1b95ecdde5a3d6.1624549642.git.lucien.xin@gmail.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series sctp: make the PLPMTUD probe more effective and efficient | expand

Checks

Context Check Description
netdev/cover_letter success Link
netdev/fixes_present success Link
netdev/patch_count success Link
netdev/tree_selection success Clearly marked for net-next
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: 60 this patch: 60
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/verify_fixes success Link
netdev/checkpatch warning WARNING: line length of 82 exceeds 80 columns WARNING: line length of 83 exceeds 80 columns
netdev/build_allmodconfig_warn success Errors and warnings before: 59 this patch: 59
netdev/header_inline success Link

Commit Message

Xin Long June 24, 2021, 3:48 p.m. UTC
Currently the PLPMUTD probe will stop for a long period (interval * 30)
after it enters search complete state. If there's a pmtu change on the
route path, it takes a long time to be aware if the ICMP TooBig packet
is lost or filtered.

As it says in rfc8899#section-4.3:

  "A DPLPMTUD method MUST NOT rely solely on this method."
  (ICMP PTB message).

This patch is to enable the other method for search complete state:

  "A PL can use the DPLPMTUD probing mechanism to periodically
   generate probe packets of the size of the current PLPMTU."

With this patch, the probe will continue with the current pmtu every
'interval' until the PMTU_RAISE_TIMER 'timeout', which we implement
by adding raise_count to raise the probe size when it counts to 30
and removing the SCTP_PL_COMPLETE check for PMTU_RAISE_TIMER.

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

Comments

Marcelo Ricardo Leitner June 25, 2021, 1:11 a.m. UTC | #1
On Thu, Jun 24, 2021 at 11:48:08AM -0400, Xin Long wrote:
> @@ -333,13 +328,15 @@ void sctp_transport_pl_recv(struct sctp_transport *t)
>  		t->pl.probe_size += SCTP_PL_MIN_STEP;
>  		if (t->pl.probe_size >= t->pl.probe_high) {
>  			t->pl.probe_high = 0;
> +			t->pl.raise_count = 0;
>  			t->pl.state = SCTP_PL_COMPLETE; /* Search -> Search Complete */
>  
>  			t->pl.probe_size = t->pl.pmtu;
>  			t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t);
>  			sctp_assoc_sync_pmtu(t->asoc);
>  		}
> -	} else if (t->pl.state == SCTP_PL_COMPLETE) {
> +	} else if (t->pl.state == SCTP_PL_COMPLETE && ++t->pl.raise_count == 30) {

Please either break the condition into 2 lines or even in 2 if()s. The
++ operator here can easily go unnoticed otherwise.

> +		/* Raise probe_size again after 30 * interval in Search Complete */
>  		t->pl.state = SCTP_PL_SEARCH; /* Search Complete -> Search */
>  		t->pl.probe_size += SCTP_PL_MIN_STEP;
>  	}
> -- 
> 2.27.0
>
Xin Long June 25, 2021, 4:23 p.m. UTC | #2
On Thu, Jun 24, 2021 at 9:11 PM Marcelo Ricardo Leitner
<marcelo.leitner@gmail.com> wrote:
>
> On Thu, Jun 24, 2021 at 11:48:08AM -0400, Xin Long wrote:
> > @@ -333,13 +328,15 @@ void sctp_transport_pl_recv(struct sctp_transport *t)
> >               t->pl.probe_size += SCTP_PL_MIN_STEP;
> >               if (t->pl.probe_size >= t->pl.probe_high) {
> >                       t->pl.probe_high = 0;
> > +                     t->pl.raise_count = 0;
> >                       t->pl.state = SCTP_PL_COMPLETE; /* Search -> Search Complete */
> >
> >                       t->pl.probe_size = t->pl.pmtu;
> >                       t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t);
> >                       sctp_assoc_sync_pmtu(t->asoc);
> >               }
> > -     } else if (t->pl.state == SCTP_PL_COMPLETE) {
> > +     } else if (t->pl.state == SCTP_PL_COMPLETE && ++t->pl.raise_count == 30) {
>
> Please either break the condition into 2 lines or even in 2 if()s. The
> ++ operator here can easily go unnoticed otherwise.
will change it to:
        } else if (t->pl.state == SCTP_PL_COMPLETE) {
                t->pl.raise_count++;
                if (t->pl.raise_count == 30) {

Thanks.
>
> > +             /* Raise probe_size again after 30 * interval in Search Complete */
> >               t->pl.state = SCTP_PL_SEARCH; /* Search Complete -> Search */
> >               t->pl.probe_size += SCTP_PL_MIN_STEP;
> >       }
> > --
> > 2.27.0
> >
diff mbox series

Patch

diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
index 9eaa701cda23..c4a4c1754be8 100644
--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -987,7 +987,8 @@  struct sctp_transport {
 		__u16 pmtu;
 		__u16 probe_size;
 		__u16 probe_high;
-		__u8 probe_count;
+		__u8 probe_count:3;
+		__u8 raise_count:5;
 		__u8 state;
 	} pl; /* plpmtud related */
 
diff --git a/net/sctp/transport.c b/net/sctp/transport.c
index f27b856ea8ce..5f23804f21c7 100644
--- a/net/sctp/transport.c
+++ b/net/sctp/transport.c
@@ -213,15 +213,10 @@  void sctp_transport_reset_reconf_timer(struct sctp_transport *transport)
 
 void sctp_transport_reset_probe_timer(struct sctp_transport *transport)
 {
-	int scale = 1;
-
 	if (timer_pending(&transport->probe_timer))
 		return;
-	if (transport->pl.state == SCTP_PL_COMPLETE &&
-	    transport->pl.probe_count == 1)
-		scale = 30; /* works as PMTU_RAISE_TIMER */
 	if (!mod_timer(&transport->probe_timer,
-		       jiffies + transport->probe_interval * scale))
+		       jiffies + transport->probe_interval))
 		sctp_transport_hold(transport);
 }
 
@@ -333,13 +328,15 @@  void sctp_transport_pl_recv(struct sctp_transport *t)
 		t->pl.probe_size += SCTP_PL_MIN_STEP;
 		if (t->pl.probe_size >= t->pl.probe_high) {
 			t->pl.probe_high = 0;
+			t->pl.raise_count = 0;
 			t->pl.state = SCTP_PL_COMPLETE; /* Search -> Search Complete */
 
 			t->pl.probe_size = t->pl.pmtu;
 			t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t);
 			sctp_assoc_sync_pmtu(t->asoc);
 		}
-	} else if (t->pl.state == SCTP_PL_COMPLETE) {
+	} else if (t->pl.state == SCTP_PL_COMPLETE && ++t->pl.raise_count == 30) {
+		/* Raise probe_size again after 30 * interval in Search Complete */
 		t->pl.state = SCTP_PL_SEARCH; /* Search Complete -> Search */
 		t->pl.probe_size += SCTP_PL_MIN_STEP;
 	}