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_l2fsm.c - layer 2 FSM
28  *	-------------------------
29  *
30  *	$Id: i4b_l2fsm.c,v 1.1 2003/04/06 04:37:48 tg Exp $
31  *
32  * $FreeBSD$
33  *
34  *      last edit-date: [Fri Jan  5 11:33:47 2001]
35  *
36  *---------------------------------------------------------------------------*/
37 
38 #include <sys/cdefs.h>
39 __KERNEL_RCSID(0, "$NetBSD: i4b_l2fsm.c,v 1.6 2002/09/27 15:37:55 provos Exp $");
40 
41 #ifdef __FreeBSD__
42 #include "i4bq921.h"
43 #else
44 #define	NI4BQ921	1
45 #endif
46 #if NI4BQ921 > 0
47 
48 #include <sys/param.h>
49 #include <sys/kernel.h>
50 #include <sys/systm.h>
51 #include <sys/mbuf.h>
52 #include <sys/socket.h>
53 #include <net/if.h>
54 
55 #include <sys/timeout.h>
56 
57 #ifdef __FreeBSD__
58 #include <machine/i4b_debug.h>
59 #include <machine/i4b_ioctl.h>
60 #else
61 #include <netisdn/i4b_debug.h>
62 #include <netisdn/i4b_ioctl.h>
63 #endif
64 
65 #include <netisdn/i4b_global.h>
66 #include <netisdn/i4b_l2.h>
67 #include <netisdn/i4b_l1l2.h>
68 #include <netisdn/i4b_isdnq931.h>
69 #include <netisdn/i4b_mbuf.h>
70 
71 #include <netisdn/i4b_l2.h>
72 #include <netisdn/i4b_l2fsm.h>
73 
74 
75 #if DO_I4B_DEBUG
76 static char *l2state_text[N_STATES] = {
77 	"ST_TEI_UNAS",
78 	"ST_ASG_AW_TEI",
79 	"ST_EST_AW_TEI",
80 	"ST_TEI_ASGD",
81 
82 	"ST_AW_EST",
83 	"ST_AW_REL",
84 	"ST_MULTIFR",
85 	"ST_TIMREC",
86 
87 	"ST_SUBSET",
88 	"Illegal State"
89 };
90 
91 static char *l2event_text[N_EVENTS] = {
92 	"EV_DLESTRQ",
93 	"EV_DLUDTRQ",
94 	"EV_MDASGRQ",
95 	"EV_MDERRRS",
96 	"EV_PSDEACT",
97 	"EV_MDREMRQ",
98 	"EV_RXSABME",
99 	"EV_RXDISC",
100 	"EV_RXUA",
101 	"EV_RXDM",
102 	"EV_T200EXP",
103 	"EV_DLDATRQ",
104 	"EV_DLRELRQ",
105 	"EV_T203EXP",
106 	"EV_OWNBUSY",
107 	"EV_OWNRDY",
108 	"EV_RXRR",
109 	"EV_RXREJ",
110 	"EV_RXRNR",
111 	"EV_RXFRMR",
112 	"Illegal Event"
113 };
114 #endif
115 
116 static void F_TU01 __P((l2_softc_t *, struct isdn_l3_driver *));
117 static void F_TU03 __P((l2_softc_t *, struct isdn_l3_driver *));
118 
119 static void F_TA03 __P((l2_softc_t *, struct isdn_l3_driver *));
120 static void F_TA04 __P((l2_softc_t *, struct isdn_l3_driver *));
121 static void F_TA05 __P((l2_softc_t *, struct isdn_l3_driver *));
122 
123 static void F_TE03 __P((l2_softc_t *, struct isdn_l3_driver *));
124 static void F_TE04 __P((l2_softc_t *, struct isdn_l3_driver *));
125 static void F_TE05 __P((l2_softc_t *, struct isdn_l3_driver *));
126 
127 static void F_T01 __P((l2_softc_t *, struct isdn_l3_driver *));
128 static void F_T05 __P((l2_softc_t *, struct isdn_l3_driver *));
129 static void F_T06 __P((l2_softc_t *, struct isdn_l3_driver *));
130 static void F_T07 __P((l2_softc_t *, struct isdn_l3_driver *));
131 static void F_T08 __P((l2_softc_t *, struct isdn_l3_driver *));
132 static void F_T09 __P((l2_softc_t *, struct isdn_l3_driver *));
133 static void F_T10 __P((l2_softc_t *, struct isdn_l3_driver *));
134 static void F_T13 __P((l2_softc_t *, struct isdn_l3_driver *));
135 
136 static void F_AE01 __P((l2_softc_t *, struct isdn_l3_driver *));
137 static void F_AE05 __P((l2_softc_t *, struct isdn_l3_driver *));
138 static void F_AE06 __P((l2_softc_t *, struct isdn_l3_driver *));
139 static void F_AE07 __P((l2_softc_t *, struct isdn_l3_driver *));
140 static void F_AE08 __P((l2_softc_t *, struct isdn_l3_driver *));
141 static void F_AE09 __P((l2_softc_t *, struct isdn_l3_driver *));
142 static void F_AE10 __P((l2_softc_t *, struct isdn_l3_driver *));
143 static void F_AE11 __P((l2_softc_t *, struct isdn_l3_driver *));
144 static void F_AE12 __P((l2_softc_t *, struct isdn_l3_driver *));
145 
146 static void F_AR05 __P((l2_softc_t *, struct isdn_l3_driver *));
147 static void F_AR06 __P((l2_softc_t *, struct isdn_l3_driver *));
148 static void F_AR07 __P((l2_softc_t *, struct isdn_l3_driver *));
149 static void F_AR08 __P((l2_softc_t *, struct isdn_l3_driver *));
150 static void F_AR09 __P((l2_softc_t *, struct isdn_l3_driver *));
151 static void F_AR10 __P((l2_softc_t *, struct isdn_l3_driver *));
152 static void F_AR11 __P((l2_softc_t *, struct isdn_l3_driver *));
153 
154 static void F_MF01 __P((l2_softc_t *, struct isdn_l3_driver *));
155 static void F_MF05 __P((l2_softc_t *, struct isdn_l3_driver *));
156 static void F_MF06 __P((l2_softc_t *, struct isdn_l3_driver *));
157 static void F_MF07 __P((l2_softc_t *, struct isdn_l3_driver *));
158 static void F_MF08 __P((l2_softc_t *, struct isdn_l3_driver *));
159 static void F_MF09 __P((l2_softc_t *, struct isdn_l3_driver *));
160 static void F_MF10 __P((l2_softc_t *, struct isdn_l3_driver *));
161 static void F_MF11 __P((l2_softc_t *, struct isdn_l3_driver *));
162 static void F_MF12 __P((l2_softc_t *, struct isdn_l3_driver *));
163 static void F_MF13 __P((l2_softc_t *, struct isdn_l3_driver *));
164 static void F_MF14 __P((l2_softc_t *, struct isdn_l3_driver *));
165 static void F_MF15 __P((l2_softc_t *, struct isdn_l3_driver *));
166 static void F_MF16 __P((l2_softc_t *, struct isdn_l3_driver *));
167 static void F_MF17 __P((l2_softc_t *, struct isdn_l3_driver *));
168 static void F_MF18 __P((l2_softc_t *, struct isdn_l3_driver *));
169 static void F_MF19 __P((l2_softc_t *, struct isdn_l3_driver *));
170 static void F_MF20 __P((l2_softc_t *, struct isdn_l3_driver *));
171 
172 static void F_TR01 __P((l2_softc_t *, struct isdn_l3_driver *));
173 static void F_TR05 __P((l2_softc_t *, struct isdn_l3_driver *));
174 static void F_TR06 __P((l2_softc_t *, struct isdn_l3_driver *));
175 static void F_TR07 __P((l2_softc_t *, struct isdn_l3_driver *));
176 static void F_TR08 __P((l2_softc_t *, struct isdn_l3_driver *));
177 static void F_TR09 __P((l2_softc_t *, struct isdn_l3_driver *));
178 static void F_TR10 __P((l2_softc_t *, struct isdn_l3_driver *));
179 static void F_TR11 __P((l2_softc_t *, struct isdn_l3_driver *));
180 static void F_TR12 __P((l2_softc_t *, struct isdn_l3_driver *));
181 static void F_TR13 __P((l2_softc_t *, struct isdn_l3_driver *));
182 static void F_TR15 __P((l2_softc_t *, struct isdn_l3_driver *));
183 static void F_TR16 __P((l2_softc_t *, struct isdn_l3_driver *));
184 static void F_TR17 __P((l2_softc_t *, struct isdn_l3_driver *));
185 static void F_TR18 __P((l2_softc_t *, struct isdn_l3_driver *));
186 static void F_TR19 __P((l2_softc_t *, struct isdn_l3_driver *));
187 static void F_TR20 __P((l2_softc_t *, struct isdn_l3_driver *));
188 static void F_ILL __P((l2_softc_t *, struct isdn_l3_driver *));
189 static void F_NCNA __P((l2_softc_t *, struct isdn_l3_driver *));
190 
191 /*---------------------------------------------------------------------------*
192  *	FSM illegal state default action
193  *---------------------------------------------------------------------------*/
194 static void
F_ILL(l2_softc_t * l2sc,struct isdn_l3_driver * drv)195 F_ILL(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
196 {
197 	NDBGL2(L2_F_ERR, "FSM function F_ILL executing");
198 }
199 
200 /*---------------------------------------------------------------------------*
201  *	FSM No change, No action
202  *---------------------------------------------------------------------------*/
203 static void
F_NCNA(l2_softc_t * l2sc,struct isdn_l3_driver * drv)204 F_NCNA(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
205 {
206 	NDBGL2(L2_F_MSG, "FSM function F_NCNA executing");
207 }
208 
209 /*---------------------------------------------------------------------------*
210  *	layer 2 state transition table
211  *---------------------------------------------------------------------------*/
212 struct l2state_tab {
213 	void (*func) __P((l2_softc_t *, struct isdn_l3_driver *));	/* function to execute */
214 	int newstate;				/* next state */
215 } l2state_tab[N_EVENTS][N_STATES] = {
216 
217 /* STATE:	ST_TEI_UNAS,			ST_ASG_AW_TEI,			ST_EST_AW_TEI,			ST_TEI_ASGD,		ST_AW_EST,		ST_AW_REL,		ST_MULTIFR,		ST_TIMREC,		ST_SUBSET,		ILLEGAL STATE	*/
218 /* -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
219 /*EV_DLESTRQ*/{	{F_TU01, ST_EST_AW_TEI},	{F_NCNA, ST_EST_AW_TEI},	{F_ILL,	ST_ILL},		{F_T01,	ST_AW_EST},     {F_AE01, ST_AW_EST},	{F_ILL,	ST_ILL},	{F_MF01, ST_AW_EST},	{F_TR01, ST_AW_EST},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
220 /*EV_DLUDTRQ*/{	{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} },
221 /*EV_MDASGRQ*/{	{F_TU03, ST_TEI_ASGD},		{F_TA03, ST_TEI_ASGD},		{F_TE03, ST_AW_EST},		{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} },
222 /*EV_MDERRRS*/{	{F_ILL,	ST_ILL},		{F_TA04, ST_TEI_UNAS},		{F_TE04, ST_TEI_UNAS},		{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} },
223 /*EV_PSDEACT*/{	{F_ILL,	ST_ILL},		{F_TA05, ST_TEI_UNAS},		{F_TE05, ST_TEI_UNAS},		{F_T05,	ST_TEI_ASGD},	{F_AE05, ST_TEI_ASGD},	{F_AR05, ST_TEI_ASGD},	{F_MF05, ST_TEI_ASGD},	{F_TR05, ST_TEI_ASGD},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
224 /*EV_MDREMRQ*/{	{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_T06,	ST_TEI_UNAS},	{F_AE06, ST_TEI_UNAS},	{F_AR06, ST_TEI_UNAS},	{F_MF06, ST_TEI_UNAS},	{F_TR06, ST_TEI_UNAS},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
225 /*EV_RXSABME*/{	{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_T07,	ST_SUBSET},	{F_AE07, ST_AW_EST},	{F_AR07, ST_AW_REL},	{F_MF07, ST_MULTIFR},	{F_TR07, ST_MULTIFR},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
226 /*EV_RXDISC */{	{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_T08,	ST_TEI_ASGD},	{F_AE08, ST_AW_EST},	{F_AR08, ST_AW_REL},	{F_MF08, ST_TEI_ASGD},	{F_TR08, ST_TEI_ASGD},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
227 /*EV_RXUA   */{	{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_T09,	ST_TEI_ASGD},	{F_AE09, ST_SUBSET},	{F_AR09, ST_SUBSET},	{F_MF09, ST_MULTIFR},	{F_TR09, ST_TIMREC},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
228 /*EV_RXDM   */{	{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_T10,	ST_SUBSET},	{F_AE10, ST_SUBSET},	{F_AR10, ST_SUBSET},	{F_MF10, ST_SUBSET},	{F_TR10, ST_AW_EST},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
229 /*EV_T200EXP*/{	{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},	{F_AE11, ST_SUBSET},	{F_AR11, ST_SUBSET},	{F_MF11, ST_TIMREC},	{F_TR11, ST_SUBSET},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
230 /*EV_DLDATRQ*/{	{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},	{F_AE12, ST_AW_EST},	{F_ILL,	ST_ILL},	{F_MF12, ST_MULTIFR},	{F_TR12, ST_TIMREC},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
231 /*EV_DLRELRQ*/{	{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_ILL,	ST_ILL},		{F_T13,	ST_TEI_ASGD},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL},	{F_MF13, ST_AW_REL},	{F_TR13, ST_AW_REL},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
232 /*EV_T203EXP*/{	{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_MF14, ST_TIMREC},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
233 /*EV_OWNBUSY*/{	{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_MF15, ST_MULTIFR},	{F_TR15, ST_TIMREC},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
234 /*EV_OWNRDY */{	{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_MF16, ST_MULTIFR},	{F_TR16, ST_TIMREC},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
235 /*EV_RXRR   */{	{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_MF17, ST_SUBSET},	{F_TR17, ST_SUBSET},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
236 /*EV_RXREJ  */{	{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_MF18, ST_SUBSET},	{F_TR18, ST_SUBSET},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
237 /*EV_RXRNR  */{	{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_MF19, ST_SUBSET},	{F_TR19, ST_SUBSET},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
238 /*EV_RXFRMR */{	{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_MF20, ST_AW_EST},	{F_TR20, ST_AW_EST},	{F_ILL,	ST_ILL},	{F_ILL,	ST_ILL} },
239 /*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} }
240 };
241 
242 /*---------------------------------------------------------------------------*
243  *	event handler, executes function and sets new state
244  *---------------------------------------------------------------------------*/
i4b_next_l2state(l2_softc_t * l2sc,struct isdn_l3_driver * drv,int event)245 void i4b_next_l2state(l2_softc_t *l2sc, struct isdn_l3_driver *drv, int event)
246 {
247 	int currstate, newstate;
248 	int (*savpostfsmfunc)(struct isdn_l3_driver *) = NULL;
249 
250 	/* check event number */
251 	if(event > N_EVENTS)
252 		panic("i4b_l2fsm.c: event > N_EVENTS");
253 
254 	/* get current state and check it */
255 	if((currstate = l2sc->Q921_state) > N_STATES) 	/* failsafe */
256 		panic("i4b_l2fsm.c: currstate > N_STATES");
257 
258 	/* get new state and check it */
259 	if((newstate = l2state_tab[event][currstate].newstate) > N_STATES)
260 		panic("i4b_l2fsm.c: newstate > N_STATES");
261 
262 
263 	if(newstate != ST_SUBSET)
264 	{	/* state function does NOT set new state */
265 		NDBGL2(L2_F_MSG, "FSM event [%s]: [%s/%d => %s/%d]",
266 				l2event_text[event],
267                                 l2state_text[currstate], currstate,
268                                 l2state_text[newstate], newstate);
269         }
270 
271 	/* execute state transition function */
272         (*l2state_tab[event][currstate].func)(l2sc, drv);
273 
274 	if(newstate == ST_SUBSET)
275 	{	/* state function DOES set new state */
276 		NDBGL2(L2_F_MSG, "FSM S-event [%s]: [%s => %s]", l2event_text[event],
277                                            l2state_text[currstate],
278                                            l2state_text[l2sc->Q921_state]);
279         }
280 
281 	/* check for illegal new state */
282 
283 	if(newstate == ST_ILL)
284 	{
285 		newstate = currstate;
286 		NDBGL2(L2_F_ERR, "FSM illegal state, state = %s, event = %s!",
287                                 l2state_text[currstate],
288 				l2event_text[event]);
289 	}
290 
291 	/* check if state machine function has to set new state */
292 
293 	if(newstate != ST_SUBSET)
294 		l2sc->Q921_state = newstate;        /* no, we set new state */
295 
296 	if(l2sc->postfsmfunc != NULL)
297 	{
298 		NDBGL2(L2_F_MSG, "FSM executing postfsmfunc!");
299 		/* try to avoid an endless loop */
300 		savpostfsmfunc = l2sc->postfsmfunc;
301 		l2sc->postfsmfunc = NULL;
302         	(*savpostfsmfunc)(l2sc->postfsmarg);
303         }
304 }
305 
306 #if DO_I4B_DEBUG
307 /*---------------------------------------------------------------------------*
308  *	return pointer to current state description
309  *---------------------------------------------------------------------------*/
i4b_print_l2state(l2_softc_t * l2sc)310 char *i4b_print_l2state(l2_softc_t *l2sc)
311 {
312 	return((char *) l2state_text[l2sc->Q921_state]);
313 }
314 #endif
315 
316 /*---------------------------------------------------------------------------*
317  *	FSM state ST_TEI_UNAS event dl establish request
318  *---------------------------------------------------------------------------*/
319 static void
F_TU01(l2_softc_t * l2sc,struct isdn_l3_driver * drv)320 F_TU01(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
321 {
322 	NDBGL2(L2_F_MSG, "FSM function F_TU01 executing");
323 	i4b_mdl_assign_ind(l2sc);
324 }
325 
326 /*---------------------------------------------------------------------------*
327  *	FSM state ST_TEI_UNAS event mdl assign request
328  *---------------------------------------------------------------------------*/
329 static void
F_TU03(l2_softc_t * l2sc,struct isdn_l3_driver * drv)330 F_TU03(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
331 {
332 	NDBGL2(L2_F_MSG, "FSM function F_TU03 executing");
333 }
334 
335 /*---------------------------------------------------------------------------*
336  *	FSM state ST_ASG_AW_TEI event mdl assign request
337  *---------------------------------------------------------------------------*/
338 static void
F_TA03(l2_softc_t * l2sc,struct isdn_l3_driver * drv)339 F_TA03(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
340 {
341 	NDBGL2(L2_F_MSG, "FSM function F_TA03 executing");
342 }
343 
344 /*---------------------------------------------------------------------------*
345  *	FSM state ST_ASG_AW_TEI event mdl error response
346  *---------------------------------------------------------------------------*/
347 static void
F_TA04(l2_softc_t * l2sc,struct isdn_l3_driver * drv)348 F_TA04(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
349 {
350 	NDBGL2(L2_F_MSG, "FSM function F_TA04 executing");
351 }
352 
353 /*---------------------------------------------------------------------------*
354  *	FSM state ST_ASG_AW_TEI event persistent deactivation
355  *---------------------------------------------------------------------------*/
356 static void
F_TA05(l2_softc_t * l2sc,struct isdn_l3_driver * drv)357 F_TA05(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
358 {
359 	NDBGL2(L2_F_MSG, "FSM function F_TA05 executing");
360 }
361 
362 /*---------------------------------------------------------------------------*
363  *	FSM state ST_EST_AW_TEI event mdl assign request
364  *---------------------------------------------------------------------------*/
365 static void
F_TE03(l2_softc_t * l2sc,struct isdn_l3_driver * drv)366 F_TE03(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
367 {
368 	NDBGL2(L2_F_MSG, "FSM function F_TE03 executing");
369 	i4b_establish_data_link(l2sc);
370 	l2sc->l3initiated = 1;
371 }
372 
373 /*---------------------------------------------------------------------------*
374  *	FSM state ST_EST_AW_TEI event mdl error response
375  *---------------------------------------------------------------------------*/
376 static void
F_TE04(l2_softc_t * l2sc,struct isdn_l3_driver * drv)377 F_TE04(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
378 {
379 	NDBGL2(L2_F_MSG, "FSM function F_TE04 executing");
380 	l2sc->postfsmarg = l2sc->drv;
381 	l2sc->postfsmfunc = i4b_dl_release_ind;
382 }
383 
384 /*---------------------------------------------------------------------------*
385  *	FSM state ST_EST_AW_TEI event persistent deactivation
386  *---------------------------------------------------------------------------*/
387 static void
F_TE05(l2_softc_t * l2sc,struct isdn_l3_driver * drv)388 F_TE05(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
389 {
390 	NDBGL2(L2_F_MSG, "FSM function F_TE05 executing");
391 	l2sc->postfsmarg = l2sc->drv;
392 	l2sc->postfsmfunc = i4b_dl_release_ind;
393 }
394 
395 /*---------------------------------------------------------------------------*
396  *	FSM state ST_TEI_ASGD event dl establish request
397  *---------------------------------------------------------------------------*/
398 static void
F_T01(l2_softc_t * l2sc,struct isdn_l3_driver * drv)399 F_T01(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
400 {
401 	NDBGL2(L2_F_MSG, "FSM function F_T01 executing");
402 	i4b_establish_data_link(l2sc);
403 	l2sc->l3initiated = 1;
404 }
405 
406 /*---------------------------------------------------------------------------*
407  *	FSM state ST_TEI_ASGD event persistent deactivation
408  *---------------------------------------------------------------------------*/
409 static void
F_T05(l2_softc_t * l2sc,struct isdn_l3_driver * drv)410 F_T05(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
411 {
412 	NDBGL2(L2_F_MSG, "FSM function F_T05 executing");
413 }
414 
415 /*---------------------------------------------------------------------------*
416  *	FSM state ST_TEI_ASGD event mdl remove request
417  *---------------------------------------------------------------------------*/
418 static void
F_T06(l2_softc_t * l2sc,struct isdn_l3_driver * drv)419 F_T06(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
420 {
421 	NDBGL2(L2_F_MSG, "FSM function F_T06 executing");
422 /*XXX*/	i4b_mdl_assign_ind(l2sc);
423 }
424 
425 /*---------------------------------------------------------------------------*
426  *	FSM state ST_TEI_ASGD event rx'd SABME
427  *---------------------------------------------------------------------------*/
428 static void
F_T07(l2_softc_t * l2sc,struct isdn_l3_driver * drv)429 F_T07(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
430 {
431 	NDBGL2(L2_F_MSG, "FSM function F_T07 executing");
432 
433 /* XXX */
434 #ifdef NOTDEF
435 	if(NOT able to establish)
436 	{
437 		i4b_tx_dm(l2sc, l2sc->rxd_PF);
438 		l2sc->Q921_state = ST_TEI_ASGD;
439 		return;
440 	}
441 #endif
442 
443 	i4b_clear_exception_conditions(l2sc);
444 
445 	i4b_mdl_status_ind(l2sc->drv, STI_L2STAT, LAYER_ACTIVE);
446 
447 	i4b_tx_ua(l2sc, l2sc->rxd_PF);
448 
449 	l2sc->vs = 0;
450 	l2sc->va = 0;
451 	l2sc->vr = 0;
452 
453 	l2sc->postfsmarg = l2sc->drv;
454 	l2sc->postfsmfunc = i4b_dl_establish_ind;
455 
456 	i4b_T203_start(l2sc);
457 
458 	l2sc->Q921_state = ST_MULTIFR;
459 }
460 
461 /*---------------------------------------------------------------------------*
462  *	FSM state ST_TEI_ASGD event rx'd DISC
463  *---------------------------------------------------------------------------*/
464 static void
F_T08(l2_softc_t * l2sc,struct isdn_l3_driver * drv)465 F_T08(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
466 {
467 	NDBGL2(L2_F_MSG, "FSM function F_T08 executing");
468 	i4b_mdl_status_ind(l2sc->drv, STI_L2STAT, LAYER_IDLE);
469 	i4b_tx_ua(l2sc, l2sc->rxd_PF);
470 }
471 
472 /*---------------------------------------------------------------------------*
473  *	FSM state ST_TEI_ASGD event rx'd UA
474  *---------------------------------------------------------------------------*/
475 static void
F_T09(l2_softc_t * l2sc,struct isdn_l3_driver * drv)476 F_T09(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
477 {
478 	NDBGL2(L2_F_MSG, "FSM function F_T09 executing");
479 	i4b_mdl_error_ind(l2sc, "F_T09", MDL_ERR_C);
480 	i4b_mdl_error_ind(l2sc, "F_T09", MDL_ERR_D);
481 }
482 
483 /*---------------------------------------------------------------------------*
484  *	FSM state ST_TEI_ASGD event rx'd DM
485  *---------------------------------------------------------------------------*/
486 static void
F_T10(l2_softc_t * l2sc,struct isdn_l3_driver * drv)487 F_T10(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
488 {
489 	NDBGL2(L2_F_MSG, "FSM function F_T10 executing");
490 
491 	if(l2sc->rxd_PF)
492 	{
493 		l2sc->Q921_state = ST_TEI_ASGD;
494 	}
495 	else
496 	{
497 #ifdef NOTDEF
498 		if(NOT able_to_etablish)
499 		{
500 			l2sc->Q921_state = ST_TEI_ASGD;
501 			return;
502 		}
503 #endif
504 		i4b_establish_data_link(l2sc);
505 
506 		l2sc->l3initiated = 1;
507 
508 		l2sc->Q921_state = ST_AW_EST;
509 	}
510 }
511 
512 /*---------------------------------------------------------------------------*
513  *	FSM state ST_TEI_ASGD event dl release request
514  *---------------------------------------------------------------------------*/
515 static void
F_T13(l2_softc_t * l2sc,struct isdn_l3_driver * drv)516 F_T13(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
517 {
518 	NDBGL2(L2_F_MSG, "FSM function F_T13 executing");
519 	l2sc->postfsmarg = l2sc->drv;
520 	l2sc->postfsmfunc = i4b_dl_release_cnf;
521 }
522 
523 /*---------------------------------------------------------------------------*
524  *	FSM state ST_AW_EST event dl establish request
525  *---------------------------------------------------------------------------*/
526 static void
F_AE01(l2_softc_t * l2sc,struct isdn_l3_driver * drv)527 F_AE01(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
528 {
529 	NDBGL2(L2_F_MSG, "FSM function F_AE01 executing");
530 
531 	i4b_Dcleanifq(&l2sc->i_queue);
532 
533 	l2sc->l3initiated = 1;
534 }
535 
536 /*---------------------------------------------------------------------------*
537  *	FSM state ST_AW_EST event persistent deactivation
538  *---------------------------------------------------------------------------*/
539 static void
F_AE05(l2_softc_t * l2sc,struct isdn_l3_driver * drv)540 F_AE05(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
541 {
542 	NDBGL2(L2_F_MSG, "FSM function F_AE05 executing");
543 
544 	i4b_Dcleanifq(&l2sc->i_queue);
545 
546 	l2sc->postfsmarg = l2sc->drv;
547 	l2sc->postfsmfunc = i4b_dl_release_ind;
548 
549 	i4b_T200_stop(l2sc);
550 }
551 
552 /*---------------------------------------------------------------------------*
553  *	FSM state ST_AW_EST event mdl remove request
554  *---------------------------------------------------------------------------*/
555 static void
F_AE06(l2_softc_t * l2sc,struct isdn_l3_driver * drv)556 F_AE06(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
557 {
558 	NDBGL2(L2_F_MSG, "FSM function F_AE06 executing");
559 
560 	i4b_Dcleanifq(&l2sc->i_queue);
561 
562 	l2sc->postfsmarg = l2sc->drv;
563 	l2sc->postfsmfunc = i4b_dl_release_ind;
564 
565 	i4b_T200_stop(l2sc);
566 
567 /*XXX*/	i4b_mdl_assign_ind(l2sc);
568 }
569 
570 /*---------------------------------------------------------------------------*
571  *	FSM state ST_AW_EST event rx'd SABME
572  *---------------------------------------------------------------------------*/
573 static void
F_AE07(l2_softc_t * l2sc,struct isdn_l3_driver * drv)574 F_AE07(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
575 {
576 	NDBGL2(L2_F_MSG, "FSM function F_AE07 executing");
577 	i4b_mdl_status_ind(l2sc->drv, STI_L2STAT, LAYER_ACTIVE);
578 	i4b_tx_ua(l2sc, l2sc->rxd_PF);
579 }
580 
581 /*---------------------------------------------------------------------------*
582  *	FSM state ST_AW_EST event rx'd DISC
583  *---------------------------------------------------------------------------*/
584 static void
F_AE08(l2_softc_t * l2sc,struct isdn_l3_driver * drv)585 F_AE08(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
586 {
587 	NDBGL2(L2_F_MSG, "FSM function F_AE08 executing");
588 	i4b_tx_dm(l2sc, l2sc->rxd_PF);
589 }
590 
591 /*---------------------------------------------------------------------------*
592  *	FSM state ST_AW_EST event rx'd UA
593  *---------------------------------------------------------------------------*/
594 static void
F_AE09(l2_softc_t * l2sc,struct isdn_l3_driver * drv)595 F_AE09(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
596 {
597 	NDBGL2(L2_F_MSG, "FSM function F_AE09 executing");
598 
599 	if(l2sc->rxd_PF == 0)
600 	{
601 		i4b_mdl_error_ind(l2sc, "F_AE09", MDL_ERR_D);
602 		l2sc->Q921_state = ST_AW_EST;
603 	}
604 	else
605 	{
606 		if(l2sc->l3initiated)
607 		{
608 			l2sc->l3initiated = 0;
609 			l2sc->vr = 0;
610 			l2sc->postfsmarg = l2sc->drv;
611 			l2sc->postfsmfunc = i4b_dl_establish_cnf;
612 		}
613 		else
614 		{
615 			if(l2sc->vs != l2sc->va)
616 			{
617 				i4b_Dcleanifq(&l2sc->i_queue);
618 				l2sc->postfsmarg = l2sc->drv;
619 				l2sc->postfsmfunc = i4b_dl_establish_ind;
620 			}
621 		}
622 
623 		i4b_mdl_status_ind(l2sc->drv, STI_L2STAT, LAYER_ACTIVE);
624 
625 		i4b_T200_stop(l2sc);
626 		i4b_T203_start(l2sc);
627 
628 		l2sc->vs = 0;
629 		l2sc->va = 0;
630 
631 		l2sc->Q921_state = ST_MULTIFR;
632 	}
633 }
634 
635 /*---------------------------------------------------------------------------*
636  *	FSM state ST_AW_EST event rx'd DM
637  *---------------------------------------------------------------------------*/
638 static void
F_AE10(l2_softc_t * l2sc,struct isdn_l3_driver * drv)639 F_AE10(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
640 {
641 	NDBGL2(L2_F_MSG, "FSM function F_AE10 executing");
642 
643 	if(l2sc->rxd_PF == 0)
644 	{
645 		l2sc->Q921_state = ST_AW_EST;
646 	}
647 	else
648 	{
649 		i4b_Dcleanifq(&l2sc->i_queue);
650 
651 		l2sc->postfsmarg = l2sc->drv;
652 		l2sc->postfsmfunc = i4b_dl_release_ind;
653 
654 		i4b_T200_stop(l2sc);
655 
656 		l2sc->Q921_state = ST_TEI_ASGD;
657 	}
658 }
659 
660 /*---------------------------------------------------------------------------*
661  *	FSM state ST_AW_EST event T200 expiry
662  *---------------------------------------------------------------------------*/
663 static void
F_AE11(l2_softc_t * l2sc,struct isdn_l3_driver * drv)664 F_AE11(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
665 {
666 	NDBGL2(L2_F_MSG, "FSM function F_AE11 executing");
667 
668 	if(l2sc->RC >= N200)
669 	{
670 		i4b_Dcleanifq(&l2sc->i_queue);
671 
672 		i4b_mdl_error_ind(l2sc, "F_AE11", MDL_ERR_G);
673 
674 		l2sc->postfsmarg = l2sc->drv;
675 		l2sc->postfsmfunc = i4b_dl_release_ind;
676 
677 		l2sc->Q921_state = ST_TEI_ASGD;
678 	}
679 	else
680 	{
681 		l2sc->RC++;
682 
683 		i4b_tx_sabme(l2sc, P1);
684 
685 		i4b_T200_start(l2sc);
686 
687 		l2sc->Q921_state = ST_AW_EST;
688 	}
689 }
690 
691 /*---------------------------------------------------------------------------*
692  *	FSM state ST_AW_EST event dl data request
693  *---------------------------------------------------------------------------*/
694 static void
F_AE12(l2_softc_t * l2sc,struct isdn_l3_driver * drv)695 F_AE12(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
696 {
697 	NDBGL2(L2_F_MSG, "FSM function F_AE12 executing");
698 
699 	if(l2sc->l3initiated == 0)
700 	{
701 		i4b_i_frame_queued_up(l2sc);
702 	}
703 }
704 
705 /*---------------------------------------------------------------------------*
706  *	FSM state ST_AW_REL event persistent deactivation
707  *---------------------------------------------------------------------------*/
708 static void
F_AR05(l2_softc_t * l2sc,struct isdn_l3_driver * drv)709 F_AR05(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
710 {
711 	NDBGL2(L2_F_MSG, "FSM function F_AR05 executing");
712 
713 	l2sc->postfsmarg = l2sc->drv;
714 	l2sc->postfsmfunc = i4b_dl_release_cnf;
715 
716 	i4b_T200_stop(l2sc);
717 }
718 
719 /*---------------------------------------------------------------------------*
720  *	FSM state ST_AW_REL event mdl remove request
721  *---------------------------------------------------------------------------*/
722 static void
F_AR06(l2_softc_t * l2sc,struct isdn_l3_driver * drv)723 F_AR06(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
724 {
725 	NDBGL2(L2_F_MSG, "FSM function F_AR06 executing");
726 
727 	l2sc->postfsmarg = l2sc->drv;
728 	l2sc->postfsmfunc = i4b_dl_release_cnf;
729 
730 	i4b_T200_stop(l2sc);
731 
732 /*XXX*/	i4b_mdl_assign_ind(l2sc);
733 }
734 
735 /*---------------------------------------------------------------------------*
736  *	FSM state ST_AW_REL event rx'd SABME
737  *---------------------------------------------------------------------------*/
738 static void
F_AR07(l2_softc_t * l2sc,struct isdn_l3_driver * drv)739 F_AR07(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
740 {
741 	NDBGL2(L2_F_MSG, "FSM function F_AR07 executing");
742 	i4b_tx_dm(l2sc, l2sc->rxd_PF);
743 }
744 
745 /*---------------------------------------------------------------------------*
746  *	FSM state ST_AW_REL event rx'd DISC
747  *---------------------------------------------------------------------------*/
748 static void
F_AR08(l2_softc_t * l2sc,struct isdn_l3_driver * drv)749 F_AR08(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
750 {
751 	NDBGL2(L2_F_MSG, "FSM function F_AR08 executing");
752 	i4b_mdl_status_ind(l2sc->drv, STI_L2STAT, LAYER_IDLE);
753 	i4b_tx_ua(l2sc, l2sc->rxd_PF);
754 }
755 
756 /*---------------------------------------------------------------------------*
757  *	FSM state ST_AW_REL event rx'd UA
758  *---------------------------------------------------------------------------*/
759 static void
F_AR09(l2_softc_t * l2sc,struct isdn_l3_driver * drv)760 F_AR09(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
761 {
762 	NDBGL2(L2_F_MSG, "FSM function F_AR09 executing");
763 
764 	if(l2sc->rxd_PF)
765 	{
766 		l2sc->postfsmarg = l2sc->drv;
767 		l2sc->postfsmfunc = i4b_dl_release_cnf;
768 
769 		i4b_T200_stop(l2sc);
770 
771 		l2sc->Q921_state = ST_TEI_ASGD;
772 	}
773 	else
774 	{
775 		i4b_mdl_error_ind(l2sc, "F_AR09", MDL_ERR_D);
776 
777 		l2sc->Q921_state = ST_AW_REL;
778 	}
779 }
780 
781 /*---------------------------------------------------------------------------*
782  *	FSM state ST_AW_REL event rx'd DM
783  *---------------------------------------------------------------------------*/
784 static void
F_AR10(l2_softc_t * l2sc,struct isdn_l3_driver * drv)785 F_AR10(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
786 {
787 	NDBGL2(L2_F_MSG, "FSM function F_AR10 executing");
788 
789 	if(l2sc->rxd_PF)
790 	{
791 		l2sc->postfsmarg = l2sc->drv;
792 		l2sc->postfsmfunc = i4b_dl_release_cnf;
793 
794 		i4b_T200_stop(l2sc);
795 
796 		l2sc->Q921_state = ST_TEI_ASGD;
797 	}
798 	else
799 	{
800 		l2sc->Q921_state = ST_AW_REL;
801 	}
802 }
803 
804 /*---------------------------------------------------------------------------*
805  *	FSM state ST_AW_REL event T200 expiry
806  *---------------------------------------------------------------------------*/
807 static void
F_AR11(l2_softc_t * l2sc,struct isdn_l3_driver * drv)808 F_AR11(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
809 {
810 	NDBGL2(L2_F_MSG, "FSM function F_AR11 executing");
811 
812 	if(l2sc->RC >= N200)
813 	{
814 		i4b_mdl_error_ind(l2sc, "F_AR11", MDL_ERR_H);
815 
816 		l2sc->postfsmarg = l2sc->drv;
817 		l2sc->postfsmfunc = i4b_dl_release_cnf;
818 
819 		l2sc->Q921_state = ST_TEI_ASGD;
820 	}
821 	else
822 	{
823 		l2sc->RC++;
824 
825 		i4b_tx_disc(l2sc, P1);
826 
827 		i4b_T200_start(l2sc);
828 
829 		l2sc->Q921_state = ST_AW_REL;
830 	}
831 }
832 
833 /*---------------------------------------------------------------------------*
834  *	FSM state ST_MULTIFR event dl establish request
835  *---------------------------------------------------------------------------*/
836 static void
F_MF01(l2_softc_t * l2sc,struct isdn_l3_driver * drv)837 F_MF01(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
838 {
839 	NDBGL2(L2_F_MSG, "FSM function F_MF01 executing");
840 
841 	i4b_Dcleanifq(&l2sc->i_queue);
842 
843 	i4b_establish_data_link(l2sc);
844 
845 	l2sc->l3initiated = 1;
846 }
847 
848 /*---------------------------------------------------------------------------*
849  *	FSM state ST_MULTIFR event persistent deactivation
850  *---------------------------------------------------------------------------*/
851 static void
F_MF05(l2_softc_t * l2sc,struct isdn_l3_driver * drv)852 F_MF05(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
853 {
854 	NDBGL2(L2_F_MSG, "FSM function F_MF05 executing");
855 
856 	i4b_Dcleanifq(&l2sc->i_queue);
857 
858 	l2sc->postfsmarg = l2sc->drv;
859 	l2sc->postfsmfunc = i4b_dl_release_ind;
860 
861 	i4b_T200_stop(l2sc);
862 	i4b_T203_stop(l2sc);
863 }
864 
865 /*---------------------------------------------------------------------------*
866  *	FSM state ST_MULTIFR event mdl remove request
867  *---------------------------------------------------------------------------*/
868 static void
F_MF06(l2_softc_t * l2sc,struct isdn_l3_driver * drv)869 F_MF06(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
870 {
871 	NDBGL2(L2_F_MSG, "FSM function F_MF06 executing");
872 
873 	i4b_Dcleanifq(&l2sc->i_queue);
874 
875 	l2sc->postfsmarg = l2sc->drv;
876 	l2sc->postfsmfunc = i4b_dl_release_ind;
877 
878 	i4b_T200_stop(l2sc);
879 	i4b_T203_stop(l2sc);
880 
881 /*XXX*/	i4b_mdl_assign_ind(l2sc);
882 }
883 
884 /*---------------------------------------------------------------------------*
885  *	FSM state ST_MULTIFR event rx'd SABME
886  *---------------------------------------------------------------------------*/
887 static void
F_MF07(l2_softc_t * l2sc,struct isdn_l3_driver * drv)888 F_MF07(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
889 {
890 	NDBGL2(L2_F_MSG, "FSM function F_MF07 executing");
891 
892 	i4b_clear_exception_conditions(l2sc);
893 
894 	i4b_mdl_status_ind(l2sc->drv, STI_L2STAT, LAYER_ACTIVE);
895 
896 	i4b_tx_ua(l2sc, l2sc->rxd_PF);
897 
898 	i4b_mdl_error_ind(l2sc, "F_MF07", MDL_ERR_F);
899 
900 	if(l2sc->vs != l2sc->va)
901 	{
902 		i4b_Dcleanifq(&l2sc->i_queue);
903 
904 		l2sc->postfsmarg = l2sc->drv;
905 		l2sc->postfsmfunc = i4b_dl_establish_ind;
906 	}
907 
908 	i4b_T200_stop(l2sc);
909 	i4b_T203_start(l2sc);
910 
911 	l2sc->vs = 0;
912 	l2sc->va = 0;
913 	l2sc->vr = 0;
914 }
915 
916 /*---------------------------------------------------------------------------*
917  *	FSM state ST_MULTIFR event rx'd DISC
918  *---------------------------------------------------------------------------*/
919 static void
F_MF08(l2_softc_t * l2sc,struct isdn_l3_driver * drv)920 F_MF08(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
921 {
922 	NDBGL2(L2_F_MSG, "FSM function F_MF08 executing");
923 
924 	i4b_Dcleanifq(&l2sc->i_queue);
925 	i4b_mdl_status_ind(l2sc->drv, STI_L2STAT, LAYER_IDLE);
926 	i4b_tx_ua(l2sc, l2sc->rxd_PF);
927 
928 	l2sc->postfsmarg = l2sc->drv;
929 	l2sc->postfsmfunc = i4b_dl_release_ind;
930 
931 	i4b_T200_stop(l2sc);
932 	i4b_T203_stop(l2sc);
933 }
934 
935 /*---------------------------------------------------------------------------*
936  *	FSM state ST_MULTIFR event rx'd UA
937  *---------------------------------------------------------------------------*/
938 static void
F_MF09(l2_softc_t * l2sc,struct isdn_l3_driver * drv)939 F_MF09(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
940 {
941 	NDBGL2(L2_F_MSG, "FSM function F_MF09 executing");
942 	if(l2sc->rxd_PF)
943 		i4b_mdl_error_ind(l2sc, "F_MF09", MDL_ERR_C);
944 	else
945 		i4b_mdl_error_ind(l2sc, "F_MF09", MDL_ERR_D);
946 }
947 
948 /*---------------------------------------------------------------------------*
949  *	FSM state ST_MULTIFR event rx'd DM
950  *---------------------------------------------------------------------------*/
951 static void
F_MF10(l2_softc_t * l2sc,struct isdn_l3_driver * drv)952 F_MF10(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
953 {
954 	NDBGL2(L2_F_MSG, "FSM function F_MF10 executing");
955 
956 	if(l2sc->rxd_PF)
957 	{
958 		i4b_mdl_error_ind(l2sc, "F_MF10", MDL_ERR_B);
959 
960 		l2sc->Q921_state = ST_MULTIFR;
961 	}
962 	else
963 	{
964 		i4b_mdl_error_ind(l2sc, "F_MF10", MDL_ERR_E);
965 
966 		i4b_establish_data_link(l2sc);
967 
968 		l2sc->l3initiated = 0;
969 
970 		l2sc->Q921_state = ST_AW_EST;
971 	}
972 }
973 
974 /*---------------------------------------------------------------------------*
975  *	FSM state ST_MULTIFR event T200 expiry
976  *---------------------------------------------------------------------------*/
977 static void
F_MF11(l2_softc_t * l2sc,struct isdn_l3_driver * drv)978 F_MF11(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
979 {
980 	NDBGL2(L2_F_MSG, "FSM function F_MF11 executing");
981 
982 	l2sc->RC = 0;
983 
984 	i4b_transmit_enquire(l2sc);
985 
986 	l2sc->RC++;
987 }
988 
989 /*---------------------------------------------------------------------------*
990  *	FSM state ST_MULTIFR event dl data request
991  *---------------------------------------------------------------------------*/
992 static void
F_MF12(l2_softc_t * l2sc,struct isdn_l3_driver * drv)993 F_MF12(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
994 {
995 	NDBGL2(L2_F_MSG, "FSM function F_MF12 executing");
996 
997 	i4b_i_frame_queued_up(l2sc);
998 }
999 
1000 /*---------------------------------------------------------------------------*
1001  *	FSM state ST_MULTIFR event dl release request
1002  *---------------------------------------------------------------------------*/
1003 static void
F_MF13(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1004 F_MF13(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1005 {
1006 	NDBGL2(L2_F_MSG, "FSM function F_MF13 executing");
1007 
1008 	i4b_Dcleanifq(&l2sc->i_queue);
1009 
1010 	l2sc->RC = 0;
1011 
1012 	i4b_tx_disc(l2sc, P1);
1013 
1014 	i4b_T203_stop(l2sc);
1015 	i4b_T200_restart(l2sc);
1016 }
1017 
1018 /*---------------------------------------------------------------------------*
1019  *	FSM state ST_MULTIFR event T203 expiry
1020  *---------------------------------------------------------------------------*/
1021 static void
F_MF14(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1022 F_MF14(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1023 {
1024 	NDBGL2(L2_F_MSG, "FSM function F_MF14 executing");
1025 
1026 	i4b_transmit_enquire(l2sc);
1027 
1028 	l2sc->RC = 0;
1029 }
1030 
1031 /*---------------------------------------------------------------------------*
1032  *	FSM state ST_MULTIFR event set own rx busy
1033  *---------------------------------------------------------------------------*/
1034 static void
F_MF15(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1035 F_MF15(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1036 {
1037 	NDBGL2(L2_F_MSG, "FSM function F_MF15 executing");
1038 
1039 	if(l2sc->own_busy == 0)
1040 	{
1041 		l2sc->own_busy = 1;
1042 
1043 		i4b_tx_rnr_response(l2sc, F0); /* wrong in Q.921 03/93 p 64 */
1044 
1045 		l2sc->ack_pend = 0;
1046 	}
1047 }
1048 
1049 /*---------------------------------------------------------------------------*
1050  *	FSM state ST_MULTIFR event clear own rx busy
1051  *---------------------------------------------------------------------------*/
1052 static void
F_MF16(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1053 F_MF16(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1054 {
1055 	NDBGL2(L2_F_MSG, "FSM function F_MF16 executing");
1056 
1057 	if(l2sc->own_busy != 0)
1058 	{
1059 		l2sc->own_busy = 0;
1060 
1061 		i4b_tx_rr_response(l2sc, F0); /* wrong in Q.921 03/93 p 64 */
1062 
1063 		l2sc->ack_pend = 0;
1064 	}
1065 }
1066 
1067 /*---------------------------------------------------------------------------*
1068  *	FSM state ST_MULTIFR event rx'd RR
1069  *---------------------------------------------------------------------------*/
1070 static void
F_MF17(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1071 F_MF17(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1072 {
1073 	NDBGL2(L2_F_MSG, "FSM function F_MF17 executing");
1074 
1075 	l2sc->peer_busy = 0;
1076 
1077 	if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1078 	{
1079 		if(l2sc->rxd_PF == 1)
1080 		{
1081 			i4b_enquiry_response(l2sc);
1082 		}
1083 	}
1084 	else
1085 	{
1086 		if(l2sc->rxd_PF == 1)
1087 		{
1088 			i4b_mdl_error_ind(l2sc, "F_MF17", MDL_ERR_A);
1089 		}
1090 	}
1091 
1092 	if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1093 	{
1094 		if(l2sc->rxd_NR == l2sc->vs)
1095 		{
1096 			l2sc->va = l2sc->rxd_NR;
1097 			i4b_T200_stop(l2sc);
1098 			i4b_T203_restart(l2sc);
1099 		}
1100 		else if(l2sc->rxd_NR != l2sc->va)
1101 		{
1102 			l2sc->va = l2sc->rxd_NR;
1103 			i4b_T200_restart(l2sc);
1104 		}
1105 		l2sc->Q921_state = ST_MULTIFR;
1106 	}
1107 	else
1108 	{
1109 		i4b_nr_error_recovery(l2sc);
1110 		l2sc->Q921_state = ST_AW_EST;
1111 	}
1112 }
1113 
1114 /*---------------------------------------------------------------------------*
1115  *	FSM state ST_MULTIFR event rx'd REJ
1116  *---------------------------------------------------------------------------*/
1117 static void
F_MF18(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1118 F_MF18(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1119 {
1120 	NDBGL2(L2_F_MSG, "FSM function F_MF18 executing");
1121 
1122 	l2sc->peer_busy = 0;
1123 
1124 	if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1125 	{
1126 		if(l2sc->rxd_PF == 1)
1127 		{
1128 			i4b_enquiry_response(l2sc);
1129 		}
1130 	}
1131 	else
1132 	{
1133 		if(l2sc->rxd_PF == 1)
1134 		{
1135 			i4b_mdl_error_ind(l2sc, "F_MF18", MDL_ERR_A);
1136 		}
1137 	}
1138 
1139 	if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1140 	{
1141 		l2sc->va = l2sc->rxd_NR;
1142 		i4b_T200_stop(l2sc);
1143 		i4b_T203_start(l2sc);
1144 		i4b_invoke_retransmission(l2sc, l2sc->rxd_NR);
1145 		l2sc->Q921_state = ST_MULTIFR;
1146 	}
1147 	else
1148 	{
1149 		i4b_nr_error_recovery(l2sc);
1150 		l2sc->Q921_state = ST_AW_EST;
1151 	}
1152 }
1153 
1154 /*---------------------------------------------------------------------------*
1155  *	FSM state ST_MULTIFR event rx'd RNR
1156  *---------------------------------------------------------------------------*/
1157 static void
F_MF19(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1158 F_MF19(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1159 {
1160 	NDBGL2(L2_F_MSG, "FSM function F_MF19 executing");
1161 
1162 	l2sc->peer_busy = 1;
1163 
1164 	if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1165 	{
1166 		if(l2sc->rxd_PF == 1)
1167 		{
1168 			i4b_enquiry_response(l2sc);
1169 		}
1170 	}
1171 	else
1172 	{
1173 		if(l2sc->rxd_PF == 1)
1174 		{
1175 			i4b_mdl_error_ind(l2sc, "F_MF19", MDL_ERR_A);
1176                 }
1177         }
1178 
1179 	if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1180         {
1181                 l2sc->va = l2sc->rxd_NR;
1182                 i4b_T203_stop(l2sc);
1183                 i4b_T200_restart(l2sc);
1184 		l2sc->Q921_state = ST_MULTIFR;
1185         }
1186         else
1187         {
1188                 i4b_nr_error_recovery(l2sc);
1189 		l2sc->Q921_state = ST_AW_EST;
1190         }
1191 }
1192 
1193 /*---------------------------------------------------------------------------*
1194  *	FSM state ST_MULTIFR event rx'd FRMR
1195  *---------------------------------------------------------------------------*/
1196 static void
F_MF20(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1197 F_MF20(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1198 {
1199 	NDBGL2(L2_F_MSG, "FSM function F_MF20 executing");
1200 
1201 	i4b_mdl_error_ind(l2sc, "F_MF20", MDL_ERR_K);
1202 
1203 	i4b_establish_data_link(l2sc);
1204 
1205 	l2sc->l3initiated = 0;
1206 }
1207 
1208 /*---------------------------------------------------------------------------*
1209  *	FSM state ST_TIMREC event dl establish request
1210  *---------------------------------------------------------------------------*/
1211 static void
F_TR01(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1212 F_TR01(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1213 {
1214 	NDBGL2(L2_F_MSG, "FSM function F_TR01 executing");
1215 
1216 	i4b_Dcleanifq(&l2sc->i_queue);
1217 
1218 	i4b_establish_data_link(l2sc);
1219 
1220 	l2sc->l3initiated = 1;
1221 }
1222 
1223 /*---------------------------------------------------------------------------*
1224  *	FSM state ST_TIMREC event persistent deactivation
1225  *---------------------------------------------------------------------------*/
1226 static void
F_TR05(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1227 F_TR05(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1228 {
1229 	NDBGL2(L2_F_MSG, "FSM function F_TR05 executing");
1230 
1231 	i4b_Dcleanifq(&l2sc->i_queue);
1232 
1233 	l2sc->postfsmarg = l2sc->drv;
1234 	l2sc->postfsmfunc = i4b_dl_release_ind;
1235 
1236 	i4b_T200_stop(l2sc);
1237 }
1238 
1239 /*---------------------------------------------------------------------------*
1240  *	FSM state ST_TIMREC event mdl remove request
1241  *---------------------------------------------------------------------------*/
1242 static void
F_TR06(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1243 F_TR06(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1244 {
1245 	NDBGL2(L2_F_MSG, "FSM function F_TR06 executing");
1246 
1247 	i4b_Dcleanifq(&l2sc->i_queue);
1248 
1249 	l2sc->postfsmarg = l2sc->drv;
1250 	l2sc->postfsmfunc = i4b_dl_release_ind;
1251 
1252 	i4b_T200_stop(l2sc);
1253 
1254 /*XXX*/	i4b_mdl_assign_ind(l2sc);
1255 }
1256 
1257 /*---------------------------------------------------------------------------*
1258  *	FSM state ST_TIMREC event rx'd SABME
1259  *---------------------------------------------------------------------------*/
1260 static void
F_TR07(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1261 F_TR07(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1262 {
1263 	NDBGL2(L2_F_MSG, "FSM function F_TR07 executing");
1264 
1265 	i4b_clear_exception_conditions(l2sc);
1266 
1267 	i4b_mdl_status_ind(l2sc->drv, STI_L2STAT, LAYER_ACTIVE);
1268 
1269 	i4b_tx_ua(l2sc, l2sc->rxd_PF);
1270 
1271 	i4b_mdl_error_ind(l2sc, "F_TR07", MDL_ERR_F);
1272 
1273 	if(l2sc->vs != l2sc->va)
1274 	{
1275 		i4b_Dcleanifq(&l2sc->i_queue);
1276 
1277 		l2sc->postfsmarg = l2sc->drv;
1278 		l2sc->postfsmfunc = i4b_dl_establish_ind;
1279 	}
1280 
1281 	i4b_T200_stop(l2sc);
1282 	i4b_T203_start(l2sc);
1283 
1284 	l2sc->vs = 0;
1285 	l2sc->va = 0;
1286 	l2sc->vr = 0;
1287 }
1288 
1289 /*---------------------------------------------------------------------------*
1290  *	FSM state ST_TIMREC event rx'd DISC
1291  *---------------------------------------------------------------------------*/
1292 static void
F_TR08(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1293 F_TR08(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1294 {
1295 	NDBGL2(L2_F_MSG, "FSM function F_TR08 executing");
1296 
1297 	i4b_Dcleanifq(&l2sc->i_queue);
1298 	i4b_mdl_status_ind(drv, STI_L2STAT, LAYER_IDLE);
1299 	i4b_tx_ua(l2sc, l2sc->rxd_PF);
1300 
1301 	l2sc->postfsmarg = drv;
1302 	l2sc->postfsmfunc = i4b_dl_release_ind;
1303 
1304 	i4b_T200_stop(l2sc);
1305 }
1306 
1307 /*---------------------------------------------------------------------------*
1308  *	FSM state ST_TIMREC event rx'd UA
1309  *---------------------------------------------------------------------------*/
1310 static void
F_TR09(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1311 F_TR09(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1312 {
1313 	NDBGL2(L2_F_MSG, "FSM function F_TR09 executing");
1314 	if(l2sc->rxd_PF)
1315 		i4b_mdl_error_ind(l2sc, "F_TR09", MDL_ERR_C);
1316 	else
1317 		i4b_mdl_error_ind(l2sc, "F_TR09", MDL_ERR_D);
1318 }
1319 
1320 /*---------------------------------------------------------------------------*
1321  *	FSM state ST_TIMREC event rx'd DM
1322  *---------------------------------------------------------------------------*/
1323 static void
F_TR10(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1324 F_TR10(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1325 {
1326 	NDBGL2(L2_F_MSG, "FSM function F_TR10 executing");
1327 
1328 	if(l2sc->rxd_PF)
1329 	{
1330 		i4b_mdl_error_ind(l2sc, "F_TR10", MDL_ERR_B);
1331 	}
1332 	else
1333 	{
1334 		i4b_mdl_error_ind(l2sc, "F_TR10", MDL_ERR_E);
1335 	}
1336 
1337 	i4b_establish_data_link(l2sc);
1338 
1339 	l2sc->l3initiated = 0;
1340 }
1341 
1342 /*---------------------------------------------------------------------------*
1343  *	FSM state ST_TIMREC event T200 expiry
1344  *---------------------------------------------------------------------------*/
1345 static void
F_TR11(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1346 F_TR11(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1347 {
1348 	NDBGL2(L2_F_MSG, "FSM function F_TR11 executing");
1349 
1350 	if(l2sc->RC >= N200)
1351 	{
1352 		i4b_mdl_error_ind(l2sc, "F_TR11", MDL_ERR_I);
1353 
1354 		i4b_establish_data_link(l2sc);
1355 
1356 		l2sc->l3initiated = 0;
1357 
1358 		l2sc->Q921_state = ST_AW_EST;
1359 	}
1360 	else
1361 	{
1362 		i4b_transmit_enquire(l2sc);
1363 
1364 		l2sc->RC++;
1365 
1366 		l2sc->Q921_state = ST_TIMREC;
1367 	}
1368 }
1369 
1370 /*---------------------------------------------------------------------------*
1371  *	FSM state ST_TIMREC event dl data request
1372  *---------------------------------------------------------------------------*/
1373 static void
F_TR12(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1374 F_TR12(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1375 {
1376 	NDBGL2(L2_F_MSG, "FSM function F_TR12 executing");
1377 
1378 	i4b_i_frame_queued_up(l2sc);
1379 }
1380 
1381 /*---------------------------------------------------------------------------*
1382  *	FSM state ST_TIMREC event dl release request
1383  *---------------------------------------------------------------------------*/
1384 static void
F_TR13(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1385 F_TR13(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1386 {
1387 	NDBGL2(L2_F_MSG, "FSM function F_TR13 executing");
1388 
1389 	i4b_Dcleanifq(&l2sc->i_queue);
1390 
1391 	l2sc->RC = 0;
1392 
1393 	i4b_tx_disc(l2sc, P1);
1394 
1395 	i4b_T200_restart(l2sc);
1396 }
1397 
1398 /*---------------------------------------------------------------------------*
1399  *	FSM state ST_TIMREC event set own rx busy
1400  *---------------------------------------------------------------------------*/
1401 static void
F_TR15(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1402 F_TR15(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1403 {
1404 	NDBGL2(L2_F_MSG, "FSM function F_TR15 executing");
1405 
1406 	if(l2sc->own_busy == 0)
1407 	{
1408 		l2sc->own_busy = 1;
1409 
1410 		i4b_tx_rnr_response(l2sc, F0);
1411 
1412 		l2sc->ack_pend = 0;
1413 	}
1414 }
1415 
1416 /*---------------------------------------------------------------------------*
1417  *	FSM state ST_TIMREC event clear own rx busy
1418  *---------------------------------------------------------------------------*/
1419 static void
F_TR16(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1420 F_TR16(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1421 {
1422 	NDBGL2(L2_F_MSG, "FSM function F_TR16 executing");
1423 
1424 	if(l2sc->own_busy != 0)
1425 	{
1426 		l2sc->own_busy = 0;
1427 
1428 		i4b_tx_rr_response(l2sc, F0);	/* this is wrong	 */
1429 						/* in Q.921 03/93 p 74 ! */
1430 		l2sc->ack_pend = 0;
1431 	}
1432 }
1433 
1434 /*---------------------------------------------------------------------------*
1435  *	FSM state ST_TIMREC event rx'd RR
1436  *---------------------------------------------------------------------------*/
1437 static void
F_TR17(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1438 F_TR17(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1439 {
1440 	NDBGL2(L2_F_MSG, "FSM function F_TR17 executing");
1441 
1442 	l2sc->peer_busy = 0;
1443 
1444 	if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1445 	{
1446 		if(l2sc->rxd_PF == 1)
1447 		{
1448 			i4b_enquiry_response(l2sc);
1449 		}
1450 	}
1451 	else
1452 	{
1453 		if(l2sc->rxd_PF == 1)
1454 		{
1455 			if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1456 			{
1457 				l2sc->va = l2sc->rxd_NR;
1458 				i4b_T200_stop(l2sc);
1459 				i4b_T203_start(l2sc);
1460 				i4b_invoke_retransmission(l2sc, l2sc->rxd_NR);
1461 				l2sc->Q921_state = ST_MULTIFR;
1462 				return;
1463 			}
1464 			else
1465 			{
1466 				i4b_nr_error_recovery(l2sc);
1467 				l2sc->Q921_state = ST_AW_EST;
1468 				return;
1469 			}
1470 		}
1471 	}
1472 
1473 	if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1474 	{
1475 		l2sc->va = l2sc->rxd_NR;
1476 		l2sc->Q921_state = ST_TIMREC;
1477 	}
1478 	else
1479 	{
1480 		i4b_nr_error_recovery(l2sc);
1481 		l2sc->Q921_state = ST_AW_EST;
1482 	}
1483 }
1484 
1485 /*---------------------------------------------------------------------------*
1486  *	FSM state ST_TIMREC event
1487  *---------------------------------------------------------------------------*/
1488 static void
F_TR18(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1489 F_TR18(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1490 {
1491 	NDBGL2(L2_F_MSG, "FSM function F_TR18 executing");
1492 
1493 	l2sc->peer_busy = 0;
1494 
1495 	if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1496 	{
1497 		if(l2sc->rxd_PF == 1)
1498 		{
1499 			i4b_enquiry_response(l2sc);
1500 		}
1501 	}
1502 	else
1503 	{
1504 		if(l2sc->rxd_PF == 1)
1505 		{
1506 			if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1507 			{
1508 				l2sc->va = l2sc->rxd_NR;
1509 				i4b_T200_stop(l2sc);
1510 				i4b_T203_start(l2sc);
1511 				i4b_invoke_retransmission(l2sc, l2sc->rxd_NR);
1512 				l2sc->Q921_state = ST_MULTIFR;
1513 				return;
1514 			}
1515 			else
1516 			{
1517 				i4b_nr_error_recovery(l2sc);
1518 				l2sc->Q921_state = ST_AW_EST;
1519 				return;
1520 			}
1521 		}
1522 	}
1523 
1524 	if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1525 	{
1526 		l2sc->va = l2sc->rxd_NR;
1527 		l2sc->Q921_state = ST_TIMREC;
1528 	}
1529 	else
1530 	{
1531 		i4b_nr_error_recovery(l2sc);
1532 		l2sc->Q921_state = ST_AW_EST;
1533 	}
1534 }
1535 
1536 /*---------------------------------------------------------------------------*
1537  *	FSM state ST_TIMREC event rx'd RNR
1538  *---------------------------------------------------------------------------*/
1539 static void
F_TR19(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1540 F_TR19(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1541 {
1542 	NDBGL2(L2_F_MSG, "FSM function F_TR19 executing");
1543 
1544 	l2sc->peer_busy = 0;
1545 
1546 	if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1547 	{
1548 		if(l2sc->rxd_PF == 1)
1549 		{
1550 			i4b_enquiry_response(l2sc);
1551 		}
1552 	}
1553 	else
1554 	{
1555 		if(l2sc->rxd_PF == 1)
1556 		{
1557 			if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1558 			{
1559 				l2sc->va = l2sc->rxd_NR;
1560 				i4b_T200_restart(l2sc);
1561 				i4b_invoke_retransmission(l2sc, l2sc->rxd_NR);
1562 				l2sc->Q921_state = ST_MULTIFR;
1563 				return;
1564 			}
1565 			else
1566 			{
1567 				i4b_nr_error_recovery(l2sc);
1568 				l2sc->Q921_state = ST_AW_EST;
1569 				return;
1570 			}
1571 		}
1572 	}
1573 
1574 	if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1575 	{
1576 		l2sc->va = l2sc->rxd_NR;
1577 		l2sc->Q921_state = ST_TIMREC;
1578 	}
1579 	else
1580 	{
1581 		i4b_nr_error_recovery(l2sc);
1582 		l2sc->Q921_state = ST_AW_EST;
1583 	}
1584 }
1585 
1586 /*---------------------------------------------------------------------------*
1587  *	FSM state ST_TIMREC event rx'd FRMR
1588  *---------------------------------------------------------------------------*/
1589 static void
F_TR20(l2_softc_t * l2sc,struct isdn_l3_driver * drv)1590 F_TR20(l2_softc_t *l2sc, struct isdn_l3_driver *drv)
1591 {
1592 	NDBGL2(L2_F_MSG, "FSM function F_TR20 executing");
1593 
1594 	i4b_mdl_error_ind(l2sc, "F_TR20", MDL_ERR_K);
1595 
1596 	i4b_establish_data_link(l2sc);
1597 
1598 	l2sc->l3initiated = 0;
1599 }
1600 
1601 #endif /* NI4BQ921 > 0 */
1602