summaryrefslogtreecommitdiffstats
path: root/private/ntos/tdi/irda/irlap/irlapio.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/ntos/tdi/irda/irlap/irlapio.c900
1 files changed, 900 insertions, 0 deletions
diff --git a/private/ntos/tdi/irda/irlap/irlapio.c b/private/ntos/tdi/irda/irlap/irlapio.c
new file mode 100644
index 000000000..0c4a8361d
--- /dev/null
+++ b/private/ntos/tdi/irda/irlap/irlapio.c
@@ -0,0 +1,900 @@
+/*****************************************************************************
+*
+* Copyright (c) 1995 Microsoft Corporation
+*
+* File: irlapio.c
+*
+* Description: IRLAP I/O routines
+*
+* Author: mbert
+*
+* Date: 4/25/95
+*
+*/
+#include <irda.h>
+#include <irdalink.h>
+#include <irmac.h>
+#include <irlap.h>
+#include <irlmp.h>
+#include <irlapp.h>
+#include <irlapio.h>
+#include <irlaplog.h>
+
+extern BYTE IRLAP_BroadcastDevAddr[];
+
+// The largest MAC message is the XID Frame consisting of address,
+// control, XID Format ID, XID format, + Discovery Information
+#define _MAC_MSG_LEN 3+sizeof(IRLAP_XID_DSCV_FORMAT)+IRLAP_DSCV_INFO_LEN
+
+//static BYTE IRLAP_MAC_MsgData[_MAC_MSG_LEN];
+//static IRDA_MSG MAC_Message;
+//static PIRDA_MSG pMACMsg = &MAC_Message;
+
+UINT
+SendFrame(PIRLAP_CB, PIRDA_MSG );
+
+/*****************************************************************************
+*
+* @func ret_type | func_name | funcdesc
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+* @parm data_type | parm_name | description
+*
+* @comm
+* comments
+*/
+UINT
+ClearRxWindow(PIRLAP_CB pIrlapCb)
+{
+ UINT i, rc;
+
+ // Remove everything from Rx window
+ for (i = pIrlapCb->Vr; i != pIrlapCb->RxWin.End; i = (i+1) % IRLAP_MOD)
+ {
+ if (pIrlapCb->RxWin.pMsg[i] != NULL)
+ {
+ /* !!! fix this OH SHIT
+ if((rc = EnqueMsgList(&pIrlapCb->RxMsgFreeList,
+ pIrlapCb->RxWin.pMsg[i],
+ pIrlapCb->MaxRxMsgFreeListLen)) != SUCCESS)
+ {
+ return rc;
+ }
+ */
+ pIrlapCb->RxWin.pMsg[i] = NULL;
+ }
+ pIrlapCb->RxWin.End = pIrlapCb->Vr;
+ }
+ return SUCCESS;
+}
+/*****************************************************************************
+*
+* @func ret_type | func_name | funcdesc
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+* @parm data_type | parm_name | description
+*
+* @comm
+* comments
+*/
+UINT
+SendDscvXIDCmd(PIRLAP_CB pIrlapCb)
+{
+ UINT rc = SUCCESS;
+ IRLAP_XID_DSCV_FORMAT XIDFormat;
+ CHAR *DscvInfo;
+ int DscvInfoLen;
+ IRDA_MSG *pIMsg;
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+
+ memcpy(XIDFormat.SrcAddr, pIrlapCb->LocalDevice.DevAddr, IRDA_DEV_ADDR_LEN);
+ memcpy(XIDFormat.DestAddr, IRLAP_BroadcastDevAddr, IRDA_DEV_ADDR_LEN);
+
+ XIDFormat.NoOfSlots = IRLAP_SLOT_FLAG(pIrlapCb->MaxSlot);
+ XIDFormat.GenNewAddr = pIrlapCb->GenNewAddr;
+ XIDFormat.Reserved = 0;
+
+ if (pIrlapCb->SlotCnt == pIrlapCb->MaxSlot)
+ {
+ DscvInfo = pIrlapCb->LocalDevice.DscvInfo;
+ DscvInfoLen = pIrlapCb->LocalDevice.DscvInfoLen;
+ XIDFormat.SlotNo = IRLAP_END_DSCV_SLOT_NO;
+ }
+ else
+ {
+ DscvInfo = NULL;
+ DscvInfoLen = 0;
+ XIDFormat.SlotNo = pIrlapCb->SlotCnt;
+ }
+ XIDFormat.Version = pIrlapCb->LocalDevice.IRLAP_Version;
+
+ pIMsg->IRDA_MSG_pWrite = Format_DscvXID(pIMsg,
+ IRLAP_BROADCAST_CONN_ADDR,
+ IRLAP_CMD, IRLAP_PFBIT_SET,
+ &XIDFormat, DscvInfo,
+ DscvInfoLen);
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/****************************************************************************S*
+*
+* @func ret_type | func_name | funcdesc
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+* @parm data_type | parm_name | description
+*
+* @comm
+* comments
+*/
+UINT
+SendDscvXIDRsp(PIRLAP_CB pIrlapCb)
+{
+ UINT rc = SUCCESS;
+ IRLAP_XID_DSCV_FORMAT XIDFormat;
+ IRDA_MSG *pIMsg;
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+
+ XIDFormat.GenNewAddr = pIrlapCb->GenNewAddr;
+ if (pIrlapCb->GenNewAddr)
+ {
+ StoreULAddr(pIrlapCb->LocalDevice.DevAddr, GetMyDevAddr(TRUE));
+ pIrlapCb->GenNewAddr = FALSE;
+ }
+ memcpy(XIDFormat.SrcAddr, pIrlapCb->LocalDevice.DevAddr, IRDA_DEV_ADDR_LEN);
+ memcpy(XIDFormat.DestAddr, pIrlapCb->RemoteDevice.DevAddr, IRDA_DEV_ADDR_LEN);
+ XIDFormat.NoOfSlots = IRLAP_SLOT_FLAG(pIrlapCb->RemoteMaxSlot);
+ XIDFormat.Reserved = 0;
+ XIDFormat.SlotNo = pIrlapCb->RespSlot;
+ XIDFormat.Version = pIrlapCb->LocalDevice.IRLAP_Version;
+
+ pIMsg->IRDA_MSG_pWrite = Format_DscvXID(pIMsg,
+ IRLAP_BROADCAST_CONN_ADDR,
+ IRLAP_RSP, IRLAP_PFBIT_SET,
+ &XIDFormat,
+ pIrlapCb->LocalDevice.DscvInfo,
+ pIrlapCb->LocalDevice.DscvInfoLen);
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendSNRM | formats a SNRM frame and sends it
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+* @parm BYTE | ConnAddr | Connection address
+*
+* @comm
+* The ConnAddr can be different than that in the control block.
+* For reset, its the same, but set to broadcast for initial
+* connection.
+*/
+UINT
+SendSNRM(PIRLAP_CB pIrlapCb, BOOL SendQos)
+{
+ IRDA_QOS_PARMS *pQos = NULL;
+ int ConnAddr = pIrlapCb->ConnAddr;
+ IRDA_MSG *pIMsg;
+
+ if (SendQos)
+ {
+ ConnAddr = IRLAP_BROADCAST_CONN_ADDR;
+ pQos = &pIrlapCb->LocalQos;
+ }
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+
+ pIMsg->IRDA_MSG_pWrite = Format_SNRM(pIMsg, ConnAddr,
+ IRLAP_CMD,
+ IRLAP_PFBIT_SET,
+ pIrlapCb->LocalDevice.DevAddr,
+ pIrlapCb->RemoteDevice.DevAddr,
+ pIrlapCb->ConnAddr,
+ pQos);
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendUA | formats a UA frame and sends it
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+* @parm BOOL | SendQos | Send the Qos
+*
+* @comm
+* comments
+*/
+UINT
+SendUA(PIRLAP_CB pIrlapCb, BOOL SendQos)
+{
+ IRDA_QOS_PARMS NegQos;
+ IRDA_QOS_PARMS *pNegQos = NULL;
+ BYTE *pSrcAddr = NULL;
+ BYTE *pDestAddr = NULL;
+ IRDA_MSG *pIMsg;
+
+ if (SendQos)
+ {
+ // Put all parms (type 0 and 1) in NegQos
+ memcpy(&NegQos, &pIrlapCb->LocalQos, sizeof(IRDA_QOS_PARMS));
+ // Overwrite type 0 parameters that have already been negotiated
+ NegQos.bfBaud = pIrlapCb->NegotiatedQos.bfBaud;
+ NegQos.bfDisconnectTime = pIrlapCb->NegotiatedQos.bfDisconnectTime;
+ pNegQos = &NegQos;
+ }
+
+ // This will be moved into the "if" above when the spec is clarified
+ pSrcAddr = pIrlapCb->LocalDevice.DevAddr;
+ pDestAddr = pIrlapCb->RemoteDevice.DevAddr;
+ //------------------------------------------------------------------
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+
+ pIMsg->IRDA_MSG_pWrite = Format_UA(pIMsg,
+ pIrlapCb->ConnAddr,
+ IRLAP_RSP,
+ IRLAP_PFBIT_SET,
+ pSrcAddr, pDestAddr, pNegQos);
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendDM | formats a DM frame and sends it
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+*
+* @comm
+* comments
+*/
+UINT
+SendDM(PIRLAP_CB pIrlapCb)
+{
+ IRDA_MSG *pIMsg;
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+
+ pIMsg->IRDA_MSG_pWrite = Format_DM(pIMsg,
+ pIrlapCb->ConnAddr,
+ IRLAP_RSP,
+ IRLAP_PFBIT_SET);
+
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendRD | formats a RD frame and sends it
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+*
+* @comm
+* comments
+*/
+UINT
+SendRD(PIRLAP_CB pIrlapCb)
+{
+ IRDA_MSG *pIMsg;
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+
+ pIMsg->IRDA_MSG_pWrite = Format_RD(pIMsg,
+ pIrlapCb->ConnAddr,
+ IRLAP_RSP,
+ IRLAP_PFBIT_SET);
+
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendRR | formats a RR frame and sends it
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+*
+* @comm
+* comments
+*/
+UINT
+SendRR(PIRLAP_CB pIrlapCb)
+{
+ IRDA_MSG *pIMsg;
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+ ClearRxWindow(pIrlapCb);
+
+ pIrlapCb->RxWin.Start = pIrlapCb->Vr; // RxWin.Start = what we've acked
+
+ pIMsg->IRDA_MSG_pWrite = Format_RR(pIMsg, pIrlapCb->ConnAddr,
+ pIrlapCb->CRBit, IRLAP_PFBIT_SET,
+ pIrlapCb->Vr);
+
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendRNR | formats a RNR frame and sends it
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+*
+* @comm
+* comments
+*/
+UINT
+SendRR_RNR(PIRLAP_CB pIrlapCb)
+{
+ IRDA_MSG *pIMsg;
+
+ BYTE *(*pFormatRR_RNR)();
+
+ if (pIrlapCb->LocalBusy)
+ {
+ pFormatRR_RNR = Format_RNR;
+ }
+ else
+ {
+ pFormatRR_RNR = Format_RR;
+ }
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+ ClearRxWindow(pIrlapCb);
+
+
+ pIrlapCb->RxWin.Start = pIrlapCb->Vr; // RxWin.Start = what we've acked
+
+
+ pIMsg->IRDA_MSG_pWrite = (*pFormatRR_RNR)(pIMsg, pIrlapCb->ConnAddr,
+ pIrlapCb->CRBit, IRLAP_PFBIT_SET,
+ pIrlapCb->Vr);
+
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendDISC | formats a DISC frame and sends it
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+*
+* @comm
+* comments
+*/
+UINT
+SendDISC(PIRLAP_CB pIrlapCb)
+{
+ IRDA_MSG *pIMsg;
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+
+ pIMsg->IRDA_MSG_pWrite = Format_DISC(pIMsg, pIrlapCb->ConnAddr,
+ IRLAP_CMD, IRLAP_PFBIT_SET);
+
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendRNRM | formats a RNRM frame and sends it
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+*
+* @comm
+* comments
+*/
+UINT
+SendRNRM(PIRLAP_CB pIrlapCb)
+{
+ IRDA_MSG *pIMsg;
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+
+ pIMsg->IRDA_MSG_pWrite = Format_RNRM(pIMsg, pIrlapCb->ConnAddr,
+ IRLAP_RSP, IRLAP_PFBIT_SET);
+
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendREJ | formats a REJ frame and sends it
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+*
+* @comm
+* comments
+*/
+UINT
+SendREJ(PIRLAP_CB pIrlapCb)
+{
+ IRDA_MSG *pIMsg;
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+ ClearRxWindow(pIrlapCb);
+
+ pIrlapCb->RxWin.Start = pIrlapCb->Vr; // RxWin.Start = what we've acked
+
+ pIMsg->IRDA_MSG_pWrite = Format_REJ(pIMsg, pIrlapCb->ConnAddr,
+ pIrlapCb->CRBit, IRLAP_PFBIT_SET,
+ pIrlapCb->Vr);
+
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendSREJ | formats a SREJ frame and sends it
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+* @parm int | Nr | Nr to be placed in SREJ frame
+*
+* @comm
+* comments
+*/
+UINT
+SendSREJ(PIRLAP_CB pIrlapCb, int Nr)
+{
+ IRDA_MSG *pIMsg;
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+
+ pIMsg->IRDA_MSG_pWrite = Format_SREJ(pIMsg, pIrlapCb->ConnAddr,
+ pIrlapCb->CRBit, IRLAP_PFBIT_SET, Nr);
+
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendFRMR | formats a FRMR frame and sends it
+*
+* @rdesc SUCCESS, otherwise one of the following errors:
+* @flag val | desc
+*
+* @parm int | Nr | Nr to be placed in SREJ frame
+*
+* @comm
+* comments
+*/
+UINT
+SendFRMR(PIRLAP_CB pIrlapCb, IRLAP_FRMR_FORMAT *pFRMRFormat)
+{
+ IRDA_MSG *pIMsg;
+
+ pIMsg = AllocMacIMsg(pIrlapCb->pIrdaLinkCb);
+
+ pIMsg->IRDA_MSG_pWrite = Format_FRMR(pIMsg, pIrlapCb->ConnAddr,
+ pIrlapCb->CRBit, IRLAP_PFBIT_SET,
+ pFRMRFormat);
+
+ return SendFrame(pIrlapCb, pIMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendIFrame | Builds and sends an I frame to MAC
+*
+* @rdesc SUCCESS otherwise one of the following errors:
+* @flag val | desc
+*
+* @parm | |
+*
+* @comm
+* comments
+*/
+UINT
+SendIFrame(PIRLAP_CB pIrlapCb, PIRDA_MSG pMsg, int Ns, int PFBit)
+{
+ UINT rc;
+
+ if (NULL == pMsg)
+ {
+ return IRLAP_NULL_MSG;
+ }
+
+ ClearRxWindow(pIrlapCb);
+
+ pIrlapCb->RxWin.Start = pIrlapCb->Vr; // RxWin.Start = what we've acked
+
+ (void) Format_I(pMsg, pIrlapCb->ConnAddr, pIrlapCb->CRBit, PFBit,
+ pIrlapCb->Vr, Ns);
+
+ rc = SendFrame(pIrlapCb, pMsg);
+
+ pMsg->IRDA_MSG_pHdrRead +=2; // uglyness.. chop header in case frame
+ // requires retransmission
+ return rc;
+}
+/*****************************************************************************
+*
+* @func UINT | SendUIFrame | Builds and sends an UI frame to MAC
+*
+* @rdesc SUCCESS otherwise one of the following errors:
+* @flag val | desc
+*
+* @parm | |
+*
+* @comm
+* comments
+*/
+UINT
+SendUIFrame(PIRLAP_CB pIrlapCb, PIRDA_MSG pMsg)
+{
+ if (NULL == pMsg)
+ {
+ return IRLAP_NULL_MSG;
+ }
+ (void) Format_UI(pMsg, pIrlapCb->ConnAddr, pIrlapCb->CRBit,IRLAP_PFBIT_SET);
+
+ return SendFrame(pIrlapCb, pMsg);
+}
+/*****************************************************************************
+*
+* @func UINT | SendFrame | Builds and sends an Unnumbered frame to MAC
+*
+* @rdesc SUCCESS otherwise one of the following errors:
+* @flag val | desc
+*
+* @comm
+* comments
+*/
+UINT
+SendFrame(PIRLAP_CB pIrlapCb, PIRDA_MSG pMsg)
+{
+ UINT rc = SUCCESS;
+
+ pMsg->Prim = MAC_DATA_REQ;
+
+ rc = IrmacDown(pIrlapCb->pIrdaLinkCb, pMsg);
+
+ IRLAP_LOG_ACTION((pIrlapCb, TEXT("MAC_DATA_REQ: %s"), FrameToStr(pMsg)));
+
+ return rc;
+}
+/*****************************************************************************
+*
+* @func UINT | _IRLMP_Up | Adds logging to the IRLMP_Up
+*
+* @rdesc returns of IRLMP_Up
+*
+* @parm PIRDA_MSG | pMsg | pointer to IRDA message
+*
+* @comm
+* comments
+*/
+/*
+UINT
+_IRLMP_Up(PIRDA_MSG pMsg)
+{
+ IRLAP_LOG_ACTION((TEXT("%s%s"), IRDA_PrimStr[pMsg->Prim],
+ pMsg->Prim == IRLAP_DISCOVERY_CONF ?
+ IRDA_StatStr[pMsg->IRDA_MSG_DscvStatus] :
+ pMsg->Prim == IRLAP_CONNECT_CONF ?
+ IRDA_StatStr[pMsg->IRDA_MSG_ConnStatus] :
+ pMsg->Prim == IRLAP_DISCONNECT_IND ?
+ IRDA_StatStr[pMsg->IRDA_MSG_DiscStatus] :
+ pMsg->Prim == IRLAP_DATA_CONF || pMsg->Prim == IRLAP_UDATA_CONF ?
+ IRDA_StatStr[pMsg->IRDA_MSG_DataStatus] : TEXT("")));
+
+ return (IRLMP_Up(pMsg));
+}
+*/
+
+BYTE *
+BuildTuple(BYTE *pBuf, BYTE Pi, UINT BitField)
+{
+ *pBuf++ = Pi;
+
+ if (BitField > 0xFF)
+ {
+ *pBuf++ = 2; // Pl
+ *pBuf++ = (BYTE) (BitField >> 8);
+ *pBuf++ = (BYTE) (BitField);
+ }
+ else
+ {
+ *pBuf++ = 1; // Pl
+ *pBuf++ = (BYTE) (BitField);
+ }
+ return pBuf;
+}
+
+BYTE *
+BuildNegParms(BYTE *pBuf, IRDA_QOS_PARMS *pQos)
+{
+ pBuf = BuildTuple(pBuf, QOS_PI_BAUD, pQos->bfBaud);
+ pBuf = BuildTuple(pBuf, QOS_PI_MAX_TAT, pQos->bfMaxTurnTime);
+ pBuf = BuildTuple(pBuf, QOS_PI_DATA_SZ, pQos->bfDataSize);
+ pBuf = BuildTuple(pBuf, QOS_PI_WIN_SZ, pQos->bfWindowSize);
+ pBuf = BuildTuple(pBuf, QOS_PI_BOFS, pQos->bfBofs);
+ pBuf = BuildTuple(pBuf, QOS_PI_MIN_TAT, pQos->bfMinTurnTime);
+ pBuf = BuildTuple(pBuf, QOS_PI_DISC_THRESH, pQos->bfDisconnectTime);
+
+ return pBuf;
+}
+
+void
+StoreULAddr(BYTE Addr[], ULONG ULAddr)
+{
+ Addr[0] = (BYTE) ( 0xFF & ULAddr);
+ Addr[1] = (BYTE) ((0xFF00 & ULAddr) >> 8);
+ Addr[2] = (BYTE) ((0xFF0000 & ULAddr) >> 16);
+ Addr[3] = (BYTE) ((0xFF000000 & ULAddr) >> 24);
+}
+
+BYTE *
+_PutAddr(BYTE *pBuf, BYTE Addr[])
+{
+ *pBuf++ = Addr[0];
+ *pBuf++ = Addr[1];
+ *pBuf++ = Addr[2];
+ *pBuf++ = Addr[3];
+
+ return (pBuf);
+}
+
+void
+BuildUHdr(IRDA_MSG *pMsg, int FrameType, int Addr, int CRBit, int PFBit)
+{
+ if (pMsg->IRDA_MSG_pHdrRead != NULL)
+ {
+ pMsg->IRDA_MSG_pHdrRead -= 2;
+
+ ASSERT(pMsg->IRDA_MSG_pHdrRead >= pMsg->IRDA_MSG_Header);
+
+ *(pMsg->IRDA_MSG_pHdrRead) = (BYTE) _MAKE_ADDR(Addr, CRBit);
+ *(pMsg->IRDA_MSG_pHdrRead+1) = (BYTE) _MAKE_UCNTL(FrameType, PFBit);
+ }
+ else
+ {
+ pMsg->IRDA_MSG_pRead -= 2;
+ *(pMsg->IRDA_MSG_pRead) = (BYTE) _MAKE_ADDR(Addr, CRBit);
+ *(pMsg->IRDA_MSG_pRead+1) = (BYTE) _MAKE_UCNTL(FrameType, PFBit);
+ }
+ return;
+}
+
+void
+BuildSHdr(IRDA_MSG *pMsg, int FrameType, int Addr, int CRBit, int PFBit, int Nr)
+{
+ if (pMsg->IRDA_MSG_pHdrRead != NULL)
+ {
+ pMsg->IRDA_MSG_pHdrRead -= 2;
+
+ ASSERT(pMsg->IRDA_MSG_pHdrRead >= pMsg->IRDA_MSG_Header);
+
+ *(pMsg->IRDA_MSG_pHdrRead) = (BYTE) _MAKE_ADDR(Addr, CRBit);
+ *(pMsg->IRDA_MSG_pHdrRead+1) = (BYTE) _MAKE_SCNTL(FrameType, PFBit, Nr);
+ }
+ else
+ {
+ pMsg->IRDA_MSG_pRead -= 2;
+ *(pMsg->IRDA_MSG_pRead) = (BYTE) _MAKE_ADDR(Addr, CRBit);
+ *(pMsg->IRDA_MSG_pRead+1) = (BYTE) _MAKE_SCNTL(FrameType, PFBit, Nr);
+ }
+ return;
+}
+
+BYTE *
+Format_SNRM(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, BYTE SAddr[],
+ BYTE DAddr[], int CAddr, IRDA_QOS_PARMS *pQos)
+{
+ BuildUHdr(pMsg, IRLAP_SNRM, Addr, CRBit, PFBit);
+
+ if (pQos != NULL)
+ {
+ pMsg->IRDA_MSG_pWrite = _PutAddr(pMsg->IRDA_MSG_pWrite, SAddr);
+ pMsg->IRDA_MSG_pWrite = _PutAddr(pMsg->IRDA_MSG_pWrite, DAddr);
+ *pMsg->IRDA_MSG_pWrite++ = CAddr << 1; // Thats what the f'n spec says
+ pMsg->IRDA_MSG_pWrite = BuildNegParms(pMsg->IRDA_MSG_pWrite, pQos);
+ }
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_DISC(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit)
+{
+ BuildUHdr(pMsg, IRLAP_DISC, Addr, CRBit, PFBit);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_UI(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit)
+{
+ BuildUHdr(pMsg, IRLAP_UI, Addr, CRBit, PFBit);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_DscvXID(IRDA_MSG *pMsg, int ConnAddr, int CRBit, int PFBit,
+ IRLAP_XID_DSCV_FORMAT *pXIDFormat,
+ CHAR DscvInfo[], int DscvInfoLen)
+{
+ if (pMsg->IRDA_MSG_pHdrRead != NULL)
+ {
+ pMsg->IRDA_MSG_pHdrRead -= 2;
+
+ ASSERT(pMsg->IRDA_MSG_pHdrRead >= pMsg->IRDA_MSG_Header);
+
+ *(pMsg->IRDA_MSG_pHdrRead) = (BYTE) _MAKE_ADDR(ConnAddr, CRBit);
+ if (CRBit)
+ *(pMsg->IRDA_MSG_pHdrRead+1)=
+ (BYTE) _MAKE_UCNTL(IRLAP_XID_CMD, PFBit);
+ else
+ *(pMsg->IRDA_MSG_pHdrRead+1)=
+ (BYTE) _MAKE_UCNTL(IRLAP_XID_RSP, PFBit);
+ }
+ else
+ {
+ pMsg->IRDA_MSG_pRead -= 2;
+ *(pMsg->IRDA_MSG_pRead) = (BYTE) _MAKE_ADDR(ConnAddr, CRBit);
+ if (CRBit)
+ *(pMsg->IRDA_MSG_pRead+1)=
+ (BYTE) _MAKE_UCNTL(IRLAP_XID_CMD, PFBit);
+ else
+ *(pMsg->IRDA_MSG_pRead+1)=
+ (BYTE) _MAKE_UCNTL(IRLAP_XID_RSP, PFBit);
+ }
+
+ *pMsg->IRDA_MSG_pWrite++ = IRLAP_XID_DSCV_FORMAT_ID;
+
+ memcpy(pMsg->IRDA_MSG_pWrite, (CHAR *) pXIDFormat,
+ sizeof(IRLAP_XID_DSCV_FORMAT) - 1); // Subtract for FirstDscvByte
+ // in structure
+ pMsg->IRDA_MSG_pWrite += sizeof(IRLAP_XID_DSCV_FORMAT) - 1;
+
+ if (DscvInfo != NULL)
+ {
+ memcpy(pMsg->IRDA_MSG_pWrite, DscvInfo, DscvInfoLen);
+ pMsg->IRDA_MSG_pWrite += DscvInfoLen;
+ }
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_TEST(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit,
+ BYTE SAddr[], BYTE DAddr[])
+{
+ BuildUHdr(pMsg, IRLAP_TEST, Addr, CRBit, PFBit);
+
+ pMsg->IRDA_MSG_pWrite = _PutAddr(pMsg->IRDA_MSG_pWrite, SAddr);
+ pMsg->IRDA_MSG_pWrite = _PutAddr(pMsg->IRDA_MSG_pWrite, DAddr);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_RNRM(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit)
+{
+ BuildUHdr(pMsg, IRLAP_RNRM, Addr, CRBit, PFBit);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_UA(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, BYTE SAddr[],
+ BYTE DAddr[], IRDA_QOS_PARMS *pQos)
+{
+ BuildUHdr(pMsg, IRLAP_UA, Addr, CRBit, PFBit);
+
+ if (SAddr != NULL)
+ {
+ pMsg->IRDA_MSG_pWrite = _PutAddr(pMsg->IRDA_MSG_pWrite, SAddr);
+ }
+ if (DAddr != NULL)
+ {
+ pMsg->IRDA_MSG_pWrite = _PutAddr(pMsg->IRDA_MSG_pWrite, DAddr);
+ }
+
+ if (pQos != NULL)
+ pMsg->IRDA_MSG_pWrite = BuildNegParms(pMsg->IRDA_MSG_pWrite, pQos);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_FRMR(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit,
+ IRLAP_FRMR_FORMAT *pFormat)
+{
+ BuildUHdr(pMsg, IRLAP_FRMR, Addr, CRBit, PFBit);
+
+ memcpy(pMsg->IRDA_MSG_pWrite, (CHAR *)pFormat,sizeof(IRLAP_FRMR_FORMAT));
+ pMsg->IRDA_MSG_pWrite += sizeof(IRLAP_FRMR_FORMAT);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_DM(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit)
+{
+ BuildUHdr(pMsg, IRLAP_DM, Addr, CRBit, PFBit);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_RD(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit)
+{
+ BuildUHdr(pMsg, IRLAP_RD, Addr, CRBit, PFBit);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_RR(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, int Nr)
+{
+ BuildSHdr(pMsg, IRLAP_RR, Addr, CRBit, PFBit, Nr);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_RNR(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, int Nr)
+{
+ BuildSHdr(pMsg, IRLAP_RNR, Addr, CRBit, PFBit, Nr);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_REJ(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, int Nr)
+{
+ BuildSHdr(pMsg, IRLAP_REJ, Addr, CRBit, PFBit, Nr);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_SREJ(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, int Nr)
+{
+ BuildSHdr(pMsg, IRLAP_SREJ, Addr, CRBit, PFBit, Nr);
+
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+BYTE *
+Format_I(IRDA_MSG *pMsg, int Addr, int CRBit, int PFBit, int Nr, int Ns)
+{
+ if (pMsg->IRDA_MSG_pHdrRead != NULL)
+ {
+ pMsg->IRDA_MSG_pHdrRead -= 2;
+
+ ASSERT(pMsg->IRDA_MSG_pHdrRead >= pMsg->IRDA_MSG_Header);
+
+ *(pMsg->IRDA_MSG_pHdrRead) = (BYTE) _MAKE_ADDR(Addr, CRBit);
+ *(pMsg->IRDA_MSG_pHdrRead+1) = (BYTE) (((Ns & 7) << 1) +
+ ((PFBit & 1)<< 4) + (Nr <<5));
+ }
+ else
+ {
+ pMsg->IRDA_MSG_pRead -= 2;
+ *(pMsg->IRDA_MSG_pRead) = (BYTE) _MAKE_ADDR(Addr, CRBit);
+ *(pMsg->IRDA_MSG_pRead+1) = (BYTE) (((Ns & 7) << 1) +
+ ((PFBit & 1)<< 4) + (Nr <<5));
+ }
+ return (pMsg->IRDA_MSG_pWrite);
+}
+
+
+// TEMP
+UINT IrlmpUp(PVOID IrlmpContext, PIRDA_MSG pIMsg)
+{
+ return 0;
+}