📄 mac_802_15_4.cpp
字号:
Mac802_15_4Reset_TRX(node, interfaceIndex); Mac802_15_4TaskSuccess(node, interfaceIndex, 'a', TRUE); } else if (mac->rxData) { if (MESSAGE_ReturnPacketSize(mac->rxData) <= aMaxSIFSFrameSize) { ifs = aMinSIFSPeriod; } else { ifs = aMinLIFSPeriod; } mac->IFST = Mac802_15_4SetTimer( node, mac, M802_15_4IFSTIMER, ifs * SECOND / PHY_GetRxDataRate(node, interfaceIndex), NULL); Mac802_15_4Reset_TRX(node, interfaceIndex); Mac802_15_4TaskSuccess(node, interfaceIndex, 'a', TRUE); } else //ack. for duplicated packet { Mac802_15_4Reset_TRX(node, interfaceIndex); Mac802_15_4TaskSuccess(node, interfaceIndex, 'a', TRUE); } } else if (mac->txPkt == mac->txBcnCmd) { wph = (M802_15_4Header*)(mac->txBcnCmd->packet); frmCtrl.FrmCtrl = wph->MHR_FrmCtrl; Mac802_15_4FrameCtrlParse(&frmCtrl); if(mac->taskP.mlme_associate_response_STEP && (wph->MSDU_CmdType == 0x02)) //association resp pkt { mac->trx_state_req = RX_ON; Phy802_15_4PlmeSetTRX_StateRequest( node, interfaceIndex, RX_ON); mac->waitBcnCmdAck = TRUE; } else if (frmCtrl.ackReq) //ack. required { mac->trx_state_req = RX_ON; Phy802_15_4PlmeSetTRX_StateRequest( node, interfaceIndex, RX_ON); mac->txT = Mac802_15_4SetTimer( node, mac, M802_15_4TXTIMER, mac->mpib.macAckWaitDuration * SECOND / PHY_GetRxDataRate(node, interfaceIndex), NULL); mac->waitBcnCmdAck = TRUE; } else //assume success if ack. not required { Mac802_15_4Reset_TRX(node, interfaceIndex); Mac802_15_4TaskSuccess(node, interfaceIndex, 'c', TRUE); } } else if (mac->txPkt == mac->txBcnCmd2) { if (mac->taskP.mlme_scan_request_STEP && ((mac->taskP.mlme_scan_request_ScanType == 0x01) || (mac->taskP.mlme_scan_request_ScanType == 0x03)) && (strcmp(mac->taskP.mlme_scan_request_frFunc, frFunc) == 0)) { Mac802_15_4mlme_scan_request( node, interfaceIndex, mac->taskP.mlme_scan_request_ScanType, mac->taskP.mlme_scan_request_ScanChannels, mac->taskP.mlme_scan_request_ScanDuration, FALSE, status); } else if (mac->taskP.mlme_start_request_STEP && (strcmp(mac->taskP.mlme_start_request_frFunc, frFunc) == 0)) { MESSAGE_Free(node, mac->txBeacon); mac->txBeacon = NULL; Mac802_15_4mlme_start_request( node, interfaceIndex, mac->taskP.mlme_start_request_PANId, mac->taskP.mlme_start_request_LogicalChannel, mac->taskP.mlme_start_request_BeaconOrder, mac->taskP.mlme_start_request_SuperframeOrder, mac->taskP.mlme_start_request_PANCoordinator, mac->taskP.mlme_start_request_BatteryLifeExtension, 0, mac->taskP.mlme_start_request_SecurityEnable, FALSE, status); } else if (mac->taskP.mlme_associate_request_STEP && (strcmp(mac->taskP.mlme_associate_request_frFunc, frFunc) == 0)) { Mac802_15_4mlme_associate_request( node, interfaceIndex, 0, 0, 0, 0, 0, mac->taskP.mlme_associate_request_SecurityEnable, FALSE, status, M802_15_4_SUCCESS); } else if (mac->taskP.mlme_poll_request_STEP && (strcmp(mac->taskP.mlme_poll_request_frFunc,frFunc) == 0)) { Mac802_15_4mlme_poll_request( node, interfaceIndex, mac->taskP.mlme_poll_request_CoordAddrMode, mac->taskP.mlme_poll_request_CoordPANId, mac->taskP.mlme_poll_request_CoordAddress, mac->taskP.mlme_poll_request_SecurityEnable, mac->taskP.mlme_poll_request_autoRequest, FALSE, status); } else //default handling { wph = (M802_15_4Header*)mac->txBcnCmd2->packet; frmCtrl.FrmCtrl = wph->MHR_FrmCtrl; Mac802_15_4FrameCtrlParse(&frmCtrl); if (frmCtrl.ackReq) //ack. required { mac->trx_state_req = RX_ON; Phy802_15_4PlmeSetTRX_StateRequest( node, interfaceIndex, RX_ON); mac->txT = Mac802_15_4SetTimer( node, mac, M802_15_4TXTIMER, mac->mpib.macAckWaitDuration * SECOND/ PHY_GetRxDataRate(node, interfaceIndex), NULL); mac->waitBcnCmdAck2 = TRUE; } else { Mac802_15_4Reset_TRX(node, interfaceIndex); Mac802_15_4TaskSuccess(node, interfaceIndex, 'C', TRUE); } } } else if (mac->txPkt == mac->txData) { if(!(mac->taskP.mcps_data_request_STEP) || !(strcmp(mac->taskP.mcps_data_request_frFunc, frFunc) == 0)) { return; } wph = (M802_15_4Header*)mac->txData->packet; frmCtrl.FrmCtrl = wph->MHR_FrmCtrl; Mac802_15_4FrameCtrlParse(&frmCtrl); if (mac->taskP.mcps_data_request_STEP) { if (mac->taskP.mcps_data_request_TxOptions & TxOp_GTS) //GTS { ; //TBD } else if ((mac->taskP.mcps_data_request_TxOptions & TxOp_Indirect) //indirect transmission && (mac->capability.FFD && (Mac802_15_4NumberDeviceLink(&mac->deviceLink1) > 0))) //Coordinator { if (!frmCtrl.ackReq) //ack. not required { Mac802_15_4mcps_data_request( node, interfaceIndex, 0, 0, 0, 0, 0, 0, 0, 0, 0, mac->taskP.mcps_data_request_TxOptions, FALSE, PHY_SUCCESS, M802_15_4_SUCCESS); } else { strcpy(mac->taskP.mcps_data_request_frFunc, "recvAck"); mac->trx_state_req = RX_ON; Phy802_15_4PlmeSetTRX_StateRequest( node, interfaceIndex, RX_ON); mac->txT = Mac802_15_4SetTimer( node, mac, M802_15_4TXTIMER, mac->mpib.macAckWaitDuration * SECOND/ PHY_GetRxDataRate(node, interfaceIndex), NULL); mac->waitDataAck = TRUE; } } else //direct transmission { Mac802_15_4mcps_data_request( node, interfaceIndex, 0, 0, 0, 0, 0, 0, 0, 0, 0, mac->taskP.mcps_data_request_TxOptions, FALSE, status, M802_15_4_SUCCESS); } } else //default handling (seems impossible) { if (frmCtrl.ackReq) //ack. required { mac->trx_state_req = RX_ON; Phy802_15_4PlmeSetTRX_StateRequest( node, interfaceIndex, RX_ON); mac->txT = Mac802_15_4SetTimer( node, mac, M802_15_4TXTIMER, mac->mpib.macAckWaitDuration * SECOND/ PHY_GetRxDataRate(node, interfaceIndex), NULL); mac->waitDataAck = TRUE; } else { Mac802_15_4Reset_TRX(node, interfaceIndex); Mac802_15_4TaskSuccess(node, interfaceIndex, 'd', TRUE); } } } } else if (strcmp(frFunc, "recvAck") == 0) { if (mac->txPkt == mac->txData) { if ((mac->taskP.mcps_data_request_STEP) && (strcmp(mac->taskP.mcps_data_request_frFunc, frFunc) == 0)) { Mac802_15_4mcps_data_request( node, interfaceIndex, 0, 0, 0, 0, 0, 0, 0, 0, 0, mac->taskP.mcps_data_request_TxOptions, FALSE, PHY_SUCCESS, M802_15_4_SUCCESS); } else //default handling for <txData> { if (mac->taskP.mcps_data_request_STEP) //seems late ACK recd { mac->taskP.mcps_data_request_STEP = 0; } Mac802_15_4Reset_TRX(node, interfaceIndex); Mac802_15_4TaskSuccess(node, interfaceIndex, 'd', TRUE); } } else if (mac->txPkt == mac->txBcnCmd2) { if (mac->taskP.mlme_associate_request_STEP && (strcmp(mac->taskP.mlme_associate_request_frFunc, frFunc) == 0)) { Mac802_15_4mlme_associate_request( node, interfaceIndex, 0, 0, 0, 0, 0, mac->taskP.mlme_associate_request_SecurityEnable, FALSE, PHY_SUCCESS, M802_15_4_SUCCESS); } else if (mac->taskP.mlme_poll_request_STEP && (strcmp(mac->taskP.mlme_poll_request_frFunc,frFunc) == 0)) { Mac802_15_4mlme_poll_request( node, interfaceIndex, mac->taskP.mlme_poll_request_CoordAddrMode, mac->taskP.mlme_poll_request_CoordPANId, mac->taskP.mlme_poll_request_CoordAddress, mac->taskP.mlme_poll_request_SecurityEnable, mac->taskP.mlme_poll_request_autoRequest, FALSE, PHY_SUCCESS); } else { Mac802_15_4TaskSuccess(node, interfaceIndex, 'C', TRUE); } } else if (mac->txPkt == mac->txBcnCmd) { wph = (M802_15_4Header*) (mac->txBcnCmd->packet); frmCtrl.FrmCtrl = wph->MHR_FrmCtrl; Mac802_15_4FrameCtrlParse(&frmCtrl); if ((frmCtrl.frmType == M802_15_4DEFFRMCTRL_TYPE_MACCMD) && (wph->MSDU_CmdType == 0x02)) //association resp pkt { Mac802_15_4mlme_associate_response( node, interfaceIndex, mac->taskP.mlme_associate_response_DeviceAddress, 0, M802_15_4_SUCCESS, 0, FALSE, PHY_SUCCESS); } else if ((frmCtrl.frmType == M802_15_4DEFFRMCTRL_TYPE_MACCMD) && (wph->MSDU_CmdType == 0x08))//coord realig resp pkt { Mac802_15_4mlme_orphan_response( node, interfaceIndex, mac->taskP.mlme_orphan_response_OrphanAddress, 0, TRUE, FALSE, FALSE, PHY_SUCCESS); } else { Mac802_15_4TaskSuccess(node, interfaceIndex, 'c', TRUE); } } } else if (strcmp(frFunc,"txHandler") == 0) { if (mac->txPkt == mac->txData) { if ((!mac->taskP.mcps_data_request_STEP) || (strcmp(mac->taskP.mcps_data_request_frFunc, "recvAck") != 0)) { //we might have been waiting for poll request if (mac->taskP.mlme_poll_request_STEP && (strcmp(mac->taskP.mlme_poll_request_frFunc, "recvAck") == 0)) { Mac802_15_4mlme_poll_request( node, interfaceIndex, mac->taskP.mlme_poll_request_CoordAddrMode, mac->taskP.mlme_poll_request_CoordPANId, mac->taskP.mlme_poll_request_CoordAddress, mac->taskP.mlme_poll_request_SecurityEnable, mac->taskP.mlme_poll_request_autoRequest, FALSE, PHY_BUSY_TX); //status can anything but SUCCESS } return; } if (mac->taskP.mcps_data_request_STEP) { if (mac->taskP.mcps_data_request_TxOptions & TxOp_GTS) //GTS transmission { ; //TBD } else if ((mac->taskP.mcps_data_request_TxOptions & TxOp_Indirect) && //indirect transmission (mac->capability.FFD && (Mac802_15_4NumberDeviceLink(&mac->deviceLink1) > 0))) //coordinator { Mac802_15_4mcps_data_request( node, interfaceIndex, 0, 0, 0, 0, 0, 0, 0, 0, 0, mac->taskP.mcps_data_request_TxOptions, FALSE, PHY_BUSY_TX, M802_15_4_NO_ACK); } else //direct transmission { Mac802_15_4mcps_data_request( node, interfaceIndex, 0, 0, 0, 0, 0, 0, 0, 0, 0, mac->taskP.mcps_data_request_TxOptions,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -