diff options
-rw-r--r-- | include/net/sctp/structs.h | 8 | ||||
-rw-r--r-- | net/sctp/outqueue.c | 3 | ||||
-rw-r--r-- | net/sctp/proc.c | 20 | ||||
-rw-r--r-- | net/sctp/sm_statefuns.c | 2 |
4 files changed, 27 insertions, 6 deletions
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 9c827a749b6f..8966599ddb9f 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
@@ -1661,6 +1661,9 @@ struct sctp_association { | |||
1661 | /* Transport to which SHUTDOWN chunk was last sent. */ | 1661 | /* Transport to which SHUTDOWN chunk was last sent. */ |
1662 | struct sctp_transport *shutdown_last_sent_to; | 1662 | struct sctp_transport *shutdown_last_sent_to; |
1663 | 1663 | ||
1664 | /* How many times have we resent a SHUTDOWN */ | ||
1665 | int shutdown_retries; | ||
1666 | |||
1664 | /* Transport to which INIT chunk was last sent. */ | 1667 | /* Transport to which INIT chunk was last sent. */ |
1665 | struct sctp_transport *init_last_sent_to; | 1668 | struct sctp_transport *init_last_sent_to; |
1666 | 1669 | ||
@@ -1695,6 +1698,11 @@ struct sctp_association { | |||
1695 | */ | 1698 | */ |
1696 | __u16 unack_data; | 1699 | __u16 unack_data; |
1697 | 1700 | ||
1701 | /* The total number of data chunks that we've had to retransmit | ||
1702 | * as the result of a T3 timer expiration | ||
1703 | */ | ||
1704 | __u32 rtx_data_chunks; | ||
1705 | |||
1698 | /* This is the association's receive buffer space. This value is used | 1706 | /* This is the association's receive buffer space. This value is used |
1699 | * to set a_rwnd field in an INIT or a SACK chunk. | 1707 | * to set a_rwnd field in an INIT or a SACK chunk. |
1700 | */ | 1708 | */ |
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index 1bb3c5c35d2a..fd4deefab3cf 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c | |||
@@ -494,6 +494,8 @@ void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport, | |||
494 | */ | 494 | */ |
495 | if (transport == transport->asoc->peer.retran_path) | 495 | if (transport == transport->asoc->peer.retran_path) |
496 | sctp_assoc_update_retran_path(transport->asoc); | 496 | sctp_assoc_update_retran_path(transport->asoc); |
497 | transport->asoc->rtx_data_chunks += | ||
498 | transport->asoc->unack_data; | ||
497 | break; | 499 | break; |
498 | case SCTP_RTXR_FAST_RTX: | 500 | case SCTP_RTXR_FAST_RTX: |
499 | SCTP_INC_STATS(SCTP_MIB_FAST_RETRANSMITS); | 501 | SCTP_INC_STATS(SCTP_MIB_FAST_RETRANSMITS); |
@@ -504,6 +506,7 @@ void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport, | |||
504 | break; | 506 | break; |
505 | case SCTP_RTXR_T1_RTX: | 507 | case SCTP_RTXR_T1_RTX: |
506 | SCTP_INC_STATS(SCTP_MIB_T1_RETRANSMITS); | 508 | SCTP_INC_STATS(SCTP_MIB_T1_RETRANSMITS); |
509 | transport->asoc->init_retries++; | ||
507 | break; | 510 | break; |
508 | default: | 511 | default: |
509 | BUG(); | 512 | BUG(); |
diff --git a/net/sctp/proc.c b/net/sctp/proc.c index 9e214da82d9e..82bea300308d 100644 --- a/net/sctp/proc.c +++ b/net/sctp/proc.c | |||
@@ -281,8 +281,10 @@ static void * sctp_assocs_seq_start(struct seq_file *seq, loff_t *pos) | |||
281 | *pos = 0; | 281 | *pos = 0; |
282 | 282 | ||
283 | if (*pos == 0) | 283 | if (*pos == 0) |
284 | seq_printf(seq, " ASSOC SOCK STY SST ST HBKT ASSOC-ID TX_QUEUE RX_QUEUE UID INODE LPORT " | 284 | seq_printf(seq, " ASSOC SOCK STY SST ST HBKT " |
285 | "RPORT LADDRS <-> RADDRS\n"); | 285 | "ASSOC-ID TX_QUEUE RX_QUEUE UID INODE LPORT " |
286 | "RPORT LADDRS <-> RADDRS " | ||
287 | "HBINT INS OUTS MAXRT T1X T2X RTXC\n"); | ||
286 | 288 | ||
287 | return (void *)pos; | 289 | return (void *)pos; |
288 | } | 290 | } |
@@ -321,15 +323,21 @@ static int sctp_assocs_seq_show(struct seq_file *seq, void *v) | |||
321 | assoc = sctp_assoc(epb); | 323 | assoc = sctp_assoc(epb); |
322 | sk = epb->sk; | 324 | sk = epb->sk; |
323 | seq_printf(seq, | 325 | seq_printf(seq, |
324 | "%8p %8p %-3d %-3d %-2d %-4d %4d %8d %8d %7d %5lu %-5d %5d ", | 326 | "%8p %8p %-3d %-3d %-2d %-4d " |
327 | "%4d %8d %8d %7d %5lu %-5d %5d " | ||
328 | "%8d %5d %5d %4d %4d %4d %8d ", | ||
325 | assoc, sk, sctp_sk(sk)->type, sk->sk_state, | 329 | assoc, sk, sctp_sk(sk)->type, sk->sk_state, |
326 | assoc->state, hash, assoc->assoc_id, | 330 | assoc->state, hash, |
331 | assoc->assoc_id, | ||
327 | assoc->sndbuf_used, | 332 | assoc->sndbuf_used, |
328 | atomic_read(&assoc->rmem_alloc), | 333 | atomic_read(&assoc->rmem_alloc), |
329 | sock_i_uid(sk), sock_i_ino(sk), | 334 | sock_i_uid(sk), sock_i_ino(sk), |
330 | epb->bind_addr.port, | 335 | epb->bind_addr.port, |
331 | assoc->peer.port); | 336 | assoc->peer.port, |
332 | 337 | assoc->hbinterval, assoc->c.sinit_max_instreams, | |
338 | assoc->c.sinit_num_ostreams, assoc->max_retrans, | ||
339 | assoc->init_retries, assoc->shutdown_retries, | ||
340 | assoc->rtx_data_chunks); | ||
333 | seq_printf(seq, " "); | 341 | seq_printf(seq, " "); |
334 | sctp_seq_dump_local_addrs(seq, epb); | 342 | sctp_seq_dump_local_addrs(seq, epb); |
335 | seq_printf(seq, "<-> "); | 343 | seq_printf(seq, "<-> "); |
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index f2ed6473feef..ade0cbd3a52b 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
@@ -5312,6 +5312,8 @@ sctp_disposition_t sctp_sf_t2_timer_expire(const struct sctp_endpoint *ep, | |||
5312 | SCTP_DEBUG_PRINTK("Timer T2 expired.\n"); | 5312 | SCTP_DEBUG_PRINTK("Timer T2 expired.\n"); |
5313 | SCTP_INC_STATS(SCTP_MIB_T2_SHUTDOWN_EXPIREDS); | 5313 | SCTP_INC_STATS(SCTP_MIB_T2_SHUTDOWN_EXPIREDS); |
5314 | 5314 | ||
5315 | ((struct sctp_association *)asoc)->shutdown_retries++; | ||
5316 | |||
5315 | if (asoc->overall_error_count >= asoc->max_retrans) { | 5317 | if (asoc->overall_error_count >= asoc->max_retrans) { |
5316 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, | 5318 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, |
5317 | SCTP_ERROR(ETIMEDOUT)); | 5319 | SCTP_ERROR(ETIMEDOUT)); |