|
@@ -440,14 +440,26 @@ static void sctp_do_8_2_transport_strike(struct sctp_association *asoc,
|
|
/* The check for association's overall error counter exceeding the
|
|
/* The check for association's overall error counter exceeding the
|
|
* threshold is done in the state function.
|
|
* threshold is done in the state function.
|
|
*/
|
|
*/
|
|
- /* When probing UNCONFIRMED addresses, the association overall
|
|
|
|
- * error count is NOT incremented
|
|
|
|
|
|
+ /* We are here due to a timer expiration. If the timer was
|
|
|
|
+ * not a HEARTBEAT, then normal error tracking is done.
|
|
|
|
+ * If the timer was a heartbeat, we only increment error counts
|
|
|
|
+ * when we already have an outstanding HEARTBEAT that has not
|
|
|
|
+ * been acknowledged.
|
|
|
|
+ * Additionaly, some tranport states inhibit error increments.
|
|
*/
|
|
*/
|
|
- if (transport->state != SCTP_UNCONFIRMED)
|
|
|
|
|
|
+ if (!is_hb) {
|
|
asoc->overall_error_count++;
|
|
asoc->overall_error_count++;
|
|
|
|
+ if (transport->state != SCTP_INACTIVE)
|
|
|
|
+ transport->error_count++;
|
|
|
|
+ } else if (transport->hb_sent) {
|
|
|
|
+ if (transport->state != SCTP_UNCONFIRMED)
|
|
|
|
+ asoc->overall_error_count++;
|
|
|
|
+ if (transport->state != SCTP_INACTIVE)
|
|
|
|
+ transport->error_count++;
|
|
|
|
+ }
|
|
|
|
|
|
if (transport->state != SCTP_INACTIVE &&
|
|
if (transport->state != SCTP_INACTIVE &&
|
|
- (transport->error_count++ >= transport->pathmaxrxt)) {
|
|
|
|
|
|
+ (transport->error_count > transport->pathmaxrxt)) {
|
|
SCTP_DEBUG_PRINTK_IPADDR("transport_strike:association %p",
|
|
SCTP_DEBUG_PRINTK_IPADDR("transport_strike:association %p",
|
|
" transport IP: port:%d failed.\n",
|
|
" transport IP: port:%d failed.\n",
|
|
asoc,
|
|
asoc,
|