From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- private/ntos/ndis/pcimac/mtl.h | 306 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 private/ntos/ndis/pcimac/mtl.h (limited to 'private/ntos/ndis/pcimac/mtl.h') diff --git a/private/ntos/ndis/pcimac/mtl.h b/private/ntos/ndis/pcimac/mtl.h new file mode 100644 index 000000000..06d71919c --- /dev/null +++ b/private/ntos/ndis/pcimac/mtl.h @@ -0,0 +1,306 @@ +/* + * 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_ */ -- cgit v1.2.3