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