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))); }
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; }
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; }
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); }