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 $
27 * @(#) $DragonFly: src/sys/netproto/atm/uni/sscop_sigaa.c,v 1.4 2003/08/07 21:54:34 dillon Exp $
31 * ATM Forum UNI Support
32 * ---------------------
34 * SSCOP Common - Process AA-signals (SAP_SSCOP)
38 #include <netproto/atm/kern_include.h>
41 #include "sscop_misc.h"
42 #include "sscop_var.h"
45 * SSCOP_ESTABLISH_REQ / SOS_IDLE Command Processor
48 * sop pointer to sscop connection block
49 * arg1 pointer to buffer containing SSCOP-UU data
50 * arg2 buffer release parameter
57 sscop_estreq_idle(sop, arg1, arg2)
64 * We don't support SSCOP-UU data
66 if (arg1 != SSCOP_UU_NULL)
67 KB_FREEALL((KBuffer *)arg1);
70 * We currently only support BR=YES
72 if (arg2 != SSCOP_BR_YES) {
73 sscop_abort(sop, "sscop: BR != YES\n");
78 * Initialize receiver window
80 SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
86 SEQ_INCR(sop->so_sendconn, 1);
87 (void) sscop_send_bgn(sop, SSCOP_SOURCE_USER);
90 * Reset transmitter state
92 if (sop->so_vers == SSCOP_VERS_Q2110)
93 q2110_clear_xmit(sop);
95 qsaal1_reset_xmit(sop);
98 * Set retransmit timer
100 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
105 sop->so_state = SOS_OUTCONN;
112 * SSCOP_ESTABLISH_RSP / SOS_INCONN Command Processor
115 * sop pointer to sscop connection block
116 * arg1 pointer to buffer containing SSCOP-UU data
117 * arg2 buffer release parameter
124 sscop_estrsp_inconn(sop, arg1, arg2)
131 * We don't support SSCOP-UU data
133 if (arg1 != SSCOP_UU_NULL)
134 KB_FREEALL((KBuffer *)arg1);
137 * We currently only support BR=YES
139 if (arg2 != SSCOP_BR_YES) {
140 sscop_abort(sop, "sscop: BR != YES\n");
144 if (sop->so_vers == SSCOP_VERS_Q2110) {
146 * Clear transmitter buffers
148 q2110_clear_xmit(sop);
151 * Initialize state variables
153 SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
154 q2110_init_state(sop);
157 * Reset transmitter state
159 qsaal1_reset_xmit(sop);
165 (void) sscop_send_bgak(sop);
168 * Start polling timer
170 sop->so_timer[SSCOP_T_POLL] = sop->so_parm.sp_timepoll;
173 * Start lost poll/stat timer
175 sop->so_timer[SSCOP_T_NORESP] = sop->so_parm.sp_timeresp;
178 * OK, we're ready for data
180 sop->so_state = SOS_READY;
183 * See if transmit queues need servicing
185 if (sop->so_flags & SOF_XMITSRVC)
186 sscop_service_xmit(sop);
193 * SSCOP_RELEASE_REQ / SOS_OUTCONN Command Processor
196 * sop pointer to sscop connection block
197 * arg1 pointer to buffer containing SSCOP-UU data
205 sscop_relreq_outconn(sop, arg1, arg2)
212 * We don't support SSCOP-UU data
214 if (arg1 != SSCOP_UU_NULL)
215 KB_FREEALL((KBuffer *)arg1);
218 * Stop retransmit timer
220 sop->so_timer[SSCOP_T_CC] = 0;
223 * Clear reestablishment flag
225 sop->so_flags &= ~SOF_REESTAB;
231 (void) sscop_send_end(sop, SSCOP_SOURCE_USER);
233 if (sop->so_vers == SSCOP_VERS_QSAAL)
235 * Clear connection data
237 qsaal1_clear_connection(sop);
240 * Set retransmit timer
242 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
247 sop->so_state = SOS_OUTDISC;
254 * SSCOP_RELEASE_REQ / SOS_INCONN Command Processor
257 * sop pointer to sscop connection block
258 * arg1 pointer to buffer containing SSCOP-UU data
266 sscop_relreq_inconn(sop, arg1, arg2)
273 * We don't support SSCOP-UU data
275 if (arg1 != SSCOP_UU_NULL)
276 KB_FREEALL((KBuffer *)arg1);
281 (void) sscop_send_bgrej(sop);
286 sop->so_state = SOS_IDLE;
293 * SSCOP_RELEASE_REQ / SOS_READY Command Processor
296 * sop pointer to sscop connection block
297 * arg1 pointer to buffer containing SSCOP-UU data
305 sscop_relreq_ready(sop, arg1, arg2)
312 * We don't support SSCOP-UU data
314 if (arg1 != SSCOP_UU_NULL)
315 KB_FREEALL((KBuffer *)arg1);
318 * Stop data transfer timers
320 sop->so_timer[SSCOP_T_POLL] = 0;
321 sop->so_timer[SSCOP_T_NORESP] = 0;
322 sop->so_timer[SSCOP_T_IDLE] = 0;
323 sop->so_flags &= ~SOF_KEEPALIVE;
329 (void) sscop_send_end(sop, SSCOP_SOURCE_USER);
331 if (sop->so_vers == SSCOP_VERS_Q2110) {
333 * Clear out appropriate queues
335 if (sop->so_state == SOS_READY)
336 q2110_prep_retrieve(sop);
338 sscop_rcvr_drain(sop);
341 * Clear connection data
343 qsaal1_clear_connection(sop);
347 * Set retransmit timer
349 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
354 sop->so_state = SOS_OUTDISC;
361 * SSCOP_DATA_REQ / SOS_READY Command Processor
364 * sop pointer to sscop connection block
365 * arg1 pointer to buffer containing assured user data
373 sscop_datreq_ready(sop, arg1, arg2)
378 KBuffer *m = (KBuffer *)arg1;
381 * We must have a buffer (even if it contains no data)
384 sscop_abort(sop, "sscop_datreq_ready: no buffer\n");
389 * Place data at end of transmission queue
392 if (sop->so_xmit_hd == NULL)
395 KB_QNEXT(sop->so_xmit_tl) = m;
399 * Service the transmit queues
401 sscop_service_xmit(sop);
408 * SSCOP_UNITDATA_REQ / SOS_* Command Processor
411 * sop pointer to sscop connection block
412 * arg1 pointer to buffer containing unassured user data
420 sscop_udtreq_all(sop, arg1, arg2)
425 KBuffer *m = (KBuffer *)arg1;
428 * We must have a buffer (even if it contains no data)
431 sscop_abort(sop, "sscop_udtreq_all: no buffer\n");
436 * Send the data in a UD PDU
438 (void) sscop_send_ud(sop, m);