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