summaryrefslogblamecommitdiffstats
path: root/private/ntos/ndis/digi/pcimac/frame.h
blob: 44c5cd04baf679be872207e79849a103fd7226d3 (plain) (tree)



































































































































































































                                                                                                                           
//
// 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);