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