2 * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 *---------------------------------------------------------------------------
27 * i4b_l3fsm.c - layer 3 FSM
28 * -------------------------
30 * $Id: i4b_l3fsm.c,v 1.22 2000/08/24 11:48:58 hm Exp $
32 * $FreeBSD: src/sys/i4b/layer3/i4b_l3fsm.c,v 1.6.2.1 2001/08/10 14:08:42 obrien Exp $
33 * $DragonFly: src/sys/net/i4b/layer3/i4b_l3fsm.c,v 1.7 2006/01/14 11:05:18 swildner Exp $
35 * last edit-date: [Thu Oct 12 17:58:35 2000]
37 *---------------------------------------------------------------------------*/
39 #include "use_i4bq931.h"
42 #include <sys/param.h>
43 #include <sys/systm.h>
45 #include <sys/thread2.h>
47 #include <net/i4b/include/machine/i4b_debug.h>
48 #include <net/i4b/include/machine/i4b_ioctl.h>
49 #include <net/i4b/include/machine/i4b_cause.h>
51 #include "../include/i4b_l2l3.h"
52 #include "../include/i4b_l3l4.h"
53 #include "../include/i4b_global.h"
56 #include "i4b_l3fsm.h"
58 #include "../layer4/i4b_l4.h"
61 static void F_00A(call_desc_t *cd), F_00H(call_desc_t *cd), F_00I(call_desc_t *cd);
62 static void F_00J(call_desc_t *cd);
64 static void F_01B(call_desc_t *cd), F_01K(call_desc_t *cd), F_01L(call_desc_t *cd);
65 static void F_01M(call_desc_t *cd), F_01N(call_desc_t *cd), F_01U(call_desc_t *cd);
66 static void F_01O(call_desc_t *cd);
68 static void F_03C(call_desc_t *cd), F_03N(call_desc_t *cd), F_03O(call_desc_t *cd);
69 static void F_03P(call_desc_t *cd), F_03Y(call_desc_t *cd);
71 static void F_04O(call_desc_t *cd);
73 static void F_06D(call_desc_t *cd), F_06E(call_desc_t *cd), F_06F(call_desc_t *cd);
74 static void F_06G(call_desc_t *cd), F_06J(call_desc_t *cd), F_06Q(call_desc_t *cd);
76 static void F_07E(call_desc_t *cd), F_07F(call_desc_t *cd), F_07G(call_desc_t *cd);
78 static void F_08R(call_desc_t *cd), F_08Z(call_desc_t *cd);
80 static void F_09D(call_desc_t *cd), F_09E(call_desc_t *cd), F_09F(call_desc_t *cd);
81 static void F_09G(call_desc_t *cd);
83 static void F_11J(call_desc_t *cd), F_11Q(call_desc_t *cd), F_11V(call_desc_t *cd);
85 static void F_12C(call_desc_t *cd), F_12J(call_desc_t *cd);
87 static void F_19I(call_desc_t *cd), F_19J(call_desc_t *cd), F_19K(call_desc_t *cd);
88 static void F_19W(call_desc_t *cd);
90 static void F_NCNA(call_desc_t *cd), F_STENQ(call_desc_t *cd), F_STAT(call_desc_t *cd);
91 static void F_INFO(call_desc_t *cd), F_RELCP(call_desc_t *cd), F_REL(call_desc_t *cd);
92 static void F_DISC(call_desc_t *cd), F_DCRQ(call_desc_t *cd), F_UEM(call_desc_t *cd);
93 static void F_SIGN(call_desc_t *cd), F_DLEI(call_desc_t *cd), F_ILL(call_desc_t *cd);
94 static void F_309TO(call_desc_t *cd), F_DECF(call_desc_t *cd), F_FCTY(call_desc_t *cd);
95 static void F_DECF1(call_desc_t *cd), F_DECF2(call_desc_t *cd), F_DECF3(call_desc_t *cd);
96 static void F_DLRI(call_desc_t *cd), F_DLRIA(call_desc_t *cd), F_DECF4(call_desc_t *cd);
98 static void F_308TO(call_desc_t *cd);
101 static char *l3state_text[N_STATES] = {
115 "ST_IWA - In Wait EST-Accept",
116 "ST_IWR - In Wait EST-Reject",
117 "ST_OW - Out Wait EST",
118 "ST_IWL - In Wait EST-Alert",
120 "ST_SUSE - Subroutine sets state",
125 static char *l3event_text[N_EVENTS] = {
126 "EV_SETUPRQ - L4 SETUP REQ", /* setup request from L4 */
127 "EV_DISCRQ - L4 DISC REQ", /* disconnect request from L4 */
128 "EV_RELRQ - L4 REL REQ", /* release request from L4 */
129 "EV_ALERTRQ - L4 ALERT REQ", /* alerting request from L4 */
130 "EV_SETACRS - L4 accept RSP", /* setup response accept from l4 */
131 "EV_SETRJRS - L4 reject RSP", /* setup response reject from l4 */
132 "EV_SETDCRS - L4 ignore RSP", /* setup response dontcare from l4 */
134 "EV_SETUP - rxd SETUP", /* incoming SETUP message from L2 */
135 "EV_STATUS - rxd STATUS", /* incoming STATUS message from L2 */
136 "EV_RELEASE - rxd REL", /* incoming RELEASE message from L2 */
137 "EV_RELCOMP - rxd REL COMPL", /* incoming RELEASE COMPLETE from L2 */
138 "EV_SETUPAK - rxd SETUP ACK", /* incoming SETUP ACK message from L2 */
139 "EV_CALLPRC - rxd CALL PROC", /* incoming CALL PROCEEDING from L2 */
140 "EV_ALERT - rxd ALERT", /* incoming ALERT message from L2 */
141 "EV_CONNECT - rxd CONNECT", /* incoming CONNECT message from L2 */
142 "EV_PROGIND - rxd PROG IND", /* incoming Progress IND from L2 */
143 "EV_DISCONN - rxd DISC", /* incoming DISCONNECT message from L2 */
144 "EV_CONACK - rxd CONN ACK", /* incoming CONNECT ACK message from L2 */
145 "EV_STATENQ - rxd STAT ENQ", /* incoming STATUS ENQ message from L2 */
146 "EV_INFO - rxd INFO", /* incoming INFO message from L2 */
147 "EV_FACILITY - rxd FACILITY", /* incoming FACILITY message */
149 "EV_T303EXP - T303 timeout", /* Timer T303 expired */
150 "EV_T305EXP - T305 timeout", /* Timer T305 expired */
151 "EV_T308EXP - T308 timeout", /* Timer T308 expired */
152 "EV_T309EXP - T309 timeout", /* Timer T309 expired */
153 "EV_T310EXP - T310 timeout", /* Timer T310 expired */
154 "EV_T313EXP - T313 timeout", /* Timer T313 expired */
156 "EV_DLESTIN - L2 DL_Est_Ind", /* dl establish indication from l2 */
157 "EV_DLRELIN - L2 DL_Rel_Ind", /* dl release indication from l2 */
158 "EV_DLESTCF - L2 DL_Est_Cnf", /* dl establish confirm from l2 */
159 "EV_DLRELCF - L2 DL_Rel_Cnf", /* dl release confirm from l2 */
161 "EV_ILL - Illegal event!!" /* Illegal */
165 /*---------------------------------------------------------------------------*
166 * layer 3 state transition table
167 *---------------------------------------------------------------------------*/
169 void (*func) (call_desc_t *); /* function to execute */
170 int newstate; /* next state */
171 } l3state_tab[N_EVENTS][N_STATES] = {
173 /* STATE: ST_U0 ST_U1 ST_U3 ST_U4 ST_U6 ST_U7 ST_U8 ST_U9 ST_U10 ST_U11 ST_U12 ST_U19 ST_IWA ST_IWR ST_OW ST_IWL ST_SUBSET ST_ILL */
174 /* ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
175 /*EV_SETUPRQ*/ {{F_00A, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
176 /*EV_DISCRQ */ {{F_ILL, ST_ILL}, {F_01B, ST_U11}, {F_DCRQ, ST_U11}, {F_DCRQ, ST_U11}, {F_ILL, ST_ILL}, {F_DCRQ, ST_U11}, {F_DCRQ, ST_U11}, {F_DCRQ, ST_U11}, {F_DCRQ, ST_U11}, {F_ILL, ST_ILL}, {F_NCNA, ST_U12}, {F_ILL, ST_ILL}, {F_DCRQ, ST_U11}, {F_DCRQ, ST_U11}, {F_DCRQ, ST_U11}, {F_DCRQ, ST_U11}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
177 /*EV_RELRQ */ {{F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_03C, ST_U19}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_12C, ST_U19}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
178 /*EV_ALERTRQ*/ {{F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_06D, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_09D, ST_U7}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
179 /*EV_SETACRS*/ {{F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_06E, ST_SUSE}, {F_07E, ST_U8}, {F_ILL, ST_ILL}, {F_09E, ST_U8}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
180 /*EV_SETRJRS*/ {{F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_06F, ST_SUSE}, {F_07F, ST_U0}, {F_ILL, ST_ILL}, {F_09F, ST_U0}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
181 /*EV_SETDCRS*/ {{F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_06G, ST_U0}, {F_07G, ST_U0}, {F_ILL, ST_ILL}, {F_09G, ST_U0}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
182 /* STATE: ST_U0 ST_U1 ST_U3 ST_U4 ST_U6 ST_U7 ST_U8 ST_U9 ST_U10 ST_U11 ST_U12 ST_U19 ST_IWA ST_IWR ST_OW ST_IWL ST_SUBSET ST_ILL */
183 /* ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
184 /*EV_SETUP */ {{F_00H, ST_U6}, {F_SIGN, ST_U1}, {F_SIGN, ST_U3}, {F_SIGN, ST_U4}, {F_SIGN, ST_U6}, {F_SIGN, ST_U7}, {F_SIGN, ST_U8}, {F_SIGN, ST_U9}, {F_SIGN, ST_U10}, {F_SIGN, ST_U11}, {F_SIGN, ST_U12}, {F_SIGN, ST_U19}, {F_SIGN, ST_IWA}, {F_SIGN, ST_IWR}, {F_SIGN, ST_OW}, {F_SIGN, ST_IWL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
185 /*EV_STATUS */ {{F_00I, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_19I, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_STAT, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
186 /*EV_RELEASE*/ {{F_00J, ST_U0}, {F_UEM, ST_SUSE}, {F_REL, ST_U0}, {F_REL, ST_U0}, {F_06J, ST_U0}, {F_REL, ST_U0}, {F_REL, ST_U0}, {F_REL, ST_U0}, {F_REL, ST_U0}, {F_11J, ST_U0}, {F_12J, ST_U0}, {F_19J, ST_U0}, {F_REL, ST_U0}, {F_REL, ST_U0}, {F_REL, ST_U0}, {F_REL, ST_U0}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
187 /*EV_RELCOMP*/ {{F_NCNA, ST_U0}, {F_01K, ST_U0}, {F_RELCP,ST_U0}, {F_RELCP,ST_U0}, {F_RELCP,ST_U0}, {F_RELCP,ST_U0}, {F_RELCP,ST_U0}, {F_RELCP,ST_U0}, {F_RELCP,ST_U0}, {F_RELCP,ST_U0}, {F_RELCP,ST_U0}, {F_19K, ST_U0}, {F_RELCP,ST_U0}, {F_RELCP,ST_U0}, {F_RELCP,ST_U0}, {F_RELCP,ST_U0}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
188 /*EV_SETUPAK*/ {{F_UEM, ST_SUSE}, {F_01L, ST_U3}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
189 /*EV_CALLPRC*/ {{F_UEM, ST_SUSE}, {F_01M, ST_U3}, {F_NCNA, ST_U3}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
190 /*EV_ALERT */ {{F_UEM, ST_SUSE}, {F_01N, ST_U4}, {F_03N, ST_U4}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
191 /*EV_CONNECT*/ {{F_UEM, ST_SUSE}, {F_01O, ST_U10}, {F_03O, ST_U10}, {F_04O, ST_U10}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
192 /*EV_PROGIND*/ {{F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_03P, ST_U3}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
193 /*EV_DISCONN*/ {{F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_DISC, ST_U12}, {F_DISC, ST_U12}, {F_06Q, ST_U12}, {F_DISC, ST_U12}, {F_DISC, ST_U12}, {F_DISC, ST_U12}, {F_DISC, ST_U12}, {F_11Q, ST_U19}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_DISC, ST_U12}, {F_DISC, ST_U12}, {F_DISC, ST_U12}, {F_DISC, ST_U12}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
194 /*EV_CONACK */ {{F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_08R, ST_U10}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
195 /*EV_STATENQ*/ {{F_STENQ,ST_U0}, {F_STENQ,ST_U1}, {F_STENQ,ST_U3}, {F_STENQ,ST_U4}, {F_STENQ,ST_U6}, {F_STENQ,ST_U7}, {F_STENQ,ST_U8}, {F_STENQ,ST_U9}, {F_STENQ,ST_U10}, {F_STENQ,ST_U11}, {F_STENQ,ST_U12}, {F_STENQ,ST_U19}, {F_STENQ,ST_IWA}, {F_STENQ,ST_IWR}, {F_STENQ,ST_OW}, {F_STENQ,ST_OW}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
196 /*EV_INFO */ {{F_UEM, ST_SUSE}, {F_UEM, ST_SUSE}, {F_INFO, ST_U3}, {F_INFO, ST_U4}, {F_UEM, ST_SUSE}, {F_INFO, ST_U7}, {F_INFO, ST_U8}, {F_INFO, ST_U9}, {F_INFO, ST_U10}, {F_INFO, ST_U11}, {F_INFO, ST_U12}, {F_UEM, ST_SUSE}, {F_INFO, ST_IWA}, {F_INFO, ST_IWR}, {F_INFO, ST_OW}, {F_INFO, ST_OW}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
197 /*EV_FACILITY*/ {{F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_FCTY, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
198 /* STATE: ST_U0 ST_U1 ST_U3 ST_U4 ST_U6 ST_U7 ST_U8 ST_U9 ST_U10 ST_U11 ST_U12 ST_U19 ST_IWA ST_IWR ST_OW ST_IWL ST_SUBSET ST_ILL */
199 /* ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
200 /*EV_T303EXP*/ {{F_ILL, ST_ILL}, {F_01U, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
201 /*EV_T305EXP*/ {{F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_11V, ST_U19}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
202 /*EV_T308EXP*/ {{F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_308TO,ST_ILL}, {F_19W, ST_SUSE}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
203 /*EV_T309EXP*/ {{F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_309TO,ST_U0}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
204 /*EV_T310EXP*/ {{F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_03Y, ST_U11}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
205 /*EV_T313EXP*/ {{F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_08Z, ST_U11}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
206 /* STATE: ST_U0 ST_U1 ST_U3 ST_U4 ST_U6 ST_U7 ST_U8 ST_U9 ST_U10 ST_U11 ST_U12 ST_U19 ST_IWA ST_IWR ST_OW ST_IWL ST_SUBSET ST_ILL */
207 /* ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
208 /*EV_DLESTIN*/ {{F_ILL, ST_ILL}, {F_DLEI, ST_U1}, {F_DLEI, ST_U3}, {F_DLEI, ST_U4}, {F_DLEI, ST_U1}, {F_DLEI, ST_U1}, {F_DLEI, ST_U1}, {F_DLEI, ST_U1}, {F_DLEI, ST_U1}, {F_DLEI, ST_U1}, {F_DLEI, ST_U1}, {F_DLEI, ST_U1}, {F_DLEI, ST_U1}, {F_DLEI, ST_U1}, {F_DLEI, ST_U1}, {F_DLEI, ST_U1}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
209 /*EV_DLRELIN*/ {{F_NCNA, ST_U0}, {F_DLRIA, ST_OW}, {F_DLRI, ST_U0}, {F_DLRI, ST_U0}, {F_DLRI, ST_U0}, {F_DLRI, ST_U0}, {F_DLRI, ST_U0}, {F_DLRI, ST_U0}, {F_DLRIA,ST_U10}, {F_DLRI, ST_U0}, {F_DLRI, ST_U0}, {F_DLRI, ST_U0}, {F_DLRI, ST_U0}, {F_DLRI, ST_U0}, {F_DLRI, ST_U0}, {F_DLRI, ST_U0}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
210 /*EV_DLESTCF*/ {{F_DECF, ST_SUSE}, {F_DECF, ST_SUSE}, {F_DECF, ST_SUSE}, {F_DECF, ST_SUSE}, {F_DECF, ST_SUSE}, {F_DECF, ST_SUSE}, {F_DECF, ST_SUSE}, {F_DECF, ST_SUSE}, {F_DECF, ST_SUSE}, {F_DECF, ST_SUSE}, {F_DECF, ST_SUSE}, {F_DECF, ST_SUSE}, {F_DECF2,ST_U8}, {F_DECF3,ST_U0}, {F_DECF1,ST_U1}, {F_DECF4,ST_U7}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
211 /*EV_DLRELCF*/ {{F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}},
212 /*EV_ILL */ {{F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}, {F_ILL, ST_ILL}}
215 /*---------------------------------------------------------------------------*
217 *---------------------------------------------------------------------------*/
219 next_l3state(call_desc_t *cd, int event)
221 int currstate, newstate;
224 panic("i4b_l3fsm.c: event > N_EVENTS\n");
226 currstate = cd->Q931state;
228 if(currstate > N_STATES)
229 panic("i4b_l3fsm.c: currstate > N_STATES\n");
231 newstate = l3state_tab[event][currstate].newstate;
233 if(newstate > N_STATES)
234 panic("i4b_l3fsm.c: newstate > N_STATES\n");
236 NDBGL3(L3_F_MSG, "L3 FSM event [%s]: [%s => %s]",
238 l3state_text[currstate],
239 l3state_text[newstate]);
241 /* execute function */
243 (*l3state_tab[event][currstate].func)(cd);
245 if(newstate == ST_ILL)
247 newstate = currstate;
248 NDBGL3(L3_F_ERR, "FSM illegal state, state = %s, event = %s!",
249 l3state_text[newstate],
250 l3event_text[event]);
253 if(newstate != ST_SUSE)
254 cd->Q931state = newstate;
258 /*---------------------------------------------------------------------------*
259 * return pointer to current state description
260 *---------------------------------------------------------------------------*/
262 print_l3state(call_desc_t *cd)
264 return((char *) l3state_text[cd->Q931state]);
268 /*---------------------------------------------------------------------------*
269 * L3 FSM state U0 event L4 setup req
270 *---------------------------------------------------------------------------*/
272 F_00A(call_desc_t *cd)
274 NDBGL3(L3_F_MSG, "FSM function F_00A executing");
276 cd->T303_first_to = 1;
280 if(i4b_get_dl_stat(cd) == DL_DOWN)
283 DL_Est_Req(ctrl_desc[cd->controller].unit);
284 cd->Q931state = ST_OW;
288 cd->Q931state = ST_U1;
294 /*---------------------------------------------------------------------------*
295 * L3 FSM state U0 event SETUP from L2
296 *---------------------------------------------------------------------------*/
298 F_00H(call_desc_t *cd)
300 NDBGL3(L3_F_MSG, "FSM function F_00H executing");
301 i4b_l4_connect_ind(cd); /* tell l4 we have an incoming setup */
304 /*---------------------------------------------------------------------------*
305 * L3 FSM state U0 event STATUS from L2
306 *---------------------------------------------------------------------------*/
308 F_00I(call_desc_t *cd)
310 NDBGL3(L3_F_MSG, "FSM function F_00I executing");
312 if(cd->call_state != 0)
315 i4b_l3_tx_release_complete(cd, 1); /* 1 = send cause */
317 cd->Q931state = ST_U0;
320 /*---------------------------------------------------------------------------*
321 * L3 FSM state U0 event RELEASE from L2
322 *---------------------------------------------------------------------------*/
324 F_00J(call_desc_t *cd)
326 NDBGL3(L3_F_MSG, "FSM function F_00J executing");
327 i4b_l3_tx_release_complete(cd, 0); /* 0 = don't send cause */
330 /*---------------------------------------------------------------------------*
331 * L3 FSM state U1 event disconnect req from L4
332 *---------------------------------------------------------------------------*/
334 F_01B(call_desc_t *cd)
336 NDBGL3(L3_F_MSG, "FSM function F_01B executing");
338 i4b_l3_tx_disconnect(cd);
343 /*---------------------------------------------------------------------------*
344 * L3 FSM state U1 event RELEASE COMPLETE from L2
345 *---------------------------------------------------------------------------*/
347 F_01K(call_desc_t *cd)
349 NDBGL3(L3_F_MSG, "FSM function F_01K executing");
351 i4b_l4_disconnect_ind(cd); /* tell l4 we were rejected */
355 /*---------------------------------------------------------------------------*
356 * L3 FSM state U1 event SETUP ACK from L2
357 *---------------------------------------------------------------------------*/
359 F_01L(call_desc_t *cd)
361 NDBGL3(L3_F_MSG, "FSM function F_01L executing");
365 * since this implementation does NOT support overlap sending,
366 * we react here as if we received a CALL PROCEEDING because
367 * several PBX's react with a SETUP ACK even if the called
368 * number is complete AND we sent a SENDING COMPLETE in the
369 * preceding SETUP message. (-hm)
373 i4b_l4_proceeding_ind(cd);
376 /*---------------------------------------------------------------------------*
377 * L3 FSM state U1 event CALL PROCEEDING from L2
378 *---------------------------------------------------------------------------*/
380 F_01M(call_desc_t *cd)
382 NDBGL3(L3_F_MSG, "FSM function F_01M executing");
385 i4b_l4_proceeding_ind(cd);
388 /*---------------------------------------------------------------------------*
389 * L3 FSM state U1 event ALERT from L2 (XXX !)
390 *---------------------------------------------------------------------------*/
392 F_01N(call_desc_t *cd)
394 NDBGL3(L3_F_MSG, "FSM function F_01N executing");
396 i4b_l4_alert_ind(cd);
399 /*---------------------------------------------------------------------------*
400 * L3 FSM state U1 event CONNECT from L2 (XXX !)
401 *---------------------------------------------------------------------------*/
403 F_01O(call_desc_t *cd)
405 NDBGL3(L3_F_MSG, "FSM function F_01O executing");
407 i4b_l3_tx_connect_ack(cd);
408 i4b_l4_connect_active_ind(cd);
411 /*---------------------------------------------------------------------------*
412 * L3 FSM state U1 event T303 timeout
413 *---------------------------------------------------------------------------*/
415 F_01U(call_desc_t *cd)
417 NDBGL3(L3_F_MSG, "FSM function F_01U executing");
418 if(cd->T303_first_to == 1)
420 cd->T303_first_to = 0;
423 cd->Q931state = ST_U1;
427 i4b_l4_disconnect_ind(cd);
429 cd->Q931state = ST_U0;
433 /*---------------------------------------------------------------------------*
434 * L3 FSM state U3 event release req from L4
435 *---------------------------------------------------------------------------*/
437 F_03C(call_desc_t *cd)
439 NDBGL3(L3_F_MSG, "FSM function F_03C executing");
442 i4b_l3_tx_release(cd, 1); /* 0 = don't send cause */
443 cd->T308_first_to = 1;
447 /*---------------------------------------------------------------------------*
448 * L3 FSM state U3 event ALERT from L2
449 *---------------------------------------------------------------------------*/
451 F_03N(call_desc_t *cd)
453 NDBGL3(L3_F_MSG, "FSM function F_03N executing");
455 i4b_l4_alert_ind(cd);
458 /*---------------------------------------------------------------------------*
459 * L3 FSM state U3 event CONNECT from L2
460 *---------------------------------------------------------------------------*/
462 F_03O(call_desc_t *cd)
464 NDBGL3(L3_F_MSG, "FSM function F_03O executing");
466 i4b_l3_tx_connect_ack(cd); /* CONNECT ACK to network */
467 i4b_l4_connect_active_ind(cd);
470 /*---------------------------------------------------------------------------*
471 * L3 FSM state U3 event PROGESS IND from L2
472 *---------------------------------------------------------------------------*/
474 F_03P(call_desc_t *cd)
476 NDBGL3(L3_F_MSG, "FSM function F_03P executing");
479 i4b_l4_progress_ind(cd);
483 /*---------------------------------------------------------------------------*
484 * L3 FSM state U3 event T310 timeout
485 *---------------------------------------------------------------------------*/
487 F_03Y(call_desc_t *cd)
489 NDBGL3(L3_F_MSG, "FSM function F_03Y executing");
490 cd->cause_out = 102; /* recovery on timer expiry */
491 i4b_l3_tx_disconnect(cd);
493 i4b_l4_disconnect_ind(cd);
496 /*---------------------------------------------------------------------------*
497 * L3 FSM state U4 event CONNECT from L2
498 *---------------------------------------------------------------------------*/
500 F_04O(call_desc_t *cd)
502 NDBGL3(L3_F_MSG, "FSM function F_04O executing");
503 i4b_l3_tx_connect_ack(cd); /* CONNECT ACK to network */
504 i4b_l4_connect_active_ind(cd);
507 /*---------------------------------------------------------------------------*
508 * L3 FSM state U6 event alert req from L4
509 *---------------------------------------------------------------------------*/
511 F_06D(call_desc_t *cd)
513 NDBGL3(L3_F_MSG, "FSM function F_06D executing");
515 if(i4b_get_dl_stat(cd) == DL_DOWN)
517 DL_Est_Req(ctrl_desc[cd->controller].unit);
518 cd->Q931state = ST_IWL;
523 cd->Q931state = ST_U7;
527 /*---------------------------------------------------------------------------*
528 * L3 FSM state U6 event incoming setup accept from L4
529 *---------------------------------------------------------------------------*/
531 F_06E(call_desc_t *cd)
533 NDBGL3(L3_F_MSG, "FSM function F_06E executing");
535 if(i4b_get_dl_stat(cd) == DL_DOWN)
537 DL_Est_Req(ctrl_desc[cd->controller].unit);
538 cd->Q931state = ST_IWA;
542 i4b_l3_tx_connect(cd);
543 cd->Q931state = ST_U8;
548 /*---------------------------------------------------------------------------*
549 * L3 FSM state U6 event incoming setup reject from L4
550 *---------------------------------------------------------------------------*/
552 F_06F(call_desc_t *cd)
554 NDBGL3(L3_F_MSG, "FSM function F_06F executing");
556 if(i4b_get_dl_stat(cd) == DL_DOWN)
558 DL_Est_Req(ctrl_desc[cd->controller].unit);
559 cd->Q931state = ST_IWR;
564 i4b_l3_tx_release_complete(cd, 1);
565 cd->Q931state = ST_U0;
571 /*---------------------------------------------------------------------------*
572 * L3 FSM state U6 event incoming setup ignore from L4
573 *---------------------------------------------------------------------------*/
575 F_06G(call_desc_t *cd)
577 NDBGL3(L3_F_MSG, "FSM function F_06G executing");
581 /*---------------------------------------------------------------------------*
582 * L3 FSM state U6 event RELEASE from L2
583 *---------------------------------------------------------------------------*/
585 F_06J(call_desc_t *cd)
587 NDBGL3(L3_F_MSG, "FSM function F_06J executing");
588 i4b_l3_tx_release_complete(cd, 0);
589 i4b_l4_disconnect_ind(cd);
593 /*---------------------------------------------------------------------------*
594 * L3 FSM state U6 event DISCONNECT from L2
595 *---------------------------------------------------------------------------*/
597 F_06Q(call_desc_t *cd)
599 NDBGL3(L3_F_MSG, "FSM function F_06Q executing");
600 i4b_l4_disconnect_ind(cd);
603 /*---------------------------------------------------------------------------*
604 * L3 FSM state U7 event setup response accept from L4
605 *---------------------------------------------------------------------------*/
607 F_07E(call_desc_t *cd)
609 NDBGL3(L3_F_MSG, "FSM function F_07E executing");
610 i4b_l3_tx_connect(cd);
614 /*---------------------------------------------------------------------------*
615 * L3 FSM state U7 event setup response reject from L4
616 *---------------------------------------------------------------------------*/
618 F_07F(call_desc_t *cd)
620 NDBGL3(L3_F_MSG, "FSM function F_07F executing");
621 i4b_l3_tx_release_complete(cd, 1);
625 /*---------------------------------------------------------------------------*
626 * L3 FSM state U7 event setup response ignore from L4
627 *---------------------------------------------------------------------------*/
629 F_07G(call_desc_t *cd)
631 NDBGL3(L3_F_MSG, "FSM function F_07G executing");
635 /*---------------------------------------------------------------------------*
636 * L3 FSM state U8 event CONNECT ACK from L2
637 *---------------------------------------------------------------------------*/
639 F_08R(call_desc_t *cd)
641 NDBGL3(L3_F_MSG, "FSM function F_08R executing");
643 i4b_l4_connect_active_ind(cd);
646 /*---------------------------------------------------------------------------*
647 * L3 FSM state U8 event T313 timeout
648 *---------------------------------------------------------------------------*/
650 F_08Z(call_desc_t *cd)
652 NDBGL3(L3_F_MSG, "FSM function F_08Z executing");
653 cd->cause_out = 102; /* recovery on timer expiry */
654 i4b_l3_tx_disconnect(cd);
656 i4b_l4_disconnect_ind(cd);
659 /*---------------------------------------------------------------------------*
660 * L3 FSM state U9 event alert req from L4
661 *---------------------------------------------------------------------------*/
663 F_09D(call_desc_t *cd)
665 NDBGL3(L3_F_MSG, "FSM function F_09D executing");
669 /*---------------------------------------------------------------------------*
670 * L3 FSM state U9 event setup response accept from L4
671 *---------------------------------------------------------------------------*/
673 F_09E(call_desc_t *cd)
675 NDBGL3(L3_F_MSG, "FSM function F_09E executing");
676 i4b_l3_tx_connect(cd);
680 /*---------------------------------------------------------------------------*
681 * L3 FSM state U9 event setup response reject from L4
682 *---------------------------------------------------------------------------*/
684 F_09F(call_desc_t *cd)
686 NDBGL3(L3_F_MSG, "FSM function F_09F executing");
687 i4b_l3_tx_release_complete(cd, 1);
690 /*---------------------------------------------------------------------------*
691 * L3 FSM state U9 event setup response ignore from L4
692 *---------------------------------------------------------------------------*/
694 F_09G(call_desc_t *cd)
696 NDBGL3(L3_F_MSG, "FSM function F_09G executing");
700 /*---------------------------------------------------------------------------*
701 * L3 FSM state U11 event RELEASE from L2
702 *---------------------------------------------------------------------------*/
704 F_11J(call_desc_t *cd)
706 NDBGL3(L3_F_MSG, "FSM function F_11J executing");
708 i4b_l3_tx_release_complete(cd, 0);
709 i4b_l4_disconnect_ind(cd);
713 /*---------------------------------------------------------------------------*
714 * L3 FSM state U11 event DISCONNECT from L2
715 *---------------------------------------------------------------------------*/
717 F_11Q(call_desc_t *cd)
719 NDBGL3(L3_F_MSG, "FSM function F_11Q executing");
721 i4b_l3_tx_release(cd, 0);
722 cd->T308_first_to = 1;
726 /*---------------------------------------------------------------------------*
727 * L3 FSM state U11 event T305 timeout
728 *---------------------------------------------------------------------------*/
730 F_11V(call_desc_t *cd)
732 NDBGL3(L3_F_MSG, "FSM function F_11V executing");
734 i4b_l3_tx_release(cd, 1);
735 cd->T308_first_to = 1;
739 /*---------------------------------------------------------------------------*
740 * L3 FSM state U12 event release req from L4
741 *---------------------------------------------------------------------------*/
743 F_12C(call_desc_t *cd)
745 NDBGL3(L3_F_MSG, "FSM function F_12C executing");
746 i4b_l3_tx_release(cd, 1);
747 cd->T308_first_to = 1;
751 /*---------------------------------------------------------------------------*
752 * L3 FSM state U12 event RELEASE from L2
753 *---------------------------------------------------------------------------*/
755 F_12J(call_desc_t *cd)
757 NDBGL3(L3_F_MSG, "FSM function F_12J executing");
758 i4b_l3_tx_release_complete(cd, 0);
759 i4b_l4_disconnect_ind(cd);
763 /*---------------------------------------------------------------------------*
764 * L3 FSM state U19 event STATUS from L2
765 *---------------------------------------------------------------------------*/
767 F_19I(call_desc_t *cd)
769 NDBGL3(L3_F_MSG, "FSM function F_19I executing");
771 if(cd->call_state == 0)
773 i4b_l4_status_ind(cd);
775 cd->Q931state = ST_U0;
779 cd->Q931state = ST_U19;
783 /*---------------------------------------------------------------------------*
784 * L3 FSM state U19 event RELEASE from L2
785 *---------------------------------------------------------------------------*/
787 F_19J(call_desc_t *cd)
789 NDBGL3(L3_F_MSG, "FSM function F_19J executing");
791 i4b_l4_disconnect_ind(cd);
795 /*---------------------------------------------------------------------------*
796 * L3 FSM state U19 event RELEASE COMPLETE from L2
797 *---------------------------------------------------------------------------*/
799 F_19K(call_desc_t *cd)
801 NDBGL3(L3_F_MSG, "FSM function F_19K executing");
803 i4b_l4_disconnect_ind(cd);
807 /*---------------------------------------------------------------------------*
808 * L3 FSM state U19 event T308 timeout
809 *---------------------------------------------------------------------------*/
811 F_19W(call_desc_t *cd)
813 NDBGL3(L3_F_MSG, "FSM function F_19W executing");
814 if(cd->T308_first_to == 0)
816 cd->T308_first_to = 1;
817 i4b_l3_tx_release(cd, 0);
819 cd->Q931state = ST_U19;
823 cd->T308_first_to = 0;
824 i4b_l4_disconnect_ind(cd);
826 cd->Q931state = ST_U0;
830 /*---------------------------------------------------------------------------*
831 * L3 FSM routine no change no action
832 *---------------------------------------------------------------------------*/
834 F_NCNA(call_desc_t *cd)
838 /*---------------------------------------------------------------------------*
839 * L3 FSM any state event STATUS ENQ from L2
840 *---------------------------------------------------------------------------*/
842 F_STENQ(call_desc_t *cd)
844 NDBGL3(L3_F_MSG, "FSM function F_STENQ executing");
845 i4b_l3_tx_status(cd, CAUSE_Q850_STENQRSP); /* 30, resonse to stat enq */
848 /*---------------------------------------------------------------------------*
849 * L3 FSM any state except 0 & 19 event STATUS from L2
850 *---------------------------------------------------------------------------*/
852 F_STAT(call_desc_t *cd)
854 NDBGL3(L3_F_MSG, "FSM function F_STAT executing");
855 if(cd->call_state == 0)
857 i4b_l4_status_ind(cd);
858 cd->Q931state = ST_U0;
863 /* XXX !!!!!!!!!!!!!!!!!! */
865 i4b_l4_status_ind(cd);
866 cd->cause_out = 101; /* message not compatible with call state */
867 i4b_l3_tx_disconnect(cd);
869 cd->Q931state = ST_U11;
873 /*---------------------------------------------------------------------------*
874 * L3 FSM some states event INFORMATION from L2
875 *---------------------------------------------------------------------------*/
877 F_INFO(call_desc_t *cd)
879 NDBGL3(L3_F_MSG, "FSM function F_INFO executing");
881 /* remain in current state */
884 /*---------------------------------------------------------------------------*
885 * L3 FSM T308 timeout while expecting RELEASE COMPLETE
886 *---------------------------------------------------------------------------*/
888 F_308TO(call_desc_t *cd)
890 NDBGL3(L3_F_MSG, "FSM function F_308TO executing");
891 i4b_l3_stop_all_timers(cd);
892 i4b_l4_disconnect_ind(cd);
896 /*---------------------------------------------------------------------------*
897 * L3 FSM some states event RELEASE COMPLETE from L2
898 *---------------------------------------------------------------------------*/
900 F_RELCP(call_desc_t *cd)
902 NDBGL3(L3_F_MSG, "FSM function F_RELCP executing");
903 i4b_l3_stop_all_timers(cd);
904 i4b_l4_disconnect_ind(cd);
908 /*---------------------------------------------------------------------------*
909 * L3 FSM some states event RELEASE from L2
910 *---------------------------------------------------------------------------*/
912 F_REL(call_desc_t *cd)
914 NDBGL3(L3_F_MSG, "FSM function F_REL executing");
915 i4b_l3_stop_all_timers(cd);
916 i4b_l3_tx_release_complete(cd, 0);
917 i4b_l4_disconnect_ind(cd);
921 /*---------------------------------------------------------------------------*
922 * L3 FSM some states event DISCONNECT from L2
923 *---------------------------------------------------------------------------*/
925 F_DISC(call_desc_t *cd)
927 NDBGL3(L3_F_MSG, "FSM function F_DISC executing");
928 i4b_l3_stop_all_timers(cd);
931 * no disconnect ind to L4, no jump to state U12
932 * instead we issue a RELEASE and jump to U19
935 i4b_l3_tx_release(cd, 0);
936 cd->T308_first_to = 1;
938 cd->Q931state = ST_U19;
941 /*---------------------------------------------------------------------------*
942 * L3 FSM some states event disconnect request from L4
943 *---------------------------------------------------------------------------*/
945 F_DCRQ(call_desc_t *cd)
947 NDBGL3(L3_F_MSG, "FSM function F_DCRQ executing");
949 /* stop T310 in case this is the result of an incoming call for a */
950 /* calledback connection */
952 if(cd->T310 == TIMER_ACTIVE)
956 i4b_l3_tx_disconnect(cd);
958 cd->Q931state = ST_U11;
961 /*---------------------------------------------------------------------------*
962 * L3 FSM any state except 0 event unexpected message from L2
963 *---------------------------------------------------------------------------*/
965 F_UEM(call_desc_t *cd)
967 NDBGL3(L3_F_ERR, "FSM function F_UEM executing, state = %s", print_l3state(cd));
968 i4b_l3_tx_status(cd, CAUSE_Q850_MSGNCWCS); /* 101, message not compatible with call state */
971 /*---------------------------------------------------------------------------*
972 * L3 FSM any state except 0 event SETUP from L2
973 *---------------------------------------------------------------------------*/
975 F_SIGN(call_desc_t *cd)
977 NDBGL3(L3_F_ERR, "FSM function F_SIGN executing");
979 /* XXX */ /* freecd_by_cd(cd); ?????????? XXX */
982 /*---------------------------------------------------------------------------*
983 * L3 FSM relevant states event DL ESTABLISH IND from L2
984 *---------------------------------------------------------------------------*/
986 F_DLEI(call_desc_t *cd)
988 NDBGL3(L3_F_MSG, "FSM function F_DLEI executing");
992 /* remain in current state */
995 /*---------------------------------------------------------------------------*
996 * L3 FSM any state event illegal event occured
997 *---------------------------------------------------------------------------*/
999 F_ILL(call_desc_t *cd)
1001 NDBGL3(L3_F_MSG, "FSM function F_ILL executing");
1004 /*---------------------------------------------------------------------------*
1005 * L3 FSM any state event T309 timeout
1006 *---------------------------------------------------------------------------*/
1008 F_309TO(call_desc_t *cd)
1010 NDBGL3(L3_F_ERR, "FSM function F_309TO executing");
1015 i4b_l4_dl_fail_ind(cd);
1021 /*---------------------------------------------------------------------------*
1022 * L3 FSM any state event FACILITY message received
1023 *---------------------------------------------------------------------------*/
1025 F_FCTY(call_desc_t *cd)
1027 NDBGL3(L3_F_MSG, "FSM function F_FCTY executing");
1028 /* ST_SUSE, no change in state ! */
1031 /*---------------------------------------------------------------------------*
1032 * L3 FSM state ST_OW event DL ESTABLISH CONF from L2
1033 *---------------------------------------------------------------------------*/
1035 F_DECF1(call_desc_t *cd)
1037 NDBGL3(L3_F_MSG, "FSM function F_DECF1 executing");
1038 i4b_l3_tx_setup(cd);
1041 /*---------------------------------------------------------------------------*
1042 * L3 FSM state ST_IWA event DL ESTABLISH CONF from L2
1043 *---------------------------------------------------------------------------*/
1045 F_DECF2(call_desc_t *cd)
1047 NDBGL3(L3_F_MSG, "FSM function F_DECF2 executing");
1048 i4b_l3_tx_connect(cd);
1051 /*---------------------------------------------------------------------------*
1052 * L3 FSM state ST_IWR event DL ESTABLISH CONF from L2
1053 *---------------------------------------------------------------------------*/
1055 F_DECF3(call_desc_t *cd)
1057 NDBGL3(L3_F_MSG, "FSM function F_DECF3 executing");
1058 i4b_l3_tx_release_complete(cd, 1);
1062 /*---------------------------------------------------------------------------*
1063 * L3 FSM state ST_IWL event DL ESTABLISH CONF from L2
1064 *---------------------------------------------------------------------------*/
1066 F_DECF4(call_desc_t *cd)
1068 NDBGL3(L3_F_MSG, "FSM function F_DECF4 executing");
1069 i4b_l3_tx_alert(cd);
1073 /*---------------------------------------------------------------------------*
1074 * L3 FSM any state event DL ESTABLISH CONF from L2
1075 *---------------------------------------------------------------------------*/
1077 F_DECF(call_desc_t *cd)
1079 NDBGL3(L3_F_MSG, "FSM function F_DECF executing");
1081 i4b_l3_tx_status(cd, CAUSE_Q850_NORMUNSP); /* 31, normal unspecified */
1084 /*---------------------------------------------------------------------------*
1085 * L3 FSM any state except U10 event DL RELEASE IND from L2
1086 *---------------------------------------------------------------------------*/
1088 F_DLRI(call_desc_t *cd)
1090 NDBGL3(L3_F_MSG, "FSM function F_DLRI executing");
1091 i4b_l3_stop_all_timers(cd);
1092 i4b_l4_disconnect_ind(cd);
1096 /*---------------------------------------------------------------------------*
1097 * L3 FSM state U10 event DL RELEASE IND from L2
1098 *---------------------------------------------------------------------------*/
1100 F_DLRIA(call_desc_t *cd)
1102 NDBGL3(L3_F_MSG, "FSM function F_DLRIA executing");
1104 if(cd->T309 == TIMER_IDLE)
1107 DL_Est_Req(ctrl_desc[cd->controller].unit);
1110 #endif /* NI4BQ931 > 0 */