kernel tree reorganization stage 1: Major cvs repository work (not logged as
[dragonfly.git] / sys / netproto / atm / uni / qsaal1_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/qsaal1_sigaa.c,v 1.4 2000/01/17 20:49:49 mks Exp $
27  *      @(#) $DragonFly: src/sys/netproto/atm/uni/qsaal1_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.SAAL1 - 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_estreq_ready __P((struct sscop *, int, int));
48 static void     sscop_datreq_outconn __P((struct sscop *, int, int));
49 static void     sscop_resreq_ready __P((struct sscop *, int, int));
50 static void     sscop_resrsp_inresyn __P((struct sscop *, int, int));
51 static void     sscop_resrsp_conresyn __P((struct sscop *, int, int));
52
53
54 /*
55  * Stack command state lookup tables
56  */
57 /* SSCOP_INIT */
58 static void     (*sscop_init_tab[SOS_NUMSTATES])
59                                 __P((struct sscop *, int, int)) = {
60                         sscop_init_inst,        /* SOS_INST */
61                         NULL,                   /* SOS_IDLE */
62                         NULL,                   /* SOS_OUTCONN */
63                         NULL,                   /* SOS_INCONN */
64                         NULL,                   /* SOS_OUTDISC */
65                         NULL,                   /* SOS_OUTRESYN */
66                         NULL,                   /* SOS_INRESYN */
67                         NULL,                   /* SOS_CONRESYN */
68                         NULL,                   /* invalid */
69                         NULL,                   /* invalid */
70                         NULL,                   /* SOS_READY */
71                         NULL                    /* SOS_TERM */
72 };
73
74 /* SSCOP_TERM */
75 static void     (*sscop_term_tab[SOS_NUMSTATES])
76                                 __P((struct sscop *, int, int)) = {
77                         sscop_term_all,         /* SOS_INST */
78                         sscop_term_all,         /* SOS_IDLE */
79                         sscop_term_all,         /* SOS_OUTCONN */
80                         sscop_term_all,         /* SOS_INCONN */
81                         sscop_term_all,         /* SOS_OUTDISC */
82                         sscop_term_all,         /* SOS_OUTRESYN */
83                         sscop_term_all,         /* SOS_INRESYN */
84                         sscop_term_all,         /* SOS_CONRESYN */
85                         NULL,                   /* invalid */
86                         NULL,                   /* invalid */
87                         sscop_term_all,         /* SOS_READY */
88                         sscop_term_all          /* SOS_TERM */
89 };
90
91 /* SSCOP_ESTABLISH_REQ */
92 static void     (*sscop_estreq_tab[SOS_NUMSTATES])
93                                 __P((struct sscop *, int, int)) = {
94                         NULL,                   /* SOS_INST */
95                         sscop_estreq_idle,      /* SOS_IDLE */
96                         NULL,                   /* SOS_OUTCONN */
97                         NULL,                   /* SOS_INCONN */
98                         sscop_estreq_ready,     /* SOS_OUTDISC */
99                         sscop_estreq_ready,     /* SOS_OUTRESYN */
100                         sscop_estreq_ready,     /* SOS_INRESYN */
101                         sscop_estreq_ready,     /* SOS_CONRESYN */
102                         NULL,                   /* invalid */
103                         NULL,                   /* invalid */
104                         sscop_estreq_ready,     /* SOS_READY */
105                         sscop_aa_noop_1         /* SOS_TERM */
106 };
107
108 /* SSCOP_ESTABLISH_RSP */
109 static void     (*sscop_estrsp_tab[SOS_NUMSTATES])
110                                 __P((struct sscop *, int, int)) = {
111                         NULL,                   /* SOS_INST */
112                         NULL,                   /* SOS_IDLE */
113                         NULL,                   /* SOS_OUTCONN */
114                         sscop_estrsp_inconn,    /* SOS_INCONN */
115                         NULL,                   /* SOS_OUTDISC */
116                         NULL,                   /* SOS_OUTRESYN */
117                         NULL,                   /* SOS_INRESYN */
118                         NULL,                   /* SOS_CONRESYN */
119                         NULL,                   /* invalid */
120                         NULL,                   /* invalid */
121                         sscop_aa_noop_1,        /* SOS_READY */
122                         sscop_aa_noop_1         /* SOS_TERM */
123 };
124
125 /* SSCOP_RELEASE_REQ */
126 static void     (*sscop_relreq_tab[SOS_NUMSTATES])
127                                 __P((struct sscop *, int, int)) = {
128                         NULL,                   /* SOS_INST */
129                         NULL,                   /* SOS_IDLE */
130                         sscop_relreq_outconn,   /* SOS_OUTCONN */
131                         sscop_relreq_inconn,    /* SOS_INCONN */
132                         NULL,                   /* SOS_OUTDISC */
133                         sscop_relreq_outconn,   /* SOS_OUTRESYN */
134                         sscop_relreq_ready,     /* SOS_INRESYN */
135                         sscop_relreq_outconn,   /* SOS_CONRESYN */
136                         NULL,                   /* invalid */
137                         NULL,                   /* invalid */
138                         sscop_relreq_ready,     /* SOS_READY */
139                         sscop_aa_noop_1         /* SOS_TERM */
140 };
141
142 /* SSCOP_DATA_REQ */
143 static void     (*sscop_datreq_tab[SOS_NUMSTATES])
144                                 __P((struct sscop *, int, int)) = {
145                         NULL,                   /* SOS_INST */
146                         NULL,                   /* SOS_IDLE */
147                         sscop_datreq_outconn,   /* SOS_OUTCONN */
148                         NULL,                   /* SOS_INCONN */
149                         NULL,                   /* SOS_OUTDISC */
150                         NULL,                   /* SOS_OUTRESYN */
151                         sscop_datreq_ready,     /* SOS_INRESYN */
152                         NULL,                   /* SOS_CONRESYN */
153                         NULL,                   /* invalid */
154                         NULL,                   /* invalid */
155                         sscop_datreq_ready,     /* SOS_READY */
156                         sscop_aa_noop_1         /* SOS_TERM */
157 };
158
159 /* SSCOP_RESYNC_REQ */
160 static void     (*sscop_resreq_tab[SOS_NUMSTATES])
161                                 __P((struct sscop *, int, int)) = {
162                         NULL,                   /* SOS_INST */
163                         NULL,                   /* SOS_IDLE */
164                         NULL,                   /* SOS_OUTCONN */
165                         NULL,                   /* SOS_INCONN */
166                         NULL,                   /* SOS_OUTDISC */
167                         NULL,                   /* SOS_OUTRESYN */
168                         NULL,                   /* SOS_INRESYN */
169                         NULL,                   /* SOS_CONRESYN */
170                         NULL,                   /* invalid */
171                         NULL,                   /* invalid */
172                         sscop_resreq_ready,     /* SOS_READY */
173                         sscop_aa_noop_1         /* SOS_TERM */
174 };
175
176 /* SSCOP_RESYNC_RSP */
177 static void     (*sscop_resrsp_tab[SOS_NUMSTATES])
178                                 __P((struct sscop *, int, int)) = {
179                         NULL,                   /* SOS_INST */
180                         NULL,                   /* SOS_IDLE */
181                         NULL,                   /* SOS_OUTCONN */
182                         NULL,                   /* SOS_INCONN */
183                         NULL,                   /* SOS_OUTDISC */
184                         NULL,                   /* SOS_OUTRESYN */
185                         sscop_resrsp_inresyn,   /* SOS_INRESYN */
186                         sscop_resrsp_conresyn,  /* SOS_CONRESYN */
187                         NULL,                   /* invalid */
188                         NULL,                   /* invalid */
189                         NULL,                   /* SOS_READY */
190                         sscop_aa_noop_0         /* SOS_TERM */
191 };
192
193 /* SSCOP_UNITDATA_REQ */
194 static void     (*sscop_udtreq_tab[SOS_NUMSTATES])
195                                 __P((struct sscop *, int, int)) = {
196                         NULL,                   /* SOS_INST */
197                         sscop_udtreq_all,       /* SOS_IDLE */
198                         sscop_udtreq_all,       /* SOS_OUTCONN */
199                         sscop_udtreq_all,       /* SOS_INCONN */
200                         sscop_udtreq_all,       /* SOS_OUTDISC */
201                         sscop_udtreq_all,       /* SOS_OUTRESYN */
202                         sscop_udtreq_all,       /* SOS_INRESYN */
203                         sscop_udtreq_all,       /* SOS_CONRESYN */
204                         NULL,                   /* invalid */
205                         NULL,                   /* invalid */
206                         sscop_udtreq_all,       /* SOS_READY */
207                         sscop_aa_noop_1         /* SOS_TERM */
208 };
209
210
211 /*
212  * Stack command lookup table
213  */
214 void    (*(*sscop_qsaal_aatab[SSCOP_CMD_SIZE]))
215                                 __P((struct sscop *, int, int)) = {
216                 NULL,
217                 sscop_init_tab,
218                 sscop_term_tab,
219                 NULL,
220                 NULL,
221                 NULL,
222                 NULL,
223                 NULL,
224                 NULL,
225                 NULL,
226                 NULL,
227                 NULL,
228                 NULL,
229                 NULL,
230                 NULL,
231                 NULL,
232                 sscop_estreq_tab,
233                 NULL,
234                 sscop_estrsp_tab,
235                 NULL,
236                 sscop_relreq_tab,
237                 NULL,
238                 NULL,
239                 sscop_datreq_tab,
240                 NULL,
241                 sscop_resreq_tab,
242                 NULL,
243                 sscop_resrsp_tab,
244                 NULL,
245                 NULL,
246                 NULL,
247                 sscop_udtreq_tab,
248                 NULL,
249                 NULL,
250                 NULL,
251                 NULL
252 };
253
254
255 /*
256  * SSCOP_ESTABLISH_REQ / SOS_READY Command Processor
257  * 
258  * Arguments:
259  *      sop     pointer to sscop connection block
260  *      arg1    pointer to buffer containing SSCOP-UU data
261  *      arg2    buffer release parameter
262  *
263  * Returns:
264  *      none
265  *
266  */
267 static void
268 sscop_estreq_ready(sop, arg1, arg2)
269         struct sscop    *sop;
270         int             arg1;
271         int             arg2;
272 {
273
274         /*
275          * We don't support SSCOP-UU data
276          */
277         if (arg1 != SSCOP_UU_NULL)
278                 KB_FREEALL((KBuffer *)arg1);
279
280         /*
281          * We currently only support BR=YES
282          */
283         if (arg2 != SSCOP_BR_YES) {
284                 sscop_abort(sop, "sscop: BR != YES\n");
285                 return;
286         }
287
288         /*
289          * Stop poll timer
290          */
291         sop->so_timer[SSCOP_T_POLL] = 0;
292         sop->so_flags &= ~SOF_KEEPALIVE;
293
294         /*
295          * Stop lost poll/stat timer
296          */
297         sop->so_timer[SSCOP_T_NORESP] = 0;
298
299         /*
300          * Initialize receiver window
301          */
302         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
303
304         /*
305          * Send first BGN PDU
306          */
307         sop->so_connctl = 1;
308         (void) sscop_send_bgn(sop, SSCOP_SOURCE_USER);
309
310         /*
311          * Reset transmitter state
312          */
313         qsaal1_reset_xmit(sop);
314
315         /*
316          * Set retransmit timer
317          */
318         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
319
320         /*
321          * Wait for BGAK
322          */
323         sop->so_state = SOS_OUTCONN;
324
325         return;
326 }
327
328
329 /*
330  * SSCOP_DATA_REQ / SOS_OUTCONN Command Processor
331  * 
332  * Arguments:
333  *      sop     pointer to sscop connection block
334  *      arg1    pointer to buffer containing assured user data
335  *      arg2    unused
336  *
337  * Returns:
338  *      none
339  *
340  */
341 static void
342 sscop_datreq_outconn(sop, arg1, arg2)
343         struct sscop    *sop;
344         int             arg1;
345         int             arg2;
346 {
347         KBuffer         *m = (KBuffer *)arg1;
348
349         /*
350          * We must have a buffer (even if it contains no data)
351          */
352         if (m == NULL) {
353                 sscop_abort(sop, "sscop_datreq_outconn: no buffer\n");
354                 return;
355         }
356
357         /*
358          * Only accept data here if in the middle of an SSCOP-initiated 
359          * session reestablishment
360          */
361         if ((sop->so_flags & SOF_REESTAB) == 0) {
362                 KB_FREEALL(m);
363                 sscop_abort(sop, "sscop_datreq_outconn: data not allowed\n");
364                 return;
365         }
366
367         /*
368          * Place data at end of transmission queue
369          */
370         KB_QNEXT(m) = NULL;
371         if (sop->so_xmit_hd == NULL)
372                 sop->so_xmit_hd = m;
373         else
374                 KB_QNEXT(sop->so_xmit_tl) = m;
375         sop->so_xmit_tl = m;
376
377         /*
378          * Note that the transmit queues need to be serviced
379          */
380         sop->so_flags |= SOF_XMITSRVC;
381
382         return;
383 }
384
385
386 /*
387  * SSCOP_RESYNC_REQ / SOS_READY Command Processor
388  * 
389  * Arguments:
390  *      sop     pointer to sscop connection block
391  *      arg1    pointer to buffer containing SSCOP-UU data
392  *      arg2    unused
393  *
394  * Returns:
395  *      none
396  *
397  */
398 static void
399 sscop_resreq_ready(sop, arg1, arg2)
400         struct sscop    *sop;
401         int             arg1;
402         int             arg2;
403 {
404
405         /*
406          * We don't support SSCOP-UU data
407          */
408         if (arg1 != SSCOP_UU_NULL)
409                 KB_FREEALL((KBuffer *)arg1);
410
411         /*
412          * Stop poll timer
413          */
414         sop->so_timer[SSCOP_T_POLL] = 0;
415         sop->so_flags &= ~SOF_KEEPALIVE;
416
417         /*
418          * Stop lost poll/stat timer
419          */
420         sop->so_timer[SSCOP_T_NORESP] = 0;
421
422         /*
423          * Send first RS PDU
424          */
425         sop->so_connctl = 1;
426         (void) sscop_send_rs(sop);
427
428         /*
429          * Reset transmitter state
430          */
431         qsaal1_reset_xmit(sop);
432
433         /*
434          * Set retransmit timer
435          */
436         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
437
438         /*
439          * Wait for RSAK
440          */
441         sop->so_state = SOS_OUTRESYN;
442
443         return;
444 }
445
446
447 /*
448  * SSCOP_RESYNC_RSP / SOS_INRESYN Command Processor
449  * 
450  * Arguments:
451  *      sop     pointer to sscop connection block
452  *      arg1    unused
453  *      arg2    unused
454  *
455  * Returns:
456  *      none
457  *
458  */
459 static void
460 sscop_resrsp_inresyn(sop, arg1, arg2)
461         struct sscop    *sop;
462         int             arg1;
463         int             arg2;
464 {
465
466         /*
467          * Send RSAK PDU
468          */
469         (void) sscop_send_rsak(sop);
470
471         /*
472          * Back to data transfer state
473          */
474         sop->so_state = SOS_READY;
475
476         return;
477 }
478
479
480 /*
481  * SSCOP_RESYNC_RSP / SOS_CONRESYN Command Processor
482  * 
483  * Arguments:
484  *      sop     pointer to sscop connection block
485  *      arg1    unused
486  *      arg2    unused
487  *
488  * Returns:
489  *      none
490  *
491  */
492 static void
493 sscop_resrsp_conresyn(sop, arg1, arg2)
494         struct sscop    *sop;
495         int             arg1;
496         int             arg2;
497 {
498
499         /*
500          * Send RSAK PDU
501          */
502         (void) sscop_send_rsak(sop);
503
504         /*
505          * Back to waiting for peer's RSAK
506          */
507         sop->so_state = SOS_OUTRESYN;
508
509         return;
510 }
511