aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/sctp/structs.h8
-rw-r--r--net/sctp/outqueue.c3
-rw-r--r--net/sctp/proc.c20
-rw-r--r--net/sctp/sm_statefuns.c2
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));