def56a7622f14fde17057ab29b57f0a94b97f155
[dragonfly.git] / sys / netproto / atm / uni / q2110_subr.c
1 /*
2  *
3  * ===================================
4  * HARP  |  Host ATM Research Platform
5  * ===================================
6  *
7  *
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.
12  *
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.
20  *
21  * Copyright 1994-1998 Network Computing Services, Inc.
22  *
23  * Copies of this Software may be made, however, the above copyright
24  * notice must be reproduced on all copies.
25  *
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.3 2003/08/07 21:17:35 dillon Exp $
28  */
29
30 /*
31  * ATM Forum UNI Support
32  * ---------------------
33  *
34  * ITU-T Q.2110 - Subroutines
35  *
36  */
37
38 #include <netatm/kern_include.h>
39
40 #include "sscop.h"
41 #include "sscop_misc.h"
42 #include "sscop_var.h"
43
44 /*
45  * Conditionally Clear Transmission Queues
46  * 
47  * Arguments:
48  *      sop     pointer to sscop connection block
49  *
50  * Returns:
51  *      none
52  *
53  */
54 void
55 q2110_clear_xmit(sop)
56         struct sscop    *sop;
57 {
58         /*
59          * Only clear queues if 'Clear Buffers' == No
60          */
61         if (sop->so_flags & SOF_NOCLRBUF)
62                 sscop_xmit_drain(sop);
63 }
64
65
66 /*
67  * Initialize Data Transfer State Variables
68  * 
69  * Arguments:
70  *      sop     pointer to sscop connection block
71  *
72  * Returns:
73  *      none
74  *
75  */
76 void
77 q2110_init_state(sop)
78         struct sscop    *sop;
79 {
80         /*
81          * Initialize for entry into Data Transfer Ready state
82          */
83         sop->so_send = 0;
84         sop->so_pollsend = 0;
85         sop->so_ack = 0;
86         sop->so_pollack = 1;
87         sop->so_polldata = 0;
88         sop->so_rcvhigh = 0;
89         sop->so_rcvnext = 0;
90 }
91
92
93 /*
94  * Prepare Queues for Data Retrieval
95  * 
96  * Arguments:
97  *      sop     pointer to sscop connection block
98  *
99  * Returns:
100  *      none
101  *
102  */
103 void
104 q2110_prep_retrieve(sop)
105         struct sscop    *sop;
106 {
107         /*
108          * If 'Clear Buffers' == No, just clear retransmit queue,
109          * else clear all transmission queues
110          */
111         if (sop->so_flags & SOF_NOCLRBUF) {
112                 sop->so_rexmit_hd = NULL;
113                 sop->so_rexmit_tl = NULL;
114         } else
115                 sscop_xmit_drain(sop);
116
117         /*
118          * Clear receiver queue
119          */
120         sscop_rcvr_drain(sop);
121 }
122
123
124 /*
125  * Prepare Queues for Error Recovery
126  * 
127  * Arguments:
128  *      sop     pointer to sscop connection block
129  *
130  * Returns:
131  *      none
132  *
133  */
134 void
135 q2110_prep_recovery(sop)
136         struct sscop    *sop;
137 {
138         /*
139          * If 'Clear Buffers' == No, just clear retransmit queue,
140          * else clear all transmission queues
141          */
142         if (sop->so_flags & SOF_NOCLRBUF) {
143                 sop->so_rexmit_hd = NULL;
144                 sop->so_rexmit_tl = NULL;
145         } else
146                 sscop_xmit_drain(sop);
147 }
148
149
150 /*
151  * Conditionally Deliver Received Data to User
152  * 
153  * Arguments:
154  *      sop     pointer to sscop connection block
155  *
156  * Returns:
157  *      none
158  *
159  */
160 void
161 q2110_deliver_data(sop)
162         struct sscop    *sop;
163 {
164         /*
165          * If 'Clear Buffers' == No, give data to user
166          */
167         if (sop->so_flags & SOF_NOCLRBUF) {
168                 /*
169                  * We don't support 'Clear Buffers' == No, so don't bother
170                  */
171         }
172
173         /*
174          * Clear receiver queue
175          */
176         sscop_rcvr_drain(sop);
177 }
178
179
180 /*
181  * Enter Connection Recovery Mode
182  * 
183  * Arguments:
184  *      sop     pointer to sscop connection block
185  *
186  * Returns:
187  *      none
188  *
189  */
190 void
191 q2110_error_recovery(sop)
192         struct sscop    *sop;
193 {
194
195         /*
196          * Stop data transfer timers
197          */
198         sop->so_timer[SSCOP_T_POLL] = 0;
199         sop->so_timer[SSCOP_T_NORESP] = 0;
200         sop->so_timer[SSCOP_T_IDLE] = 0;
201         sop->so_flags &= ~SOF_KEEPALIVE;
202
203         /* 
204          * Initialize receiver window
205          */
206         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
207
208         /*
209          * Send first ER PDU
210          */
211         sop->so_connctl = 1;
212         SEQ_INCR(sop->so_sendconn, 1);
213         (void) sscop_send_er(sop);
214
215         /*
216          * Set retransmit timer
217          */
218         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
219
220         /*
221          * Clear out appropriate queues
222          */
223         q2110_prep_recovery(sop);
224
225         /*
226          * Wait for ERAK
227          */
228         sop->so_state = SOS_OUTRECOV;
229
230         return;
231 }
232