} cacc;
 
        struct {
-               __u32 last_rtx_chunks;
                __u16 pmtu;
                __u16 probe_size;
                __u16 probe_high;
-               __u8 probe_count:3;
-               __u8 raise_count:5;
+               __u8 probe_count;
                __u8 state;
        } pl; /* plpmtud related */
 
 void sctp_transport_reset_hb_timer(struct sctp_transport *);
 void sctp_transport_reset_reconf_timer(struct sctp_transport *transport);
 void sctp_transport_reset_probe_timer(struct sctp_transport *transport);
+void sctp_transport_reset_raise_timer(struct sctp_transport *transport);
 int sctp_transport_hold(struct sctp_transport *);
 void sctp_transport_put(struct sctp_transport *);
 void sctp_transport_update_rto(struct sctp_transport *, __u32);
 void sctp_transport_immediate_rtx(struct sctp_transport *);
 void sctp_transport_dst_release(struct sctp_transport *t);
 void sctp_transport_dst_confirm(struct sctp_transport *t);
-bool sctp_transport_pl_send(struct sctp_transport *t);
+void sctp_transport_pl_send(struct sctp_transport *t);
 bool sctp_transport_pl_recv(struct sctp_transport *t);
 
 
 
        if (!sctp_transport_pl_enabled(transport))
                return SCTP_DISPOSITION_CONSUME;
 
-       if (sctp_transport_pl_send(transport)) {
-               reply = sctp_make_heartbeat(asoc, transport, transport->pl.probe_size);
-               if (!reply)
-                       return SCTP_DISPOSITION_NOMEM;
-               sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply));
-       }
+       sctp_transport_pl_send(transport);
+       reply = sctp_make_heartbeat(asoc, transport, transport->pl.probe_size);
+       if (!reply)
+               return SCTP_DISPOSITION_NOMEM;
+       sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply));
        sctp_add_cmd_sf(commands, SCTP_CMD_PROBE_TIMER_UPDATE,
                        SCTP_TRANSPORT(transport));
 
 
 
 void sctp_transport_reset_probe_timer(struct sctp_transport *transport)
 {
-       if (timer_pending(&transport->probe_timer))
-               return;
        if (!mod_timer(&transport->probe_timer,
                       jiffies + transport->probe_interval))
                sctp_transport_hold(transport);
 }
 
+void sctp_transport_reset_raise_timer(struct sctp_transport *transport)
+{
+       if (!mod_timer(&transport->probe_timer,
+                      jiffies + transport->probe_interval * 30))
+               sctp_transport_hold(transport);
+}
+
 /* This transport has been assigned to an association.
  * Initialize fields from the association or from the sock itself.
  * Register the reference count in the association.
        sctp_transport_pl_update(transport);
 }
 
-bool sctp_transport_pl_send(struct sctp_transport *t)
+void 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 */
        }
 
 out:
-       if (t->pl.state == SCTP_PL_COMPLETE && t->pl.raise_count < 30 &&
-           !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);
-
        t->pl.probe_count++;
-       return true;
 }
 
 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) {
                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);
+                       sctp_transport_reset_raise_timer(t);
                }
-       } else if (t->pl.state == SCTP_PL_COMPLETE && t->pl.raise_count == 30) {
+       } else if (t->pl.state == SCTP_PL_COMPLETE) {
                /* 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;
                        t->pl.probe_high = 0;
                        t->pl.pmtu = SCTP_BASE_PLPMTU;
                        t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t);
+                       sctp_transport_reset_probe_timer(t);
                        return true;
                }
        }