kernel tree reorganization stage 1: Major cvs repository work (not logged as
[dragonfly.git] / sys / netproto / atm / uni / qsaal1_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/qsaal1_subr.c,v 1.4 2000/01/17 20:49:50 mks Exp $
27  *      @(#) $DragonFly: src/sys/netproto/atm/uni/qsaal1_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.SAAL1 - 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  * Re-establish a new SSCOP Connection
46  * 
47  * Arguments:
48  *      sop     pointer to sscop connection block
49  *
50  * Returns:
51  *      none
52  *
53  */
54 void
55 qsaal1_reestablish(sop)
56         struct sscop    *sop;
57 {
58
59         /*
60          * Stop polling timers
61          */
62         sop->so_timer[SSCOP_T_POLL] = 0;
63         sop->so_timer[SSCOP_T_NORESP] = 0;
64         sop->so_flags &= ~SOF_KEEPALIVE;
65
66         /*
67          * Note that we're reestablishing a connection
68          */
69         sop->so_flags |= SOF_REESTAB;
70
71         /*
72          * Send first BGN PDU
73          */
74         sop->so_connctl = 1;
75         (void) sscop_send_bgn(sop, SSCOP_SOURCE_SSCOP);
76
77         /*
78          * Reset transmit variables
79          */
80         qsaal1_reset_xmit(sop);
81
82         /*
83          * Set retransmit timer
84          */
85         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
86
87         /*
88          * Wait for BGAK
89          */
90         sop->so_state = SOS_OUTCONN;
91
92         return;
93 }
94
95
96 /*
97  * Reset connection's transmitter state
98  * 
99  * Arguments:
100  *      sop     pointer to sscop connection block
101  *
102  * Returns:
103  *      none
104  *
105  */
106 void
107 qsaal1_reset_xmit(sop)
108         struct sscop    *sop;
109 {
110
111         /*
112          * Drain the transmission queues
113          */
114         sscop_xmit_drain(sop);
115
116         /*
117          * Reset transmit variables
118          */
119         SEQ_SET(sop->so_send, 0);
120         SEQ_SET(sop->so_pollsend, 0);
121         SEQ_SET(sop->so_ack, 0);
122         SEQ_SET(sop->so_pollack, 0);
123         if (sop->so_state != SOS_INCONN)
124                 SEQ_SET(sop->so_sendmax, 0);
125         sop->so_polldata = 0;
126
127         return;
128 }
129
130
131 /*
132  * Reset connection's receiver state
133  * 
134  * Arguments:
135  *      sop     pointer to sscop connection block
136  *
137  * Returns:
138  *      none
139  *
140  */
141 void
142 qsaal1_reset_rcvr(sop)
143         struct sscop    *sop;
144 {
145
146         /*
147          * Drain the receiver queues
148          */
149         sscop_rcvr_drain(sop);
150
151         /*
152          * Reset transmit variables
153          */
154         SEQ_SET(sop->so_rcvnext, 0);
155         SEQ_SET(sop->so_rcvhigh, 0);
156         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
157
158         return;
159 }
160
161
162 /*
163  * Clear connection's connection data
164  * 
165  * Arguments:
166  *      sop     pointer to sscop connection block
167  *
168  * Returns:
169  *      none
170  *
171  */
172 void
173 qsaal1_clear_connection(sop)
174         struct sscop    *sop;
175 {
176
177         /*
178          * Can we clear transmit buffers ??
179          */
180         if ((sop->so_flags & SOF_NOCLRBUF) == 0) {
181                 /*
182                  * Yes, drain the transmission queues
183                  */
184                 sscop_xmit_drain(sop);
185         }
186
187         /*
188          * Clear service required flag
189          */
190         sop->so_flags &= ~SOF_XMITSRVC;
191
192         /*
193          * Drain receive queue buffers
194          */
195         sscop_rcvr_drain(sop);
196
197         return;
198 }
199