2 * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 *---------------------------------------------------------------------------
27 * i4b_l2fsm.c - layer 2 FSM
28 * -------------------------
30 * $Id: i4b_l2fsm.c,v 1.22 2000/08/24 11:48:58 hm Exp $
32 * $FreeBSD: src/sys/i4b/layer2/i4b_l2fsm.c,v 1.6.2.1 2001/08/10 14:08:41 obrien Exp $
33 * $DragonFly: src/sys/net/i4b/layer2/i4b_l2fsm.c,v 1.7 2006/01/14 11:05:18 swildner Exp $
35 * last edit-date: [Tue May 30 15:48:20 2000]
37 *---------------------------------------------------------------------------*/
39 #include "use_i4bq921.h"
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/socket.h>
47 #include <net/i4b/include/machine/i4b_debug.h>
48 #include <net/i4b/include/machine/i4b_ioctl.h>
50 #include "../include/i4b_global.h"
51 #include "../include/i4b_l2l3.h"
52 #include "../include/i4b_mbuf.h"
55 #include "i4b_l2fsm.h"
57 l2_softc_t l2_softc[MAXL1UNITS];
60 static char *l2state_text[N_STATES] = {
75 static char *l2event_text[N_EVENTS] = {
100 static void F_TU01 (l2_softc_t *);
101 static void F_TU03 (l2_softc_t *);
103 static void F_TA03 (l2_softc_t *);
104 static void F_TA04 (l2_softc_t *);
105 static void F_TA05 (l2_softc_t *);
107 static void F_TE03 (l2_softc_t *);
108 static void F_TE04 (l2_softc_t *);
109 static void F_TE05 (l2_softc_t *);
111 static void F_T01 (l2_softc_t *);
112 static void F_T05 (l2_softc_t *);
113 static void F_T06 (l2_softc_t *);
114 static void F_T07 (l2_softc_t *);
115 static void F_T08 (l2_softc_t *);
116 static void F_T09 (l2_softc_t *);
117 static void F_T10 (l2_softc_t *);
118 static void F_T13 (l2_softc_t *);
120 static void F_AE01 (l2_softc_t *);
121 static void F_AE05 (l2_softc_t *);
122 static void F_AE06 (l2_softc_t *);
123 static void F_AE07 (l2_softc_t *);
124 static void F_AE08 (l2_softc_t *);
125 static void F_AE09 (l2_softc_t *);
126 static void F_AE10 (l2_softc_t *);
127 static void F_AE11 (l2_softc_t *);
128 static void F_AE12 (l2_softc_t *);
130 static void F_AR05 (l2_softc_t *);
131 static void F_AR06 (l2_softc_t *);
132 static void F_AR07 (l2_softc_t *);
133 static void F_AR08 (l2_softc_t *);
134 static void F_AR09 (l2_softc_t *);
135 static void F_AR10 (l2_softc_t *);
136 static void F_AR11 (l2_softc_t *);
138 static void F_MF01 (l2_softc_t *);
139 static void F_MF05 (l2_softc_t *);
140 static void F_MF06 (l2_softc_t *);
141 static void F_MF07 (l2_softc_t *);
142 static void F_MF08 (l2_softc_t *);
143 static void F_MF09 (l2_softc_t *);
144 static void F_MF10 (l2_softc_t *);
145 static void F_MF11 (l2_softc_t *);
146 static void F_MF12 (l2_softc_t *);
147 static void F_MF13 (l2_softc_t *);
148 static void F_MF14 (l2_softc_t *);
149 static void F_MF15 (l2_softc_t *);
150 static void F_MF16 (l2_softc_t *);
151 static void F_MF17 (l2_softc_t *);
152 static void F_MF18 (l2_softc_t *);
153 static void F_MF19 (l2_softc_t *);
154 static void F_MF20 (l2_softc_t *);
156 static void F_TR01 (l2_softc_t *);
157 static void F_TR05 (l2_softc_t *);
158 static void F_TR06 (l2_softc_t *);
159 static void F_TR07 (l2_softc_t *);
160 static void F_TR08 (l2_softc_t *);
161 static void F_TR09 (l2_softc_t *);
162 static void F_TR10 (l2_softc_t *);
163 static void F_TR11 (l2_softc_t *);
164 static void F_TR12 (l2_softc_t *);
165 static void F_TR13 (l2_softc_t *);
166 static void F_TR15 (l2_softc_t *);
167 static void F_TR16 (l2_softc_t *);
168 static void F_TR17 (l2_softc_t *);
169 static void F_TR18 (l2_softc_t *);
170 static void F_TR19 (l2_softc_t *);
171 static void F_TR20 (l2_softc_t *);
172 static void F_ILL (l2_softc_t *);
173 static void F_NCNA (l2_softc_t *);
175 /*---------------------------------------------------------------------------*
176 * FSM illegal state default action
177 *---------------------------------------------------------------------------*/
179 F_ILL(l2_softc_t *l2sc)
181 NDBGL2(L2_F_ERR, "FSM function F_ILL executing");
184 /*---------------------------------------------------------------------------*
185 * FSM No change, No action
186 *---------------------------------------------------------------------------*/
188 F_NCNA(l2_softc_t *l2sc)
190 NDBGL2(L2_F_MSG, "FSM function F_NCNA executing");
193 /*---------------------------------------------------------------------------*
194 * layer 2 state transition table
195 *---------------------------------------------------------------------------*/
197 void (*func) (l2_softc_t *); /* function to execute */
198 int newstate; /* next state */
199 } l2state_tab[N_EVENTS][N_STATES] = {
201 /* 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 */
202 /* -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
203 /*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} },
204 /*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} },
205 /*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} },
206 /*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} },
207 /*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} },
208 /*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} },
209 /*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} },
210 /*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} },
211 /*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} },
212 /*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} },
213 /*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} },
214 /*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} },
215 /*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} },
216 /*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} },
217 /*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} },
218 /*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} },
219 /*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} },
220 /*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} },
221 /*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} },
222 /*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} },
223 /*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} }
226 /*---------------------------------------------------------------------------*
227 * event handler, executes function and sets new state
228 *---------------------------------------------------------------------------*/
230 i4b_next_l2state(l2_softc_t *l2sc, int event)
232 int currstate, newstate;
233 int (*savpostfsmfunc)(int) = NULL;
235 /* check event number */
237 panic("i4b_l2fsm.c: event > N_EVENTS\n");
239 /* get current state and check it */
240 if((currstate = l2sc->Q921_state) > N_STATES) /* failsafe */
241 panic("i4b_l2fsm.c: currstate > N_STATES\n");
243 /* get new state and check it */
244 if((newstate = l2state_tab[event][currstate].newstate) > N_STATES)
245 panic("i4b_l2fsm.c: newstate > N_STATES\n");
248 if(newstate != ST_SUBSET)
249 { /* state function does NOT set new state */
250 NDBGL2(L2_F_MSG, "FSM event [%s]: [%s/%d => %s/%d]",
252 l2state_text[currstate], currstate,
253 l2state_text[newstate], newstate);
256 /* execute state transition function */
257 (*l2state_tab[event][currstate].func)(l2sc);
259 if(newstate == ST_SUBSET)
260 { /* state function DOES set new state */
261 NDBGL2(L2_F_MSG, "FSM S-event [%s]: [%s => %s]", l2event_text[event],
262 l2state_text[currstate],
263 l2state_text[l2sc->Q921_state]);
266 /* check for illegal new state */
268 if(newstate == ST_ILL)
270 newstate = currstate;
271 NDBGL2(L2_F_ERR, "FSM illegal state, state = %s, event = %s!",
272 l2state_text[currstate],
273 l2event_text[event]);
276 /* check if state machine function has to set new state */
278 if(newstate != ST_SUBSET)
279 l2sc->Q921_state = newstate; /* no, we set new state */
281 if(l2sc->postfsmfunc != NULL)
283 NDBGL2(L2_F_MSG, "FSM executing postfsmfunc!");
284 /* try to avoid an endless loop */
285 savpostfsmfunc = l2sc->postfsmfunc;
286 l2sc->postfsmfunc = NULL;
287 (*savpostfsmfunc)(l2sc->postfsmarg);
292 /*---------------------------------------------------------------------------*
293 * return pointer to current state description
294 *---------------------------------------------------------------------------*/
296 i4b_print_l2state(l2_softc_t *l2sc)
298 return((char *) l2state_text[l2sc->Q921_state]);
302 /*---------------------------------------------------------------------------*
303 * FSM state ST_TEI_UNAS event dl establish request
304 *---------------------------------------------------------------------------*/
306 F_TU01(l2_softc_t *l2sc)
308 NDBGL2(L2_F_MSG, "FSM function F_TU01 executing");
309 i4b_mdl_assign_ind(l2sc);
312 /*---------------------------------------------------------------------------*
313 * FSM state ST_TEI_UNAS event mdl assign request
314 *---------------------------------------------------------------------------*/
316 F_TU03(l2_softc_t *l2sc)
318 NDBGL2(L2_F_MSG, "FSM function F_TU03 executing");
321 /*---------------------------------------------------------------------------*
322 * FSM state ST_ASG_AW_TEI event mdl assign request
323 *---------------------------------------------------------------------------*/
325 F_TA03(l2_softc_t *l2sc)
327 NDBGL2(L2_F_MSG, "FSM function F_TA03 executing");
330 /*---------------------------------------------------------------------------*
331 * FSM state ST_ASG_AW_TEI event mdl error response
332 *---------------------------------------------------------------------------*/
334 F_TA04(l2_softc_t *l2sc)
336 NDBGL2(L2_F_MSG, "FSM function F_TA04 executing");
339 /*---------------------------------------------------------------------------*
340 * FSM state ST_ASG_AW_TEI event persistent deactivation
341 *---------------------------------------------------------------------------*/
343 F_TA05(l2_softc_t *l2sc)
345 NDBGL2(L2_F_MSG, "FSM function F_TA05 executing");
348 /*---------------------------------------------------------------------------*
349 * FSM state ST_EST_AW_TEI event mdl assign request
350 *---------------------------------------------------------------------------*/
352 F_TE03(l2_softc_t *l2sc)
354 NDBGL2(L2_F_MSG, "FSM function F_TE03 executing");
355 i4b_establish_data_link(l2sc);
356 l2sc->l3initiated = 1;
359 /*---------------------------------------------------------------------------*
360 * FSM state ST_EST_AW_TEI event mdl error response
361 *---------------------------------------------------------------------------*/
363 F_TE04(l2_softc_t *l2sc)
365 NDBGL2(L2_F_MSG, "FSM function F_TE04 executing");
366 l2sc->postfsmarg = l2sc->unit;
367 l2sc->postfsmfunc = DL_Rel_Ind_A;
370 /*---------------------------------------------------------------------------*
371 * FSM state ST_EST_AW_TEI event persistent deactivation
372 *---------------------------------------------------------------------------*/
374 F_TE05(l2_softc_t *l2sc)
376 NDBGL2(L2_F_MSG, "FSM function F_TE05 executing");
377 l2sc->postfsmarg = l2sc->unit;
378 l2sc->postfsmfunc = DL_Rel_Ind_A;
381 /*---------------------------------------------------------------------------*
382 * FSM state ST_TEI_ASGD event dl establish request
383 *---------------------------------------------------------------------------*/
385 F_T01(l2_softc_t *l2sc)
387 NDBGL2(L2_F_MSG, "FSM function F_T01 executing");
388 i4b_establish_data_link(l2sc);
389 l2sc->l3initiated = 1;
392 /*---------------------------------------------------------------------------*
393 * FSM state ST_TEI_ASGD event persistent deactivation
394 *---------------------------------------------------------------------------*/
396 F_T05(l2_softc_t *l2sc)
398 NDBGL2(L2_F_MSG, "FSM function F_T05 executing");
401 /*---------------------------------------------------------------------------*
402 * FSM state ST_TEI_ASGD event mdl remove request
403 *---------------------------------------------------------------------------*/
405 F_T06(l2_softc_t *l2sc)
407 NDBGL2(L2_F_MSG, "FSM function F_T06 executing");
408 /*XXX*/ i4b_mdl_assign_ind(l2sc);
411 /*---------------------------------------------------------------------------*
412 * FSM state ST_TEI_ASGD event rx'd SABME
413 *---------------------------------------------------------------------------*/
415 F_T07(l2_softc_t *l2sc)
417 NDBGL2(L2_F_MSG, "FSM function F_T07 executing");
421 if(NOT able to establish)
423 i4b_tx_dm(l2sc, l2sc->rxd_PF);
424 l2sc->Q921_state = ST_TEI_ASGD;
429 i4b_clear_exception_conditions(l2sc);
431 MDL_Status_Ind(l2sc->unit, STI_L2STAT, LAYER_ACTIVE);
433 i4b_tx_ua(l2sc, l2sc->rxd_PF);
439 l2sc->postfsmarg = l2sc->unit;
440 l2sc->postfsmfunc = DL_Est_Ind_A;
442 i4b_T203_start(l2sc);
444 l2sc->Q921_state = ST_MULTIFR;
447 /*---------------------------------------------------------------------------*
448 * FSM state ST_TEI_ASGD event rx'd DISC
449 *---------------------------------------------------------------------------*/
451 F_T08(l2_softc_t *l2sc)
453 NDBGL2(L2_F_MSG, "FSM function F_T08 executing");
454 MDL_Status_Ind(l2sc->unit, STI_L2STAT, LAYER_IDLE);
455 i4b_tx_ua(l2sc, l2sc->rxd_PF);
458 /*---------------------------------------------------------------------------*
459 * FSM state ST_TEI_ASGD event rx'd UA
460 *---------------------------------------------------------------------------*/
462 F_T09(l2_softc_t *l2sc)
464 NDBGL2(L2_F_MSG, "FSM function F_T09 executing");
465 i4b_mdl_error_ind(l2sc, "F_T09", MDL_ERR_C);
466 i4b_mdl_error_ind(l2sc, "F_T09", MDL_ERR_D);
469 /*---------------------------------------------------------------------------*
470 * FSM state ST_TEI_ASGD event rx'd DM
471 *---------------------------------------------------------------------------*/
473 F_T10(l2_softc_t *l2sc)
475 NDBGL2(L2_F_MSG, "FSM function F_T10 executing");
479 l2sc->Q921_state = ST_TEI_ASGD;
484 if(NOT able_to_etablish)
486 l2sc->Q921_state = ST_TEI_ASGD;
490 i4b_establish_data_link(l2sc);
492 l2sc->l3initiated = 1;
494 l2sc->Q921_state = ST_AW_EST;
498 /*---------------------------------------------------------------------------*
499 * FSM state ST_TEI_ASGD event dl release request
500 *---------------------------------------------------------------------------*/
502 F_T13(l2_softc_t *l2sc)
504 NDBGL2(L2_F_MSG, "FSM function F_T13 executing");
505 l2sc->postfsmarg = l2sc->unit;
506 l2sc->postfsmfunc = DL_Rel_Cnf_A;
509 /*---------------------------------------------------------------------------*
510 * FSM state ST_AW_EST event dl establish request
511 *---------------------------------------------------------------------------*/
513 F_AE01(l2_softc_t *l2sc)
515 NDBGL2(L2_F_MSG, "FSM function F_AE01 executing");
517 i4b_Dcleanifq(&l2sc->i_queue);
519 l2sc->l3initiated = 1;
522 /*---------------------------------------------------------------------------*
523 * FSM state ST_AW_EST event persistent deactivation
524 *---------------------------------------------------------------------------*/
526 F_AE05(l2_softc_t *l2sc)
528 NDBGL2(L2_F_MSG, "FSM function F_AE05 executing");
530 i4b_Dcleanifq(&l2sc->i_queue);
532 l2sc->postfsmarg = l2sc->unit;
533 l2sc->postfsmfunc = DL_Rel_Ind_A;
538 /*---------------------------------------------------------------------------*
539 * FSM state ST_AW_EST event mdl remove request
540 *---------------------------------------------------------------------------*/
542 F_AE06(l2_softc_t *l2sc)
544 NDBGL2(L2_F_MSG, "FSM function F_AE06 executing");
546 i4b_Dcleanifq(&l2sc->i_queue);
548 l2sc->postfsmarg = l2sc->unit;
549 l2sc->postfsmfunc = DL_Rel_Ind_A;
553 /*XXX*/ i4b_mdl_assign_ind(l2sc);
556 /*---------------------------------------------------------------------------*
557 * FSM state ST_AW_EST event rx'd SABME
558 *---------------------------------------------------------------------------*/
560 F_AE07(l2_softc_t *l2sc)
562 NDBGL2(L2_F_MSG, "FSM function F_AE07 executing");
563 MDL_Status_Ind(l2sc->unit, STI_L2STAT, LAYER_ACTIVE);
564 i4b_tx_ua(l2sc, l2sc->rxd_PF);
567 /*---------------------------------------------------------------------------*
568 * FSM state ST_AW_EST event rx'd DISC
569 *---------------------------------------------------------------------------*/
571 F_AE08(l2_softc_t *l2sc)
573 NDBGL2(L2_F_MSG, "FSM function F_AE08 executing");
574 i4b_tx_dm(l2sc, l2sc->rxd_PF);
577 /*---------------------------------------------------------------------------*
578 * FSM state ST_AW_EST event rx'd UA
579 *---------------------------------------------------------------------------*/
581 F_AE09(l2_softc_t *l2sc)
583 NDBGL2(L2_F_MSG, "FSM function F_AE09 executing");
585 if(l2sc->rxd_PF == 0)
587 i4b_mdl_error_ind(l2sc, "F_AE09", MDL_ERR_D);
588 l2sc->Q921_state = ST_AW_EST;
592 if(l2sc->l3initiated)
594 l2sc->l3initiated = 0;
596 l2sc->postfsmarg = l2sc->unit;
597 l2sc->postfsmfunc = DL_Est_Cnf_A;
601 if(l2sc->vs != l2sc->va)
603 i4b_Dcleanifq(&l2sc->i_queue);
604 l2sc->postfsmarg = l2sc->unit;
605 l2sc->postfsmfunc = DL_Est_Ind_A;
609 MDL_Status_Ind(l2sc->unit, STI_L2STAT, LAYER_ACTIVE);
612 i4b_T203_start(l2sc);
617 l2sc->Q921_state = ST_MULTIFR;
621 /*---------------------------------------------------------------------------*
622 * FSM state ST_AW_EST event rx'd DM
623 *---------------------------------------------------------------------------*/
625 F_AE10(l2_softc_t *l2sc)
627 NDBGL2(L2_F_MSG, "FSM function F_AE10 executing");
629 if(l2sc->rxd_PF == 0)
631 l2sc->Q921_state = ST_AW_EST;
635 i4b_Dcleanifq(&l2sc->i_queue);
637 l2sc->postfsmarg = l2sc->unit;
638 l2sc->postfsmfunc = DL_Rel_Ind_A;
642 l2sc->Q921_state = ST_TEI_ASGD;
646 /*---------------------------------------------------------------------------*
647 * FSM state ST_AW_EST event T200 expiry
648 *---------------------------------------------------------------------------*/
650 F_AE11(l2_softc_t *l2sc)
652 NDBGL2(L2_F_MSG, "FSM function F_AE11 executing");
656 i4b_Dcleanifq(&l2sc->i_queue);
658 i4b_mdl_error_ind(l2sc, "F_AE11", MDL_ERR_G);
660 l2sc->postfsmarg = l2sc->unit;
661 l2sc->postfsmfunc = DL_Rel_Ind_A;
663 l2sc->Q921_state = ST_TEI_ASGD;
669 i4b_tx_sabme(l2sc, P1);
671 i4b_T200_start(l2sc);
673 l2sc->Q921_state = ST_AW_EST;
677 /*---------------------------------------------------------------------------*
678 * FSM state ST_AW_EST event dl data request
679 *---------------------------------------------------------------------------*/
681 F_AE12(l2_softc_t *l2sc)
683 NDBGL2(L2_F_MSG, "FSM function F_AE12 executing");
685 if(l2sc->l3initiated == 0)
687 i4b_i_frame_queued_up(l2sc);
691 /*---------------------------------------------------------------------------*
692 * FSM state ST_AW_REL event persistent deactivation
693 *---------------------------------------------------------------------------*/
695 F_AR05(l2_softc_t *l2sc)
697 NDBGL2(L2_F_MSG, "FSM function F_AR05 executing");
699 l2sc->postfsmarg = l2sc->unit;
700 l2sc->postfsmfunc = DL_Rel_Cnf_A;
705 /*---------------------------------------------------------------------------*
706 * FSM state ST_AW_REL event mdl remove request
707 *---------------------------------------------------------------------------*/
709 F_AR06(l2_softc_t *l2sc)
711 NDBGL2(L2_F_MSG, "FSM function F_AR06 executing");
713 l2sc->postfsmarg = l2sc->unit;
714 l2sc->postfsmfunc = DL_Rel_Cnf_A;
718 /*XXX*/ i4b_mdl_assign_ind(l2sc);
721 /*---------------------------------------------------------------------------*
722 * FSM state ST_AW_REL event rx'd SABME
723 *---------------------------------------------------------------------------*/
725 F_AR07(l2_softc_t *l2sc)
727 NDBGL2(L2_F_MSG, "FSM function F_AR07 executing");
728 i4b_tx_dm(l2sc, l2sc->rxd_PF);
731 /*---------------------------------------------------------------------------*
732 * FSM state ST_AW_REL event rx'd DISC
733 *---------------------------------------------------------------------------*/
735 F_AR08(l2_softc_t *l2sc)
737 NDBGL2(L2_F_MSG, "FSM function F_AR08 executing");
738 MDL_Status_Ind(l2sc->unit, STI_L2STAT, LAYER_IDLE);
739 i4b_tx_ua(l2sc, l2sc->rxd_PF);
742 /*---------------------------------------------------------------------------*
743 * FSM state ST_AW_REL event rx'd UA
744 *---------------------------------------------------------------------------*/
746 F_AR09(l2_softc_t *l2sc)
748 NDBGL2(L2_F_MSG, "FSM function F_AR09 executing");
752 l2sc->postfsmarg = l2sc->unit;
753 l2sc->postfsmfunc = DL_Rel_Cnf_A;
757 l2sc->Q921_state = ST_TEI_ASGD;
761 i4b_mdl_error_ind(l2sc, "F_AR09", MDL_ERR_D);
763 l2sc->Q921_state = ST_AW_REL;
767 /*---------------------------------------------------------------------------*
768 * FSM state ST_AW_REL event rx'd DM
769 *---------------------------------------------------------------------------*/
771 F_AR10(l2_softc_t *l2sc)
773 NDBGL2(L2_F_MSG, "FSM function F_AR10 executing");
777 l2sc->postfsmarg = l2sc->unit;
778 l2sc->postfsmfunc = DL_Rel_Cnf_A;
782 l2sc->Q921_state = ST_TEI_ASGD;
786 l2sc->Q921_state = ST_AW_REL;
790 /*---------------------------------------------------------------------------*
791 * FSM state ST_AW_REL event T200 expiry
792 *---------------------------------------------------------------------------*/
794 F_AR11(l2_softc_t *l2sc)
796 NDBGL2(L2_F_MSG, "FSM function F_AR11 executing");
800 i4b_mdl_error_ind(l2sc, "F_AR11", MDL_ERR_H);
802 l2sc->postfsmarg = l2sc->unit;
803 l2sc->postfsmfunc = DL_Rel_Cnf_A;
805 l2sc->Q921_state = ST_TEI_ASGD;
811 i4b_tx_disc(l2sc, P1);
813 i4b_T200_start(l2sc);
815 l2sc->Q921_state = ST_AW_REL;
819 /*---------------------------------------------------------------------------*
820 * FSM state ST_MULTIFR event dl establish request
821 *---------------------------------------------------------------------------*/
823 F_MF01(l2_softc_t *l2sc)
825 NDBGL2(L2_F_MSG, "FSM function F_MF01 executing");
827 i4b_Dcleanifq(&l2sc->i_queue);
829 i4b_establish_data_link(l2sc);
831 l2sc->l3initiated = 1;
834 /*---------------------------------------------------------------------------*
835 * FSM state ST_MULTIFR event persistent deactivation
836 *---------------------------------------------------------------------------*/
838 F_MF05(l2_softc_t *l2sc)
840 NDBGL2(L2_F_MSG, "FSM function F_MF05 executing");
842 i4b_Dcleanifq(&l2sc->i_queue);
844 l2sc->postfsmarg = l2sc->unit;
845 l2sc->postfsmfunc = DL_Rel_Ind_A;
851 /*---------------------------------------------------------------------------*
852 * FSM state ST_MULTIFR event mdl remove request
853 *---------------------------------------------------------------------------*/
855 F_MF06(l2_softc_t *l2sc)
857 NDBGL2(L2_F_MSG, "FSM function F_MF06 executing");
859 i4b_Dcleanifq(&l2sc->i_queue);
861 l2sc->postfsmarg = l2sc->unit;
862 l2sc->postfsmfunc = DL_Rel_Ind_A;
867 /*XXX*/ i4b_mdl_assign_ind(l2sc);
870 /*---------------------------------------------------------------------------*
871 * FSM state ST_MULTIFR event rx'd SABME
872 *---------------------------------------------------------------------------*/
874 F_MF07(l2_softc_t *l2sc)
876 NDBGL2(L2_F_MSG, "FSM function F_MF07 executing");
878 i4b_clear_exception_conditions(l2sc);
880 MDL_Status_Ind(l2sc->unit, STI_L2STAT, LAYER_ACTIVE);
882 i4b_tx_ua(l2sc, l2sc->rxd_PF);
884 i4b_mdl_error_ind(l2sc, "F_MF07", MDL_ERR_F);
886 if(l2sc->vs != l2sc->va)
888 i4b_Dcleanifq(&l2sc->i_queue);
890 l2sc->postfsmarg = l2sc->unit;
891 l2sc->postfsmfunc = DL_Est_Ind_A;
895 i4b_T203_start(l2sc);
902 /*---------------------------------------------------------------------------*
903 * FSM state ST_MULTIFR event rx'd DISC
904 *---------------------------------------------------------------------------*/
906 F_MF08(l2_softc_t *l2sc)
908 NDBGL2(L2_F_MSG, "FSM function F_MF08 executing");
910 i4b_Dcleanifq(&l2sc->i_queue);
911 MDL_Status_Ind(l2sc->unit, STI_L2STAT, LAYER_IDLE);
912 i4b_tx_ua(l2sc, l2sc->rxd_PF);
914 l2sc->postfsmarg = l2sc->unit;
915 l2sc->postfsmfunc = DL_Rel_Ind_A;
921 /*---------------------------------------------------------------------------*
922 * FSM state ST_MULTIFR event rx'd UA
923 *---------------------------------------------------------------------------*/
925 F_MF09(l2_softc_t *l2sc)
927 NDBGL2(L2_F_MSG, "FSM function F_MF09 executing");
929 i4b_mdl_error_ind(l2sc, "F_MF09", MDL_ERR_C);
931 i4b_mdl_error_ind(l2sc, "F_MF09", MDL_ERR_D);
934 /*---------------------------------------------------------------------------*
935 * FSM state ST_MULTIFR event rx'd DM
936 *---------------------------------------------------------------------------*/
938 F_MF10(l2_softc_t *l2sc)
940 NDBGL2(L2_F_MSG, "FSM function F_MF10 executing");
944 i4b_mdl_error_ind(l2sc, "F_MF10", MDL_ERR_B);
946 l2sc->Q921_state = ST_MULTIFR;
950 i4b_mdl_error_ind(l2sc, "F_MF10", MDL_ERR_E);
952 i4b_establish_data_link(l2sc);
954 l2sc->l3initiated = 0;
956 l2sc->Q921_state = ST_AW_EST;
960 /*---------------------------------------------------------------------------*
961 * FSM state ST_MULTIFR event T200 expiry
962 *---------------------------------------------------------------------------*/
964 F_MF11(l2_softc_t *l2sc)
966 NDBGL2(L2_F_MSG, "FSM function F_MF11 executing");
970 i4b_transmit_enquire(l2sc);
975 /*---------------------------------------------------------------------------*
976 * FSM state ST_MULTIFR event dl data request
977 *---------------------------------------------------------------------------*/
979 F_MF12(l2_softc_t *l2sc)
981 NDBGL2(L2_F_MSG, "FSM function F_MF12 executing");
983 i4b_i_frame_queued_up(l2sc);
986 /*---------------------------------------------------------------------------*
987 * FSM state ST_MULTIFR event dl release request
988 *---------------------------------------------------------------------------*/
990 F_MF13(l2_softc_t *l2sc)
992 NDBGL2(L2_F_MSG, "FSM function F_MF13 executing");
994 i4b_Dcleanifq(&l2sc->i_queue);
998 i4b_tx_disc(l2sc, P1);
1000 i4b_T203_stop(l2sc);
1001 i4b_T200_restart(l2sc);
1004 /*---------------------------------------------------------------------------*
1005 * FSM state ST_MULTIFR event T203 expiry
1006 *---------------------------------------------------------------------------*/
1008 F_MF14(l2_softc_t *l2sc)
1010 NDBGL2(L2_F_MSG, "FSM function F_MF14 executing");
1012 i4b_transmit_enquire(l2sc);
1017 /*---------------------------------------------------------------------------*
1018 * FSM state ST_MULTIFR event set own rx busy
1019 *---------------------------------------------------------------------------*/
1021 F_MF15(l2_softc_t *l2sc)
1023 NDBGL2(L2_F_MSG, "FSM function F_MF15 executing");
1025 if(l2sc->own_busy == 0)
1029 i4b_tx_rnr_response(l2sc, F0); /* wrong in Q.921 03/93 p 64 */
1035 /*---------------------------------------------------------------------------*
1036 * FSM state ST_MULTIFR event clear own rx busy
1037 *---------------------------------------------------------------------------*/
1039 F_MF16(l2_softc_t *l2sc)
1041 NDBGL2(L2_F_MSG, "FSM function F_MF16 executing");
1043 if(l2sc->own_busy != 0)
1047 i4b_tx_rr_response(l2sc, F0); /* wrong in Q.921 03/93 p 64 */
1053 /*---------------------------------------------------------------------------*
1054 * FSM state ST_MULTIFR event rx'd RR
1055 *---------------------------------------------------------------------------*/
1057 F_MF17(l2_softc_t *l2sc)
1059 NDBGL2(L2_F_MSG, "FSM function F_MF17 executing");
1061 l2sc->peer_busy = 0;
1063 if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1065 if(l2sc->rxd_PF == 1)
1067 i4b_enquiry_response(l2sc);
1072 if(l2sc->rxd_PF == 1)
1074 i4b_mdl_error_ind(l2sc, "F_MF17", MDL_ERR_A);
1078 if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1080 if(l2sc->rxd_NR == l2sc->vs)
1082 l2sc->va = l2sc->rxd_NR;
1083 i4b_T200_stop(l2sc);
1084 i4b_T203_restart(l2sc);
1086 else if(l2sc->rxd_NR != l2sc->va)
1088 l2sc->va = l2sc->rxd_NR;
1089 i4b_T200_restart(l2sc);
1091 l2sc->Q921_state = ST_MULTIFR;
1095 i4b_nr_error_recovery(l2sc);
1096 l2sc->Q921_state = ST_AW_EST;
1100 /*---------------------------------------------------------------------------*
1101 * FSM state ST_MULTIFR event rx'd REJ
1102 *---------------------------------------------------------------------------*/
1104 F_MF18(l2_softc_t *l2sc)
1106 NDBGL2(L2_F_MSG, "FSM function F_MF18 executing");
1108 l2sc->peer_busy = 0;
1110 if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1112 if(l2sc->rxd_PF == 1)
1114 i4b_enquiry_response(l2sc);
1119 if(l2sc->rxd_PF == 1)
1121 i4b_mdl_error_ind(l2sc, "F_MF18", MDL_ERR_A);
1125 if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1127 l2sc->va = l2sc->rxd_NR;
1128 i4b_T200_stop(l2sc);
1129 i4b_T203_start(l2sc);
1130 i4b_invoke_retransmission(l2sc, l2sc->rxd_NR);
1131 l2sc->Q921_state = ST_MULTIFR;
1135 i4b_nr_error_recovery(l2sc);
1136 l2sc->Q921_state = ST_AW_EST;
1140 /*---------------------------------------------------------------------------*
1141 * FSM state ST_MULTIFR event rx'd RNR
1142 *---------------------------------------------------------------------------*/
1144 F_MF19(l2_softc_t *l2sc)
1146 NDBGL2(L2_F_MSG, "FSM function F_MF19 executing");
1148 l2sc->peer_busy = 1;
1150 if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1152 if(l2sc->rxd_PF == 1)
1154 i4b_enquiry_response(l2sc);
1159 if(l2sc->rxd_PF == 1)
1161 i4b_mdl_error_ind(l2sc, "F_MF19", MDL_ERR_A);
1165 if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1167 l2sc->va = l2sc->rxd_NR;
1168 i4b_T203_stop(l2sc);
1169 i4b_T200_restart(l2sc);
1170 l2sc->Q921_state = ST_MULTIFR;
1174 i4b_nr_error_recovery(l2sc);
1175 l2sc->Q921_state = ST_AW_EST;
1179 /*---------------------------------------------------------------------------*
1180 * FSM state ST_MULTIFR event rx'd FRMR
1181 *---------------------------------------------------------------------------*/
1183 F_MF20(l2_softc_t *l2sc)
1185 NDBGL2(L2_F_MSG, "FSM function F_MF20 executing");
1187 i4b_mdl_error_ind(l2sc, "F_MF20", MDL_ERR_K);
1189 i4b_establish_data_link(l2sc);
1191 l2sc->l3initiated = 0;
1194 /*---------------------------------------------------------------------------*
1195 * FSM state ST_TIMREC event dl establish request
1196 *---------------------------------------------------------------------------*/
1198 F_TR01(l2_softc_t *l2sc)
1200 NDBGL2(L2_F_MSG, "FSM function F_TR01 executing");
1202 i4b_Dcleanifq(&l2sc->i_queue);
1204 i4b_establish_data_link(l2sc);
1206 l2sc->l3initiated = 1;
1209 /*---------------------------------------------------------------------------*
1210 * FSM state ST_TIMREC event persistent deactivation
1211 *---------------------------------------------------------------------------*/
1213 F_TR05(l2_softc_t *l2sc)
1215 NDBGL2(L2_F_MSG, "FSM function F_TR05 executing");
1217 i4b_Dcleanifq(&l2sc->i_queue);
1219 l2sc->postfsmarg = l2sc->unit;
1220 l2sc->postfsmfunc = DL_Rel_Ind_A;
1222 i4b_T200_stop(l2sc);
1225 /*---------------------------------------------------------------------------*
1226 * FSM state ST_TIMREC event mdl remove request
1227 *---------------------------------------------------------------------------*/
1229 F_TR06(l2_softc_t *l2sc)
1231 NDBGL2(L2_F_MSG, "FSM function F_TR06 executing");
1233 i4b_Dcleanifq(&l2sc->i_queue);
1235 l2sc->postfsmarg = l2sc->unit;
1236 l2sc->postfsmfunc = DL_Rel_Ind_A;
1238 i4b_T200_stop(l2sc);
1240 /*XXX*/ i4b_mdl_assign_ind(l2sc);
1243 /*---------------------------------------------------------------------------*
1244 * FSM state ST_TIMREC event rx'd SABME
1245 *---------------------------------------------------------------------------*/
1247 F_TR07(l2_softc_t *l2sc)
1249 NDBGL2(L2_F_MSG, "FSM function F_TR07 executing");
1251 i4b_clear_exception_conditions(l2sc);
1253 MDL_Status_Ind(l2sc->unit, STI_L2STAT, LAYER_ACTIVE);
1255 i4b_tx_ua(l2sc, l2sc->rxd_PF);
1257 i4b_mdl_error_ind(l2sc, "F_TR07", MDL_ERR_F);
1259 if(l2sc->vs != l2sc->va)
1261 i4b_Dcleanifq(&l2sc->i_queue);
1263 l2sc->postfsmarg = l2sc->unit;
1264 l2sc->postfsmfunc = DL_Est_Ind_A;
1267 i4b_T200_stop(l2sc);
1268 i4b_T203_start(l2sc);
1275 /*---------------------------------------------------------------------------*
1276 * FSM state ST_TIMREC event rx'd DISC
1277 *---------------------------------------------------------------------------*/
1279 F_TR08(l2_softc_t *l2sc)
1281 NDBGL2(L2_F_MSG, "FSM function F_TR08 executing");
1283 i4b_Dcleanifq(&l2sc->i_queue);
1284 MDL_Status_Ind(l2sc->unit, STI_L2STAT, LAYER_IDLE);
1285 i4b_tx_ua(l2sc, l2sc->rxd_PF);
1287 l2sc->postfsmarg = l2sc->unit;
1288 l2sc->postfsmfunc = DL_Rel_Ind_A;
1290 i4b_T200_stop(l2sc);
1293 /*---------------------------------------------------------------------------*
1294 * FSM state ST_TIMREC event rx'd UA
1295 *---------------------------------------------------------------------------*/
1297 F_TR09(l2_softc_t *l2sc)
1299 NDBGL2(L2_F_MSG, "FSM function F_TR09 executing");
1301 i4b_mdl_error_ind(l2sc, "F_TR09", MDL_ERR_C);
1303 i4b_mdl_error_ind(l2sc, "F_TR09", MDL_ERR_D);
1306 /*---------------------------------------------------------------------------*
1307 * FSM state ST_TIMREC event rx'd DM
1308 *---------------------------------------------------------------------------*/
1310 F_TR10(l2_softc_t *l2sc)
1312 NDBGL2(L2_F_MSG, "FSM function F_TR10 executing");
1316 i4b_mdl_error_ind(l2sc, "F_TR10", MDL_ERR_B);
1320 i4b_mdl_error_ind(l2sc, "F_TR10", MDL_ERR_E);
1323 i4b_establish_data_link(l2sc);
1325 l2sc->l3initiated = 0;
1328 /*---------------------------------------------------------------------------*
1329 * FSM state ST_TIMREC event T200 expiry
1330 *---------------------------------------------------------------------------*/
1332 F_TR11(l2_softc_t *l2sc)
1334 NDBGL2(L2_F_MSG, "FSM function F_TR11 executing");
1336 if(l2sc->RC >= N200)
1338 i4b_mdl_error_ind(l2sc, "F_TR11", MDL_ERR_I);
1340 i4b_establish_data_link(l2sc);
1342 l2sc->l3initiated = 0;
1344 l2sc->Q921_state = ST_AW_EST;
1348 i4b_transmit_enquire(l2sc);
1352 l2sc->Q921_state = ST_TIMREC;
1356 /*---------------------------------------------------------------------------*
1357 * FSM state ST_TIMREC event dl data request
1358 *---------------------------------------------------------------------------*/
1360 F_TR12(l2_softc_t *l2sc)
1362 NDBGL2(L2_F_MSG, "FSM function F_TR12 executing");
1364 i4b_i_frame_queued_up(l2sc);
1367 /*---------------------------------------------------------------------------*
1368 * FSM state ST_TIMREC event dl release request
1369 *---------------------------------------------------------------------------*/
1371 F_TR13(l2_softc_t *l2sc)
1373 NDBGL2(L2_F_MSG, "FSM function F_TR13 executing");
1375 i4b_Dcleanifq(&l2sc->i_queue);
1379 i4b_tx_disc(l2sc, P1);
1381 i4b_T200_restart(l2sc);
1384 /*---------------------------------------------------------------------------*
1385 * FSM state ST_TIMREC event set own rx busy
1386 *---------------------------------------------------------------------------*/
1388 F_TR15(l2_softc_t *l2sc)
1390 NDBGL2(L2_F_MSG, "FSM function F_TR15 executing");
1392 if(l2sc->own_busy == 0)
1396 i4b_tx_rnr_response(l2sc, F0);
1402 /*---------------------------------------------------------------------------*
1403 * FSM state ST_TIMREC event clear own rx busy
1404 *---------------------------------------------------------------------------*/
1406 F_TR16(l2_softc_t *l2sc)
1408 NDBGL2(L2_F_MSG, "FSM function F_TR16 executing");
1410 if(l2sc->own_busy != 0)
1414 i4b_tx_rr_response(l2sc, F0); /* this is wrong */
1415 /* in Q.921 03/93 p 74 ! */
1420 /*---------------------------------------------------------------------------*
1421 * FSM state ST_TIMREC event rx'd RR
1422 *---------------------------------------------------------------------------*/
1424 F_TR17(l2_softc_t *l2sc)
1426 NDBGL2(L2_F_MSG, "FSM function F_TR17 executing");
1428 l2sc->peer_busy = 0;
1430 if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1432 if(l2sc->rxd_PF == 1)
1434 i4b_enquiry_response(l2sc);
1439 if(l2sc->rxd_PF == 1)
1441 if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1443 l2sc->va = l2sc->rxd_NR;
1444 i4b_T200_stop(l2sc);
1445 i4b_T203_start(l2sc);
1446 i4b_invoke_retransmission(l2sc, l2sc->rxd_NR);
1447 l2sc->Q921_state = ST_MULTIFR;
1452 i4b_nr_error_recovery(l2sc);
1453 l2sc->Q921_state = ST_AW_EST;
1459 if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1461 l2sc->va = l2sc->rxd_NR;
1462 l2sc->Q921_state = ST_TIMREC;
1466 i4b_nr_error_recovery(l2sc);
1467 l2sc->Q921_state = ST_AW_EST;
1471 /*---------------------------------------------------------------------------*
1472 * FSM state ST_TIMREC event
1473 *---------------------------------------------------------------------------*/
1475 F_TR18(l2_softc_t *l2sc)
1477 NDBGL2(L2_F_MSG, "FSM function F_TR18 executing");
1479 l2sc->peer_busy = 0;
1481 if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1483 if(l2sc->rxd_PF == 1)
1485 i4b_enquiry_response(l2sc);
1490 if(l2sc->rxd_PF == 1)
1492 if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1494 l2sc->va = l2sc->rxd_NR;
1495 i4b_T200_stop(l2sc);
1496 i4b_T203_start(l2sc);
1497 i4b_invoke_retransmission(l2sc, l2sc->rxd_NR);
1498 l2sc->Q921_state = ST_MULTIFR;
1503 i4b_nr_error_recovery(l2sc);
1504 l2sc->Q921_state = ST_AW_EST;
1510 if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1512 l2sc->va = l2sc->rxd_NR;
1513 l2sc->Q921_state = ST_TIMREC;
1517 i4b_nr_error_recovery(l2sc);
1518 l2sc->Q921_state = ST_AW_EST;
1522 /*---------------------------------------------------------------------------*
1523 * FSM state ST_TIMREC event rx'd RNR
1524 *---------------------------------------------------------------------------*/
1526 F_TR19(l2_softc_t *l2sc)
1528 NDBGL2(L2_F_MSG, "FSM function F_TR19 executing");
1530 l2sc->peer_busy = 0;
1532 if(l2sc->rxd_CR == CR_CMD_FROM_NT)
1534 if(l2sc->rxd_PF == 1)
1536 i4b_enquiry_response(l2sc);
1541 if(l2sc->rxd_PF == 1)
1543 if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1545 l2sc->va = l2sc->rxd_NR;
1546 i4b_T200_restart(l2sc);
1547 i4b_invoke_retransmission(l2sc, l2sc->rxd_NR);
1548 l2sc->Q921_state = ST_MULTIFR;
1553 i4b_nr_error_recovery(l2sc);
1554 l2sc->Q921_state = ST_AW_EST;
1560 if(i4b_l2_nr_ok(l2sc->rxd_NR, l2sc->va, l2sc->vs))
1562 l2sc->va = l2sc->rxd_NR;
1563 l2sc->Q921_state = ST_TIMREC;
1567 i4b_nr_error_recovery(l2sc);
1568 l2sc->Q921_state = ST_AW_EST;
1572 /*---------------------------------------------------------------------------*
1573 * FSM state ST_TIMREC event rx'd FRMR
1574 *---------------------------------------------------------------------------*/
1576 F_TR20(l2_softc_t *l2sc)
1578 NDBGL2(L2_F_MSG, "FSM function F_TR20 executing");
1580 i4b_mdl_error_ind(l2sc, "F_TR20", MDL_ERR_K);
1582 i4b_establish_data_link(l2sc);
1584 l2sc->l3initiated = 0;
1587 #endif /* NI4BQ921 > 0 */