Initial import from FreeBSD RELENG_4:
[dragonfly.git] / sys / netproto / atm / uni / sscop_sigaa.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/sscop_sigaa.c,v 1.4 2000/01/17 20:49:52 mks Exp $
27  *
28  */
29
30 /*
31  * ATM Forum UNI Support
32  * ---------------------
33  *
34  * SSCOP Common - Process AA-signals (SAP_SSCOP)
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/sscop_sigaa.c,v 1.4 2000/01/17 20:49:52 mks Exp $");
46 #endif
47
48
49 /*
50  * SSCOP_ESTABLISH_REQ / SOS_IDLE Command Processor
51  * 
52  * Arguments:
53  *      sop     pointer to sscop connection block
54  *      arg1    pointer to buffer containing SSCOP-UU data
55  *      arg2    buffer release parameter
56  *
57  * Returns:
58  *      none
59  *
60  */
61 void
62 sscop_estreq_idle(sop, arg1, arg2)
63         struct sscop    *sop;
64         int             arg1;
65         int             arg2;
66 {
67
68         /*
69          * We don't support SSCOP-UU data
70          */
71         if (arg1 != SSCOP_UU_NULL)
72                 KB_FREEALL((KBuffer *)arg1);
73
74         /*
75          * We currently only support BR=YES
76          */
77         if (arg2 != SSCOP_BR_YES) {
78                 sscop_abort(sop, "sscop: BR != YES\n");
79                 return;
80         }
81
82         /*
83          * Initialize receiver window
84          */
85         SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
86
87         /*
88          * Send first BGN PDU
89          */
90         sop->so_connctl = 1;
91         SEQ_INCR(sop->so_sendconn, 1);
92         (void) sscop_send_bgn(sop, SSCOP_SOURCE_USER);
93
94         /*
95          * Reset transmitter state
96          */
97         if (sop->so_vers == SSCOP_VERS_Q2110)
98                 q2110_clear_xmit(sop);
99         else
100                 qsaal1_reset_xmit(sop);
101
102         /*
103          * Set retransmit timer
104          */
105         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
106
107         /*
108          * Wait for BGAK
109          */
110         sop->so_state = SOS_OUTCONN;
111
112         return;
113 }
114
115
116 /*
117  * SSCOP_ESTABLISH_RSP / SOS_INCONN Command Processor
118  * 
119  * Arguments:
120  *      sop     pointer to sscop connection block
121  *      arg1    pointer to buffer containing SSCOP-UU data
122  *      arg2    buffer release parameter
123  *
124  * Returns:
125  *      none
126  *
127  */
128 void
129 sscop_estrsp_inconn(sop, arg1, arg2)
130         struct sscop    *sop;
131         int             arg1;
132         int             arg2;
133 {
134
135         /*
136          * We don't support SSCOP-UU data
137          */
138         if (arg1 != SSCOP_UU_NULL)
139                 KB_FREEALL((KBuffer *)arg1);
140
141         /*
142          * We currently only support BR=YES
143          */
144         if (arg2 != SSCOP_BR_YES) {
145                 sscop_abort(sop, "sscop: BR != YES\n");
146                 return;
147         }
148
149         if (sop->so_vers == SSCOP_VERS_Q2110) {
150                 /*
151                  * Clear transmitter buffers
152                  */
153                 q2110_clear_xmit(sop);
154
155                 /*
156                  * Initialize state variables
157                  */
158                 SEQ_SET(sop->so_rcvmax, sop->so_parm.sp_rcvwin);
159                 q2110_init_state(sop);
160         } else {
161                 /*
162                  * Reset transmitter state
163                  */
164                 qsaal1_reset_xmit(sop);
165         }
166
167         /*
168          * Send BGAK PDU
169          */
170         (void) sscop_send_bgak(sop);
171
172         /*
173          * Start polling timer
174          */
175         sop->so_timer[SSCOP_T_POLL] = sop->so_parm.sp_timepoll;
176
177         /*
178          * Start lost poll/stat timer
179          */
180         sop->so_timer[SSCOP_T_NORESP] = sop->so_parm.sp_timeresp;
181
182         /*
183          * OK, we're ready for data
184          */
185         sop->so_state = SOS_READY;
186
187         /*
188          * See if transmit queues need servicing
189          */
190         if (sop->so_flags & SOF_XMITSRVC)
191                 sscop_service_xmit(sop);
192
193         return;
194 }
195
196
197 /*
198  * SSCOP_RELEASE_REQ / SOS_OUTCONN Command Processor
199  * 
200  * Arguments:
201  *      sop     pointer to sscop connection block
202  *      arg1    pointer to buffer containing SSCOP-UU data
203  *      arg2    unused
204  *
205  * Returns:
206  *      none
207  *
208  */
209 void
210 sscop_relreq_outconn(sop, arg1, arg2)
211         struct sscop    *sop;
212         int             arg1;
213         int             arg2;
214 {
215
216         /*
217          * We don't support SSCOP-UU data
218          */
219         if (arg1 != SSCOP_UU_NULL)
220                 KB_FREEALL((KBuffer *)arg1);
221
222         /*
223          * Stop retransmit timer
224          */
225         sop->so_timer[SSCOP_T_CC] = 0;
226
227         /*
228          * Clear reestablishment flag
229          */
230         sop->so_flags &= ~SOF_REESTAB;
231
232         /*
233          * Send first END PDU
234          */
235         sop->so_connctl = 1;
236         (void) sscop_send_end(sop, SSCOP_SOURCE_USER);
237
238         if (sop->so_vers == SSCOP_VERS_QSAAL)
239                 /*
240                  * Clear connection data
241                  */
242                 qsaal1_clear_connection(sop);
243
244         /*
245          * Set retransmit timer
246          */
247         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
248
249         /*
250          * Wait for ENDAK
251          */
252         sop->so_state = SOS_OUTDISC;
253
254         return;
255 }
256
257
258 /*
259  * SSCOP_RELEASE_REQ / SOS_INCONN Command Processor
260  * 
261  * Arguments:
262  *      sop     pointer to sscop connection block
263  *      arg1    pointer to buffer containing SSCOP-UU data
264  *      arg2    unused
265  *
266  * Returns:
267  *      none
268  *
269  */
270 void
271 sscop_relreq_inconn(sop, arg1, arg2)
272         struct sscop    *sop;
273         int             arg1;
274         int             arg2;
275 {
276
277         /*
278          * We don't support SSCOP-UU data
279          */
280         if (arg1 != SSCOP_UU_NULL)
281                 KB_FREEALL((KBuffer *)arg1);
282
283         /*
284          * Return a BGREJ PDU
285          */
286         (void) sscop_send_bgrej(sop);
287
288         /*
289          * Back to IDLE state
290          */
291         sop->so_state = SOS_IDLE;
292
293         return;
294 }
295
296
297 /*
298  * SSCOP_RELEASE_REQ / SOS_READY Command Processor
299  * 
300  * Arguments:
301  *      sop     pointer to sscop connection block
302  *      arg1    pointer to buffer containing SSCOP-UU data
303  *      arg2    unused
304  *
305  * Returns:
306  *      none
307  *
308  */
309 void
310 sscop_relreq_ready(sop, arg1, arg2)
311         struct sscop    *sop;
312         int             arg1;
313         int             arg2;
314 {
315
316         /*
317          * We don't support SSCOP-UU data
318          */
319         if (arg1 != SSCOP_UU_NULL)
320                 KB_FREEALL((KBuffer *)arg1);
321
322         /*
323          * Stop data transfer timers
324          */
325         sop->so_timer[SSCOP_T_POLL] = 0;
326         sop->so_timer[SSCOP_T_NORESP] = 0;
327         sop->so_timer[SSCOP_T_IDLE] = 0;
328         sop->so_flags &= ~SOF_KEEPALIVE;
329
330         /*
331          * Send first END PDU
332          */
333         sop->so_connctl = 1;
334         (void) sscop_send_end(sop, SSCOP_SOURCE_USER);
335
336         if (sop->so_vers == SSCOP_VERS_Q2110) {
337                 /*
338                  * Clear out appropriate queues
339                  */
340                 if (sop->so_state == SOS_READY)
341                         q2110_prep_retrieve(sop);
342                 else
343                         sscop_rcvr_drain(sop);
344         } else {
345                 /*
346                  * Clear connection data
347                  */
348                 qsaal1_clear_connection(sop);
349         }
350
351         /*
352          * Set retransmit timer
353          */
354         sop->so_timer[SSCOP_T_CC] = sop->so_parm.sp_timecc;
355
356         /*
357          * Wait for ENDAK
358          */
359         sop->so_state = SOS_OUTDISC;
360
361         return;
362 }
363
364
365 /*
366  * SSCOP_DATA_REQ / SOS_READY Command Processor
367  * 
368  * Arguments:
369  *      sop     pointer to sscop connection block
370  *      arg1    pointer to buffer containing assured user data
371  *      arg2    unused
372  *
373  * Returns:
374  *      none
375  *
376  */
377 void
378 sscop_datreq_ready(sop, arg1, arg2)
379         struct sscop    *sop;
380         int             arg1;
381         int             arg2;
382 {
383         KBuffer         *m = (KBuffer *)arg1;
384
385         /*
386          * We must have a buffer (even if it contains no data)
387          */
388         if (m == NULL) {
389                 sscop_abort(sop, "sscop_datreq_ready: no buffer\n");
390                 return;
391         }
392
393         /*
394          * Place data at end of transmission queue
395          */
396         KB_QNEXT(m) = NULL;
397         if (sop->so_xmit_hd == NULL)
398                 sop->so_xmit_hd = m;
399         else
400                 KB_QNEXT(sop->so_xmit_tl) = m;
401         sop->so_xmit_tl = m;
402
403         /*
404          * Service the transmit queues
405          */
406         sscop_service_xmit(sop);
407
408         return;
409 }
410
411
412 /*
413  * SSCOP_UNITDATA_REQ / SOS_* Command Processor
414  * 
415  * Arguments:
416  *      sop     pointer to sscop connection block
417  *      arg1    pointer to buffer containing unassured user data
418  *      arg2    unused
419  *
420  * Returns:
421  *      none
422  *
423  */
424 void
425 sscop_udtreq_all(sop, arg1, arg2)
426         struct sscop    *sop;
427         int             arg1;
428         int             arg2;
429 {
430         KBuffer         *m = (KBuffer *)arg1;
431
432         /*
433          * We must have a buffer (even if it contains no data)
434          */
435         if (m == NULL) {
436                 sscop_abort(sop, "sscop_udtreq_all: no buffer\n");
437                 return;
438         }
439
440         /*
441          * Send the data in a UD PDU
442          */
443         (void) sscop_send_ud(sop, m);
444         
445         return;
446 }
447