123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546 |
- #include "ZComDef.h"
- #include "OSAL.h"
- #include "ZMAC.h"
- #include "MT_MAC.h"
- #include "hal_mcu.h"
- #if !defined NONWK
- #include "nwk.h"
- #include "nwk_bufs.h"
- #include "ZGlobals.h"
- #endif
- #if defined( MACSIM )
- #include "mac_sim.h"
- #endif
- #include "mac_security.h"
- #include "mac_main.h"
- extern void *ZMac_ScanBuf;
- #if !defined NONWK
- const uint8 CODE zmacCBSizeTable [] = {
- 0,
- sizeof(ZMacAssociateInd_t),
- sizeof(ZMacAssociateCnf_t),
- 0,
- 0,
- sizeof(macMlmeBeaconNotifyInd_t),
- sizeof(ZMacOrphanInd_t),
- sizeof(ZMacScanCnf_t),
- sizeof(ZMacStartCnf_t),
- 0,
- sizeof(ZMacPollCnf_t),
- sizeof(ZMacCommStatusInd_t),
- sizeof(ZMacDataCnf_t),
- sizeof(macMcpsDataInd_t),
- 0,
- 0,
- sizeof(ZMacPollInd_t)
- };
- #endif
- static ZMacLqiAdjust_t lqiAdjMode = LQI_ADJ_OFF;
- #if !defined NONWK
- static void ZMacLqiAdjust( uint8 corr, uint8* lqi );
- #endif
- uint8 (*pZMac_AppCallback)( uint8 *msgPtr ) = (void*)NULL;
- void MAC_CbackEvent(macCbackEvent_t *pData)
- #ifndef MT_MAC_CB_FUNC
- {
- #if !defined NONWK
- uint8 event = pData->hdr.event;
- uint16 tmp = zmacCBSizeTable[event];
- macCbackEvent_t *msgPtr;
-
- if (tmp == 0)
- {
- return;
- }
-
- if ( event == MAC_MCPS_DATA_IND )
- {
- MAC_MlmeGetReq( MAC_SHORT_ADDRESS, &tmp );
- if ((tmp == INVALID_NODE_ADDR) || (tmp == NWK_BROADCAST_SHORTADDR_DEVALL) ||
- (pData->dataInd.msdu.len == 0))
- {
- mac_msg_deallocate( (uint8 **)&pData );
- return;
- }
- msgPtr = pData;
- }
- else
- {
- if (event == MAC_MLME_BEACON_NOTIFY_IND )
- {
- tmp += sizeof(macPanDesc_t) + pData->beaconNotifyInd.sduLength;
- }
- else if (event == MAC_MLME_SCAN_CNF)
- {
- if (pData->scanCnf.scanType == ZMAC_ED_SCAN)
- {
- tmp += ZMAC_ED_SCAN_MAXCHANNELS;
- }
- else
- {
- tmp += sizeof( ZMacPanDesc_t ) * pData->scanCnf.resultListSize;
- }
- }
- if ( !(msgPtr = (macCbackEvent_t *)osal_msg_allocate(tmp)) )
- {
-
- if ((event == MAC_MCPS_DATA_CNF) && (pData->dataCnf.pDataReq != NULL))
- {
- halIntState_t intState;
-
-
- HAL_ENTER_CRITICAL_SECTION( intState );
- mac_msg_deallocate( (uint8**)&(pData->dataCnf.pDataReq) );
- if ( !(msgPtr = (macCbackEvent_t *)osal_msg_allocate(tmp)) )
- {
-
- HAL_EXIT_CRITICAL_SECTION( intState );
- return;
- }
- HAL_EXIT_CRITICAL_SECTION( intState );
- }
- else
- {
-
- return;
- }
- }
- osal_memcpy(msgPtr, pData, zmacCBSizeTable[event]);
- }
- if ( event == MAC_MLME_BEACON_NOTIFY_IND )
- {
- macMlmeBeaconNotifyInd_t *pBeacon = (macMlmeBeaconNotifyInd_t*)msgPtr;
- osal_memcpy(pBeacon+1, pBeacon->pPanDesc, sizeof(macPanDesc_t));
- pBeacon->pPanDesc = (macPanDesc_t *)(pBeacon+1);
- osal_memcpy(pBeacon->pPanDesc+1, pBeacon->pSdu, pBeacon->sduLength);
- pBeacon->pSdu = (uint8 *)(pBeacon->pPanDesc+1);
- }
- else if (event == MAC_MLME_SCAN_CNF)
- {
- macMlmeScanCnf_t *pScan = (macMlmeScanCnf_t*)msgPtr;
- if (ZMac_ScanBuf != NULL)
- {
- void *pTmp = ZMac_ScanBuf;
- ZMac_ScanBuf = NULL;
- if (pScan->scanType == ZMAC_ED_SCAN)
- {
- pScan->result.pEnergyDetect = (uint8*) (pScan + 1);
- osal_memcpy(pScan->result.pEnergyDetect, pTmp, ZMAC_ED_SCAN_MAXCHANNELS);
- }
- else
- {
- pScan->result.pPanDescriptor = (macPanDesc_t*) (pScan + 1);
- osal_memcpy(pScan + 1, pTmp, sizeof( ZMacPanDesc_t ) * pScan->resultListSize);
- }
- osal_mem_free(pTmp);
- }
- }
- if ( ( pZMac_AppCallback == NULL ) || ( pZMac_AppCallback( (uint8 *)msgPtr ) == FALSE ) )
- {
-
- if ( event == MAC_MCPS_DATA_IND )
- {
- uint8 fcFrameType = (pData->dataInd.msdu.p[0] & 0x03);
- uint8 fcProtoVer = ((pData->dataInd.msdu.p[0] >> 2) & 0x0F);
- uint8 fcReserve = (pData->dataInd.msdu.p[1] & 0xE0);
- if ( (fcFrameType > 0x01) || (fcProtoVer != _NIB.nwkProtocolVersion) || (fcReserve != 0)
- || (pData->dataInd.mac.srcAddr.addrMode != SADDR_MODE_SHORT) )
- {
-
- mac_msg_deallocate( (uint8 **)&pData );
- return;
- }
- else
- {
- macDataInd_t *pInd = &msgPtr->dataInd.mac;
-
- ZMacLqiAdjust( pInd->correlation, &pInd->mpduLinkQuality );
-
- if ( (pData->dataInd.mac.dstAddr.addr.shortAddr == 0xFFFF)
- && (pData->dataInd.msdu.p[6] > 1) )
- {
-
- if ( nwk_broadcastSend( (uint8 *)msgPtr ) != SUCCESS )
- {
-
- mac_msg_deallocate( (uint8 **)&pData );
- }
- return;
- }
- }
- }
- else if ((event == MAC_MCPS_DATA_CNF) && (pData->hdr.status != MAC_NO_RESOURCES))
- {
- macMcpsDataCnf_t *pCnf = &msgPtr->dataCnf;
-
- if (pCnf->pDataReq->internal.txOptions & MAC_TXOPTION_ACK)
- {
-
- ZMacLqiAdjust( pCnf->correlation, &pCnf->mpduLinkQuality );
- }
- }
-
- osal_msg_send( NWK_TaskID, (uint8 *)msgPtr );
- }
- if ((event == MAC_MCPS_DATA_CNF) && (pData->dataCnf.pDataReq != NULL))
- {
-
-
-
- mac_msg_deallocate( (uint8**)&(pData->dataCnf.pDataReq) );
- }
- #endif
- }
- #else
- {
-
- switch (pData->hdr.event)
- {
- case MAC_MLME_ASSOCIATE_IND:
- if ( _macCallbackSub & CB_ID_NWK_ASSOCIATE_IND )
- nwk_MTCallbackSubNwkAssociateInd ( (ZMacAssociateInd_t *)pData );
- break;
- case MAC_MLME_ASSOCIATE_CNF:
- if ( _macCallbackSub & CB_ID_NWK_ASSOCIATE_CNF )
- nwk_MTCallbackSubNwkAssociateCnf ( (ZMacAssociateCnf_t *)pData );
- break;
- case MAC_MLME_DISASSOCIATE_IND:
- if ( _macCallbackSub & CB_ID_NWK_DISASSOCIATE_IND )
- nwk_MTCallbackSubNwkDisassociateInd ( (ZMacDisassociateInd_t *)pData );
- break;
- case MAC_MLME_DISASSOCIATE_CNF:
- if ( _macCallbackSub & CB_ID_NWK_DISASSOCIATE_CNF )
- nwk_MTCallbackSubNwkDisassociateCnf ( (ZMacDisassociateCnf_t *)pData );
- break;
- case MAC_MLME_BEACON_NOTIFY_IND:
- if ( _macCallbackSub & CB_ID_NWK_BEACON_NOTIFY_IND )
- nwk_MTCallbackSubNwkBeaconNotifyInd( (ZMacBeaconNotifyInd_t *)pData );
- break;
- case MAC_MLME_ORPHAN_IND:
- if ( _macCallbackSub & CB_ID_NWK_ORPHAN_IND )
- nwk_MTCallbackSubNwkOrphanInd( (ZMacOrphanInd_t *) pData );
- break;
- case MAC_MLME_SCAN_CNF:
- if ( _macCallbackSub & CB_ID_NWK_SCAN_CNF )
- {
- pData->scanCnf.result.pEnergyDetect = ZMac_ScanBuf;
- nwk_MTCallbackSubNwkScanCnf ( (ZMacScanCnf_t *) pData );
- }
- if (ZMac_ScanBuf != NULL)
- {
- void *pTmp = ZMac_ScanBuf;
- ZMac_ScanBuf = NULL;
- osal_mem_free(pTmp);
- }
- break;
- case MAC_MLME_START_CNF:
- if ( _macCallbackSub & CB_ID_NWK_START_CNF )
- nwk_MTCallbackSubNwkStartCnf ( pData->hdr.status );
- break;
- case MAC_MLME_SYNC_LOSS_IND:
- if ( _macCallbackSub & CB_ID_NWK_SYNC_LOSS_IND )
- nwk_MTCallbackSubNwkSyncLossInd( (ZMacSyncLossInd_t *) pData );
- break;
- case MAC_MLME_POLL_CNF:
- if ( _macCallbackSub & CB_ID_NWK_POLL_CNF )
- nwk_MTCallbackSubNwkPollCnf( pData->hdr.status );
- break;
- case MAC_MLME_COMM_STATUS_IND:
- if ( _macCallbackSub & CB_ID_NWK_COMM_STATUS_IND )
- nwk_MTCallbackSubCommStatusInd ( (ZMacCommStatusInd_t *) pData );
- break;
- case MAC_MCPS_DATA_CNF:
- if (pData->dataCnf.pDataReq != NULL)
- mac_msg_deallocate((uint8**)&pData->dataCnf.pDataReq);
- if ( _macCallbackSub & CB_ID_NWK_DATA_CNF )
- nwk_MTCallbackSubNwkDataCnf( (ZMacDataCnf_t *) pData );
- break;
- case MAC_MCPS_DATA_IND:
- {
-
- ZMacDataInd_t *pDataInd = (ZMacDataInd_t *) pData;
- uint8 event, status, len, *msdu;
-
- event = pData->hdr.event;
- status = pData->hdr.status;
- len = pData->dataInd.msdu.len;
- msdu = pData->dataInd.msdu.p;
-
- osal_memcpy(&pDataInd->Sec, &pData->dataInd.sec, sizeof(ZMacSec_t));
-
-
- osal_memcpy(&pDataInd->SrcAddr, &pData->dataInd.mac.srcAddr, sizeof(zAddrType_t));
- osal_memcpy(&pDataInd->DstAddr, &pData->dataInd.mac.dstAddr, sizeof(zAddrType_t));
- pDataInd->Timestamp = pData->dataInd.mac.timestamp;
- pDataInd->Timestamp2 = pData->dataInd.mac.timestamp2;
- pDataInd->SrcPANId = pData->dataInd.mac.srcPanId;
- pDataInd->DstPANId = pData->dataInd.mac.dstPanId;
- pDataInd->mpduLinkQuality = pData->dataInd.mac.mpduLinkQuality;
- pDataInd->Correlation = pData->dataInd.mac.correlation;
- pDataInd->Rssi = pData->dataInd.mac.rssi;
- pDataInd->Dsn = pData->dataInd.mac.dsn;
-
- pDataInd->hdr.Status = status;
- pDataInd->hdr.Event = event;
- pDataInd->msduLength = len;
- if (len)
- pDataInd->msdu = msdu;
- else
- pDataInd->msdu = NULL;
- if ( _macCallbackSub & CB_ID_NWK_DATA_IND )
- nwk_MTCallbackSubNwkDataInd ( pDataInd );
- }
-
- mac_msg_deallocate( (uint8 **)&pData );
- break;
- case MAC_MCPS_PURGE_CNF:
- if ( _macCallbackSub & CB_ID_NWK_PURGE_CNF )
- nwk_MTCallbackSubNwkPurgeCnf( (ZMacPurgeCnf_t *) pData);
- break;
- default:
- break;
- }
- }
- #endif
- uint8 MAC_CbackCheckPending(void)
- {
- #if !defined (NONWK)
- if ( ZSTACK_ROUTER_BUILD )
- {
- return (nwkDB_ReturnIndirectHoldingCnt());
- }
- else
- {
- return (0);
- }
- #else
- return (0);
- #endif
- }
- ZMacLqiAdjust_t ZMacLqiAdjustMode( ZMacLqiAdjust_t mode )
- {
- if ( mode != LQI_ADJ_GET )
- {
- lqiAdjMode = mode;
- }
- return ( lqiAdjMode );
- }
- #if !defined NONWK
- static void ZMacLqiAdjust( uint8 corr, uint8 *lqi )
- {
- if ( lqiAdjMode != LQI_ADJ_OFF )
- {
- uint16 adjLqi = *lqi;
-
- if ( corr < LQI_CORR_MIN )
- {
- corr = LQI_CORR_MIN;
- }
- else if ( corr > LQI_CORR_MAX )
- {
- corr = LQI_CORR_MAX;
- }
- if ( lqiAdjMode == LQI_ADJ_MODE1 )
- {
-
- adjLqi = (adjLqi * (corr - LQI_CORR_MIN)) / (LQI_CORR_MAX - LQI_CORR_MIN);
- }
- else if ( lqiAdjMode == LQI_ADJ_MODE2 )
- {
-
- }
-
- *lqi = (adjLqi > 255) ? 255 : (uint8)adjLqi;
- }
- }
- #endif
|