Initial import of binutils 2.22 on the new vendor branch
[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.5 2006/01/14 13:36:39 swildner Exp $
28  */
29
30 /*
31  * ATM Forum UNI Support
32  * ---------------------
33  *
34  * ITU-T Q.SAAL1 - Subroutines
35  *
36  */
37
38 #include <netproto/atm/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(struct sscop *sop)
56 {
57
58         /*
59          * Stop polling timers
60          */
61         sop->so_timer[SSCOP_T_POLL] = 0;
62         sop->so_timer[SSCOP_T_NORESP] = 0;
63         sop->so_flags &= ~SOF_KEEPALIVE;
64
65         /*
66          * Note that we're reestablishing a connection
67          */
68         sop->so_flags |= SOF_REESTAB;
69
70         /*
71          * Send first BGN PDU
72          */
73         sop->so_connctl = 1;
74         sscop_send_bgn(sop, SSCOP_SOURCE_SSCOP);
75
76         /*
77          * Reset transmit variables
78          */
79         qsaal1_reset_xmit(sop);
80
81         /*
82          * Set retransmit timer
83          */
84         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
85
86         /*
87          * Wait for BGAK
88          */
89         sop->so_state = SOS_OUTCONN;
90
91         return;
92 }
93
94
95 /*
96  * Reset connection's transmitter state
97  * 
98  * Arguments:
99  *      sop     pointer to sscop connection block
100  *
101  * Returns:
102  *      none
103  *
104  */
105 void
106 qsaal1_reset_xmit(struct sscop *sop)
107 {
108
109         /*
110          * Drain the transmission queues
111          */
112         sscop_xmit_drain(sop);
113
114         /*
115          * Reset transmit variables
116          */
117         SEQ_SET(sop->so_send, 0);
118         SEQ_SET(sop->so_pollsend, 0);
119         SEQ_SET(sop->so_ack, 0);
120         SEQ_SET(sop->so_pollack, 0);
121         if (sop->so_state != SOS_INCONN)
122                 SEQ_SET(sop->so_sendmax, 0);
123         sop->so_polldata = 0;
124
125         return;
126 }
127
128
129 /*
130  * Reset connection's receiver state
131  * 
132  * Arguments:
133  *      sop     pointer to sscop connection block
134  *
135  * Returns:
136  *      none
137  *
138  */
139 void
140 qsaal1_reset_rcvr(struct sscop *sop)
141 {
142
143         /*
144          * Drain the receiver queues
145          */
146         sscop_rcvr_drain(sop);
147
148         /*
149          * Reset transmit variables
150          */
151         SEQ_SET(sop->so_rcvnext, 0);
152         SEQ_SET(sop->so_rcvhigh, 0);
153         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
154
155         return;
156 }
157
158
159 /*
160  * Clear connection's connection data
161  * 
162  * Arguments:
163  *      sop     pointer to sscop connection block
164  *
165  * Returns:
166  *      none
167  *
168  */
169 void
170 qsaal1_clear_connection(struct sscop *sop)
171 {
172
173         /*
174          * Can we clear transmit buffers ??
175          */
176         if ((sop->so_flags & SOF_NOCLRBUF) == 0) {
177                 /*
178                  * Yes, drain the transmission queues
179                  */
180                 sscop_xmit_drain(sop);
181         }
182
183         /*
184          * Clear service required flag
185          */
186         sop->so_flags &= ~SOF_XMITSRVC;
187
188         /*
189          * Drain receive queue buffers
190          */
191         sscop_rcvr_drain(sop);
192
193         return;
194 }
195