1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28#ifndef _NETAT_ADSP_INTERNAL_H_
29#define _NETAT_ADSP_INTERNAL_H_
30
31#include <sys/types.h>
32
33#ifdef __APPLE_API_OBSOLETE
34#ifdef KERNEL_PRIVATE
35
36/* from h/adsp_portab.h */
37
38/* TypeDefs for the basic data bytes. */
39
40typedef unsigned char		byte, *bytePtr;
41
42#ifdef NOT_USED
43typedef char			int8;
44typedef short 			int16;
45typedef int 			int32;
46#endif
47
48typedef unsigned char		boolean;
49
50typedef unsigned short		word;
51
52typedef unsigned int 		dword;
53
54#define BYTE_AT(x)		(*((byte PTR)(x)))
55#define WORD_AT(x)		(*((word PTR)(x)))
56#define DWORD_AT(x)		(*((dword PTR)(x)))
57
58#define high(x)			((byte)((x) >> 8))
59#define low(x)			((byte)(x))
60#define hlword(h, l)		(((byte)(l)) | (((byte)(h)) << 8))
61
62
63/*
64 * On a Mac, there is no need to byte-swap data on the network, so
65 * these macros do nothing
66 */
67
68#define netw(x)		x
69#define netdw(x)	x
70
71typedef struct
72{
73  at_net           network;       /* network number */
74  byte           nodeid;        /* node number    */
75  byte           socket;        /* socket number  */
76} AddrBlk, *AddrBlkPtr;
77
78typedef union
79{
80   at_inet_t     a;
81} AddrUnion, *AddrUnionPtr;
82
83/* End Portab.h */
84
85/* from h/adsp_internal.h */
86
87#undef T_IDLE
88
89/*
90* Default Behavior for ADSP
91*/
92#define	ocIntervalDefault	6
93#define ocMaximumDefault	10
94#define probeIntervalDefault	180
95
96/*
97* MACROS for comparing 32-bit sequence numbers
98*/
99#define GT(x,y)  (((long)(x-y)) > (long) 0)
100#define LT(x,y)  (((long)(x-y)) < (long) 0)
101#define GTE(x,y) (((long)(x-y)) >= (long) 0)
102#define LTE(x,y) (((long)(x-y)) <= (long) 0)
103#define BETWEEN(x,y,z) (LTE(x,y) && LTE(y,z))
104
105/*
106 * Use the kernel tick counter for SysTicks.
107 */
108
109#define SysTicks()	lbolt
110
111/*
112 * Timer element used for handling timings
113 */
114typedef struct timerelem {
115    struct timerelem *link;
116    short timer;
117    char type;
118    unsigned onQ:1;		/* Bit-fields are faster than booleans */
119} TimerElem;
120
121typedef TimerElem *TimerElemPtr;
122
123/*
124 * For AppleTalk Phase 2 event queue
125 */
126typedef struct {
127    Ptr	qLink;
128    unsigned short qType;
129    ProcPtr callAddr;
130} LAPEventElem;
131
132typedef LAPEventElem *LAPEventElemPtr;
133
134/*
135 * The Event types we're passed when an AppleTalk transition occurs
136 */
137#define AOpenTransition		0
138#define	ACloseTransition	2
139#define ANetworkTransition	5
140
141/*
142 * The element we're passed when a NetworkTransaction event occurs
143 */
144typedef struct TNetworkTransition {
145    Ptr	private;		/* pointer used internally by NetShare */
146    ProcPtr netValidProc;	/* pointer to the network valid procedure */
147} TNetworkTransition, *TPNetworkTransition;
148
149typedef long (*NetworkTransitionProcPtr)(TPNetworkTransition nettrans,
150				   unsigned long thenet);
151/*
152 * This is the connection control block
153 */
154typedef struct ccb {
155    /*---These fields may not change order or size-----------*/
156
157    struct ccb *ccbLink;	/* link to next ccb */
158    unsigned short state;	/* state of the connection end */
159    unsigned char userFlags;	/* flags for unsolicited connection events */
160    unsigned char localSocket;	/* socket number of this connection end */
161    AddrUnion remoteAddress;	/* internet address of remote end */
162    unsigned short attnCode;	/* attention code received */
163    unsigned short attnSize;	/* size of received attention data */
164    unsigned char *attnPtr;	/* ptr to received attention data */
165    unsigned short recvQPending; /* # bytes in receive queue %%% */
166    /*------------------------------------------------------ */
167
168    struct adspcmd *opb;	/* Outstanding open/close/remove/listens */
169    struct adspcmd *spb;	/* Outstanding Sends */
170    struct adspcmd *sapb;	/* Outstanding Send Attentions */
171    struct adspcmd *frpb;	/* Outstanding Forward Resets */
172    struct adspcmd *rpb;	/* Outstanding Read Requests */
173
174    struct ccb *otccbLink;	/* link to next ccb */
175    int pid;		/* Process ID for CCB owner */
176
177    unsigned short remCID;	/* Remote Connection ID */
178    unsigned short locCID;	/* Local Connection ID */
179    int sendSeq;		/* Seq number of next char to send to remote */
180    int firstRtmtSeq;		/* oldest seq # in local send queue */
181    int sendWdwSeq;		/* Seq # of last char remote has bfr for */
182    int recvSeq;		/* Seq of # of next char expected from rmte */
183    int recvWdw;		/* # of bytes local end has buffer space for */
184    int attnSendSeq;		/* Seq # of next attn pkt to send to remote */
185    int attnRecvSeq;		/* Seq # of next packet local end expects */
186    int maxSendSeq;		/* Highest seq # we ever sent on connection */
187
188    /* These must be in the first 255 bytes of the CCB */
189    TimerElem ProbeTimer;	/* Timer element for probes (and open) */
190    TimerElem FlushTimer;	/* Timer element for flushing data */
191    TimerElem RetryTimer;	/* Timer element for retransmissions */
192    TimerElem AttnTimer;	/* Timer element for attention packets */
193    TimerElem ResetTimer;	/* Timer element for forward resets */
194
195    short openInterval;		/* Interval between open connection packets */
196    short probeInterval;	/* Interval between probes */
197    short sendInterval;		/* Interval before automatic flush */
198    short rtmtInterval;		/* Rexmit interval (dynamically determined) */
199
200    short sendCtl;		/* Send control message bits */
201    short sendBlocking;		/* Flush unsent data if > than sendBlocking */
202    short openRetrys;		/* # of retrys for Connect & Accept */
203    short rbuflen;		/* Total size of receive buffer */
204    short sbuflen;		/* Total size of receive buffer */
205    char pad;
206    char lockFlag;
207    char badSeqMax;		/* retransmit advice send threshold */
208    char badSeqCnt;		/* # of of out-of-order packets received */
209    char useCheckSum;		/* true to use DDP checksums */
210    char openState;		/* Used for opening a connection (see below) */
211
212    gbuf_t *rbuf_mb;		/* message block for the recv buffer */
213    gbuf_t *crbuf_mb;
214    gbuf_t *sbuf_mb;		/* message block for the send buffer */
215    gbuf_t *csbuf_mb;
216    gbuf_t *attn_mb;		/* message block for the attention buffer */
217    gbuf_t *deferred_mb;	/* message block deferred for later processing */
218
219#ifdef NOT_USED
220    char ioDone;		/* flag for when the adsp header is busy */
221#endif
222    char probeCntr;		/* # of probes we can miss (counts down) */
223    char pktSendMax;		/* Max # of packets to send without an ack */
224    char pktSendCnt;		/* # of packets sent so far */
225
226    int sendStamp;		/* Time of last ackRequest */
227    int timerSeq;		/* Seq # of char corresponding to above time stamp */
228    short roundTrip;		/* Average Round-Trip time (in 6ths of a second) */
229    short deviation;		/* deviation from roundTrip time */
230
231    unsigned sData:1;		/* There's data in the send queue */
232    unsigned waitingAck:1;	/* We're waiting for an ack packet */
233    unsigned rData:1;		/* There's data in the receive queue */
234    unsigned resentData:1;	/* True when we resend data due to timeout */
235    unsigned sendDataAck:1;	/* True if he requested an ack */
236    unsigned sendAttnAck:1;	/* Must send attn acknowlege */
237    unsigned sendAttnData:1;	/* Must send attn data */
238    unsigned callSend:1;	/* Must call CheckSend() */
239    unsigned rbufFull:1;	/* We've closed our receive window. */
240    unsigned noXmitFlow:1;	/* True stops incrementing # of xmit
241				 * packets to send in a row after receiving
242				 * an ack packet. */
243    unsigned secureCCB:1;	/* True if this is a secure connection */
244    unsigned removing:1;	/* There is a dspRemove pending */
245    unsigned writeFlush:1;	/* Flush send queue even if # bytes to
246				 * send is less than send blocking. */
247    unsigned delay:1;		/* do not complete commands until user
248				 * *** NO LONGER USED IN KERNEL *** */
249    ADSP_FRAME f;		/* Used to send every packet */
250    ADSP_OPEN_DATA of;		/* Holds the data for the open exchange */
251    gref_t *gref;			/* The queue associated with the CCB */
252    gbuf_t *sp_mp;
253} CCB, *CCBPtr;
254
255
256/*
257 * Change order and die !!! --- See the receive open packet code
258 */
259#define O_STATE_NOTHING		0	/* Not opening */
260#define O_STATE_LISTEN 		1	/* Listening for open request */
261#define O_STATE_OPENWAIT 	2 	/* Sent Req, waiting for Ack to open
262				  	 * request */
263#define O_STATE_ESTABLISHED 	3	/* Got Req, send Req+Ack,waiting Ack */
264#define O_STATE_OPEN		4	/* Connection is open */
265
266/*
267* These bits are used in the sendCtl field to indicate what needs to be sent
268*/
269#define B_CTL_PROBE		0x0001
270#define B_CTL_OREQ		0x0002
271#define B_CTL_OACK		0x0004
272#define B_CTL_OREQACK		0x0008
273#define B_CTL_ODENY		0x0010
274#define B_CTL_CLOSE		0x0020
275#define B_CTL_FRESET		0x0040
276#define B_CTL_FRESETACK		0x0080
277#define	B_CTL_RETRANSMIT	0x0100
278
279
280#define kProbeTimerType offsetof(CCB, ProbeTimer)
281#define kFlushTimerType offsetof(CCB, FlushTimer)
282#define kRetryTimerType offsetof(CCB, RetryTimer)
283#define kAttnTimerType offsetof(CCB, AttnTimer)
284#define kResetTimerType offsetof(CCB, ResetTimer)
285
286/*
287 * Used to manage the send receive queue
288 */
289typedef struct {
290    short len;			/* # of bytes in this fragment */
291    char flags;			/* See #define's below */
292    char data[1];
293} HDR, *HDRPtr;
294
295#define	HDR_LEN	3		/* Yes, I know it really is 4 bytes long... */
296
297#define F_GAP		0x03
298#define F_EOM		0x04
299#define F_WRAP		0x08
300#define F_VALID		0x10
301#define F_ENCRYPTED	0x20	/* %%% Needed ??? */
302#define F_LAST		0x40	/* This is last block in buffer */
303
304
305/* %%% Are these two used anymore? */
306#define sbufPtr(y) (&sp->sbuf[((y) < sp->sbuflen) ? (y) : ((y) - sp->sbuflen)])
307#define rbufPtr(y) (&sp->rbuf[((y) < sp->rbuflen) ? (y) : ((y) - sp->rbuflen)])
308
309/* End Internal.h */
310
311/* fron h/adsp_supp.h */
312
313void	CallUserRoutine(CCBPtr sp);	/* (CCB FPTR sp); */
314
315
316/*
317 *	Add queue element to end of queue.  Pass Address of ptr to
318 *	1st element of queue
319int	qAddToEnd(struct qlink **qhead, struct qlink *qelem);
320 */
321		/* (void FPTR FPTR qhead, void FPTR qelem); */
322
323/*
324 *	Hunt down a linked list of queue elements looking for an element with
325 *	'data' at 'offset' bytes into the queue element.
326 */
327void *qfind_b(void *qhead, word offset, word data);
328void *qfind_w(void *qhead, word offset, word data);
329void *qfind_p(void *qhead, word offset, void *ptr);
330void *qfind_o(void *qhead, word offset, void *ptr);
331void *qfind_m(CCBPtr qhead, void *match, ProcPtr compare_fnx);
332
333
334/*
335 * Routines to handle sorted timer queues
336 */
337void InsertTimerElem(TimerElemPtr *qhead, TimerElemPtr t, int val);
338void RemoveTimerElem(TimerElemPtr *qhead, TimerElemPtr t);
339void TimerQueueTick(TimerElemPtr *qhead);
340
341/* from h/adsp_global.h */
342
343typedef struct {
344	void *ccbList;		/* Ptr to list of connection control blocks */
345
346	TimerElemPtr slowTimers; /* The probe timer list */
347	TimerElemPtr fastTimers; /* The fast timer list */
348
349	unsigned short lastCID;		/* Last connection ID assigned */
350	char inTimer;		/* We're inside timer routine */
351} GLOBAL;
352
353extern GLOBAL adspGlobal;
354
355/* Address of ptr to list of ccb's */
356#define AT_ADSP_STREAMS ((CCB **)&(adspGlobal.ccbList))
357
358void CheckSend(CCBPtr);
359
360struct qlink {
361	struct qlink *qlinkp;
362};
363
364int qAddToEnd(struct qlink **, struct qlink *);
365
366void adspioc_ack(int, gbuf_t *, gref_t *);
367int CalcRecvWdw(CCBPtr);
368int calcRecvQ(CCBPtr);
369int CalcSendQFree(CCBPtr);
370int adsp_sendddp(CCBPtr, gbuf_t *, int, AddrUnion *, int);
371int CheckReadQueue(CCBPtr);
372int CheckOkToClose(CCBPtr);
373
374int RXData(CCBPtr, gbuf_t *, ADSP_FRAMEPtr, int);
375int RXFResetAck(CCBPtr, ADSP_FRAMEPtr);
376int RxClose(CCBPtr);
377void CheckRecvSeq(CCBPtr, ADSP_FRAMEPtr);
378int RXFReset(CCBPtr, ADSP_FRAMEPtr);
379int RXAttention(CCBPtr, gbuf_t *, ADSP_FRAMEPtr, int);
380CCBPtr FindSender(ADSP_FRAMEPtr, AddrUnion);
381void DoClose(CCBPtr, int, int);
382void completepb(CCBPtr, struct adspcmd *);
383int adspReadAttention(CCBPtr, struct adspcmd *);
384int adspMode(struct adspcmd *);
385int CompleteQueue(struct adspcmd **, int);
386
387void CleanupGlobals(void);
388void InitGlobals(void);
389void TimerStop(void);
390void TimerTick(void);
391
392void SndMsgUp(gref_t *, gbuf_t *);
393int adspDeassignSocket(CCBPtr);
394unsigned char adspAssignSocket(gref_t *gref, int);
395int adspWriteHandler(gref_t *, gbuf_t *);
396int adspReadHandler(gref_t *, gbuf_t *);
397
398int adsp_wput(gref_t *gref, gbuf_t *m);
399int adspRelease(gref_t *);
400int adsp_close(gref_t *);
401int adspAllocateCCB(gref_t *);
402
403void NotifyUser(CCBPtr);
404void UrgentUser(CCBPtr);
405
406unsigned short NextCID(void);
407
408#endif /* KERNEL_PRIVATE */
409#endif /* __APPLE_API_OBSOLETE */
410
411#endif /* _NETAT_ADSP_INTERNAL_H_ */
412