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