Initial import from FreeBSD RELENG_4:
[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  *
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 <netatm/uni/sscop.h>
41 #include <netatm/uni/sscop_misc.h>
42 #include <netatm/uni/sscop_var.h>
43
44 #ifndef lint
45 __RCSID("@(#) $FreeBSD: src/sys/netatm/uni/q2110_subr.c,v 1.4 2000/01/17 20:49:49 mks Exp $");
46 #endif
47
48
49 /*
50  * Conditionally Clear Transmission Queues
51  * 
52  * Arguments:
53  *      sop     pointer to sscop connection block
54  *
55  * Returns:
56  *      none
57  *
58  */
59 void
60 q2110_clear_xmit(sop)
61         struct sscop    *sop;
62 {
63         /*
64          * Only clear queues if 'Clear Buffers' == No
65          */
66         if (sop->so_flags & SOF_NOCLRBUF)
67                 sscop_xmit_drain(sop);
68 }
69
70
71 /*
72  * Initialize Data Transfer State Variables
73  * 
74  * Arguments:
75  *      sop     pointer to sscop connection block
76  *
77  * Returns:
78  *      none
79  *
80  */
81 void
82 q2110_init_state(sop)
83         struct sscop    *sop;
84 {
85         /*
86          * Initialize for entry into Data Transfer Ready state
87          */
88         sop->so_send = 0;
89         sop->so_pollsend = 0;
90         sop->so_ack = 0;
91         sop->so_pollack = 1;
92         sop->so_polldata = 0;
93         sop->so_rcvhigh = 0;
94         sop->so_rcvnext = 0;
95 }
96
97
98 /*
99  * Prepare Queues for Data Retrieval
100  * 
101  * Arguments:
102  *      sop     pointer to sscop connection block
103  *
104  * Returns:
105  *      none
106  *
107  */
108 void
109 q2110_prep_retrieve(sop)
110         struct sscop    *sop;
111 {
112         /*
113          * If 'Clear Buffers' == No, just clear retransmit queue,
114          * else clear all transmission queues
115          */
116         if (sop->so_flags & SOF_NOCLRBUF) {
117                 sop->so_rexmit_hd = NULL;
118                 sop->so_rexmit_tl = NULL;
119         } else
120                 sscop_xmit_drain(sop);
121
122         /*
123          * Clear receiver queue
124          */
125         sscop_rcvr_drain(sop);
126 }
127
128
129 /*
130  * Prepare Queues for Error Recovery
131  * 
132  * Arguments:
133  *      sop     pointer to sscop connection block
134  *
135  * Returns:
136  *      none
137  *
138  */
139 void
140 q2110_prep_recovery(sop)
141         struct sscop    *sop;
142 {
143         /*
144          * If 'Clear Buffers' == No, just clear retransmit queue,
145          * else clear all transmission queues
146          */
147         if (sop->so_flags & SOF_NOCLRBUF) {
148                 sop->so_rexmit_hd = NULL;
149                 sop->so_rexmit_tl = NULL;
150         } else
151                 sscop_xmit_drain(sop);
152 }
153
154
155 /*
156  * Conditionally Deliver Received Data to User
157  * 
158  * Arguments:
159  *      sop     pointer to sscop connection block
160  *
161  * Returns:
162  *      none
163  *
164  */
165 void
166 q2110_deliver_data(sop)
167         struct sscop    *sop;
168 {
169         /*
170          * If 'Clear Buffers' == No, give data to user
171          */
172         if (sop->so_flags & SOF_NOCLRBUF) {
173                 /*
174                  * We don't support 'Clear Buffers' == No, so don't bother
175                  */
176         }
177
178         /*
179          * Clear receiver queue
180          */
181         sscop_rcvr_drain(sop);
182 }
183
184
185 /*
186  * Enter Connection Recovery Mode
187  * 
188  * Arguments:
189  *      sop     pointer to sscop connection block
190  *
191  * Returns:
192  *      none
193  *
194  */
195 void
196 q2110_error_recovery(sop)
197         struct sscop    *sop;
198 {
199
200         /*
201          * Stop data transfer timers
202          */
203         sop->so_timer[SSCOP_T_POLL] = 0;
204         sop->so_timer[SSCOP_T_NORESP] = 0;
205         sop->so_timer[SSCOP_T_IDLE] = 0;
206         sop->so_flags &= ~SOF_KEEPALIVE;
207
208         /* 
209          * Initialize receiver window
210          */
211         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
212
213         /*
214          * Send first ER PDU
215          */
216         sop->so_connctl = 1;
217         SEQ_INCR(sop->so_sendconn, 1);
218         (void) sscop_send_er(sop);
219
220         /*
221          * Set retransmit timer
222          */
223         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
224
225         /*
226          * Clear out appropriate queues
227          */
228         q2110_prep_recovery(sop);
229
230         /*
231          * Wait for ERAK
232          */
233         sop->so_state = SOS_OUTRECOV;
234
235         return;
236 }
237