3 * ===================================
4 * HARP | Host ATM Research Platform
5 * ===================================
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.
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.
21 * Copyright 1994-1998 Network Computing Services, Inc.
23 * Copies of this Software may be made, however, the above copyright
24 * notice must be reproduced on all copies.
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 $
31 * ATM Forum UNI Support
32 * ---------------------
34 * ITU-T Q.SAAL1 - Process AA-signals (SAP_SSCOP)
38 #include <netproto/atm/kern_include.h>
41 #include "sscop_misc.h"
42 #include "sscop_var.h"
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));
55 * Stack command state lookup tables
58 static void (*sscop_init_tab[SOS_NUMSTATES])
59 __P((struct sscop *, int, int)) = {
60 sscop_init_inst, /* SOS_INST */
62 NULL, /* SOS_OUTCONN */
63 NULL, /* SOS_INCONN */
64 NULL, /* SOS_OUTDISC */
65 NULL, /* SOS_OUTRESYN */
66 NULL, /* SOS_INRESYN */
67 NULL, /* SOS_CONRESYN */
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 */
87 sscop_term_all, /* SOS_READY */
88 sscop_term_all /* SOS_TERM */
91 /* SSCOP_ESTABLISH_REQ */
92 static void (*sscop_estreq_tab[SOS_NUMSTATES])
93 __P((struct sscop *, int, int)) = {
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 */
104 sscop_estreq_ready, /* SOS_READY */
105 sscop_aa_noop_1 /* SOS_TERM */
108 /* SSCOP_ESTABLISH_RSP */
109 static void (*sscop_estrsp_tab[SOS_NUMSTATES])
110 __P((struct sscop *, int, int)) = {
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 */
121 sscop_aa_noop_1, /* SOS_READY */
122 sscop_aa_noop_1 /* SOS_TERM */
125 /* SSCOP_RELEASE_REQ */
126 static void (*sscop_relreq_tab[SOS_NUMSTATES])
127 __P((struct sscop *, int, int)) = {
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 */
138 sscop_relreq_ready, /* SOS_READY */
139 sscop_aa_noop_1 /* SOS_TERM */
143 static void (*sscop_datreq_tab[SOS_NUMSTATES])
144 __P((struct sscop *, int, int)) = {
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 */
155 sscop_datreq_ready, /* SOS_READY */
156 sscop_aa_noop_1 /* SOS_TERM */
159 /* SSCOP_RESYNC_REQ */
160 static void (*sscop_resreq_tab[SOS_NUMSTATES])
161 __P((struct sscop *, int, int)) = {
164 NULL, /* SOS_OUTCONN */
165 NULL, /* SOS_INCONN */
166 NULL, /* SOS_OUTDISC */
167 NULL, /* SOS_OUTRESYN */
168 NULL, /* SOS_INRESYN */
169 NULL, /* SOS_CONRESYN */
172 sscop_resreq_ready, /* SOS_READY */
173 sscop_aa_noop_1 /* SOS_TERM */
176 /* SSCOP_RESYNC_RSP */
177 static void (*sscop_resrsp_tab[SOS_NUMSTATES])
178 __P((struct sscop *, int, int)) = {
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 */
189 NULL, /* SOS_READY */
190 sscop_aa_noop_0 /* SOS_TERM */
193 /* SSCOP_UNITDATA_REQ */
194 static void (*sscop_udtreq_tab[SOS_NUMSTATES])
195 __P((struct sscop *, int, int)) = {
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 */
206 sscop_udtreq_all, /* SOS_READY */
207 sscop_aa_noop_1 /* SOS_TERM */
212 * Stack command lookup table
214 void (*(*sscop_qsaal_aatab[SSCOP_CMD_SIZE]))
215 __P((struct sscop *, int, int)) = {
256 * SSCOP_ESTABLISH_REQ / SOS_READY Command Processor
259 * sop pointer to sscop connection block
260 * arg1 pointer to buffer containing SSCOP-UU data
261 * arg2 buffer release parameter
268 sscop_estreq_ready(sop, arg1, arg2)
275 * We don't support SSCOP-UU data
277 if (arg1 != SSCOP_UU_NULL)
278 KB_FREEALL((KBuffer *)arg1);
281 * We currently only support BR=YES
283 if (arg2 != SSCOP_BR_YES) {
284 sscop_abort(sop, "sscop: BR != YES\n");
291 sop->so_timer[SSCOP_T_POLL] = 0;
292 sop->so_flags &= ~SOF_KEEPALIVE;
295 * Stop lost poll/stat timer
297 sop->so_timer[SSCOP_T_NORESP] = 0;
300 * Initialize receiver window
302 SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
308 (void) sscop_send_bgn(sop, SSCOP_SOURCE_USER);
311 * Reset transmitter state
313 qsaal1_reset_xmit(sop);
316 * Set retransmit timer
318 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
323 sop->so_state = SOS_OUTCONN;
330 * SSCOP_DATA_REQ / SOS_OUTCONN Command Processor
333 * sop pointer to sscop connection block
334 * arg1 pointer to buffer containing assured user data
342 sscop_datreq_outconn(sop, arg1, arg2)
347 KBuffer *m = (KBuffer *)arg1;
350 * We must have a buffer (even if it contains no data)
353 sscop_abort(sop, "sscop_datreq_outconn: no buffer\n");
358 * Only accept data here if in the middle of an SSCOP-initiated
359 * session reestablishment
361 if ((sop->so_flags & SOF_REESTAB) == 0) {
363 sscop_abort(sop, "sscop_datreq_outconn: data not allowed\n");
368 * Place data at end of transmission queue
371 if (sop->so_xmit_hd == NULL)
374 KB_QNEXT(sop->so_xmit_tl) = m;
378 * Note that the transmit queues need to be serviced
380 sop->so_flags |= SOF_XMITSRVC;
387 * SSCOP_RESYNC_REQ / SOS_READY Command Processor
390 * sop pointer to sscop connection block
391 * arg1 pointer to buffer containing SSCOP-UU data
399 sscop_resreq_ready(sop, arg1, arg2)
406 * We don't support SSCOP-UU data
408 if (arg1 != SSCOP_UU_NULL)
409 KB_FREEALL((KBuffer *)arg1);
414 sop->so_timer[SSCOP_T_POLL] = 0;
415 sop->so_flags &= ~SOF_KEEPALIVE;
418 * Stop lost poll/stat timer
420 sop->so_timer[SSCOP_T_NORESP] = 0;
426 (void) sscop_send_rs(sop);
429 * Reset transmitter state
431 qsaal1_reset_xmit(sop);
434 * Set retransmit timer
436 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
441 sop->so_state = SOS_OUTRESYN;
448 * SSCOP_RESYNC_RSP / SOS_INRESYN Command Processor
451 * sop pointer to sscop connection block
460 sscop_resrsp_inresyn(sop, arg1, arg2)
469 (void) sscop_send_rsak(sop);
472 * Back to data transfer state
474 sop->so_state = SOS_READY;
481 * SSCOP_RESYNC_RSP / SOS_CONRESYN Command Processor
484 * sop pointer to sscop connection block
493 sscop_resrsp_conresyn(sop, arg1, arg2)
502 (void) sscop_send_rsak(sop);
505 * Back to waiting for peer's RSAK
507 sop->so_state = SOS_OUTRESYN;