📄 irlap.c
字号:
IRLAP_LOG_ACTION((pIrlapCb, TEXT("MAC_CONTROL_REQ (dscvsense)")));
IrmacDown(pIrlapCb->pIrdaLinkCb, &IMsg);
pIrlapCb->State = DSCV_QUERY;
break;
case MAC_MEDIA_BUSY:
pIrlapCb->State = NDM;
IMsg.Prim = IRLAP_DISCOVERY_CONF;
IMsg.IRDA_MSG_pDevList = NULL;
IMsg.IRDA_MSG_DscvStatus = MAC_MEDIA_BUSY;
IrlmpUp(pIrlapCb->pIrdaLinkCb, &IMsg);
break;
default:
ASSERT(0);
return;// IRLAP_BAD_OPSTATUS;
}
break;
case CONN_MEDIA_SENSE:
switch (pMsg->IRDA_MSG_OpStatus)
{
case MAC_MEDIA_CLEAR:
// Generate a random connection address
pIrlapCb->ConnAddr = IRLAP_RAND(1, 0x7e);
pIrlapCb->RetryCnt = 0;
SendSNRM(pIrlapCb, TRUE);
IrlapTimerStart(TEXT("ProcessMACControlConf: CONN_MEDIA_SENSE"),
pIrlapCb, &pIrlapCb->FinalTimer);
pIrlapCb->State = SNRM_SENT;
break;
case MAC_MEDIA_BUSY:
pIrlapCb->State = NDM;
IMsg.Prim = IRLAP_DISCONNECT_IND;
IMsg.IRDA_MSG_DiscStatus = MAC_MEDIA_BUSY;
IrlmpUp(pIrlapCb->pIrdaLinkCb, &IMsg);
break;
default:
ASSERT(0);
return;// IRLAP_BAD_OPSTATUS;
}
break;
case DSCV_QUERY:
switch (pMsg->IRDA_MSG_OpStatus)
{
case MAC_MEDIA_CLEAR:
// Nobody responded, procede as if the slot timer expired
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Media clear, making fake slot exp")));
SlotTimerExp(pIrlapCb);
break;
case MAC_MEDIA_BUSY:
// Some responding, give'm more time
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Media busy, starting slot timer")));
IrlapTimerStart(TEXT("ProcessMACControlConf: DSCV_QUERY"),
pIrlapCb, &pIrlapCb->SlotTimer);
break;
}
break;
default:
IRLAP_LOG_ACTION((pIrlapCb, TEXT("Ignoring in this state")));
}
}
/*****************************************************************************
*
* ProcessMACDataInd - Processes MAC Data
*
*
*/
VOID
ProcessMACDataInd(PIRLAP_CB pIrlapCb, PIRDA_MSG pMsg, BOOLEAN *pFreeMsg)
{
int Addr = (int) IRLAP_GET_ADDR(*(pMsg->IRDA_MSG_pRead));
int CRBit = (int) IRLAP_GET_CRBIT(*(pMsg->IRDA_MSG_pRead));
int Cntl = (int) *(pMsg->IRDA_MSG_pRead + 1);
int PFBit = IRLAP_GET_PFBIT(Cntl);
UINT Ns = IRLAP_GET_NS(Cntl);
UINT Nr = IRLAP_GET_NR(Cntl);
int XIDFormatID = (int) *(pMsg->IRDA_MSG_pRead+2);
IRLAP_XID_DSCV_FORMAT *pXIDFormat = (IRLAP_XID_DSCV_FORMAT *)
(pMsg->IRDA_MSG_pRead + 3);
IRLAP_SNRM_FORMAT *pSNRMFormat = (IRLAP_SNRM_FORMAT *)
(pMsg->IRDA_MSG_pRead + 2);
IRLAP_UA_FORMAT *pUAFormat = (IRLAP_UA_FORMAT *)
(pMsg->IRDA_MSG_pRead + 2);
if (Addr != pIrlapCb->ConnAddr && Addr != IRLAP_BROADCAST_CONN_ADDR)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Ignoring, connection address %02X"), Addr));
return;
}
pIrlapCb->StatusSent = FALSE;
pIrlapCb->Frmr.CntlField = Cntl; // for later maybe
// Peer has sent a frame so clear the NoResponse condition
if (pIrlapCb->NoResponse)
{
pIrlapCb->NoResponse = FALSE;
pIrlapCb->RetryCnt = 0;
pIrlapCb->WDogExpCnt = 0;
//IndicateLinkStatus(pIrlapCb, LINK_STATUS_CONNECTED);
}
switch (IRLAP_FRAME_TYPE(Cntl))
{
/*****************/
case IRLAP_I_FRAME:
/*****************/
IRLAP_LOG_ACTION((pIrlapCb, TEXT("I-frame")));
ProcessIFrame(pIrlapCb, pMsg, CRBit, PFBit, Ns, Nr, pFreeMsg);
return;
/*****************/
case IRLAP_S_FRAME:
/*****************/
switch (IRLAP_GET_SCNTL(Cntl))
{
/*-----------*/
case IRLAP_RR:
case IRLAP_RNR:
/*-----------*/
IRLAP_LOG_ACTION((pIrlapCb, TEXT("RR/RNR-frame")));
ProcessRR_RNR(pIrlapCb, IRLAP_GET_SCNTL(Cntl),
pMsg, CRBit, PFBit, Nr);
return;
/*------------*/
case IRLAP_SREJ:
case IRLAP_REJ:
/*------------*/
IRLAP_LOG_ACTION((pIrlapCb, TEXT("SJREJ/REJ-frame")));
ProcessREJ_SREJ(pIrlapCb, IRLAP_GET_SCNTL(Cntl),
pMsg, CRBit, PFBit, Nr);
return;
}
break;
/*****************/
case IRLAP_U_FRAME:
/*****************/
switch (IRLAP_GET_UCNTL(Cntl))
{
/*---------------*/
case IRLAP_XID_CMD:
/*---------------*/
// Should always be a command
if (CRBit != IRLAP_CMD)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Received XID cmd with CRBit = rsp")));
ASSERT(0);
return; // IRLAP_XID_CMD_RSP;
}
// Poll bit should always be set
if (PFBit != IRLAP_PFBIT_SET)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Received XID command without Poll set")));
ASSERT(0);
return; // IRLAP_XID_CMD_NOT_P;
}
if (XIDFormatID == IRLAP_XID_DSCV_FORMAT_ID)
{
// Slot No is less than max slot or 0xff
if (pXIDFormat->SlotNo>IrlapSlotTable[pXIDFormat->NoOfSlots]
&& pXIDFormat->SlotNo != IRLAP_END_DSCV_SLOT_NO)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Invalid slot number %d"),
pXIDFormat->SlotNo));
ASSERT(0);
return;// IRLAP_BAD_SLOTNO;
}
IRLAP_LOG_ACTION((pIrlapCb, TEXT("DscvXIDCmd")));
ProcessDscvXIDCmd(pIrlapCb, pXIDFormat,
pMsg->IRDA_MSG_pWrite);
return;
}
else
{
return; // ignore per errata
}
/*---------------*/
case IRLAP_XID_RSP:
/*---------------*/
if (XIDFormatID == IRLAP_XID_DSCV_FORMAT_ID)
{
IRLAP_LOG_ACTION((pIrlapCb, TEXT("DscvXIDRsp")));
ProcessDscvXIDRsp(pIrlapCb, pXIDFormat,pMsg->IRDA_MSG_pWrite);
return;
}
else
{
return; // ignore per errata
}
/*------------*/
case IRLAP_SNRM: // or IRLAP_RNRM
/*------------*/
if (IRLAP_PFBIT_SET != PFBit)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Received SNRM/RNRM without P set")));
return;// IRLAP_SNRM_NOT_P;
}
if (IRLAP_CMD == CRBit)
{
IRLAP_LOG_ACTION((pIrlapCb, TEXT("SNRM")));
ProcessSNRM(pIrlapCb, pSNRMFormat, pMsg->IRDA_MSG_pWrite);
return;
}
else
{
ProcessRNRM(pIrlapCb);
return;
}
/*----------*/
case IRLAP_UA:
/*----------*/
if (CRBit != IRLAP_RSP)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Received UA as a command")));
return;// IRLAP_UA_NOT_RSP;
}
if (PFBit != IRLAP_PFBIT_SET)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Received UA without F set")));
return;// IRLAP_UA_NOT_F;
}
IRLAP_LOG_ACTION((pIrlapCb, TEXT("UA")));
ProcessUA(pIrlapCb, pUAFormat, pMsg->IRDA_MSG_pWrite);
return;
/*------------*/
case IRLAP_DISC: // or IRLAP_RD
/*------------*/
if (IRLAP_PFBIT_SET != PFBit)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Received DISC/RD command without Poll set")));
return;// IRLAP_DISC_CMD_NOT_P;
}
if (IRLAP_CMD == CRBit)
{
IRLAP_LOG_ACTION((pIrlapCb, TEXT("DISC")));
ProcessDISC(pIrlapCb);
return;
}
else
{
IRLAP_LOG_ACTION((pIrlapCb, TEXT("RD")));
ProcessRD(pIrlapCb);
return;
}
/*----------*/
case IRLAP_UI:
/*----------*/
IRLAP_LOG_ACTION((pIrlapCb, TEXT("UI")));
ProcessUI(pIrlapCb, pMsg, CRBit, PFBit);
return;
/*------------*/
case IRLAP_TEST:
/*------------*/
IRLAP_LOG_ACTION((pIrlapCb, TEXT("TEST")));
ProcessTEST(pIrlapCb, pMsg, pUAFormat, CRBit, PFBit);
return;
/*------------*/
case IRLAP_FRMR:
/*------------*/
if (IRLAP_RSP != CRBit)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Received FRMR cmd (must be resp)")));
return;// IRLAP_FRMR_RSP_CMD;
}
if (IRLAP_PFBIT_SET != PFBit)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Received FRMR resp without Final set")));
return;// IRLAP_FRMR_RSP_NOT_F;
}
IRLAP_LOG_ACTION((pIrlapCb, TEXT("FRMR")));
ProcessFRMR(pIrlapCb);
return;
/*----------*/
case IRLAP_DM:
/*----------*/
if (IRLAP_RSP != CRBit)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Received DM command (must be response)")));
return;// IRLAP_DM_RSP_CMD;
}
if (IRLAP_PFBIT_SET != PFBit)
{
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Received DM response without Final set")));
return;// IRLAP_DM_RSP_NOT_F;
}
IRLAP_LOG_ACTION((pIrlapCb, TEXT("DM")));
ProcessDM(pIrlapCb);
return;
}
break;
}
}
/*****************************************************************************
*
* ProcessDscvXIDCmd - Process received XID Discovery command
*
*/
VOID
ProcessDscvXIDCmd(PIRLAP_CB pIrlapCb,
IRLAP_XID_DSCV_FORMAT *pXidFormat,
UCHAR *pEndDscvInfoUCHAR)
{
IRDA_MSG IMsg;
if (!MyDevAddr(pIrlapCb, pXidFormat->DestAddr))
{
/* IRLAP_LOG_ACTION((pIrlapCb, TEXT("Ignoring XID addressed to:%02X%02X%02X%02X"),
EXPAND_ADDR(pXidFormat->DestAddr)));*/
IRLAP_LOG_ACTION((pIrlapCb, TEXT("Ignoring XID addressed to %X"),
pXidFormat->DestAddr));
return;
}
if (pXidFormat->SlotNo == IRLAP_END_DSCV_SLOT_NO)
{
pIrlapCb->GenNewAddr = FALSE;
switch (pIrlapCb->State)
{
case DSCV_QUERY:
IrlapTimerStop(TEXT("ProcessDscvXIDCmd: DSCV_QUERY"),
pIrlapCb, &pIrlapCb->SlotTimer);
IMsg.Prim = IRLAP_DISCOVERY_CONF;
IMsg.IRDA_MSG_pDevList = NULL;
IMsg.IRDA_MSG_DscvStatus =
IRLAP_REMOTE_DISCOVERY_IN_PROGRESS;
IrlmpUp(pIrlapCb->pIrdaLinkCb, &IMsg);
// fall through. Send indication to LMP
case DSCV_REPLY:
if (pIrlapCb->State == DSCV_REPLY)
{
IrlapTimerStop(TEXT("ProcessDscvXIDCmd: DSCV_REPLY"),
pIrlapCb, &pIrlapCb->QueryTimer);
}
// Place the device information in the control block
ExtractDeviceInfo(&pIrlapCb->RemoteDevice, pXidFormat,
pEndDscvInfoUCHAR);
if (!DevInDevList(pXidFormat->SrcAddr, &pIrlapCb->DevList))
{
AddDevToList(pIrlapCb, pXidFormat, pEndDscvInfoUCHAR);
}
// Notifiy LMP
pIrlapCb->State = NDM;
IMsg.Prim = IRLAP_DISCOVERY_IND;
IMsg.IRDA_MSG_pDevList = &pIrlapCb->DevList;
IrlmpUp(pIrlapCb->pIrdaLinkCb, &IMsg);
break;
default:
IRLAP_LOG_ACTION((pIrlapCb,
TEXT("Ignoring End XID in this state")));
}
}
else // in middle of discovery process
{
switch (pIrlapCb->State)
{
case DSCV_MEDIA_SENSE:
IMsg.Prim = IRLAP_DISCOVERY_CONF;
IMsg.IRDA_MSG_pDevList = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -