aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSridhar Samudrala <sri@us.ibm.com>2006-08-22 03:15:33 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2006-09-22 17:55:16 -0400
commitac0b04627269ff16c3c7ab854a65fe6780c6e3e5 (patch)
tree421ea678ea12d1e193b3bbf27fb1410355ba9b47
parent72d3b2c970a2d5d2ccb1d1cab4fb76663c4f2e49 (diff)
[SCTP]: Extend /proc/net/sctp/snmp to provide more statistics.
This patch adds more statistics info under /proc/net/sctp/snmp that should be useful for debugging. The additional events that are counted now include timer expirations, retransmits, packet and data chunk discards. The Data chunk discards include all the cases where a data chunk is discarded including high tsn, bad stream, dup tsn and the most useful one(out of receive buffer/rwnd). Also moved the SCTP MIB data structures from the generic include directories to include/sctp/sctp.h. Signed-off-by: Sridhar Samudrala <sri@us.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/linux/snmp.h33
-rw-r--r--include/net/sctp/sctp.h44
-rw-r--r--include/net/snmp.h6
-rw-r--r--net/sctp/input.c8
-rw-r--r--net/sctp/inqueue.c4
-rw-r--r--net/sctp/outqueue.c6
-rw-r--r--net/sctp/proc.c17
-rw-r--r--net/sctp/sm_statefuns.c15
8 files changed, 88 insertions, 45 deletions
diff --git a/include/linux/snmp.h b/include/linux/snmp.h
index 30156556f78d..854aa6b543f1 100644
--- a/include/linux/snmp.h
+++ b/include/linux/snmp.h
@@ -160,39 +160,6 @@ enum
160 __UDP_MIB_MAX 160 __UDP_MIB_MAX
161}; 161};
162 162
163/* sctp mib definitions */
164/*
165 * draft-ietf-sigtran-sctp-mib-07.txt
166 */
167enum
168{
169 SCTP_MIB_NUM = 0,
170 SCTP_MIB_CURRESTAB, /* CurrEstab */
171 SCTP_MIB_ACTIVEESTABS, /* ActiveEstabs */
172 SCTP_MIB_PASSIVEESTABS, /* PassiveEstabs */
173 SCTP_MIB_ABORTEDS, /* Aborteds */
174 SCTP_MIB_SHUTDOWNS, /* Shutdowns */
175 SCTP_MIB_OUTOFBLUES, /* OutOfBlues */
176 SCTP_MIB_CHECKSUMERRORS, /* ChecksumErrors */
177 SCTP_MIB_OUTCTRLCHUNKS, /* OutCtrlChunks */
178 SCTP_MIB_OUTORDERCHUNKS, /* OutOrderChunks */
179 SCTP_MIB_OUTUNORDERCHUNKS, /* OutUnorderChunks */
180 SCTP_MIB_INCTRLCHUNKS, /* InCtrlChunks */
181 SCTP_MIB_INORDERCHUNKS, /* InOrderChunks */
182 SCTP_MIB_INUNORDERCHUNKS, /* InUnorderChunks */
183 SCTP_MIB_FRAGUSRMSGS, /* FragUsrMsgs */
184 SCTP_MIB_REASMUSRMSGS, /* ReasmUsrMsgs */
185 SCTP_MIB_OUTSCTPPACKS, /* OutSCTPPacks */
186 SCTP_MIB_INSCTPPACKS, /* InSCTPPacks */
187 SCTP_MIB_RTOALGORITHM, /* RtoAlgorithm */
188 SCTP_MIB_RTOMIN, /* RtoMin */
189 SCTP_MIB_RTOMAX, /* RtoMax */
190 SCTP_MIB_RTOINITIAL, /* RtoInitial */
191 SCTP_MIB_VALCOOKIELIFE, /* ValCookieLife */
192 SCTP_MIB_MAXINITRETR, /* MaxInitRetr */
193 __SCTP_MIB_MAX
194};
195
196/* linux mib definitions */ 163/* linux mib definitions */
197enum 164enum
198{ 165{
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
index 1c1abce5f6b6..e274fd479990 100644
--- a/include/net/sctp/sctp.h
+++ b/include/net/sctp/sctp.h
@@ -216,6 +216,50 @@ DECLARE_SNMP_STAT(struct sctp_mib, sctp_statistics);
216 216
217#endif /* !TEST_FRAME */ 217#endif /* !TEST_FRAME */
218 218
219/* sctp mib definitions */
220enum
221{
222 SCTP_MIB_NUM = 0,
223 SCTP_MIB_CURRESTAB, /* CurrEstab */
224 SCTP_MIB_ACTIVEESTABS, /* ActiveEstabs */
225 SCTP_MIB_PASSIVEESTABS, /* PassiveEstabs */
226 SCTP_MIB_ABORTEDS, /* Aborteds */
227 SCTP_MIB_SHUTDOWNS, /* Shutdowns */
228 SCTP_MIB_OUTOFBLUES, /* OutOfBlues */
229 SCTP_MIB_CHECKSUMERRORS, /* ChecksumErrors */
230 SCTP_MIB_OUTCTRLCHUNKS, /* OutCtrlChunks */
231 SCTP_MIB_OUTORDERCHUNKS, /* OutOrderChunks */
232 SCTP_MIB_OUTUNORDERCHUNKS, /* OutUnorderChunks */
233 SCTP_MIB_INCTRLCHUNKS, /* InCtrlChunks */
234 SCTP_MIB_INORDERCHUNKS, /* InOrderChunks */
235 SCTP_MIB_INUNORDERCHUNKS, /* InUnorderChunks */
236 SCTP_MIB_FRAGUSRMSGS, /* FragUsrMsgs */
237 SCTP_MIB_REASMUSRMSGS, /* ReasmUsrMsgs */
238 SCTP_MIB_OUTSCTPPACKS, /* OutSCTPPacks */
239 SCTP_MIB_INSCTPPACKS, /* InSCTPPacks */
240 SCTP_MIB_T1_INIT_EXPIREDS,
241 SCTP_MIB_T1_COOKIE_EXPIREDS,
242 SCTP_MIB_T2_SHUTDOWN_EXPIREDS,
243 SCTP_MIB_T3_RTX_EXPIREDS,
244 SCTP_MIB_T4_RTO_EXPIREDS,
245 SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS,
246 SCTP_MIB_DELAY_SACK_EXPIREDS,
247 SCTP_MIB_AUTOCLOSE_EXPIREDS,
248 SCTP_MIB_T3_RETRANSMITS,
249 SCTP_MIB_PMTUD_RETRANSMITS,
250 SCTP_MIB_FAST_RETRANSMITS,
251 SCTP_MIB_IN_PKT_SOFTIRQ,
252 SCTP_MIB_IN_PKT_BACKLOG,
253 SCTP_MIB_IN_PKT_DISCARDS,
254 SCTP_MIB_IN_DATA_CHUNK_DISCARDS,
255 __SCTP_MIB_MAX
256};
257
258#define SCTP_MIB_MAX __SCTP_MIB_MAX
259struct sctp_mib {
260 unsigned long mibs[SCTP_MIB_MAX];
261} __SNMP_MIB_ALIGN__;
262
219 263
220/* Print debugging messages. */ 264/* Print debugging messages. */
221#if SCTP_DEBUG 265#if SCTP_DEBUG
diff --git a/include/net/snmp.h b/include/net/snmp.h
index a36bed8ea210..464970e39ec0 100644
--- a/include/net/snmp.h
+++ b/include/net/snmp.h
@@ -100,12 +100,6 @@ struct udp_mib {
100 unsigned long mibs[UDP_MIB_MAX]; 100 unsigned long mibs[UDP_MIB_MAX];
101} __SNMP_MIB_ALIGN__; 101} __SNMP_MIB_ALIGN__;
102 102
103/* SCTP */
104#define SCTP_MIB_MAX __SCTP_MIB_MAX
105struct sctp_mib {
106 unsigned long mibs[SCTP_MIB_MAX];
107} __SNMP_MIB_ALIGN__;
108
109/* Linux */ 103/* Linux */
110#define LINUX_MIB_MAX __LINUX_MIB_MAX 104#define LINUX_MIB_MAX __LINUX_MIB_MAX
111struct linux_mib { 105struct linux_mib {
diff --git a/net/sctp/input.c b/net/sctp/input.c
index 42b66e74bbb5..8a34d95602ce 100644
--- a/net/sctp/input.c
+++ b/net/sctp/input.c
@@ -255,10 +255,13 @@ int sctp_rcv(struct sk_buff *skb)
255 */ 255 */
256 sctp_bh_lock_sock(sk); 256 sctp_bh_lock_sock(sk);
257 257
258 if (sock_owned_by_user(sk)) 258 if (sock_owned_by_user(sk)) {
259 SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_BACKLOG);
259 sctp_add_backlog(sk, skb); 260 sctp_add_backlog(sk, skb);
260 else 261 } else {
262 SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_SOFTIRQ);
261 sctp_inq_push(&chunk->rcvr->inqueue, chunk); 263 sctp_inq_push(&chunk->rcvr->inqueue, chunk);
264 }
262 265
263 sctp_bh_unlock_sock(sk); 266 sctp_bh_unlock_sock(sk);
264 267
@@ -271,6 +274,7 @@ int sctp_rcv(struct sk_buff *skb)
271 return 0; 274 return 0;
272 275
273discard_it: 276discard_it:
277 SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_DISCARDS);
274 kfree_skb(skb); 278 kfree_skb(skb);
275 return 0; 279 return 0;
276 280
diff --git a/net/sctp/inqueue.c b/net/sctp/inqueue.c
index cf0c767d43ae..cf6deed7e849 100644
--- a/net/sctp/inqueue.c
+++ b/net/sctp/inqueue.c
@@ -87,7 +87,7 @@ void sctp_inq_free(struct sctp_inq *queue)
87/* Put a new packet in an SCTP inqueue. 87/* Put a new packet in an SCTP inqueue.
88 * We assume that packet->sctp_hdr is set and in host byte order. 88 * We assume that packet->sctp_hdr is set and in host byte order.
89 */ 89 */
90void sctp_inq_push(struct sctp_inq *q, struct sctp_chunk *packet) 90void sctp_inq_push(struct sctp_inq *q, struct sctp_chunk *chunk)
91{ 91{
92 /* Directly call the packet handling routine. */ 92 /* Directly call the packet handling routine. */
93 93
@@ -96,7 +96,7 @@ void sctp_inq_push(struct sctp_inq *q, struct sctp_chunk *packet)
96 * Eventually, we should clean up inqueue to not rely 96 * Eventually, we should clean up inqueue to not rely
97 * on the BH related data structures. 97 * on the BH related data structures.
98 */ 98 */
99 list_add_tail(&packet->list, &q->in_chunk_list); 99 list_add_tail(&chunk->list, &q->in_chunk_list);
100 q->immediate.func(q->immediate.data); 100 q->immediate.func(q->immediate.data);
101} 101}
102 102
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
index 30b710c54e64..37074a39ecbb 100644
--- a/net/sctp/outqueue.c
+++ b/net/sctp/outqueue.c
@@ -467,6 +467,7 @@ void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport,
467 467
468 switch(reason) { 468 switch(reason) {
469 case SCTP_RTXR_T3_RTX: 469 case SCTP_RTXR_T3_RTX:
470 SCTP_INC_STATS(SCTP_MIB_T3_RETRANSMITS);
470 sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_T3_RTX); 471 sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_T3_RTX);
471 /* Update the retran path if the T3-rtx timer has expired for 472 /* Update the retran path if the T3-rtx timer has expired for
472 * the current retran path. 473 * the current retran path.
@@ -475,12 +476,15 @@ void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport,
475 sctp_assoc_update_retran_path(transport->asoc); 476 sctp_assoc_update_retran_path(transport->asoc);
476 break; 477 break;
477 case SCTP_RTXR_FAST_RTX: 478 case SCTP_RTXR_FAST_RTX:
479 SCTP_INC_STATS(SCTP_MIB_FAST_RETRANSMITS);
478 sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_FAST_RTX); 480 sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_FAST_RTX);
479 fast_retransmit = 1; 481 fast_retransmit = 1;
480 break; 482 break;
481 case SCTP_RTXR_PMTUD: 483 case SCTP_RTXR_PMTUD:
482 default: 484 SCTP_INC_STATS(SCTP_MIB_PMTUD_RETRANSMITS);
483 break; 485 break;
486 default:
487 BUG();
484 } 488 }
485 489
486 sctp_retransmit_mark(q, transport, fast_retransmit); 490 sctp_retransmit_mark(q, transport, fast_retransmit);
diff --git a/net/sctp/proc.c b/net/sctp/proc.c
index 5b3b0e0ae7e5..a356d8d310a9 100644
--- a/net/sctp/proc.c
+++ b/net/sctp/proc.c
@@ -57,6 +57,21 @@ static struct snmp_mib sctp_snmp_list[] = {
57 SNMP_MIB_ITEM("SctpReasmUsrMsgs", SCTP_MIB_REASMUSRMSGS), 57 SNMP_MIB_ITEM("SctpReasmUsrMsgs", SCTP_MIB_REASMUSRMSGS),
58 SNMP_MIB_ITEM("SctpOutSCTPPacks", SCTP_MIB_OUTSCTPPACKS), 58 SNMP_MIB_ITEM("SctpOutSCTPPacks", SCTP_MIB_OUTSCTPPACKS),
59 SNMP_MIB_ITEM("SctpInSCTPPacks", SCTP_MIB_INSCTPPACKS), 59 SNMP_MIB_ITEM("SctpInSCTPPacks", SCTP_MIB_INSCTPPACKS),
60 SNMP_MIB_ITEM("SctpT1InitExpireds", SCTP_MIB_T1_INIT_EXPIREDS),
61 SNMP_MIB_ITEM("SctpT1CookieExpireds", SCTP_MIB_T1_COOKIE_EXPIREDS),
62 SNMP_MIB_ITEM("SctpT2ShutdownExpireds", SCTP_MIB_T2_SHUTDOWN_EXPIREDS),
63 SNMP_MIB_ITEM("SctpT3RtxExpireds", SCTP_MIB_T3_RTX_EXPIREDS),
64 SNMP_MIB_ITEM("SctpT4RtoExpireds", SCTP_MIB_T4_RTO_EXPIREDS),
65 SNMP_MIB_ITEM("SctpT5ShutdownGuardExpireds", SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS),
66 SNMP_MIB_ITEM("SctpDelaySackExpireds", SCTP_MIB_DELAY_SACK_EXPIREDS),
67 SNMP_MIB_ITEM("SctpAutocloseExpireds", SCTP_MIB_AUTOCLOSE_EXPIREDS),
68 SNMP_MIB_ITEM("SctpT3Retransmits", SCTP_MIB_T3_RETRANSMITS),
69 SNMP_MIB_ITEM("SctpPmtudRetransmits", SCTP_MIB_PMTUD_RETRANSMITS),
70 SNMP_MIB_ITEM("SctpFastRetransmits", SCTP_MIB_FAST_RETRANSMITS),
71 SNMP_MIB_ITEM("SctpInPktSoftirq", SCTP_MIB_IN_PKT_SOFTIRQ),
72 SNMP_MIB_ITEM("SctpInPktBacklog", SCTP_MIB_IN_PKT_BACKLOG),
73 SNMP_MIB_ITEM("SctpInPktDiscards", SCTP_MIB_IN_PKT_DISCARDS),
74 SNMP_MIB_ITEM("SctpInDataChunkDiscards", SCTP_MIB_IN_DATA_CHUNK_DISCARDS),
60 SNMP_MIB_SENTINEL 75 SNMP_MIB_SENTINEL
61}; 76};
62 77
@@ -328,8 +343,8 @@ static int sctp_assocs_seq_show(struct seq_file *seq, void *v)
328 "%8p %8p %-3d %-3d %-2d %-4d %4d %8d %8d %7d %5lu %-5d %5d ", 343 "%8p %8p %-3d %-3d %-2d %-4d %4d %8d %8d %7d %5lu %-5d %5d ",
329 assoc, sk, sctp_sk(sk)->type, sk->sk_state, 344 assoc, sk, sctp_sk(sk)->type, sk->sk_state,
330 assoc->state, hash, assoc->assoc_id, 345 assoc->state, hash, assoc->assoc_id,
331 (sk->sk_rcvbuf - assoc->rwnd),
332 assoc->sndbuf_used, 346 assoc->sndbuf_used,
347 (sk->sk_rcvbuf - assoc->rwnd),
333 sock_i_uid(sk), sock_i_ino(sk), 348 sock_i_uid(sk), sock_i_ino(sk),
334 epb->bind_addr.port, 349 epb->bind_addr.port,
335 assoc->peer.port); 350 assoc->peer.port);
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index 5b5ae7958322..32f57f42af9e 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -2663,9 +2663,11 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep,
2663 break; 2663 break;
2664 case SCTP_IERROR_HIGH_TSN: 2664 case SCTP_IERROR_HIGH_TSN:
2665 case SCTP_IERROR_BAD_STREAM: 2665 case SCTP_IERROR_BAD_STREAM:
2666 SCTP_INC_STATS(SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
2666 goto discard_noforce; 2667 goto discard_noforce;
2667 case SCTP_IERROR_DUP_TSN: 2668 case SCTP_IERROR_DUP_TSN:
2668 case SCTP_IERROR_IGNORE_TSN: 2669 case SCTP_IERROR_IGNORE_TSN:
2670 SCTP_INC_STATS(SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
2669 goto discard_force; 2671 goto discard_force;
2670 case SCTP_IERROR_NO_DATA: 2672 case SCTP_IERROR_NO_DATA:
2671 goto consume; 2673 goto consume;
@@ -3652,6 +3654,7 @@ sctp_disposition_t sctp_sf_pdiscard(const struct sctp_endpoint *ep,
3652 void *arg, 3654 void *arg,
3653 sctp_cmd_seq_t *commands) 3655 sctp_cmd_seq_t *commands)
3654{ 3656{
3657 SCTP_INC_STATS(SCTP_MIB_IN_PKT_DISCARDS);
3655 sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL()); 3658 sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL());
3656 3659
3657 return SCTP_DISPOSITION_CONSUME; 3660 return SCTP_DISPOSITION_CONSUME;
@@ -4548,6 +4551,8 @@ sctp_disposition_t sctp_sf_do_6_3_3_rtx(const struct sctp_endpoint *ep,
4548{ 4551{
4549 struct sctp_transport *transport = arg; 4552 struct sctp_transport *transport = arg;
4550 4553
4554 SCTP_INC_STATS(SCTP_MIB_T3_RTX_EXPIREDS);
4555
4551 if (asoc->overall_error_count >= asoc->max_retrans) { 4556 if (asoc->overall_error_count >= asoc->max_retrans) {
4552 sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, 4557 sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
4553 SCTP_ERROR(ETIMEDOUT)); 4558 SCTP_ERROR(ETIMEDOUT));
@@ -4616,6 +4621,7 @@ sctp_disposition_t sctp_sf_do_6_2_sack(const struct sctp_endpoint *ep,
4616 void *arg, 4621 void *arg,
4617 sctp_cmd_seq_t *commands) 4622 sctp_cmd_seq_t *commands)
4618{ 4623{
4624 SCTP_INC_STATS(SCTP_MIB_DELAY_SACK_EXPIREDS);
4619 sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_FORCE()); 4625 sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_FORCE());
4620 return SCTP_DISPOSITION_CONSUME; 4626 return SCTP_DISPOSITION_CONSUME;
4621} 4627}
@@ -4650,6 +4656,7 @@ sctp_disposition_t sctp_sf_t1_init_timer_expire(const struct sctp_endpoint *ep,
4650 int attempts = asoc->init_err_counter + 1; 4656 int attempts = asoc->init_err_counter + 1;
4651 4657
4652 SCTP_DEBUG_PRINTK("Timer T1 expired (INIT).\n"); 4658 SCTP_DEBUG_PRINTK("Timer T1 expired (INIT).\n");
4659 SCTP_INC_STATS(SCTP_MIB_T1_INIT_EXPIREDS);
4653 4660
4654 if (attempts <= asoc->max_init_attempts) { 4661 if (attempts <= asoc->max_init_attempts) {
4655 bp = (struct sctp_bind_addr *) &asoc->base.bind_addr; 4662 bp = (struct sctp_bind_addr *) &asoc->base.bind_addr;
@@ -4709,6 +4716,7 @@ sctp_disposition_t sctp_sf_t1_cookie_timer_expire(const struct sctp_endpoint *ep
4709 int attempts = asoc->init_err_counter + 1; 4716 int attempts = asoc->init_err_counter + 1;
4710 4717
4711 SCTP_DEBUG_PRINTK("Timer T1 expired (COOKIE-ECHO).\n"); 4718 SCTP_DEBUG_PRINTK("Timer T1 expired (COOKIE-ECHO).\n");
4719 SCTP_INC_STATS(SCTP_MIB_T1_COOKIE_EXPIREDS);
4712 4720
4713 if (attempts <= asoc->max_init_attempts) { 4721 if (attempts <= asoc->max_init_attempts) {
4714 repl = sctp_make_cookie_echo(asoc, NULL); 4722 repl = sctp_make_cookie_echo(asoc, NULL);
@@ -4753,6 +4761,8 @@ sctp_disposition_t sctp_sf_t2_timer_expire(const struct sctp_endpoint *ep,
4753 struct sctp_chunk *reply = NULL; 4761 struct sctp_chunk *reply = NULL;
4754 4762
4755 SCTP_DEBUG_PRINTK("Timer T2 expired.\n"); 4763 SCTP_DEBUG_PRINTK("Timer T2 expired.\n");
4764 SCTP_INC_STATS(SCTP_MIB_T2_SHUTDOWN_EXPIREDS);
4765
4756 if (asoc->overall_error_count >= asoc->max_retrans) { 4766 if (asoc->overall_error_count >= asoc->max_retrans) {
4757 sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, 4767 sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
4758 SCTP_ERROR(ETIMEDOUT)); 4768 SCTP_ERROR(ETIMEDOUT));
@@ -4814,6 +4824,8 @@ sctp_disposition_t sctp_sf_t4_timer_expire(
4814 struct sctp_chunk *chunk = asoc->addip_last_asconf; 4824 struct sctp_chunk *chunk = asoc->addip_last_asconf;
4815 struct sctp_transport *transport = chunk->transport; 4825 struct sctp_transport *transport = chunk->transport;
4816 4826
4827 SCTP_INC_STATS(SCTP_MIB_T4_RTO_EXPIREDS);
4828
4817 /* ADDIP 4.1 B1) Increment the error counters and perform path failure 4829 /* ADDIP 4.1 B1) Increment the error counters and perform path failure
4818 * detection on the appropriate destination address as defined in 4830 * detection on the appropriate destination address as defined in
4819 * RFC2960 [5] section 8.1 and 8.2. 4831 * RFC2960 [5] section 8.1 and 8.2.
@@ -4880,6 +4892,7 @@ sctp_disposition_t sctp_sf_t5_timer_expire(const struct sctp_endpoint *ep,
4880 struct sctp_chunk *reply = NULL; 4892 struct sctp_chunk *reply = NULL;
4881 4893
4882 SCTP_DEBUG_PRINTK("Timer T5 expired.\n"); 4894 SCTP_DEBUG_PRINTK("Timer T5 expired.\n");
4895 SCTP_INC_STATS(SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS);
4883 4896
4884 reply = sctp_make_abort(asoc, NULL, 0); 4897 reply = sctp_make_abort(asoc, NULL, 0);
4885 if (!reply) 4898 if (!reply)
@@ -4910,6 +4923,8 @@ sctp_disposition_t sctp_sf_autoclose_timer_expire(
4910{ 4923{
4911 int disposition; 4924 int disposition;
4912 4925
4926 SCTP_INC_STATS(SCTP_MIB_AUTOCLOSE_EXPIREDS);
4927
4913 /* From 9.2 Shutdown of an Association 4928 /* From 9.2 Shutdown of an Association
4914 * Upon receipt of the SHUTDOWN primitive from its upper 4929 * Upon receipt of the SHUTDOWN primitive from its upper
4915 * layer, the endpoint enters SHUTDOWN-PENDING state and 4930 * layer, the endpoint enters SHUTDOWN-PENDING state and