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.5 2006/01/14 13:36:39 swildner 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(struct sscop *sop, int arg1, int arg2)
61 * We don't support SSCOP-UU data
63 if (arg1 != SSCOP_UU_NULL)
64 KB_FREEALL((KBuffer *)arg1);
67 * We currently only support BR=YES
69 if (arg2 != SSCOP_BR_YES) {
70 sscop_abort(sop, "sscop: BR != YES\n");
75 * Initialize receiver window
77 SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
83 SEQ_INCR(sop->so_sendconn, 1);
84 sscop_send_bgn(sop, SSCOP_SOURCE_USER);
87 * Reset transmitter state
89 if (sop->so_vers == SSCOP_VERS_Q2110)
90 q2110_clear_xmit(sop);
92 qsaal1_reset_xmit(sop);
95 * Set retransmit timer
97 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
102 sop->so_state = SOS_OUTCONN;
109 * SSCOP_ESTABLISH_RSP / SOS_INCONN Command Processor
112 * sop pointer to sscop connection block
113 * arg1 pointer to buffer containing SSCOP-UU data
114 * arg2 buffer release parameter
121 sscop_estrsp_inconn(struct sscop *sop, int arg1, int arg2)
125 * We don't support SSCOP-UU data
127 if (arg1 != SSCOP_UU_NULL)
128 KB_FREEALL((KBuffer *)arg1);
131 * We currently only support BR=YES
133 if (arg2 != SSCOP_BR_YES) {
134 sscop_abort(sop, "sscop: BR != YES\n");
138 if (sop->so_vers == SSCOP_VERS_Q2110) {
140 * Clear transmitter buffers
142 q2110_clear_xmit(sop);
145 * Initialize state variables
147 SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
148 q2110_init_state(sop);
151 * Reset transmitter state
153 qsaal1_reset_xmit(sop);
159 sscop_send_bgak(sop);
162 * Start polling timer
164 sop->so_timer[SSCOP_T_POLL] = sop->so_parm.sp_timepoll;
167 * Start lost poll/stat timer
169 sop->so_timer[SSCOP_T_NORESP] = sop->so_parm.sp_timeresp;
172 * OK, we're ready for data
174 sop->so_state = SOS_READY;
177 * See if transmit queues need servicing
179 if (sop->so_flags & SOF_XMITSRVC)
180 sscop_service_xmit(sop);
187 * SSCOP_RELEASE_REQ / SOS_OUTCONN Command Processor
190 * sop pointer to sscop connection block
191 * arg1 pointer to buffer containing SSCOP-UU data
199 sscop_relreq_outconn(struct sscop *sop, int arg1, int arg2)
203 * We don't support SSCOP-UU data
205 if (arg1 != SSCOP_UU_NULL)
206 KB_FREEALL((KBuffer *)arg1);
209 * Stop retransmit timer
211 sop->so_timer[SSCOP_T_CC] = 0;
214 * Clear reestablishment flag
216 sop->so_flags &= ~SOF_REESTAB;
222 sscop_send_end(sop, SSCOP_SOURCE_USER);
224 if (sop->so_vers == SSCOP_VERS_QSAAL)
226 * Clear connection data
228 qsaal1_clear_connection(sop);
231 * Set retransmit timer
233 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
238 sop->so_state = SOS_OUTDISC;
245 * SSCOP_RELEASE_REQ / SOS_INCONN Command Processor
248 * sop pointer to sscop connection block
249 * arg1 pointer to buffer containing SSCOP-UU data
257 sscop_relreq_inconn(struct sscop *sop, int arg1, int arg2)
261 * We don't support SSCOP-UU data
263 if (arg1 != SSCOP_UU_NULL)
264 KB_FREEALL((KBuffer *)arg1);
269 sscop_send_bgrej(sop);
274 sop->so_state = SOS_IDLE;
281 * SSCOP_RELEASE_REQ / SOS_READY Command Processor
284 * sop pointer to sscop connection block
285 * arg1 pointer to buffer containing SSCOP-UU data
293 sscop_relreq_ready(struct sscop *sop, int arg1, int arg2)
297 * We don't support SSCOP-UU data
299 if (arg1 != SSCOP_UU_NULL)
300 KB_FREEALL((KBuffer *)arg1);
303 * Stop data transfer timers
305 sop->so_timer[SSCOP_T_POLL] = 0;
306 sop->so_timer[SSCOP_T_NORESP] = 0;
307 sop->so_timer[SSCOP_T_IDLE] = 0;
308 sop->so_flags &= ~SOF_KEEPALIVE;
314 sscop_send_end(sop, SSCOP_SOURCE_USER);
316 if (sop->so_vers == SSCOP_VERS_Q2110) {
318 * Clear out appropriate queues
320 if (sop->so_state == SOS_READY)
321 q2110_prep_retrieve(sop);
323 sscop_rcvr_drain(sop);
326 * Clear connection data
328 qsaal1_clear_connection(sop);
332 * Set retransmit timer
334 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
339 sop->so_state = SOS_OUTDISC;
346 * SSCOP_DATA_REQ / SOS_READY Command Processor
349 * sop pointer to sscop connection block
350 * arg1 pointer to buffer containing assured user data
358 sscop_datreq_ready(struct sscop *sop, int arg1, int arg2)
360 KBuffer *m = (KBuffer *)arg1;
363 * We must have a buffer (even if it contains no data)
366 sscop_abort(sop, "sscop_datreq_ready: no buffer\n");
371 * Place data at end of transmission queue
374 if (sop->so_xmit_hd == NULL)
377 KB_QNEXT(sop->so_xmit_tl) = m;
381 * Service the transmit queues
383 sscop_service_xmit(sop);
390 * SSCOP_UNITDATA_REQ / SOS_* Command Processor
393 * sop pointer to sscop connection block
394 * arg1 pointer to buffer containing unassured user data
402 sscop_udtreq_all(struct sscop *sop, int arg1, int arg2)
404 KBuffer *m = (KBuffer *)arg1;
407 * We must have a buffer (even if it contains no data)
410 sscop_abort(sop, "sscop_udtreq_all: no buffer\n");
415 * Send the data in a UD PDU
417 sscop_send_ud(sop, m);