|
|
1.1 root 1: /* connection.h - directory internal structures */
2:
3: /*
4: * $Header: /f/osi/h/quipu/RCS/connection.h,v 7.1 90/07/09 14:38:23 mrose Exp $
5: *
6: *
7: * $Log: connection.h,v $
8: * Revision 7.1 90/07/09 14:38:23 mrose
9: * sync
10: *
11: * Revision 7.0 89/11/23 21:56:28 mrose
12: * Release 6.0
13: *
14: */
15:
16: /*
17: * NOTICE
18: *
19: * Acquisition, use, and distribution of this module and related
20: * materials are subject to the restrictions of a license agreement.
21: * Consult the Preface in the User's Manual for the full terms of
22: * this agreement.
23: *
24: */
25:
26:
27: #ifndef QUIPUCON
28: #define QUIPUCON
29:
30: #include "quipu/common.h"
31: #include "quipu/dsargument.h"
32: #include "quipu/dsap.h"
33:
34: #define DSA_PRIO_LOW 1
35: #define DSA_PRIO_MED 2
36: #define DSA_PRIO_HIGH 3
37: #define DSA_MAX_PRIO 3
38:
39: #define MAX_CONNS 20 /* Maximum concurrent connections */
40: #define CONNS_RESERVED_DI 2 /* Reserved for Get DSA Info ops */
41: #define CONNS_RESERVED_X500 10 /* Reserved for normal operations */
42:
43: /*
44: * If the connection definitions are altered bear in mind that
45: * MAX_CONNS - CONNS_RESERVED_FOR_DI - CONNS_RESERVED_FOR_X500
46: * must be at least 1 to allow get edb ops to happen, and should
47: * probably be at least 2 to allow one get edb operation to block.
48: */
49:
50: /*
51: * The following structures form the basis of the connection mesh
52: * which is central to the scheduling of the DSA.
53: */
54:
55: /*
56: * The di_block structure is used to generate lists of dsa information
57: * blocks even when the information is not yet available.
58: * There are 3 states which a di_block can be in:
59: * DI_ACCESSPOINT: di_block contains access point only.
60: * DI_COMPLETE: di_block contains entry for dsa.
61: * DI_DEFERRED: di_block is waiting for a dsa entry.
62: *
63: * The links in this structure need to be handled with care!!
64: * di_next is used to link the "di_block"s on
65: * 1) the global list if that is where this block is kept
66: * 2) the requesting operation if that is where this block is kept
67: * 3) the requesting task if that is where this block is kept
68: *
69: * di_wake_next is used to link the "di_block"s for the performing
70: * operation, so that it is obvious what needs to be alerted.
71: *
72: * di_task points to the task to be alerted from type DI_TASK
73: * di_oper points to the operation to be alerted from type DI_OPERATION
74: * di_perform points to the operation performing the get dsa info operation
75: */
76: struct di_block
77: {
78: DN di_dn; /* Name of dsa this block refers to */
79:
80: char di_type; /* Global list, operation list or task list */
81: #define DI_GLOBAL 1 /* deferred_dis lists this block */
82: #define DI_OPERATION 2 /* di_oper lists this block */
83: #define DI_TASK 3 /* di_task lists this block */
84:
85: struct task_act * di_task;
86: struct oper_act * di_oper;
87:
88: /*
89: * The following are needed to generate chaining arguments from DSAInformation
90: * in the case of chaining (DI_OPERATION); and to generate continuation
91: * references in the case of referring (DI_TASK). Not present for DI_GLOBAL
92: */
93: DN di_target;
94: int di_reftype;
95: int di_rdn_resolved;
96: int di_aliasedRDNs;
97:
98: char di_state; /* How the dsa information is formed */
99: #define DI_COMPLETE 1 /* di_entry filled out */
100: #define DI_ACCESSPOINT 2 /* di_accesspoints filled out */
101: #define DI_DEFERRED 3 /* di_perform still generating di_entry */
102:
103: struct access_point * di_accesspoints;
104:
105: Entry di_entry;
106:
107: struct oper_act * di_perform;
108:
109: struct di_block * di_wake_next; /* List of blocks to wake */
110: struct di_block * di_next; /* List of blocks */
111: };
112: #define NULL_DI_BLOCK ((struct di_block *) NULL)
113:
114: /*
115: * Operations received over a bound association are represented as a
116: * linked list of task blocks. The following task block structure
117: * contains the invocation (including decoded argument) received,
118: * representations of the progress of the task and fields to be
119: * used for generating the response.
120: */
121: struct task_act
122: {
123: int tk_prio;
124: char tk_state;
125: #define TK_ACTIVE 1 /* Task ready to have work done */
126: #define TK_PASSIVE 2 /* Task waiting for operation */
127: #define TK_SUSPEND 3 /* Giving the network a chance */
128:
129: struct DSAPinvoke tk_dx;
130: struct di_block * tk_dsas; /* di_blocks for referral */
131:
132: struct DSAPindication tk_resp;
133: struct ds_op_res * tk_result;
134: struct DSError * tk_error;
135:
136: /* Specific additions to provide multi-subtask search implementation */
137: struct ds_search_task * local_st;
138: struct ds_search_task * refer_st;
139: struct ds_search_task * referred_st;
140:
141: char tk_timed;
142: time_t tk_timeout;
143:
144: struct oper_act * tk_operlist;
145: struct task_act * tk_next;
146:
147: struct connection * tk_conn;
148: };
149: #define NULLTASK ((struct task_act *) NULL)
150:
151: struct oper_act
152: {
153: int on_id;
154: char on_state;
155: #define ON_DEFERRED 1 /* Waiting for DSA INFO */
156: #define ON_CHAINED 2 /* Waiting for a response */
157: #define ON_COMPLETE 3 /* Waiting to be used by task */
158: #define ON_ABANDONED 4 /* Waiting for response - no task */
159:
160: char on_type;
161: #define ON_TYPE_X500 1
162: #define ON_TYPE_BIND_COMPARE 2
163: #define ON_TYPE_GET_DSA_INFO 3
164: #define ON_TYPE_GET_EDB 4
165: #define ON_TYPE_SUBTASK 5
166:
167: /* Specific to ON_TYPE_X500 */
168: struct task_act *on_task; /* Task to wake */
169:
170: /* Specific to ON_TYPE_BIND_COMPARE */
171: struct connection *on_bind_compare; /* Bind to wake */
172:
173: /* Specific to ON_TYPE_GET_DSA_INFO */
174: struct di_block * on_wake_list; /* di_blocks to wake */
175:
176: /* Specific to ON_TYPE_GET_EDB */
177: Entry on_getedb_eptr; /* previous entry */
178: char * on_getedb_ver; /* previous version */
179:
180: /* Specific to ON_TYPE_SUBTASK */
181: struct ds_search_task * on_subtask;
182:
183: struct di_block * on_dsas; /* DSAInfos for chaining */
184:
185: struct ds_op_arg on_req; /* Argument stuff */
186: struct ds_op_arg *on_arg;
187:
188: struct DSAPindication on_resp; /* Response stuff */
189:
190: char on_relay; /* if TRUE try Relay DSA */
191:
192: struct oper_act *on_next_conn;
193: struct oper_act *on_next_task;
194:
195: struct connection *on_conn;
196: };
197: #define NULLOPER ((struct oper_act *) NULL)
198:
199: struct conn_start
200: {
201: /* Values stored after call to TNetAccept */
202: int cs_vecp;
203: char * cs_vec[4];
204: char * cs_svec[4];
205:
206: /* Value extracted from above by conn_init() */
207: struct DSAPstart cs_ds;
208:
209: /* Operation carrying out compare for binding */
210: struct oper_act * cs_bind_compare;
211:
212: /* Result or error generated for response */
213: struct ds_bind_arg cs_res;
214: struct ds_bind_error cs_err;
215: };
216:
217: struct conn_connect
218: {
219: /* Bind argument used in conn_request() */
220: struct ds_bind_arg cc_req;
221:
222: struct DSAPconnect cc_dc;
223: };
224:
225: /*
226: * Conn is the structure used to represent external connections
227: */
228: struct connection
229: {
230: char cn_state;
231: /* State of the connection */
232: #define CN_INDICATED 1
233: #define CN_WAITING 2
234: #define CN_CONNECTING1 3
235: #define CN_CONNECTING2 4
236: #define CN_OPEN 5
237: #define CN_FAILED 6
238: #define CN_CLOSING 7
239: #define CN_OPENING 8
240:
241: char cn_ctx;
242: /* DS_CTX_* values defined in dsap.h for use by decoders */
243:
244: char cn_initiator;
245: /* TRUE: this DSA is initiator, FALSE: this DSA is responder */
246:
247: /* Information used during initialisation of the connection */
248: union
249: {
250: struct conn_start cn_start_un_start; /* responder */
251: struct conn_connect cn_start_un_connect; /* initiator */
252: } cn_start_un;
253: #define cn_start cn_start_un.cn_start_un_start
254: #define cn_connect cn_start_un.cn_start_un_connect
255:
256: /*
257: struct ds_bind_arg * cn_res;
258: struct ds_bind_error * cn_err;
259:
260: struct init_activity cn_init_act;
261: struct oper_act * cn_bind_compare;
262: */
263:
264: time_t cn_last_used;
265: /* Time at which this connection was last used */
266:
267: time_t cn_last_release;
268: /* Time at which this connection release was last attempted */
269:
270: DN cn_dn;
271: /* Name of the entity at the far end of the connection */
272:
273: struct PSAPaddr cn_addr;
274: /* Address of the entity at the far end of the connection */
275:
276: int cn_ad;
277: /* Descriptor identifying the association on which the connection is based */
278:
279: /*
280: int cn_context_id;
281: */
282: /* Context identifier of context to be used for user-data. */
283:
284: int cn_op_id;
285: /* Used to ensure unique invoke id's are used when invoking operations. */
286:
287: struct task_act * cn_tasklist;
288: /* List of tasks received over this connection. */
289:
290: struct oper_act * cn_operlist;
291: /* List of operations sent over this connection. */
292:
293: struct connection * cn_next;
294: /* Rest of list of connections. */
295:
296: int cn_authen;
297: /* Takes a value from bind.h -> level to which the association is authenticated */
298:
299: };
300: #define NULLCONN ((struct connection *) NULL)
301:
302: /*
303: * Global variables are nasty but useful. Here the external definitions
304: * for the most crucial are given:
305: * a handle on the connections being processed
306: * info describing how this DSA wants the lower layers parameterised
307: * a handle on current deferred get dsa info operations
308: * a handle on current get_edb operations
309: */
310: extern struct connection * connlist; /* Connection blocks */
311: extern int conns_used; /* No. conns in connlist */
312: extern struct connection * connwaitlist; /* Connection blocks to be */
313: extern struct di_block * deferred_dis; /* deferred di_blocks */
314: extern struct oper_act * get_edb_ops; /* GET_EDB operations */
315: extern struct PSAPaddr * mydsaaddr; /* PSAP of this DSA */
316:
317: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.