summaryrefslogtreecommitdiffstats
path: root/private/ntos/ndis/pcimac/frame.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/ntos/ndis/pcimac/frame.h196
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);
+