|
|
1.1 root 1: /* conn_release.c - normal association release */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/quipu/RCS/conn_release.c,v 7.0 89/11/23 22:16:48 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/quipu/RCS/conn_release.c,v 7.0 89/11/23 22:16:48 mrose Rel $
9: *
10: *
11: * $Log: conn_release.c,v $
12: * Revision 7.0 89/11/23 22:16:48 mrose
13: * Release 6.0
14: *
15: */
16:
17: /*
18: * NOTICE
19: *
20: * Acquisition, use, and distribution of this module and related
21: * materials are subject to the restrictions of a license agreement.
22: * Consult the Preface in the User's Manual for the full terms of
23: * this agreement.
24: *
25: */
26:
27:
28: /* LINTLIBRARY */
29:
30: #include "quipu/dsap.h"
31: #include "quipu/util.h"
32: #include "quipu/connection.h"
33:
34: extern LLog * log_dsap;
35: extern time_t timenow;
36:
37: struct connection * conn_alloc();
38: void conn_free();
39: void ds_log ();
40:
41: conn_release(conn)
42: struct connection * conn;
43: {
44: int result;
45: struct DSAPrelease dr_s;
46: struct DSAPrelease * dr = &(dr_s);
47: struct DSAPindication di_s;
48: struct DSAPindication * di = &(di_s);
49: struct DSAPabort * da = &(di->di_abort);
50:
51: DLOG(log_dsap, LLOG_TRACE, ("conn_release"));
52:
53:
54: DLOG(log_dsap, LLOG_NOTICE, ("D-UNBIND: <%d, normal, OK>", conn->cn_ad));
55:
56: watch_dog ("DUnBindRequest");
57: result = DUnBindRequest (conn->cn_ad, OK, dr, di);
58: watch_dog_reset();
59:
60: switch (result) {
61: case NOTOK:
62: do_ds_unbind(conn);
63: DLOG(log_dsap, LLOG_TRACE, ("conn_release: DUnBindRequest - NOTOK"));
64: ds_log(da, "A-RELEASE.REQUEST");
65: break;
66: case OK:
67: DLOG(log_dsap, LLOG_TRACE, ("conn_release: dr_affirmative = %d", dr->dr_affirmative));
68: if (!dr->dr_affirmative)
69: {
70: if ((conn->cn_last_release == conn->cn_last_used)
71: && (conn->cn_initiator)) {
72: LLOG (log_dsap,LLOG_EXCEPTIONS,("conn_release rejected again without activity - Aborting %d",conn->cn_ad));
73: do_ds_unbind(conn);
74: DUAbortRequest (conn->cn_ad, di);
75: } else {
76: LLOG (log_dsap,LLOG_EXCEPTIONS,("conn_release rejected - continuing with association %d",conn->cn_ad));
77: conn->cn_last_release = conn->cn_last_used = timenow;
78: return NOTOK;
79: }
80: }
81: else
82: {
83: do_ds_unbind(conn);
84: DLOG(log_dsap, LLOG_TRACE, ("conn_release: Conn finished!"));
85: }
86: break;
87: case DONE:
88: DLOG (log_dsap,LLOG_NOTICE, ("Waiting for release"));
89: conn->cn_state = CN_CLOSING;
90: conn->cn_last_release = conn->cn_last_used = timenow;
91: return NOTOK;
92: default:
93: LLOG (log_dsap, LLOG_EXCEPTIONS, ("Unexpected return from DUnBindRequest"));
94: return NOTOK;
95: }
96:
97: DLOG(log_dsap, LLOG_DEBUG, ("conn_release calling conn_extract"));
98: conn_extract(conn);
99: return OK;
100: }
101:
102: conn_release_retry(conn)
103: struct connection * conn;
104: {
105: int result;
106: struct DSAPrelease dr_s;
107: struct DSAPrelease * dr = &(dr_s);
108: struct DSAPindication di_s;
109: struct DSAPindication * di = &(di_s);
110: struct DSAPabort * da = &(di->di_abort);
111:
112: DLOG(log_dsap, LLOG_NOTICE, ("conn_release retry (%d)",conn->cn_ad));
113:
114: watch_dog ("DUnBindRetry");
115: result = DUnBindRetry (conn->cn_ad, OK, dr, di);
116: watch_dog_reset ();
117:
118: switch (result) {
119: case NOTOK:
120: do_ds_unbind(conn);
121: DLOG(log_dsap, LLOG_TRACE, ("conn_release: DUnBindRetry - NOTOK"));
122: ds_log(da, "D-UNBIND.REQUEST");
123: break;
124: case OK:
125: DLOG(log_dsap, LLOG_TRACE, ("conn_release: dr_affirmative = %d", dr->dr_affirmative));
126: if (!dr->dr_affirmative)
127: {
128: if ((conn->cn_last_release == conn->cn_last_used)
129: && (conn->cn_initiator)) {
130: LLOG (log_dsap,LLOG_EXCEPTIONS,("conn_release rejected again without activity - Aborting %d",conn->cn_ad));
131: do_ds_unbind(conn);
132: DUAbortRequest (conn->cn_ad, di);
133: } else {
134: LLOG (log_dsap,LLOG_EXCEPTIONS,("conn_release rejected - continuing with association %d",conn->cn_ad));
135: conn->cn_last_release = conn->cn_last_used = timenow;
136: return NOTOK;
137: }
138: }
139: else
140: {
141: do_ds_unbind(conn);
142: DLOG(log_dsap, LLOG_TRACE, ("conn_release: Conn finished!"));
143: }
144: break;
145: case DONE:
146: DLOG (log_dsap,LLOG_TRACE, ("Still Waiting for release"));
147: conn->cn_last_release = conn->cn_last_used = timenow;
148: return NOTOK;
149: default:
150: LLOG (log_dsap, LLOG_EXCEPTIONS, ("Unexpected return from DUnBindRetry"));
151: return NOTOK;
152: }
153:
154: DLOG(log_dsap, LLOG_DEBUG, ("conn_release calling conn_extract"));
155: conn_extract(conn);
156: return OK;
157: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.