diff options
author | Sridhar Samudrala <sri@us.ibm.com> | 2006-08-22 03:15:33 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-09-22 17:55:16 -0400 |
commit | ac0b04627269ff16c3c7ab854a65fe6780c6e3e5 (patch) | |
tree | 421ea678ea12d1e193b3bbf27fb1410355ba9b47 | |
parent | 72d3b2c970a2d5d2ccb1d1cab4fb76663c4f2e49 (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.h | 33 | ||||
-rw-r--r-- | include/net/sctp/sctp.h | 44 | ||||
-rw-r--r-- | include/net/snmp.h | 6 | ||||
-rw-r--r-- | net/sctp/input.c | 8 | ||||
-rw-r--r-- | net/sctp/inqueue.c | 4 | ||||
-rw-r--r-- | net/sctp/outqueue.c | 6 | ||||
-rw-r--r-- | net/sctp/proc.c | 17 | ||||
-rw-r--r-- | net/sctp/sm_statefuns.c | 15 |
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 | */ | ||
167 | enum | ||
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 */ |
197 | enum | 164 | enum |
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 */ | ||
220 | enum | ||
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 | ||
259 | struct 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 | ||
105 | struct 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 |
111 | struct linux_mib { | 105 | struct 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 | ||
273 | discard_it: | 276 | discard_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 | */ |
90 | void sctp_inq_push(struct sctp_inq *q, struct sctp_chunk *packet) | 90 | void 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 |