예제 #1
0
void attcProcMtuRsp(attcCcb_t *pCcb, uint16_t len, uint8_t *pPacket, attEvt_t *pEvt)
{
  uint16_t  mtu;

  BYTES_TO_UINT16(mtu, pPacket + L2C_PAYLOAD_START + ATT_HDR_LEN);

  /* verify */
  if (mtu < ATT_DEFAULT_MTU)
  {
    mtu = ATT_DEFAULT_MTU;
  }

  /* set mtu for the connection */
  attSetMtu(pCcb->pMainCcb, mtu, WSF_MIN(pAttCfg->mtu, (HciGetMaxRxAclLen() - L2C_HDR_LEN)));
}
예제 #2
0
uint8_t LlReadMaxAdvDataLen(uint16_t *pLen)
{
  LL_TRACE_INFO0("### LlApi ###  LlReadMaxAdvDataLen");

  if ((LL_API_PARAM_CHECK == 1) &&
      !LmgrIsExtCommandAllowed())
  {
    return LL_ERROR_CODE_CMD_DISALLOWED;
  }

  WSF_ASSERT(pLen);
  *pLen = WSF_MIN(pLctrRtCfg->maxExtAdvDataLen, LL_MAX_ADV_DATA_LEN);

  return LL_SUCCESS;
}
예제 #3
0
파일: smp_main.c 프로젝트: 0xc0170/mbed
uint8_t smpGetScSecLevel(smpCcb_t *pCcb)
{
  uint8_t secLevel;

  if (pCcb->auth & SMP_AUTH_MITM_FLAG)
  {
    if (WSF_MIN(pCcb->pairReq[SMP_MAXKEY_POS], pCcb->pairRsp[SMP_MAXKEY_POS]) == SMP_KEY_SIZE_MAX)
    {
      secLevel = DM_SEC_LEVEL_ENC_LESC;
    }
    else
    {
      secLevel = DM_SEC_LEVEL_ENC_AUTH;
    }
  }
  else
  {
    secLevel = DM_SEC_LEVEL_ENC;
  }

  return secLevel;
}
예제 #4
0
uint8_t LlSetExtAdvParam(uint8_t handle, LlExtAdvParam_t *pExtAdvParam)
{
  const uint16_t validAdvEventProp = 0x007F;
  const uint32_t validAdvInterMin = 0x000020;
  const uint16_t highDutyConnDirectAdvProp = LL_ADV_EVT_PROP_LEGACY_ADV_BIT |
                                             LL_ADV_EVT_PROP_HIGH_DUTY_ADV_BIT |
                                             LL_ADV_EVT_PROP_DIRECT_ADV_BIT |
                                             LL_ADV_EVT_PROP_CONN_ADV_BIT;

  /* Maximum extended advertising interval is half the maximum BB clock rollover time. */
  const uint32_t bbDurMaxUsec = BB_TICKS_TO_US(UINT64_C(1) << 31);
  const uint32_t validAdvInterMax = WSF_MIN(LL_MATH_DIV_625(bbDurMaxUsec), 0xFFFFFF);

  LL_TRACE_INFO2("### LlApi ###  LlSetExtAdvParam, handle=%u, advEventProp=0x%04x", handle, pExtAdvParam->advEventProp);

  if ((LL_API_PARAM_CHECK == 1) &&
      !LmgrIsExtCommandAllowed())
  {
    return LL_ERROR_CODE_CMD_DISALLOWED;
  }
  if ((LL_API_PARAM_CHECK == 1) &&
      (handle > LL_MAX_ADV_HANDLE))
  {
    return LL_ERROR_CODE_PARAM_OUT_OF_MANDATORY_RANGE;
  }
  if ((LL_API_PARAM_CHECK == 1) &&
      ((pExtAdvParam->priAdvInterMax < pExtAdvParam->priAdvInterMin) ||
       /* Ignore unused intervals for high duty cycle connectable directed advertising. */
       ((pExtAdvParam->advEventProp != highDutyConnDirectAdvProp) &&
        ((pExtAdvParam->priAdvInterMin < validAdvInterMin) ||
         (pExtAdvParam->priAdvInterMax < validAdvInterMin)))))
  {
    return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS;
  }
  if ((LL_API_PARAM_CHECK == 1) &&
      /* Ignore unused intervals for high duty cycle connectable directed advertising. */
      ((pExtAdvParam->advEventProp != highDutyConnDirectAdvProp) &&
       ((pExtAdvParam->priAdvInterMin > validAdvInterMax) ||
        (pExtAdvParam->priAdvInterMax > validAdvInterMax))))
  {
    return LL_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE;
  }
  if ((LL_API_PARAM_CHECK == 1) &&
      ((pExtAdvParam->advEventProp & ~validAdvEventProp) ||
       ((pExtAdvParam->advEventProp & (LL_ADV_EVT_PROP_LEGACY_ADV_BIT | LL_ADV_EVT_PROP_CONN_ADV_BIT | LL_ADV_EVT_PROP_SCAN_ADV_BIT)) ==
           (LL_ADV_EVT_PROP_CONN_ADV_BIT | LL_ADV_EVT_PROP_SCAN_ADV_BIT)) ||
       ((pExtAdvParam->advEventProp & LL_ADV_EVT_PROP_LEGACY_ADV_BIT) &&
           (pExtAdvParam->advEventProp & (LL_ADV_EVT_PROP_OMIT_AA_BIT | LL_ADV_EVT_PROP_TX_PWR_BIT)))))
  {
    return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS;
  }
  if ((LL_API_PARAM_CHECK == 1) &&
      ((pExtAdvParam->advEventProp & LL_ADV_EVT_PROP_OMIT_AA_BIT) &&
       (pExtAdvParam->advEventProp & (LL_ADV_EVT_PROP_CONN_ADV_BIT | LL_ADV_EVT_PROP_SCAN_ADV_BIT))))
  {
    /* Only non-connectable and non-scannable advertising can do anonymous advertising. */
    return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS;
  }
  if ((LL_API_PARAM_CHECK == 1) &&
      ((((pExtAdvParam->advEventProp & LL_ADV_EVT_PROP_LEGACY_ADV_BIT) != 0) &&
         (pExtAdvParam->priAdvPhy != LL_PHY_LE_1M)) ||
       (((pExtAdvParam->advEventProp & LL_ADV_EVT_PROP_LEGACY_ADV_BIT) == 0) &&
         (pExtAdvParam->priAdvPhy != LL_PHY_LE_1M) && (pExtAdvParam->priAdvPhy != LL_PHY_LE_CODED)) ||
       (((pExtAdvParam->advEventProp & LL_ADV_EVT_PROP_LEGACY_ADV_BIT) == 0) &&
         (pExtAdvParam->secAdvPhy != LL_PHY_LE_1M) && (pExtAdvParam->secAdvPhy != LL_PHY_LE_2M) && (pExtAdvParam->secAdvPhy != LL_PHY_LE_CODED))))
  {
    return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS;
  }
  if ((LL_API_PARAM_CHECK == 1) &&
      (((pExtAdvParam->secAdvPhy == LL_PHY_LE_2M) && ((lmgrCb.features & LL_FEAT_LE_2M_PHY) == 0)) ||
      (((pExtAdvParam->priAdvPhy == LL_PHY_LE_CODED) || (pExtAdvParam->secAdvPhy == LL_PHY_LE_CODED)) && ((lmgrCb.features & LL_FEAT_LE_CODED_PHY) == 0))))
  {
    return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS;
  }
  pExtAdvParam->priAdvInterMin = BB_BLE_TO_BB_TICKS(pExtAdvParam->priAdvInterMin);
  pExtAdvParam->priAdvInterMax = BB_BLE_TO_BB_TICKS(pExtAdvParam->priAdvInterMax);

  return LctrSetExtAdvParam(handle, pExtAdvParam);
}