3 * ===================================
4 * HARP | Host ATM Research Platform
5 * ===================================
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.
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.
21 * Copyright 1994-1998 Network Computing Services, Inc.
23 * Copies of this Software may be made, however, the above copyright
24 * notice must be reproduced on all copies.
26 * @(#) $FreeBSD: src/sys/netatm/uni/sscf_uni_upper.c,v 1.5 2000/01/17 20:49:50 mks Exp $
27 * @(#) $DragonFly: src/sys/netproto/atm/uni/sscf_uni_upper.c,v 1.5 2006/01/14 13:36:39 swildner Exp $
31 * ATM Forum UNI Support
32 * ---------------------
34 * SSCF UNI - SSCOP SAP interface processing
38 #include <netproto/atm/kern_include.h>
42 #include "sscf_uni_var.h"
45 * SSCF_UNI Upper Stack Command Handler
47 * This function will receive all of the stack commands issued from the
48 * layer below SSCF UNI (ie. SSCOP).
51 * cmd stack command code
53 * arg1 command specific argument
54 * arg2 command specific argument
61 sscf_uni_upper(int cmd
, void *tok
, int arg1
, int arg2
)
63 struct univcc
*uvp
= (struct univcc
*)tok
;
64 Atm_connvc
*cvp
= uvp
->uv_connvc
;
67 ATM_DEBUG5("sscf_uni_upper: cmd=0x%x, uvp=%p, lstate=%d, arg1=0x%x, arg2=0x%x\n",
68 cmd
, uvp
, uvp
->uv_lstate
, arg1
, arg2
);
72 case SSCOP_ESTABLISH_IND
:
74 * We don't support SSCOP User-to-User data, so just
75 * get rid of any supplied to us
77 if (arg1
!= SSCOP_UU_NULL
)
78 KB_FREEALL((KBuffer
*)arg1
);
81 * Validation based on sscop state
83 switch (uvp
->uv_lstate
) {
86 if (uvp
->uv_vers
!= UNI_VERS_3_0
) {
93 * Incoming connection establishment request
97 * If user doesn't want any more incoming sessions
98 * accepted, then refuse request
100 if (uvp
->uv_flags
& UVF_NOESTIND
) {
101 STACK_CALL(SSCOP_RELEASE_REQ
, uvp
->uv_lower
,
103 SSCOP_UU_NULL
, 0, err
);
106 "sscf_uni: stack memory\n");
114 * Tell sscop we've accepted the new connection
116 uvp
->uv_lstate
= UVL_READY
;
117 STACK_CALL(SSCOP_ESTABLISH_RSP
, uvp
->uv_lower
,
119 SSCOP_UU_NULL
, SSCOP_BR_YES
, err
);
121 sscf_uni_abort(uvp
, "sscf_uni: stack memory\n");
126 * Now notify the user of the new connection
128 uvp
->uv_ustate
= UVU_ACTIVE
;
129 STACK_CALL(SSCF_UNI_ESTABLISH_IND
, uvp
->uv_upper
,
131 SSCOP_UU_NULL
, 0, err
);
133 sscf_uni_abort(uvp
, "sscf_uni: stack memory\n");
140 * Ignoring everything
153 log(LOG_ERR
, "sscf_uni_upper: cmd=0x%x, lstate=%d\n",
154 cmd
, uvp
->uv_lstate
);
155 sscf_uni_abort(uvp
, "sscf_uni: sequence err\n");
159 case SSCOP_ESTABLISH_CNF
:
161 * We don't support SSCOP User-to-User data, so just
162 * get rid of any supplied to us
164 if (arg1
!= SSCOP_UU_NULL
)
165 KB_FREEALL((KBuffer
*)arg1
);
168 * Validation based on sscop state
170 switch (uvp
->uv_lstate
) {
174 * Outgoing connection establishment completed
178 * Tell the user that the connection is established
180 uvp
->uv_ustate
= UVU_ACTIVE
;
181 uvp
->uv_lstate
= UVL_READY
;
182 STACK_CALL(SSCF_UNI_ESTABLISH_CNF
, uvp
->uv_upper
,
184 SSCOP_UU_NULL
, 0, err
);
186 sscf_uni_abort(uvp
, "sscf_uni: stack memory\n");
193 * Ignoring everything
206 log(LOG_ERR
, "sscf_uni_upper: cmd=0x%x, lstate=%d\n",
207 cmd
, uvp
->uv_lstate
);
208 sscf_uni_abort(uvp
, "sscf_uni: sequence err\n");
212 case SSCOP_RELEASE_IND
:
214 * We don't support SSCOP User-to-User data, so just
215 * get rid of any supplied to us
217 if (arg1
!= SSCOP_UU_NULL
)
218 KB_FREEALL((KBuffer
*)arg1
);
221 * Validation based on sscop state
223 switch (uvp
->uv_lstate
) {
229 * Peer requesting connection termination
233 * Notify the user that the connection
234 * has been terminated
236 uvp
->uv_ustate
= UVU_RELEASED
;
237 uvp
->uv_lstate
= UVL_IDLE
;
238 STACK_CALL(SSCF_UNI_RELEASE_IND
, uvp
->uv_upper
,
240 SSCOP_UU_NULL
, 0, err
);
242 sscf_uni_abort(uvp
, "sscf_uni: stack memory\n");
249 * Ignoring everything
260 log(LOG_ERR
, "sscf_uni_upper: cmd=0x%x, lstate=%d\n",
261 cmd
, uvp
->uv_lstate
);
262 sscf_uni_abort(uvp
, "sscf_uni: sequence err\n");
266 case SSCOP_RELEASE_CNF
:
268 * Validation based on sscop state
270 switch (uvp
->uv_lstate
) {
274 * Peer acknowledging connection termination
278 * Notify the user that the connection
279 * termination is completed
281 uvp
->uv_ustate
= UVU_RELEASED
;
282 uvp
->uv_lstate
= UVL_IDLE
;
283 STACK_CALL(SSCF_UNI_RELEASE_CNF
, uvp
->uv_upper
,
285 SSCOP_UU_NULL
, 0, err
);
287 sscf_uni_abort(uvp
, "sscf_uni: stack memory\n");
294 * Ignoring everything
307 log(LOG_ERR
, "sscf_uni_upper: cmd=0x%x, lstate=%d\n",
308 cmd
, uvp
->uv_lstate
);
309 sscf_uni_abort(uvp
, "sscf_uni: sequence err\n");
315 sscf_uni_pdu_print(uvp
, (KBuffer
*)arg1
, "DATA_IND");
319 * Validation based on sscop state
321 switch (uvp
->uv_lstate
) {
325 * Incoming assured data from peer
329 * Pass the data up to the user
331 STACK_CALL(SSCF_UNI_DATA_IND
, uvp
->uv_upper
,
335 KB_FREEALL((KBuffer
*)arg1
);
336 sscf_uni_abort(uvp
, "sscf_uni: stack memory\n");
343 * Ignoring everything
345 KB_FREEALL((KBuffer
*)arg1
);
357 KB_FREEALL((KBuffer
*)arg1
);
358 log(LOG_ERR
, "sscf_uni_upper: cmd=0x%x, lstate=%d\n",
359 cmd
, uvp
->uv_lstate
);
360 sscf_uni_abort(uvp
, "sscf_uni: sequence err\n");
364 case SSCOP_RESYNC_IND
:
366 * We don't support SSCOP User-to-User data, so just
367 * get rid of any supplied to us
369 if (arg1
!= SSCOP_UU_NULL
)
370 KB_FREEALL((KBuffer
*)arg1
);
373 * Validation based on sscop state
375 switch (uvp
->uv_lstate
) {
379 * Incoming connection resynchronization request
383 * Send resynch acknowledgement to sscop
385 STACK_CALL(SSCOP_RESYNC_RSP
, uvp
->uv_lower
,
389 sscf_uni_abort(uvp
, "sscf_uni: stack memory\n");
393 if (uvp
->uv_vers
!= UNI_VERS_3_0
) {
396 * Notify the user that the connection
399 STACK_CALL(SSCF_UNI_ESTABLISH_IND
,
400 uvp
->uv_upper
, uvp
->uv_toku
, cvp
,
401 SSCOP_UU_NULL
, 0, err
);
404 "sscf_uni: stack memory\n");
412 * Ignoring everything
425 log(LOG_ERR
, "sscf_uni_upper: cmd=0x%x, lstate=%d\n",
426 cmd
, uvp
->uv_lstate
);
427 sscf_uni_abort(uvp
, "sscf_uni: sequence err\n");
431 case SSCOP_RESYNC_CNF
:
433 * Not supported in version 3.0
435 if (uvp
->uv_vers
== UNI_VERS_3_0
) {
437 "sscf_uni: SSCOP_RESYNC_CNF in 3.0\n");
442 * Validation based on sscop state
444 switch (uvp
->uv_lstate
) {
448 * Peer acknowledging connection resynchronization
452 * Now notify the user that the connection
455 uvp
->uv_ustate
= UVU_ACTIVE
;
456 uvp
->uv_lstate
= UVL_READY
;
457 STACK_CALL(SSCF_UNI_ESTABLISH_CNF
, uvp
->uv_upper
,
459 SSCOP_UU_NULL
, 0, err
);
461 sscf_uni_abort(uvp
, "sscf_uni: stack memory\n");
468 * Ignoring everything
481 log(LOG_ERR
, "sscf_uni_upper: cmd=0x%x, lstate=%d\n",
482 cmd
, uvp
->uv_lstate
);
483 sscf_uni_abort(uvp
, "sscf_uni: sequence err\n");
487 case SSCOP_RECOVER_IND
:
489 * Not supported in version 3.0
491 if (uvp
->uv_vers
== UNI_VERS_3_0
) {
493 "sscf_uni: SSCOP_RECOVER_IND in 3.0\n");
498 * Validation based on sscop state
500 switch (uvp
->uv_lstate
) {
504 * Recover connection due to internal problems
508 * Send recovery acknowledgement to sscop
510 STACK_CALL(SSCOP_RECOVER_RSP
, uvp
->uv_lower
,
514 sscf_uni_abort(uvp
, "sscf_uni: stack memory\n");
519 * Now notify the user that the connection
522 STACK_CALL(SSCF_UNI_ESTABLISH_IND
, uvp
->uv_upper
,
524 SSCOP_UU_NULL
, 0, err
);
526 sscf_uni_abort(uvp
, "sscf_uni: stack memory\n");
533 * Ignoring everything
546 log(LOG_ERR
, "sscf_uni_upper: cmd=0x%x, lstate=%d\n",
547 cmd
, uvp
->uv_lstate
);
548 sscf_uni_abort(uvp
, "sscf_uni: sequence err\n");
552 case SSCOP_UNITDATA_IND
:
554 sscf_uni_pdu_print(uvp
, (KBuffer
*)arg1
, "UNITDATA_IND");
558 * Validation based on sscop state
560 switch (uvp
->uv_lstate
) {
571 * Incoming unassured data from peer
575 * Pass the data up to the user
577 STACK_CALL(SSCF_UNI_UNITDATA_IND
, uvp
->uv_upper
,
581 KB_FREEALL((KBuffer
*)arg1
);
582 sscf_uni_abort(uvp
, "sscf_uni: stack memory\n");
589 * Ignoring everything
591 KB_FREEALL((KBuffer
*)arg1
);
596 KB_FREEALL((KBuffer
*)arg1
);
597 log(LOG_ERR
, "sscf_uni_upper: cmd=0x%x, lstate=%d\n",
598 cmd
, uvp
->uv_lstate
);
599 sscf_uni_abort(uvp
, "sscf_uni: sequence err\n");
603 case SSCOP_RETRIEVE_IND
:
604 case SSCOP_RETRIEVECMP_IND
:
609 log(LOG_ERR
, "sscf_uni_upper: unknown cmd 0x%x, uvp=%p\n",