diff options
Diffstat (limited to 'net/sctp/input.c')
| -rw-r--r-- | net/sctp/input.c | 28 | 
1 files changed, 16 insertions, 12 deletions
diff --git a/net/sctp/input.c b/net/sctp/input.c index 621b5ca3fd1c..141c9c466ec1 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c @@ -399,20 +399,24 @@ void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc,  		return;  	} -	if (t->param_flags & SPP_PMTUD_ENABLE) { -		/* Update transports view of the MTU */ -		sctp_transport_update_pmtu(t, pmtu); - -		/* Update association pmtu. */ -		sctp_assoc_sync_pmtu(asoc); -	} +	if (!(t->param_flags & SPP_PMTUD_ENABLE)) +		/* We can't allow retransmitting in such case, as the +		 * retransmission would be sized just as before, and thus we +		 * would get another icmp, and retransmit again. +		 */ +		return; -	/* Retransmit with the new pmtu setting. -	 * Normally, if PMTU discovery is disabled, an ICMP Fragmentation -	 * Needed will never be sent, but if a message was sent before -	 * PMTU discovery was disabled that was larger than the PMTU, it -	 * would not be fragmented, so it must be re-transmitted fragmented. +	/* Update transports view of the MTU. Return if no update was needed. +	 * If an update wasn't needed/possible, it also doesn't make sense to +	 * try to retransmit now.  	 */ +	if (!sctp_transport_update_pmtu(t, pmtu)) +		return; + +	/* Update association pmtu. */ +	sctp_assoc_sync_pmtu(asoc); + +	/* Retransmit with the new pmtu setting. */  	sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD);  }  | 
