/**************************************************************************************************
*
* @fn MSA_AssociateRsp()
*
* @brief This routine is called by Associate_Ind inorder to return the response to the device
*
* @param pMsg - pointer to the structure recieved by MAC_MLME_ASSOCIATE_IND
*
* @return None msa_NumOfDevices
*
**************************************************************************************************/
uint8 MSA_AssociateRsp(macCbackEvent_t* pMsg)
{
uint8 i, addrFlag = 0, rt = 0, curFlag = 0;
bool isNeedNewAddr = TRUE;
uint16 assocShortAddress = 0xffff;
for(i = 0; i < MSA_MAX_DEVICE_NUM; i++) //限定数量
{
if(msa_DeviceRecord[i].devShortAddr != 0) //存储这一层给下一层分配的地址
{
/* compare the two mac address to avoid the waste of short address */
if(sAddrExtCmp(msa_DeviceRecord[i].devMacAddr, pMsg->associateInd.deviceAddress))
{
/* Assign the short address for the Device, from pool */
assocShortAddress = msa_DevShortAddrList[i];
break;
}
curFlag++;
}
/* record the first free address */
else
{
/* save the first free space */
if(isNeedNewAddr)
{
addrFlag = i;
isNeedNewAddr = FALSE;
}
/* if we reach the current number of device and still can't find duplicate device, then break the loop */
if(curFlag >= msa_NumOfDevices)
{
break;
}
}
}/* end for */
/* assign a new short address to the device */
if(!isNeedNewAddr)
{
/* Assign the short address for the Device, from pool */
assocShortAddress = msa_DevShortAddrList[addrFlag];
/* Build the record for this device */
msa_DeviceRecord[addrFlag].devShortAddr = msa_DevShortAddrList[addrFlag];
sAddrExtCpy(msa_DeviceRecord[addrFlag].devMacAddr, pMsg->associateInd.deviceAddress);
msa_DeviceRecord[addrFlag].dsn = 0;
msa_DeviceRecord[addrFlag].checkCount = 0;
rt = addrFlag;
msa_NumOfDevices++;
}
/* If the number of devices are more than MAX_DEVICE_NUM, turn off the association permit */
if (msa_NumOfDevices == MSA_MAX_DEVICE_NUM)
{
MAC_MlmeSetReq(MAC_ASSOCIATION_PERMIT, &msa_MACFalse);
}
/* Fill in association respond message */
sAddrExtCpy(msa_AssociateRsp.deviceAddress, pMsg->associateInd.deviceAddress);
msa_AssociateRsp.assocShortAddress = assocShortAddress;
msa_AssociateRsp.status = MAC_SUCCESS;
msa_AssociateRsp.sec.securityLevel = MAC_SEC_LEVEL_NONE;
/* Call Associate Response */
MAC_MlmeAssociateRsp(&msa_AssociateRsp);
return rt;
}
07-13
07-13
07-13
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交