mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
5.3 KiB
196 lines
5.3 KiB
//
|
|
// 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);
|
|
|