<> <> <> DIRECTORY CommBuffer USING [Encapsulation, Overhead], IP USING [Address], NS USING [Host, Net], Process USING [Priority, priorityClient1, priorityClient3], Pup USING [Host, Net]; Driver: CEDAR DEFINITIONS = { BYTE: TYPE = [0..100H); Encapsulation: TYPE = CommBuffer.Encapsulation; Type: TYPE = {none, ethernet, ethernetOne, phone, imp, spare, spare1, spare2}; SendProc: TYPE = PROC [network: Network, buffer: Buffer, bytes: NAT]; RecvProc: TYPE = PROC [network: Network, buffer: Buffer, bytes: NAT] RETURNS [Buffer]; Network: TYPE = REF NetworkObject; NetworkObject: TYPE = RECORD [ next: Network, ip: RECORD [ host: IP.Address, getEncapsulation: PROC [Network, IP.Address] RETURNS [Encapsulation], send: SendProc, return: SendProc, recv: RecvProc, sendTranslate: SendProc, recvTranslate: RecvProc, translation: REF ANY ], ns: RECORD [ net: NS.Net, getEncapsulation: PROC [Network, NS.Host] RETURNS [Encapsulation], send: SendProc, return: SendProc, recv: RecvProc, sendTranslate: SendProc, recvTranslate: RecvProc, translation: REF ANY ], pup: RECORD [ net: Pup.Net, host: Pup.Host, getEncapsulation: PROC [Network, Pup.Host] RETURNS [Encapsulation], send: SendProc, return: SendProc, recv: RecvProc, sendTranslate: SendProc, recvTranslate: RecvProc, translation: REF ANY ], other: RECORD [ netHostOther: REF ANY, getEncapsulation: PROC [Network, REF ANY] RETURNS [Encapsulation], send: SendProc, return: SendProc, recv: RecvProc, sendTranslate: SendProc, recvTranslate: RecvProc, translation: REF ANY ], raw: RECORD [ send: SendProc ], error: RECORD [ recv: PROC [network: Network, buffer: Buffer, bytes: NAT] RETURNS [Buffer] ], setPromiscuous: PROC [network: Network, promiscuous: BOOL], isThisForMe: PROC [network: Network, buffer: Buffer] RETURNS [yes: BOOL], toBroadcast: PROC [network: Network, buffer: Buffer] RETURNS [yes: BOOL], moreBuffers: PROC [network: Network, total: NAT], interceptor: Interceptor, stats: REF ANY, instanceData: REF ANY, type: Type, speed: INT, -- Bits per second index: CARDINAL, -- first is 1 (for forwarder) hearSelf: BOOL, recvSick: BOOL, sendSick: BOOL, dead: BOOL ]; <> GetNetworkChain: PROC RETURNS [Network]; GetNumberOfNetworks: PROC RETURNS [CARDINAL]; AddNetwork: PROC [Network]; NoThankYou: PROC [Network, Buffer, NAT] RETURNS [Buffer]; <> SendType: TYPE = { ip, ipReturn, ipTranslate, ns, nsReturn, nsTranslate, pup, pupReturn, pupTranslate, other, otherReturn, otherTranslate, raw }; RecvType: TYPE = { ip, ipTranslate, ns, nsTranslate, pup, pupTranslate, other, otherTranslate, error }; InsertReceiveProc: PROC [network: Network, type: RecvType, proc: RecvProc]; < whole chain and future additions>> <> AllocBuffer: PROC RETURNS [Buffer]; FreeBuffer: PROC [Buffer]; <> <<>> dataBytesInBuffer: NAT = 1500; <> bytesInDriverTail: NAT = 10; bytesToRead: NAT = dataBytesInBuffer+bytesInDriverTail; <> wordsInIocb: NAT = 12; <<>> Buffer: TYPE = REF BufferObject; <> BufferObject: TYPE = MACHINE DEPENDENT RECORD [ ovh: CommBuffer.Overhead, data: PACKED ARRAY [0..dataBytesInBuffer) OF BYTE, driverTail: PACKED ARRAY [0..bytesInDriverTail) OF BYTE ]; <> recvPriority: Process.Priority = Process.priorityClient3; sendPriority: Process.Priority = Process.priorityClient3; <> watcherPriority: Process.Priority = Process.priorityClient1; -- normal <> Interceptor: TYPE = REF InterceptorRep; InterceptorRep: TYPE; SendInterceptor: TYPE = PROC [ send: SendType, data: REF ANY, network: Network, buffer: Buffer, bytes: NAT] RETURNS [kill: BOOL _ FALSE]; RecvInterceptor: TYPE = PROC [ recv: RecvType, data: REF ANY, network: Network, buffer: Buffer, bytes: NAT] RETURNS [kill: BOOL _ FALSE]; CreateInterceptor: PROC [ network: Network, sendMask: PACKED ARRAY SendType OF BOOL, sendProc: SendInterceptor, recvMask: PACKED ARRAY RecvType OF BOOL, recvProc: RecvInterceptor, data: REF ANY, promiscuous: BOOL] RETURNS [Interceptor]; <> <> DestroyInterceptor: PROC [Interceptor]; <> }.