aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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