/* * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. The rights granted to you under the License * may not be used to create, or enable the creation or redistribution of, * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ #ifndef _NETAT_ADSP_INTERNAL_H_ #define _NETAT_ADSP_INTERNAL_H_ #include #ifdef __APPLE_API_OBSOLETE #ifdef KERNEL_PRIVATE /* from h/adsp_portab.h */ /* TypeDefs for the basic data bytes. */ typedef unsigned char byte, *bytePtr; #ifdef NOT_USED typedef char int8; typedef short int16; typedef int int32; #endif typedef unsigned char boolean; typedef unsigned short word; typedef unsigned int dword; #define BYTE_AT(x) (*((byte PTR)(x))) #define WORD_AT(x) (*((word PTR)(x))) #define DWORD_AT(x) (*((dword PTR)(x))) #define high(x) ((byte)((x) >> 8)) #define low(x) ((byte)(x)) #define hlword(h, l) (((byte)(l)) | (((byte)(h)) << 8)) /* * On a Mac, there is no need to byte-swap data on the network, so * these macros do nothing */ #define netw(x) x #define netdw(x) x typedef struct { at_net network; /* network number */ byte nodeid; /* node number */ byte socket; /* socket number */ } AddrBlk, *AddrBlkPtr; typedef union { at_inet_t a; } AddrUnion, *AddrUnionPtr; /* End Portab.h */ /* from h/adsp_internal.h */ #undef T_IDLE /* * Default Behavior for ADSP */ #define ocIntervalDefault 6 #define ocMaximumDefault 10 #define probeIntervalDefault 180 /* * MACROS for comparing 32-bit sequence numbers */ #define GT(x,y) (((long)(x-y)) > (long) 0) #define LT(x,y) (((long)(x-y)) < (long) 0) #define GTE(x,y) (((long)(x-y)) >= (long) 0) #define LTE(x,y) (((long)(x-y)) <= (long) 0) #define BETWEEN(x,y,z) (LTE(x,y) && LTE(y,z)) /* * Use the kernel tick counter for SysTicks. */ #define SysTicks() lbolt /* * Timer element used for handling timings */ typedef struct timerelem { struct timerelem *link; short timer; char type; unsigned onQ:1; /* Bit-fields are faster than booleans */ } TimerElem; typedef TimerElem *TimerElemPtr; /* * For AppleTalk Phase 2 event queue */ typedef struct { Ptr qLink; unsigned short qType; ProcPtr callAddr; } LAPEventElem; typedef LAPEventElem *LAPEventElemPtr; /* * The Event types we're passed when an AppleTalk transition occurs */ #define AOpenTransition 0 #define ACloseTransition 2 #define ANetworkTransition 5 /* * The element we're passed when a NetworkTransaction event occurs */ typedef struct TNetworkTransition { Ptr private; /* pointer used internally by NetShare */ ProcPtr netValidProc; /* pointer to the network valid procedure */ } TNetworkTransition, *TPNetworkTransition; typedef long (*NetworkTransitionProcPtr)(TPNetworkTransition nettrans, unsigned long thenet); /* * This is the connection control block */ typedef struct ccb { /*---These fields may not change order or size-----------*/ struct ccb *ccbLink; /* link to next ccb */ unsigned short state; /* state of the connection end */ unsigned char userFlags; /* flags for unsolicited connection events */ unsigned char localSocket; /* socket number of this connection end */ AddrUnion remoteAddress; /* internet address of remote end */ unsigned short attnCode; /* attention code received */ unsigned short attnSize; /* size of received attention data */ unsigned char *attnPtr; /* ptr to received attention data */ unsigned short recvQPending; /* # bytes in receive queue %%% */ /*------------------------------------------------------ */ struct adspcmd *opb; /* Outstanding open/close/remove/listens */ struct adspcmd *spb; /* Outstanding Sends */ struct adspcmd *sapb; /* Outstanding Send Attentions */ struct adspcmd *frpb; /* Outstanding Forward Resets */ struct adspcmd *rpb; /* Outstanding Read Requests */ struct ccb *otccbLink; /* link to next ccb */ int pid; /* Process ID for CCB owner */ unsigned short remCID; /* Remote Connection ID */ unsigned short locCID; /* Local Connection ID */ int sendSeq; /* Seq number of next char to send to remote */ int firstRtmtSeq; /* oldest seq # in local send queue */ int sendWdwSeq; /* Seq # of last char remote has bfr for */ int recvSeq; /* Seq of # of next char expected from rmte */ int recvWdw; /* # of bytes local end has buffer space for */ int attnSendSeq; /* Seq # of next attn pkt to send to remote */ int attnRecvSeq; /* Seq # of next packet local end expects */ int maxSendSeq; /* Highest seq # we ever sent on connection */ /* These must be in the first 255 bytes of the CCB */ TimerElem ProbeTimer; /* Timer element for probes (and open) */ TimerElem FlushTimer; /* Timer element for flushing data */ TimerElem RetryTimer; /* Timer element for retransmissions */ TimerElem AttnTimer; /* Timer element for attention packets */ TimerElem ResetTimer; /* Timer element for forward resets */ short openInterval; /* Interval between open connection packets */ short probeInterval; /* Interval between probes */ short sendInterval; /* Interval before automatic flush */ short rtmtInterval; /* Rexmit interval (dynamically determined) */ short sendCtl; /* Send control message bits */ short sendBlocking; /* Flush unsent data if > than sendBlocking */ short openRetrys; /* # of retrys for Connect & Accept */ short rbuflen; /* Total size of receive buffer */ short sbuflen; /* Total size of receive buffer */ char pad; char lockFlag; char badSeqMax; /* retransmit advice send threshold */ char badSeqCnt; /* # of of out-of-order packets received */ char useCheckSum; /* true to use DDP checksums */ char openState; /* Used for opening a connection (see below) */ gbuf_t *rbuf_mb; /* message block for the recv buffer */ gbuf_t *crbuf_mb; gbuf_t *sbuf_mb; /* message block for the send buffer */ gbuf_t *csbuf_mb; gbuf_t *attn_mb; /* message block for the attention buffer */ gbuf_t *deferred_mb; /* message block deferred for later processing */ #ifdef NOT_USED char ioDone; /* flag for when the adsp header is busy */ #endif char probeCntr; /* # of probes we can miss (counts down) */ char pktSendMax; /* Max # of packets to send without an ack */ char pktSendCnt; /* # of packets sent so far */ int sendStamp; /* Time of last ackRequest */ int timerSeq; /* Seq # of char corresponding to above time stamp */ short roundTrip; /* Average Round-Trip time (in 6ths of a second) */ short deviation; /* deviation from roundTrip time */ unsigned sData:1; /* There's data in the send queue */ unsigned waitingAck:1; /* We're waiting for an ack packet */ unsigned rData:1; /* There's data in the receive queue */ unsigned resentData:1; /* True when we resend data due to timeout */ unsigned sendDataAck:1; /* True if he requested an ack */ unsigned sendAttnAck:1; /* Must send attn acknowlege */ unsigned sendAttnData:1; /* Must send attn data */ unsigned callSend:1; /* Must call CheckSend() */ unsigned rbufFull:1; /* We've closed our receive window. */ unsigned noXmitFlow:1; /* True stops incrementing # of xmit * packets to send in a row after receiving * an ack packet. */ unsigned secureCCB:1; /* True if this is a secure connection */ unsigned removing:1; /* There is a dspRemove pending */ unsigned writeFlush:1; /* Flush send queue even if # bytes to * send is less than send blocking. */ unsigned delay:1; /* do not complete commands until user * *** NO LONGER USED IN KERNEL *** */ ADSP_FRAME f; /* Used to send every packet */ ADSP_OPEN_DATA of; /* Holds the data for the open exchange */ gref_t *gref; /* The queue associated with the CCB */ gbuf_t *sp_mp; } CCB, *CCBPtr; /* * Change order and die !!! --- See the receive open packet code */ #define O_STATE_NOTHING 0 /* Not opening */ #define O_STATE_LISTEN 1 /* Listening for open request */ #define O_STATE_OPENWAIT 2 /* Sent Req, waiting for Ack to open * request */ #define O_STATE_ESTABLISHED 3 /* Got Req, send Req+Ack,waiting Ack */ #define O_STATE_OPEN 4 /* Connection is open */ /* * These bits are used in the sendCtl field to indicate what needs to be sent */ #define B_CTL_PROBE 0x0001 #define B_CTL_OREQ 0x0002 #define B_CTL_OACK 0x0004 #define B_CTL_OREQACK 0x0008 #define B_CTL_ODENY 0x0010 #define B_CTL_CLOSE 0x0020 #define B_CTL_FRESET 0x0040 #define B_CTL_FRESETACK 0x0080 #define B_CTL_RETRANSMIT 0x0100 #define kProbeTimerType offsetof(CCB, ProbeTimer) #define kFlushTimerType offsetof(CCB, FlushTimer) #define kRetryTimerType offsetof(CCB, RetryTimer) #define kAttnTimerType offsetof(CCB, AttnTimer) #define kResetTimerType offsetof(CCB, ResetTimer) /* * Used to manage the send receive queue */ typedef struct { short len; /* # of bytes in this fragment */ char flags; /* See #define's below */ char data[1]; } HDR, *HDRPtr; #define HDR_LEN 3 /* Yes, I know it really is 4 bytes long... */ #define F_GAP 0x03 #define F_EOM 0x04 #define F_WRAP 0x08 #define F_VALID 0x10 #define F_ENCRYPTED 0x20 /* %%% Needed ??? */ #define F_LAST 0x40 /* This is last block in buffer */ /* %%% Are these two used anymore? */ #define sbufPtr(y) (&sp->sbuf[((y) < sp->sbuflen) ? (y) : ((y) - sp->sbuflen)]) #define rbufPtr(y) (&sp->rbuf[((y) < sp->rbuflen) ? (y) : ((y) - sp->rbuflen)]) /* End Internal.h */ /* fron h/adsp_supp.h */ void CallUserRoutine(CCBPtr sp); /* (CCB FPTR sp); */ /* * Add queue element to end of queue. Pass Address of ptr to * 1st element of queue int qAddToEnd(struct qlink **qhead, struct qlink *qelem); */ /* (void FPTR FPTR qhead, void FPTR qelem); */ /* * Hunt down a linked list of queue elements looking for an element with * 'data' at 'offset' bytes into the queue element. */ void *qfind_b(void *qhead, word offset, word data); void *qfind_w(void *qhead, word offset, word data); void *qfind_p(void *qhead, word offset, void *ptr); void *qfind_o(void *qhead, word offset, void *ptr); void *qfind_m(CCBPtr qhead, void *match, ProcPtr compare_fnx); /* * Routines to handle sorted timer queues */ void InsertTimerElem(TimerElemPtr *qhead, TimerElemPtr t, int val); void RemoveTimerElem(TimerElemPtr *qhead, TimerElemPtr t); void TimerQueueTick(TimerElemPtr *qhead); /* from h/adsp_global.h */ typedef struct { void *ccbList; /* Ptr to list of connection control blocks */ TimerElemPtr slowTimers; /* The probe timer list */ TimerElemPtr fastTimers; /* The fast timer list */ unsigned short lastCID; /* Last connection ID assigned */ char inTimer; /* We're inside timer routine */ } GLOBAL; extern GLOBAL adspGlobal; /* Address of ptr to list of ccb's */ #define AT_ADSP_STREAMS ((CCB **)&(adspGlobal.ccbList)) void CheckSend(CCBPtr); struct qlink { struct qlink *qlinkp; }; int qAddToEnd(struct qlink **, struct qlink *); void adspioc_ack(int, gbuf_t *, gref_t *); int CalcRecvWdw(CCBPtr); int calcRecvQ(CCBPtr); int CalcSendQFree(CCBPtr); int adsp_sendddp(CCBPtr, gbuf_t *, int, AddrUnion *, int); int CheckReadQueue(CCBPtr); int CheckOkToClose(CCBPtr); int RXData(CCBPtr, gbuf_t *, ADSP_FRAMEPtr, int); int RXFResetAck(CCBPtr, ADSP_FRAMEPtr); int RxClose(CCBPtr); void CheckRecvSeq(CCBPtr, ADSP_FRAMEPtr); int RXFReset(CCBPtr, ADSP_FRAMEPtr); int RXAttention(CCBPtr, gbuf_t *, ADSP_FRAMEPtr, int); CCBPtr FindSender(ADSP_FRAMEPtr, AddrUnion); void DoClose(CCBPtr, int, int); void completepb(CCBPtr, struct adspcmd *); int adspReadAttention(CCBPtr, struct adspcmd *); int adspMode(struct adspcmd *); int CompleteQueue(struct adspcmd **, int); void CleanupGlobals(void); void InitGlobals(void); void TimerStop(void); void TimerTick(void); void SndMsgUp(gref_t *, gbuf_t *); int adspDeassignSocket(CCBPtr); unsigned char adspAssignSocket(gref_t *gref, int); int adspWriteHandler(gref_t *, gbuf_t *); int adspReadHandler(gref_t *, gbuf_t *); int adsp_wput(gref_t *gref, gbuf_t *m); int adspRelease(gref_t *); int adsp_close(gref_t *); int adspAllocateCCB(gref_t *); void NotifyUser(CCBPtr); void UrgentUser(CCBPtr); unsigned short NextCID(void); #endif /* KERNEL_PRIVATE */ #endif /* __APPLE_API_OBSOLETE */ #endif /* _NETAT_ADSP_INTERNAL_H_ */