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.
306 lines
8.9 KiB
306 lines
8.9 KiB
/*
|
|
* MTL.H - include file for all MTL modules
|
|
*/
|
|
|
|
#ifndef _MTL_
|
|
#define _MTL_
|
|
|
|
/* some constants values */
|
|
// The value for mtl_max_chan has to be <= the value for
|
|
// cm_max_chan in cm_pub.h
|
|
|
|
//
|
|
// I set the MTU to a large enough value to allow multi-link,
|
|
// bridging and any other future expansion to occur.
|
|
//
|
|
#define MTL_MAC_MTU 1600 /* mac size mtu, fixed */
|
|
|
|
#define MTL_IDD_MTU 260 /* idd size mtu, default value */
|
|
|
|
//
|
|
// a guess at how much receive space we will need this is 1514 * 16 wich seems
|
|
// like alot to me
|
|
//
|
|
#define MTL_RX_BUFS 16 /* # of recieve buffers, must be 2^n */
|
|
|
|
//
|
|
// max local tx descriptor buffers based on the maximum number of
|
|
// wanpackets we told the wrapper it could send (mydefs.h MAX_WANPACKET_XMITS)
|
|
//
|
|
#define MTL_TX_BUFS 8 /* # of transmit buffers */
|
|
|
|
//
|
|
// max fragments per packet
|
|
//
|
|
#define MTL_MAX_FRAG 16
|
|
|
|
//
|
|
// index into buffer where destination ethernet address starts
|
|
//
|
|
#define DST_ADDR_INDEX 0
|
|
|
|
//
|
|
// index into buffer where source ethernet address starts
|
|
//
|
|
#define SRC_ADDR_INDEX 6
|
|
|
|
//
|
|
// index into buffer where length of buffer starts
|
|
//
|
|
#define PKT_LEN_INDEX 12
|
|
|
|
/* mtl error codes */
|
|
#define MTL_E_SUCC 0
|
|
#define MTL_E_NOMEM 1
|
|
#define MTL_E_NOTIMPL 2
|
|
#define MTL_E_NOROOM 3
|
|
#define MTL_E_NOSUCH 4
|
|
|
|
//
|
|
// local mtl defs
|
|
//
|
|
/* packet receive/transmit assembly/disassembly descriptor */
|
|
typedef struct
|
|
{
|
|
LIST_ENTRY link;
|
|
ULONG Queued;
|
|
ULONG QueueOverRun;
|
|
UCHAR seq; /* recorded sequence number */
|
|
UCHAR tot; /* total # of fragments (0 free) */
|
|
UCHAR num; /* # of fragments received/transmitted */
|
|
ULONG ttl; /* time to live, in seconds */
|
|
USHORT len; /* accumulated packet length */
|
|
struct _MTL *mtl; /* back pointer to mtl */
|
|
USHORT State; /* State of current large frame */
|
|
UCHAR* DataPtr; /* current data index into buffer */
|
|
USHORT MaxRxLength; /* max frame receive length */
|
|
ULONG MissCount; /* rx miss count */
|
|
PUCHAR buf;
|
|
} MTL_AS;
|
|
|
|
typedef struct
|
|
{
|
|
UCHAR NextFree;
|
|
NDIS_SPIN_LOCK lock; /* access spinlock */
|
|
ULONG DKFReceiveError1;
|
|
ULONG DKFReceiveError2;
|
|
ULONG DKFReceiveError3;
|
|
ULONG DKFReceiveError4;
|
|
ULONG DKFReceiveError5;
|
|
ULONG PPPReceiveError1;
|
|
ULONG PPPReceiveError2;
|
|
ULONG PPPReceiveError3;
|
|
ULONG PPPReceiveError4;
|
|
ULONG PPPReceiveError5;
|
|
ULONG IndicateReceiveError1;
|
|
ULONG IndicateReceiveError2;
|
|
ULONG IndicateReceiveError3;
|
|
ULONG TimeOutReceiveError1;
|
|
MTL_AS as_tbl[MTL_RX_BUFS];
|
|
PUCHAR Data;
|
|
}MTL_RX_TBL;
|
|
|
|
typedef struct
|
|
{
|
|
LIST_ENTRY head;
|
|
NDIS_SPIN_LOCK lock;
|
|
} MTL_AS_FIFO;
|
|
|
|
//
|
|
// Fifo for storing wan packets before fragment processing
|
|
//
|
|
typedef struct
|
|
{
|
|
LIST_ENTRY head; /* head pointer, head==NULL -> empty */
|
|
NDIS_SPIN_LOCK lock; /* access lock */
|
|
ULONG Count;
|
|
ULONG Max;
|
|
} MTL_WANPACKET_FIFO;
|
|
|
|
/* idd packet header */
|
|
typedef struct
|
|
{
|
|
UCHAR sig_tot; /* signature + total fragments */
|
|
UCHAR seq; /* packet sequence number */
|
|
USHORT ofs; /* offset of fragment data into packet */
|
|
} MTL_HDR;
|
|
|
|
//
|
|
// this structure is used for data this is fragmented in the DKF format
|
|
//
|
|
typedef struct
|
|
{
|
|
IDD_FRAG IddFrag[2]; /* two fragments (hdr+data) required */
|
|
MTL_HDR MtlHeader; /* header storage */
|
|
} DKF_FRAG;
|
|
|
|
/* trasmit fragement descriptor */
|
|
//
|
|
// The DKF_FRAG member must be kept at the begining of this structure
|
|
// !!!!!!!!!!!!!! mtl_tx.c relies on this !!!!!!!!!!!!!!!
|
|
//
|
|
typedef struct
|
|
{
|
|
DKF_FRAG DkfFrag; /* frament descriptor for idd poll_tx */
|
|
IDD_MSG frag_msg; /* fragments waiting to be sent vector */
|
|
VOID *frag_idd; /* idd accepting fragments */
|
|
USHORT frag_bchan; /* destination bchannels */
|
|
VOID *frag_arg; /* argument to completion function */
|
|
ULONG FragSent; /* flag to indicate if this frag has been xmitted */
|
|
} MTL_TX_FRAG;
|
|
|
|
/* trasmit packet descriptor */
|
|
typedef struct
|
|
{
|
|
LIST_ENTRY TxPacketQueue;
|
|
NDIS_SPIN_LOCK lock;
|
|
ULONG InUse; /* this entry is in use */
|
|
USHORT NumberOfFrags; /* # of fragments in frag_tbl */
|
|
USHORT NumberOfFragsSent; /* # of fragments already sent */
|
|
USHORT FragReferenceCount; /* refrence count */
|
|
UCHAR *frag_buf; /* pointer to real data buffer */
|
|
NDIS_WAN_PACKET *WanPacket; /* related user packet */
|
|
struct _MTL *mtl; /* back pointer to mtl */
|
|
MTL_TX_FRAG frag_tbl[MTL_MAX_FRAG]; /* fragment table (assembled) */
|
|
} MTL_TX_PKT;
|
|
|
|
/* trasmit packet control table */
|
|
typedef struct
|
|
{
|
|
LIST_ENTRY head;
|
|
NDIS_SPIN_LOCK lock; /* access lock */
|
|
ULONG seq; /* packet sequence number (for next) */
|
|
ULONG NextFree; /* next available packet */
|
|
MTL_TX_PKT TxPacketTbl[MTL_TX_BUFS]; /* packet table */
|
|
} MTL_TX_TBL;
|
|
|
|
/* a channel descriptor */
|
|
typedef struct
|
|
{
|
|
VOID *idd; /* related idd object */
|
|
USHORT bchan; /* related channel within idd, b1=0, b2=1 */
|
|
ULONG speed; /* channel speed in bps */
|
|
struct _MTL *mtl; /* mtl back pointer */
|
|
} MTL_CHAN;
|
|
|
|
/* channel table */
|
|
typedef struct
|
|
{
|
|
MTL_CHAN tbl[MAX_CHAN_PER_CONN]; /* table of channels */
|
|
USHORT num; /* # of entries used */
|
|
NDIS_SPIN_LOCK lock; /* access spinlock */
|
|
} MTL_CHAN_TBL;
|
|
|
|
/* an MTL object */
|
|
typedef struct _MTL
|
|
{
|
|
ADAPTER *Adapter; /* adapter that owns this mtl */
|
|
|
|
NDIS_HANDLE LinkHandle; /* handle from wrapper for this link */
|
|
|
|
//statistics
|
|
ULONG FramesXmitted;
|
|
ULONG FramesReceived;
|
|
ULONG BytesXmitted;
|
|
ULONG BytesReceived;
|
|
|
|
NDIS_SPIN_LOCK lock; /* access lock */
|
|
|
|
VOID (*rx_handler)(); /* mgr receiver handler routine */
|
|
VOID *rx_handler_arg; /* ... handler argument */
|
|
|
|
VOID (*tx_handler)(); /* mgr transmitter handler routine */
|
|
VOID *tx_handler_arg; /* ... handler argument */
|
|
|
|
USHORT idd_mtu; /* idd max frame size */
|
|
BOOL is_conn; /* is connected now? */
|
|
|
|
ULONG IddTxFrameType; /* 0/1 - PPP/DKF */
|
|
ULONG IddRxFrameType; /* 0/1 - PPP/DKF */
|
|
|
|
MTL_CHAN_TBL chan_tbl; /* the channel table */
|
|
|
|
//
|
|
// Receive table
|
|
//
|
|
MTL_RX_TBL rx_tbl;
|
|
|
|
//
|
|
// Receive Completion Fifo
|
|
//
|
|
MTL_AS_FIFO RxIndicationFifo;
|
|
|
|
//
|
|
// fifo of wan packets to be transmitted
|
|
//
|
|
MTL_WANPACKET_FIFO WanPacketFifo;
|
|
|
|
//
|
|
// transmit table
|
|
//
|
|
MTL_TX_TBL tx_tbl;
|
|
|
|
//
|
|
// flag to show
|
|
//
|
|
BOOL RecvCompleteScheduled;
|
|
|
|
//
|
|
// backpointer to connection object
|
|
//
|
|
VOID *cm;
|
|
|
|
SEMA tx_sema; /* transmit processing sema */
|
|
|
|
//
|
|
// wan wrapper information
|
|
//
|
|
ULONG MaxSendFrameSize;
|
|
ULONG MaxRecvFrameSize;
|
|
ULONG PreamblePadding;
|
|
ULONG PostamblePadding;
|
|
ULONG SendFramingBits;
|
|
ULONG RecvFramingBits;
|
|
ULONG SendCompressionBits;
|
|
ULONG RecvCompressionBits;
|
|
|
|
} MTL;
|
|
|
|
//
|
|
// public mtl defs
|
|
//
|
|
/* MTL object operations */
|
|
INT mtl_create(VOID** mtl_1, NDIS_HANDLE AdapterHandle);
|
|
INT mtl_destroy(VOID* mtl_1);
|
|
INT mtl_set_rx_handler(VOID* mtl_1, VOID (*handler)(), VOID* handler_arg);
|
|
INT mtl_set_tx_handler(VOID* mtl_1, VOID (*handler)(), VOID* handler_arg);
|
|
INT mtl_set_idd_mtu(VOID* mtl_1, USHORT idd_mtu);
|
|
INT mtl_set_conn_state(VOID* mtl_1, USHORT NumberOfChannels, BOOL is_conn);
|
|
INT mtl_get_conn_speed(VOID* mtl_1, ULONG *speed);
|
|
INT mtl_get_mac_mtu(VOID* mtl_1, ULONG* mtu);
|
|
VOID mtl_tx_packet(VOID* mtl_1, PNDIS_WAN_PACKET pkt);
|
|
INT mtl_add_chan(VOID* mtl_1, VOID* idd, USHORT chan, ULONG speed, ULONG ConnectionType);
|
|
INT mtl_del_chan(VOID* mtl_1, VOID* idd, USHORT chan);
|
|
INT GetStatistics (VOID*, VOID*);
|
|
INT ClearStatistics (VOID*);
|
|
INT MtlSetFramingType (VOID*, ULONG);
|
|
|
|
|
|
/* prototypes for internal functions */
|
|
VOID mtl__rx_bchan_handler(MTL_CHAN* chan, USHORT bchan, ULONG RxFrameType, IDD_XMSG* xmsg);
|
|
VOID IndicateRxToWrapper(MTL*);
|
|
VOID mtl__tx_cmpl_handler(MTL_TX_PKT *pkt, USHORT bchan, IDD_MSG* msg);
|
|
VOID mtl__rx_tick(MTL* mtl);
|
|
VOID mtl__tx_tick(MTL* mtl);
|
|
VOID MtlPollFunction(VOID* a1, ADAPTER *Adapter, VOID* a3, VOID* a4);
|
|
VOID MtlRecvCompleteFunction(ADAPTER *Adapter);
|
|
BOOLEAN IsRxIndicationFifoEmpty(MTL*);
|
|
MTL_AS* GetAssemblyFromRxIndicationFifo(MTL*);
|
|
VOID QueueDescriptorForRxIndication(MTL*, MTL_AS*);
|
|
VOID MtlSendCompleteFunction(ADAPTER *Adapter);
|
|
VOID IndicateTxCompletionToWrapper(MTL*);
|
|
VOID MtlFlushWanPacketTxQueue(MTL*);
|
|
VOID mtl__tx_packet(MTL*, NDIS_WAN_PACKET*);
|
|
VOID TryToIndicateMtlReceives(ADAPTER *Adapter);
|
|
|
|
#endif /* _MTL_ */
|