xref: /titanic_41/usr/src/uts/common/inet/sctp/sctp_timer.c (revision eb82ff87b34e625264561b2d267577cf9821dab0)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #include <sys/types.h>
28 #include <sys/systm.h>
29 #include <sys/stream.h>
30 #include <sys/cmn_err.h>
31 #include <sys/strsubr.h>
32 #include <sys/strsun.h>
33 
34 #include <netinet/in.h>
35 #include <netinet/ip6.h>
36 
37 #include <inet/common.h>
38 #include <inet/ip.h>
39 #include <inet/mib2.h>
40 #include <inet/ipclassifier.h>
41 #include "sctp_impl.h"
42 #include "sctp_asconf.h"
43 
44 /* Timer block states. */
45 typedef enum {
46 	SCTP_TB_RUNNING = 1,
47 	SCTP_TB_IDLE,
48 /* Could not stop/free before mblk got queued */
49 	SCTP_TB_RESCHED,	/* sctp_tb_time_left contains tick count */
50 	SCTP_TB_CANCELLED,
51 	SCTP_TB_TO_BE_FREED
52 } timer_block_state;
53 
54 typedef struct sctp_tb_s {
55 	timer_block_state	sctp_tb_state;
56 	timeout_id_t		sctp_tb_tid;
57 	mblk_t			*sctp_tb_mp;
58 	clock_t			sctp_tb_time_left;
59 } sctp_tb_t;
60 
61 static void sctp_timer_fire(sctp_tb_t *);
62 
63 /*
64  *		sctp_timer mechanism.
65  *
66  * Each timer is represented by a timer mblk. When the
67  * timer fires, and the sctp_t is busy, the timer mblk will be put on
68  * the associated sctp_t timer queue so that it can be executed when
69  * the thread holding the lock on the sctp_t is done with its job.
70  *
71  * Note that there is no lock to protect the timer mblk state.  The reason
72  * is that the timer state can only be changed by a thread holding the
73  * lock on the sctp_t.
74  *
75  * The interface consists of 4 entry points:
76  *	sctp_timer_alloc	- create a timer mblk
77  *	sctp_timer_free		- free a timer mblk
78  *	sctp_timer		- start, restart, stop the timer
79  *	sctp_timer_valid	- called by sctp_process_recvq to verify that
80  *				  the timer did indeed fire.
81  */
82 
83 
84 /*
85  * Start, restart, stop the timer.
86  * If "tim" is -1 the timer is stopped.
87  * Otherwise, the timer is stopped if it is already running, and
88  * set to fire tim clock ticks from now.
89  */
90 void
91 sctp_timer(sctp_t *sctp, mblk_t *mp, clock_t tim)
92 {
93 	sctp_tb_t *sctp_tb;
94 	int state;
95 
96 	ASSERT(sctp != NULL && mp != NULL);
97 	ASSERT((mp->b_rptr - mp->b_datap->db_base) == sizeof (sctp_tb_t));
98 	ASSERT(mp->b_datap->db_type == M_PCSIG);
99 
100 	sctp_tb = (sctp_tb_t *)mp->b_datap->db_base;
101 	if (tim >= 0) {
102 		state = sctp_tb->sctp_tb_state;
103 		sctp_tb->sctp_tb_time_left = tim;
104 		if (state == SCTP_TB_RUNNING) {
105 			if (untimeout(sctp_tb->sctp_tb_tid) < 0) {
106 				sctp_tb->sctp_tb_state = SCTP_TB_RESCHED;
107 				/* sctp_timer_valid will start timer */
108 				return;
109 			}
110 		} else if (state != SCTP_TB_IDLE) {
111 			ASSERT(state != SCTP_TB_TO_BE_FREED);
112 			if (state == SCTP_TB_CANCELLED) {
113 				sctp_tb->sctp_tb_state = SCTP_TB_RESCHED;
114 				/* sctp_timer_valid will start timer */
115 				return;
116 			}
117 			if (state == SCTP_TB_RESCHED) {
118 				/* sctp_timer_valid will start timer */
119 				return;
120 			}
121 		} else {
122 			SCTP_REFHOLD(sctp);
123 		}
124 		sctp_tb->sctp_tb_state = SCTP_TB_RUNNING;
125 		sctp_tb->sctp_tb_tid =
126 		    timeout((pfv_t)sctp_timer_fire, sctp_tb, tim);
127 		return;
128 	}
129 	switch (tim) {
130 	case -1:
131 		sctp_timer_stop(mp);
132 		break;
133 	default:
134 		ASSERT(0);
135 		break;
136 	}
137 }
138 
139 /*
140  * sctp_timer_alloc is called by sctp_init to allocate and initialize a
141  * sctp timer.
142  *
143  * Allocate an M_PCSIG timer message. The space between db_base and
144  * b_rptr is used by the sctp_timer mechanism, and after b_rptr there is
145  * space for sctpt_t.
146  */
147 mblk_t *
148 sctp_timer_alloc(sctp_t *sctp, pfv_t func, int sleep)
149 {
150 	mblk_t *mp;
151 	sctp_tb_t *sctp_tb;
152 	sctpt_t	*sctpt;
153 	sctp_stack_t	*sctps = sctp->sctp_sctps;
154 
155 	if (sleep == KM_SLEEP) {
156 		mp = allocb_wait(sizeof (sctp_t) + sizeof (sctp_tb_t), BPRI_HI,
157 		    STR_NOSIG, NULL);
158 	} else {
159 		mp = allocb(sizeof (sctp_t) + sizeof (sctp_tb_t), BPRI_HI);
160 	}
161 	if (mp != NULL) {
162 		mp->b_datap->db_type = M_PCSIG;
163 		sctp_tb = (sctp_tb_t *)mp->b_datap->db_base;
164 		mp->b_rptr = (uchar_t *)&sctp_tb[1];
165 		mp->b_wptr = mp->b_rptr + sizeof (sctpt_t);
166 		sctp_tb->sctp_tb_state = SCTP_TB_IDLE;
167 		sctp_tb->sctp_tb_mp = mp;
168 
169 		sctpt = (sctpt_t *)mp->b_rptr;
170 		sctpt->sctpt_sctp = sctp;
171 		sctpt->sctpt_faddr = NULL;	/* set when starting timer */
172 		sctpt->sctpt_pfv = func;
173 		return (mp);
174 	}
175 	SCTP_KSTAT(sctps, sctp_add_timer);
176 	return (NULL);
177 }
178 
179 /*
180  * timeout() callback function.
181  * Put the message on the process control block's queue.
182  * If the timer is stopped or freed after
183  * it has fired then sctp_timer() and sctp_timer_valid() will clean
184  * things up.
185  */
186 static void
187 sctp_timer_fire(sctp_tb_t *sctp_tb)
188 {
189 	mblk_t *mp;
190 	sctp_t *sctp;
191 	sctpt_t *sctpt;
192 
193 	mp = sctp_tb->sctp_tb_mp;
194 	ASSERT(sctp_tb == (sctp_tb_t *)mp->b_datap->db_base);
195 	ASSERT(mp->b_datap->db_type == M_PCSIG);
196 
197 	sctpt = (sctpt_t *)mp->b_rptr;
198 	sctp = sctpt->sctpt_sctp;
199 	ASSERT(sctp != NULL);
200 
201 	mutex_enter(&sctp->sctp_lock);
202 	if (sctp->sctp_running) {
203 		/*
204 		 * Put the timer mblk to the special sctp_timer_mp list.
205 		 * This timer will be handled when the thread using this
206 		 * SCTP is done with its job.
207 		 */
208 		if (sctp->sctp_timer_mp == NULL) {
209 			SCTP_REFHOLD(sctp);
210 			sctp->sctp_timer_mp = mp;
211 		} else {
212 			linkb(sctp->sctp_timer_mp, mp);
213 		}
214 		mp->b_cont = NULL;
215 		mutex_exit(&sctp->sctp_lock);
216 	} else {
217 		sctp->sctp_running = B_TRUE;
218 		mutex_exit(&sctp->sctp_lock);
219 
220 		sctp_timer_call(sctp, mp);
221 		WAKE_SCTP(sctp);
222 	}
223 	SCTP_REFRELE(sctp);
224 }
225 
226 /*
227  * Logically free a timer mblk (that might have a pending timeout().)
228  * If the timer has fired and the mblk has been put on the queue then
229  * sctp_timer_valid will free the mblk.
230  */
231 void
232 sctp_timer_free(mblk_t *mp)
233 {
234 	sctp_tb_t *sctp_tb;
235 	int state;
236 	sctpt_t *sctpt;
237 
238 	ASSERT(mp != NULL);
239 	ASSERT((mp->b_rptr - mp->b_datap->db_base) == sizeof (sctp_tb_t));
240 	ASSERT(mp->b_datap->db_type == M_PCSIG);
241 
242 	sctp_tb = (sctp_tb_t *)mp->b_datap->db_base;
243 	state = sctp_tb->sctp_tb_state;
244 
245 	dprint(5, ("sctp_timer_free %p state %d\n", (void *)mp, state));
246 
247 	if (state == SCTP_TB_RUNNING) {
248 		if (untimeout(sctp_tb->sctp_tb_tid) < 0) {
249 			sctp_tb->sctp_tb_state = SCTP_TB_TO_BE_FREED;
250 			/* sctp_timer_valid will free the mblk */
251 			return;
252 		}
253 		sctpt = (sctpt_t *)mp->b_rptr;
254 		SCTP_REFRELE(sctpt->sctpt_sctp);
255 	} else if (state != SCTP_TB_IDLE) {
256 		ASSERT(state != SCTP_TB_TO_BE_FREED);
257 		sctp_tb->sctp_tb_state = SCTP_TB_TO_BE_FREED;
258 		/* sctp_timer_valid will free the mblk */
259 		return;
260 	}
261 	freeb(mp);
262 }
263 
264 /*
265  * Called from sctp_timer(,,-1)
266  */
267 void
268 sctp_timer_stop(mblk_t *mp)
269 {
270 	sctp_tb_t *sctp_tb;
271 	int state;
272 	sctpt_t *sctpt;
273 
274 	ASSERT(mp != NULL);
275 	ASSERT(mp->b_datap->db_type == M_PCSIG);
276 
277 	sctp_tb = (sctp_tb_t *)mp->b_datap->db_base;
278 	state = sctp_tb->sctp_tb_state;
279 
280 	dprint(5, ("sctp_timer_stop %p %d\n", (void *)mp, state));
281 
282 	if (state == SCTP_TB_RUNNING) {
283 		if (untimeout(sctp_tb->sctp_tb_tid) < 0) {
284 			sctp_tb->sctp_tb_state = SCTP_TB_CANCELLED;
285 		} else {
286 			sctp_tb->sctp_tb_state = SCTP_TB_IDLE;
287 			sctpt = (sctpt_t *)mp->b_rptr;
288 			SCTP_REFRELE(sctpt->sctpt_sctp);
289 		}
290 	} else if (state == SCTP_TB_RESCHED) {
291 		sctp_tb->sctp_tb_state = SCTP_TB_CANCELLED;
292 	}
293 }
294 
295 /*
296  * The user of the sctp_timer mechanism is required to call
297  * sctp_timer_valid() for each M_PCSIG message processed in the
298  * service procedures.
299  * sctp_timer_valid will return "true" if the timer actually did fire.
300  */
301 
302 static boolean_t
303 sctp_timer_valid(mblk_t *mp)
304 {
305 	sctp_tb_t *sctp_tb;
306 	int state;
307 	sctpt_t *sctpt;
308 
309 	ASSERT(mp != NULL);
310 	ASSERT(mp->b_datap->db_type == M_PCSIG);
311 
312 	sctp_tb = (sctp_tb_t *)DB_BASE(mp);
313 	sctpt = (sctpt_t *)mp->b_rptr;
314 	state = sctp_tb->sctp_tb_state;
315 	if (state != SCTP_TB_RUNNING) {
316 		ASSERT(state != SCTP_TB_IDLE);
317 		if (state == SCTP_TB_TO_BE_FREED) {
318 			/*
319 			 * sctp_timer_free was called after the message
320 			 * was putq'ed.
321 			 */
322 			freeb(mp);
323 			return (B_FALSE);
324 		}
325 		if (state == SCTP_TB_CANCELLED) {
326 			/* The timer was stopped after the mblk was putq'ed */
327 			sctp_tb->sctp_tb_state = SCTP_TB_IDLE;
328 			return (B_FALSE);
329 		}
330 		if (state == SCTP_TB_RESCHED) {
331 			/*
332 			 * The timer was stopped and then restarted after
333 			 * the mblk was putq'ed.
334 			 * sctp_tb_time_left contains the number of ticks that
335 			 * the timer was restarted with.
336 			 * The sctp will not be disapper between the time
337 			 * the sctpt_t is marked SCTP_TB_RESCHED and when
338 			 * we get here as sctp_add_recvq() does a refhold.
339 			 */
340 			sctp_tb->sctp_tb_state = SCTP_TB_RUNNING;
341 			sctp_tb->sctp_tb_tid = timeout((pfv_t)sctp_timer_fire,
342 			    sctp_tb, sctp_tb->sctp_tb_time_left);
343 			SCTP_REFHOLD(sctpt->sctpt_sctp);
344 			return (B_FALSE);
345 		}
346 	}
347 	sctp_tb->sctp_tb_state = SCTP_TB_IDLE;
348 	return (B_TRUE);
349 }
350 
351 /*
352  * The SCTP timer call. Calls sctp_timer_valid() to verify whether
353  * timer was cancelled or not.
354  */
355 void
356 sctp_timer_call(sctp_t *sctp, mblk_t *mp)
357 {
358 	sctpt_t *sctpt = (sctpt_t *)mp->b_rptr;
359 
360 	if (sctp_timer_valid(mp)) {
361 		(*sctpt->sctpt_pfv)(sctp, sctpt->sctpt_faddr);
362 	}
363 }
364 
365 /*
366  * Delayed ack
367  */
368 void
369 sctp_ack_timer(sctp_t *sctp)
370 {
371 	sctp_stack_t	*sctps = sctp->sctp_sctps;
372 
373 	sctp->sctp_ack_timer_running = 0;
374 	sctp->sctp_sack_toggle = sctps->sctps_deferred_acks_max;
375 	BUMP_MIB(&sctps->sctps_mib, sctpOutAckDelayed);
376 	(void) sctp_sack(sctp, NULL);
377 }
378 
379 /*
380  * Peer address heartbeat timer handler
381  */
382 void
383 sctp_heartbeat_timer(sctp_t *sctp)
384 {
385 	sctp_faddr_t	*fp;
386 	int64_t		now;
387 	int64_t		earliest_expiry;
388 	int		cnt;
389 	sctp_stack_t	*sctps = sctp->sctp_sctps;
390 
391 	if (sctp->sctp_strikes >= sctp->sctp_pa_max_rxt) {
392 		/*
393 		 * If there is a peer address with no strikes,
394 		 * don't give up yet. If enough other peer
395 		 * address are down, we could otherwise fail
396 		 * the association prematurely.  This is a
397 		 * byproduct of our aggressive probe approach
398 		 * when a heartbeat fails to connect. We may
399 		 * wish to revisit this...
400 		 */
401 		if (!sctp_is_a_faddr_clean(sctp)) {
402 			/* time to give up */
403 			BUMP_MIB(&sctps->sctps_mib, sctpAborted);
404 			BUMP_MIB(&sctps->sctps_mib, sctpTimHeartBeatDrop);
405 			sctp_assoc_event(sctp, SCTP_COMM_LOST, 0, NULL);
406 			sctp_clean_death(sctp, sctp->sctp_client_errno ?
407 			    sctp->sctp_client_errno : ETIMEDOUT);
408 			return;
409 		}
410 	}
411 
412 	/* Only send heartbeats in the established state */
413 	if (sctp->sctp_state != SCTPS_ESTABLISHED) {
414 		dprint(5, ("sctp_heartbeat_timer: not in ESTABLISHED\n"));
415 		return;
416 	}
417 
418 	now = ddi_get_lbolt64();
419 	earliest_expiry = 0;
420 	cnt = sctps->sctps_maxburst;
421 
422 	/*
423 	 * Walk through all faddrs.  Since the timer should run infrequently
424 	 * and the number of peer addresses should not be big, this should
425 	 * be OK.
426 	 */
427 	for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->next) {
428 		/*
429 		 * If the peer is unreachable because there is no available
430 		 * source address, call sctp_get_dest() to see if it is
431 		 * reachable now.  If it is OK, the state will become
432 		 * unconfirmed.  And the following code to handle unconfirmed
433 		 * address will be executed.  If it is still not OK,
434 		 * re-schedule.  If heartbeat is enabled, only try this
435 		 * up to the normal heartbeat max times.  But if heartbeat
436 		 * is disable, this retry may go on forever.
437 		 */
438 		if (fp->state == SCTP_FADDRS_UNREACH) {
439 			sctp_get_dest(sctp, fp);
440 			if (fp->state == SCTP_FADDRS_UNREACH) {
441 				if (fp->hb_enabled &&
442 				    ++fp->strikes > fp->max_retr &&
443 				    sctp_faddr_dead(sctp, fp,
444 				    SCTP_FADDRS_DOWN) == -1) {
445 					/* Assoc is dead */
446 					return;
447 				}
448 				fp->hb_expiry = now + SET_HB_INTVL(fp);
449 				goto set_expiry;
450 			} else {
451 				/* Send a heartbeat immediately. */
452 				fp->hb_expiry = now;
453 			}
454 		}
455 		/*
456 		 * Don't send heartbeat to this address if it is not
457 		 * hb_enabled and the address has been confirmed.
458 		 */
459 		if (!fp->hb_enabled && fp->state != SCTP_FADDRS_UNCONFIRMED) {
460 			continue;
461 		}
462 
463 		/*
464 		 * The heartbeat timer is expired.  If the address is dead,
465 		 * we still send heartbeat to it in case it becomes alive
466 		 * again.  But we will only send once in a while, calculated
467 		 * by SET_HB_INTVL().
468 		 *
469 		 * If the address is alive and there is a hearbeat pending,
470 		 * resend the heartbeat and start exponential backoff on the
471 		 * heartbeat timeout value.  If there is no heartbeat pending,
472 		 * just send out one.
473 		 */
474 		if (now >= fp->hb_expiry) {
475 			if (fp->hb_pending) {
476 				/*
477 				 * If an address is not confirmed, no need
478 				 * to bump the overall counter as it doesn't
479 				 * matter as we will not use it to send data
480 				 * and it should not affect the association.
481 				 */
482 				switch (fp->state) {
483 				case SCTP_FADDRS_ALIVE:
484 					sctp->sctp_strikes++;
485 					/* FALLTHRU */
486 				case SCTP_FADDRS_UNCONFIRMED:
487 					/*
488 					 * Retransmission implies that RTO
489 					 * is probably not correct.
490 					 */
491 					fp->rtt_updates = 0;
492 					fp->strikes++;
493 					if (fp->strikes > fp->max_retr) {
494 						if (sctp_faddr_dead(sctp, fp,
495 						    SCTP_FADDRS_DOWN) == -1) {
496 							/* Assoc is dead */
497 							return;
498 						}
499 						/*
500 						 * Addr is down; keep initial
501 						 * RTO
502 						 */
503 						fp->rto =
504 						    sctp->sctp_rto_initial;
505 						goto dead_addr;
506 					} else {
507 						SCTP_CALC_RXT(sctp, fp);
508 						fp->hb_expiry = now + fp->rto;
509 					}
510 					break;
511 				case SCTP_FADDRS_DOWN:
512 dead_addr:
513 					fp->hb_expiry = now + SET_HB_INTVL(fp);
514 					break;
515 				default:
516 					continue;
517 				}
518 			} else {
519 				/*
520 				 * If there is unack'ed data, no need to
521 				 * send a heart beat.
522 				 */
523 				if (fp->suna > 0) {
524 					fp->hb_expiry = now + SET_HB_INTVL(fp);
525 					goto set_expiry;
526 				} else {
527 					fp->hb_expiry = now + fp->rto;
528 				}
529 			}
530 			/*
531 			 * Note that the total number of heartbeat we can send
532 			 * out simultaneously is limited by sctp_maxburst.  If
533 			 * the limit is exceeded, we need to wait for the next
534 			 * timeout to send them.  This should only happen if
535 			 * there is unconfirmed address.  Note that hb_pending
536 			 * is set in sctp_send_heartbeat().  So if a heartbeat
537 			 * is not sent, it will not affect the state of the
538 			 * peer address.
539 			 */
540 			if (fp->state != SCTP_FADDRS_UNCONFIRMED || cnt-- > 0)
541 				sctp_send_heartbeat(sctp, fp);
542 		}
543 set_expiry:
544 		if (fp->hb_expiry < earliest_expiry || earliest_expiry == 0)
545 			earliest_expiry = fp->hb_expiry;
546 	}
547 	if (sctp->sctp_autoclose != 0) {
548 		int64_t expire;
549 
550 		expire = sctp->sctp_active + sctp->sctp_autoclose;
551 
552 		if (expire <= now) {
553 			dprint(3, ("sctp_heartbeat_timer: autoclosing\n"));
554 			sctp_send_shutdown(sctp, 0);
555 			return;
556 		}
557 		if (expire < earliest_expiry || earliest_expiry == 0)
558 			earliest_expiry = expire;
559 	}
560 
561 	earliest_expiry -= now;
562 	if (earliest_expiry < 0)
563 		earliest_expiry = 1;
564 	sctp_timer(sctp, sctp->sctp_heartbeat_mp, earliest_expiry);
565 }
566 
567 void
568 sctp_rexmit_timer(sctp_t *sctp, sctp_faddr_t *fp)
569 {
570 	mblk_t 		*mp;
571 	sctp_stack_t	*sctps = sctp->sctp_sctps;
572 
573 	ASSERT(fp != NULL);
574 
575 	dprint(3, ("sctp_timer: faddr=%x:%x:%x:%x\n",
576 	    SCTP_PRINTADDR(fp->faddr)));
577 
578 	fp->timer_running = 0;
579 
580 	/* Check is we've reached the max for retries */
581 	if (sctp->sctp_state < SCTPS_ESTABLISHED) {
582 		if (fp->strikes >= sctp->sctp_max_init_rxt) {
583 			/* time to give up */
584 			BUMP_MIB(&sctps->sctps_mib, sctpAborted);
585 			BUMP_MIB(&sctps->sctps_mib, sctpTimRetransDrop);
586 			sctp_assoc_event(sctp, SCTP_CANT_STR_ASSOC, 0, NULL);
587 			sctp_clean_death(sctp, sctp->sctp_client_errno ?
588 			    sctp->sctp_client_errno : ETIMEDOUT);
589 			return;
590 		}
591 	} else if (sctp->sctp_state >= SCTPS_ESTABLISHED) {
592 		if (sctp->sctp_strikes >= sctp->sctp_pa_max_rxt) {
593 			/* time to give up */
594 			BUMP_MIB(&sctps->sctps_mib, sctpAborted);
595 			BUMP_MIB(&sctps->sctps_mib, sctpTimRetransDrop);
596 			sctp_assoc_event(sctp, SCTP_COMM_LOST, 0, NULL);
597 			sctp_clean_death(sctp, sctp->sctp_client_errno ?
598 			    sctp->sctp_client_errno : ETIMEDOUT);
599 			return;
600 		}
601 	}
602 
603 	if (fp->strikes >= fp->max_retr) {
604 		if (sctp_faddr_dead(sctp, fp, SCTP_FADDRS_DOWN) == -1) {
605 			return;
606 		}
607 	}
608 
609 	switch (sctp->sctp_state) {
610 	case SCTPS_SHUTDOWN_RECEIVED:
611 		(void) sctp_shutdown_received(sctp, NULL, B_FALSE, B_TRUE,
612 		    NULL);
613 
614 		/* FALLTHRU */
615 	case SCTPS_ESTABLISHED:
616 	case SCTPS_SHUTDOWN_PENDING:
617 		if (sctp->sctp_xmit_head == NULL &&
618 		    sctp->sctp_xmit_unsent == NULL) {
619 			/* Nothing to retransmit */
620 			if (sctp->sctp_state == SCTPS_SHUTDOWN_PENDING) {
621 				sctp_send_shutdown(sctp, 1);
622 			}
623 			return;
624 		}
625 
626 		BUMP_MIB(&sctps->sctps_mib, sctpTimRetrans);
627 
628 		sctp_rexmit(sctp, fp);
629 		/*
630 		 * sctp_rexmit() will increase the strikes and restart the
631 		 * timer, so return here.
632 		 */
633 		return;
634 	case SCTPS_COOKIE_WAIT:
635 		BUMP_LOCAL(sctp->sctp_T1expire);
636 rxmit_init:
637 		/* retransmit init */
638 		/*
639 		 * We don't take the conn hash lock here since the source
640 		 * address list won't be modified (it would have been done
641 		 * the first time around).
642 		 */
643 		mp = sctp_init_mp(sctp, fp);
644 		if (mp != NULL) {
645 			BUMP_MIB(&sctps->sctps_mib, sctpTimRetrans);
646 			(void) conn_ip_output(mp, fp->ixa);
647 			BUMP_LOCAL(sctp->sctp_opkts);
648 		}
649 		break;
650 	case SCTPS_COOKIE_ECHOED:
651 		BUMP_LOCAL(sctp->sctp_T1expire);
652 		if (sctp->sctp_cookie_mp == NULL) {
653 			sctp->sctp_state = SCTPS_COOKIE_WAIT;
654 			goto rxmit_init;
655 		}
656 		mp = dupmsg(sctp->sctp_cookie_mp);
657 		if (mp == NULL)
658 			break;
659 		(void) conn_ip_output(mp, fp->ixa);
660 		BUMP_LOCAL(sctp->sctp_opkts);
661 		BUMP_MIB(&sctps->sctps_mib, sctpTimRetrans);
662 		break;
663 	case SCTPS_SHUTDOWN_SENT:
664 		BUMP_LOCAL(sctp->sctp_T2expire);
665 		sctp_send_shutdown(sctp, 1);
666 		BUMP_MIB(&sctps->sctps_mib, sctpTimRetrans);
667 		break;
668 	case SCTPS_SHUTDOWN_ACK_SENT:
669 		/* We shouldn't have any more outstanding data */
670 		ASSERT(sctp->sctp_xmit_head == NULL);
671 		ASSERT(sctp->sctp_xmit_unsent == NULL);
672 
673 		BUMP_LOCAL(sctp->sctp_T2expire);
674 		(void) sctp_shutdown_received(sctp, NULL, B_FALSE, B_TRUE,
675 		    NULL);
676 		BUMP_MIB(&sctps->sctps_mib, sctpTimRetrans);
677 		break;
678 	default:
679 		ASSERT(0);
680 		break;
681 	}
682 
683 	fp->strikes++;
684 	sctp->sctp_strikes++;
685 	SCTP_CALC_RXT(sctp, fp);
686 
687 	SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->rto);
688 }
689 
690 /*
691  * RTO calculation. timesent and now are both in ms.
692  */
693 void
694 sctp_update_rtt(sctp_t *sctp, sctp_faddr_t *fp, clock_t delta)
695 {
696 	int rtt;
697 
698 	/* Calculate the RTT in ms */
699 	rtt = (int)delta;
700 	rtt = rtt > 0 ? rtt : 1;
701 
702 	dprint(5, ("sctp_update_rtt: fp = %p, rtt = %d\n", (void *)fp, rtt));
703 
704 	/* Is this the first RTT measurement? */
705 	if (fp->srtt == -1) {
706 		fp->srtt = rtt;
707 		fp->rttvar = rtt / 2;
708 		fp->rto = 3 * rtt; /* == rtt + 4 * rttvar ( == rtt / 2) */
709 	} else {
710 		int abs;
711 		/*
712 		 * Versions of the RTO equations that use fixed-point math.
713 		 * alpha and beta are NOT tunable in this implementation,
714 		 * and so are hard-coded in. alpha = 1/8, beta = 1/4.
715 		 */
716 		abs = fp->srtt - rtt;
717 		abs = abs >= 0 ? abs : -abs;
718 		fp->rttvar = (3 * fp->rttvar + abs) >> 2;
719 		fp->rttvar = fp->rttvar != 0 ? fp->rttvar : 1;
720 
721 		fp->srtt = (7 * fp->srtt + rtt) >> 3;
722 		fp->rto = fp->srtt + 4 * fp->rttvar;
723 	}
724 
725 	dprint(5, ("sctp_update_rtt: srtt = %d, rttvar = %d, rto = %d\n",
726 	    fp->srtt, fp->rttvar, fp->rto));
727 
728 	/* Bound the RTO by configured min and max values */
729 	if (fp->rto < sctp->sctp_rto_min) {
730 		fp->rto = sctp->sctp_rto_min;
731 	}
732 	if (fp->rto > sctp->sctp_rto_max) {
733 		fp->rto = sctp->sctp_rto_max;
734 	}
735 
736 	SCTP_MAX_RTO(sctp, fp);
737 	fp->rtt_updates++;
738 }
739 
740 void
741 sctp_free_faddr_timers(sctp_t *sctp)
742 {
743 	sctp_faddr_t *fp;
744 
745 	for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->next) {
746 		if (fp->timer_mp != NULL) {
747 			sctp_timer_free(fp->timer_mp);
748 			fp->timer_mp = NULL;
749 			fp->timer_running = 0;
750 		}
751 		if (fp->rc_timer_mp != NULL) {
752 			sctp_timer_free(fp->rc_timer_mp);
753 			fp->rc_timer_mp = NULL;
754 			fp->rc_timer_running = 0;
755 		}
756 	}
757 }
758 
759 void
760 sctp_stop_faddr_timers(sctp_t *sctp)
761 {
762 	sctp_faddr_t *fp;
763 
764 	for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->next) {
765 		SCTP_FADDR_TIMER_STOP(fp);
766 		SCTP_FADDR_RC_TIMER_STOP(fp);
767 	}
768 }
769 
770 void
771 sctp_process_timer(sctp_t *sctp)
772 {
773 	mblk_t *mp;
774 
775 	ASSERT(sctp->sctp_running);
776 	ASSERT(MUTEX_HELD(&sctp->sctp_lock));
777 	while ((mp = sctp->sctp_timer_mp) != NULL) {
778 		ASSERT(DB_TYPE(mp) == M_PCSIG);
779 		/*
780 		 * Since the timer mblk can be freed in sctp_timer_call(),
781 		 * we need to grab the b_cont before that.
782 		 */
783 		sctp->sctp_timer_mp = mp->b_cont;
784 		mp->b_cont = NULL;
785 		/*
786 		 * We have a reference on the sctp, the lock must be
787 		 * dropped to avoid deadlocks with functions potentially
788 		 * called in this context which in turn call untimeout().
789 		 */
790 		mutex_exit(&sctp->sctp_lock);
791 		sctp_timer_call(sctp, mp);
792 		mutex_enter(&sctp->sctp_lock);
793 	}
794 	SCTP_REFRELE(sctp);
795 }
796