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",