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