diff options
Diffstat (limited to '')
-rw-r--r-- | private/ntos/tdi/irda/irlap/irlapp.h | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/private/ntos/tdi/irda/irlap/irlapp.h b/private/ntos/tdi/irda/irlap/irlapp.h new file mode 100644 index 000000000..bd2498263 --- /dev/null +++ b/private/ntos/tdi/irda/irlap/irlapp.h @@ -0,0 +1,299 @@ +/***************************************************************************** +* +* Copyright (c) 1995 Microsoft Corporation +* +* File: irlap.h +* +* Description: IRLAP Protocol and control block definitions +* +* Author: mbert +* +* Date: 4/15/95 +* +*/ + +#define IRLAP_MEDIA_SENSE_TIME 500 +#define IRLAP_SLOT_TIMEOUT 50 +#define IRLAP_DSCV_SENSE_TIME 30 + +// XID Format +#define IRLAP_XID_DSCV_FORMAT_ID 0x01 +#define IRLAP_XID_NEGPARMS_FORMAT_ID 0x02 +typedef struct +{ + BYTE SrcAddr[IRDA_DEV_ADDR_LEN]; + BYTE DestAddr[IRDA_DEV_ADDR_LEN]; + BYTE NoOfSlots:2; + BYTE GenNewAddr:1; + BYTE Reserved:5; + BYTE SlotNo; + BYTE Version; + BYTE FirstDscvInfoByte; +} IRLAP_XID_DSCV_FORMAT; + +// Frame Reject Format +typedef struct +{ + BYTE CntlField; + BYTE Fill1:1; + BYTE Vs:3; + BYTE CRBit:1; + BYTE Vr:3; + BYTE W:1; + BYTE X:1; + BYTE Y:1; + BYTE Z:1; + BYTE Fill2:4; +} IRLAP_FRMR_FORMAT; + +// SNRM Frame Format +typedef struct +{ + BYTE SrcAddr[IRDA_DEV_ADDR_LEN]; + BYTE DestAddr[IRDA_DEV_ADDR_LEN]; + BYTE ConnAddr; // actually shifted for CRBit -> STUPID !! + BYTE FirstQosByte; +} IRLAP_SNRM_FORMAT; + +// UA Frame Format +typedef struct +{ + BYTE SrcAddr[IRDA_DEV_ADDR_LEN]; + BYTE DestAddr[IRDA_DEV_ADDR_LEN]; + BYTE FirstQosByte; +} IRLAP_UA_FORMAT; + +#define IRLAP_MAX_TX_MSG_LIST_LEN 8 +#define IRLAP_MAX_DATA_SIZE 4096 +#define IRLAP_MAX_SLOTS 16 +#define IRLAP_DEFAULT_BAUD 9600 +#define IRLAP_DEFAULT_DATA_SIZE 64 +#define IRLAP_DEFAULT_MAX_TAT 500 +#define IRLAP_DEFAULT_BOFS 11 +#define IRLAP_DEFAULT_WIN_SIZE 1 + +// Macros for extracting various fields +#define IRLAP_GET_ADDR(addr) (addr >> 1) +#define IRLAP_GET_CRBIT(addr) (addr & 1) +#define IRLAP_GET_PFBIT(cntl) ((cntl >>4) & 1) +#define IRLAP_GET_UCNTL(cntl) (cntl & 0xEF) +#define IRLAP_GET_SCNTL(cntl) (cntl & 0x0F) +#define IRLAP_FRAME_TYPE(cntl) (cntl & 0x01 ? (cntl & 3) : 0) +#define IRLAP_GET_NR(cntl) ((cntl & 0xE0) >> 5) +#define IRLAP_GET_NS(cntl) ((cntl & 0xE) >> 1) + +// IRLAP constants +#define IRLAP_BROADCAST_CONN_ADDR 0x7F +#define IRLAP_END_DSCV_SLOT_NO 0xFF +#define IRLAP_CMD 1 +#define IRLAP_RSP 0 +#define IRLAP_PFBIT_SET 1 +#define IRLAP_PFBIT_CLEAR 0 +#define IRLAP_GEN_NEW_ADDR 1 +#define IRLAP_NO_NEW_ADDR 0 + +// Macro for creating Number of Slots of Discovery Flags Field of XID Format +// if S(Slots) <= 1 return 0, <= 6 return 1, <= 8 return 2, else return 3 +#define IRLAP_SLOT_FLAG(S) (S <= 1 ? 0 : (S <= 6 ? 1 : (S <= 8 ? 2 : 3))) + +int _inline IRLAP_RAND(int Min, int Max) +{ + LARGE_INTEGER li; + + KeQueryTickCount(&li); + + return ((li.LowPart % (Max+1-Min)) + Min); +} + +// Backoff time is a random time between 0.5 and 1.5 times the time to +// send a SNRM. _SNRM_TIME() is actually half (1000ms/2) time to send +// SNRM_LEN of characters at 9600 (9600/10 bits per char). +#define _SNRM_LEN 32 +#define _SNRM_TIME() (_SNRM_LEN*500/960) +#define IRLAP_BACKOFF_TIME() IRLAP_RAND(_SNRM_TIME(), 3*_SNRM_TIME()) + +#define QOS_PI_BAUD 0x01 +#define QOS_PI_MAX_TAT 0x82 +#define QOS_PI_DATA_SZ 0x83 +#define QOS_PI_WIN_SZ 0x84 +#define QOS_PI_BOFS 0x85 +#define QOS_PI_MIN_TAT 0x86 +#define QOS_PI_DISC_THRESH 0x08 + + +#define IRLAP_I_FRAME 0x00 +#define IRLAP_S_FRAME 0x01 +#define IRLAP_U_FRAME 0x03 + +// Unnumbered Frame types with P/F bit set to 0 +#define IRLAP_UI 0x03 +#define IRLAP_XID_CMD 0x2f +#define IRLAP_TEST 0xe3 +#define IRLAP_SNRM 0x83 +#define IRLAP_RNRM 0x83 +#define IRLAP_DISC 0x43 +#define IRLAP_RD 0x43 +#define IRLAP_UA 0x63 +#define IRLAP_FRMR 0x87 +#define IRLAP_DM 0x0f +#define IRLAP_XID_RSP 0xaf + +// Supervisory Frames +#define IRLAP_RR 0x01 +#define IRLAP_RNR 0x05 +#define IRLAP_REJ 0x09 +#define IRLAP_SREJ 0x0d + +#define _MAKE_ADDR(Addr, CRBit) ((Addr << 1) + (CRBit & 1)) +#define _MAKE_UCNTL(Cntl, PFBit) (Cntl + ((PFBit & 1)<< 4)) +#define _MAKE_SCNTL(Cntl, PFBit, Nr) (Cntl + ((PFBit & 1)<< 4) + (Nr <<5)) + +#define IRLAP_CB_SIG 0x7f2a364bUL + +// IRLAP Control Block +typedef struct +{ + IRDA_MSG *pMsg[IRLAP_MOD]; + UINT Start; + UINT End; +#ifdef TEMPERAMENTAL_SERIAL_DRIVER + int FCS[IRLAP_MOD]; +#endif +} IRLAP_WINDOW; + +typedef enum +{ + PRIMARY, + SECONDARY +} IRLAP_STN_TYPE; + +typedef enum // KEEP IN SYNC with IRLAP_StateStr in irlaplog.c +{ + NDM, // Normal Disconnect Mode + DSCV_MEDIA_SENSE, // Discovery Media Sense (Before Discovery) + DSCV_QUERY, // Discovery Query (Discovery initiated) + DSCV_REPLY, // Discovery Reply (Received DSCV XID cmd from Remote) + CONN_MEDIA_SENSE, // Connect Media Sense (Before connection estab) + SNRM_SENT, // SNRM sent - waiting for UA or DM from Remote + BACKOFF_WAIT, // Waiting random backoff before sending next SNRM + SNRM_RECEIVED, // SNRM rcvd - waiting for response from upper layer + P_XMIT, // Primary transmit + P_RECV, // Primary receive + P_DISCONNECT_PEND, // Upper layer request disconnect while in P_RECV + P_CLOSE, // Sent DISC, waiting for response + S_NRM, // Secondary Normal Response Mode XMIT/RECV + S_DISCONNECT_PEND, // Upper layer request disconnect while in S_NRM + S_ERROR, // Waiting for PF bit then send a FRMR + S_CLOSE, // Requested disconnect (RD) waiting for DISC command +} IRLAP_STATE; + +typedef struct IrlapControlBlock +{ + IRLAP_STATE State; + IRDA_DEVICE LocalDevice; + IRDA_DEVICE RemoteDevice; + PIRDA_LINK_CB pIrdaLinkCb; + IRDA_QOS_PARMS LocalQos; // QOS from LMP + IRDA_QOS_PARMS RemoteQos; // QOS of remote taken from SNRM/UA + IRDA_QOS_PARMS NegotiatedQos; // Union of remote and local QOS + int Baud; // Type 0 negotiation parm + int DisconnectTime;// Type 0 negotiation parm + int ThresholdTime; // Type 0 negotiotion parm + int LocalMaxTAT; // Type 1 negotiation parm + int LocalDataSize; // Type 1 negotiation parm + int LocalWinSize; // Type 1 negotiation parm + int LocalNumBOFS; // Type 1 negotiation parm + int RemoteMaxTAT; // Type 1 negotiation parm + int RemoteDataSize;// Type 1 negotiation parm + int RemoteWinSize; // Type 1 negotiation parm + int RemoteNumBOFS; // Type 1 negotiation parm + int RemoteMinTAT; // Type 1 negotiation parm + IRLAP_STN_TYPE StationType; // PRIMARY or SECONDARY + int ConnAddr; // Connection Address + int SNRMConnAddr; // Connection address contained in SNRM + // save it until get CONNECT_RESP + int CRBit; // Primary = 1, Secondary = 0 + int RespSlot; // Secondary. Slot to respond in + int SlotCnt; // Primary. Current slot number + int MaxSlot; // Maximum slots to send in Dscv + int RemoteMaxSlot; // Number of Dscv's remote will send + LIST_ENTRY DevList; // Discovered device list + UINT Vs; // send state variable + UINT Vr; // receive state variable + IRLAP_WINDOW RxWin; // Holds out of sequence rxd frames + IRLAP_WINDOW TxWin; // Holds unacked txd frames + IRDA_MSG_LIST TxMsgList; // DATA_REQ, UDATA_REQ queued here + int RetryCnt; // Count of number of retrans of DSCV,SNRM + int N1; // const# retries before sending status up + int N2; // const# retries before disconnecting + int N3; // const# of connection retries + IRDA_TIMER SlotTimer; + IRDA_TIMER QueryTimer; + IRDA_TIMER PollTimer; + IRDA_TIMER FinalTimer; + IRDA_TIMER WDogTimer; + IRDA_TIMER BackoffTimer; + int WDogExpCnt; // Count of WDog expirations + int StatusSent; // Status ind has been sent + CRITICAL_SECTION CS; // Control block synchronization + BOOL GenNewAddr; // Flag indicating whether to set new addr + BOOL DscvRespSent; // Secondary. Sent XID Discv response + BOOL RemoteBusy; // Remote has sent a RNR + BOOL LocalBusy; // Local busy condition, we sent RNR + BOOL ClrLocalBusy; // Send RR + BOOL LocalDiscReq; // why 2ndary got DISC + BOOL ConnAfterClose;// Conn req while in p_close + BOOL DscvAfterClose;// Dscv_req while in p_close + BOOL NoResponse; // Final/WD timer exp'd, used with RetryCnt + UINT Sig; // Signature +} IRLAP_CB, *PIRLAP_CB; + +#define LINE_CAPACITY(icb) (icb->RemoteWinSize * \ + (icb->RemoteDataSize + \ + 6+icb->RemoteNumBOFS)) + +BYTE *BuildNegParms(BYTE *pBuf, IRDA_QOS_PARMS *pQos); + +void StoreULAddr(BYTE Addr[], ULONG ULAddr); + +BYTE *Format_SNRM(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, + BYTE SAddr[], BYTE DAddr[], int CAddr, + IRDA_QOS_PARMS *pQos); + +BYTE *Format_DISC(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit); + +BYTE *Format_UI(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit); + +BYTE *Format_DscvXID(IRDA_MSG *pMsg, int ConnAddr, int CRBit, int PFBit, + IRLAP_XID_DSCV_FORMAT *pXidFormat, CHAR DscvInfo[], + int Len); + +BYTE *Format_TEST(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, + BYTE SAddr[], BYTE DAddr[]); + +BYTE *Format_RNRM(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit); + +BYTE *Format_UA(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, + BYTE SAddr[], BYTE DAddr[], IRDA_QOS_PARMS *pQos); + +BYTE *Format_FRMR(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, + IRLAP_FRMR_FORMAT *pFormat); + +BYTE *Format_DM(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit); + +BYTE *Format_RD(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit); + +BYTE *Format_RR(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, int Nr); + +BYTE *Format_RNR(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, int Nr); + +BYTE *Format_REJ(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, int Nr); + +BYTE *Format_SREJ(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, int Nr); + +BYTE * Format_I(IRDA_MSG *pMsg, int Addr, int CRBit, + int PFBit, int Nr, int Ns); + +int GetMyDevAddr(BOOL New); + + |