* Remove (void) casts for discarded return values.
[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.6 2006/01/14 13:36:39 swildner 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 (struct sscop *, int, int);
48 static void     sscop_datreq_outconn (struct sscop *, int, int);
49 static void     sscop_resreq_ready (struct sscop *, int, int);
50 static void     sscop_resrsp_inresyn (struct sscop *, int, int);
51 static void     sscop_resrsp_conresyn (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                                 (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                                 (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                                 (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                                 (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                                 (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                                 (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                                 (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                                 (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                                 (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                                 (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(struct sscop *sop, int arg1, int arg2)
269 {
270
271         /*
272          * We don't support SSCOP-UU data
273          */
274         if (arg1 != SSCOP_UU_NULL)
275                 KB_FREEALL((KBuffer *)arg1);
276
277         /*
278          * We currently only support BR=YES
279          */
280         if (arg2 != SSCOP_BR_YES) {
281                 sscop_abort(sop, "sscop: BR != YES\n");
282                 return;
283         }
284
285         /*
286          * Stop poll timer
287          */
288         sop->so_timer[SSCOP_T_POLL] = 0;
289         sop->so_flags &= ~SOF_KEEPALIVE;
290
291         /*
292          * Stop lost poll/stat timer
293          */
294         sop->so_timer[SSCOP_T_NORESP] = 0;
295
296         /*
297          * Initialize receiver window
298          */
299         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
300
301         /*
302          * Send first BGN PDU
303          */
304         sop->so_connctl = 1;
305         sscop_send_bgn(sop, SSCOP_SOURCE_USER);
306
307         /*
308          * Reset transmitter state
309          */
310         qsaal1_reset_xmit(sop);
311
312         /*
313          * Set retransmit timer
314          */
315         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
316
317         /*
318          * Wait for BGAK
319          */
320         sop->so_state = SOS_OUTCONN;
321
322         return;
323 }
324
325
326 /*
327  * SSCOP_DATA_REQ / SOS_OUTCONN Command Processor
328  * 
329  * Arguments:
330  *      sop     pointer to sscop connection block
331  *      arg1    pointer to buffer containing assured user data
332  *      arg2    unused
333  *
334  * Returns:
335  *      none
336  *
337  */
338 static void
339 sscop_datreq_outconn(struct sscop *sop, int arg1, int arg2)
340 {
341         KBuffer         *m = (KBuffer *)arg1;
342
343         /*
344          * We must have a buffer (even if it contains no data)
345          */
346         if (m == NULL) {
347                 sscop_abort(sop, "sscop_datreq_outconn: no buffer\n");
348                 return;
349         }
350
351         /*
352          * Only accept data here if in the middle of an SSCOP-initiated 
353          * session reestablishment
354          */
355         if ((sop->so_flags & SOF_REESTAB) == 0) {
356                 KB_FREEALL(m);
357                 sscop_abort(sop, "sscop_datreq_outconn: data not allowed\n");
358                 return;
359         }
360
361         /*
362          * Place data at end of transmission queue
363          */
364         KB_QNEXT(m) = NULL;
365         if (sop->so_xmit_hd == NULL)
366                 sop->so_xmit_hd = m;
367         else
368                 KB_QNEXT(sop->so_xmit_tl) = m;
369         sop->so_xmit_tl = m;
370
371         /*
372          * Note that the transmit queues need to be serviced
373          */
374         sop->so_flags |= SOF_XMITSRVC;
375
376         return;
377 }
378
379
380 /*
381  * SSCOP_RESYNC_REQ / SOS_READY Command Processor
382  * 
383  * Arguments:
384  *      sop     pointer to sscop connection block
385  *      arg1    pointer to buffer containing SSCOP-UU data
386  *      arg2    unused
387  *
388  * Returns:
389  *      none
390  *
391  */
392 static void
393 sscop_resreq_ready(struct sscop *sop, int arg1, int arg2)
394 {
395
396         /*
397          * We don't support SSCOP-UU data
398          */
399         if (arg1 != SSCOP_UU_NULL)
400                 KB_FREEALL((KBuffer *)arg1);
401
402         /*
403          * Stop poll timer
404          */
405         sop->so_timer[SSCOP_T_POLL] = 0;
406         sop->so_flags &= ~SOF_KEEPALIVE;
407
408         /*
409          * Stop lost poll/stat timer
410          */
411         sop->so_timer[SSCOP_T_NORESP] = 0;
412
413         /*
414          * Send first RS PDU
415          */
416         sop->so_connctl = 1;
417         sscop_send_rs(sop);
418
419         /*
420          * Reset transmitter state
421          */
422         qsaal1_reset_xmit(sop);
423
424         /*
425          * Set retransmit timer
426          */
427         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
428
429         /*
430          * Wait for RSAK
431          */
432         sop->so_state = SOS_OUTRESYN;
433
434         return;
435 }
436
437
438 /*
439  * SSCOP_RESYNC_RSP / SOS_INRESYN Command Processor
440  * 
441  * Arguments:
442  *      sop     pointer to sscop connection block
443  *      arg1    unused
444  *      arg2    unused
445  *
446  * Returns:
447  *      none
448  *
449  */
450 static void
451 sscop_resrsp_inresyn(struct sscop *sop, int arg1, int arg2)
452 {
453
454         /*
455          * Send RSAK PDU
456          */
457         sscop_send_rsak(sop);
458
459         /*
460          * Back to data transfer state
461          */
462         sop->so_state = SOS_READY;
463
464         return;
465 }
466
467
468 /*
469  * SSCOP_RESYNC_RSP / SOS_CONRESYN Command Processor
470  * 
471  * Arguments:
472  *      sop     pointer to sscop connection block
473  *      arg1    unused
474  *      arg2    unused
475  *
476  * Returns:
477  *      none
478  *
479  */
480 static void
481 sscop_resrsp_conresyn(struct sscop *sop, int arg1, int arg2)
482 {
483
484         /*
485          * Send RSAK PDU
486          */
487         sscop_send_rsak(sop);
488
489         /*
490          * Back to waiting for peer's RSAK
491          */
492         sop->so_state = SOS_OUTRESYN;
493
494         return;
495 }
496