/* * Copyright (C) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "avctp_dev.h" #include "avctp_int.h" #include "avctp_st.h" #include "log.h" #include "securec.h" /***************************************************************************** * Globle Data Define ****************************************************************************/ /***************************************************************************** * Function Define ****************************************************************************/ /* * Function AvctGetCbDevByAddress * Description This function is called to get the device block by peer device address. * Param[in] peerAddr point of the peer address * Return AvctCbDev the point of control channel block. */ AvctCbDev *AvctGetCbDevByAddress(const BtAddr *peerAddr) { LOG_INFO("[AVCT] %{public}s: ", __func__); AvctCbDev *cbDev = NULL; for (uint8_t i = 0; i < AVCT_MAX_DEVICES; i++) { if ((g_avctMng.cbDev[i].alloced) && (!memcmp((char *)g_avctMng.cbDev[i].peerAddr.addr, (char *)&(peerAddr->addr), BT_ADDR_LENGTH))) { cbDev = &g_avctMng.cbDev[i]; LOG_DEBUG("[AVCT] %{public}s: Device id is %hhu", __func__, i); break; } } return cbDev; } /* * Function AvctGetCbDevByChId * Description This function is called to get the device block by channel link id. * Param[in] chId channel link id * Return AvctCbDev the point of device block. */ AvctCbDev *AvctGetCbDevByChId(uint16_t chId) { LOG_INFO("[AVCT] %{public}s: channel id is 0x%x", __func__, chId); AvctCbDev *cbDev = NULL; for (uint8_t i = 0; i < AVCT_MAX_DEVICES; i++) { LOG_DEBUG("[AVCT] %{public}s: g_avctMng.cbDev[%hhu].chLink is %hhu", __func__, i, g_avctMng.cbDev[i].chLink); if (((g_avctMng.cbDev[i].chLink & AVCT_ALLOC_CTRL) && (g_avctMng.cbDev[i].cbCtrl->chId == chId)) || ((g_avctMng.cbDev[i].chLink & AVCT_ALLOC_BR) && (g_avctMng.cbDev[i].cbBr->chId == chId))) { cbDev = &g_avctMng.cbDev[i]; LOG_DEBUG("[AVCT] %{public}s: Device id is %hhu", __func__, i); break; } } return cbDev; } /* * Function AvctCbDevAlloc * Description This function is called to alloce memory for the device block. * Param[in] peerAddr device address. * Return AvctCbDev the point of device block. */ AvctCbDev *AvctCbDevAlloc(const BtAddr *peerAddr) { LOG_INFO("[AVCT] %{public}s:", __func__); AvctCbDev *cbDev = NULL; for (uint8_t i = 0; i < AVCT_MAX_DEVICES; i++) { if (!g_avctMng.cbDev[i].alloced) { cbDev = &g_avctMng.cbDev[i]; (void)memset_s(cbDev, sizeof(AvctCbDev), 0, sizeof(AvctCbDev)); cbDev->alloced = true; (void)memcpy_s(&(cbDev->peerAddr), sizeof(BtAddr), peerAddr, sizeof(BtAddr)); LOG_DEBUG("[AVCT] %{public}s: Device id is %hhu", __func__, i); break; } } return cbDev; } /* * Function AvctCbDevDealloc * Description This function is called to dealloce memory for the device block. * Param[in] cbDev The point to device block. * Return void */ void AvctCbDevDealloc(AvctCbDev *cbDev) { LOG_INFO("[AVCT] %{public}s: ", __func__); if (cbDev->cbCtrl != NULL) { AvctCbChDealloc(&(cbDev->cbCtrl)); } if (cbDev->cbBr != NULL) { AvctCbChDealloc(&(cbDev->cbBr)); } (void)memset_s(cbDev, sizeof(AvctCbDev), 0, sizeof(AvctCbDev)); return; } /* * Function AvctCbChAlloc * Description This function is called to alloc memory for CbCtrl. * Param[in] *connParam oint to the info of the connection request. * Such as the Role、Profile ID、Callback func point. * Param[in] void * Return AvctCbCh* channel link point. */ AvctCbCh *AvctCbChAlloc() { LOG_INFO("[AVCT] %{public}s:", __func__); AvctCbCh *cbCh = malloc(sizeof(AvctCbCh)); if (cbCh != NULL) { (void)memset_s(cbCh, sizeof(AvctCbCh), 0, sizeof(AvctCbCh)); } return cbCh; } /* * Function AvctCbChDealloc * Description This function is called to dealloc memory for CbCtrl. * Param[in] *cbCh The point of the chanel block. * Return void. */ void AvctCbChDealloc(AvctCbCh **cbCh) { LOG_INFO("[AVCT] %{public}s:", __func__); if (*cbCh != NULL) { free(*cbCh); *cbCh = NULL; } return; }