03e9d9e879d0aa2abfd8b6f23c2c46e727988b9e
[dragonfly.git] / sys / netproto / atm / uni / q2110_sigaa.c
1 /*
2  *
3  * ===================================
4  * HARP  |  Host ATM Research Platform
5  * ===================================
6  *
7  *
8  * This Host ATM Research Platform ("HARP") file (the "Software") is
9  * made available by Network Computing Services, Inc. ("NetworkCS")
10  * "AS IS".  NetworkCS does not provide maintenance, improvements or
11  * support of any kind.
12  *
13  * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
14  * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
15  * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
16  * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
17  * In no event shall NetworkCS be responsible for any damages, including
18  * but not limited to consequential damages, arising from or relating to
19  * any use of the Software or related support.
20  *
21  * Copyright 1994-1998 Network Computing Services, Inc.
22  *
23  * Copies of this Software may be made, however, the above copyright
24  * notice must be reproduced on all copies.
25  *
26  *      @(#) $FreeBSD: src/sys/netatm/uni/q2110_sigaa.c,v 1.4 2000/01/17 20:49:48 mks Exp $
27  *      @(#) $DragonFly: src/sys/netproto/atm/uni/q2110_sigaa.c,v 1.4 2003/08/07 21:54:34 dillon Exp $
28  */
29
30 /*
31  * ATM Forum UNI Support
32  * ---------------------
33  *
34  * ITU-T Q.2110 - Process AA-signals (SAP_SSCOP)
35  *
36  */
37
38 #include <netproto/atm/kern_include.h>
39
40 #include "sscop.h"
41 #include "sscop_misc.h"
42 #include "sscop_var.h"
43
44 /*
45  * Local functions
46  */
47 static void     sscop_resreq_ready __P((struct sscop *, int, int));
48 static void     sscop_resrsp_inresyn __P((struct sscop *, int, int));
49 static void     sscop_recrsp_recovrsp __P((struct sscop *, int, int));
50 static void     sscop_recrsp_inrecov __P((struct sscop *, int, int));
51
52
53 /*
54  * Stack command state lookup tables
55  */
56 /* SSCOP_INIT */
57 static void     (*sscop_init_tab[SOS_NUMSTATES])
58                                 __P((struct sscop *, int, int)) = {
59                         sscop_init_inst,        /* SOS_INST */
60                         NULL,                   /* SOS_IDLE */
61                         NULL,                   /* SOS_OUTCONN */
62                         NULL,                   /* SOS_INCONN */
63                         NULL,                   /* SOS_OUTDISC */
64                         NULL,                   /* SOS_OUTRESYN */
65                         NULL,                   /* SOS_INRESYN */
66                         NULL,                   /* SOS_OUTRECOV */
67                         NULL,                   /* SOS_RECOVRSP */
68                         NULL,                   /* SOS_INRECOV */
69                         NULL,                   /* SOS_READY */
70                         NULL                    /* SOS_TERM */
71 };
72
73 /* SSCOP_TERM */
74 static void     (*sscop_term_tab[SOS_NUMSTATES])
75                                 __P((struct sscop *, int, int)) = {
76                         sscop_term_all,         /* SOS_INST */
77                         sscop_term_all,         /* SOS_IDLE */
78                         sscop_term_all,         /* SOS_OUTCONN */
79                         sscop_term_all,         /* SOS_INCONN */
80                         sscop_term_all,         /* SOS_OUTDISC */
81                         sscop_term_all,         /* SOS_OUTRESYN */
82                         sscop_term_all,         /* SOS_INRESYN */
83                         sscop_term_all,         /* SOS_OUTRECOV */
84                         sscop_term_all,         /* SOS_RECOVRSP */
85                         sscop_term_all,         /* SOS_INRECOV */
86                         sscop_term_all,         /* SOS_READY */
87                         sscop_term_all          /* SOS_TERM */
88 };
89
90 /* SSCOP_ESTABLISH_REQ */
91 static void     (*sscop_estreq_tab[SOS_NUMSTATES])
92                                 __P((struct sscop *, int, int)) = {
93                         NULL,                   /* SOS_INST */
94                         sscop_estreq_idle,      /* SOS_IDLE */
95                         NULL,                   /* SOS_OUTCONN */
96                         NULL,                   /* SOS_INCONN */
97                         sscop_estreq_idle,      /* SOS_OUTDISC */
98                         NULL,                   /* SOS_OUTRESYN */
99                         NULL,                   /* SOS_INRESYN */
100                         NULL,                   /* SOS_OUTRECOV */
101                         NULL,                   /* SOS_RECOVRSP */
102                         NULL,                   /* SOS_INRECOV */
103                         NULL,                   /* SOS_READY */
104                         sscop_aa_noop_1         /* SOS_TERM */
105 };
106
107 /* SSCOP_ESTABLISH_RSP */
108 static void     (*sscop_estrsp_tab[SOS_NUMSTATES])
109                                 __P((struct sscop *, int, int)) = {
110                         NULL,                   /* SOS_INST */
111                         NULL,                   /* SOS_IDLE */
112                         NULL,                   /* SOS_OUTCONN */
113                         sscop_estrsp_inconn,    /* SOS_INCONN */
114                         NULL,                   /* SOS_OUTDISC */
115                         NULL,                   /* SOS_OUTRESYN */
116                         NULL,                   /* SOS_INRESYN */
117                         NULL,                   /* SOS_OUTRECOV */
118                         NULL,                   /* SOS_RECOVRSP */
119                         NULL,                   /* SOS_INRECOV */
120                         NULL,                   /* SOS_READY */
121                         sscop_aa_noop_1         /* SOS_TERM */
122 };
123
124 /* SSCOP_RELEASE_REQ */
125 static void     (*sscop_relreq_tab[SOS_NUMSTATES])
126                                 __P((struct sscop *, int, int)) = {
127                         NULL,                   /* SOS_INST */
128                         NULL,                   /* SOS_IDLE */
129                         sscop_relreq_outconn,   /* SOS_OUTCONN */
130                         sscop_relreq_inconn,    /* SOS_INCONN */
131                         NULL,                   /* SOS_OUTDISC */
132                         sscop_relreq_outconn,   /* SOS_OUTRESYN */
133                         sscop_relreq_outconn,   /* SOS_INRESYN */
134                         sscop_relreq_ready,     /* SOS_OUTRECOV */
135                         sscop_relreq_outconn,   /* SOS_RECOVRSP */
136                         sscop_relreq_outconn,   /* SOS_INRECOV */
137                         sscop_relreq_ready,     /* SOS_READY */
138                         sscop_aa_noop_1         /* SOS_TERM */
139 };
140
141 /* SSCOP_DATA_REQ */
142 static void     (*sscop_datreq_tab[SOS_NUMSTATES])
143                                 __P((struct sscop *, int, int)) = {
144                         NULL,                   /* SOS_INST */
145                         NULL,                   /* SOS_IDLE */
146                         NULL,                   /* SOS_OUTCONN */
147                         NULL,                   /* SOS_INCONN */
148                         NULL,                   /* SOS_OUTDISC */
149                         NULL,                   /* SOS_OUTRESYN */
150                         NULL,                   /* SOS_INRESYN */
151                         sscop_aa_noop_1,        /* SOS_OUTRECOV */
152                         NULL,                   /* SOS_RECOVRSP */
153                         NULL,                   /* SOS_INRECOV */
154                         sscop_datreq_ready,     /* SOS_READY */
155                         sscop_aa_noop_1         /* SOS_TERM */
156 };
157
158 /* SSCOP_RESYNC_REQ */
159 static void     (*sscop_resreq_tab[SOS_NUMSTATES])
160                                 __P((struct sscop *, int, int)) = {
161                         NULL,                   /* SOS_INST */
162                         NULL,                   /* SOS_IDLE */
163                         NULL,                   /* SOS_OUTCONN */
164                         NULL,                   /* SOS_INCONN */
165                         NULL,                   /* SOS_OUTDISC */
166                         NULL,                   /* SOS_OUTRESYN */
167                         NULL,                   /* SOS_INRESYN */
168                         sscop_resreq_ready,     /* SOS_OUTRECOV */
169                         sscop_resreq_ready,     /* SOS_RECOVRSP */
170                         sscop_resreq_ready,     /* SOS_INRECOV */
171                         sscop_resreq_ready,     /* SOS_READY */
172                         sscop_aa_noop_1         /* SOS_TERM */
173 };
174
175 /* SSCOP_RESYNC_RSP */
176 static void     (*sscop_resrsp_tab[SOS_NUMSTATES])
177                                 __P((struct sscop *, int, int)) = {
178                         NULL,                   /* SOS_INST */
179                         NULL,                   /* SOS_IDLE */
180                         NULL,                   /* SOS_OUTCONN */
181                         NULL,                   /* SOS_INCONN */
182                         NULL,                   /* SOS_OUTDISC */
183                         NULL,                   /* SOS_OUTRESYN */
184                         sscop_resrsp_inresyn,   /* SOS_INRESYN */
185                         NULL,                   /* SOS_OUTRECOV */
186                         NULL,                   /* SOS_RECOVRSP */
187                         NULL,                   /* SOS_INRECOV */
188                         NULL,                   /* SOS_READY */
189                         sscop_aa_noop_0         /* SOS_TERM */
190 };
191
192 /* SSCOP_RECOVER_RSP */
193 static void     (*sscop_recrsp_tab[SOS_NUMSTATES])
194                                 __P((struct sscop *, int, int)) = {
195                         NULL,                   /* SOS_INST */
196                         NULL,                   /* SOS_IDLE */
197                         NULL,                   /* SOS_OUTCONN */
198                         NULL,                   /* SOS_INCONN */
199                         NULL,                   /* SOS_OUTDISC */
200                         NULL,                   /* SOS_OUTRESYN */
201                         NULL,                   /* SOS_INRESYN */
202                         NULL,                   /* SOS_OUTRECOV */
203                         sscop_recrsp_recovrsp,  /* SOS_RECOVRSP */
204                         sscop_recrsp_inrecov,   /* SOS_INRECOV */
205                         NULL,                   /* SOS_READY */
206                         sscop_aa_noop_0         /* SOS_TERM */
207 };
208
209 /* SSCOP_UNITDATA_REQ */
210 static void     (*sscop_udtreq_tab[SOS_NUMSTATES])
211                                 __P((struct sscop *, int, int)) = {
212                         NULL,                   /* SOS_INST */
213                         sscop_udtreq_all,       /* SOS_IDLE */
214                         sscop_udtreq_all,       /* SOS_OUTCONN */
215                         sscop_udtreq_all,       /* SOS_INCONN */
216                         sscop_udtreq_all,       /* SOS_OUTDISC */
217                         sscop_udtreq_all,       /* SOS_OUTRESYN */
218                         sscop_udtreq_all,       /* SOS_INRESYN */
219                         sscop_udtreq_all,       /* SOS_OUTRECOV */
220                         sscop_udtreq_all,       /* SOS_RECOVRSP */
221                         sscop_udtreq_all,       /* SOS_INRECOV */
222                         sscop_udtreq_all,       /* SOS_READY */
223                         sscop_aa_noop_1         /* SOS_TERM */
224 };
225
226 /* SSCOP_RETRIEVE_REQ */
227 static void     (*sscop_retreq_tab[SOS_NUMSTATES])
228                                 __P((struct sscop *, int, int)) = {
229                         NULL,                   /* SOS_INST */
230                         NULL,                   /* SOS_IDLE */
231                         NULL,                   /* SOS_OUTCONN */
232                         NULL,                   /* SOS_INCONN */
233                         NULL,                   /* SOS_OUTDISC */
234                         NULL,                   /* SOS_OUTRESYN */
235                         NULL,                   /* SOS_INRESYN */
236                         NULL,                   /* SOS_OUTRECOV */
237                         NULL,                   /* SOS_RECOVRSP */
238                         NULL,                   /* SOS_INRECOV */
239                         NULL,                   /* SOS_READY */
240                         NULL                    /* SOS_TERM */
241 };
242
243
244 /*
245  * Stack command lookup table
246  */
247 void    (*(*sscop_q2110_aatab[SSCOP_CMD_SIZE]))
248                                 __P((struct sscop *, int, int)) = {
249                 NULL,
250                 sscop_init_tab,
251                 sscop_term_tab,
252                 NULL,
253                 NULL,
254                 NULL,
255                 NULL,
256                 NULL,
257                 NULL,
258                 NULL,
259                 NULL,
260                 NULL,
261                 NULL,
262                 NULL,
263                 NULL,
264                 NULL,
265                 sscop_estreq_tab,
266                 NULL,
267                 sscop_estrsp_tab,
268                 NULL,
269                 sscop_relreq_tab,
270                 NULL,
271                 NULL,
272                 sscop_datreq_tab,
273                 NULL,
274                 sscop_resreq_tab,
275                 NULL,
276                 sscop_resrsp_tab,
277                 NULL,
278                 NULL,
279                 sscop_recrsp_tab,
280                 sscop_udtreq_tab,
281                 NULL,
282                 sscop_retreq_tab,
283                 NULL,
284                 NULL
285 };
286
287
288 /*
289  * SSCOP_RESYNC_REQ / SOS_READY Command Processor
290  * 
291  * Arguments:
292  *      sop     pointer to sscop connection block
293  *      arg1    pointer to buffer containing SSCOP-UU data
294  *      arg2    unused
295  *
296  * Returns:
297  *      none
298  *
299  */
300 static void
301 sscop_resreq_ready(sop, arg1, arg2)
302         struct sscop    *sop;
303         int             arg1;
304         int             arg2;
305 {
306
307         /*
308          * We don't support SSCOP-UU data
309          */
310         if (arg1 != SSCOP_UU_NULL)
311                 KB_FREEALL((KBuffer *)arg1);
312
313         /*
314          * Stop data transfer timers
315          */
316         sop->so_timer[SSCOP_T_POLL] = 0;
317         sop->so_timer[SSCOP_T_NORESP] = 0;
318         sop->so_timer[SSCOP_T_IDLE] = 0;
319         sop->so_flags &= ~SOF_KEEPALIVE;
320
321         /* 
322          * Initialize receiver window
323          */
324         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
325
326         /*
327          * Send first RS PDU
328          */
329         sop->so_connctl = 1;
330         SEQ_INCR(sop->so_sendconn, 1);
331         (void) sscop_send_rs(sop);
332
333         /*
334          * Drain transmit and receive queues
335          */
336         sscop_xmit_drain(sop);
337         sscop_rcvr_drain(sop);
338
339         /*
340          * Set retransmit timer
341          */
342         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
343
344         /*
345          * Wait for RSAK
346          */
347         sop->so_state = SOS_OUTRESYN;
348
349         return;
350 }
351
352
353 /*
354  * SSCOP_RESYNC_RSP / SOS_INRESYN Command Processor
355  * 
356  * Arguments:
357  *      sop     pointer to sscop connection block
358  *      arg1    unused
359  *      arg2    unused
360  *
361  * Returns:
362  *      none
363  *
364  */
365 static void
366 sscop_resrsp_inresyn(sop, arg1, arg2)
367         struct sscop    *sop;
368         int             arg1;
369         int             arg2;
370 {
371
372         /*
373          * Clear transmitter buffers
374          */
375         q2110_clear_xmit(sop);
376
377         /* 
378          * Initialize state variables
379          */
380         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
381         q2110_init_state(sop);
382
383         /*
384          * Send RSAK PDU
385          */
386         (void) sscop_send_rsak(sop);
387
388         /*
389          * Start data transfer timers
390          */
391         sop->so_timer[SSCOP_T_POLL] = sop->so_parm.sp_timepoll;
392         sop->so_timer[SSCOP_T_NORESP] = sop->so_parm.sp_timeresp;
393
394         /*
395          * Back to data transfer state
396          */
397         sop->so_state = SOS_READY;
398
399         return;
400 }
401
402
403 /*
404  * SSCOP_RECOVER_RSP / SOS_RECOVRSP Command Processor
405  * 
406  * Arguments:
407  *      sop     pointer to sscop connection block
408  *      arg1    unused
409  *      arg2    unused
410  *
411  * Returns:
412  *      none
413  *
414  */
415 static void
416 sscop_recrsp_recovrsp(sop, arg1, arg2)
417         struct sscop    *sop;
418         int             arg1;
419         int             arg2;
420 {
421
422         /*
423          * Clear transmitter buffers, if not done earlier
424          */
425         if (sop->so_flags & SOF_NOCLRBUF)
426                 q2110_clear_xmit(sop);
427
428         /* 
429          * Initialize state variables
430          */
431         q2110_init_state(sop);
432
433         /*
434          * Start data transfer timers
435          */
436         sop->so_timer[SSCOP_T_POLL] = sop->so_parm.sp_timepoll;
437         sop->so_timer[SSCOP_T_NORESP] = sop->so_parm.sp_timeresp;
438
439         /*
440          * Back to data transfer state
441          */
442         sop->so_state = SOS_READY;
443
444         /*
445          * See if transmit queues need servicing
446          */
447         if (sop->so_flags & SOF_XMITSRVC)
448                 sscop_service_xmit(sop);
449
450         return;
451 }
452
453
454 /*
455  * SSCOP_RECOVER_RSP / SOS_INRECOV Command Processor
456  * 
457  * Arguments:
458  *      sop     pointer to sscop connection block
459  *      arg1    unused
460  *      arg2    unused
461  *
462  * Returns:
463  *      none
464  *
465  */
466 static void
467 sscop_recrsp_inrecov(sop, arg1, arg2)
468         struct sscop    *sop;
469         int             arg1;
470         int             arg2;
471 {
472
473         /*
474          * Clear transmitter buffers, if not done earlier
475          */
476         if (sop->so_flags & SOF_NOCLRBUF)
477                 q2110_clear_xmit(sop);
478
479         /* 
480          * Initialize state variables
481          */
482         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
483         q2110_init_state(sop);
484
485         /*
486          * Send ERAK PDU
487          */
488         (void) sscop_send_erak(sop);
489
490         /*
491          * Start data transfer timers
492          */
493         sop->so_timer[SSCOP_T_POLL] = sop->so_parm.sp_timepoll;
494         sop->so_timer[SSCOP_T_NORESP] = sop->so_parm.sp_timeresp;
495
496         /*
497          * Back to data transfer state
498          */
499         sop->so_state = SOS_READY;
500
501         /*
502          * See if transmit queues need servicing
503          */
504         if (sop->so_flags & SOF_XMITSRVC)
505                 sscop_service_xmit(sop);
506
507         return;
508 }
509