MSA_AssociateRsp((macCbackEvent_t*)pMsg);

/**************************************************************************************************
 *
 * @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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值