* Remove (void) casts for discarded return values.
[dragonfly.git] / sys / net / i4b / layer3 / i4b_l3fsm.c
1 /*
2  * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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
23  * SUCH DAMAGE.
24  *
25  *---------------------------------------------------------------------------
26  *
27  *      i4b_l3fsm.c - layer 3 FSM
28  *      -------------------------
29  *
30  *      $Id: i4b_l3fsm.c,v 1.22 2000/08/24 11:48:58 hm Exp $ 
31  *
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 $
34  *
35  *      last edit-date: [Thu Oct 12 17:58:35 2000]
36  *
37  *---------------------------------------------------------------------------*/
38
39 #include "use_i4bq931.h"
40 #if NI4BQ931 > 0
41
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/mbuf.h>
45 #include <sys/thread2.h>
46
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>
50
51 #include "../include/i4b_l2l3.h"
52 #include "../include/i4b_l3l4.h"
53 #include "../include/i4b_global.h"
54
55 #include "i4b_l3.h"
56 #include "i4b_l3fsm.h"
57
58 #include "../layer4/i4b_l4.h"
59
60
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);
63
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);
67
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);
70
71 static void F_04O(call_desc_t *cd);
72
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);
75
76 static void F_07E(call_desc_t *cd), F_07F(call_desc_t *cd), F_07G(call_desc_t *cd);
77
78 static void F_08R(call_desc_t *cd), F_08Z(call_desc_t *cd);
79
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);
82
83 static void F_11J(call_desc_t *cd), F_11Q(call_desc_t *cd), F_11V(call_desc_t *cd);
84
85 static void F_12C(call_desc_t *cd), F_12J(call_desc_t *cd);
86
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);
89
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);
97
98 static void F_308TO(call_desc_t *cd);
99
100 #if DO_I4B_DEBUG
101 static char *l3state_text[N_STATES] = {
102          "ST_U0 - Null",
103          "ST_U1 - Out Init",
104          "ST_U3 - Out Proc",
105          "ST_U4 - Out Delv",
106          "ST_U6 - In Pres",
107          "ST_U7 - In Rxd",
108          "ST_U8 - In ConReq",
109          "ST_U9 - In Proc",
110         "ST_U10 - Active",
111         "ST_U11 - Disc Req",
112         "ST_U12 - Disc Ind",
113         "ST_U19 - Rel Req",
114
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",   
119
120         "ST_SUSE - Subroutine sets state",      
121
122         "Illegal State"
123 };
124
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      */
133         
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            */
148         
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                   */      
155         
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           */      
160
161         "EV_ILL - Illegal event!!"      /* Illegal */
162 };
163 #endif
164
165 /*---------------------------------------------------------------------------*
166  *      layer 3 state transition table
167  *---------------------------------------------------------------------------*/ 
168 struct l3state_tab {
169         void (*func) (call_desc_t *);   /* function to execute */
170         int newstate;                           /* next state */
171 } l3state_tab[N_EVENTS][N_STATES] = {
172
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}}
213 };
214
215 /*---------------------------------------------------------------------------*
216  *      event handler
217  *---------------------------------------------------------------------------*/ 
218 void
219 next_l3state(call_desc_t *cd, int event)
220 {
221         int currstate, newstate;
222
223         if(event > N_EVENTS)
224                 panic("i4b_l3fsm.c: event > N_EVENTS\n");
225
226         currstate = cd->Q931state;
227
228         if(currstate > N_STATES)
229                 panic("i4b_l3fsm.c: currstate > N_STATES\n");   
230
231         newstate = l3state_tab[event][currstate].newstate;
232
233         if(newstate > N_STATES)
234                 panic("i4b_l3fsm.c: newstate > N_STATES\n");    
235         
236         NDBGL3(L3_F_MSG, "L3 FSM event [%s]: [%s => %s]",
237                                 l3event_text[event],
238                                 l3state_text[currstate],
239                                 l3state_text[newstate]);
240
241         /* execute function */
242         
243         (*l3state_tab[event][currstate].func)(cd);
244
245         if(newstate == ST_ILL)
246         {
247                 newstate = currstate;
248                 NDBGL3(L3_F_ERR, "FSM illegal state, state = %s, event = %s!",
249                                 l3state_text[newstate],
250                                 l3event_text[event]);
251         }
252
253         if(newstate != ST_SUSE) 
254                 cd->Q931state = newstate;        
255 }
256
257 #if DO_I4B_DEBUG
258 /*---------------------------------------------------------------------------*
259  *      return pointer to current state description
260  *---------------------------------------------------------------------------*/ 
261 char *
262 print_l3state(call_desc_t *cd)
263 {
264         return((char *) l3state_text[cd->Q931state]);
265 }
266 #endif
267
268 /*---------------------------------------------------------------------------*
269  *      L3 FSM state U0 event L4 setup req
270  *---------------------------------------------------------------------------*/ 
271 static void
272 F_00A(call_desc_t *cd)
273 {
274         NDBGL3(L3_F_MSG, "FSM function F_00A executing");
275
276         cd->T303_first_to = 1;
277         T303_start(cd);
278
279         crit_enter();
280         if(i4b_get_dl_stat(cd) == DL_DOWN)
281         {
282                 crit_exit();
283                 DL_Est_Req(ctrl_desc[cd->controller].unit);
284                 cd->Q931state = ST_OW;
285         }
286         else
287         {
288                 cd->Q931state = ST_U1;
289                 crit_exit();
290                 i4b_l3_tx_setup(cd);
291         }               
292 }
293
294 /*---------------------------------------------------------------------------*
295  *      L3 FSM state U0 event SETUP from L2
296  *---------------------------------------------------------------------------*/ 
297 static void
298 F_00H(call_desc_t *cd)
299 {
300         NDBGL3(L3_F_MSG, "FSM function F_00H executing");
301         i4b_l4_connect_ind(cd); /* tell l4 we have an incoming setup */ 
302 }
303
304 /*---------------------------------------------------------------------------*
305  *      L3 FSM state U0 event STATUS from L2
306  *---------------------------------------------------------------------------*/ 
307 static void
308 F_00I(call_desc_t *cd)
309 {
310         NDBGL3(L3_F_MSG, "FSM function F_00I executing");
311
312         if(cd->call_state != 0)
313         {
314                 cd->cause_out = 101;
315                 i4b_l3_tx_release_complete(cd, 1);      /* 1 = send cause */
316         }
317         cd->Q931state = ST_U0;
318 }
319
320 /*---------------------------------------------------------------------------*
321  *      L3 FSM state U0 event RELEASE from L2
322  *---------------------------------------------------------------------------*/ 
323 static void
324 F_00J(call_desc_t *cd)
325 {
326         NDBGL3(L3_F_MSG, "FSM function F_00J executing");
327         i4b_l3_tx_release_complete(cd, 0);      /* 0 = don't send cause */      
328 }
329
330 /*---------------------------------------------------------------------------*
331  *      L3 FSM state U1 event disconnect req from L4
332  *---------------------------------------------------------------------------*/ 
333 static void
334 F_01B(call_desc_t *cd)
335 {
336         NDBGL3(L3_F_MSG, "FSM function F_01B executing");
337         /* cause from L4 */
338         i4b_l3_tx_disconnect(cd);
339         T303_stop(cd);
340         T305_start(cd); 
341 }
342
343 /*---------------------------------------------------------------------------*
344  *      L3 FSM state U1 event RELEASE COMPLETE from L2
345  *---------------------------------------------------------------------------*/ 
346 static void
347 F_01K(call_desc_t *cd)
348 {
349         NDBGL3(L3_F_MSG, "FSM function F_01K executing");
350         T303_stop(cd);
351         i4b_l4_disconnect_ind(cd);      /* tell l4 we were rejected */
352         freecd_by_cd(cd);       
353 }
354
355 /*---------------------------------------------------------------------------*
356  *      L3 FSM state U1 event SETUP ACK from L2
357  *---------------------------------------------------------------------------*/ 
358 static void
359 F_01L(call_desc_t *cd)
360 {
361         NDBGL3(L3_F_MSG, "FSM function F_01L executing");
362         T303_stop(cd);
363
364         /*
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)
370          */
371
372         T310_start(cd);
373         i4b_l4_proceeding_ind(cd);
374 }
375
376 /*---------------------------------------------------------------------------*
377  *      L3 FSM state U1 event CALL PROCEEDING from L2
378  *---------------------------------------------------------------------------*/ 
379 static void
380 F_01M(call_desc_t *cd)
381 {
382         NDBGL3(L3_F_MSG, "FSM function F_01M executing");
383         T303_stop(cd);
384         T310_start(cd);
385         i4b_l4_proceeding_ind(cd);
386 }
387
388 /*---------------------------------------------------------------------------*
389  *      L3 FSM state U1 event ALERT from L2  (XXX !)
390  *---------------------------------------------------------------------------*/ 
391 static void
392 F_01N(call_desc_t *cd)
393 {
394         NDBGL3(L3_F_MSG, "FSM function F_01N executing");
395         T303_stop(cd);
396         i4b_l4_alert_ind(cd);
397 }
398
399 /*---------------------------------------------------------------------------*
400  *      L3 FSM state U1 event CONNECT from L2 (XXX !)
401  *---------------------------------------------------------------------------*/ 
402 static void
403 F_01O(call_desc_t *cd)
404 {
405         NDBGL3(L3_F_MSG, "FSM function F_01O executing");
406         T303_stop(cd);
407         i4b_l3_tx_connect_ack(cd);
408         i4b_l4_connect_active_ind(cd);
409 }
410
411 /*---------------------------------------------------------------------------*
412  *      L3 FSM state U1 event T303 timeout
413  *---------------------------------------------------------------------------*/ 
414 static void
415 F_01U(call_desc_t *cd)
416 {
417         NDBGL3(L3_F_MSG, "FSM function F_01U executing");
418         if(cd->T303_first_to == 1)
419         {
420                 cd->T303_first_to = 0;
421                 i4b_l3_tx_setup(cd);
422                 T303_start(cd);
423                 cd->Q931state = ST_U1;
424         }
425         else
426         {
427                 i4b_l4_disconnect_ind(cd);
428                 freecd_by_cd(cd);
429                 cd->Q931state = ST_U0;
430         }
431 }
432
433 /*---------------------------------------------------------------------------*
434  *      L3 FSM state U3 event release req from L4
435  *---------------------------------------------------------------------------*/ 
436 static void
437 F_03C(call_desc_t *cd)
438 {
439         NDBGL3(L3_F_MSG, "FSM function F_03C executing");
440         T310_stop(cd);
441         cd->cause_out = 6;
442         i4b_l3_tx_release(cd, 1);       /* 0 = don't send cause */      
443         cd->T308_first_to = 1;
444         T308_start(cd);
445 }
446
447 /*---------------------------------------------------------------------------*
448  *      L3 FSM state U3 event ALERT from L2
449  *---------------------------------------------------------------------------*/ 
450 static void
451 F_03N(call_desc_t *cd)
452 {
453         NDBGL3(L3_F_MSG, "FSM function F_03N executing");
454         T310_stop(cd);
455         i4b_l4_alert_ind(cd);
456 }
457
458 /*---------------------------------------------------------------------------*
459  *      L3 FSM state U3 event CONNECT from L2
460  *---------------------------------------------------------------------------*/ 
461 static void
462 F_03O(call_desc_t *cd)
463 {
464         NDBGL3(L3_F_MSG, "FSM function F_03O executing");
465         T310_stop(cd);
466         i4b_l3_tx_connect_ack(cd);      /* CONNECT ACK to network */
467         i4b_l4_connect_active_ind(cd);
468 }
469
470 /*---------------------------------------------------------------------------*
471  *      L3 FSM state U3 event PROGESS IND from L2
472  *---------------------------------------------------------------------------*/ 
473 static void
474 F_03P(call_desc_t *cd)
475 {
476         NDBGL3(L3_F_MSG, "FSM function F_03P executing");
477         T310_stop(cd);
478 #ifdef NOTDEF
479         i4b_l4_progress_ind(cd);
480 #endif  
481 }
482
483 /*---------------------------------------------------------------------------*
484  *      L3 FSM state U3 event T310 timeout
485  *---------------------------------------------------------------------------*/ 
486 static void
487 F_03Y(call_desc_t *cd)
488 {
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);
492         T305_start(cd);
493         i4b_l4_disconnect_ind(cd);
494 }
495
496 /*---------------------------------------------------------------------------*
497  *      L3 FSM state U4 event CONNECT from L2
498  *---------------------------------------------------------------------------*/ 
499 static void
500 F_04O(call_desc_t *cd)
501 {
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);
505 }
506
507 /*---------------------------------------------------------------------------*
508  *      L3 FSM state U6 event alert req from L4
509  *---------------------------------------------------------------------------*/ 
510 static void
511 F_06D(call_desc_t *cd)
512 {
513         NDBGL3(L3_F_MSG, "FSM function F_06D executing");
514
515         if(i4b_get_dl_stat(cd) == DL_DOWN)
516         {       
517                 DL_Est_Req(ctrl_desc[cd->controller].unit);
518                 cd->Q931state = ST_IWL;
519         }
520         else
521         {
522                 i4b_l3_tx_alert(cd);
523                 cd->Q931state = ST_U7;
524         }
525 }
526
527 /*---------------------------------------------------------------------------*
528  *      L3 FSM state U6 event incoming setup accept from L4
529  *---------------------------------------------------------------------------*/ 
530 static void
531 F_06E(call_desc_t *cd)
532 {
533         NDBGL3(L3_F_MSG, "FSM function F_06E executing");
534
535         if(i4b_get_dl_stat(cd) == DL_DOWN)
536         {       
537                 DL_Est_Req(ctrl_desc[cd->controller].unit);
538                 cd->Q931state = ST_IWA;         
539         }
540         else
541         {
542                 i4b_l3_tx_connect(cd);
543                 cd->Q931state = ST_U8;
544         }
545         T313_start(cd);         
546 }
547
548 /*---------------------------------------------------------------------------*
549  *      L3 FSM state U6 event incoming setup reject from L4
550  *---------------------------------------------------------------------------*/ 
551 static void
552 F_06F(call_desc_t *cd)
553 {
554         NDBGL3(L3_F_MSG, "FSM function F_06F executing");
555
556         if(i4b_get_dl_stat(cd) == DL_DOWN)
557         {       
558                 DL_Est_Req(ctrl_desc[cd->controller].unit);
559                 cd->Q931state = ST_IWR;         
560         }
561         else
562         {
563                 crit_enter();
564                 i4b_l3_tx_release_complete(cd, 1);
565                 cd->Q931state = ST_U0;
566                 freecd_by_cd(cd);
567                 crit_exit();
568         }
569 }
570
571 /*---------------------------------------------------------------------------*
572  *      L3 FSM state U6 event incoming setup ignore from L4
573  *---------------------------------------------------------------------------*/ 
574 static void
575 F_06G(call_desc_t *cd)
576 {
577         NDBGL3(L3_F_MSG, "FSM function F_06G executing");
578         freecd_by_cd(cd);
579 }
580
581 /*---------------------------------------------------------------------------*
582  *      L3 FSM state U6 event RELEASE from L2
583  *---------------------------------------------------------------------------*/ 
584 static void
585 F_06J(call_desc_t *cd)
586 {
587         NDBGL3(L3_F_MSG, "FSM function F_06J executing");
588         i4b_l3_tx_release_complete(cd, 0);
589         i4b_l4_disconnect_ind(cd);      
590         freecd_by_cd(cd);       
591 }
592
593 /*---------------------------------------------------------------------------*
594  *      L3 FSM state U6 event DISCONNECT from L2
595  *---------------------------------------------------------------------------*/ 
596 static void
597 F_06Q(call_desc_t *cd)
598 {
599         NDBGL3(L3_F_MSG, "FSM function F_06Q executing");
600         i4b_l4_disconnect_ind(cd);
601 }
602
603 /*---------------------------------------------------------------------------*
604  *      L3 FSM state U7 event setup response accept from L4
605  *---------------------------------------------------------------------------*/ 
606 static void
607 F_07E(call_desc_t *cd)
608 {
609         NDBGL3(L3_F_MSG, "FSM function F_07E executing");
610         i4b_l3_tx_connect(cd);
611         T313_start(cd);
612 }
613
614 /*---------------------------------------------------------------------------*
615  *      L3 FSM state U7 event setup response reject from L4
616  *---------------------------------------------------------------------------*/ 
617 static void
618 F_07F(call_desc_t *cd)
619 {
620         NDBGL3(L3_F_MSG, "FSM function F_07F executing");
621         i4b_l3_tx_release_complete(cd, 1);
622         freecd_by_cd(cd);
623 }
624
625 /*---------------------------------------------------------------------------*
626  *      L3 FSM state U7 event setup response ignore from L4
627  *---------------------------------------------------------------------------*/ 
628 static void
629 F_07G(call_desc_t *cd)
630 {
631         NDBGL3(L3_F_MSG, "FSM function F_07G executing");
632         freecd_by_cd(cd);
633 }
634
635 /*---------------------------------------------------------------------------*
636  *      L3 FSM state U8 event CONNECT ACK from L2
637  *---------------------------------------------------------------------------*/ 
638 static void
639 F_08R(call_desc_t *cd)
640 {
641         NDBGL3(L3_F_MSG, "FSM function F_08R executing");
642         T313_stop(cd);
643         i4b_l4_connect_active_ind(cd);
644 }
645
646 /*---------------------------------------------------------------------------*
647  *      L3 FSM state U8 event T313 timeout
648  *---------------------------------------------------------------------------*/ 
649 static void
650 F_08Z(call_desc_t *cd)
651 {
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);
655         T305_start(cd);
656         i4b_l4_disconnect_ind(cd);
657 }
658
659 /*---------------------------------------------------------------------------*
660  *      L3 FSM state U9 event alert req from L4
661  *---------------------------------------------------------------------------*/ 
662 static void
663 F_09D(call_desc_t *cd)
664 {
665         NDBGL3(L3_F_MSG, "FSM function F_09D executing");
666         i4b_l3_tx_alert(cd);
667 }
668
669 /*---------------------------------------------------------------------------*
670  *      L3 FSM state U9 event setup response accept from L4
671  *---------------------------------------------------------------------------*/ 
672 static void
673 F_09E(call_desc_t *cd)
674 {
675         NDBGL3(L3_F_MSG, "FSM function F_09E executing");
676         i4b_l3_tx_connect(cd);
677         T313_start(cd);
678 }
679
680 /*---------------------------------------------------------------------------*
681  *      L3 FSM state U9 event setup response reject from L4
682  *---------------------------------------------------------------------------*/ 
683 static void
684 F_09F(call_desc_t *cd)
685 {
686         NDBGL3(L3_F_MSG, "FSM function F_09F executing");
687         i4b_l3_tx_release_complete(cd, 1);
688         freecd_by_cd(cd);
689 }
690 /*---------------------------------------------------------------------------*
691  *      L3 FSM state U9 event setup response ignore from L4
692  *---------------------------------------------------------------------------*/ 
693 static void
694 F_09G(call_desc_t *cd)
695 {
696         NDBGL3(L3_F_MSG, "FSM function F_09G executing");
697         freecd_by_cd(cd);       
698 }
699
700 /*---------------------------------------------------------------------------*
701  *      L3 FSM state U11 event RELEASE from L2
702  *---------------------------------------------------------------------------*/ 
703 static void
704 F_11J(call_desc_t *cd)
705 {
706         NDBGL3(L3_F_MSG, "FSM function F_11J executing");
707         T305_stop(cd);
708         i4b_l3_tx_release_complete(cd, 0);
709         i4b_l4_disconnect_ind(cd);
710         freecd_by_cd(cd);
711 }
712
713 /*---------------------------------------------------------------------------*
714  *      L3 FSM state U11 event DISCONNECT from L2
715  *---------------------------------------------------------------------------*/ 
716 static void
717 F_11Q(call_desc_t *cd)
718 {
719         NDBGL3(L3_F_MSG, "FSM function F_11Q executing");
720         T305_stop(cd);
721         i4b_l3_tx_release(cd, 0);
722         cd->T308_first_to = 1;
723         T308_start(cd);
724 }
725
726 /*---------------------------------------------------------------------------*
727  *      L3 FSM state U11 event T305 timeout
728  *---------------------------------------------------------------------------*/ 
729 static void
730 F_11V(call_desc_t *cd)
731 {
732         NDBGL3(L3_F_MSG, "FSM function F_11V executing");
733         cd->cause_out = 102;
734         i4b_l3_tx_release(cd, 1);
735         cd->T308_first_to = 1;
736         T308_start(cd);
737 }
738
739 /*---------------------------------------------------------------------------*
740  *      L3 FSM state U12 event release req from L4
741  *---------------------------------------------------------------------------*/ 
742 static void
743 F_12C(call_desc_t *cd)
744 {
745         NDBGL3(L3_F_MSG, "FSM function F_12C executing");
746         i4b_l3_tx_release(cd, 1);
747         cd->T308_first_to = 1;
748         T308_start(cd);
749 }
750
751 /*---------------------------------------------------------------------------*
752  *      L3 FSM state U12 event RELEASE from L2
753  *---------------------------------------------------------------------------*/ 
754 static void
755 F_12J(call_desc_t *cd)
756 {
757         NDBGL3(L3_F_MSG, "FSM function F_12J executing");
758         i4b_l3_tx_release_complete(cd, 0);
759         i4b_l4_disconnect_ind(cd);      
760         freecd_by_cd(cd);
761 }
762
763 /*---------------------------------------------------------------------------*
764  *      L3 FSM state U19 event STATUS from L2
765  *---------------------------------------------------------------------------*/ 
766 static void
767 F_19I(call_desc_t *cd)
768 {
769         NDBGL3(L3_F_MSG, "FSM function F_19I executing");
770
771         if(cd->call_state == 0)
772         {
773                 i4b_l4_status_ind(cd);
774                 freecd_by_cd(cd);
775                 cd->Q931state = ST_U0;
776         }
777         else
778         {
779                 cd->Q931state = ST_U19;
780         }
781 }
782
783 /*---------------------------------------------------------------------------*
784  *      L3 FSM state U19 event RELEASE from L2
785  *---------------------------------------------------------------------------*/ 
786 static void
787 F_19J(call_desc_t *cd)
788 {
789         NDBGL3(L3_F_MSG, "FSM function F_19J executing");
790         T308_stop(cd);
791         i4b_l4_disconnect_ind(cd);
792         freecd_by_cd(cd);
793 }
794
795 /*---------------------------------------------------------------------------*
796  *      L3 FSM state U19 event RELEASE COMPLETE from L2
797  *---------------------------------------------------------------------------*/ 
798 static void
799 F_19K(call_desc_t *cd)
800 {
801         NDBGL3(L3_F_MSG, "FSM function F_19K executing");
802         T308_stop(cd);
803         i4b_l4_disconnect_ind(cd);
804         freecd_by_cd(cd);
805 }
806
807 /*---------------------------------------------------------------------------*
808  *      L3 FSM state U19 event T308 timeout
809  *---------------------------------------------------------------------------*/ 
810 static void
811 F_19W(call_desc_t *cd)
812 {
813         NDBGL3(L3_F_MSG, "FSM function F_19W executing");
814         if(cd->T308_first_to == 0)
815         {
816                 cd->T308_first_to = 1;
817                 i4b_l3_tx_release(cd, 0);
818                 T308_start(cd);
819                 cd->Q931state = ST_U19;
820         }
821         else
822         {
823                 cd->T308_first_to = 0;
824                 i4b_l4_disconnect_ind(cd);
825                 freecd_by_cd(cd);
826                 cd->Q931state = ST_U0;
827         }
828 }
829
830 /*---------------------------------------------------------------------------*
831  *      L3 FSM routine no change no action
832  *---------------------------------------------------------------------------*/ 
833 static void
834 F_NCNA(call_desc_t *cd)
835 {
836 }
837
838 /*---------------------------------------------------------------------------*
839  *      L3 FSM any state event STATUS ENQ from L2
840  *---------------------------------------------------------------------------*/ 
841 static void
842 F_STENQ(call_desc_t *cd)
843 {
844         NDBGL3(L3_F_MSG, "FSM function F_STENQ executing");
845         i4b_l3_tx_status(cd, CAUSE_Q850_STENQRSP); /* 30, resonse to stat enq */
846 }
847
848 /*---------------------------------------------------------------------------*
849  *      L3 FSM any state except 0 & 19 event STATUS from L2
850  *---------------------------------------------------------------------------*/ 
851 static void
852 F_STAT(call_desc_t *cd)
853 {
854         NDBGL3(L3_F_MSG, "FSM function F_STAT executing");
855         if(cd->call_state == 0)
856         {
857                 i4b_l4_status_ind(cd);
858                 cd->Q931state = ST_U0;          
859                 freecd_by_cd(cd);
860         }
861         else
862         {
863                 /* XXX !!!!!!!!!!!!!!!!!! */
864                 
865                 i4b_l4_status_ind(cd);
866                 cd->cause_out = 101;    /* message not compatible with call state */
867                 i4b_l3_tx_disconnect(cd);
868                 T305_start(cd);
869                 cd->Q931state = ST_U11;
870         }
871 }
872
873 /*---------------------------------------------------------------------------*
874  *      L3 FSM some states event INFORMATION from L2
875  *---------------------------------------------------------------------------*/ 
876 static void
877 F_INFO(call_desc_t *cd)
878 {
879         NDBGL3(L3_F_MSG, "FSM function F_INFO executing");
880         i4b_l4_info_ind(cd);
881         /* remain in current state */
882 }
883
884 /*---------------------------------------------------------------------------*
885  *      L3 FSM T308 timeout while expecting RELEASE COMPLETE
886  *---------------------------------------------------------------------------*/ 
887 static void
888 F_308TO(call_desc_t *cd)
889 {
890         NDBGL3(L3_F_MSG, "FSM function F_308TO executing");
891         i4b_l3_stop_all_timers(cd);
892         i4b_l4_disconnect_ind(cd);
893         freecd_by_cd(cd);
894 }
895
896 /*---------------------------------------------------------------------------*
897  *      L3 FSM some states event RELEASE COMPLETE from L2
898  *---------------------------------------------------------------------------*/ 
899 static void
900 F_RELCP(call_desc_t *cd)
901 {
902         NDBGL3(L3_F_MSG, "FSM function F_RELCP executing");
903         i4b_l3_stop_all_timers(cd);
904         i4b_l4_disconnect_ind(cd);
905         freecd_by_cd(cd);
906 }
907
908 /*---------------------------------------------------------------------------*
909  *      L3 FSM some states event RELEASE from L2
910  *---------------------------------------------------------------------------*/ 
911 static void
912 F_REL(call_desc_t *cd)
913 {
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);      
918         freecd_by_cd(cd);
919 }
920
921 /*---------------------------------------------------------------------------*
922  *      L3 FSM some states event DISCONNECT from L2
923  *---------------------------------------------------------------------------*/ 
924 static void
925 F_DISC(call_desc_t *cd)
926 {
927         NDBGL3(L3_F_MSG, "FSM function F_DISC executing");
928         i4b_l3_stop_all_timers(cd);
929
930         /*
931          * no disconnect ind to L4, no jump to state U12
932          * instead we issue a RELEASE and jump to U19
933          */
934
935         i4b_l3_tx_release(cd, 0);
936         cd->T308_first_to = 1;  
937         T308_start(cd);
938         cd->Q931state = ST_U19;
939 }
940
941 /*---------------------------------------------------------------------------*
942  *      L3 FSM some states event disconnect request from L4
943  *---------------------------------------------------------------------------*/ 
944 static void
945 F_DCRQ(call_desc_t *cd)
946 {
947         NDBGL3(L3_F_MSG, "FSM function F_DCRQ executing");
948
949         /* stop T310 in case this is the result of an incoming call for a */
950         /* calledback connection */
951
952         if(cd->T310 == TIMER_ACTIVE)
953                 T310_stop(cd);
954                 
955         /* cause from L4 */
956         i4b_l3_tx_disconnect(cd);
957         T305_start(cd);
958         cd->Q931state = ST_U11; 
959 }
960
961 /*---------------------------------------------------------------------------*
962  *      L3 FSM any state except 0 event unexpected message from L2
963  *---------------------------------------------------------------------------*/ 
964 static void
965 F_UEM(call_desc_t *cd)
966 {
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 */
969 }
970
971 /*---------------------------------------------------------------------------*
972  *      L3 FSM any state except 0 event SETUP from L2
973  *---------------------------------------------------------------------------*/ 
974 static void
975 F_SIGN(call_desc_t *cd)
976 {
977         NDBGL3(L3_F_ERR, "FSM function F_SIGN executing");
978
979 /* XXX */ /* freecd_by_cd(cd); ?????????? XXX */
980 }
981
982 /*---------------------------------------------------------------------------*
983  *      L3 FSM relevant states event DL ESTABLISH IND from L2
984  *---------------------------------------------------------------------------*/ 
985 static void
986 F_DLEI(call_desc_t *cd)
987 {
988         NDBGL3(L3_F_MSG, "FSM function F_DLEI executing");
989
990 /* XXX */
991
992         /* remain in current state */
993 }
994
995 /*---------------------------------------------------------------------------*
996  *      L3 FSM any state event illegal event occured
997  *---------------------------------------------------------------------------*/ 
998 static void
999 F_ILL(call_desc_t *cd)
1000 {
1001         NDBGL3(L3_F_MSG, "FSM function F_ILL executing");
1002 }
1003
1004 /*---------------------------------------------------------------------------*
1005  *      L3 FSM any state event T309 timeout
1006  *---------------------------------------------------------------------------*/ 
1007 static void
1008 F_309TO(call_desc_t *cd)
1009 {
1010         NDBGL3(L3_F_ERR, "FSM function F_309TO executing");
1011
1012 /* XXX */
1013
1014 #ifdef NOTDEF
1015         i4b_l4_dl_fail_ind(cd);
1016 #endif  
1017
1018         freecd_by_cd(cd);
1019 }
1020
1021 /*---------------------------------------------------------------------------*
1022  *      L3 FSM any state event FACILITY message received
1023  *---------------------------------------------------------------------------*/ 
1024 static void
1025 F_FCTY(call_desc_t *cd)
1026 {
1027         NDBGL3(L3_F_MSG, "FSM function F_FCTY executing");
1028         /* ST_SUSE, no change in state ! */
1029 }
1030
1031 /*---------------------------------------------------------------------------*
1032  *      L3 FSM state ST_OW event DL ESTABLISH CONF from L2
1033  *---------------------------------------------------------------------------*/ 
1034 static void
1035 F_DECF1(call_desc_t *cd)
1036 {
1037         NDBGL3(L3_F_MSG, "FSM function F_DECF1 executing");
1038         i4b_l3_tx_setup(cd);
1039 }
1040
1041 /*---------------------------------------------------------------------------*
1042  *      L3 FSM state ST_IWA event DL ESTABLISH CONF from L2
1043  *---------------------------------------------------------------------------*/ 
1044 static void
1045 F_DECF2(call_desc_t *cd)
1046 {
1047         NDBGL3(L3_F_MSG, "FSM function F_DECF2 executing");
1048         i4b_l3_tx_connect(cd);
1049 }
1050
1051 /*---------------------------------------------------------------------------*
1052  *      L3 FSM state ST_IWR event DL ESTABLISH CONF from L2
1053  *---------------------------------------------------------------------------*/ 
1054 static void
1055 F_DECF3(call_desc_t *cd)
1056 {
1057         NDBGL3(L3_F_MSG, "FSM function F_DECF3 executing");
1058         i4b_l3_tx_release_complete(cd, 1);
1059         freecd_by_cd(cd);
1060 }
1061
1062 /*---------------------------------------------------------------------------*
1063  *      L3 FSM state ST_IWL event DL ESTABLISH CONF from L2
1064  *---------------------------------------------------------------------------*/ 
1065 static void
1066 F_DECF4(call_desc_t *cd)
1067 {
1068         NDBGL3(L3_F_MSG, "FSM function F_DECF4 executing");
1069         i4b_l3_tx_alert(cd);
1070 }
1071
1072
1073 /*---------------------------------------------------------------------------*
1074  *      L3 FSM any state event DL ESTABLISH CONF from L2
1075  *---------------------------------------------------------------------------*/ 
1076 static void
1077 F_DECF(call_desc_t *cd)
1078 {
1079         NDBGL3(L3_F_MSG, "FSM function F_DECF executing");
1080         T309_stop(cd);
1081         i4b_l3_tx_status(cd, CAUSE_Q850_NORMUNSP); /* 31, normal unspecified */
1082 }
1083
1084 /*---------------------------------------------------------------------------*
1085  *      L3 FSM any state except U10 event DL RELEASE IND from L2
1086  *---------------------------------------------------------------------------*/ 
1087 static void
1088 F_DLRI(call_desc_t *cd)
1089 {
1090         NDBGL3(L3_F_MSG, "FSM function F_DLRI executing");
1091         i4b_l3_stop_all_timers(cd);
1092         i4b_l4_disconnect_ind(cd);
1093         freecd_by_cd(cd);
1094 }
1095
1096 /*---------------------------------------------------------------------------*
1097  *      L3 FSM state U10 event DL RELEASE IND from L2
1098  *---------------------------------------------------------------------------*/ 
1099 static void
1100 F_DLRIA(call_desc_t *cd)
1101 {
1102         NDBGL3(L3_F_MSG, "FSM function F_DLRIA executing");
1103
1104         if(cd->T309 == TIMER_IDLE)
1105                 T309_start(cd);
1106
1107         DL_Est_Req(ctrl_desc[cd->controller].unit);
1108 }
1109         
1110 #endif /* NI4BQ931 > 0 */