|
@@ -399,20 +399,20 @@ 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);
|
|
|
+ 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;
|
|
|
|
|
|
- /* Update association pmtu. */
|
|
|
- sctp_assoc_sync_pmtu(asoc);
|
|
|
- }
|
|
|
+ /* Update transports view of the MTU */
|
|
|
+ sctp_transport_update_pmtu(t, pmtu);
|
|
|
|
|
|
- /* 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 association pmtu. */
|
|
|
+ sctp_assoc_sync_pmtu(asoc);
|
|
|
+
|
|
|
+ /* Retransmit with the new pmtu setting. */
|
|
|
sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD);
|
|
|
}
|
|
|
|