fetch.9: Minor fixes.
[dragonfly.git] / sys / netproto / atm / uni / qsaal1_sigaa.c
blob37ab9bff4737d4a51b8e43831c2daf5a00ae4fc8
1 /*
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.6 2006/01/14 13:36:39 swildner Exp $
31 * ATM Forum UNI Support
32 * ---------------------
34 * ITU-T Q.SAAL1 - Process AA-signals (SAP_SSCOP)
38 #include <netproto/atm/kern_include.h>
40 #include "sscop.h"
41 #include "sscop_misc.h"
42 #include "sscop_var.h"
45 * Local functions
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);
55 * Stack command state lookup tables
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
212 * Stack command lookup table
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
256 * SSCOP_ESTABLISH_REQ / SOS_READY Command Processor
258 * Arguments:
259 * sop pointer to sscop connection block
260 * arg1 pointer to buffer containing SSCOP-UU data
261 * arg2 buffer release parameter
263 * Returns:
264 * none
267 static void
268 sscop_estreq_ready(struct sscop *sop, int arg1, int arg2)
272 * We don't support SSCOP-UU data
274 if (arg1 != SSCOP_UU_NULL)
275 KB_FREEALL((KBuffer *)arg1);
278 * We currently only support BR=YES
280 if (arg2 != SSCOP_BR_YES) {
281 sscop_abort(sop, "sscop: BR != YES\n");
282 return;
286 * Stop poll timer
288 sop->so_timer[SSCOP_T_POLL] = 0;
289 sop->so_flags &= ~SOF_KEEPALIVE;
292 * Stop lost poll/stat timer
294 sop->so_timer[SSCOP_T_NORESP] = 0;
297 * Initialize receiver window
299 SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
302 * Send first BGN PDU
304 sop->so_connctl = 1;
305 sscop_send_bgn(sop, SSCOP_SOURCE_USER);
308 * Reset transmitter state
310 qsaal1_reset_xmit(sop);
313 * Set retransmit timer
315 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
318 * Wait for BGAK
320 sop->so_state = SOS_OUTCONN;
322 return;
327 * SSCOP_DATA_REQ / SOS_OUTCONN Command Processor
329 * Arguments:
330 * sop pointer to sscop connection block
331 * arg1 pointer to buffer containing assured user data
332 * arg2 unused
334 * Returns:
335 * none
338 static void
339 sscop_datreq_outconn(struct sscop *sop, int arg1, int arg2)
341 KBuffer *m = (KBuffer *)arg1;
344 * We must have a buffer (even if it contains no data)
346 if (m == NULL) {
347 sscop_abort(sop, "sscop_datreq_outconn: no buffer\n");
348 return;
352 * Only accept data here if in the middle of an SSCOP-initiated
353 * session reestablishment
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;
362 * Place data at end of transmission queue
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;
372 * Note that the transmit queues need to be serviced
374 sop->so_flags |= SOF_XMITSRVC;
376 return;
381 * SSCOP_RESYNC_REQ / SOS_READY Command Processor
383 * Arguments:
384 * sop pointer to sscop connection block
385 * arg1 pointer to buffer containing SSCOP-UU data
386 * arg2 unused
388 * Returns:
389 * none
392 static void
393 sscop_resreq_ready(struct sscop *sop, int arg1, int arg2)
397 * We don't support SSCOP-UU data
399 if (arg1 != SSCOP_UU_NULL)
400 KB_FREEALL((KBuffer *)arg1);
403 * Stop poll timer
405 sop->so_timer[SSCOP_T_POLL] = 0;
406 sop->so_flags &= ~SOF_KEEPALIVE;
409 * Stop lost poll/stat timer
411 sop->so_timer[SSCOP_T_NORESP] = 0;
414 * Send first RS PDU
416 sop->so_connctl = 1;
417 sscop_send_rs(sop);
420 * Reset transmitter state
422 qsaal1_reset_xmit(sop);
425 * Set retransmit timer
427 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
430 * Wait for RSAK
432 sop->so_state = SOS_OUTRESYN;
434 return;
439 * SSCOP_RESYNC_RSP / SOS_INRESYN Command Processor
441 * Arguments:
442 * sop pointer to sscop connection block
443 * arg1 unused
444 * arg2 unused
446 * Returns:
447 * none
450 static void
451 sscop_resrsp_inresyn(struct sscop *sop, int arg1, int arg2)
455 * Send RSAK PDU
457 sscop_send_rsak(sop);
460 * Back to data transfer state
462 sop->so_state = SOS_READY;
464 return;
469 * SSCOP_RESYNC_RSP / SOS_CONRESYN Command Processor
471 * Arguments:
472 * sop pointer to sscop connection block
473 * arg1 unused
474 * arg2 unused
476 * Returns:
477 * none
480 static void
481 sscop_resrsp_conresyn(struct sscop *sop, int arg1, int arg2)
485 * Send RSAK PDU
487 sscop_send_rsak(sop);
490 * Back to waiting for peer's RSAK
492 sop->so_state = SOS_OUTRESYN;
494 return;