/* * $Author: djh $ $Date: 1994/10/24 06:42:08 $ * $Header: /mac/src/cap60/netat/RCS/appletalk.h,v 2.8 1994/10/24 06:42:08 djh Rel djh $ * $Revision: 2.8 $ */ /* * appletalk.h - Appletalk definitions * * AppleTalk package for UNIX (4.2 BSD). * * Copyright (c) 1986, 1987, 1988 by The Trustees of Columbia University in * the City of New York. * * Portions Copyright (C) 1985, Stanford Univ. SUMEX project. * C language version (C) 1984, Stanford Univ. SUMEX project. * May be used but not sold without permission. * * Portions Copyright (C) 1984, Apple Computer Inc. * Gene Tyacke, Alan Oppenheimer, G. Sidhu, Rich Andrews. * * Edit History: * * June 13, 1986 Schilit Created. * */ #include #include #include /* this definitely doesn't belong here!! */ /* but there's no way that I'm going through 50 files to fix it */ /* misc structures */ /* use these when protocol depends on actual number of bits somehow */ /* use ifdefs for different machines */ typedef unsigned char byte; typedef char sbyte; typedef unsigned short word; typedef short sword; #ifdef __alpha /* The alpha has 64bit longs */ typedef unsigned int dword; typedef int sdword; #else __alpha typedef unsigned long dword; typedef long sdword; #endif __alpha typedef int OSErr; typedef struct { /* BDS, buffer data structure */ word buffSize; char *buffPtr; word dataSize; dword userData; } BDS; typedef BDS * BDSPtr; typedef struct { /* BDSType */ BDS a[8]; } BDSType; typedef struct { /* Str32 */ byte s[33]; /* make 33 in case we want a null byte */ } Str32; #define userBytes userData typedef struct { /* AddrBlock */ word net; byte node; byte skt; } AddrBlock; /* * For each protocol, its header structure, definitions, * and control / status parameter block. */ /* * LAP protocol * */ typedef struct { /* LAP */ byte dst; byte src; byte type; } LAP, LAPAdrBlock; #define dstNodeID dst #define srcNodeID src #define lapProtType type /* LAP definitions */ #define lapShortDDP 1 /* short DDP type */ #define lapDDP 2 /* DDP type */ #define lapMB 10 /* Masterbridge packet */ #define lapSize 3 /* size of lap header */ /* LAP delivery mechanisms */ #define LAP_KIP 1 /* "standard" KIP */ #define LAP_MKIP 2 /* modified KIP for UAB */ #define LAP_ETALK 3 /* EtherTalk phase 1/2 */ #define LAP_KERNEL 4 /* kernel EtherTalk */ /* * Masterbridge routing protocol * */ #define mbMBS 70 /* socket for masterbridge requests */ typedef struct { byte type; /* type of packet */ byte node; /* destination node */ word net; /* destination net */ dword bridge; /* bridge address */ dword src; /* packet source (IP) */ /* Maybe that should be a Appletalk address? */ /* more general but less efficent */ } MBPACKET; #define mbRRQ 50 /* route request packet */ #define mbRRP 51 /* route reply packet */ #define mbPING 52 /* ping packet */ #define mbPINGR 53 /* ping reply packet */ /* * DDP protocol * */ typedef struct { /* DDP */ word length; word checksum; word dstNet; word srcNet; byte dstNode; byte srcNode; byte dstSkt; byte srcSkt; byte type; } DDP; typedef struct { /* ShortDDP */ word length; byte dstSkt; byte srcSkt; byte type; } ShortDDP; /* DDP definitions */ #define ddpMaxSkt 0xFF /* max socket number */ #define ddpMaxWKS 0x7F #define ddpMaxData 586 #define ddpLengthMask 0x3FF #define ddpHopShift 10 #define ddpSize 13 /* size of DDP header */ #define ddpSSize 5 #define ddpWKS 128 /* boundary of DDP well known sockets */ #define ddpEWKS 64 /* start of experimental socket range */ #define ddpRTMP 1 /* RTMP type */ #define ddpNBP 2 /* NBP type */ #define ddpATP 3 /* ATP type */ #define ddpECHO 4 /* ECHO type */ #define ddpRTMP_REQ 5 /* RTMP request */ #define ddpZIP 6 /* ZIP packet */ #define ddpADSP 7 /* ADSP packet */ #define ddpIP 22 /* IP type */ #define ddpARP 23 /* ARP type */ #define ddpWKSUnix 768 /* start of unofficial WKS range on UNIX */ #define ddpOWKSUnix 200 /* start of official WKS range on UNIX */ #define ddpNWKSUnix 16384 /* start of non-WKS .. */ #define ddpIPSkt 72 /* socket used by Dartmouth encapsulation */ /* * Start of the DDP Encapsulated protocols * */ /* * RTMP protocol defintions * */ typedef struct { /* RTMP */ word net; byte idLen; byte id; /* start of ID field */ } RTMP; typedef struct { word net; byte hops; } RTMPtuple; #define rtmpSkt 1 /* number of RTMP socket */ #define rtmpSize 4 /* minimum size */ #define rtmpTupleSize 3 /* * NBP/NIS protocol definitions * */ #define nbpEquals '=' #define nbpWild 0xc5 #define nbpStar '*' #define ENTITYSIZE 32 /* use up to 32 for data */ /* note str32 is really 33 bytes now */ typedef struct { /* EntityName */ Str32 objStr; Str32 typeStr; Str32 zoneStr; } EntityName; typedef struct { /* NBP Table entry */ AddrBlock addr; byte enume; /* add enumerator - cck */ EntityName ent; } NBPTEntry; typedef struct { /* RetransType */ int retransInterval; int retransCount; } RetransType; /* * Echo protocol definitions * */ #define echoRequest 1 /* echo Request cmd */ #define echoReply 2 /* echo reply cmd */ #define echoSkt 4 /* echo socket */ /* * Zone Information Protocol protocol definitions * */ #define zipZIS 0x6 /* Zone information socket */ /* define atp zip commands */ #define zip_GetMyZone 7 /* get my zone command */ #define zip_GetZoneList 8 /* get zone list command */ #define zip_GetLocZones 9 /* get local zone list */ /* atp user bytes for zip commands */ /* no reply struct since return is packed array of pascal strings */ typedef struct zipUserBytes { byte zip_cmd; /* zip command (LastFlag on return) */ byte zip_zero; /* always zero */ word zip_index; /* zip index (count on return) */ } zipUserBytes; /* * Appletalk Transport Protocol protocol definitions * */ #define atpSize 8 /* sizeof struct ATP */ typedef byte BitMapType; typedef dword atpUserDataType; typedef union { byte bytes[4]; word words[2]; } inadword; typedef struct { /* ATP */ byte control; BitMapType bitmap; word transID; atpUserDataType userData; } ATP; #define atpMaxNum 8 #define atpMaxData 578 #define atpNData 512+16 /* normal amount of data */ /* * ATP Client protocols * */ /* * Printer Access Protocol protocol definitions * */ /* PAPType Values: */ #define PAPSegSize 512 typedef struct { dword SystemStuff; /* PAP internal use (not used) */ byte StatusStr[256]; /* status string + 1 byte for length */ } PAPStatusRec; #define papNoError 0 /* no error - connection open */ #define papPrinterBusy 0xffff /* printer busy */ /* * Appletalk Session Protocol (ASP) definitions * */ /* FOR ASP VERSION 1.0 */ #define ASP_PROTOCOL_VERSION 0x0100 /* ASP Packet types - needed since spgetrequest returns */ #define aspCloseSession 1 #define aspCommand 2 #define aspGetStat 3 #define aspOpenSess 4 #define aspTickle 5 #define aspWrite 6 #define aspWriteData 7 #define aspAttention 8 /* ReqRefNum returned by SPGetRequest and used by SPWriteContinue, */ /* SPWrtReply and SPCmdReply is a pointer to a special command block */ /* Use ReqRefNumType to define a reqRefNum argument... */ typedef char * ReqRefNumType; /* * ABusRecord definitions * */ /* abopcode defintions */ #define tNBPConfirm 20 #define tNBPLookUp 21 #define tNBPRegister 100 #define tNBPDelete 101 #define tNBPTickle 102 #define tNBPSLookUp 103 typedef struct atpProto { byte atpSocket; /* listening/responding socket number */ AddrBlock atpAddress; /* destination or source socket address */ int atpReqCount; /* request buffer size in bytes */ char *atpDataPtr; /* Pointer to request data */ BDSPtr atpRspBDSPtr; /* pointer to response buffer list */ BitMapType atpBitMap; /* transaction bitmap */ int atpTransID; /* transaction id */ int atpActCount; /* count of bytes received */ atpUserDataType atpUserData; /* user bytes */ #ifdef AIX unsigned fatpXO : 1, /* exactly once boolean */ #else AIX byte fatpXO : 1, /* exactly once boolean */ #endif AIX fatpEOM : 1; /* end of message boolean */ byte atpTimeOut; /* retry timeout interval in seconds */ byte atpRetries; /* number of retries - 255 max */ byte atpNumBufs; /* number of elements in response BDS */ /* or number of response pkts sent */ byte atpNumRsp; /* number of of response pkts received */ /* or sequence number (on send) */ byte atpBDSSize; /* number of elements in response bds */ atpUserDataType atpRspUData; /* user bytes sent or received in */ /* transaction response */ char *atpRspBuf; /* Pointer to response buffer */ int atpRspSize; /* size of response message buffer */ } atpProto; typedef struct lapProto { /* LAP record for LAP calls */ LAPAdrBlock lapAddress; /* address for lap */ word lapReqCount; /* bytes to read/write */ word lapActCount; /* actual quantity from above operation */ byte *lapDataPtr; /* pointer to data */ } lapProto; typedef struct ddpProto { /* DDP record for DDP calls */ word ddpType; /* type field */ word ddpSocket; /* source socket */ AddrBlock ddpAddress; /* destination address */ word ddpReqCount; /* bytes to read/write */ word ddpActCount; /* actual quantity from above operation */ byte *ddpDataPtr; /* pointer to data buffer */ word ddpNodeID; /* beats me */ } ddpProto; typedef struct nbpProto { QElem abQElem; /* internal: queue links */ int abOpcode; /* type of call */ int abResult; /* result code */ dword abUserReference; /* for programmer use */ EntityName *nbpEntityPtr; /* pointer to entity name */ NBPTEntry *nbpBufPtr; /* user storage for NBP entities */ word nbpBufSize; /* count of entries that fit in buffer */ word nbpDataField; AddrBlock nbpAddress; RetransType nbpRetransmitInfo; int nbpMaxEnt; /* internal: max entries */ byte nbpID; /* internal: transaction ID */ int retranscount; /* internal: modifiable retranscount */ } nbpProto; typedef struct ABusRecord { #ifdef notdefined /* not needed */ ABCallType abOpcode; /* type of call */ #endif struct ABusRecord *abNext; /* INTERNAL USE ONLY: used to link read queue*/ int abResult; /* result code */ dword abUserReference; /* for programmer use */ union { /* for various protocols */ lapProto lap; ddpProto ddp; atpProto atp; } proto; } ABusRecord; typedef struct ABusRecord *abRecPtr; /* IO Vector protocol levels for scatter gather processing */ #define IOV_LAP_LVL 0 /* lap index */ #define IOV_DDP_LVL 1 /* ddp index */ #define IOV_ATP_LVL 2 /* atp index */ #define IOV_ATPU_LVL 3 /* user data from atp index */ /* size of iov's */ #define IOV_LAP_SIZE 1 /* lap size */ #define IOV_DDP_SIZE 2 /* ddp size */ #define IOV_ATP_SIZE 3 /* atp size */ #define IOV_ATPU_SIZE 4 /* user data from atp size */ /* maximum IOV level expected by DDP read routine */ #define IOV_READ_MAX 10 /* no more than this allowed */ /* Debug flags structure */ typedef union { struct { unsigned dbg_lap : 1; /* debug LAP */ unsigned dbg_ddp : 1; /* debug DDP */ unsigned dbg_atp : 1; /* debug ATP */ unsigned dbg_nbp : 1; /* debug NBP */ unsigned dbg_pap : 1; /* debug PAP */ unsigned dbg_ini : 1; /* debug init code */ unsigned dbg_asp : 1; /* debug asp */ unsigned dbg_skd : 1; /* debug scheduler */ } U_dbg; unsigned db_flgs; } DBUG; #define db_lap U_dbg.dbg_lap #define db_ddp U_dbg.dbg_ddp #define db_atp U_dbg.dbg_atp #define db_nbp U_dbg.dbg_nbp #define db_pap U_dbg.dbg_pap #define db_ini U_dbg.dbg_ini #define db_asp U_dbg.dbg_asp #define db_skd U_dbg.dbg_skd extern DBUG dbug; #define ticktosec(sec) ((sec)/4) /* converts from internal tick units */ /* to seconds */ #define sectotick(sec) ((sec)*4) /* converts from seconds to internal ticks */ /* define some things for the c compiler - CCK: I think some if not all */ /* of these should be in the compiler, thus I use all lowercased as they */ /* would be (as I normally use c compiler stuff). */ #define private static #define export #define import extern typedef int boolean; /* levels of registers - we declare importance of different register */ /* vars this way */ #define REGISTER1 register #define REGISTER2 register #define REGISTER3 register typedef int (*ProcPtr)(); /* procedure pointer */ #define NILPROC (ProcPtr) 0 /* null procedure */ #define NILPTR (u_char *) 0 /* Some general definitions - probably don't belong here */ #define TRUE 1 #define FALSE 0 #define min(x,y) (((int)(x) > (int)(y)) ? (y) : (x)) #define max(x,y) (((int)(x) > (int)(y)) ? (x) : (y)) #define tokipnet(x,y) ((y)|((x)<<8)) #ifdef pyr #define ntohs(x) (x) #endif /* high and low part of a "kip" network number - assume number in network */ /* format */ #define nkipnetnumber(x) ntohs((x))>>8 #define nkipsubnetnumber(x) ntohs((x))&0xff /* same but assumes in host form */ #define kipnetnumber(x) (x)>>8 #define kipsubnetnumber(x) (x)&0xff /* version information */ struct cap_version { int cv_version; /* e.g. 3 */ int cv_subversion; /* e.g. 0 - if original was subverted :-) */ int cv_patchlevel; /* e.g. 100, probably more */ char *cv_copyright; /* pointer to copyright notice */ char *cv_name; /* "CAP" */ char *cv_type; /* "UDP", "EtherTalk", etc. */ char *cv_rmonth; /* release month */ char *cv_ryear; /* release year */ }; /* routine declarations (only if not OSErr or int) */ unsigned char *GetMyZone(); struct cap_version *what_cap_version(); #define CAP_6_DBM 1 /* new atalk.local management */ /* logging flags */ #define L_UERR 0x20 /* want unix error message */ #define L_EXIT 0x10 /* exit after logging */ #define L_LVL 0xf /* debug levels */ #define L_LVLMAX 15 /* maximum level */