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/sscop_sigaa.c,v 1.4 2000/01/17 20:49:52 mks Exp $
31 * ATM Forum UNI Support
32 * ---------------------
34 * SSCOP Common - Process AA-signals (SAP_SSCOP)
38 #include <netatm/kern_include.h>
40 #include <netatm/uni/sscop.h>
41 #include <netatm/uni/sscop_misc.h>
42 #include <netatm/uni/sscop_var.h>
45 __RCSID("@(#) $FreeBSD: src/sys/netatm/uni/sscop_sigaa.c,v 1.4 2000/01/17 20:49:52 mks Exp $");
50 * SSCOP_ESTABLISH_REQ / SOS_IDLE Command Processor
53 * sop pointer to sscop connection block
54 * arg1 pointer to buffer containing SSCOP-UU data
55 * arg2 buffer release parameter
62 sscop_estreq_idle(sop, arg1, arg2)
69 * We don't support SSCOP-UU data
71 if (arg1 != SSCOP_UU_NULL)
72 KB_FREEALL((KBuffer *)arg1);
75 * We currently only support BR=YES
77 if (arg2 != SSCOP_BR_YES) {
78 sscop_abort(sop, "sscop: BR != YES\n");
83 * Initialize receiver window
85 SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
91 SEQ_INCR(sop->so_sendconn, 1);
92 (void) sscop_send_bgn(sop, SSCOP_SOURCE_USER);
95 * Reset transmitter state
97 if (sop->so_vers == SSCOP_VERS_Q2110)
98 q2110_clear_xmit(sop);
100 qsaal1_reset_xmit(sop);
103 * Set retransmit timer
105 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
110 sop->so_state = SOS_OUTCONN;
117 * SSCOP_ESTABLISH_RSP / SOS_INCONN Command Processor
120 * sop pointer to sscop connection block
121 * arg1 pointer to buffer containing SSCOP-UU data
122 * arg2 buffer release parameter
129 sscop_estrsp_inconn(sop, arg1, arg2)
136 * We don't support SSCOP-UU data
138 if (arg1 != SSCOP_UU_NULL)
139 KB_FREEALL((KBuffer *)arg1);
142 * We currently only support BR=YES
144 if (arg2 != SSCOP_BR_YES) {
145 sscop_abort(sop, "sscop: BR != YES\n");
149 if (sop->so_vers == SSCOP_VERS_Q2110) {
151 * Clear transmitter buffers
153 q2110_clear_xmit(sop);
156 * Initialize state variables
158 SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
159 q2110_init_state(sop);
162 * Reset transmitter state
164 qsaal1_reset_xmit(sop);
170 (void) sscop_send_bgak(sop);
173 * Start polling timer
175 sop->so_timer[SSCOP_T_POLL] = sop->so_parm.sp_timepoll;
178 * Start lost poll/stat timer
180 sop->so_timer[SSCOP_T_NORESP] = sop->so_parm.sp_timeresp;
183 * OK, we're ready for data
185 sop->so_state = SOS_READY;
188 * See if transmit queues need servicing
190 if (sop->so_flags & SOF_XMITSRVC)
191 sscop_service_xmit(sop);
198 * SSCOP_RELEASE_REQ / SOS_OUTCONN Command Processor
201 * sop pointer to sscop connection block
202 * arg1 pointer to buffer containing SSCOP-UU data
210 sscop_relreq_outconn(sop, arg1, arg2)
217 * We don't support SSCOP-UU data
219 if (arg1 != SSCOP_UU_NULL)
220 KB_FREEALL((KBuffer *)arg1);
223 * Stop retransmit timer
225 sop->so_timer[SSCOP_T_CC] = 0;
228 * Clear reestablishment flag
230 sop->so_flags &= ~SOF_REESTAB;
236 (void) sscop_send_end(sop, SSCOP_SOURCE_USER);
238 if (sop->so_vers == SSCOP_VERS_QSAAL)
240 * Clear connection data
242 qsaal1_clear_connection(sop);
245 * Set retransmit timer
247 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
252 sop->so_state = SOS_OUTDISC;
259 * SSCOP_RELEASE_REQ / SOS_INCONN Command Processor
262 * sop pointer to sscop connection block
263 * arg1 pointer to buffer containing SSCOP-UU data
271 sscop_relreq_inconn(sop, arg1, arg2)
278 * We don't support SSCOP-UU data
280 if (arg1 != SSCOP_UU_NULL)
281 KB_FREEALL((KBuffer *)arg1);
286 (void) sscop_send_bgrej(sop);
291 sop->so_state = SOS_IDLE;
298 * SSCOP_RELEASE_REQ / SOS_READY Command Processor
301 * sop pointer to sscop connection block
302 * arg1 pointer to buffer containing SSCOP-UU data
310 sscop_relreq_ready(sop, arg1, arg2)
317 * We don't support SSCOP-UU data
319 if (arg1 != SSCOP_UU_NULL)
320 KB_FREEALL((KBuffer *)arg1);
323 * Stop data transfer timers
325 sop->so_timer[SSCOP_T_POLL] = 0;
326 sop->so_timer[SSCOP_T_NORESP] = 0;
327 sop->so_timer[SSCOP_T_IDLE] = 0;
328 sop->so_flags &= ~SOF_KEEPALIVE;
334 (void) sscop_send_end(sop, SSCOP_SOURCE_USER);
336 if (sop->so_vers == SSCOP_VERS_Q2110) {
338 * Clear out appropriate queues
340 if (sop->so_state == SOS_READY)
341 q2110_prep_retrieve(sop);
343 sscop_rcvr_drain(sop);
346 * Clear connection data
348 qsaal1_clear_connection(sop);
352 * Set retransmit timer
354 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
359 sop->so_state = SOS_OUTDISC;
366 * SSCOP_DATA_REQ / SOS_READY Command Processor
369 * sop pointer to sscop connection block
370 * arg1 pointer to buffer containing assured user data
378 sscop_datreq_ready(sop, arg1, arg2)
383 KBuffer *m = (KBuffer *)arg1;
386 * We must have a buffer (even if it contains no data)
389 sscop_abort(sop, "sscop_datreq_ready: no buffer\n");
394 * Place data at end of transmission queue
397 if (sop->so_xmit_hd == NULL)
400 KB_QNEXT(sop->so_xmit_tl) = m;
404 * Service the transmit queues
406 sscop_service_xmit(sop);
413 * SSCOP_UNITDATA_REQ / SOS_* Command Processor
416 * sop pointer to sscop connection block
417 * arg1 pointer to buffer containing unassured user data
425 sscop_udtreq_all(sop, arg1, arg2)
430 KBuffer *m = (KBuffer *)arg1;
433 * We must have a buffer (even if it contains no data)
436 sscop_abort(sop, "sscop_udtreq_all: no buffer\n");
441 * Send the data in a UD PDU
443 (void) sscop_send_ud(sop, m);