HAMMER Utilities: MFC work to date.
[dragonfly.git] / sys / netproto / atm / uni / q2110_subr.c
blob3ce37fa403024031023bd26fcf5ef26b0021285c
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/q2110_subr.c,v 1.4 2000/01/17 20:49:49 mks Exp $
27 * @(#) $DragonFly: src/sys/netproto/atm/uni/q2110_subr.c,v 1.5 2006/01/14 13:36:39 swildner Exp $
31 * ATM Forum UNI Support
32 * ---------------------
34 * ITU-T Q.2110 - Subroutines
38 #include <netproto/atm/kern_include.h>
40 #include "sscop.h"
41 #include "sscop_misc.h"
42 #include "sscop_var.h"
45 * Conditionally Clear Transmission Queues
47 * Arguments:
48 * sop pointer to sscop connection block
50 * Returns:
51 * none
54 void
55 q2110_clear_xmit(struct sscop *sop)
58 * Only clear queues if 'Clear Buffers' == No
60 if (sop->so_flags & SOF_NOCLRBUF)
61 sscop_xmit_drain(sop);
66 * Initialize Data Transfer State Variables
68 * Arguments:
69 * sop pointer to sscop connection block
71 * Returns:
72 * none
75 void
76 q2110_init_state(struct sscop *sop)
79 * Initialize for entry into Data Transfer Ready state
81 sop->so_send = 0;
82 sop->so_pollsend = 0;
83 sop->so_ack = 0;
84 sop->so_pollack = 1;
85 sop->so_polldata = 0;
86 sop->so_rcvhigh = 0;
87 sop->so_rcvnext = 0;
92 * Prepare Queues for Data Retrieval
94 * Arguments:
95 * sop pointer to sscop connection block
97 * Returns:
98 * none
101 void
102 q2110_prep_retrieve(struct sscop *sop)
105 * If 'Clear Buffers' == No, just clear retransmit queue,
106 * else clear all transmission queues
108 if (sop->so_flags & SOF_NOCLRBUF) {
109 sop->so_rexmit_hd = NULL;
110 sop->so_rexmit_tl = NULL;
111 } else
112 sscop_xmit_drain(sop);
115 * Clear receiver queue
117 sscop_rcvr_drain(sop);
122 * Prepare Queues for Error Recovery
124 * Arguments:
125 * sop pointer to sscop connection block
127 * Returns:
128 * none
131 void
132 q2110_prep_recovery(struct sscop *sop)
135 * If 'Clear Buffers' == No, just clear retransmit queue,
136 * else clear all transmission queues
138 if (sop->so_flags & SOF_NOCLRBUF) {
139 sop->so_rexmit_hd = NULL;
140 sop->so_rexmit_tl = NULL;
141 } else
142 sscop_xmit_drain(sop);
147 * Conditionally Deliver Received Data to User
149 * Arguments:
150 * sop pointer to sscop connection block
152 * Returns:
153 * none
156 void
157 q2110_deliver_data(struct sscop *sop)
160 * If 'Clear Buffers' == No, give data to user
162 if (sop->so_flags & SOF_NOCLRBUF) {
164 * We don't support 'Clear Buffers' == No, so don't bother
169 * Clear receiver queue
171 sscop_rcvr_drain(sop);
176 * Enter Connection Recovery Mode
178 * Arguments:
179 * sop pointer to sscop connection block
181 * Returns:
182 * none
185 void
186 q2110_error_recovery(struct sscop *sop)
190 * Stop data transfer timers
192 sop->so_timer[SSCOP_T_POLL] = 0;
193 sop->so_timer[SSCOP_T_NORESP] = 0;
194 sop->so_timer[SSCOP_T_IDLE] = 0;
195 sop->so_flags &= ~SOF_KEEPALIVE;
198 * Initialize receiver window
200 SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
203 * Send first ER PDU
205 sop->so_connctl = 1;
206 SEQ_INCR(sop->so_sendconn, 1);
207 sscop_send_er(sop);
210 * Set retransmit timer
212 sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
215 * Clear out appropriate queues
217 q2110_prep_recovery(sop);
220 * Wait for ERAK
222 sop->so_state = SOS_OUTRECOV;
224 return;