sctp_timer.c revision 212801
1/*-
2 * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * a) Redistributions of source code must retain the above copyright notice,
8 *   this list of conditions and the following disclaimer.
9 *
10 * b) Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in
12 *   the documentation and/or other materials provided with the distribution.
13 *
14 * c) Neither the name of Cisco Systems, Inc. nor the names of its
15 *    contributors may be used to endorse or promote products derived
16 *    from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28 * THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31/* $KAME: sctp_timer.c,v 1.29 2005/03/06 16:04:18 itojun Exp $	 */
32
33#include <sys/cdefs.h>
34__FBSDID("$FreeBSD: head/sys/netinet/sctp_timer.c 212801 2010-09-17 19:20:39Z tuexen $");
35
36#define _IP_VHL
37#include <netinet/sctp_os.h>
38#include <netinet/sctp_pcb.h>
39#ifdef INET6
40#endif
41#include <netinet/sctp_var.h>
42#include <netinet/sctp_sysctl.h>
43#include <netinet/sctp_timer.h>
44#include <netinet/sctputil.h>
45#include <netinet/sctp_output.h>
46#include <netinet/sctp_header.h>
47#include <netinet/sctp_indata.h>
48#include <netinet/sctp_asconf.h>
49#include <netinet/sctp_input.h>
50#include <netinet/sctp.h>
51#include <netinet/sctp_uio.h>
52#include <netinet/udp.h>
53
54
55void
56sctp_early_fr_timer(struct sctp_inpcb *inp,
57    struct sctp_tcb *stcb,
58    struct sctp_nets *net)
59{
60	struct sctp_tmit_chunk *chk, *tp2;
61	struct timeval now, min_wait, tv;
62	unsigned int cur_rtt, cnt = 0, cnt_resend = 0;
63
64	/* an early FR is occuring. */
65	(void)SCTP_GETTIME_TIMEVAL(&now);
66	/* get cur rto in micro-seconds */
67	if (net->lastsa == 0) {
68		/* Hmm no rtt estimate yet? */
69		cur_rtt = stcb->asoc.initial_rto >> 2;
70	} else {
71
72		cur_rtt = ((net->lastsa >> 2) + net->lastsv) >> 1;
73	}
74	if (cur_rtt < SCTP_BASE_SYSCTL(sctp_early_fr_msec)) {
75		cur_rtt = SCTP_BASE_SYSCTL(sctp_early_fr_msec);
76	}
77	cur_rtt *= 1000;
78	tv.tv_sec = cur_rtt / 1000000;
79	tv.tv_usec = cur_rtt % 1000000;
80	min_wait = now;
81	timevalsub(&min_wait, &tv);
82	if (min_wait.tv_sec < 0 || min_wait.tv_usec < 0) {
83		/*
84		 * if we hit here, we don't have enough seconds on the clock
85		 * to account for the RTO. We just let the lower seconds be
86		 * the bounds and don't worry about it. This may mean we
87		 * will mark a lot more than we should.
88		 */
89		min_wait.tv_sec = min_wait.tv_usec = 0;
90	}
91	chk = TAILQ_LAST(&stcb->asoc.sent_queue, sctpchunk_listhead);
92	for (; chk != NULL; chk = tp2) {
93		tp2 = TAILQ_PREV(chk, sctpchunk_listhead, sctp_next);
94		if (chk->whoTo != net) {
95			continue;
96		}
97		if (chk->sent == SCTP_DATAGRAM_RESEND)
98			cnt_resend++;
99		else if ((chk->sent > SCTP_DATAGRAM_UNSENT) &&
100		    (chk->sent < SCTP_DATAGRAM_RESEND)) {
101			/* pending, may need retran */
102			if (chk->sent_rcv_time.tv_sec > min_wait.tv_sec) {
103				/*
104				 * we have reached a chunk that was sent
105				 * some seconds past our min.. forget it we
106				 * will find no more to send.
107				 */
108				continue;
109			} else if (chk->sent_rcv_time.tv_sec == min_wait.tv_sec) {
110				/*
111				 * we must look at the micro seconds to
112				 * know.
113				 */
114				if (chk->sent_rcv_time.tv_usec >= min_wait.tv_usec) {
115					/*
116					 * ok it was sent after our boundary
117					 * time.
118					 */
119					continue;
120				}
121			}
122			if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_EARLYFR_LOGGING_ENABLE) {
123				sctp_log_fr(chk->rec.data.TSN_seq, chk->snd_count,
124				    4, SCTP_FR_MARKED_EARLY);
125			}
126			SCTP_STAT_INCR(sctps_earlyfrmrkretrans);
127			chk->sent = SCTP_DATAGRAM_RESEND;
128			sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
129			/* double book size since we are doing an early FR */
130			chk->book_size_scale++;
131			cnt += chk->send_size;
132			if ((cnt + net->flight_size) > net->cwnd) {
133				/* Mark all we could possibly resend */
134				break;
135			}
136		}
137	}
138	if (cnt) {
139		/*
140		 * JRS - Use the congestion control given in the congestion
141		 * control module
142		 */
143		stcb->asoc.cc_functions.sctp_cwnd_update_after_fr_timer(inp, stcb, net);
144	} else if (cnt_resend) {
145		sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_EARLY_FR_TMR, SCTP_SO_NOT_LOCKED);
146	}
147	/* Restart it? */
148	if (net->flight_size < net->cwnd) {
149		SCTP_STAT_INCR(sctps_earlyfrstrtmr);
150		sctp_timer_start(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net);
151	}
152}
153
154void
155sctp_audit_retranmission_queue(struct sctp_association *asoc)
156{
157	struct sctp_tmit_chunk *chk;
158
159	SCTPDBG(SCTP_DEBUG_TIMER4, "Audit invoked on send queue cnt:%d onqueue:%d\n",
160	    asoc->sent_queue_retran_cnt,
161	    asoc->sent_queue_cnt);
162	asoc->sent_queue_retran_cnt = 0;
163	asoc->sent_queue_cnt = 0;
164	TAILQ_FOREACH(chk, &asoc->sent_queue, sctp_next) {
165		if (chk->sent == SCTP_DATAGRAM_RESEND) {
166			sctp_ucount_incr(asoc->sent_queue_retran_cnt);
167		}
168		asoc->sent_queue_cnt++;
169	}
170	TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) {
171		if (chk->sent == SCTP_DATAGRAM_RESEND) {
172			sctp_ucount_incr(asoc->sent_queue_retran_cnt);
173		}
174	}
175	TAILQ_FOREACH(chk, &asoc->asconf_send_queue, sctp_next) {
176		if (chk->sent == SCTP_DATAGRAM_RESEND) {
177			sctp_ucount_incr(asoc->sent_queue_retran_cnt);
178		}
179	}
180	SCTPDBG(SCTP_DEBUG_TIMER4, "Audit completes retran:%d onqueue:%d\n",
181	    asoc->sent_queue_retran_cnt,
182	    asoc->sent_queue_cnt);
183}
184
185int
186sctp_threshold_management(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
187    struct sctp_nets *net, uint16_t threshold)
188{
189	if (net) {
190		net->error_count++;
191		SCTPDBG(SCTP_DEBUG_TIMER4, "Error count for %p now %d thresh:%d\n",
192		    net, net->error_count,
193		    net->failure_threshold);
194		if (net->error_count > net->failure_threshold) {
195			/* We had a threshold failure */
196			if (net->dest_state & SCTP_ADDR_REACHABLE) {
197				net->dest_state &= ~SCTP_ADDR_REACHABLE;
198				net->dest_state |= SCTP_ADDR_NOT_REACHABLE;
199				net->dest_state &= ~SCTP_ADDR_REQ_PRIMARY;
200				if (net == stcb->asoc.primary_destination) {
201					net->dest_state |= SCTP_ADDR_WAS_PRIMARY;
202				}
203				/*
204				 * JRS 5/14/07 - If a destination is
205				 * unreachable, the PF bit is turned off.
206				 * This allows an unambiguous use of the PF
207				 * bit for destinations that are reachable
208				 * but potentially failed. If the
209				 * destination is set to the unreachable
210				 * state, also set the destination to the PF
211				 * state.
212				 */
213				/*
214				 * Add debug message here if destination is
215				 * not in PF state.
216				 */
217				/* Stop any running T3 timers here? */
218				if ((stcb->asoc.sctp_cmt_on_off == 1) &&
219				    (stcb->asoc.sctp_cmt_pf > 0)) {
220					net->dest_state &= ~SCTP_ADDR_PF;
221					SCTPDBG(SCTP_DEBUG_TIMER4, "Destination %p moved from PF to unreachable.\n",
222					    net);
223				}
224				sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN,
225				    stcb,
226				    SCTP_FAILED_THRESHOLD,
227				    (void *)net, SCTP_SO_NOT_LOCKED);
228			}
229		}
230		/*********HOLD THIS COMMENT FOR PATCH OF ALTERNATE
231		 *********ROUTING CODE
232		 */
233		/*********HOLD THIS COMMENT FOR END OF PATCH OF ALTERNATE
234		 *********ROUTING CODE
235		 */
236	}
237	if (stcb == NULL)
238		return (0);
239
240	if (net) {
241		if ((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0) {
242			if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) {
243				sctp_misc_ints(SCTP_THRESHOLD_INCR,
244				    stcb->asoc.overall_error_count,
245				    (stcb->asoc.overall_error_count + 1),
246				    SCTP_FROM_SCTP_TIMER,
247				    __LINE__);
248			}
249			stcb->asoc.overall_error_count++;
250		}
251	} else {
252		if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) {
253			sctp_misc_ints(SCTP_THRESHOLD_INCR,
254			    stcb->asoc.overall_error_count,
255			    (stcb->asoc.overall_error_count + 1),
256			    SCTP_FROM_SCTP_TIMER,
257			    __LINE__);
258		}
259		stcb->asoc.overall_error_count++;
260	}
261	SCTPDBG(SCTP_DEBUG_TIMER4, "Overall error count for %p now %d thresh:%u state:%x\n",
262	    &stcb->asoc, stcb->asoc.overall_error_count,
263	    (uint32_t) threshold,
264	    ((net == NULL) ? (uint32_t) 0 : (uint32_t) net->dest_state));
265	/*
266	 * We specifically do not do >= to give the assoc one more change
267	 * before we fail it.
268	 */
269	if (stcb->asoc.overall_error_count > threshold) {
270		/* Abort notification sends a ULP notify */
271		struct mbuf *oper;
272
273		oper = sctp_get_mbuf_for_msg((sizeof(struct sctp_paramhdr) + sizeof(uint32_t)),
274		    0, M_DONTWAIT, 1, MT_DATA);
275		if (oper) {
276			struct sctp_paramhdr *ph;
277			uint32_t *ippp;
278
279			SCTP_BUF_LEN(oper) = sizeof(struct sctp_paramhdr) +
280			    sizeof(uint32_t);
281			ph = mtod(oper, struct sctp_paramhdr *);
282			ph->param_type = htons(SCTP_CAUSE_PROTOCOL_VIOLATION);
283			ph->param_length = htons(SCTP_BUF_LEN(oper));
284			ippp = (uint32_t *) (ph + 1);
285			*ippp = htonl(SCTP_FROM_SCTP_TIMER + SCTP_LOC_1);
286		}
287		inp->last_abort_code = SCTP_FROM_SCTP_TIMER + SCTP_LOC_1;
288		sctp_abort_an_association(inp, stcb, SCTP_FAILED_THRESHOLD, oper, SCTP_SO_NOT_LOCKED);
289		return (1);
290	}
291	return (0);
292}
293
294struct sctp_nets *
295sctp_find_alternate_net(struct sctp_tcb *stcb,
296    struct sctp_nets *net,
297    int mode)
298{
299	/* Find and return an alternate network if possible */
300	struct sctp_nets *alt, *mnet, *min_errors_net = NULL, *max_cwnd_net = NULL;
301	int once;
302
303	/* JRS 5/14/07 - Initialize min_errors to an impossible value. */
304	int min_errors = -1;
305	uint32_t max_cwnd = 0;
306
307	if (stcb->asoc.numnets == 1) {
308		/* No others but net */
309		return (TAILQ_FIRST(&stcb->asoc.nets));
310	}
311	/*
312	 * JRS 5/14/07 - If mode is set to 2, use the CMT PF find alternate
313	 * net algorithm. This algorithm chooses the active destination (not
314	 * in PF state) with the largest cwnd value. If all destinations are
315	 * in PF state, unreachable, or unconfirmed, choose the desination
316	 * that is in PF state with the lowest error count. In case of a
317	 * tie, choose the destination that was most recently active.
318	 */
319	if (mode == 2) {
320		TAILQ_FOREACH(mnet, &stcb->asoc.nets, sctp_next) {
321			/*
322			 * JRS 5/14/07 - If the destination is unreachable
323			 * or unconfirmed, skip it.
324			 */
325			if (((mnet->dest_state & SCTP_ADDR_REACHABLE) != SCTP_ADDR_REACHABLE) ||
326			    (mnet->dest_state & SCTP_ADDR_UNCONFIRMED)) {
327				continue;
328			}
329			/*
330			 * JRS 5/14/07 -  If the destination is reachable
331			 * but in PF state, compare the error count of the
332			 * destination to the minimum error count seen thus
333			 * far. Store the destination with the lower error
334			 * count.  If the error counts are equal, store the
335			 * destination that was most recently active.
336			 */
337			if (mnet->dest_state & SCTP_ADDR_PF) {
338				/*
339				 * JRS 5/14/07 - If the destination under
340				 * consideration is the current destination,
341				 * work as if the error count is one higher.
342				 * The actual error count will not be
343				 * incremented until later in the t3
344				 * handler.
345				 */
346				if (mnet == net) {
347					if (min_errors == -1) {
348						min_errors = mnet->error_count + 1;
349						min_errors_net = mnet;
350					} else if (mnet->error_count + 1 < min_errors) {
351						min_errors = mnet->error_count + 1;
352						min_errors_net = mnet;
353					} else if (mnet->error_count + 1 == min_errors
354					    && mnet->last_active > min_errors_net->last_active) {
355						min_errors_net = mnet;
356						min_errors = mnet->error_count + 1;
357					}
358					continue;
359				} else {
360					if (min_errors == -1) {
361						min_errors = mnet->error_count;
362						min_errors_net = mnet;
363					} else if (mnet->error_count < min_errors) {
364						min_errors = mnet->error_count;
365						min_errors_net = mnet;
366					} else if (mnet->error_count == min_errors
367					    && mnet->last_active > min_errors_net->last_active) {
368						min_errors_net = mnet;
369						min_errors = mnet->error_count;
370					}
371					continue;
372				}
373			}
374			/*
375			 * JRS 5/14/07 - If the destination is reachable and
376			 * not in PF state, compare the cwnd of the
377			 * destination to the highest cwnd seen thus far.
378			 * Store the destination with the higher cwnd value.
379			 * If the cwnd values are equal, randomly choose one
380			 * of the two destinations.
381			 */
382			if (max_cwnd < mnet->cwnd) {
383				max_cwnd_net = mnet;
384				max_cwnd = mnet->cwnd;
385			} else if (max_cwnd == mnet->cwnd) {
386				uint32_t rndval;
387				uint8_t this_random;
388
389				if (stcb->asoc.hb_random_idx > 3) {
390					rndval = sctp_select_initial_TSN(&stcb->sctp_ep->sctp_ep);
391					memcpy(stcb->asoc.hb_random_values, &rndval, sizeof(stcb->asoc.hb_random_values));
392					this_random = stcb->asoc.hb_random_values[0];
393					stcb->asoc.hb_random_idx++;
394					stcb->asoc.hb_ect_randombit = 0;
395				} else {
396					this_random = stcb->asoc.hb_random_values[stcb->asoc.hb_random_idx];
397					stcb->asoc.hb_random_idx++;
398					stcb->asoc.hb_ect_randombit = 0;
399				}
400				if (this_random % 2 == 1) {
401					max_cwnd_net = mnet;
402					max_cwnd = mnet->cwnd;	/* Useless? */
403				}
404			}
405		}
406		/*
407		 * JRS 5/14/07 - After all destination have been considered
408		 * as alternates, check to see if there was some active
409		 * destination (not in PF state).  If not, check to see if
410		 * there was some PF destination with the minimum number of
411		 * errors.  If not, return the original destination.  If
412		 * there is a min_errors_net, remove the PF flag from that
413		 * destination, set the cwnd to one or two MTUs, and return
414		 * the destination as an alt. If there was some active
415		 * destination with a highest cwnd, return the destination
416		 * as an alt.
417		 */
418		if (max_cwnd_net == NULL) {
419			if (min_errors_net == NULL) {
420				return (net);
421			}
422			min_errors_net->dest_state &= ~SCTP_ADDR_PF;
423			min_errors_net->cwnd = min_errors_net->mtu * stcb->asoc.sctp_cmt_pf;
424			if (SCTP_OS_TIMER_PENDING(&min_errors_net->rxt_timer.timer)) {
425				sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep,
426				    stcb, min_errors_net,
427				    SCTP_FROM_SCTP_TIMER + SCTP_LOC_2);
428			}
429			SCTPDBG(SCTP_DEBUG_TIMER4, "Destination %p moved from PF to active with %d errors.\n",
430			    min_errors_net, min_errors_net->error_count);
431			return (min_errors_net);
432		} else {
433			return (max_cwnd_net);
434		}
435	}
436	/*
437	 * JRS 5/14/07 - If mode is set to 1, use the CMT policy for
438	 * choosing an alternate net.
439	 */
440	else if (mode == 1) {
441		TAILQ_FOREACH(mnet, &stcb->asoc.nets, sctp_next) {
442			if (((mnet->dest_state & SCTP_ADDR_REACHABLE) != SCTP_ADDR_REACHABLE) ||
443			    (mnet->dest_state & SCTP_ADDR_UNCONFIRMED)
444			    ) {
445				/*
446				 * will skip ones that are not-reachable or
447				 * unconfirmed
448				 */
449				continue;
450			}
451			if (max_cwnd < mnet->cwnd) {
452				max_cwnd_net = mnet;
453				max_cwnd = mnet->cwnd;
454			} else if (max_cwnd == mnet->cwnd) {
455				uint32_t rndval;
456				uint8_t this_random;
457
458				if (stcb->asoc.hb_random_idx > 3) {
459					rndval = sctp_select_initial_TSN(&stcb->sctp_ep->sctp_ep);
460					memcpy(stcb->asoc.hb_random_values, &rndval,
461					    sizeof(stcb->asoc.hb_random_values));
462					this_random = stcb->asoc.hb_random_values[0];
463					stcb->asoc.hb_random_idx = 0;
464					stcb->asoc.hb_ect_randombit = 0;
465				} else {
466					this_random = stcb->asoc.hb_random_values[stcb->asoc.hb_random_idx];
467					stcb->asoc.hb_random_idx++;
468					stcb->asoc.hb_ect_randombit = 0;
469				}
470				if (this_random % 2) {
471					max_cwnd_net = mnet;
472					max_cwnd = mnet->cwnd;
473				}
474			}
475		}
476		if (max_cwnd_net) {
477			return (max_cwnd_net);
478		}
479	}
480	mnet = net;
481	once = 0;
482
483	if (mnet == NULL) {
484		mnet = TAILQ_FIRST(&stcb->asoc.nets);
485		if (mnet == NULL) {
486			return (NULL);
487		}
488	}
489	do {
490		alt = TAILQ_NEXT(mnet, sctp_next);
491		if (alt == NULL) {
492			once++;
493			if (once > 1) {
494				break;
495			}
496			alt = TAILQ_FIRST(&stcb->asoc.nets);
497			if (alt == NULL) {
498				return (NULL);
499			}
500		}
501		if (alt->ro.ro_rt == NULL) {
502			if (alt->ro._s_addr) {
503				sctp_free_ifa(alt->ro._s_addr);
504				alt->ro._s_addr = NULL;
505			}
506			alt->src_addr_selected = 0;
507		}
508		if (
509		    ((alt->dest_state & SCTP_ADDR_REACHABLE) == SCTP_ADDR_REACHABLE) &&
510		    (alt->ro.ro_rt != NULL) &&
511		/* sa_ignore NO_NULL_CHK */
512		    (!(alt->dest_state & SCTP_ADDR_UNCONFIRMED))
513		    ) {
514			/* Found a reachable address */
515			break;
516		}
517		mnet = alt;
518	} while (alt != NULL);
519
520	if (alt == NULL) {
521		/* Case where NO insv network exists (dormant state) */
522		/* we rotate destinations */
523		once = 0;
524		mnet = net;
525		do {
526			if (mnet == NULL) {
527				return (TAILQ_FIRST(&stcb->asoc.nets));
528			}
529			alt = TAILQ_NEXT(mnet, sctp_next);
530			if (alt == NULL) {
531				once++;
532				if (once > 1) {
533					break;
534				}
535				alt = TAILQ_FIRST(&stcb->asoc.nets);
536			}
537			/* sa_ignore NO_NULL_CHK */
538			if ((!(alt->dest_state & SCTP_ADDR_UNCONFIRMED)) &&
539			    (alt != net)) {
540				/* Found an alternate address */
541				break;
542			}
543			mnet = alt;
544		} while (alt != NULL);
545	}
546	if (alt == NULL) {
547		return (net);
548	}
549	return (alt);
550}
551
552
553
554static void
555sctp_backoff_on_timeout(struct sctp_tcb *stcb,
556    struct sctp_nets *net,
557    int win_probe,
558    int num_marked, int num_abandoned)
559{
560	if (net->RTO == 0) {
561		net->RTO = stcb->asoc.minrto;
562	}
563	net->RTO <<= 1;
564	if (net->RTO > stcb->asoc.maxrto) {
565		net->RTO = stcb->asoc.maxrto;
566	}
567	if ((win_probe == 0) && (num_marked || num_abandoned)) {
568		/* We don't apply penalty to window probe scenarios */
569		/* JRS - Use the congestion control given in the CC module */
570		stcb->asoc.cc_functions.sctp_cwnd_update_after_timeout(stcb, net);
571	}
572}
573
574#ifndef INVARIANTS
575static void
576sctp_recover_sent_list(struct sctp_tcb *stcb)
577{
578	struct sctp_tmit_chunk *chk, *tp2;
579	struct sctp_association *asoc;
580
581	asoc = &stcb->asoc;
582	chk = TAILQ_FIRST(&stcb->asoc.sent_queue);
583	for (; chk != NULL; chk = tp2) {
584		tp2 = TAILQ_NEXT(chk, sctp_next);
585		if ((compare_with_wrap(stcb->asoc.last_acked_seq,
586		    chk->rec.data.TSN_seq,
587		    MAX_TSN)) ||
588		    (stcb->asoc.last_acked_seq == chk->rec.data.TSN_seq)) {
589
590			SCTP_PRINTF("Found chk:%p tsn:%x <= last_acked_seq:%x\n",
591			    chk, chk->rec.data.TSN_seq, stcb->asoc.last_acked_seq);
592			TAILQ_REMOVE(&asoc->sent_queue, chk, sctp_next);
593			if (chk->pr_sctp_on) {
594				if (asoc->pr_sctp_cnt != 0)
595					asoc->pr_sctp_cnt--;
596			}
597			if (chk->data) {
598				/* sa_ignore NO_NULL_CHK */
599				sctp_free_bufspace(stcb, asoc, chk, 1);
600				sctp_m_freem(chk->data);
601				if (asoc->peer_supports_prsctp && PR_SCTP_BUF_ENABLED(chk->flags)) {
602					asoc->sent_queue_cnt_removeable--;
603				}
604			}
605			chk->data = NULL;
606			asoc->sent_queue_cnt--;
607			sctp_free_a_chunk(stcb, chk);
608		}
609	}
610	SCTP_PRINTF("after recover order is as follows\n");
611	chk = TAILQ_FIRST(&stcb->asoc.sent_queue);
612	for (; chk != NULL; chk = tp2) {
613		tp2 = TAILQ_NEXT(chk, sctp_next);
614		SCTP_PRINTF("chk:%p TSN:%x\n", chk, chk->rec.data.TSN_seq);
615	}
616}
617
618#endif
619
620static int
621sctp_mark_all_for_resend(struct sctp_tcb *stcb,
622    struct sctp_nets *net,
623    struct sctp_nets *alt,
624    int window_probe,
625    int *num_marked,
626    int *num_abandoned)
627{
628
629	/*
630	 * Mark all chunks (well not all) that were sent to *net for
631	 * retransmission. Move them to alt for there destination as well...
632	 * We only mark chunks that have been outstanding long enough to
633	 * have received feed-back.
634	 */
635	struct sctp_tmit_chunk *chk, *tp2;
636	struct sctp_nets *lnets;
637	struct timeval now, min_wait, tv;
638	int cur_rtt;
639	int cnt_abandoned;
640	int audit_tf, num_mk, fir;
641	unsigned int cnt_mk;
642	uint32_t orig_flight, orig_tf;
643	uint32_t tsnlast, tsnfirst;
644	int recovery_cnt = 0;
645
646
647	/* none in flight now */
648	audit_tf = 0;
649	fir = 0;
650	/*
651	 * figure out how long a data chunk must be pending before we can
652	 * mark it ..
653	 */
654	(void)SCTP_GETTIME_TIMEVAL(&now);
655	/* get cur rto in micro-seconds */
656	cur_rtt = (((net->lastsa >> 2) + net->lastsv) >> 1);
657	cur_rtt *= 1000;
658	if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) {
659		sctp_log_fr(cur_rtt,
660		    stcb->asoc.peers_rwnd,
661		    window_probe,
662		    SCTP_FR_T3_MARK_TIME);
663		sctp_log_fr(net->flight_size,
664		    SCTP_OS_TIMER_PENDING(&net->fr_timer.timer),
665		    SCTP_OS_TIMER_ACTIVE(&net->fr_timer.timer),
666		    SCTP_FR_CWND_REPORT);
667		sctp_log_fr(net->flight_size, net->cwnd, stcb->asoc.total_flight, SCTP_FR_CWND_REPORT);
668	}
669	tv.tv_sec = cur_rtt / 1000000;
670	tv.tv_usec = cur_rtt % 1000000;
671	min_wait = now;
672	timevalsub(&min_wait, &tv);
673	if (min_wait.tv_sec < 0 || min_wait.tv_usec < 0) {
674		/*
675		 * if we hit here, we don't have enough seconds on the clock
676		 * to account for the RTO. We just let the lower seconds be
677		 * the bounds and don't worry about it. This may mean we
678		 * will mark a lot more than we should.
679		 */
680		min_wait.tv_sec = min_wait.tv_usec = 0;
681	}
682	if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) {
683		sctp_log_fr(cur_rtt, now.tv_sec, now.tv_usec, SCTP_FR_T3_MARK_TIME);
684		sctp_log_fr(0, min_wait.tv_sec, min_wait.tv_usec, SCTP_FR_T3_MARK_TIME);
685	}
686	/*
687	 * Our rwnd will be incorrect here since we are not adding back the
688	 * cnt * mbuf but we will fix that down below.
689	 */
690	orig_flight = net->flight_size;
691	orig_tf = stcb->asoc.total_flight;
692
693	net->fast_retran_ip = 0;
694	/* Now on to each chunk */
695	cnt_abandoned = 0;
696	num_mk = cnt_mk = 0;
697	tsnfirst = tsnlast = 0;
698#ifndef INVARIANTS
699start_again:
700#endif
701	chk = TAILQ_FIRST(&stcb->asoc.sent_queue);
702	for (; chk != NULL; chk = tp2) {
703		tp2 = TAILQ_NEXT(chk, sctp_next);
704		if ((compare_with_wrap(stcb->asoc.last_acked_seq,
705		    chk->rec.data.TSN_seq,
706		    MAX_TSN)) ||
707		    (stcb->asoc.last_acked_seq == chk->rec.data.TSN_seq)) {
708			/* Strange case our list got out of order? */
709			SCTP_PRINTF("Our list is out of order? last_acked:%x chk:%x",
710			    (unsigned int)stcb->asoc.last_acked_seq, (unsigned int)chk->rec.data.TSN_seq);
711			recovery_cnt++;
712#ifdef INVARIANTS
713			panic("last acked >= chk on sent-Q");
714#else
715			SCTP_PRINTF("Recover attempts a restart cnt:%d\n", recovery_cnt);
716			sctp_recover_sent_list(stcb);
717			if (recovery_cnt < 10) {
718				goto start_again;
719			} else {
720				SCTP_PRINTF("Recovery fails %d times??\n", recovery_cnt);
721			}
722#endif
723		}
724		if ((chk->whoTo == net) && (chk->sent < SCTP_DATAGRAM_ACKED)) {
725			/*
726			 * found one to mark: If it is less than
727			 * DATAGRAM_ACKED it MUST not be a skipped or marked
728			 * TSN but instead one that is either already set
729			 * for retransmission OR one that needs
730			 * retransmission.
731			 */
732
733			/* validate its been outstanding long enough */
734			if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) {
735				sctp_log_fr(chk->rec.data.TSN_seq,
736				    chk->sent_rcv_time.tv_sec,
737				    chk->sent_rcv_time.tv_usec,
738				    SCTP_FR_T3_MARK_TIME);
739			}
740			if ((chk->sent_rcv_time.tv_sec > min_wait.tv_sec) && (window_probe == 0)) {
741				/*
742				 * we have reached a chunk that was sent
743				 * some seconds past our min.. forget it we
744				 * will find no more to send.
745				 */
746				if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) {
747					sctp_log_fr(0,
748					    chk->sent_rcv_time.tv_sec,
749					    chk->sent_rcv_time.tv_usec,
750					    SCTP_FR_T3_STOPPED);
751				}
752				continue;
753			} else if ((chk->sent_rcv_time.tv_sec == min_wait.tv_sec) &&
754			    (window_probe == 0)) {
755				/*
756				 * we must look at the micro seconds to
757				 * know.
758				 */
759				if (chk->sent_rcv_time.tv_usec >= min_wait.tv_usec) {
760					/*
761					 * ok it was sent after our boundary
762					 * time.
763					 */
764					if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) {
765						sctp_log_fr(0,
766						    chk->sent_rcv_time.tv_sec,
767						    chk->sent_rcv_time.tv_usec,
768						    SCTP_FR_T3_STOPPED);
769					}
770					continue;
771				}
772			}
773			if (stcb->asoc.peer_supports_prsctp && PR_SCTP_TTL_ENABLED(chk->flags)) {
774				/* Is it expired? */
775				if (timevalcmp(&now, &chk->rec.data.timetodrop, >)) {
776					/* Yes so drop it */
777					if (chk->data) {
778						(void)sctp_release_pr_sctp_chunk(stcb,
779						    chk,
780						    (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT),
781						    SCTP_SO_NOT_LOCKED);
782						cnt_abandoned++;
783					}
784					continue;
785				}
786			}
787			if (stcb->asoc.peer_supports_prsctp && PR_SCTP_RTX_ENABLED(chk->flags)) {
788				/* Has it been retransmitted tv_sec times? */
789				if (chk->snd_count > chk->rec.data.timetodrop.tv_sec) {
790					if (chk->data) {
791						(void)sctp_release_pr_sctp_chunk(stcb,
792						    chk,
793						    (SCTP_RESPONSE_TO_USER_REQ | SCTP_NOTIFY_DATAGRAM_SENT),
794						    SCTP_SO_NOT_LOCKED);
795						cnt_abandoned++;
796					}
797					continue;
798				}
799			}
800			if (chk->sent < SCTP_DATAGRAM_RESEND) {
801				sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
802				num_mk++;
803				if (fir == 0) {
804					fir = 1;
805					tsnfirst = chk->rec.data.TSN_seq;
806				}
807				tsnlast = chk->rec.data.TSN_seq;
808				if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) {
809					sctp_log_fr(chk->rec.data.TSN_seq, chk->snd_count,
810					    0, SCTP_FR_T3_MARKED);
811				}
812				if (chk->rec.data.chunk_was_revoked) {
813					/* deflate the cwnd */
814					chk->whoTo->cwnd -= chk->book_size;
815					chk->rec.data.chunk_was_revoked = 0;
816				}
817				net->marked_retrans++;
818				stcb->asoc.marked_retrans++;
819				if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) {
820					sctp_misc_ints(SCTP_FLIGHT_LOG_DOWN_RSND_TO,
821					    chk->whoTo->flight_size,
822					    chk->book_size,
823					    (uintptr_t) chk->whoTo,
824					    chk->rec.data.TSN_seq);
825				}
826				sctp_flight_size_decrease(chk);
827				sctp_total_flight_decrease(stcb, chk);
828				stcb->asoc.peers_rwnd += chk->send_size;
829				stcb->asoc.peers_rwnd += SCTP_BASE_SYSCTL(sctp_peer_chunk_oh);
830			}
831			chk->sent = SCTP_DATAGRAM_RESEND;
832			SCTP_STAT_INCR(sctps_markedretrans);
833
834			/* reset the TSN for striking and other FR stuff */
835			chk->rec.data.doing_fast_retransmit = 0;
836			/* Clear any time so NO RTT is being done */
837			chk->do_rtt = 0;
838			if (alt != net) {
839				sctp_free_remote_addr(chk->whoTo);
840				chk->no_fr_allowed = 1;
841				chk->whoTo = alt;
842				atomic_add_int(&alt->ref_count, 1);
843			} else {
844				chk->no_fr_allowed = 0;
845				if (TAILQ_EMPTY(&stcb->asoc.send_queue)) {
846					chk->rec.data.fast_retran_tsn = stcb->asoc.sending_seq;
847				} else {
848					chk->rec.data.fast_retran_tsn = (TAILQ_FIRST(&stcb->asoc.send_queue))->rec.data.TSN_seq;
849				}
850			}
851			/*
852			 * CMT: Do not allow FRs on retransmitted TSNs.
853			 */
854			if (stcb->asoc.sctp_cmt_on_off == 1) {
855				chk->no_fr_allowed = 1;
856			}
857#ifdef THIS_SHOULD_NOT_BE_DONE
858		} else if (chk->sent == SCTP_DATAGRAM_ACKED) {
859			/* remember highest acked one */
860			could_be_sent = chk;
861#endif
862		}
863		if (chk->sent == SCTP_DATAGRAM_RESEND) {
864			cnt_mk++;
865		}
866	}
867	if ((orig_flight - net->flight_size) != (orig_tf - stcb->asoc.total_flight)) {
868		/* we did not subtract the same things? */
869		audit_tf = 1;
870	}
871	if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) {
872		sctp_log_fr(tsnfirst, tsnlast, num_mk, SCTP_FR_T3_TIMEOUT);
873	}
874#ifdef SCTP_DEBUG
875	if (num_mk) {
876		SCTPDBG(SCTP_DEBUG_TIMER1, "LAST TSN marked was %x\n",
877		    tsnlast);
878		SCTPDBG(SCTP_DEBUG_TIMER1, "Num marked for retransmission was %d peer-rwd:%ld\n",
879		    num_mk, (u_long)stcb->asoc.peers_rwnd);
880		SCTPDBG(SCTP_DEBUG_TIMER1, "LAST TSN marked was %x\n",
881		    tsnlast);
882		SCTPDBG(SCTP_DEBUG_TIMER1, "Num marked for retransmission was %d peer-rwd:%d\n",
883		    num_mk,
884		    (int)stcb->asoc.peers_rwnd);
885	}
886#endif
887	*num_marked = num_mk;
888	*num_abandoned = cnt_abandoned;
889	/*
890	 * Now check for a ECN Echo that may be stranded And include the
891	 * cnt_mk'd to have all resends in the control queue.
892	 */
893	TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {
894		if (chk->sent == SCTP_DATAGRAM_RESEND) {
895			cnt_mk++;
896		}
897		if ((chk->whoTo == net) &&
898		    (chk->rec.chunk_id.id == SCTP_ECN_ECHO)) {
899			sctp_free_remote_addr(chk->whoTo);
900			chk->whoTo = alt;
901			if (chk->sent != SCTP_DATAGRAM_RESEND) {
902				chk->sent = SCTP_DATAGRAM_RESEND;
903				sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
904				cnt_mk++;
905			}
906			atomic_add_int(&alt->ref_count, 1);
907		}
908	}
909#ifdef THIS_SHOULD_NOT_BE_DONE
910	if ((stcb->asoc.sent_queue_retran_cnt == 0) && (could_be_sent)) {
911		/* fix it so we retransmit the highest acked anyway */
912		sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
913		cnt_mk++;
914		could_be_sent->sent = SCTP_DATAGRAM_RESEND;
915	}
916#endif
917	if (stcb->asoc.sent_queue_retran_cnt != cnt_mk) {
918#ifdef INVARIANTS
919		SCTP_PRINTF("Local Audit says there are %d for retran asoc cnt:%d we marked:%d this time\n",
920		    cnt_mk, stcb->asoc.sent_queue_retran_cnt, num_mk);
921#endif
922#ifndef SCTP_AUDITING_ENABLED
923		stcb->asoc.sent_queue_retran_cnt = cnt_mk;
924#endif
925	}
926	if (audit_tf) {
927		SCTPDBG(SCTP_DEBUG_TIMER4,
928		    "Audit total flight due to negative value net:%p\n",
929		    net);
930		stcb->asoc.total_flight = 0;
931		stcb->asoc.total_flight_count = 0;
932		/* Clear all networks flight size */
933		TAILQ_FOREACH(lnets, &stcb->asoc.nets, sctp_next) {
934			lnets->flight_size = 0;
935			SCTPDBG(SCTP_DEBUG_TIMER4,
936			    "Net:%p c-f cwnd:%d ssthresh:%d\n",
937			    lnets, lnets->cwnd, lnets->ssthresh);
938		}
939		TAILQ_FOREACH(chk, &stcb->asoc.sent_queue, sctp_next) {
940			if (chk->sent < SCTP_DATAGRAM_RESEND) {
941				if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) {
942					sctp_misc_ints(SCTP_FLIGHT_LOG_UP,
943					    chk->whoTo->flight_size,
944					    chk->book_size,
945					    (uintptr_t) chk->whoTo,
946					    chk->rec.data.TSN_seq);
947				}
948				sctp_flight_size_increase(chk);
949				sctp_total_flight_increase(stcb, chk);
950			}
951		}
952	}
953	/*
954	 * Setup the ecn nonce re-sync point. We do this since
955	 * retranmissions are NOT setup for ECN. This means that do to
956	 * Karn's rule, we don't know the total of the peers ecn bits.
957	 */
958	chk = TAILQ_FIRST(&stcb->asoc.send_queue);
959	if (chk == NULL) {
960		stcb->asoc.nonce_resync_tsn = stcb->asoc.sending_seq;
961	} else {
962		stcb->asoc.nonce_resync_tsn = chk->rec.data.TSN_seq;
963	}
964	stcb->asoc.nonce_wait_for_ecne = 0;
965	stcb->asoc.nonce_sum_check = 0;
966	/* We return 1 if we only have a window probe outstanding */
967	return (0);
968}
969
970
971int
972sctp_t3rxt_timer(struct sctp_inpcb *inp,
973    struct sctp_tcb *stcb,
974    struct sctp_nets *net)
975{
976	struct sctp_nets *alt;
977	int win_probe, num_mk, num_abandoned;
978
979	if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
980		sctp_log_fr(0, 0, 0, SCTP_FR_T3_TIMEOUT);
981	}
982	if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) {
983		struct sctp_nets *lnet;
984
985		TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) {
986			if (net == lnet) {
987				sctp_log_cwnd(stcb, lnet, 1, SCTP_CWND_LOG_FROM_T3);
988			} else {
989				sctp_log_cwnd(stcb, lnet, 0, SCTP_CWND_LOG_FROM_T3);
990			}
991		}
992	}
993	/* Find an alternate and mark those for retransmission */
994	if ((stcb->asoc.peers_rwnd == 0) &&
995	    (stcb->asoc.total_flight < net->mtu)) {
996		SCTP_STAT_INCR(sctps_timowindowprobe);
997		win_probe = 1;
998	} else {
999		win_probe = 0;
1000	}
1001
1002	/*
1003	 * JRS 5/14/07 - If CMT PF is on and the destination if not already
1004	 * in PF state, set the destination to PF state and store the
1005	 * current time as the time that the destination was last active. In
1006	 * addition, find an alternate destination with PF-based
1007	 * find_alt_net().
1008	 */
1009	if ((stcb->asoc.sctp_cmt_on_off == 1) &&
1010	    (stcb->asoc.sctp_cmt_pf > 0)) {
1011		if ((net->dest_state & SCTP_ADDR_PF) != SCTP_ADDR_PF) {
1012			net->dest_state |= SCTP_ADDR_PF;
1013			net->last_active = sctp_get_tick_count();
1014			SCTPDBG(SCTP_DEBUG_TIMER4, "Destination %p moved from active to PF.\n",
1015			    net);
1016		}
1017		alt = sctp_find_alternate_net(stcb, net, 2);
1018	} else if (stcb->asoc.sctp_cmt_on_off == 1) {
1019		/*
1020		 * CMT: Using RTX_SSTHRESH policy for CMT. If CMT is being
1021		 * used, then pick dest with largest ssthresh for any
1022		 * retransmission.
1023		 */
1024		alt = net;
1025		alt = sctp_find_alternate_net(stcb, alt, 1);
1026		/*
1027		 * CUCv2: If a different dest is picked for the
1028		 * retransmission, then new (rtx-)pseudo_cumack needs to be
1029		 * tracked for orig dest. Let CUCv2 track new (rtx-)
1030		 * pseudo-cumack always.
1031		 */
1032		net->find_pseudo_cumack = 1;
1033		net->find_rtx_pseudo_cumack = 1;
1034	} else {		/* CMT is OFF */
1035		alt = sctp_find_alternate_net(stcb, net, 0);
1036	}
1037	num_mk = 0;
1038	num_abandoned = 0;
1039	(void)sctp_mark_all_for_resend(stcb, net, alt, win_probe,
1040	    &num_mk, &num_abandoned);
1041	/* FR Loss recovery just ended with the T3. */
1042	stcb->asoc.fast_retran_loss_recovery = 0;
1043
1044	/* CMT FR loss recovery ended with the T3 */
1045	net->fast_retran_loss_recovery = 0;
1046
1047	/*
1048	 * setup the sat loss recovery that prevents satellite cwnd advance.
1049	 */
1050	stcb->asoc.sat_t3_loss_recovery = 1;
1051	stcb->asoc.sat_t3_recovery_tsn = stcb->asoc.sending_seq;
1052
1053	/* Backoff the timer and cwnd */
1054	sctp_backoff_on_timeout(stcb, net, win_probe, num_mk, num_abandoned);
1055	if (win_probe == 0) {
1056		/* We don't do normal threshold management on window probes */
1057		if (sctp_threshold_management(inp, stcb, net,
1058		    stcb->asoc.max_send_times)) {
1059			/* Association was destroyed */
1060			return (1);
1061		} else {
1062			if (net != stcb->asoc.primary_destination) {
1063				/* send a immediate HB if our RTO is stale */
1064				struct timeval now;
1065				unsigned int ms_goneby;
1066
1067				(void)SCTP_GETTIME_TIMEVAL(&now);
1068				if (net->last_sent_time.tv_sec) {
1069					ms_goneby = (now.tv_sec - net->last_sent_time.tv_sec) * 1000;
1070				} else {
1071					ms_goneby = 0;
1072				}
1073				if ((ms_goneby > net->RTO) || (net->RTO == 0)) {
1074					/*
1075					 * no recent feed back in an RTO or
1076					 * more, request a RTT update
1077					 */
1078					if (sctp_send_hb(stcb, 1, net) < 0)
1079						/*
1080						 * Less than 0 means we lost
1081						 * the assoc
1082						 */
1083						return (1);
1084				}
1085			}
1086		}
1087	} else {
1088		/*
1089		 * For a window probe we don't penalize the net's but only
1090		 * the association. This may fail it if SACKs are not coming
1091		 * back. If sack's are coming with rwnd locked at 0, we will
1092		 * continue to hold things waiting for rwnd to raise
1093		 */
1094		if (sctp_threshold_management(inp, stcb, NULL,
1095		    stcb->asoc.max_send_times)) {
1096			/* Association was destroyed */
1097			return (1);
1098		}
1099	}
1100	if (net->dest_state & SCTP_ADDR_NOT_REACHABLE) {
1101		/* Move all pending over too */
1102		sctp_move_chunks_from_net(stcb, net);
1103
1104		/*
1105		 * Get the address that failed, to force a new src address
1106		 * selecton and a route allocation.
1107		 */
1108		if (net->ro._s_addr) {
1109			sctp_free_ifa(net->ro._s_addr);
1110			net->ro._s_addr = NULL;
1111		}
1112		net->src_addr_selected = 0;
1113
1114		/* Force a route allocation too */
1115		if (net->ro.ro_rt) {
1116			RTFREE(net->ro.ro_rt);
1117			net->ro.ro_rt = NULL;
1118		}
1119		/* Was it our primary? */
1120		if ((stcb->asoc.primary_destination == net) && (alt != net)) {
1121			/*
1122			 * Yes, note it as such and find an alternate note:
1123			 * this means HB code must use this to resent the
1124			 * primary if it goes active AND if someone does a
1125			 * change-primary then this flag must be cleared
1126			 * from any net structures.
1127			 */
1128			if (sctp_set_primary_addr(stcb,
1129			    (struct sockaddr *)NULL,
1130			    alt) == 0) {
1131				net->dest_state |= SCTP_ADDR_WAS_PRIMARY;
1132			}
1133		}
1134	} else if ((stcb->asoc.sctp_cmt_on_off == 1) &&
1135		    (stcb->asoc.sctp_cmt_pf > 0) &&
1136	    ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) {
1137		/*
1138		 * JRS 5/14/07 - If the destination hasn't failed completely
1139		 * but is in PF state, a PF-heartbeat needs to be sent
1140		 * manually.
1141		 */
1142		if (sctp_send_hb(stcb, 1, net) < 0)
1143			/* Return less than 0 means we lost the association */
1144			return (1);
1145	}
1146	/*
1147	 * Special case for cookie-echo'ed case, we don't do output but must
1148	 * await the COOKIE-ACK before retransmission
1149	 */
1150	if (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_COOKIE_ECHOED) {
1151		/*
1152		 * Here we just reset the timer and start again since we
1153		 * have not established the asoc
1154		 */
1155		sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net);
1156		return (0);
1157	}
1158	if (stcb->asoc.peer_supports_prsctp) {
1159		struct sctp_tmit_chunk *lchk;
1160
1161		lchk = sctp_try_advance_peer_ack_point(stcb, &stcb->asoc);
1162		/* C3. See if we need to send a Fwd-TSN */
1163		if (compare_with_wrap(stcb->asoc.advanced_peer_ack_point,
1164		    stcb->asoc.last_acked_seq, MAX_TSN)) {
1165			/*
1166			 * ISSUE with ECN, see FWD-TSN processing for notes
1167			 * on issues that will occur when the ECN NONCE
1168			 * stuff is put into SCTP for cross checking.
1169			 */
1170			send_forward_tsn(stcb, &stcb->asoc);
1171			if (lchk) {
1172				/* Assure a timer is up */
1173				sctp_timer_start(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, lchk->whoTo);
1174			}
1175		}
1176	}
1177	if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
1178		sctp_log_cwnd(stcb, net, net->cwnd, SCTP_CWND_LOG_FROM_RTX);
1179	}
1180	return (0);
1181}
1182
1183int
1184sctp_t1init_timer(struct sctp_inpcb *inp,
1185    struct sctp_tcb *stcb,
1186    struct sctp_nets *net)
1187{
1188	/* bump the thresholds */
1189	if (stcb->asoc.delayed_connection) {
1190		/*
1191		 * special hook for delayed connection. The library did NOT
1192		 * complete the rest of its sends.
1193		 */
1194		stcb->asoc.delayed_connection = 0;
1195		sctp_send_initiate(inp, stcb, SCTP_SO_NOT_LOCKED);
1196		return (0);
1197	}
1198	if (SCTP_GET_STATE((&stcb->asoc)) != SCTP_STATE_COOKIE_WAIT) {
1199		return (0);
1200	}
1201	if (sctp_threshold_management(inp, stcb, net,
1202	    stcb->asoc.max_init_times)) {
1203		/* Association was destroyed */
1204		return (1);
1205	}
1206	stcb->asoc.dropped_special_cnt = 0;
1207	sctp_backoff_on_timeout(stcb, stcb->asoc.primary_destination, 1, 0, 0);
1208	if (stcb->asoc.initial_init_rto_max < net->RTO) {
1209		net->RTO = stcb->asoc.initial_init_rto_max;
1210	}
1211	if (stcb->asoc.numnets > 1) {
1212		/* If we have more than one addr use it */
1213		struct sctp_nets *alt;
1214
1215		alt = sctp_find_alternate_net(stcb, stcb->asoc.primary_destination, 0);
1216		if ((alt != NULL) && (alt != stcb->asoc.primary_destination)) {
1217			sctp_move_chunks_from_net(stcb, stcb->asoc.primary_destination);
1218			stcb->asoc.primary_destination = alt;
1219		}
1220	}
1221	/* Send out a new init */
1222	sctp_send_initiate(inp, stcb, SCTP_SO_NOT_LOCKED);
1223	return (0);
1224}
1225
1226/*
1227 * For cookie and asconf we actually need to find and mark for resend, then
1228 * increment the resend counter (after all the threshold management stuff of
1229 * course).
1230 */
1231int
1232sctp_cookie_timer(struct sctp_inpcb *inp,
1233    struct sctp_tcb *stcb,
1234    struct sctp_nets *net)
1235{
1236	struct sctp_nets *alt;
1237	struct sctp_tmit_chunk *cookie;
1238
1239	/* first before all else we must find the cookie */
1240	TAILQ_FOREACH(cookie, &stcb->asoc.control_send_queue, sctp_next) {
1241		if (cookie->rec.chunk_id.id == SCTP_COOKIE_ECHO) {
1242			break;
1243		}
1244	}
1245	if (cookie == NULL) {
1246		if (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_COOKIE_ECHOED) {
1247			/* FOOBAR! */
1248			struct mbuf *oper;
1249
1250			oper = sctp_get_mbuf_for_msg((sizeof(struct sctp_paramhdr) + sizeof(uint32_t)),
1251			    0, M_DONTWAIT, 1, MT_DATA);
1252			if (oper) {
1253				struct sctp_paramhdr *ph;
1254				uint32_t *ippp;
1255
1256				SCTP_BUF_LEN(oper) = sizeof(struct sctp_paramhdr) +
1257				    sizeof(uint32_t);
1258				ph = mtod(oper, struct sctp_paramhdr *);
1259				ph->param_type = htons(SCTP_CAUSE_PROTOCOL_VIOLATION);
1260				ph->param_length = htons(SCTP_BUF_LEN(oper));
1261				ippp = (uint32_t *) (ph + 1);
1262				*ippp = htonl(SCTP_FROM_SCTP_TIMER + SCTP_LOC_3);
1263			}
1264			inp->last_abort_code = SCTP_FROM_SCTP_TIMER + SCTP_LOC_4;
1265			sctp_abort_an_association(inp, stcb, SCTP_INTERNAL_ERROR,
1266			    oper, SCTP_SO_NOT_LOCKED);
1267		} else {
1268#ifdef INVARIANTS
1269			panic("Cookie timer expires in wrong state?");
1270#else
1271			SCTP_PRINTF("Strange in state %d not cookie-echoed yet c-e timer expires?\n", SCTP_GET_STATE(&stcb->asoc));
1272			return (0);
1273#endif
1274		}
1275		return (0);
1276	}
1277	/* Ok we found the cookie, threshold management next */
1278	if (sctp_threshold_management(inp, stcb, cookie->whoTo,
1279	    stcb->asoc.max_init_times)) {
1280		/* Assoc is over */
1281		return (1);
1282	}
1283	/*
1284	 * cleared theshold management now lets backoff the address & select
1285	 * an alternate
1286	 */
1287	stcb->asoc.dropped_special_cnt = 0;
1288	sctp_backoff_on_timeout(stcb, cookie->whoTo, 1, 0, 0);
1289	alt = sctp_find_alternate_net(stcb, cookie->whoTo, 0);
1290	if (alt != cookie->whoTo) {
1291		sctp_free_remote_addr(cookie->whoTo);
1292		cookie->whoTo = alt;
1293		atomic_add_int(&alt->ref_count, 1);
1294	}
1295	/* Now mark the retran info */
1296	if (cookie->sent != SCTP_DATAGRAM_RESEND) {
1297		sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
1298	}
1299	cookie->sent = SCTP_DATAGRAM_RESEND;
1300	/*
1301	 * Now call the output routine to kick out the cookie again, Note we
1302	 * don't mark any chunks for retran so that FR will need to kick in
1303	 * to move these (or a send timer).
1304	 */
1305	return (0);
1306}
1307
1308int
1309sctp_strreset_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
1310    struct sctp_nets *net)
1311{
1312	struct sctp_nets *alt;
1313	struct sctp_tmit_chunk *strrst = NULL, *chk = NULL;
1314
1315	if (stcb->asoc.stream_reset_outstanding == 0) {
1316		return (0);
1317	}
1318	/* find the existing STRRESET, we use the seq number we sent out on */
1319	(void)sctp_find_stream_reset(stcb, stcb->asoc.str_reset_seq_out, &strrst);
1320	if (strrst == NULL) {
1321		return (0);
1322	}
1323	/* do threshold management */
1324	if (sctp_threshold_management(inp, stcb, strrst->whoTo,
1325	    stcb->asoc.max_send_times)) {
1326		/* Assoc is over */
1327		return (1);
1328	}
1329	/*
1330	 * cleared theshold management now lets backoff the address & select
1331	 * an alternate
1332	 */
1333	sctp_backoff_on_timeout(stcb, strrst->whoTo, 1, 0, 0);
1334	alt = sctp_find_alternate_net(stcb, strrst->whoTo, 0);
1335	sctp_free_remote_addr(strrst->whoTo);
1336	strrst->whoTo = alt;
1337	atomic_add_int(&alt->ref_count, 1);
1338
1339	/* See if a ECN Echo is also stranded */
1340	TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {
1341		if ((chk->whoTo == net) &&
1342		    (chk->rec.chunk_id.id == SCTP_ECN_ECHO)) {
1343			sctp_free_remote_addr(chk->whoTo);
1344			if (chk->sent != SCTP_DATAGRAM_RESEND) {
1345				chk->sent = SCTP_DATAGRAM_RESEND;
1346				sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
1347			}
1348			chk->whoTo = alt;
1349			atomic_add_int(&alt->ref_count, 1);
1350		}
1351	}
1352	if (net->dest_state & SCTP_ADDR_NOT_REACHABLE) {
1353		/*
1354		 * If the address went un-reachable, we need to move to
1355		 * alternates for ALL chk's in queue
1356		 */
1357		sctp_move_chunks_from_net(stcb, net);
1358	}
1359	/* mark the retran info */
1360	if (strrst->sent != SCTP_DATAGRAM_RESEND)
1361		sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
1362	strrst->sent = SCTP_DATAGRAM_RESEND;
1363
1364	/* restart the timer */
1365	sctp_timer_start(SCTP_TIMER_TYPE_STRRESET, inp, stcb, strrst->whoTo);
1366	return (0);
1367}
1368
1369int
1370sctp_asconf_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
1371    struct sctp_nets *net)
1372{
1373	struct sctp_nets *alt;
1374	struct sctp_tmit_chunk *asconf, *chk, *nchk;
1375
1376	/* is this a first send, or a retransmission? */
1377	if (TAILQ_EMPTY(&stcb->asoc.asconf_send_queue)) {
1378		/* compose a new ASCONF chunk and send it */
1379		sctp_send_asconf(stcb, net, SCTP_ADDR_NOT_LOCKED);
1380	} else {
1381		/*
1382		 * Retransmission of the existing ASCONF is needed
1383		 */
1384
1385		/* find the existing ASCONF */
1386		asconf = TAILQ_FIRST(&stcb->asoc.asconf_send_queue);
1387		if (asconf == NULL) {
1388			return (0);
1389		}
1390		/* do threshold management */
1391		if (sctp_threshold_management(inp, stcb, asconf->whoTo,
1392		    stcb->asoc.max_send_times)) {
1393			/* Assoc is over */
1394			return (1);
1395		}
1396		if (asconf->snd_count > stcb->asoc.max_send_times) {
1397			/*
1398			 * Something is rotten: our peer is not responding
1399			 * to ASCONFs but apparently is to other chunks.
1400			 * i.e. it is not properly handling the chunk type
1401			 * upper bits. Mark this peer as ASCONF incapable
1402			 * and cleanup.
1403			 */
1404			SCTPDBG(SCTP_DEBUG_TIMER1, "asconf_timer: Peer has not responded to our repeated ASCONFs\n");
1405			sctp_asconf_cleanup(stcb, net);
1406			return (0);
1407		}
1408		/*
1409		 * cleared threshold management, so now backoff the net and
1410		 * select an alternate
1411		 */
1412		sctp_backoff_on_timeout(stcb, asconf->whoTo, 1, 0, 0);
1413		alt = sctp_find_alternate_net(stcb, asconf->whoTo, 0);
1414		if (asconf->whoTo != alt) {
1415			sctp_free_remote_addr(asconf->whoTo);
1416			asconf->whoTo = alt;
1417			atomic_add_int(&alt->ref_count, 1);
1418		}
1419		/* See if an ECN Echo is also stranded */
1420		TAILQ_FOREACH(chk, &stcb->asoc.control_send_queue, sctp_next) {
1421			if ((chk->whoTo == net) &&
1422			    (chk->rec.chunk_id.id == SCTP_ECN_ECHO)) {
1423				sctp_free_remote_addr(chk->whoTo);
1424				chk->whoTo = alt;
1425				if (chk->sent != SCTP_DATAGRAM_RESEND) {
1426					chk->sent = SCTP_DATAGRAM_RESEND;
1427					sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
1428				}
1429				atomic_add_int(&alt->ref_count, 1);
1430			}
1431		}
1432		for (chk = asconf; chk; chk = nchk) {
1433			nchk = TAILQ_NEXT(chk, sctp_next);
1434			if (chk->whoTo != alt) {
1435				sctp_free_remote_addr(chk->whoTo);
1436				chk->whoTo = alt;
1437				atomic_add_int(&alt->ref_count, 1);
1438			}
1439			if (asconf->sent != SCTP_DATAGRAM_RESEND && chk->sent != SCTP_DATAGRAM_UNSENT)
1440				sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
1441			chk->sent = SCTP_DATAGRAM_RESEND;
1442		}
1443		if (net->dest_state & SCTP_ADDR_NOT_REACHABLE) {
1444			/*
1445			 * If the address went un-reachable, we need to move
1446			 * to the alternate for ALL chunks in queue
1447			 */
1448			sctp_move_chunks_from_net(stcb, net);
1449		}
1450		/* mark the retran info */
1451		if (asconf->sent != SCTP_DATAGRAM_RESEND)
1452			sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
1453		asconf->sent = SCTP_DATAGRAM_RESEND;
1454
1455		/* send another ASCONF if any and we can do */
1456		sctp_send_asconf(stcb, alt, SCTP_ADDR_NOT_LOCKED);
1457	}
1458	return (0);
1459}
1460
1461/* Mobility adaptation */
1462void
1463sctp_delete_prim_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
1464    struct sctp_nets *net)
1465{
1466	if (stcb->asoc.deleted_primary == NULL) {
1467		SCTPDBG(SCTP_DEBUG_ASCONF1, "delete_prim_timer: deleted_primary is not stored...\n");
1468		sctp_mobility_feature_off(inp, SCTP_MOBILITY_PRIM_DELETED);
1469		return;
1470	}
1471	SCTPDBG(SCTP_DEBUG_ASCONF1, "delete_prim_timer: finished to keep deleted primary ");
1472	SCTPDBG_ADDR(SCTP_DEBUG_ASCONF1, &stcb->asoc.deleted_primary->ro._l_addr.sa);
1473	sctp_free_remote_addr(stcb->asoc.deleted_primary);
1474	stcb->asoc.deleted_primary = NULL;
1475	sctp_mobility_feature_off(inp, SCTP_MOBILITY_PRIM_DELETED);
1476	return;
1477}
1478
1479/*
1480 * For the shutdown and shutdown-ack, we do not keep one around on the
1481 * control queue. This means we must generate a new one and call the general
1482 * chunk output routine, AFTER having done threshold management.
1483 */
1484int
1485sctp_shutdown_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
1486    struct sctp_nets *net)
1487{
1488	struct sctp_nets *alt;
1489
1490	/* first threshold managment */
1491	if (sctp_threshold_management(inp, stcb, net, stcb->asoc.max_send_times)) {
1492		/* Assoc is over */
1493		return (1);
1494	}
1495	/* second select an alternative */
1496	alt = sctp_find_alternate_net(stcb, net, 0);
1497
1498	/* third generate a shutdown into the queue for out net */
1499	if (alt) {
1500		sctp_send_shutdown(stcb, alt);
1501	} else {
1502		/*
1503		 * if alt is NULL, there is no dest to send to??
1504		 */
1505		return (0);
1506	}
1507	/* fourth restart timer */
1508	sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, inp, stcb, alt);
1509	return (0);
1510}
1511
1512int
1513sctp_shutdownack_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
1514    struct sctp_nets *net)
1515{
1516	struct sctp_nets *alt;
1517
1518	/* first threshold managment */
1519	if (sctp_threshold_management(inp, stcb, net, stcb->asoc.max_send_times)) {
1520		/* Assoc is over */
1521		return (1);
1522	}
1523	/* second select an alternative */
1524	alt = sctp_find_alternate_net(stcb, net, 0);
1525
1526	/* third generate a shutdown into the queue for out net */
1527	sctp_send_shutdown_ack(stcb, alt);
1528
1529	/* fourth restart timer */
1530	sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNACK, inp, stcb, alt);
1531	return (0);
1532}
1533
1534static void
1535sctp_audit_stream_queues_for_size(struct sctp_inpcb *inp,
1536    struct sctp_tcb *stcb)
1537{
1538	struct sctp_stream_out *outs;
1539	struct sctp_stream_queue_pending *sp;
1540	unsigned int chks_in_queue = 0;
1541	int being_filled = 0;
1542
1543	/*
1544	 * This function is ONLY called when the send/sent queues are empty.
1545	 */
1546	if ((stcb == NULL) || (inp == NULL))
1547		return;
1548
1549	if (stcb->asoc.sent_queue_retran_cnt) {
1550		SCTP_PRINTF("Hmm, sent_queue_retran_cnt is non-zero %d\n",
1551		    stcb->asoc.sent_queue_retran_cnt);
1552		stcb->asoc.sent_queue_retran_cnt = 0;
1553	}
1554	SCTP_TCB_SEND_LOCK(stcb);
1555	if (TAILQ_EMPTY(&stcb->asoc.out_wheel)) {
1556		int i, cnt = 0;
1557
1558		/* Check to see if a spoke fell off the wheel */
1559		for (i = 0; i < stcb->asoc.streamoutcnt; i++) {
1560			if (!TAILQ_EMPTY(&stcb->asoc.strmout[i].outqueue)) {
1561				sctp_insert_on_wheel(stcb, &stcb->asoc, &stcb->asoc.strmout[i], 1);
1562				cnt++;
1563			}
1564		}
1565		if (cnt) {
1566			/* yep, we lost a spoke or two */
1567			SCTP_PRINTF("Found an additional %d streams NOT on outwheel, corrected\n", cnt);
1568		} else {
1569			/* no spokes lost, */
1570			stcb->asoc.total_output_queue_size = 0;
1571		}
1572		SCTP_TCB_SEND_UNLOCK(stcb);
1573		return;
1574	}
1575	SCTP_TCB_SEND_UNLOCK(stcb);
1576	/* Check to see if some data queued, if so report it */
1577	TAILQ_FOREACH(outs, &stcb->asoc.out_wheel, next_spoke) {
1578		if (!TAILQ_EMPTY(&outs->outqueue)) {
1579			TAILQ_FOREACH(sp, &outs->outqueue, next) {
1580				if (sp->msg_is_complete)
1581					being_filled++;
1582				chks_in_queue++;
1583			}
1584		}
1585	}
1586	if (chks_in_queue != stcb->asoc.stream_queue_cnt) {
1587		SCTP_PRINTF("Hmm, stream queue cnt at %d I counted %d in stream out wheel\n",
1588		    stcb->asoc.stream_queue_cnt, chks_in_queue);
1589	}
1590	if (chks_in_queue) {
1591		/* call the output queue function */
1592		sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_NOT_LOCKED);
1593		if ((TAILQ_EMPTY(&stcb->asoc.send_queue)) &&
1594		    (TAILQ_EMPTY(&stcb->asoc.sent_queue))) {
1595			/*
1596			 * Probably should go in and make it go back through
1597			 * and add fragments allowed
1598			 */
1599			if (being_filled == 0) {
1600				SCTP_PRINTF("Still nothing moved %d chunks are stuck\n",
1601				    chks_in_queue);
1602			}
1603		}
1604	} else {
1605		SCTP_PRINTF("Found no chunks on any queue tot:%lu\n",
1606		    (u_long)stcb->asoc.total_output_queue_size);
1607		stcb->asoc.total_output_queue_size = 0;
1608	}
1609}
1610
1611int
1612sctp_heartbeat_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
1613    struct sctp_nets *net, int cnt_of_unconf)
1614{
1615	int ret;
1616
1617	if (net) {
1618		if (net->hb_responded == 0) {
1619			if (net->ro._s_addr) {
1620				/*
1621				 * Invalidate the src address if we did not
1622				 * get a response last time.
1623				 */
1624				sctp_free_ifa(net->ro._s_addr);
1625				net->ro._s_addr = NULL;
1626				net->src_addr_selected = 0;
1627			}
1628			sctp_backoff_on_timeout(stcb, net, 1, 0, 0);
1629		}
1630		/* Zero PBA, if it needs it */
1631		if (net->partial_bytes_acked) {
1632			net->partial_bytes_acked = 0;
1633		}
1634	}
1635	if ((stcb->asoc.total_output_queue_size > 0) &&
1636	    (TAILQ_EMPTY(&stcb->asoc.send_queue)) &&
1637	    (TAILQ_EMPTY(&stcb->asoc.sent_queue))) {
1638		sctp_audit_stream_queues_for_size(inp, stcb);
1639	}
1640	/* Send a new HB, this will do threshold managment, pick a new dest */
1641	if (cnt_of_unconf == 0) {
1642		if (sctp_send_hb(stcb, 0, NULL) < 0) {
1643			return (1);
1644		}
1645	} else {
1646		/*
1647		 * this will send out extra hb's up to maxburst if there are
1648		 * any unconfirmed addresses.
1649		 */
1650		uint32_t cnt_sent = 0;
1651
1652		TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
1653			if ((net->dest_state & SCTP_ADDR_UNCONFIRMED) &&
1654			    (net->dest_state & SCTP_ADDR_REACHABLE)) {
1655				cnt_sent++;
1656				if (net->hb_responded == 0) {
1657					/* Did we respond last time? */
1658					if (net->ro._s_addr) {
1659						sctp_free_ifa(net->ro._s_addr);
1660						net->ro._s_addr = NULL;
1661						net->src_addr_selected = 0;
1662					}
1663				}
1664				ret = sctp_send_hb(stcb, 1, net);
1665				if (ret < 0)
1666					return 1;
1667				else if (ret == 0) {
1668					break;
1669				}
1670				if (cnt_sent >= SCTP_BASE_SYSCTL(sctp_hb_maxburst))
1671					break;
1672			}
1673		}
1674	}
1675	return (0);
1676}
1677
1678int
1679sctp_is_hb_timer_running(struct sctp_tcb *stcb)
1680{
1681	if (SCTP_OS_TIMER_PENDING(&stcb->asoc.hb_timer.timer)) {
1682		/* its running */
1683		return (1);
1684	} else {
1685		/* nope */
1686		return (0);
1687	}
1688}
1689
1690int
1691sctp_is_sack_timer_running(struct sctp_tcb *stcb)
1692{
1693	if (SCTP_OS_TIMER_PENDING(&stcb->asoc.dack_timer.timer)) {
1694		/* its running */
1695		return (1);
1696	} else {
1697		/* nope */
1698		return (0);
1699	}
1700}
1701
1702#define SCTP_NUMBER_OF_MTU_SIZES 18
1703static uint32_t mtu_sizes[] = {
1704	68,
1705	296,
1706	508,
1707	512,
1708	544,
1709	576,
1710	1006,
1711	1492,
1712	1500,
1713	1536,
1714	2002,
1715	2048,
1716	4352,
1717	4464,
1718	8166,
1719	17914,
1720	32000,
1721	65535
1722};
1723
1724
1725static uint32_t
1726sctp_getnext_mtu(struct sctp_inpcb *inp, uint32_t cur_mtu)
1727{
1728	/* select another MTU that is just bigger than this one */
1729	int i;
1730
1731	for (i = 0; i < SCTP_NUMBER_OF_MTU_SIZES; i++) {
1732		if (cur_mtu < mtu_sizes[i]) {
1733			/* no max_mtu is bigger than this one */
1734			return (mtu_sizes[i]);
1735		}
1736	}
1737	/* here return the highest allowable */
1738	return (cur_mtu);
1739}
1740
1741
1742void
1743sctp_pathmtu_timer(struct sctp_inpcb *inp,
1744    struct sctp_tcb *stcb,
1745    struct sctp_nets *net)
1746{
1747	uint32_t next_mtu, mtu;
1748
1749	next_mtu = sctp_getnext_mtu(inp, net->mtu);
1750
1751	if ((next_mtu > net->mtu) && (net->port == 0)) {
1752		if ((net->src_addr_selected == 0) ||
1753		    (net->ro._s_addr == NULL) ||
1754		    (net->ro._s_addr->localifa_flags & SCTP_BEING_DELETED)) {
1755			if ((net->ro._s_addr != NULL) && (net->ro._s_addr->localifa_flags & SCTP_BEING_DELETED)) {
1756				sctp_free_ifa(net->ro._s_addr);
1757				net->ro._s_addr = NULL;
1758				net->src_addr_selected = 0;
1759			} else if (net->ro._s_addr == NULL) {
1760#if defined(INET6) && defined(SCTP_EMBEDDED_V6_SCOPE)
1761				if (net->ro._l_addr.sa.sa_family == AF_INET6) {
1762					struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&net->ro._l_addr;
1763
1764					/* KAME hack: embed scopeid */
1765					(void)sa6_embedscope(sin6, MODULE_GLOBAL(ip6_use_defzone));
1766				}
1767#endif
1768
1769				net->ro._s_addr = sctp_source_address_selection(inp,
1770				    stcb,
1771				    (sctp_route_t *) & net->ro,
1772				    net, 0, stcb->asoc.vrf_id);
1773#if defined(INET6) && defined(SCTP_EMBEDDED_V6_SCOPE)
1774				if (net->ro._l_addr.sa.sa_family == AF_INET6) {
1775					struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&net->ro._l_addr;
1776
1777					(void)sa6_recoverscope(sin6);
1778				}
1779#endif				/* INET6 */
1780			}
1781			if (net->ro._s_addr)
1782				net->src_addr_selected = 1;
1783		}
1784		if (net->ro._s_addr) {
1785			mtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._s_addr.sa, net->ro.ro_rt);
1786			if (net->port) {
1787				mtu -= sizeof(struct udphdr);
1788			}
1789			if (mtu > next_mtu) {
1790				net->mtu = next_mtu;
1791			}
1792		}
1793	}
1794	/* restart the timer */
1795	sctp_timer_start(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net);
1796}
1797
1798void
1799sctp_autoclose_timer(struct sctp_inpcb *inp,
1800    struct sctp_tcb *stcb,
1801    struct sctp_nets *net)
1802{
1803	struct timeval tn, *tim_touse;
1804	struct sctp_association *asoc;
1805	int ticks_gone_by;
1806
1807	(void)SCTP_GETTIME_TIMEVAL(&tn);
1808	if (stcb->asoc.sctp_autoclose_ticks &&
1809	    sctp_is_feature_on(inp, SCTP_PCB_FLAGS_AUTOCLOSE)) {
1810		/* Auto close is on */
1811		asoc = &stcb->asoc;
1812		/* pick the time to use */
1813		if (asoc->time_last_rcvd.tv_sec >
1814		    asoc->time_last_sent.tv_sec) {
1815			tim_touse = &asoc->time_last_rcvd;
1816		} else {
1817			tim_touse = &asoc->time_last_sent;
1818		}
1819		/* Now has long enough transpired to autoclose? */
1820		ticks_gone_by = SEC_TO_TICKS(tn.tv_sec - tim_touse->tv_sec);
1821		if ((ticks_gone_by > 0) &&
1822		    (ticks_gone_by >= (int)asoc->sctp_autoclose_ticks)) {
1823			/*
1824			 * autoclose time has hit, call the output routine,
1825			 * which should do nothing just to be SURE we don't
1826			 * have hanging data. We can then safely check the
1827			 * queues and know that we are clear to send
1828			 * shutdown
1829			 */
1830			sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_AUTOCLOSE_TMR, SCTP_SO_NOT_LOCKED);
1831			/* Are we clean? */
1832			if (TAILQ_EMPTY(&asoc->send_queue) &&
1833			    TAILQ_EMPTY(&asoc->sent_queue)) {
1834				/*
1835				 * there is nothing queued to send, so I'm
1836				 * done...
1837				 */
1838				if (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) {
1839					/* only send SHUTDOWN 1st time thru */
1840					sctp_send_shutdown(stcb, stcb->asoc.primary_destination);
1841					if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) ||
1842					    (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) {
1843						SCTP_STAT_DECR_GAUGE32(sctps_currestab);
1844					}
1845					SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT);
1846					SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING);
1847					sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN,
1848					    stcb->sctp_ep, stcb,
1849					    asoc->primary_destination);
1850					sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD,
1851					    stcb->sctp_ep, stcb,
1852					    asoc->primary_destination);
1853				}
1854			}
1855		} else {
1856			/*
1857			 * No auto close at this time, reset t-o to check
1858			 * later
1859			 */
1860			int tmp;
1861
1862			/* fool the timer startup to use the time left */
1863			tmp = asoc->sctp_autoclose_ticks;
1864			asoc->sctp_autoclose_ticks -= ticks_gone_by;
1865			sctp_timer_start(SCTP_TIMER_TYPE_AUTOCLOSE, inp, stcb,
1866			    net);
1867			/* restore the real tick value */
1868			asoc->sctp_autoclose_ticks = tmp;
1869		}
1870	}
1871}
1872