|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25:
26: /*
27: * Copyright (c) 1988, 1989 Apple Computer, Inc.
28: *
29: * The information contained herein is subject to change without
30: * notice and should not be construed as a commitment by Apple
31: * Computer, Inc. Apple Computer, Inc. assumes no responsibility
32: * for any errors that may appear.
33: *
34: * Confidential and Proprietary to Apple Computer, Inc.
35: */
36:
37: /* "@(#)atp_inc.h: 2.0, 1.16; 10/4/93; Copyright 1988-89, Apple Computer, Inc." */
38:
39: #include "sysglue.h"
40: #include "debug.h"
41: #include "at-config.h"
42:
43: /*
44: * Stuff for accessing protocol headers
45: */
46: #define AT_DDP_HDR(m) ((at_ddp_t *)(gbuf_rptr(m)))
47: #define AT_ATP_HDR(m) ((at_atp_t *)(&((at_ddp_t *)(gbuf_rptr(m)))->data[0]))
48:
49: /*
50: * Masks for accessing/manipulating the bitmap field in atp headers
51: */
52:
53: #ifdef ATP_DECLARE
54: unsigned char atp_mask [] = {
55: 0x01, 0x02, 0x04, 0x08,
56: 0x10, 0x20, 0x40, 0x80,
57: };
58:
59: unsigned char atp_lomask [] = {
60: 0x00, 0x01, 0x03, 0x07,
61: 0x0f, 0x1f, 0x3f, 0x7f,
62: 0xff
63: };
64: #else
65: extern unsigned char atp_mask [];
66: extern unsigned char atp_lomask [];
67: #endif /* ATP_DECLARE */
68:
69: /*
70: * doubly linked queue types and primitives
71: */
72:
73: #define ATP_Q_ENTER(hdr, object, entry) { \
74: if ((hdr).head) { \
75: (hdr).head->entry.prev = (object); \
76: (object)->entry.next = (hdr).head; \
77: } else { \
78: (hdr).tail = (object); \
79: (object)->entry.next = NULL; \
80: } \
81: (object)->entry.prev = NULL; \
82: (hdr).head = (object); \
83: }
84:
85: #define ATP_Q_APPEND(hdr, object, entry) { \
86: if ((hdr).head) { \
87: (hdr).tail->entry.next = (object); \
88: (object)->entry.prev = (hdr).tail; \
89: } else { \
90: (hdr).head = (object); \
91: (object)->entry.prev = NULL; \
92: } \
93: (object)->entry.next = NULL; \
94: (hdr).tail = (object); \
95: }
96:
97: #define ATP_Q_REMOVE(hdr, object, entry) { \
98: if ((object)->entry.prev) { \
99: (object)->entry.prev->entry.next = (object)->entry.next;\
100: } else { \
101: (hdr).head = (object)->entry.next; \
102: } \
103: if ((object)->entry.next) { \
104: (object)->entry.next->entry.prev = (object)->entry.prev;\
105: } else { \
106: (hdr).tail = (object)->entry.prev; \
107: } \
108: }
109:
110: struct atp_rcb_qhead {
111: struct atp_rcb *head;
112: struct atp_rcb *tail;
113: };
114:
115: struct atp_rcb_q {
116: struct atp_rcb *prev;
117: struct atp_rcb *next;
118: };
119:
120: struct atp_trans_qhead {
121: struct atp_trans *head;
122: struct atp_trans *tail;
123: };
124:
125: struct atp_trans_q {
126: struct atp_trans *prev;
127: struct atp_trans *next;
128: };
129:
130: /*
131: * Locally saved remote node address
132: */
133:
134: struct atp_socket {
135: u_short net;
136: at_node node;
137: at_socket socket;
138: };
139:
140: /*
141: * transaction control block (local context at requester end)
142: */
143:
144: struct atp_trans {
145: struct atp_trans_q tr_list; /* trans list */
146: struct atp_state *tr_queue; /* state data structure */
147: gbuf_t *tr_xmt; /* message being sent */
148: gbuf_t *tr_rcv[8]; /* message being rcvd */
149: unsigned int tr_retry; /* # retries left */
150: unsigned int tr_timeout; /* timer interval */
151: char tr_state; /* current state */
152: char tr_rsp_wait; /* waiting for transaction response */
153: char filler[2];
154: unsigned char tr_xo; /* execute once transaction */
155: unsigned char tr_bitmap; /* requested bitmask */
156: unsigned short tr_tid; /* transaction id */
157: struct atp_socket tr_socket; /* the remote socket id */
158: struct atp_trans_q tr_snd_wait; /* list of transactions waiting
159: for space to send a msg */
160: at_socket tr_local_socket;
161: unsigned char tr_local_node;
162: unsigned char tr_local_net[2];
163: gbuf_t *tr_bdsp; /* bds structure pointer */
164: unsigned int tr_tmo_delta;
165: void (*tr_tmo_func)();
166: struct atp_trans *tr_tmo_next;
167: struct atp_trans *tr_tmo_prev;
168: atlock_t tr_lock;
169: atevent_t tr_event;
170: };
171:
172: #define TRANS_TIMEOUT 0 /* waiting for a reply */
173: #define TRANS_REQUEST 1 /* waiting to send a request */
174: #define TRANS_RELEASE 2 /* waiting to send a release */
175: #define TRANS_DONE 3 /* done - waiting for poll to complete */
176: #define TRANS_FAILED 4 /* done - waiting for poll to report failure */
177:
178: /*
179: * reply control block (local context at repling end)
180: */
181:
182: struct atp_rcb {
183: struct atp_rcb_q rc_list; /* rcb list */
184: struct atp_rcb_q rc_tlist;
185: struct atp_state *rc_queue; /* state data structure */
186: gbuf_t *rc_xmt; /* replys being sent */
187: gbuf_t *rc_ioctl; /* waiting ioctl */
188: char rc_snd[8]; /* replys actually to be sent */
189: int rc_pktcnt; /* no of pkts in this trans */
190: short rc_state; /* current state */
191: unsigned char rc_xo; /* execute once transaction */
192: unsigned char rc_local_node;
193: unsigned char rc_local_net[2];
194: short rc_rep_waiting; /* in the reply wait list */
195: int rc_timestamp; /* reply timer */
196: unsigned char rc_bitmap; /* replied bitmask */
197: unsigned char rc_not_sent_bitmap; /* replied bitmask */
198: unsigned short rc_tid; /* transaction id */
199: struct atp_socket rc_socket; /* the remote socket id */
200: };
201:
202: #define RCB_UNQUEUED 0 /* newly allocated, not q'd */
203: #define RCB_RESPONDING 2 /* waiting all of response from process*/
204: #define RCB_RESPONSE_FULL 3 /* got all of response */
205: #define RCB_RELEASED 4 /* got our release */
206: #define RCB_PENDING 5 /* a no wait rcb is full */
207: #define RCB_NOTIFIED 6
208: #define RCB_SENDING 7 /* we're currently xmitting this trans */
209:
210: /*
211: * socket state (per module data structure)
212: */
213:
214: struct atp_state {
215: gref_t *atp_gref; /* must be the first entry */
216: int atp_pid; /* process id, must be the second entry */
217: gbuf_t *atp_msgq; /* data msg, must be the third entry */
218: unsigned char dflag; /* structure flag, must be the fourth entry */
219: unsigned char filler;
220: short atp_minor_no;
221: short atp_socket_no;
222: short atp_flags; /* general flags */
223: struct atp_trans_qhead atp_trans_wait; /* pending transaction list */
224: struct atp_state *atp_trans_waiting; /* list of atps waiting for a
225: free transaction */
226: unsigned int atp_retry; /* retry count */
227: unsigned int atp_timeout; /* retry timeout */
228: struct atp_state *atp_rcb_waiting;
229: struct atp_rcb_qhead atp_rcb; /* active rcbs */
230: struct atp_rcb_qhead atp_attached; /* rcb's waiting to be read */
231: atlock_t atp_lock;
232: atevent_t atp_event;
233: atlock_t atp_delay_lock;
234: atevent_t atp_delay_event;
235: };
236:
237:
238: /*
239: * atp_state flag definitions
240: */
241: #define ATP_CLOSING 0x08 /* atp stream in process of closing */
242:
243:
244: /*
245: * tcb/rcb/state allocation queues
246: */
247:
248: /*
249: * Size defines; must be outside following #ifdef to permit
250: * debugging code to reference independent of ATP_DECLARE
251: */
252: #define NATP_RCB 512 /* the number of ATP RCBs at once */
253: #define NATP_STATE 192 /* the number of ATP sockets open at once */
254: /* note: I made NATP_STATE == NSOCKETS */
255:
256: #ifdef ATP_DECLARE
257: struct atp_trans *atp_trans_free_list = NULL; /* free transactions */
258: struct atp_rcb *atp_rcb_free_list = NULL; /* free rcbs */
259: static struct atp_state *atp_free_list = NULL; /* free atp states */
260: static struct atp_rcb atp_rcb_data[NATP_RCB];
261: static struct atp_state atp_state_data[NATP_STATE];
262:
263: #else
264: extern struct atp_trans *atp_trans_free_list; /* free transactions */
265: extern struct atp_rcb *atp_rcb_free_list; /* free rcbs */
266: extern struct atp_state *atp_free_list; /* free atp states */
267: extern struct atp_rcb atp_rcb_data[];
268: extern struct atp_state atp_state_data[];
269:
270: extern void atp_req_timeout();
271: extern void atp_rcb_timer();
272: extern void atp_x_done();
273: extern struct atp_rcb *atp_rcb_alloc();
274: extern struct atp_trans *atp_trans_alloc();
275: #endif /* ATP_DECLARE */
276:
277: /* prototypes */
278: void atp_send_req(gref_t *, gbuf_t *);
279: void atp_drop_req(gref_t *, gbuf_t *);
280: void atp_send_rsp(gref_t *, gbuf_t *, int);
281: void atp_wput(gref_t *, gbuf_t *);
282: void atp_rput(gref_t *, gbuf_t *);
283: void atp_retry_req(gbuf_t *);
284: void atp_stop(gbuf_t *, int);
285: void atp_cancel_req(gref_t *, unsigned short);
286: int atp_open(gref_t *, int);
287: int atp_bind(gref_t *, unsigned int, unsigned char *);
288: int atp_close(gref_t *, int);
289: gbuf_t *atp_build_release(struct atp_trans *);
290: void atp_req_timeout(struct atp_trans *);
291: void atp_free(struct atp_trans *);
292: void atp_x_done(struct atp_trans *);
293: void atp_send(struct atp_trans *);
294: void atp_rsp_ind(struct atp_trans *, gbuf_t *);
295: void atp_trans_free(struct atp_trans *);
296: void atp_reply(struct atp_rcb *);
297: void atp_rcb_free(struct atp_rcb *);
298: void atp_send_replies(struct atp_state *, struct atp_rcb *);
299: void atp_dequeue_atp(struct atp_state *);
300: int atp_iocack(struct atp_state *, gbuf_t *);
301: void atp_req_ind(struct atp_state *, gbuf_t *);
302: int atp_iocnak(struct atp_state *, gbuf_t *, int);
303: void atp_trp_timer(void *, int);
304: void atp_timout(void (*func)(), struct atp_trans *, int);
305: void atp_untimout(void (*func)(), struct atp_trans *);
306: int atp_tid(struct atp_state *);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.