|
|
/////////////////////////////////////////////////////////////////////////////
//
//
// Copyright (c) 1996, 1997 Microsoft Corporation
//
//
// Module Name:
// recv.h
//
// Abstract:
//
//
// Author:
//
// P Porzuczek
//
// Environment:
//
// Revision History:
//
//
//////////////////////////////////////////////////////////////////////////////
#ifndef _RECV_H_
#define _RECV_H_
///////////////////////////////////////////////////////////////////////////////////////
//
// some character values
//
#define FRAME_ESCAPE 0xDB
#define FRAME_END 0xC0
#define TRANS_FRAME_END 0xDC
#define TRANS_FRAME_ESCAPE 0xDD
#define PROTO_ID 0x00
#define PROTO_ID_OLD 0x03
#define NORMAL_COMPRESSED_HEADER 4
#define IP_ID_SIZE 2
#define UDP_CHKSUM_SIZE 2
#define PACKET_COMPRESSED(x) (x & 0x80)
#define IP_STREAM_INDEX(x) (x & 0x7f)
#define NABTSIP_MAX_PACKET 1514
#define NABTSIP_MAX_LOOKAHEAD (NABTSIP_MAX_PACKET - ETHERNET_HEADER_SIZE)
#define NABTSIP_MAX_PAYLOAD (NABTSIP_MAX_LOOKAHEAD + MPEG_CRC_SIZE)
#define MPEG_CRC_SIZE 4
#define ETHERNET_HEADER_SIZE 14
#define ETHERNET_LENGTH_OF_ADDRESS 6
///////////////////////////////////////////////////////////////////////////////////////
//
//
//
//
// Size of the ethernet address
//
typedef struct _Header802_3 { UCHAR DestAddress[ETHERNET_LENGTH_OF_ADDRESS]; UCHAR SourceAddress[ETHERNET_LENGTH_OF_ADDRESS]; UCHAR Type[2]; } Header802_3, * PHeader802_3;
///////////////////////////////////////////////////////////////////////////////////////
//
//
//
#define htons(x) ((((x) >> 8) & 0x00FF) | (((x) << 8) & 0xFF00))
///////////////////////////////////////////////////////////////////////////////////////
//
//
//
#define NabtsNtoHl(l) \
( ( ((l) >> 24) & 0x000000FFL ) | \ ( ((l) >> 8) & 0x0000FF00L ) | \ ( ((l) << 8) & 0x00FF0000L ) | \ ( ((l) << 24) & 0xFF000000L ) )
///////////////////////////////////////////////////////////////////////////////////////
//
//
//
#define NabtsNtoHs(s) \
( ( ((s) >> 8) & 0x00FF ) | \ ( ((s) << 8) & 0xFF00 ) )
///////////////////////////////////////////////////////////////////////////////////////
//
// IP Compression States.
//
typedef enum { NABTS_CS_UNCOMPRESSED = 0, NABTS_CS_COMPRESSED, NABTS_CS_CHKCRC };
///////////////////////////////////////////////////////////////////////////////////////
//
//
//
struct _C { UCHAR uc[4]; };
///////////////////////////////////////////////////////////////////////////////////////
//
//
//
struct _L { ULONG ul; };
///////////////////////////////////////////////////////////////////////////////////////
//
//
//
typedef union { struct _C c; struct _L l; }CL, *PCL;
///////////////////////////////////////////////////////////////////////////////////////
//
// NABTSIP Group Range
//
#define NABTSIP_GROUP_ID_RANGE_LOW 0
#define NABTSIP_GROUP_ID_RANGE_HI 4096
///////////////////////////////////////////////////////////////////////////////////////
//
//
//
//#define NAB_STREAM_LIFE (LONGLONG)1000 * 1000 * 10 * 60 * 30 // 30 Minutes
#define NAB_STREAM_LIFE (LONGLONG)1000 * 1000 * 10 * 60 * 10 // 10 Minutes
#define NAB_STATUS_INTERVAL (LONGLONG)1000 * 1000 * 10 * 60 * 1 // 1 Minutes
#define NAB_STREAM_SIGNATURE ((CSHORT)0xab05)
///////////////////////////////////////////////////////////////////////////////////////
//
// Frame states.
//
typedef enum { NABTS_FS_SYNC, NABTS_FS_SYNC_PROTO, NABTS_FS_COMPRESSION, NABTS_FS_COLLECT, NABTS_FS_COLLECT_ESCAPE };
///////////////////////////////////////////////////////////////////////////////////////
//
// Frame states.
//
typedef struct _AddrIP { UCHAR ucHighMSB; UCHAR ucHighLSB; UCHAR ucLowMSB; UCHAR ucLowLSB; } AddrIP, * PAddrIP;
///////////////////////////////////////////////////////////////////////////////////////
//
// IP Header
//
typedef struct _HeaderIP { UCHAR ucVersHlen; UCHAR ucServiceType; UCHAR ucTotalLenHigh; UCHAR ucTotalLenLow; UCHAR ucIDHigh; UCHAR ucIDLow; UCHAR ucFlags; UCHAR ucOffsetLow; UCHAR ucTimeToLive; UCHAR ucProtocol; UCHAR ucChecksumHigh; UCHAR ucChecksumLow; AddrIP ipaddrSrc; AddrIP ipaddrDst; } HeaderIP, * PHeaderIP;
///////////////////////////////////////////////////////////////////////////////////////
//
//
//
typedef struct _HeaderUDP { UCHAR ucSourcePortMSB; UCHAR ucSourcePortLSB; UCHAR ucDestPortMSB; UCHAR ucDestPortLSB; UCHAR ucMsgLenHigh; UCHAR ucMsgLenLow; UCHAR ucChecksumHigh; UCHAR ucChecksumLow; } HeaderUDP, *PHeaderUDP;
///////////////////////////////////////////////////////////////////////////////////////
//
//
//
typedef struct _IP_CACHE { HeaderIP ipHeader; HeaderUDP udpHeader; LARGE_INTEGER liLastUsed; } NAB_HEADER_CACHE, *PNAB_HEADER_CACHE;
//
// IP Compression State Struct.
//
typedef struct _NAB_IP_COMPRESSION { ULONG usCompressionState; USHORT uscbRequiredSize; USHORT uscbHeaderOffset; USHORT usrgCompressedHeader[3]; LARGE_INTEGER liLastUsed; }NAB_COMPRESSION_STATE, *PNAB_COMPRESSION_STATE;
///////////////////////////////////////////////////////////////////////////////////////
//
// NabtsIp Stream Context.
//
#define MAX_IP_STREAMS 128
#define MAX_STREAM_PAYLOAD 1600
typedef struct _NAB_STREAM { ULONG ulType; ULONG ulSize; ULONG ulProtoID; BOOLEAN fUsed; ULONG groupID; PUCHAR pszBuffer; ULONG ulcbSize; ULONG ulOffset; ULONG ulFrameState; LIST_ENTRY Linkage; ULONG ulIPStreamIndex; PHW_STREAM_REQUEST_BLOCK pSrb; NAB_COMPRESSION_STATE NabCState[MAX_IP_STREAMS]; NAB_HEADER_CACHE NabHeader[MAX_IP_STREAMS]; ULONG ulMpegCrc; ULONG ulCrcBytesIndex; ULONG ulLastCrcBytes; LARGE_INTEGER liLastTimeUsed; CHAR rgBuf[MAX_STREAM_PAYLOAD]; } NAB_STREAM, *PNAB_STREAM;
///////////////////////////////////////////////////////////////////////////////////////
//
//
// Prototypes
//
//
VOID vCheckNabStreamLife ( PSLIP_FILTER pFilter );
NTSTATUS ntCreateNabStreamContext( PSLIP_FILTER pFilter, ULONG groupID, PNAB_STREAM *ppNabStream );
NTSTATUS ntGetNdisPacketForStream ( PSLIP_FILTER pFilter, PNAB_STREAM pNabStream );
VOID vDestroyNabStreamContext( PSLIP_FILTER pUser, PNAB_STREAM pNabStream, BOOLEAN fRemoveFromList );
NTSTATUS ntAllocateNabStreamContext( PNAB_STREAM *ppNabStream );
NTSTATUS ntNabtsRecv( PSLIP_FILTER pFilter, PNABTSFEC_BUFFER pNabData );
VOID CancelNabStreamSrb ( PSLIP_FILTER pFilter, PHW_STREAM_REQUEST_BLOCK pSrb );
VOID DeleteNabStreamQueue ( PSLIP_FILTER pFilter );
VOID MpegCrcUpdate ( ULONG * crc, UINT uiCount, UCHAR * pText );
#endif
|