754 lines
32 KiB
C
754 lines
32 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1994 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
wanioctl.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This is the main file for the NdisWan Driver for the Remote Access
|
||
|
Service. This driver conforms to the NDIS 3.0 interface.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Thomas J. Dimitri (TommyD) 08-May-1992
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Kernel Mode - Or whatever is the equivalent on OS/2 and DOS.
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
--*/
|
||
|
|
||
|
// All AsyncMac errors start with this base number
|
||
|
#define ASYBASE 700
|
||
|
|
||
|
// The Mac has not bound to an upper protocol, or the
|
||
|
// previous binding to AsyncMac has been destroyed.
|
||
|
#define ASYNC_ERROR_NO_ADAPTER ASYBASE+0
|
||
|
|
||
|
// A port was attempted to be open that was not CLOSED yet.
|
||
|
#define ASYNC_ERROR_ALREADY_OPEN ASYBASE+1
|
||
|
|
||
|
// All the ports (allocated) are used up or there is
|
||
|
// no binding to the AsyncMac at all (and thus no ports).
|
||
|
// The number of ports allocated comes from the registry.
|
||
|
#define ASYNC_ERROR_NO_PORT_AVAILABLE ASYBASE+2
|
||
|
|
||
|
// In the open IOCtl to the AsyncParameter the Adapter
|
||
|
// parameter passed was invalid.
|
||
|
#define ASYNC_ERROR_BAD_ADAPTER_PARAM ASYBASE+3
|
||
|
|
||
|
// During a close or compress request, the port
|
||
|
// specified did not exist.
|
||
|
#define ASYNC_ERROR_PORT_NOT_FOUND ASYBASE+4
|
||
|
|
||
|
// A request came in for the port which could not
|
||
|
// be handled because the port was in a bad state.
|
||
|
// i.e. you can't a close a port if its state is OPENING
|
||
|
#define ASYNC_ERROR_PORT_BAD_STATE ASYBASE+5
|
||
|
|
||
|
// A call to ASYMAC_COMPRESS was bad with bad
|
||
|
// parameters. That is, parameters that were not
|
||
|
// supported. The fields will not be set to the bad params.
|
||
|
#define ASYNC_ERROR_BAD_COMPRESSION_INFO ASYBASE+6
|
||
|
|
||
|
//-------------- NDISWAN SPECIFIC RETURN CODES --------------------
|
||
|
|
||
|
// A request for information came in for an endpoint handle
|
||
|
// which does not exist (out of range)
|
||
|
#define NDISWAN_ERROR_BAD_ENDPOINT ASYBASE+40
|
||
|
|
||
|
// A request for information came in for a protocol handle
|
||
|
// which does not exist (out of range)
|
||
|
#define NDISWAN_ERROR_BAD_PROTOCOL ASYBASE+41
|
||
|
|
||
|
// A request for a route which already existed came in
|
||
|
#define NDISWAN_ERROR_ALREADY_ROUTED ASYBASE+42
|
||
|
|
||
|
// A request for a route exceeded the routing tables capabilities
|
||
|
#define NDISWAN_ERROR_TOO_MANY_ROUTES ASYBASE+43
|
||
|
|
||
|
// Send packet has wrong packet size
|
||
|
#define NDISWAN_ERROR_BAD_PACKET_SIZE ASYBASE+44
|
||
|
|
||
|
// BindAddress has an address already used as an endpoint (duplicate address)
|
||
|
#define NDISWAN_ERROR_BAD_ADDRESS ASYBASE+45
|
||
|
|
||
|
// Endpoint has an address already bound to it
|
||
|
#define NDISWAN_ERROR_ALREADY_BOUND ASYBASE+46
|
||
|
|
||
|
// Endpoint was routed without being bound to a remote address
|
||
|
#define NDISWAN_ERROR_NOT_BOUND_YET ASYBASE+47
|
||
|
|
||
|
// Here we define the DevIOCtl code for the ndiswan
|
||
|
//
|
||
|
// IOCTLs for user-mode requests.
|
||
|
//
|
||
|
|
||
|
// Token-ring and Ethernet address lengths
|
||
|
#define IEEE_ADDRESS_LENGTH 6
|
||
|
|
||
|
// The max packet size information should be picked in a call!!!
|
||
|
// Maximum size of packet that can be sent/rcvd via NDISWAN_SENDPKT/RECVPKT
|
||
|
#define PACKET_SIZE 1500
|
||
|
|
||
|
// Two 6 byte addreses plus the type/length field (used in RECVPKT)
|
||
|
// Native addressing schemes may have a different header size!!!
|
||
|
#define HEADER_SIZE 14
|
||
|
|
||
|
// When unrouting an endpoint (hNdisHandle) specify the PROTOCOL_UNROUTE
|
||
|
#define PROTOCOL_UNROUTE 0xFFFF
|
||
|
|
||
|
|
||
|
// we need to get this device defined in sdk\inc\devioctl.h
|
||
|
// for now, I will use 30, since no one is using it yet!
|
||
|
// Beware that the NDIS Wrapper uses IOCTLs based on
|
||
|
// FILE_DEVICE_PHYSICAL_NETCARD
|
||
|
//#define FILE_DEVICE_NDIS 0x30
|
||
|
|
||
|
// below is the standard method for defining IOCTLs for your
|
||
|
// device given that your device is unique.
|
||
|
|
||
|
// we need to get this device defined in sdk\inc\devioctl.h
|
||
|
// for now, I will use 30, since no one is using it yet!
|
||
|
// Beware that the NDIS Wrapper uses IOCTLs based on
|
||
|
// FILE_DEVICE_PHYSICAL_NETCARD
|
||
|
#define FILE_DEVICE_RAS 0x30
|
||
|
|
||
|
// below is the standard method for defining IOCTLs for your
|
||
|
// device given that your device is unique.
|
||
|
#define _RAS_CONTROL_CODE(request,method) \
|
||
|
((FILE_DEVICE_RAS)<<16 | (request<<2) | method)
|
||
|
|
||
|
#define IOCTL_ASYMAC_OPEN _RAS_CONTROL_CODE(10, METHOD_BUFFERED )
|
||
|
#define IOCTL_ASYMAC_CLOSE _RAS_CONTROL_CODE(11, METHOD_BUFFERED )
|
||
|
//#define IOCTL_ASYMAC_COMPRESS _RAS_CONTROL_CODE(12, METHOD_BUFFERED )
|
||
|
//#define IOCTL_ASYMAC_ENUM _RAS_CONTROL_CODE(13, METHOD_BUFFERED )
|
||
|
//#define IOCTL_ASYMAC_GETSTATS _RAS_CONTROL_CODE(14, METHOD_BUFFERED )
|
||
|
#define IOCTL_ASYMAC_TRACE _RAS_CONTROL_CODE(15, METHOD_BUFFERED )
|
||
|
|
||
|
#define IOCTL_NDISWAN_ENUM _RAS_CONTROL_CODE(6, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_ROUTE _RAS_CONTROL_CODE(7, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_GETSTATS _RAS_CONTROL_CODE(8, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_PROTENUM _RAS_CONTROL_CODE(9, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_SENDPKT _RAS_CONTROL_CODE(10, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_RECVPKT _RAS_CONTROL_CODE(11, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_FLUSH _RAS_CONTROL_CODE(12, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_TRACE _RAS_CONTROL_CODE(13, METHOD_BUFFERED )
|
||
|
|
||
|
#define IOCTL_NDISWAN_INFO _RAS_CONTROL_CODE(24, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_SET_LINK_INFO _RAS_CONTROL_CODE(25, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_GET_LINK_INFO _RAS_CONTROL_CODE(26, METHOD_BUFFERED )
|
||
|
|
||
|
#define IOCTL_NDISWAN_SET_BRIDGE_INFO _RAS_CONTROL_CODE(27, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_GET_BRIDGE_INFO _RAS_CONTROL_CODE(28, METHOD_BUFFERED )
|
||
|
|
||
|
#define IOCTL_NDISWAN_SET_COMP_INFO _RAS_CONTROL_CODE(29, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_GET_COMP_INFO _RAS_CONTROL_CODE(30, METHOD_BUFFERED )
|
||
|
|
||
|
#define IOCTL_NDISWAN_SET_VJ_INFO _RAS_CONTROL_CODE(31, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_GET_VJ_INFO _RAS_CONTROL_CODE(32, METHOD_BUFFERED )
|
||
|
|
||
|
#define IOCTL_NDISWAN_SET_CIPX_INFO _RAS_CONTROL_CODE(33, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_GET_CIPX_INFO _RAS_CONTROL_CODE(34, METHOD_BUFFERED )
|
||
|
|
||
|
#define IOCTL_NDISWAN_SET_MULTILINK_INFO _RAS_CONTROL_CODE(35, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_GET_MULTILINK_INFO _RAS_CONTROL_CODE(36, METHOD_BUFFERED )
|
||
|
|
||
|
|
||
|
#define IOCTL_ASYMAC_DCDCHANGE _RAS_CONTROL_CODE(40, METHOD_BUFFERED )
|
||
|
//#define IOCTL_ASYMAC_STARTFRAMING _RAS_CONTROL_CODE(41, METHOD_BUFFERED )
|
||
|
#define IOCTL_NDISWAN_LINEUP _RAS_CONTROL_CODE(42, METHOD_BUFFERED )
|
||
|
|
||
|
|
||
|
#define IOCTL_NDISWAN_ENUM_ACTIVE_BUNDLES _RAS_CONTROL_CODE(45, METHOD_BUFFERED )
|
||
|
|
||
|
// Currently a global array of pointers is used
|
||
|
// which must be predefined to some constant.
|
||
|
// The current restriction seems to be 256
|
||
|
#define MAX_ENDPOINTS 256
|
||
|
#define MAX_PROTOCOL_BINDINGS 256
|
||
|
#define MAX_MAC_BINDINGS 48
|
||
|
#define MAC_NAME_SIZE 32
|
||
|
|
||
|
|
||
|
// Here we define the WanEnumBuffer structure
|
||
|
//------------------------------------------------------------------------
|
||
|
//------------------------------- ENDPOINTS ------------------------------
|
||
|
//------------------------------------------------------------------------
|
||
|
|
||
|
// We assume that the most number of protocols a client will run
|
||
|
// is three for now... that is a client can run TCP/IP, IPX, NBF at
|
||
|
// the same time, but not a fourth protocol.
|
||
|
#define MAX_ROUTES_PER_ENDPOINT 3
|
||
|
|
||
|
// The bytes transmitted, bytes received, frames received, frame transmitted
|
||
|
// are monitored for frame and bytes going to the output device or
|
||
|
// coming from the output device. If software compression used, it
|
||
|
// is on top of this layer.
|
||
|
typedef struct GENERIC_STATS GENERIC_STATS, *PGENERIC_STATS;
|
||
|
struct GENERIC_STATS {
|
||
|
ULONG BytesTransmitted; // Generic info
|
||
|
ULONG BytesReceived; // Generic info
|
||
|
ULONG FramesTransmitted; // Generic info
|
||
|
ULONG FramesReceived; // Generic info
|
||
|
};
|
||
|
|
||
|
// o CRC errors are when the 16bit V.41 CRC check fails
|
||
|
// o TimeoutErrors occur when inter-character delays within
|
||
|
// a frame are exceeded
|
||
|
// o AlignmentErrors occur when the SYN byte or ETX bytes which
|
||
|
// mark the beginning and end of frames are not found.
|
||
|
// o The other errors are standard UART errors returned by the serial driver
|
||
|
typedef struct SERIAL_STATS SERIAL_STATS, *PSERIAL_STATS;
|
||
|
struct SERIAL_STATS {
|
||
|
ULONG CRCErrors; // Serial-like info only
|
||
|
ULONG TimeoutErrors; // Serial-like info only
|
||
|
ULONG AlignmentErrors; // Serial-like info only
|
||
|
ULONG SerialOverrunErrors; // Serial-like info only
|
||
|
ULONG FramingErrors; // Serial-like info only
|
||
|
ULONG BufferOverrunErrors; // Serial-like info only
|
||
|
};
|
||
|
|
||
|
typedef struct WAN_STATS WAN_STATS, *PWAN_STATS;
|
||
|
struct WAN_STATS {
|
||
|
ULONG BytesSent;
|
||
|
ULONG BytesRcvd;
|
||
|
ULONG FramesSent;
|
||
|
ULONG FramesRcvd;
|
||
|
|
||
|
ULONG CRCErrors; // Serial-like info only
|
||
|
ULONG TimeoutErrors; // Serial-like info only
|
||
|
ULONG AlignmentErrors; // Serial-like info only
|
||
|
ULONG SerialOverrunErrors; // Serial-like info only
|
||
|
ULONG FramingErrors; // Serial-like info only
|
||
|
ULONG BufferOverrunErrors; // Serial-like info only
|
||
|
|
||
|
ULONG BytesTransmittedUncompressed; // Compression info only
|
||
|
ULONG BytesReceivedUncompressed; // Compression info only
|
||
|
ULONG BytesTransmittedCompressed; // Compression info only
|
||
|
ULONG BytesReceivedCompressed; // Compression info only
|
||
|
|
||
|
|
||
|
};
|
||
|
|
||
|
typedef struct ROUTE_INFO ROUTE_INFO, *PROUTE_INFO;
|
||
|
struct ROUTE_INFO {
|
||
|
USHORT ProtocolType; // <1500 (NetBEUI), IP, IPX, AppleTalk
|
||
|
NDIS_HANDLE ProtocolRoutedTo; // Handle of protocol to send/recv frames
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// The structure passed up on a WAN_LINE_UP indication
|
||
|
//
|
||
|
|
||
|
typedef struct _ASYNC_LINE_UP {
|
||
|
ULONG LinkSpeed; // 100 bps units
|
||
|
ULONG MaximumTotalSize; // suggested max for send packets
|
||
|
NDIS_WAN_QUALITY Quality;
|
||
|
USHORT SendWindow; // suggested by the MAC
|
||
|
UCHAR RemoteAddress[6]; // check for in SRC field when rcv
|
||
|
UCHAR LocalAddress[6]; // use SRC field when sending
|
||
|
USHORT Endpoint; // can we get rid of this!!
|
||
|
USHORT ProtocolType; // protocol type
|
||
|
ULONG BufferLength; // length of protocol specific buffer
|
||
|
UCHAR Buffer[1]; // protocol specific buffer
|
||
|
|
||
|
|
||
|
} ASYNC_LINE_UP, *PASYNC_LINE_UP;
|
||
|
|
||
|
|
||
|
typedef struct _NDISMAC_LINE_UP {
|
||
|
IN ULONG LinkSpeed;
|
||
|
IN NDIS_WAN_QUALITY Quality;
|
||
|
IN USHORT SendWindow;
|
||
|
IN NDIS_HANDLE ConnectionWrapperID; // TAPI Cookie
|
||
|
IN NDIS_HANDLE NdisLinkHandle;
|
||
|
OUT NDIS_HANDLE NdisLinkContext;
|
||
|
} NDISMAC_LINE_UP, *PNDISMAC_LINE_UP;
|
||
|
|
||
|
|
||
|
typedef struct NDISWAN_INFO NDISWAN_INFO, *PNDISWAN_INFO;
|
||
|
struct NDISWAN_INFO {
|
||
|
ULONG MaxFrameSize;
|
||
|
ULONG MaxTransmit;
|
||
|
ULONG HeaderPadding;
|
||
|
ULONG TailPadding;
|
||
|
ULONG Endpoints;
|
||
|
UINT MemoryFlags;
|
||
|
NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;
|
||
|
ULONG FramingBits;
|
||
|
ULONG DesiredACCM;
|
||
|
ULONG MaxReconstructedFrameSize;
|
||
|
};
|
||
|
|
||
|
//------------------------------------------------------------------------
|
||
|
//----------------------------- PROTOCOL INFO ----------------------------
|
||
|
//------------------------------------------------------------------------
|
||
|
// There is a PROTOCOL_INFO struct per NDIS protocol binding to NdisWan.
|
||
|
// NOTE: Most protocols will bind multiple times to the NdisWan.
|
||
|
#define PROTOCOL_NBF 0x80D5
|
||
|
#define PROTOCOL_IP 0x0800
|
||
|
#define PROTOCOL_ARP 0x0806
|
||
|
#define PROTOCOL_IPX 0x8137
|
||
|
#define PROTOCOL_APPLETALK 0x80F3
|
||
|
#define PROTOCOL_XNS 0x0807
|
||
|
|
||
|
typedef struct PROTOCOL_INFO PROTOCOL_INFO, *PPROTOCOL_INFO;
|
||
|
struct PROTOCOL_INFO {
|
||
|
NDIS_HANDLE hProtocolHandle; // Order at which protocol bound to NdisWan
|
||
|
ULONG NumOfRoutes; // Num of routes this endpoint has
|
||
|
NDIS_MEDIUM MediumType; // NdisMedium802_5, NdisMediumAsync
|
||
|
USHORT ProtocolType; // EtherType of NBF, IP, IPX, AppleTalk..
|
||
|
USHORT AdapterNameLength; // Up to 16...
|
||
|
WCHAR AdapterName[MAC_NAME_SIZE];
|
||
|
// First 16 chars of MAC name
|
||
|
// like "NdisWan01"
|
||
|
// Used to figure out LANA..
|
||
|
|
||
|
NDIS_HANDLE MacBindingHandle;
|
||
|
NDIS_HANDLE MacAdapterContext; // needed by NdisMan or me?
|
||
|
NDIS_HANDLE NdisBindingContext; // needed by NdisMan or me?
|
||
|
};
|
||
|
|
||
|
typedef struct PROTOCOL_ENUM_BUFFER PROTOCOL_ENUM_BUFFER, *PPROTOCOL_ENUM_BUFFER;
|
||
|
struct PROTOCOL_ENUM_BUFFER {
|
||
|
ULONG NumOfProtocols; // One for each NDIS Upper Binding
|
||
|
// Not for each DIFFERENT Protocol
|
||
|
PROTOCOL_INFO ProtocolInfo[];
|
||
|
};
|
||
|
|
||
|
typedef struct _ENUM_ACTIVE_BUNDLES ENUM_ACTIVE_BUNDLES, *PENUM_ACTIVE_BUNDLES;
|
||
|
struct _ENUM_ACTIVE_BUNDLES {
|
||
|
|
||
|
ULONG NumberOfActiveBundles;
|
||
|
|
||
|
};
|
||
|
|
||
|
//------------------------------------------------------------------------
|
||
|
//------------------------ ASYMAC IOCTL STRUCTS --------------------------
|
||
|
//------------------------------------------------------------------------
|
||
|
|
||
|
// this structure is passed in as the input buffer when opening a port
|
||
|
typedef struct ASYMAC_OPEN ASYMAC_OPEN, *PASYMAC_OPEN;
|
||
|
struct ASYMAC_OPEN {
|
||
|
OUT NDIS_HANDLE hNdisEndpoint; // unique for each endpoint assigned
|
||
|
IN ULONG LinkSpeed; // RAW link speed in bits per sec
|
||
|
IN USHORT QualOfConnect; // NdisAsyncRaw, NdisAsyncErrorControl, ...
|
||
|
IN HANDLE FileHandle; // the Win32 or Nt File Handle
|
||
|
};
|
||
|
|
||
|
|
||
|
// this structure is passed in as the input buffer when closing a port
|
||
|
typedef struct ASYMAC_CLOSE ASYMAC_CLOSE, *PASYMAC_CLOSE;
|
||
|
struct ASYMAC_CLOSE {
|
||
|
NDIS_HANDLE hNdisEndpoint; // unique for each endpoint assigned
|
||
|
PVOID MacAdapter; // Which binding to AsyMac to use -- if set
|
||
|
// to NULL, will default to last binding
|
||
|
};
|
||
|
|
||
|
|
||
|
typedef struct ASYMAC_DCDCHANGE ASYMAC_DCDCHANGE, *PASYMAC_DCDCHANGE;
|
||
|
struct ASYMAC_DCDCHANGE {
|
||
|
NDIS_HANDLE hNdisEndpoint; // unique for each endpoint assigned
|
||
|
PVOID MacAdapter; // Which binding to AsyMac to use -- if set
|
||
|
// to NULL, will default to last binding
|
||
|
};
|
||
|
|
||
|
|
||
|
// this structure is used to read/set configurable 'feature' options
|
||
|
// during authentication this structure is passed and an
|
||
|
// agreement is made which features to support
|
||
|
typedef struct ASYMAC_FEATURES ASYMAC_FEATURES, *PASYMAC_FEATURES;
|
||
|
struct ASYMAC_FEATURES {
|
||
|
ULONG SendFeatureBits; // A bit field of compression/features sendable
|
||
|
ULONG RecvFeatureBits; // A bit field of compression/features receivable
|
||
|
ULONG MaxSendFrameSize; // Maximum frame size that can be sent
|
||
|
// must be less than or equal default
|
||
|
ULONG MaxRecvFrameSize; // Maximum frame size that can be rcvd
|
||
|
// must be less than or equal default
|
||
|
|
||
|
ULONG LinkSpeed; // New RAW link speed in bits/sec
|
||
|
// Ignored if 0
|
||
|
};
|
||
|
|
||
|
|
||
|
// 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
|
||
|
};
|
||
|
|
||
|
|
||
|
//------------------------------------------------------------------------
|
||
|
//------------------------ NDISWAN IOCTL STRUCTS --------------------------
|
||
|
//------------------------------------------------------------------------
|
||
|
|
||
|
// Define for PACKET_FLAGS
|
||
|
#define PACKET_IS_DIRECT 0x01
|
||
|
#define PACKET_IS_BROADCAST 0x02
|
||
|
#define PACKET_IS_MULTICAST 0x04
|
||
|
|
||
|
// Define for FLUSH_FLAGS
|
||
|
#define FLUSH_RECVPKT 0x01
|
||
|
#define FLUSH_SENDPKT 0x02
|
||
|
|
||
|
|
||
|
// The packet just contains data (no IEEE addresses or anything)
|
||
|
// Should it?? Get rid of PACKET_FLAGS??
|
||
|
typedef struct PACKET PACKET, *PPACKET;
|
||
|
struct PACKET {
|
||
|
UCHAR PacketData[1];
|
||
|
};
|
||
|
|
||
|
|
||
|
// When unrouting an endpoint (hNdisHandle) specify the PROTOCOL_UNROUTE
|
||
|
#define PROTOCOL_UNROUTE 0xFFFF
|
||
|
|
||
|
|
||
|
// This structure is passed in as the input buffer when routing
|
||
|
typedef struct NDISWAN_ROUTE NDISWAN_ROUTE, *PNDISWAN_ROUTE;
|
||
|
struct NDISWAN_ROUTE {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The NdisMan/NdisWan/AsyMac endpoint
|
||
|
NDIS_HANDLE hProtocolHandle; // The upper unique protocol (up to 3)
|
||
|
ASYNC_LINE_UP AsyncLineUp; // Include the protocol specific field
|
||
|
};
|
||
|
|
||
|
// This structure is passed in AND out as the input buffer AND
|
||
|
// the output buffer when receiving and sending a frame.
|
||
|
typedef struct NDISWAN_PKT NDISWAN_PKT, *PNDISWAN_PKT;
|
||
|
struct NDISWAN_PKT { // Event is singalled via IOCtl mechanisms
|
||
|
NDIS_HANDLE hNdisEndpoint; // The NdisMan/NdisWan/AsyMac endpoint
|
||
|
USHORT PacketFlags; // Broadcast, Multicast, Directed..
|
||
|
USHORT PacketSize; // Size of packet below (including the header)
|
||
|
USHORT HeaderSize; // Size of header inside packet
|
||
|
PACKET Packet; // Not a pointer -- entire packet struct
|
||
|
// We cannot use a PTR because it
|
||
|
// cannot be probed easily...
|
||
|
// Packet looks like - header data + sent data
|
||
|
// HeaderSize of 0 is valid for sends
|
||
|
};
|
||
|
|
||
|
typedef struct NDISWAN_FLUSH NDISWAN_FLUSH, *PNDISWAN_FLUSH;
|
||
|
struct NDISWAN_FLUSH { // Event is singalled via IOCtl mechanisms
|
||
|
NDIS_HANDLE hNdisEndpoint; // The NdisMan/NdisWan/AsyMac endpoint
|
||
|
USHORT FlushFlags; // Recv | Xmit flush (or both)
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
// This structure is passed in AND out as the input buffer AND
|
||
|
// the output buffer when get stats on an endpoint
|
||
|
typedef struct NDISWAN_GETSTATS NDISWAN_GETSTATS, *PNDISWAN_GETSTATS;
|
||
|
struct NDISWAN_GETSTATS {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The NdisMan/NdisWan/AsyMac endpoint
|
||
|
WAN_STATS WanStats; // Not a PTR. Entire statistics
|
||
|
// structure
|
||
|
};
|
||
|
|
||
|
|
||
|
typedef struct NDISWAN_SET_LINK_INFO NDISWAN_SET_LINK_INFO, *PNDISWAN_SET_LINK_INFO;
|
||
|
struct NDISWAN_SET_LINK_INFO {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The NdisMan/NdisWan endpoint
|
||
|
ULONG MaxSendFrameSize;
|
||
|
ULONG MaxRecvFrameSize;
|
||
|
ULONG HeaderPadding;
|
||
|
ULONG TailPadding;
|
||
|
ULONG SendFramingBits;
|
||
|
ULONG RecvFramingBits;
|
||
|
ULONG SendCompressionBits;
|
||
|
ULONG RecvCompressionBits;
|
||
|
ULONG SendACCM;
|
||
|
ULONG RecvACCM;
|
||
|
ULONG MaxRSendFrameSize;
|
||
|
ULONG MaxRRecvFrameSize;
|
||
|
};
|
||
|
|
||
|
typedef struct NDISWAN_GET_LINK_INFO NDISWAN_GET_LINK_INFO, *PNDISWAN_GET_LINK_INFO;
|
||
|
struct NDISWAN_GET_LINK_INFO {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The NdisMan/NdisWan endpoint
|
||
|
ULONG MaxSendFrameSize;
|
||
|
ULONG MaxRecvFrameSize;
|
||
|
ULONG HeaderPadding;
|
||
|
ULONG TailPadding;
|
||
|
ULONG SendFramingBits;
|
||
|
ULONG RecvFramingBits;
|
||
|
ULONG SendCompressionBits;
|
||
|
ULONG RecvCompressionBits;
|
||
|
ULONG SendACCM;
|
||
|
ULONG RecvACCM;
|
||
|
ULONG MaxRSendFrameSize;
|
||
|
ULONG MaxRRecvFrameSize;
|
||
|
};
|
||
|
|
||
|
|
||
|
typedef struct NDISWAN_SET_BRIDGE_INFO NDISWAN_SET_BRIDGE_INFO, *PNDISWAN_SET_BRIDGE_INFO;
|
||
|
struct NDISWAN_SET_BRIDGE_INFO {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The NdisMan/NdisWan endpoint
|
||
|
USHORT LanSegmentNumber;
|
||
|
UCHAR BridgeNumber;
|
||
|
UCHAR BridgingOptions;
|
||
|
ULONG BridgingCapabilities;
|
||
|
UCHAR BridgingType;
|
||
|
UCHAR MacBytes[6];
|
||
|
};
|
||
|
|
||
|
typedef struct NDISWAN_GET_BRIDGE_INFO NDISWAN_GET_BRIDGE_INFO, *PNDISWAN_GET_BRIDGE_INFO;
|
||
|
struct NDISWAN_GET_BRIDGE_INFO {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The NdisMan/NdisWan endpoint
|
||
|
USHORT LanSegmentNumber;
|
||
|
UCHAR BridgeNumber;
|
||
|
UCHAR BridgingOptions;
|
||
|
ULONG BridgingCapabilities;
|
||
|
UCHAR BridgingType;
|
||
|
UCHAR MacBytes[6];
|
||
|
};
|
||
|
|
||
|
|
||
|
//
|
||
|
// Define bit field for MSCompType
|
||
|
//
|
||
|
#define NDISWAN_COMPRESSION 0x00000001
|
||
|
#define NDISWAN_ENCRYPTION 0x00000010
|
||
|
|
||
|
#define NT31RAS_COMPRESSION 254
|
||
|
|
||
|
|
||
|
typedef struct COMPRESS_INFO COMPRESS_INFO, *PCOMPRESS_INFO;
|
||
|
struct COMPRESS_INFO {
|
||
|
UCHAR SessionKey[8]; // May be used for encryption, non-zero
|
||
|
// if supported.
|
||
|
ULONG MSCompType; // Bit field. 0=No compression.
|
||
|
|
||
|
//
|
||
|
// Info below is received from MAC
|
||
|
//
|
||
|
|
||
|
UCHAR CompType; // 0=OUI, 1-254 = Public, 255=Not supported
|
||
|
USHORT CompLength; // Length of CompValues.
|
||
|
union {
|
||
|
struct {
|
||
|
UCHAR CompOUI[3];
|
||
|
UCHAR CompSubType;
|
||
|
UCHAR CompValues[32];
|
||
|
} Proprietary;
|
||
|
|
||
|
struct {
|
||
|
UCHAR CompValues[32];
|
||
|
} Public;
|
||
|
|
||
|
};
|
||
|
};
|
||
|
|
||
|
typedef struct NDISWAN_SET_COMP_INFO NDISWAN_SET_COMP_INFO, *PNDISWAN_SET_COMP_INFO;
|
||
|
struct NDISWAN_SET_COMP_INFO {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The RasMan/NdisWan endpoint
|
||
|
COMPRESS_INFO SendCapabilities;
|
||
|
COMPRESS_INFO RecvCapabilities;
|
||
|
};
|
||
|
|
||
|
typedef struct NDISWAN_GET_COMP_INFO NDISWAN_GET_COMP_INFO, *PNDISWAN_GET_COMP_INFO;
|
||
|
struct NDISWAN_GET_COMP_INFO {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The RasMan/NdisWan endpoint
|
||
|
COMPRESS_INFO SendCapabilities;
|
||
|
COMPRESS_INFO RecvCapabilities;
|
||
|
};
|
||
|
|
||
|
typedef struct VJ_INFO VJ_INFO, *PVJ_INFO;
|
||
|
struct VJ_INFO {
|
||
|
USHORT IPCompressionProtocol; // 002d for VJ - 0000 indicates NONE!
|
||
|
UCHAR MaxSlotID; // How many slots to allocate
|
||
|
UCHAR CompSlotID; // 1 = Slot ID was negotiated
|
||
|
};
|
||
|
|
||
|
typedef struct NDISWAN_SET_VJ_INFO NDISWAN_SET_VJ_INFO, *PNDISWAN_SET_VJ_INFO;
|
||
|
struct NDISWAN_SET_VJ_INFO {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The RasMan/NdisWan endpoint
|
||
|
VJ_INFO SendCapabilities;
|
||
|
VJ_INFO RecvCapabilities;
|
||
|
};
|
||
|
|
||
|
typedef struct NDISWAN_GET_VJ_INFO NDISWAN_GET_VJ_INFO, *PNDISWAN_GET_VJ_INFO;
|
||
|
struct NDISWAN_GET_VJ_INFO {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The RasMan/NdisWan endpoint
|
||
|
VJ_INFO SendCapabilities;
|
||
|
VJ_INFO RecvCapabilities;
|
||
|
};
|
||
|
|
||
|
typedef struct CIPX_INFO CIPX_INFO, *PCIPX_INFO;
|
||
|
struct CIPX_INFO {
|
||
|
USHORT IPXCompressionProtocol; // Telebit/Shiva - 0000 indicates NONE!
|
||
|
};
|
||
|
|
||
|
typedef struct NDISWAN_SET_CIPX_INFO NDISWAN_SET_CIPX_INFO, *PNDISWAN_SET_CIPX_INFO;
|
||
|
struct NDISWAN_SET_CIPX_INFO {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The RasMan/NdisWan endpoint
|
||
|
CIPX_INFO SendCapabilities;
|
||
|
CIPX_INFO RecvCapabilities;
|
||
|
};
|
||
|
|
||
|
typedef struct NDISWAN_GET_CIPX_INFO NDISWAN_GET_CIPX_INFO, *PNDISWAN_GET_CIPX_INFO;
|
||
|
struct NDISWAN_GET_CIPX_INFO {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The RasMan/NdisWan endpoint
|
||
|
CIPX_INFO SendCapabilities;
|
||
|
CIPX_INFO RecvCapabilities;
|
||
|
};
|
||
|
|
||
|
|
||
|
typedef struct NDISWAN_SET_MULTILINK_INFO NDISWAN_SET_MULTILINK_INFO, *PNDISWAN_SET_MULTILINK_INFO;
|
||
|
struct NDISWAN_SET_MULTILINK_INFO {
|
||
|
NDIS_HANDLE hNdisEndpoint; // The RasMan/NdisWan endpoint
|
||
|
NDIS_HANDLE EndpointToBundle; // Endpoint to bundle it to.
|
||
|
};
|
||
|
|
||
|
typedef struct NDISWAN_GET_MULTILINK_INFO NDISWAN_GET_MULTILINK_INFO, *PNDISWAN_GET_MULTILINK_INFO;
|
||
|
struct NDISWAN_GET_MULTILINK_INFO{
|
||
|
NDIS_HANDLE hNdisEndpoint; // The RasMan/NdisWan endpoint
|
||
|
ULONG NumOfEndpoints; // How many endpoints are bundled to this
|
||
|
NDIS_HANDLE Endpoints[0]; // List of 0..n endpoints bundled
|
||
|
};
|
||
|
|
||
|
// A WAN_ENDPOINT is an interface to the WanHardware.
|
||
|
// There will be a collection of WAN_ENDPOINT for each NDIS_ENDPOINT
|
||
|
//
|
||
|
// !!!! NOTE !!!!
|
||
|
// LinkSpeed, QualityOfService, and RouteInfo are meaningless
|
||
|
// unless the route is active (i.e. NumberOfRoutes > 0)
|
||
|
//
|
||
|
// The WanEndpointLink has to be the first entry in the structure
|
||
|
typedef struct WAN_ENDPOINT WAN_ENDPOINT, *PWAN_ENDPOINT;
|
||
|
struct WAN_ENDPOINT {
|
||
|
LIST_ENTRY WanEndpointLink; // used to attach wanendpoints to an ndisendpoint
|
||
|
|
||
|
NDIS_SPIN_LOCK Lock; // lock for this wanendpoint
|
||
|
|
||
|
ULONG State; // state of the endpoint
|
||
|
|
||
|
ULONG NotInUse; // set to false when active with a line up
|
||
|
|
||
|
PVOID AllocatedMemory; // pointer to and size of memory allocated
|
||
|
ULONG MemoryLength; // for this endpoints packets and buffers
|
||
|
|
||
|
LIST_ENTRY DataDescPool; // Data descriptors for wan packets
|
||
|
ULONG DataDescCount; // Number of data descriptors in pool
|
||
|
|
||
|
LIST_ENTRY WanPacketPool; // WanPackets
|
||
|
ULONG WanPacketCount; // Number of WanPackets in pool
|
||
|
|
||
|
NDIS_HANDLE hWanEndpoint; // The NdisWan endpoint
|
||
|
|
||
|
PVOID pNdisEndpoint; // Back ptr to ndisendpoint attached to
|
||
|
|
||
|
PVOID pDeviceContext; // Back ptr to DeviceContext
|
||
|
|
||
|
NDIS_HANDLE NdisBindingHandle; // Assigned by NDIS during NdisOpenAdapter
|
||
|
|
||
|
NDISMAC_LINE_UP MacLineUp; // The MAC's LINE UP
|
||
|
ULONG ulBandwidth; // Percentage of total connection bandwidth
|
||
|
|
||
|
NDISWAN_INFO NdisWanInfo; // Info about the adapter
|
||
|
|
||
|
USHORT MacNameLength; // Up to 32...
|
||
|
WCHAR MacName[MAC_NAME_SIZE]; // First 32 chars of MAC name
|
||
|
// like "\Device\AsyncMac01"
|
||
|
|
||
|
NDIS_MEDIUM MediumType; // NdisMedium802_3, NdisMedium802_5, Wan
|
||
|
|
||
|
NDIS_WAN_MEDIUM_SUBTYPE
|
||
|
WanMediumSubType; // Serial, ISDN, X.25 - for WAN only
|
||
|
|
||
|
NDIS_WAN_HEADER_FORMAT
|
||
|
WanHeaderFormat; // Native or ethernet emulation
|
||
|
|
||
|
WAN_STATS WanStats; // Generic statistics kept here
|
||
|
|
||
|
UCHAR OutstandingFrames; // count of outstanding frames on this endpoint
|
||
|
|
||
|
LIST_ENTRY ReadQueue; // Holds read frame Irps
|
||
|
|
||
|
NDISWAN_SET_LINK_INFO LinkInfo;
|
||
|
};
|
||
|
|
||
|
typedef struct WAN_ENUM_BUFFER WAN_ENUM_BUFFER, *PWAN_ENUM_BUFFER;
|
||
|
struct WAN_ENUM_BUFFER {
|
||
|
ULONG NumOfEndpoints; // Looked up in registry -- key "Endpoints"
|
||
|
WAN_ENDPOINT WanEndpoint[]; // One struct for each endpoint is allocated
|
||
|
};
|
||
|
|
||
|
//------------------------------------------------------------------------
|
||
|
//------------------------ FRAMING INFORMATION ---------------------------
|
||
|
//------------------------------------------------------------------------
|
||
|
|
||
|
#if 0 //ndef _NDIS_WAN
|
||
|
//
|
||
|
// NDIS WAN Framing bits
|
||
|
//
|
||
|
#define OLD_RAS_FRAMING 0x00000001
|
||
|
#define RAS_COMPRESSION 0x00000002
|
||
|
|
||
|
#define PPP_MULTILINK_FRAMING 0x00000010
|
||
|
#define PPP_SHORT_SEQUENCE_HDR_FORMAT 0x00000020
|
||
|
|
||
|
#define PPP_FRAMING 0x00000100
|
||
|
#define PPP_COMPRESS_ADDRESS_CONTROL 0x00000200
|
||
|
#define PPP_COMPRESS_PROTOCOL_FIELD 0x00000400
|
||
|
#define PPP_ACCM_SUPPORTED 0x00000800
|
||
|
|
||
|
#define SLIP_FRAMING 0x00001000
|
||
|
#define SLIP_VJ_COMPRESSION 0x00002000
|
||
|
#define SLIP_VJ_AUTODETECT 0x00004000
|
||
|
|
||
|
#define MEDIA_NRZ_ENCODING 0x00010000
|
||
|
#define MEDIA_NRZI_ENCODING 0x00020000
|
||
|
#define MEDIA_NLPID 0x00040000
|
||
|
|
||
|
#define RFC_1356_FRAMING 0x00100000
|
||
|
#define RFC_1483_FRAMING 0x00200000
|
||
|
#define RFC_1490_FRAMING 0x00400000
|
||
|
|
||
|
#define SHIVA_FRAMING 0x01000000
|
||
|
|
||
|
#endif // _NDIS_WAN
|
||
|
|
||
|
//------------------------------------------------------------------------
|
||
|
//--------------------- OLD RAS COMPRESSION INFORMATION ------------------
|
||
|
//------------------------------------------------------------------------
|
||
|
|
||
|
// The defines below are for the compression bitmap field.
|
||
|
|
||
|
// No bits are set if compression is not available at all
|
||
|
#define COMPRESSION_NOT_AVAILABLE 0x00000000
|
||
|
|
||
|
// This bit is set if the mac can do version 1 compressed frames
|
||
|
#define COMPRESSION_VERSION1_8K 0x00000001
|
||
|
#define COMPRESSION_VERSION1_16K 0x00000002
|
||
|
#define COMPRESSION_VERSION1_32K 0x00000004
|
||
|
#define COMPRESSION_VERSION1_64K 0x00000008
|
||
|
|
||
|
// And this to turn off any compression feature bit
|
||
|
#define COMPRESSION_OFF_BIT_MASK (~( COMPRESSION_VERSION1_8K | \
|
||
|
COMPRESSION_VERSION1_16K | \
|
||
|
COMPRESSION_VERSION1_32K | \
|
||
|
COMPRESSION_VERSION1_64K ))
|
||
|
|
||
|
// We need to find a place to put the following supported featurettes...
|
||
|
#define XON_XOFF_SUPPORTED 0x00000010
|
||
|
|
||
|
#define COMPRESS_BROADCAST_FRAMES 0x00000080
|
||
|
|
||
|
#define UNKNOWN_FRAMING 0x00010000
|
||
|
#define NO_FRAMING 0x00020000
|