diff options
Diffstat (limited to '')
-rw-r--r-- | private/ntos/ndis/pcimac/frame.h | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/private/ntos/ndis/pcimac/frame.h b/private/ntos/ndis/pcimac/frame.h new file mode 100644 index 000000000..44c5cd04b --- /dev/null +++ b/private/ntos/ndis/pcimac/frame.h @@ -0,0 +1,196 @@ +// +// to build a version that does not support compression, commen out +// this define. +// +#define COMPRESSION 1 + +// when we pick up a frame, the coherency layer tells us +// about the frame... +// !!!!! NOTE: This is NOT an enumeration !!!!!! +// Look carefully at the code before you change these values. +#define FRAME_NOT_COMPRESSED 0 +#define FRAME_IS_FLUSH_FRAME 1 +#define FRAME_NEEDS_DECOMPRESSION 2 +#define FRAME_NEEDS_DECOMPRESSION_FLUSHING 3 + +// +// Set LSB if SW compression is ON +// +#define COMPRESSION_V1 1 + +typedef UCHAR FRAME_TYPE; +typedef UCHAR FRAME_TICKET; + +// +// ISDN pads to 60, so we need 60-14 worth of data +// before it is worth it to compress it! probably even more than that! +// +#define MINIMUM_COMPRESSED_PACKET_SIZE (60-14) + +#define COMPRESSED_HAS_REFERENCES 1 +#define COMPRESSED_NO_REFERENCES 2 +#define UNCOMPRESSED 3 +#define COMPRESSED 4 // generic compressed + +// BUG BUG should probably read this value from coherency code. +// we give one byte to coherency +#define COHERENCY_LENGTH 1 + +typedef ULONG FRAME_ID; + +// !!!! NOTE !!!! +// TransmittedUncompressed are the number of bytes that the compressor +// saw BEFORE attempting to compress the data (top end) +// TransmitCompressed is the bottom end of the compressor which +// is equal to the amount of bytes the compressor spat out (after compression) +// This only counts bytes that went THROUGH the compression mechanism +// Small frames and multi-cast frames (typically) do not get compressed. +typedef struct COMPRESSION_STATS COMPRESSION_STATS, *PCOMPRESSION_STATS; +struct COMPRESSION_STATS { + ULONG BytesTransmittedUncompressed; // Compression info only + ULONG BytesReceivedUncompressed; // Compression info only + ULONG BytesTransmittedCompressed; // Compression info only + ULONG BytesReceivedCompressed; // Compression info only +}; + +typedef struct ASYNC_CONNECTION ASYNC_CONNECTION, *PASYNC_CONNECTION; +typedef struct ASYNC_FRAME ASYNC_FRAME, *PASYNC_FRAME; + +typedef +VOID +(*PCOHERENT_DONE_FUNC) ( + IN PASYNC_CONNECTION pAsyncConnection, + IN PASYNC_FRAME pAsyncFrame); + + +struct ASYNC_CONNECTION { + // For me.. + PVOID pAsyncInfo; // Back ptr. + + // For compression + ULONG CompressionLength; // Length of Compression struct + PVOID CompressionContext; // Ptr to the Compression struct + + COMPRESSION_STATS CompressionStats; + + // For coherency + ULONG CoherencyLength; // Length of coherency struct + PVOID CoherencyContext; // Ptr to coherency struct + + NDIS_SPIN_LOCK CompMutex; // Non-paged pool mutex + + // These two values hold the size requested by the compression + // and coherent modules for their internal structures. + ULONG CompressStructSize; + ULONG CoherentStructSize; + + +}; + +struct ASYNC_FRAME { +//--------------------------------------------------------------------------- + // !!!!!!!! NOTE !!!!!!!! + // The FrameListEntry field must be first to + // dequeue things up properly so don't put anything + // in front of it or suffer severe crashes. + LIST_ENTRY FrameListEntry; // Used to queue up frames from + // the soon to be famous frame pool + // this frame's ID + FRAME_ID FrameID; + + // For Dougie + // Should Decompressed Frame can be non-paged?? + // i.e. Should I queue a worker thred to decompress?? + UINT DecompressedFrameLength;// Length of decompressed frame + PUCHAR DecompressedFrame; // Ptr to the decompressed 'frame' + // valid only after decompression + + // NOTE: If the frame is not compressed, the compressed fields + // are still valid when passed to Dave. + UINT CompressedFrameLength; // Length of compressed frame + PUCHAR CompressedFrame; // Ptr to the compressed 'frame' + // valid only after compression + // or just before decompression + + PNDIS_PACKET CompressionPacket; // Valid just before compression + // this is the packet passed down. + // Use NdisQueryPacket. + + PASYNC_CONNECTION Connection; // back ptr to connection struct + + // For Coherency + PUCHAR CoherencyFrame; // Ptr to coherency frame + PCOHERENT_DONE_FUNC CoherentDone; // function ptr to call when done + // sending frame + +}; + +// APIs to Compressor +VOID +CoherentDeliverFrame( + PASYNC_CONNECTION pConnection, + PASYNC_FRAME pFrame, + FRAME_TYPE FrameType); + +VOID +CoherentGetPipeline( + PASYNC_CONNECTION pConnection, + PULONG plUnsent); + + +// APIs to Transport/Network layer +VOID +CoherentSendFrame( + PASYNC_CONNECTION pConnection, + PASYNC_FRAME pFrame, + FRAME_TYPE FrameType); + + +ULONG +CoherentSizeOfStruct( ); + +VOID +CoherentInitStruct( + PVOID pCoherentStruct); + +// upcalls API's from Transport/Network layer +VOID +CoherentReceiveFrame( + PASYNC_CONNECTION pConnection, + PASYNC_FRAME pFrame); + +VOID +CoherentDeliverFrameDone( + PASYNC_CONNECTION pConnection, + PASYNC_FRAME pFrame); + + + +ULONG +CompressSizeOfStruct( + IN ULONG SendMode, // Compression + IN ULONG RecvMode, // Decompression + IN ULONG lfsz, // Largest frame size + OUT PULONG lcfsz); // Size of compression into buffer + +VOID +CompressInitStruct( + ULONG SendMode, // Compression + ULONG RecvMode, // Decompression + PUCHAR memptr, + PNDIS_SPIN_LOCK pMutex); // Must be in non-paged pool + +VOID +CompressFlush( + PASYNC_CONNECTION pAsyncConnection); + +VOID +CompressFrame( + PASYNC_FRAME pAsyncFrame); + +VOID +DecompressFrame( + PASYNC_CONNECTION pAsyncConnection, + PASYNC_FRAME pAsyncFrame, + BOOLEAN FlushBuffer); + |