LCOV - code coverage report
Current view: top level - base_comm/resources/hccp/rdma_service/ctx - rs_ub.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 25.2 % 1490 375
Test Date: 2026-07-28 12:11:00 Functions: 28.6 % 84 24

            Line data    Source code
       1              : /**
       2              :  * Copyright (c) 2025 Huawei Technologies Co., Ltd.
       3              :  * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
       4              :  * CANN Open Software License Agreement Version 2.0 (the "License").
       5              :  * Please refer to the License for details. You may not use this file except in compliance with the License.
       6              :  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
       7              :  * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
       8              :  * See LICENSE in the root of the software repository for the full text of the License.
       9              :  */
      10              : 
      11              : #include <unistd.h>
      12              : #include <stdlib.h>
      13              : #include <sys/types.h>
      14              : #include <netinet/in.h>
      15              : #include <arpa/inet.h>
      16              : #include <dlfcn.h>
      17              : #include <urma_opcode.h>
      18              : #include <udma_u_ctl.h>
      19              : #include "securec.h"
      20              : #include "user_log.h"
      21              : #include "dl_urma_function.h"
      22              : #include "ra_rs_err.h"
      23              : #include "ra_rs_ctx.h"
      24              : #include "rs_inner.h"
      25              : #include "rs_epoll.h"
      26              : #include "rs_ctx_inner.h"
      27              : #include "rs_ctx.h"
      28              : #include "rs_ub_jetty.h"
      29              : #include "rs_ub_jfc.h"
      30              : #include "rs_ub.h"
      31              : 
      32            0 : int RsUbGetDevEidInfoNum(unsigned int phyId, unsigned int *num)
      33              : {
      34            0 :     urma_eid_info_t *eidList = NULL;
      35            0 :     urma_device_t **devList = NULL;
      36            0 :     unsigned int totalNum = 0;
      37            0 :     unsigned int eidNum = 0;
      38            0 :     int devNum = 0;
      39            0 :     int ret = 0;
      40            0 :     int i = 0;
      41              : 
      42            0 :     ret = RsUbApiInit();
      43            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_ub_api_init failed, ret:%d", ret), ret);
      44              : 
      45            0 :     devList = RsUrmaGetDeviceList(&devNum);
      46            0 :     if (devList == NULL) {
      47            0 :         hccp_err("rs_urma_get_device_list failed, errno:%d", errno);
      48            0 :         ret = -EINVAL;
      49            0 :         goto ub_api_deinit;
      50              :     }
      51              : 
      52            0 :     for (i = 0; i < devNum; i++) {
      53            0 :         eidList = RsUrmaGetEidList(devList[i], &eidNum);
      54              :         // normal case, should continue to get eid_list from the rest of device
      55            0 :         if (eidList == NULL) {
      56            0 :             hccp_warn("rs_urma_get_eid_list i=%u unsuccessful, eidList is NULL, errno:%d", i, errno);
      57            0 :             continue;
      58              :         }
      59              : 
      60            0 :         totalNum += eidNum;
      61            0 :         RsUrmaFreeEidList(eidList);
      62              :     }
      63              : 
      64            0 :     *num = totalNum;
      65              : 
      66            0 :     RsUrmaFreeDeviceList(devList);
      67            0 : ub_api_deinit:
      68            0 :     RsUbApiDeinit();
      69            0 :     return ret;
      70              : }
      71              : 
      72            0 : STATIC int RsUbCreateCtx(urma_device_t *urmaDev, unsigned int eidIndex, urma_context_t **urmaCtx)
      73              : {
      74            0 :     *urmaCtx = RsUrmaCreateContext(urmaDev, eidIndex);
      75            0 :     CHK_PRT_RETURN(*urmaCtx == NULL, hccp_err("rs_urma_create_context failed! errno:%d, eidIndex:%u",
      76              :         errno, eidIndex), -ENODEV);
      77              : 
      78            0 :     return 0;
      79              : }
      80              : 
      81            1 : int RsUbGetUeInfo(urma_context_t *urmaCtx, struct DevBaseAttr *devAttr)
      82              : {
      83              : #ifdef CUSTOM_INTERFACE
      84            1 :     struct udma_u_ue_info ueInfo = {0};
      85            1 :     urma_user_ctl_out_t out = {0};
      86            1 :     urma_user_ctl_in_t in = {0};
      87              :     int ret;
      88              : 
      89            1 :     in.opcode = UDMA_U_USER_CTL_QUERY_UE_INFO;
      90            1 :     out.addr = (uint64_t)(uintptr_t)&ueInfo;
      91            1 :     out.len = sizeof(struct udma_u_ue_info);
      92            1 :     ret = RsUrmaUserCtl(urmaCtx, &in, &out);
      93            1 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_user_ctl query ue info failed! ret:%d errno:%d", ret, errno), -EOPENSRC);
      94              : 
      95            1 :     devAttr->ub.dieId = ueInfo.die_id;
      96            1 :     devAttr->ub.chipId = ueInfo.chip_id;
      97            1 :     devAttr->ub.funcId = ueInfo.ue_id;
      98            1 :     hccp_info("func_id:%u, chipId:%u, dieId:%u", devAttr->ub.funcId, devAttr->ub.chipId, devAttr->ub.dieId);
      99              : #endif
     100            1 :     return 0;
     101              : }
     102              : 
     103            0 : STATIC int RsUbFillDevEidInfoList(struct HccpDevEidInfo *totalList, unsigned int index, urma_device_t *device,
     104              :     urma_eid_info_t *eidInfo)
     105              : {
     106            0 :     struct DevBaseAttr devAttr = {0};
     107            0 :     urma_context_t *urmaCtx = NULL;
     108            0 :     int ret = 0;
     109              : 
     110            0 :     totalList[index].eidIndex = eidInfo->eid_index;
     111            0 :     totalList[index].type = device->type;
     112              : 
     113            0 :     (void)memcpy_s(totalList[index].eid.raw, sizeof(totalList[index].eid.raw), eidInfo->eid.raw,
     114              :         sizeof(eidInfo->eid.raw));
     115              : 
     116            0 :     ret = strcpy_s(totalList[index].name, DEV_EID_INFO_MAX_NAME, device->name);
     117            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("strcpy device name failed, ret:%d", ret), -ESAFEFUNC);
     118              : 
     119            0 :     ret = RsUbCreateCtx(device, eidInfo->eid_index, &urmaCtx);
     120            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_ub_create_ctx failed, ret:%d, eidIndex:%u", ret, eidInfo->eid_index), ret);
     121              : 
     122            0 :     ret = RsUbGetUeInfo(urmaCtx, &devAttr);
     123            0 :     if (ret != 0) {
     124            0 :         hccp_err("rs_ub_get_ue_info failed, ret:%d", ret);
     125            0 :         goto free_ctx;
     126              :     }
     127              : 
     128            0 :     totalList[index].dieId = devAttr.ub.dieId;
     129            0 :     totalList[index].chipId = devAttr.ub.chipId;
     130            0 :     totalList[index].funcId = devAttr.ub.funcId;
     131              : 
     132            0 : free_ctx:
     133            0 :     (void)RsUrmaDeleteContext(urmaCtx);
     134            0 :     return ret;
     135              : }
     136              : 
     137            0 : STATIC int RsUbFillInfoByEidList(urma_device_t *currDev, unsigned int *index, struct HccpDevEidInfo *totalList,
     138              :     unsigned int totalNum)
     139              : {
     140            0 :     urma_eid_info_t *eidList = NULL;
     141            0 :     urma_device_attr_t attr = {0};
     142            0 :     unsigned int eidNum = 0;
     143              :     unsigned int j;
     144            0 :     int ret = 0;
     145              : 
     146            0 :     ret = RsUrmaQueryDevice(currDev, &attr);
     147            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("RsUrmaQueryDevice failed, ret:%d, errno:%d", ret, errno), -EOPENSRC);
     148              : 
     149            0 :     eidList = RsUrmaGetEidList(currDev, &eidNum);
     150              :     // normal case, should continue to get eid_list from the rest of device
     151            0 :     if (eidList == NULL) {
     152            0 :         hccp_warn("rs_urma_get_eid_list unsuccessful, eidList is NULL, errno:%d", errno);
     153            0 :         return 0;
     154              :     }
     155              : 
     156            0 :     for (j = 0; j < eidNum; j++) {
     157            0 :         if (*index >= totalNum) {
     158            0 :             hccp_err("index out of range, index:%u, totalNum:%u", *index, totalNum);
     159            0 :             ret = -EINVAL;
     160            0 :             goto free_eid_list;
     161              :         }
     162            0 :         ret = RsUbFillDevEidInfoList(totalList, *index, currDev, &eidList[j]);
     163            0 :         if (ret != 0) {
     164            0 :             hccp_err("rs_ub_fill_dev_eid_info_list failed, index:%u, ret:%d", *index, ret);
     165            0 :             goto free_eid_list;
     166              :         }
     167            0 :         totalList[*index].devFeature = attr.dev_cap.feature.value;
     168            0 :         *index += 1;
     169              :     }
     170              : 
     171            0 : free_eid_list:
     172            0 :     RsUrmaFreeEidList(eidList);
     173            0 :     return ret;
     174              : }
     175              : 
     176            0 : int RsUbGetDevEidInfoList(unsigned int phyId, struct HccpDevEidInfo infoList[], unsigned int startIndex,
     177              :     unsigned int count)
     178              : {
     179            0 :     struct HccpDevEidInfo *totalList = NULL;
     180            0 :     urma_device_t **devList = NULL;
     181            0 :     unsigned int totalNum = 0;
     182            0 :     unsigned int index = 0;
     183              :     int devNum, ret, i;
     184              : 
     185            0 :     ret = RsUbApiInit();
     186            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_ub_api_init failed, ret:%d", ret), ret);
     187              : 
     188            0 :     ret = RsUbGetDevEidInfoNum(phyId, &totalNum);
     189            0 :     if ((ret != 0) || (startIndex > UINT_MAX - count) || (startIndex + count > totalNum)) {
     190            0 :         hccp_err("rs_ub_get_dev_eid_info_num failed ret:%d data size exceeds the max offset range "
     191              :             "or start_index:%u + count:%u > total_num:%u", ret, startIndex, count, totalNum);
     192            0 :         ret = -EINVAL;
     193            0 :         goto ub_api_deinit;
     194              :     }
     195              : 
     196            0 :     totalList = calloc(totalNum, sizeof(struct HccpDevEidInfo));
     197            0 :     if (totalList == NULL) {
     198            0 :         hccp_err("calloc total_list failed, errno:%d", errno);
     199            0 :         ret = -ENOMEM;
     200            0 :         goto ub_api_deinit;
     201              :     }
     202              : 
     203            0 :     devList = RsUrmaGetDeviceList(&devNum);
     204            0 :     if (devList == NULL) {
     205            0 :         hccp_err("rs_urma_get_device_list failed, errno: %d", errno);
     206            0 :         ret = -EINVAL;
     207            0 :         goto free_total_list;
     208              :     }
     209              : 
     210            0 :     for (i = 0; i < devNum; i++) {
     211            0 :         ret = RsUbFillInfoByEidList(devList[i], &index, totalList, totalNum);
     212            0 :         if (ret != 0) {
     213            0 :             goto free_dev_list;
     214              :         }
     215              :     }
     216              : 
     217              :     // start_index + count <= total_num make sure count is valid
     218            0 :     (void)memcpy_s(infoList, sizeof(struct HccpDevEidInfo) * count,
     219            0 :         totalList + startIndex, sizeof(struct HccpDevEidInfo) * count);
     220              : 
     221            0 : free_dev_list:
     222            0 :     RsUrmaFreeDeviceList(devList);
     223            0 : free_total_list:
     224            0 :     free(totalList);
     225            0 :     totalList = NULL;
     226            0 : ub_api_deinit:
     227            0 :     RsUbApiDeinit();
     228            0 :     return ret;
     229              : }
     230              : 
     231            2 : int RsUbGetDevCb(struct rs_cb *rscb, unsigned int devIndex, struct RsUbDevCb **devCb)
     232              : {
     233            2 :     struct RsUbDevCb *devCbCurr = NULL;
     234            2 :     struct RsUbDevCb *devCbNext = NULL;
     235              : 
     236            2 :     RS_LIST_GET_HEAD_ENTRY(devCbCurr, devCbNext, &rscb->udevList, list, struct RsUbDevCb);
     237            3 :     for (; (&devCbCurr->list) != &rscb->udevList;
     238            1 :          devCbCurr = devCbNext,
     239            1 :          devCbNext = list_entry(devCbNext->list.next, struct RsUbDevCb, list)) {
     240            2 :         if (devCbCurr->index == devIndex) {
     241            1 :             *devCb = devCbCurr;
     242            1 :             return 0;
     243              :         }
     244              :     }
     245              : 
     246            1 :     *devCb = NULL;
     247            1 :     hccp_err("dev_cb for devIndex:0x%x do not available!", devIndex);
     248            1 :     return -ENODEV;
     249              : }
     250              : 
     251            0 : STATIC int RsUbGetDevAttr(struct RsUbDevCb *devCb, struct DevBaseAttr *devAttr, unsigned int *devIndex)
     252              : {
     253            0 :     urma_device_attr_t attr = {0};
     254              :     int ret;
     255              :     int i;
     256              : 
     257            0 :     ret = RsUrmaQueryDevice(devCb->urmaDev, &attr);
     258            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_query_device failed ret:%d", ret), -EOPENSRC);
     259              : 
     260            0 :     devAttr->sqMaxDepth = attr.dev_cap.max_jfs_depth;
     261            0 :     devAttr->rqMaxDepth = attr.dev_cap.max_jfr_depth;
     262            0 :     devAttr->sqMaxSge = attr.dev_cap.max_jfs_sge;
     263            0 :     devAttr->rqMaxSge = attr.dev_cap.max_jfr_sge;
     264            0 :     devAttr->ub.maxJfsInlineLen = attr.dev_cap.max_jfs_inline_len;
     265            0 :     devAttr->ub.maxJfsRsge = attr.dev_cap.max_jfs_rsge;
     266            0 :     devAttr->maxReadSize = attr.dev_cap.max_read_size;
     267            0 :     devAttr->maxWriteSize = attr.dev_cap.max_write_size;
     268            0 :     devAttr->maxMsgSize = attr.dev_cap.max_msg_size;
     269            0 :     devAttr->ub.rmTpCap.value = attr.dev_cap.rm_tp_cap.value;
     270            0 :     devAttr->ub.rcTpCap.value = attr.dev_cap.rc_tp_cap.value;
     271            0 :     devAttr->ub.umTpCap.value = attr.dev_cap.um_tp_cap.value;
     272            0 :     devAttr->ub.tpFeat.value = attr.dev_cap.tp_feature.value;
     273            0 :     for (i = 0; i < MAX_PRIORITY_CNT && i < URMA_MAX_PRIORITY_CNT; i++) {
     274            0 :         devAttr->ub.priorityInfo[i].SL = attr.dev_cap.priority_info[i].SL;
     275            0 :         devAttr->ub.priorityInfo[i].tpType.value = attr.dev_cap.priority_info[i].tp_type.value;
     276              :     }
     277            0 :     ret = RsUbGetUeInfo(devCb->urmaCtx, devAttr);
     278            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_ub_get_ue_info failed ret:%d", ret), -EOPENSRC);
     279              : 
     280            0 :     (void)memcpy_s(&devCb->devAttr, sizeof(struct DevBaseAttr), devAttr, sizeof(struct DevBaseAttr));
     281            0 :     devCb->rscb->devCnt++;
     282            0 :     *devIndex = RsGenerateDevIndex(devCb->rscb->devCnt, devAttr->ub.dieId, devAttr->ub.funcId);
     283            0 :     devCb->index = *devIndex;
     284              : 
     285            0 :     hccp_info("max_jetty:%u, maxJfsInlineLen:%u, sqMaxDepth:%u, rqMaxDepth:%u, sqMaxSge:%u, rqMaxSge:%u "
     286              :         "maxReadSize:%u maxWriteSize:%u maxMsgSize:%llu", attr.dev_cap.max_jetty,
     287              :         devAttr->ub.maxJfsInlineLen, devAttr->sqMaxDepth, devAttr->rqMaxDepth, devAttr->sqMaxSge, devAttr->rqMaxSge,
     288              :         devAttr->maxReadSize, devAttr->maxWriteSize, devAttr->maxMsgSize);
     289            0 :     return 0;
     290              : }
     291              : 
     292            0 : STATIC int RsUbDevShareJfrInit(struct RsUbDevCb *devCb)
     293              : {
     294            0 :     urma_jfc_cfg_t jfcCfg = {0};
     295            0 :     urma_jfr_cfg_t jfrCfg = {0};
     296            0 :     int randNum = 0;
     297              :     int ret;
     298              : 
     299            0 :     jfcCfg.depth = CQ_DEFAULT_MIN_RECV_DEPTH;
     300            0 :     devCb->shareJfc = RsUrmaCreateJfc(devCb->urmaCtx, &jfcCfg);
     301            0 :     CHK_PRT_RETURN(devCb->shareJfc == NULL, hccp_err("RsUrmaCreateJfc failed, errno:%d", errno), -ENOMEM);
     302              : 
     303            0 :     jfrCfg.depth = CQ_DEFAULT_MIN_RECV_DEPTH;
     304            0 :     jfrCfg.flag.bs.tag_matching = URMA_NO_TAG_MATCHING;
     305            0 :     jfrCfg.trans_mode = URMA_TM_RM;
     306            0 :     jfrCfg.max_sge = QP_DEFAULT_MIN_CAP_RECV_SGE;
     307            0 :     jfrCfg.min_rnr_timer = URMA_TYPICAL_MIN_RNR_TIMER;
     308            0 :     jfrCfg.jfc = devCb->shareJfc;
     309            0 :     ret = RsDrvGetRandomNum(&randNum);
     310            0 :     if (ret != 0) {
     311            0 :         hccp_err("RsDrvGetRandomNum failed, ret:%d", ret);
     312            0 :         goto delete_jfc;
     313              :     }
     314            0 :     jfrCfg.token_value.token = (uint32_t)randNum;
     315            0 :     devCb->shareJfr = RsUrmaCreateJfr(devCb->urmaCtx, &jfrCfg);
     316            0 :     if (devCb->shareJfr == NULL) {
     317            0 :         hccp_err("RsUrmaCreateJfr failed, errno:%d", errno);
     318            0 :         ret = -ENOMEM;
     319            0 :         goto delete_jfc;
     320              :     }
     321              : 
     322            0 :     return 0;
     323              : 
     324            0 : delete_jfc:
     325            0 :     RsUrmaDeleteJfc(devCb->shareJfc);
     326            0 :     devCb->shareJfc = NULL;
     327            0 :     return ret;
     328              : }
     329              : 
     330            0 : STATIC void RsUbDevShareJfrDeinit(struct RsUbDevCb *devCb)
     331              : {
     332            0 :     (void)RsUrmaDeleteJfr(devCb->shareJfr);
     333            0 :     devCb->shareJfr = NULL;
     334            0 :     (void)RsUrmaDeleteJfc(devCb->shareJfc);
     335            0 :     devCb->shareJfc = NULL;
     336            0 : }
     337              : 
     338            0 : STATIC int RsUbDevCbInit(struct CtxInitAttr *attr, struct RsUbDevCb *devCb, struct rs_cb *rscb,
     339              :     unsigned int *devIndex, struct DevBaseAttr *devAttr)
     340              : {
     341              :     int ret;
     342              : 
     343            0 :     devCb->rscb = rscb;
     344            0 :     devCb->phyId = attr->phyId;
     345            0 :     devCb->eidIndex = attr->ub.eidIndex;
     346            0 :     devCb->eid = attr->ub.eid;
     347              : 
     348            0 :     ret = pthread_mutex_init(&devCb->mutex, NULL);
     349            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("mutex_init failed ret:%d", ret), -ESYSFUNC);
     350              : 
     351            0 :     RS_INIT_LIST_HEAD(&devCb->asyncEventList);
     352            0 :     RS_INIT_LIST_HEAD(&devCb->jfceList);
     353            0 :     RS_INIT_LIST_HEAD(&devCb->jfcList);
     354            0 :     RS_INIT_LIST_HEAD(&devCb->jettyList);
     355            0 :     RS_INIT_LIST_HEAD(&devCb->rjettyList);
     356            0 :     RS_INIT_LIST_HEAD(&devCb->tokenIdList);
     357            0 :     RS_INIT_LIST_HEAD(&devCb->lsegList);
     358            0 :     RS_INIT_LIST_HEAD(&devCb->rsegList);
     359              : 
     360            0 :     ret = RsUbCreateCtx(devCb->urmaDev, attr->ub.eidIndex, &(devCb->urmaCtx));
     361            0 :     if (ret != 0) {
     362            0 :         hccp_err("rs_ub_create_ctx failed, ret:%d", ret);
     363            0 :         goto destroy_mutex;
     364              :     }
     365              : 
     366            0 :     ret = RsUbDevShareJfrInit(devCb);
     367            0 :     if (ret != 0) {
     368            0 :         hccp_err("RsUbDevShareJfrInit failed, ret:%d", ret);
     369            0 :         goto close_dev;
     370              :     }
     371              : 
     372            0 :     ret = RsEpollCtl(devCb->rscb->connCb.epollfd, EPOLL_CTL_ADD, devCb->urmaCtx->async_fd, EPOLLIN | EPOLLRDHUP);
     373            0 :     if (ret != 0) {
     374            0 :         hccp_err("rs_epoll_ctl failed, ret:%d fd:%d", ret, devCb->urmaCtx->async_fd);
     375            0 :         goto free_share_jfr;
     376              :     }
     377              : 
     378            0 :     ret = RsUbGetDevAttr(devCb, devAttr, devIndex);
     379            0 :     if (ret != 0) {
     380            0 :         hccp_err("rs_ub_get_dev_attr failed, ret:%d", ret);
     381            0 :         goto epoll_del;
     382              :     }
     383              : 
     384            0 :     return 0;
     385              : 
     386            0 : epoll_del:
     387            0 :     (void)RsEpollCtl(devCb->rscb->connCb.epollfd, EPOLL_CTL_DEL, devCb->urmaCtx->async_fd, EPOLLIN | EPOLLRDHUP);
     388            0 : free_share_jfr:
     389            0 :     RsUbDevShareJfrDeinit(devCb);
     390            0 : close_dev:
     391            0 :     (void)RsUrmaDeleteContext(devCb->urmaCtx);
     392            0 : destroy_mutex:
     393            0 :     pthread_mutex_destroy(&devCb->mutex);
     394            0 :     return ret;
     395              : }
     396              : 
     397            1 : int RsUbCtxInit(struct rs_cb *rsCb, struct CtxInitAttr *attr, unsigned int *devIndex,
     398              :     struct DevBaseAttr *devAttr)
     399              : {
     400            1 :     struct RsUbDevCb *devCb = NULL;
     401              :     urma_eid_t eid;
     402              :     int ret;
     403              : 
     404            1 :     ret = RsUbApiInit();
     405            1 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_ub_api_init failed, ret:%d", ret), ret);
     406              : 
     407            1 :     devCb = calloc(1, sizeof(struct RsUbDevCb));
     408            1 :     if (devCb == NULL) {
     409            0 :         hccp_err("calloc for dev_cb failed, errno:%d", errno);
     410            0 :         ret = -ENOMEM;
     411            0 :         goto ub_api_deinit;
     412              :     }
     413              : 
     414            1 :     (void)memcpy_s(eid.raw, sizeof(eid.raw), attr->ub.eid.raw, sizeof(attr->ub.eid.raw));
     415              : 
     416            1 :     devCb->urmaDev = RsUrmaGetDeviceByEid(eid, URMA_TRANSPORT_UB);
     417            1 :     if (devCb->urmaDev == NULL) {
     418            1 :         hccp_err("rs_urma_get_device_by_eid failed, urmaDev is NULL, errno:%d eid:%016llx:%016llx", errno,
     419              :             (unsigned long long)be64toh(eid.in6.subnet_prefix), (unsigned long long)be64toh(eid.in6.interface_id));
     420            1 :         ret = -EINVAL;
     421            1 :         goto free_dev_cb;
     422              :     }
     423              : 
     424            0 :     ret = RsSensorNodeRegister(attr->phyId, rsCb);
     425            0 :     if (ret != 0) {
     426            0 :         hccp_err("rs_sensor_node_register failed, phyId(%u), ret(%d)", attr->phyId, ret);
     427            0 :         goto free_dev_cb;
     428              :     }
     429              : 
     430            0 :     ret = RsUbDevCbInit(attr, devCb, rsCb, devIndex, devAttr);
     431            0 :     if (ret != 0) {
     432            0 :         RsSensorNodeUnregister(devCb->rscb);
     433            0 :         hccp_err("rs_ub_dev_cb_init failed ret:%d, eidIndex:%u eid:%016llx:%016llx", ret, attr->ub.eidIndex,
     434              :             (unsigned long long)be64toh(eid.in6.subnet_prefix), (unsigned long long)be64toh(eid.in6.interface_id));
     435            0 :         goto free_dev_cb;
     436              :     }
     437              : 
     438            0 :     RS_PTHREAD_MUTEX_LOCK(&rsCb->mutex);
     439            0 :     RsListAddTail(&devCb->list, &rsCb->udevList);
     440            0 :     RS_PTHREAD_MUTEX_ULOCK(&rsCb->mutex);
     441              : 
     442            0 :     hccp_run_info("[init][rs_ctx]phy_id:%u, eidIndex:%u, devIndex:0x%x init success", attr->phyId,
     443              :         attr->ub.eidIndex, *devIndex);
     444              : 
     445            0 :     return 0;
     446              : 
     447            1 : free_dev_cb:
     448            1 :     free(devCb);
     449            1 :     devCb = NULL;
     450            1 : ub_api_deinit:
     451            1 :     RsUbApiDeinit();
     452            1 :     return ret;
     453              : }
     454              : 
     455            2 : int RsUbGetEidByIp(struct RsUbDevCb *devCb, struct IpInfo ip[], union HccpEid eid[], unsigned int *num)
     456              : {
     457            2 :     urma_net_addr_t netAddr = {0};
     458            2 :     unsigned int ipNum = *num;
     459            2 :     urma_eid_t urmaEid = {0};
     460              :     unsigned int i;
     461            2 :     int ret = 0;
     462              : 
     463            2 :     *num = 0;
     464           34 :     for (i = 0; i < ipNum; i++) {
     465           33 :         netAddr.sin_family = (sa_family_t)ip[i].family;
     466           33 :         if (netAddr.sin_family == AF_INET) {
     467           32 :             netAddr.in4 = ip[i].ip.addr;
     468              :         } else {
     469            1 :             netAddr.in6 = ip[i].ip.addr6;
     470              :         }
     471           33 :         ret = RsUrmaGetEidByIp(devCb->urmaCtx, &netAddr, &urmaEid);
     472           33 :         CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_get_eid_by_ip failed, ret:%d devIndex:0x%x", ret, devCb->index),
     473              :             -EOPENSRC);
     474           32 :         (void)memcpy_s(eid[i].raw, sizeof(union HccpEid), urmaEid.raw, sizeof(urma_eid_t));
     475           32 :         (*num)++;
     476              :     }
     477              : 
     478            1 :     return ret;
     479              : }
     480              : 
     481            0 : STATIC int RsUbGetJfcCb(struct RsUbDevCb *devCb, unsigned long long addr, struct RsCtxJfcCb **jfcCb)
     482              : {
     483            0 :     struct RsCtxJfcCb **tempJfcCb = jfcCb;
     484            0 :     struct RsCtxJfcCb *jfcCbCurr = NULL;
     485            0 :     struct RsCtxJfcCb *jfcCbNext = NULL;
     486              : 
     487            0 :     RS_LIST_GET_HEAD_ENTRY(jfcCbCurr, jfcCbNext, &devCb->jfcList, list, struct RsCtxJfcCb);
     488            0 :     for (; (&jfcCbCurr->list) != &devCb->jfcList;
     489            0 :         jfcCbCurr = jfcCbNext,
     490            0 :         jfcCbNext = list_entry(jfcCbNext->list.next, struct RsCtxJfcCb, list)) {
     491            0 :         if (jfcCbCurr->jfcAddr == addr) {
     492            0 :             *tempJfcCb = jfcCbCurr;
     493            0 :             return 0;
     494              :         }
     495              :     }
     496              : 
     497            0 :     *tempJfcCb = NULL;
     498            0 :     hccp_err("jfc_cb for jfc_addr:0x%llx do not available!", addr);
     499              : 
     500            0 :     return -ENODEV;
     501              : }
     502              : 
     503            0 : STATIC int RsUbFreeJfcCb(struct RsUbDevCb *devCb, struct RsCtxJfcCb *jfcCb)
     504              : {
     505            0 :     urma_jfc_t *urmaJfc = NULL;
     506            0 :     int ret = 0;
     507              : 
     508            0 :     RsListDel(&jfcCb->list);
     509            0 :     devCb->jfcCnt--;
     510              : 
     511            0 :     if (jfcCb->jfcType == JFC_MODE_STARS_POLL || jfcCb->jfcType == JFC_MODE_CCU_POLL ||
     512            0 :         jfcCb->jfcType == JFC_MODE_USER_CTL_NORMAL) {
     513            0 :         (void)RsUbDeleteJfcExt(devCb, jfcCb);
     514            0 :         hccp_info("[deinit][rs_jfc]destroy success, dev jfcCnt:%u", devCb->jfcCnt);
     515            0 :     } else if (jfcCb->jfcType == JFC_MODE_NORMAL) {
     516            0 :         urmaJfc = (urma_jfc_t *)(uintptr_t)jfcCb->jfcAddr;
     517            0 :         (void)RsUrmaDeleteJfc(urmaJfc);
     518            0 :         hccp_info("[deinit][rs_jfc]destroy success, dev jfcCnt:%u", devCb->jfcCnt);
     519              :     } else {
     520            0 :         hccp_err("jfc_type:%d is invalid, not support!", jfcCb->jfcType);
     521            0 :         ret = -EINVAL;
     522              :     }
     523              : 
     524            0 :     free(jfcCb);
     525            0 :     jfcCb = NULL;
     526            0 :     return ret;
     527              : }
     528              : 
     529            1 : int RsUbCtxJfcDestroy(struct RsUbDevCb *devCb, unsigned long long addr)
     530              : {
     531            1 :     struct RsCtxJfcCb *jfcCb = NULL;
     532              :     int ret;
     533              : 
     534            1 :     hccp_info("[deinit][rs_jfc]destroy addr:0x%llx", addr);
     535              : 
     536            1 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
     537            1 :     ret = RsUbGetJfcCb(devCb, addr, &jfcCb);
     538            1 :     if (ret != 0) {
     539            1 :         hccp_err("get jfc_cb failed, ret:%d, jfc addr:0x%llx", ret, addr);
     540            1 :         goto out;
     541              :     }
     542              : 
     543            0 :     ret = RsUbFreeJfcCb(devCb, jfcCb);
     544            1 : out:
     545            1 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
     546            1 :     return ret;
     547              : }
     548              : 
     549            0 : STATIC void RsUbFreeJfcCbList(struct RsUbDevCb *devCb, struct RsListHead *jfcList)
     550              : {
     551            0 :     struct RsCtxJfcCb *jfcCurr = NULL;
     552            0 :     struct RsCtxJfcCb *jfcNext = NULL;
     553              :     int ret;
     554              : 
     555            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
     556            0 :     if (!RsListEmpty(jfcList)) {
     557            0 :         hccp_warn("jfc list do not empty!");
     558            0 :         RS_LIST_GET_HEAD_ENTRY(jfcCurr, jfcNext, jfcList, list, struct RsCtxJfcCb);
     559            0 :         for (; (&jfcCurr->list) != jfcList;
     560            0 :             jfcCurr = jfcNext, jfcNext = list_entry(jfcNext->list.next, struct RsCtxJfcCb, list)) {
     561            0 :             ret = RsUbFreeJfcCb(devCb, jfcCurr);
     562            0 :             if (ret != 0) {
     563            0 :                 hccp_err("rs_ub_free_jfc_cb failed, ret:%d", ret);
     564              :             }
     565              :         }
     566              :     }
     567            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
     568            0 : }
     569              : 
     570            0 : STATIC int RsUbFreeSegCb(struct RsUbDevCb *devCb, struct RsSegCb *segCb)
     571              : {
     572              :     int ret;
     573              : 
     574            0 :     ret = RsUrmaUnregisterSeg(segCb->segment);
     575            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_unregister_seg failed ret:%d", ret), -EOPENSRC);
     576              : 
     577            0 :     RsListDel(&segCb->list);
     578            0 :     devCb->lsegCnt--;
     579            0 :     free(segCb);
     580            0 :     segCb = NULL;
     581              : 
     582            0 :     return 0;
     583              : }
     584              : 
     585            0 : STATIC void RsUbFreeSegCbList(struct RsUbDevCb *devCb, struct RsListHead *lsegList,
     586              :                                    struct RsListHead *rsegList)
     587              : {
     588            0 :     struct RsSegCb *segCurr = NULL;
     589            0 :     struct RsSegCb *segNext = NULL;
     590              :     int ret;
     591              : 
     592            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
     593            0 :     if (!RsListEmpty(lsegList)) {
     594            0 :         hccp_warn("lseg list do not empty!");
     595            0 :         RS_LIST_GET_HEAD_ENTRY(segCurr, segNext, lsegList, list, struct RsSegCb);
     596            0 :         for (; (&segCurr->list) != lsegList;
     597            0 :             segCurr = segNext, segNext = list_entry(segNext->list.next, struct RsSegCb, list)) {
     598            0 :             ret = RsUbFreeSegCb(devCb, segCurr);
     599            0 :             if (ret != 0) {
     600            0 :                 hccp_err("rs_ub_free_seg_cb failed, ret:%d", ret);
     601              :             }
     602              :         }
     603              :     }
     604            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
     605              : 
     606            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
     607            0 :     if (!RsListEmpty(rsegList)) {
     608            0 :         hccp_warn("rseg list do not empty!");
     609            0 :         RS_LIST_GET_HEAD_ENTRY(segCurr, segNext, rsegList, list, struct RsSegCb);
     610            0 :         for (; (&segCurr->list) != rsegList;
     611            0 :             segCurr = segNext, segNext = list_entry(segNext->list.next, struct RsSegCb, list)) {
     612            0 :             (void)RsUrmaUnimportSeg(segCurr->segment);
     613            0 :             RsListDel(&segCurr->list);
     614            0 :             free(segCurr);
     615            0 :             segCurr = NULL;
     616              :         }
     617              :     }
     618            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
     619            0 : }
     620              : 
     621            0 : STATIC void RsUbCtxFreeJettyCb(struct RsCtxJettyCb *jettyCb)
     622              : {
     623            0 :     struct RsCtxJettyCb *tmpJettyCb = jettyCb;
     624              : 
     625              : #ifdef CUSTOM_INTERFACE
     626            0 :     if (jettyCb->qpShareInfoAddr != NULL) {
     627            0 :         (void)DlHalBuffFree((void *)(uintptr_t)jettyCb->qpShareInfoAddr);
     628            0 :         jettyCb->qpShareInfoAddr = NULL;
     629              :     }
     630              : #endif
     631              : 
     632            0 :     pthread_mutex_destroy(&tmpJettyCb->crErrInfo.mutex);
     633            0 :     pthread_mutex_destroy(&tmpJettyCb->mutex);
     634            0 :     free(tmpJettyCb);
     635            0 :     tmpJettyCb = NULL;
     636            0 : }
     637              : 
     638            0 : STATIC void RsUbCtxDrvJettyDelete(struct RsCtxJettyCb *jettyCb)
     639              : {
     640            0 :     if (jettyCb->jettyMode == JETTY_MODE_URMA_NORMAL) {
     641            0 :         (void)RsUrmaDeleteJetty(jettyCb->jetty);
     642              :     } else {
     643            0 :         RsUbCtxExtJettyDelete(jettyCb);
     644              :     }
     645              : 
     646              :     // ccu jetty unreg db addr
     647            0 :     if (jettyCb->jettyMode == JETTY_MODE_CCU || jettyCb->jettyMode == JETTY_MODE_CCU_TA_CACHE) {
     648            0 :         (void)RsUbCtxLmemUnreg(jettyCb->devCb, jettyCb->dbSegHandle);
     649              :     }
     650            0 : }
     651              : 
     652            0 : STATIC int RsUbFreeRemJettyCb(struct RsUbDevCb *devCb, struct RsCtxRemJettyCb *rjettyCb)
     653              : {
     654            0 :     unsigned int remJettyId = rjettyCb->tjetty->id.id;
     655            0 :     unsigned int devIndex = devCb->index;
     656              :     int ret;
     657              : 
     658            0 :     RsListDel(&rjettyCb->list);
     659            0 :     devCb->rjettyCnt--;
     660              : 
     661            0 :     ret = RsUrmaUnimportJetty(rjettyCb->tjetty);
     662            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_unimport_jetty failed, ret:%d, devIndex:0x%x, remJettyId %u",
     663              :         ret, devIndex, remJettyId), -EOPENSRC);
     664              : 
     665            0 :     free(rjettyCb);
     666            0 :     rjettyCb = NULL;
     667              : 
     668            0 :     return 0;
     669              : }
     670              : 
     671            0 : STATIC void RsUbUnbindJettyCbList(struct RsUbDevCb *devCb, struct RsListHead *jettyList)
     672              : {
     673            0 :     struct RsCtxJettyCb *jettyCurr = NULL;
     674            0 :     struct RsCtxJettyCb *jettyNext = NULL;
     675              :     int ret;
     676              : 
     677            0 :     if (!RsListEmpty(jettyList)) {
     678            0 :         hccp_warn("jetty list do not empty! start to unbind");
     679            0 :         RS_LIST_GET_HEAD_ENTRY(jettyCurr, jettyNext, jettyList, list, struct RsCtxJettyCb);
     680            0 :         for (; (&jettyCurr->list) != jettyList;
     681            0 :             jettyCurr = jettyNext, jettyNext = list_entry(jettyNext->list.next, struct RsCtxJettyCb, list)) {
     682              :             // no need to unbind
     683            0 :             if (jettyCurr->state != RS_JETTY_STATE_BIND) {
     684            0 :                 continue;
     685              :             }
     686            0 :             hccp_info("jetty_id[%u] will be unbind", jettyCurr->jetty->jetty_id.id);
     687            0 :             ret = RsUrmaUnbindJetty(jettyCurr->jetty);
     688            0 :             if (ret != 0) {
     689            0 :                 hccp_err("rs_urma_unbind_jetty failed, ret:%d errno:%d devIndex:0x%x jetty_id:%u",
     690              :                     ret, errno, devCb->index, jettyCurr->jetty->jetty_id.id);
     691              :             }
     692            0 :             jettyCurr->state = RS_JETTY_STATE_CREATED;
     693              :         }
     694              :     }
     695            0 : }
     696              : 
     697            0 : STATIC void RsUbUnimportJettyCbList(struct RsUbDevCb *devCb, struct RsListHead *rjettyList)
     698              : {
     699            0 :     struct RsCtxRemJettyCb *remJettyCurr = NULL;
     700            0 :     struct RsCtxRemJettyCb *remJettyNext = NULL;
     701              :     int ret;
     702              : 
     703            0 :     if (!RsListEmpty(rjettyList)) {
     704            0 :         hccp_warn("rjetty list do not empty! start to unimport");
     705            0 :         RS_LIST_GET_HEAD_ENTRY(remJettyCurr, remJettyNext, rjettyList, list, struct RsCtxRemJettyCb);
     706            0 :         for (; (&remJettyCurr->list) != rjettyList;
     707            0 :             remJettyCurr = remJettyNext, remJettyNext = list_entry(remJettyNext->list.next,
     708              :             struct RsCtxRemJettyCb, list)) {
     709              :             // no need to unimport
     710            0 :             if (remJettyCurr->state != RS_JETTY_STATE_IMPORTED) {
     711            0 :                 continue;
     712              :             }
     713            0 :             hccp_info("rjetty_id[%u] will be destroyed", remJettyCurr->tjetty->id.id);
     714            0 :             ret = RsUbFreeRemJettyCb(devCb, remJettyCurr);
     715            0 :             if (ret != 0) {
     716            0 :                 hccp_err("rs_ub_ctx_jetty_unimport failed, ret:%d", ret);
     717              :             }
     718              :         }
     719              :     }
     720            0 : }
     721              : 
     722            7 : STATIC int RsUbCallocJettyBatchInfo(struct JettyDestroyBatchInfo *batchInfo, unsigned int num)
     723              : {
     724            7 :     batchInfo->jettyCbArr = calloc(num, sizeof(struct RsCtxJettyCb *));
     725            7 :     CHK_PRT_RETURN(batchInfo->jettyCbArr == NULL, hccp_err("calloc jetty_cb_arr failed"), -ENOMEM);
     726            7 :     batchInfo->jettyArr = calloc(num, sizeof(urma_jetty_t *));
     727            7 :     CHK_PRT_RETURN(batchInfo->jettyArr == NULL, hccp_err("calloc jetty_arr failed"), -ENOMEM);
     728              : 
     729            7 :     return 0;
     730              : }
     731              : 
     732            8 : STATIC void RsUbFreeJettyBatchInfo(struct JettyDestroyBatchInfo *batchInfo)
     733              : {
     734            8 :     if (batchInfo->jettyCbArr != NULL) {
     735            7 :         free(batchInfo->jettyCbArr);
     736            7 :         batchInfo->jettyCbArr = NULL;
     737              :     }
     738            8 :     if (batchInfo->jettyArr != NULL) {
     739            7 :         free(batchInfo->jettyArr);
     740            7 :         batchInfo->jettyArr = NULL;
     741              :     }
     742            8 : }
     743              : 
     744            0 : STATIC void RsUbFreeJettyCbBatch(struct JettyDestroyBatchInfo *batchInfo, unsigned int *num,
     745              :     urma_jetty_t *badJetty, urma_jfr_t *badJfr)
     746              : {
     747            0 :     unsigned int jettyDestroyNum = *num;
     748              :     unsigned int i;
     749              : 
     750            0 :     for (i = 0; i < *num; ++i) {
     751              :         // ccu jetty unreg db addr
     752            0 :         if (batchInfo->jettyCbArr[i]->jettyMode == JETTY_MODE_CCU ||
     753            0 :             batchInfo->jettyCbArr[i]->jettyMode == JETTY_MODE_CCU_TA_CACHE) {
     754            0 :             (void)RsUbCtxLmemUnreg(batchInfo->jettyCbArr[i]->devCb, batchInfo->jettyCbArr[i]->dbSegHandle);
     755              :         }
     756            0 :         RsUbCtxFreeJettyCb(batchInfo->jettyCbArr[i]);
     757              : 
     758            0 :         if (batchInfo->jettyArr[i] == badJetty) {
     759            0 :             jettyDestroyNum = i;
     760              :         }
     761              :     }
     762            0 :     *num = jettyDestroyNum;
     763            0 : }
     764              : 
     765            2 : STATIC int RsUbDestroyJettyCbBatch(struct JettyDestroyBatchInfo *batchInfo, unsigned int *num)
     766              : {
     767            2 :     urma_jetty_t *badJetty = NULL;
     768            2 :     urma_jfr_t *badJfr = NULL;
     769            2 :     int jettyDestroyRet = 0;
     770              : 
     771            2 :     RsUbVaMunmapBatch(batchInfo->jettyCbArr, *num);
     772            2 :     jettyDestroyRet = RsUrmaDeleteJettyBatch(batchInfo->jettyArr, (int)*num, &badJetty);
     773            2 :     if (jettyDestroyRet != 0) {
     774            1 :         hccp_err("rs_urma_delete_jetty_batch failed, jettyDestroyRet:%d, num:%u", jettyDestroyRet, *num);
     775              :     }
     776              : 
     777            2 :     RsUbFreeJettyIdBatch(batchInfo->jettyCbArr, *num);
     778            2 :     RsUbFreeJettyCbBatch(batchInfo, num, badJetty, badJfr);
     779            2 :     return jettyDestroyRet;
     780              : }
     781              : 
     782            0 : STATIC void RsUbDestroyJettyCbList(struct RsUbDevCb *devCb, struct RsListHead *jettyList)
     783              : {
     784            0 :     struct JettyDestroyBatchInfo batchInfo = {0};
     785            0 :     struct RsCtxJettyCb *jettyCurr = NULL;
     786            0 :     struct RsCtxJettyCb *jettyNext = NULL;
     787            0 :     unsigned int num = 0, i = 0;
     788              :     int ret;
     789              : 
     790            0 :     if (RsListEmpty(jettyList)) {
     791            0 :         return;
     792              :     }
     793              : 
     794            0 :     hccp_warn("jetty list is not empty! start to delete");
     795            0 :     ret = RsUbCallocJettyBatchInfo(&batchInfo, devCb->jettyCnt);
     796            0 :     if (ret != 0) {
     797            0 :         hccp_err("rs_ub_calloc_jetty_batch_info failed, ret:%d", ret);
     798            0 :         goto free_batch_info;
     799              :     }
     800              : 
     801            0 :     RS_LIST_GET_HEAD_ENTRY(jettyCurr, jettyNext, jettyList, list, struct RsCtxJettyCb);
     802            0 :     for (; (&jettyCurr->list) != jettyList;
     803            0 :         jettyCurr = jettyNext, jettyNext = list_entry(jettyNext->list.next, struct RsCtxJettyCb, list)) {
     804              :         // no need to destroy
     805            0 :         if (jettyCurr->state != RS_JETTY_STATE_CREATED) {
     806            0 :             continue;
     807              :         }
     808            0 :         hccp_info("jetty_id[%u] will be destroyed", jettyCurr->jetty->jetty_id.id);
     809            0 :         batchInfo.jettyCbArr[i] = jettyCurr;
     810            0 :         batchInfo.jettyArr[i] = jettyCurr->jetty;
     811              : 
     812            0 :         RsListDel(&jettyCurr->list);
     813            0 :         devCb->jettyCnt--;
     814            0 :         i++;
     815              :     }
     816              : 
     817            0 :     num = i;
     818            0 :     if (num != 0) {
     819            0 :         ret = RsUbDestroyJettyCbBatch(&batchInfo, &num);
     820            0 :         if (ret != 0) {
     821            0 :             hccp_err("rs_ub_ctx_jetty_destroy_batch failed, ret:%d, need to be destroyed:%u, actually destroyed:%u",
     822              :                 ret, i, num);
     823              :         }
     824              :     }
     825              : 
     826            0 : free_batch_info:
     827            0 :     RsUbFreeJettyBatchInfo(&batchInfo);
     828              : }
     829              : 
     830            0 : void RsUbFreeJettyCbList(struct RsUbDevCb *devCb, struct RsListHead *jettyList,
     831              :     struct RsListHead *rjettyList)
     832              : {
     833              :     // free jetty step: unbind -> unimport -> delete
     834            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
     835            0 :     RsUbUnbindJettyCbList(devCb, jettyList);
     836            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
     837              : 
     838            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
     839            0 :     RsUbUnimportJettyCbList(devCb, rjettyList);
     840            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
     841              : 
     842            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
     843            0 :     RsUbDestroyJettyCbList(devCb, jettyList);
     844            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
     845            0 : }
     846              : 
     847            2 : int RsUbCtxChanCreate(struct RsUbDevCb *devCb, union DataPlaneCstmFlag dataPlaneFlag,
     848              :     unsigned long long *addr, int *fd)
     849              : {
     850            2 :     struct RsCtxJfceCb *jfceCb = NULL;
     851            2 :     urma_jfce_t *outJfce = NULL;
     852            2 :     int ret = 0;
     853              : 
     854            2 :     jfceCb = calloc(1, sizeof(struct RsCtxJfceCb));
     855            2 :     CHK_PRT_RETURN(jfceCb == NULL, hccp_err("calloc jfce_cb failed"), -ENOMEM);
     856              : 
     857            2 :     jfceCb->devCb = devCb;
     858            2 :     outJfce = RsUrmaCreateJfce(devCb->urmaCtx);
     859            2 :     if (outJfce == NULL) {
     860            1 :         hccp_err("rs_urma_create_jfce failed, errno:%d", errno);
     861            1 :         ret = -EOPENSRC;
     862            1 :         goto free_ctx_jfce_cb;
     863              :     }
     864              : 
     865            1 :     jfceCb->jfceAddr = (uint64_t)(uintptr_t)outJfce; // urma_jfce_t *
     866            1 :     *addr = jfceCb->jfceAddr;
     867              : 
     868            1 :     if (dataPlaneFlag.bs.pollCqCstm == 0) {
     869            1 :         ret = RsEpollCtl(devCb->rscb->connCb.epollfd, EPOLL_CTL_ADD, outJfce->fd, EPOLLIN | EPOLLRDHUP);
     870            1 :         if (ret != 0) {
     871            1 :             hccp_err("rs_epoll_ctl failed ret:%d, fd:%d", ret, devCb->rscb->connCb.epollfd);
     872            1 :             goto delete_jfce;
     873              :         }
     874              :     }
     875            0 :     jfceCb->dataPlaneFlag = dataPlaneFlag;
     876              : 
     877            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
     878            0 :     RsListAddTail(&jfceCb->list, &devCb->jfceList);
     879            0 :     jfceCb->devCb->jfceCnt++;
     880            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
     881              : 
     882            0 :     *fd = outJfce->fd;
     883            0 :     hccp_info("dev_index:0x%x jfce addr:0x%llx fd:%d", devCb->index, jfceCb->jfceAddr, outJfce->fd);
     884            0 :     return ret;
     885              : 
     886            1 : delete_jfce:
     887            1 :     (void)RsUrmaDeleteJfce(outJfce);
     888            2 : free_ctx_jfce_cb:
     889            2 :     free(jfceCb);
     890            2 :     jfceCb = NULL;
     891            2 :     return ret;
     892              : }
     893              : 
     894            0 : STATIC int RsUbGetJfceCb(struct RsUbDevCb *devCb, unsigned long long addr, struct RsCtxJfceCb **jfceCb)
     895              : {
     896            0 :     struct RsCtxJfceCb **tempJfceCb = jfceCb;
     897            0 :     struct RsCtxJfceCb *jfceCbCurr = NULL;
     898            0 :     struct RsCtxJfceCb *jfceCbNext = NULL;
     899              : 
     900            0 :     RS_LIST_GET_HEAD_ENTRY(jfceCbCurr, jfceCbNext, &devCb->jfceList, list, struct RsCtxJfceCb);
     901            0 :     for (; (&jfceCbCurr->list) != (&devCb->jfceList);
     902            0 :         jfceCbCurr = jfceCbNext,
     903            0 :         jfceCbNext = list_entry(jfceCbNext->list.next, struct RsCtxJfceCb, list)) {
     904            0 :         if (jfceCbCurr->jfceAddr == addr) {
     905            0 :             *tempJfceCb = jfceCbCurr;
     906            0 :             return 0;
     907              :         }
     908              :     }
     909              : 
     910            0 :     *tempJfceCb = NULL;
     911            0 :     hccp_err("jfce_cb for jfce_addr:0x%llx do not available!", addr);
     912              : 
     913            0 :     return -ENODEV;
     914              : }
     915              : 
     916            0 : int RsUbCtxChanDestroy(struct RsUbDevCb *devCb, unsigned long long addr)
     917              : {
     918            0 :     struct RsCtxJfceCb *jfceCb = NULL;
     919            0 :     urma_jfce_t *jfce = NULL;
     920              :     int ret;
     921              : 
     922            0 :     hccp_info("[rs_ctx_chan]jfce destroy addr:0x%llx", addr);
     923              : 
     924            0 :     ret = RsUbGetJfceCb(devCb, addr, &jfceCb);
     925            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("get jfce_cb failed, ret:%d, jfce addr:0x%llx", ret, addr), ret);
     926              : 
     927            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
     928            0 :     RsListDel(&jfceCb->list);
     929            0 :     jfceCb->devCb->jfceCnt--;
     930            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
     931              : 
     932            0 :     jfce = (urma_jfce_t *)(uintptr_t)jfceCb->jfceAddr;
     933            0 :     if (jfceCb->dataPlaneFlag.bs.pollCqCstm == 0) {
     934            0 :         (void)RsEpollCtl(devCb->rscb->connCb.epollfd, EPOLL_CTL_DEL, jfce->fd, EPOLLIN | EPOLLRDHUP);
     935              :     }
     936              : 
     937            0 :     ret = RsUrmaDeleteJfce(jfce);
     938            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_delete_jfce failed, ret:%d errno:%d jfce addr:0x%llx", ret, errno,
     939              :         jfceCb->jfceAddr), -EOPENSRC);
     940              : 
     941            0 :     free(jfceCb);
     942            0 :     jfceCb = NULL;
     943              : 
     944            0 :     hccp_info("rs ctx jfce destroy success, dev jfce num is %u", devCb->jfceCnt);
     945            0 :     return ret;
     946              : }
     947              : 
     948            0 : STATIC int RsUbFreeJfceCb(struct RsUbDevCb *devCb, struct RsCtxJfceCb *jfceCb)
     949              : {
     950            0 :     int ret = 0;
     951              : 
     952            0 :     RsListDel(&jfceCb->list);
     953            0 :     devCb->jfceCnt--;
     954              : 
     955            0 :     ret = RsUrmaDeleteJfce((urma_jfce_t *)(uintptr_t)jfceCb->jfceAddr);
     956            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("[rs_ctx_chan]rs_ub_delete_jfce failed, ret:%d, jfce addr:0x%llx",
     957              :         ret, jfceCb->jfceAddr), -EOPENSRC);
     958              : 
     959            0 :     free(jfceCb);
     960            0 :     jfceCb = NULL;
     961              : 
     962            0 :     return 0;
     963              : }
     964              : 
     965            0 : STATIC void RsUbFreeJfceCbList(struct RsUbDevCb *devCb, struct RsListHead *jfceList)
     966              : {
     967            0 :     struct RsCtxJfceCb *jfceCurr = NULL;
     968            0 :     struct RsCtxJfceCb *jfceNext = NULL;
     969              :     int ret;
     970              : 
     971            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
     972            0 :     if (!RsListEmpty(jfceList)) {
     973            0 :         hccp_warn("jfce list do not empty!");
     974            0 :         RS_LIST_GET_HEAD_ENTRY(jfceCurr, jfceNext, jfceList, list, struct RsCtxJfceCb);
     975            0 :         for (; (&jfceCurr->list) != jfceList;
     976            0 :             jfceCurr = jfceNext, jfceNext = list_entry(jfceNext->list.next, struct RsCtxJfceCb, list)) {
     977            0 :             ret = RsUbFreeJfceCb(devCb, jfceCurr);
     978            0 :             if (ret != 0) {
     979            0 :                 hccp_err("rs_ub_free_jfce_cb failed, ret:%d", ret);
     980              :             }
     981              :         }
     982              :     }
     983            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
     984            0 : }
     985              : 
     986            0 : int RsUbCtxTokenIdAlloc(struct RsUbDevCb *devCb, unsigned long long *addr,
     987              :     unsigned int *tokenId)
     988              : {
     989            0 :     struct RsTokenIdCb *tokenIdCb = NULL;
     990              : 
     991            0 :     tokenIdCb = calloc(1, sizeof(struct RsTokenIdCb));
     992            0 :     CHK_PRT_RETURN(tokenIdCb == NULL, hccp_err("calloc token_id_cb failed"), -ENOMEM);
     993              : 
     994            0 :     tokenIdCb->devCb = devCb;
     995            0 :     tokenIdCb->tokenId = RsUrmaAllocTokenId(devCb->urmaCtx);
     996            0 :     if (tokenIdCb->tokenId == NULL) {
     997            0 :         hccp_err("rs_urma_alloc_token_id failed, errno:%d, devIndex:0x%x", errno, devCb->index);
     998            0 :         goto free_ctx_token_id_cb;
     999              :     }
    1000              : 
    1001            0 :     *addr = (uint64_t)(uintptr_t)tokenIdCb->tokenId; // urma_token_id_t *
    1002            0 :     *tokenId = tokenIdCb->tokenId->token_id;
    1003            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1004            0 :     RsListAddTail(&tokenIdCb->list, &devCb->tokenIdList);
    1005            0 :     tokenIdCb->devCb->tokenIdCnt++;
    1006            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1007              : 
    1008            0 :     hccp_info("alloc success, tokenId addr:0x%llx, devIndex:0x%x", *addr, devCb->index);
    1009            0 :     return 0;
    1010              : 
    1011            0 : free_ctx_token_id_cb:
    1012            0 :     free(tokenIdCb);
    1013            0 :     tokenIdCb = NULL;
    1014            0 :     return -EOPENSRC;
    1015              : }
    1016              : 
    1017            0 : STATIC int RsUbGetTokenIdCb(struct RsUbDevCb *devCb, unsigned long long addr,
    1018              :     struct RsTokenIdCb **tokenIdCb)
    1019              : {
    1020            0 :     struct RsTokenIdCb **tempTokenIdCb = tokenIdCb;
    1021            0 :     struct RsTokenIdCb *tokenIdCbCurr = NULL;
    1022            0 :     struct RsTokenIdCb *tokenIdCbNext = NULL;
    1023              : 
    1024            0 :     RS_LIST_GET_HEAD_ENTRY(tokenIdCbCurr, tokenIdCbNext, &devCb->tokenIdList, list, struct RsTokenIdCb);
    1025            0 :     for (; (&tokenIdCbCurr->list) != (&devCb->tokenIdList);
    1026            0 :         tokenIdCbCurr = tokenIdCbNext,
    1027            0 :         tokenIdCbNext = list_entry(tokenIdCbNext->list.next, struct RsTokenIdCb, list)) {
    1028            0 :         if ((uint64_t)(uintptr_t)tokenIdCbCurr->tokenId == addr) {
    1029            0 :             *tempTokenIdCb = tokenIdCbCurr;
    1030            0 :             return 0;
    1031              :         }
    1032              :     }
    1033              : 
    1034            0 :     *tempTokenIdCb = NULL;
    1035            0 :     hccp_err("token_id_cb for token_id addr:0x%llx do not available! devIndex:0x%x", addr, devCb->index);
    1036              : 
    1037            0 :     return -ENODEV;
    1038              : }
    1039              : 
    1040            0 : STATIC int RsUbFreeTokenIdCb(struct RsUbDevCb *devCb, struct RsTokenIdCb *tokenIdCb)
    1041              : {
    1042            0 :     int ret = 0;
    1043              : 
    1044            0 :     RsListDel(&tokenIdCb->list);
    1045            0 :     devCb->tokenIdCnt--;
    1046              : 
    1047            0 :     ret = RsUrmaFreeTokenId(tokenIdCb->tokenId);
    1048            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_free_token_id failed, ret:%d, devIndex:0x%x, tokenId addr:0x%llx",
    1049              :         ret, devCb->index, (uint64_t)(uintptr_t)tokenIdCb->tokenId), -EOPENSRC);
    1050              : 
    1051            0 :     free(tokenIdCb);
    1052            0 :     tokenIdCb = NULL;
    1053            0 :     return 0;
    1054              : }
    1055              : 
    1056            0 : int RsUbCtxTokenIdFree(struct RsUbDevCb *devCb, unsigned long long addr)
    1057              : {
    1058            0 :     struct RsTokenIdCb *tokenIdCb = NULL;
    1059              :     int ret;
    1060              : 
    1061            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1062            0 :     ret = RsUbGetTokenIdCb(devCb, addr, &tokenIdCb);
    1063            0 :     if (ret != 0) {
    1064            0 :         hccp_err("get token_id_cb failed! ret %d, devIndex:0x%x, tokenId addr:0x%llx", ret, devCb->index, addr);
    1065            0 :         goto free_lock;
    1066              :     }
    1067            0 :     ret = RsUbFreeTokenIdCb(devCb, tokenIdCb);
    1068            0 :     if (ret != 0) {
    1069            0 :         hccp_err("free_token_id_cb failed, ret:%d, devIndex:0x%x, tokenId addr:0x%llx", ret, devCb->index, addr);
    1070            0 :         goto free_lock;
    1071              :     }
    1072            0 :     hccp_info("rs token id free success, dev tokenId num is %u, devIndex:0x%x, tokenId addr:0x%llx",
    1073              :         devCb->tokenIdCnt, devCb->index, addr);
    1074              : 
    1075            0 : free_lock:
    1076            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1077            0 :     return ret;
    1078              : }
    1079              : 
    1080            0 : STATIC void RsUbFreeTokenIdCbList(struct RsUbDevCb *devCb, struct RsListHead *tokenIdList)
    1081              : {
    1082            0 :     struct RsTokenIdCb *tokenIdCurr = NULL;
    1083            0 :     struct RsTokenIdCb *tokenIdNext = NULL;
    1084              : 
    1085            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1086            0 :     if (!RsListEmpty(tokenIdList)) {
    1087            0 :         hccp_warn("token_id list do not empty!");
    1088            0 :         RS_LIST_GET_HEAD_ENTRY(tokenIdCurr, tokenIdNext, tokenIdList, list, struct RsTokenIdCb);
    1089            0 :         for (; (&tokenIdCurr->list) != tokenIdList; tokenIdCurr = tokenIdNext,
    1090            0 :             tokenIdNext = list_entry(tokenIdNext->list.next, struct RsTokenIdCb, list)) {
    1091            0 :             (void)RsUbFreeTokenIdCb(devCb, tokenIdCurr);
    1092              :         }
    1093              :     }
    1094            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1095            0 :     return;
    1096              : }
    1097              : 
    1098            0 : void RsUbFreeAsyncEventCb(struct RsUbDevCb *devCb, struct RsCtxAsyncEventCb *asyncEventCb)
    1099              : {
    1100            0 :     RsListDel(&asyncEventCb->list);
    1101            0 :     devCb->asyncEventCnt--;
    1102              : 
    1103            0 :     free(asyncEventCb);
    1104            0 :     asyncEventCb = NULL;
    1105            0 : }
    1106              : 
    1107            0 : STATIC void RsUbFreeAsyncEventCbList(struct RsUbDevCb *devCb, struct RsListHead *asyncEventList)
    1108              : {
    1109            0 :     struct RsCtxAsyncEventCb *asyncEventCurr = NULL;
    1110            0 :     struct RsCtxAsyncEventCb *asyncEventNext = NULL;
    1111              : 
    1112            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1113            0 :     (void)RsEpollCtl(devCb->rscb->connCb.epollfd, EPOLL_CTL_DEL, devCb->urmaCtx->async_fd, EPOLLIN | EPOLLRDHUP);
    1114            0 :     if (!RsListEmpty(asyncEventList)) {
    1115            0 :         hccp_run_warn("async_event list do not empty!");
    1116            0 :         RS_LIST_GET_HEAD_ENTRY(asyncEventCurr, asyncEventNext, asyncEventList, list,
    1117              :             struct RsCtxAsyncEventCb);
    1118            0 :         for (; (&asyncEventCurr->list) != asyncEventList; asyncEventCurr = asyncEventNext,
    1119            0 :             asyncEventNext = list_entry(asyncEventNext->list.next, struct RsCtxAsyncEventCb, list)) {
    1120            0 :             RsUbFreeAsyncEventCb(devCb, asyncEventCurr);
    1121              :         }
    1122              :     }
    1123            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1124            0 : }
    1125              : 
    1126            0 : int RsUbCtxDeinit(struct RsUbDevCb *devCb)
    1127              : {
    1128              :     int ret;
    1129              : 
    1130            0 :     hccp_info("[deinit][rs_ctx]start deinit, phyId:%u, devIndex:0x%x", devCb->phyId, devCb->index);
    1131              : 
    1132            0 :     RsUbFreeSegCbList(devCb, &devCb->lsegList, &devCb->rsegList);
    1133            0 :     RsUbFreeJettyCbList(devCb, &devCb->jettyList, &devCb->rjettyList);
    1134              : 
    1135              :     /* Destroy shared JFR and JFC after all jettys are freed */
    1136            0 :     RsUbDevShareJfrDeinit(devCb);
    1137              : 
    1138            0 :     RsUbFreeJfcCbList(devCb, &devCb->jfcList);
    1139            0 :     RsUbFreeJfceCbList(devCb, &devCb->jfceList);
    1140            0 :     RsUbFreeTokenIdCbList(devCb, &devCb->tokenIdList);
    1141            0 :     RsUbFreeAsyncEventCbList(devCb, &devCb->asyncEventList);
    1142              : 
    1143            0 :     ret = RsUrmaDeleteContext(devCb->urmaCtx);
    1144            0 :     if (ret != 0) {
    1145            0 :         hccp_err("rs_urma_delete_context failed, ret:%d", ret);
    1146              :     }
    1147              : 
    1148            0 :     pthread_mutex_destroy(&devCb->mutex);
    1149              : 
    1150            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->rscb->mutex);
    1151            0 :     RsListDel(&devCb->list);
    1152            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->rscb->mutex);
    1153            0 :     RsSensorNodeUnregister(devCb->rscb);
    1154              : 
    1155            0 :     RsUbApiDeinit();
    1156              : 
    1157            0 :     hccp_run_info("[deinit][rs_ctx]deinit success, phyId:%u, devIndex:0x%x", devCb->phyId, devCb->index);
    1158            0 :     free(devCb);
    1159            0 :     devCb = NULL;
    1160            0 :     return ret;
    1161              : }
    1162              : 
    1163            0 : STATIC int RsUbQuerySegCb(struct RsUbDevCb *devCb, uint64_t addr, struct RsSegCb **segCb,
    1164              :     struct RsListHead *segList)
    1165              : {
    1166            0 :     struct RsSegCb *segCurr = NULL;
    1167            0 :     struct RsSegCb *segNext = NULL;
    1168              : 
    1169            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1170            0 :     RS_LIST_GET_HEAD_ENTRY(segCurr, segNext, segList, list, struct RsSegCb);
    1171            0 :     for (; (&segCurr->list) != segList;
    1172            0 :         segCurr = segNext, segNext = list_entry(segNext->list.next, struct RsSegCb, list)) {
    1173            0 :         if ((segCurr->segInfo.addr <= addr) && (addr < segCurr->segInfo.addr + segCurr->segInfo.len)) {
    1174            0 :             *segCb = segCurr;
    1175            0 :             RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1176            0 :             return 0;
    1177              :         }
    1178              :     }
    1179              : 
    1180            0 :     *segCb = NULL;
    1181            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1182              : 
    1183            0 :     hccp_info("cannot find seg_cb for addr@0x%lx", addr);
    1184            0 :     return -ENODEV;
    1185              : }
    1186              : 
    1187            1 : STATIC int RsUbInitSegCb(struct MemRegAttrT *memAttr, struct RsUbDevCb *devCb, struct RsSegCb *segCb)
    1188              : {
    1189            1 :     struct RsTokenIdCb *tokenIdCb = NULL;
    1190            1 :     urma_seg_cfg_t segCfg = {0};
    1191            1 :     int ret = 0;
    1192              : 
    1193            1 :     segCfg.flag.value = memAttr->ub.flags.value;
    1194            1 :     segCfg.va = memAttr->mem.addr;
    1195            1 :     segCfg.len = memAttr->mem.size;
    1196            1 :     segCfg.token_value = segCb->tokenValue;
    1197            1 :     segCfg.user_ctx = (uintptr_t)NULL;
    1198            1 :     segCfg.iova = 0;
    1199              : 
    1200            1 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1201              : 
    1202              :     // token id in cfg is valid, get token id by mem_attr->ub.token_id_addr
    1203            1 :     if (segCfg.flag.bs.token_id_valid == URMA_TOKEN_ID_VALID) {
    1204            0 :         ret = RsUbGetTokenIdCb(devCb, memAttr->ub.tokenIdAddr, &tokenIdCb);
    1205            0 :         if (ret != 0) {
    1206            0 :             hccp_err("get token_id_cb failed! ret %d, devIndex:0x%x, tokenId addr:0x%llx", ret, devCb->index,
    1207              :                 memAttr->ub.tokenIdAddr);
    1208            0 :             goto free_lock;
    1209              :         }
    1210            0 :         segCfg.token_id = tokenIdCb->tokenId;
    1211              :     }
    1212              : 
    1213            1 :     segCb->segment = RsUrmaRegisterSeg(devCb->urmaCtx, &segCfg);
    1214            1 :     if (segCb->segment == NULL) {
    1215            1 :         hccp_err("[init][rs_ctx_lmem]rs_urma_register_seg len[0x%llx] failed, errno:%d", segCfg.len, errno);
    1216            1 :         ret = -EOPENSRC;
    1217            1 :         goto free_lock;
    1218              :     }
    1219              : 
    1220            0 :     segCb->segInfo.seg = segCb->segment->seg;
    1221              :     // resv len as 1 to save addr for later unreg to query
    1222            0 :     segCb->segInfo.addr = (uint64_t)(uintptr_t)segCb->segment;
    1223            0 :     segCb->segInfo.len = 1;
    1224            0 :     RsListAddTail(&segCb->list, &devCb->lsegList);
    1225            0 :     devCb->lsegCnt++;
    1226              : 
    1227            1 : free_lock:
    1228            1 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1229            1 :     return ret;
    1230              : }
    1231              : 
    1232            0 : STATIC void RsUbDeinitSegCb(struct RsUbDevCb *devCb, struct RsSegCb *segCb)
    1233              : {
    1234            0 :     (void)RsUrmaUnregisterSeg(segCb->segment);
    1235            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1236            0 :     RsListDel(&segCb->list);
    1237            0 :     devCb->lsegCnt--;
    1238            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1239            0 : }
    1240              : 
    1241            1 : int RsUbCtxLmemReg(struct RsUbDevCb *devCb, struct MemRegAttrT *memAttr, struct MemRegInfoT *memInfo)
    1242              : {
    1243            1 :     struct RsSegCb *lsegCb = NULL;
    1244              :     int ret;
    1245              : 
    1246            1 :     CHK_PRT_RETURN(memAttr->mem.size == 0, hccp_err("[init][rs_ctx_lmem]mem_attr->mem.size is 0"), -EINVAL);
    1247              : 
    1248            1 :     hccp_run_info("[init][rs_ctx_lmem]devIndex:0x%x addr:0x%llx, len[0x%llx], access[0x%x]",
    1249              :         devCb->index, memAttr->mem.addr, memAttr->mem.size, memAttr->ub.flags.bs.access);
    1250              : 
    1251            1 :     lsegCb = calloc(1, sizeof(struct RsSegCb));
    1252            1 :     CHK_PRT_RETURN(lsegCb == NULL, hccp_err("[init][rs_ctx_lmem]calloc lseg_cb failed"), -ENOMEM);
    1253            1 :     lsegCb->devCb = devCb;
    1254            1 :     lsegCb->tokenValue.token = memAttr->ub.tokenValue;
    1255              : 
    1256            1 :     ret = RsUbInitSegCb(memAttr, devCb, lsegCb);
    1257            1 :     if (ret != 0) {
    1258            1 :         hccp_err("[init][rs_ctx_lmem]rs_ub_init_seg_cb failed, ret:%d", ret);
    1259            1 :         goto init_err;
    1260              :     }
    1261              : 
    1262            0 :     ret = memcpy_s(memInfo->key.value, sizeof(memInfo->key.value), &lsegCb->segInfo.seg, sizeof(urma_seg_t));
    1263            0 :     if (ret != 0) {
    1264            0 :         hccp_err("[init][rs_ctx_lmem]memcpy_s for seg failed ret:%d", ret);
    1265            0 :         ret = -ESAFEFUNC;
    1266            0 :         goto reg_err;
    1267              :     }
    1268            0 :     memInfo->key.size = sizeof(urma_seg_t);
    1269            0 :     memInfo->ub.tokenId = lsegCb->segment->token_id->token_id;
    1270            0 :     memInfo->ub.targetSegHandle = (uintptr_t)lsegCb->segment;
    1271              : 
    1272            0 :     hccp_info("[init][rs_ctx_lmem]reg succ, devIndex:0x%x addr:0x%llx, len[0x%llx], access[0x%x]",
    1273              :         devCb->index, memAttr->mem.addr, memAttr->mem.size, memAttr->ub.flags.bs.access);
    1274            0 :     return 0;
    1275              : 
    1276            0 : reg_err:
    1277            0 :     RsUbDeinitSegCb(devCb, lsegCb);
    1278            1 : init_err:
    1279            1 :     free(lsegCb);
    1280            1 :     lsegCb = NULL;
    1281            1 :     return ret;
    1282              : }
    1283              : 
    1284            0 : int RsUbCtxLmemUnreg(struct RsUbDevCb *devCb, unsigned long long addr)
    1285              : {
    1286            0 :     struct RsSegCb *lsegCb = NULL;
    1287              :     int ret;
    1288              : 
    1289            0 :     hccp_info("[deinit][rs_ctx_lmem]devIndex:0x%x addr:0x%llx", devCb->index, addr);
    1290              : 
    1291            0 :     ret = RsUbQuerySegCb(devCb, addr, &lsegCb, &devCb->lsegList);
    1292            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("[deinit][rs_ctx_lmem]rs_ub_query_seg_cb failed ret:%d ", ret), ret);
    1293              : 
    1294            0 :     ret = RsUrmaUnregisterSeg(lsegCb->segment);
    1295            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("[deinit][rs_ctx_lmem]rs_urma_unregister_seg failed ret:%d ", ret), -EOPENSRC);
    1296              : 
    1297            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1298            0 :     RsListDel(&lsegCb->list);
    1299            0 :     devCb->lsegCnt--;
    1300            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1301            0 :     hccp_run_info("[deinit][rs_ctx_lmem]devIndex:0x%x addr:0x%llx unregister segment success", devCb->index, addr);
    1302            0 :     free(lsegCb);
    1303            0 :     lsegCb = NULL;
    1304            0 :     return 0;
    1305              : }
    1306              : 
    1307            1 : int RsUbCtxRmemImport(struct RsUbDevCb *devCb, struct MemImportAttrT *memAttr,
    1308              :     struct MemImportInfoT *memInfo)
    1309              : {
    1310            1 :     struct RsSegCb *remSegCb = NULL;
    1311            1 :     urma_import_seg_flag_t flag = {0};
    1312            1 :     urma_token_t tokenValue = {0};
    1313            1 :     uint64_t mappingAddr = 0;
    1314              :     int ret;
    1315              : 
    1316            1 :     remSegCb = calloc(1, sizeof(struct RsSegCb));
    1317            1 :     CHK_PRT_RETURN(remSegCb == NULL, hccp_err("[init][rs_ctx_rmem]calloc rem_seg_cb failed"), -ENOMEM);
    1318              : 
    1319            1 :     ret = memcpy_s(&remSegCb->segInfo.seg, sizeof(urma_seg_t), &memAttr->key.value, memAttr->key.size);
    1320            1 :     if (ret != 0) {
    1321            0 :         hccp_err("[init][rs_ctx_rmem]memcpy_s failed, ret:%d", ret);
    1322            0 :         ret = -ESAFEFUNC;
    1323            0 :         goto free_rem_seg_cb;
    1324              :     }
    1325              : 
    1326            1 :     tokenValue.token = memAttr->ub.tokenValue;
    1327            1 :     flag.value = memAttr->ub.flags.value;
    1328              :     // mapping_addr is needed if flag mapping set value
    1329            1 :     if (memAttr->ub.flags.bs.mapping == 1) {
    1330            0 :         mappingAddr = memAttr->ub.mappingAddr;
    1331              :     }
    1332            1 :     remSegCb->segment = RsUrmaImportSeg(devCb->urmaCtx, &remSegCb->segInfo.seg, &tokenValue, mappingAddr,
    1333              :         flag);
    1334            1 :     if (remSegCb->segment == NULL) {
    1335            1 :         hccp_err("[init][rs_ctx_rmem]rs_urma_import_seg failed, errno:%d", errno);
    1336            1 :         ret = -EOPENSRC;
    1337            1 :         goto free_rem_seg_cb;
    1338              :     }
    1339              : 
    1340            0 :     memInfo->ub.targetSegHandle = (uintptr_t)remSegCb->segment;
    1341              :     // resv len as 1 to save addr for later unimport to query
    1342            0 :     remSegCb->segInfo.addr = memInfo->ub.targetSegHandle;
    1343            0 :     remSegCb->segInfo.len = 1;
    1344              : 
    1345            0 :     hccp_run_info("[init][rs_ctx_rmem]devIndex:0x%x import addr:0x%llx", devCb->index, remSegCb->segInfo.addr);
    1346              : 
    1347            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1348            0 :     RsListAddTail(&remSegCb->list, &devCb->rsegList);
    1349            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1350              : 
    1351            0 :     return 0;
    1352              : 
    1353            1 : free_rem_seg_cb:
    1354            1 :     free(remSegCb);
    1355            1 :     remSegCb = NULL;
    1356            1 :     return ret;
    1357              : }
    1358              : 
    1359            0 : int RsUbCtxRmemUnimport(struct RsUbDevCb *devCb, unsigned long long addr)
    1360              : {
    1361            0 :     struct RsSegCb *remSegCb = NULL;
    1362              :     int ret;
    1363              : 
    1364            0 :     hccp_run_info("[deinit][rs_ctx_rmem]devIndex:0x%x unimport addr:0x%llx", devCb->index, addr);
    1365              : 
    1366            0 :     ret = RsUbQuerySegCb(devCb, addr, &remSegCb, &devCb->rsegList);
    1367            0 :     CHK_PRT_RETURN(ret != 0, hccp_warn("[deinit][rs_ctx_rmem]can not find rem seg cb for addr:0x%llx", addr), 0);
    1368              : 
    1369            0 :     RsUrmaUnimportSeg(remSegCb->segment);
    1370            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1371            0 :     RsListDel(&remSegCb->list);
    1372            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1373              : 
    1374            0 :     free(remSegCb);
    1375            0 :     remSegCb = NULL;
    1376            0 :     return 0;
    1377              : }
    1378              : 
    1379            0 : STATIC int RsUbCtxJfcCreateNormal(struct RsUbDevCb *devCb, urma_jfc_cfg_t *jfcCfg, urma_jfc_t **outJfc)
    1380              : {
    1381            0 :     uint64_t jfceAddr = (uint64_t)(uintptr_t)jfcCfg->jfce;
    1382            0 :     struct RsCtxJfceCb *jfceCb = NULL;
    1383            0 :     int ret = 0;
    1384              : 
    1385            0 :     if (jfcCfg->jfce != NULL) {
    1386            0 :         ret = RsUbGetJfceCb(devCb, jfceAddr, &jfceCb);
    1387            0 :         CHK_PRT_RETURN(ret != 0, hccp_err("get jfce_cb failed, ret:%d, jfce addr:0x%llx", ret, jfceAddr), ret);
    1388              :     }
    1389              : 
    1390            0 :     *outJfc = RsUrmaCreateJfc(devCb->urmaCtx, jfcCfg);
    1391            0 :     CHK_PRT_RETURN(*outJfc == NULL, hccp_err("rs_urma_create_jfc failed, errno:%d", errno), -EOPENSRC);
    1392              : 
    1393            0 :     ret = RsUrmaRearmJfc(*outJfc, false);
    1394            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_rearm_jfc failed, ret:%d errno:%d", ret, errno), -EOPENSRC);
    1395              : 
    1396            0 :     return ret;
    1397              : }
    1398              : 
    1399            0 : STATIC void RsUbFillJfcInfo(struct RsCtxJfcCb *jfcCb, struct CtxCqInfo *info)
    1400              : {
    1401            0 :     info->addr = jfcCb->jfcAddr;
    1402            0 :     info->ub.id = jfcCb->jfcId;
    1403            0 :     info->ub.cqeSize = WQE_BB_SIZE;
    1404            0 :     info->ub.bufAddr = jfcCb->bufAddr;
    1405            0 :     info->ub.swdbAddr = jfcCb->swdbAddr;
    1406            0 : }
    1407              : 
    1408            1 : int RsUbCtxJfcCreate(struct RsUbDevCb *devCb, struct CtxCqAttr *attr, struct CtxCqInfo *info)
    1409              : {
    1410            1 :     struct RsCtxJfcCb *jfcCb = NULL;
    1411            1 :     urma_jfc_cfg_t jfcCfg = {0};
    1412            1 :     urma_jfc_t *outJfc = NULL;
    1413            1 :     int ret = 0;
    1414              : 
    1415            1 :     jfcCb = (struct RsCtxJfcCb *)calloc(1, sizeof(struct RsCtxJfcCb));
    1416            1 :     CHK_PRT_RETURN(jfcCb == NULL, hccp_err("calloc jfc_cb failed"), -ENOMEM);
    1417              : 
    1418            1 :     jfcCb->devCb = devCb;
    1419            1 :     jfcCb->jfcType = attr->ub.mode;
    1420            1 :     jfcCb->depth = attr->depth;
    1421            1 :     jfcCb->ccuExCfg.valid = attr->ub.ccuExCfg.valid;
    1422            1 :     jfcCb->ccuExCfg.cqeFlag = attr->ub.ccuExCfg.cqeFlag;
    1423            1 :     jfcCfg.depth = attr->depth;
    1424            1 :     jfcCfg.flag.value = attr->ub.flag.value;
    1425            1 :     jfcCfg.user_ctx = attr->ub.userCtx;
    1426            1 :     jfcCfg.ceqn = attr->ub.ceqn;
    1427            1 :     jfcCfg.jfce = attr->chanAddr == 0 ? NULL : (urma_jfce_t *)(uintptr_t)attr->chanAddr;
    1428            1 :     if (attr->ub.mode == JFC_MODE_STARS_POLL || attr->ub.mode == JFC_MODE_CCU_POLL ||
    1429            0 :         attr->ub.mode == JFC_MODE_USER_CTL_NORMAL) {
    1430            1 :         ret = RsUbCtxJfcCreateExt(jfcCb, &jfcCfg, &outJfc);
    1431            1 :         if (ret != 0) {
    1432            1 :             hccp_err("rs_ub_ctx_jfc_create_ext jfc_mode:%d failed, ret:%d", attr->ub.mode, ret);
    1433            1 :             goto jfc_cb_init_err;
    1434              :         }
    1435            0 :     } else if (attr->ub.mode == JFC_MODE_NORMAL) {
    1436            0 :         jfcCfg.jfce = (attr->chanAddr == 0) ? NULL : (urma_jfce_t *)(uintptr_t)attr->chanAddr;
    1437            0 :         ret = RsUbCtxJfcCreateNormal(devCb, &jfcCfg, &outJfc);
    1438            0 :         if (ret != 0) {
    1439            0 :             hccp_err("rs_ub_ctx_jfc_create_normal failed, jfcMode:%d ret:%d", attr->ub.mode, ret);
    1440            0 :             goto jfc_cb_init_err;
    1441              :         }
    1442              :     } else {
    1443            0 :         hccp_err("jfc_type %d is invalid, not support!", attr->ub.mode);
    1444            0 :         ret = -EINVAL;
    1445            0 :         goto jfc_cb_init_err;
    1446              :     }
    1447            0 :     jfcCb->jfcAddr = (uint64_t)(uintptr_t)outJfc; // urma_jfc_t *
    1448            0 :     RsUbFillJfcInfo(jfcCb, info);
    1449              : 
    1450            0 :     hccp_info("jfc addr:0x%llx mode:%d", jfcCb->jfcAddr, jfcCb->jfcType);
    1451              : 
    1452            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1453            0 :     jfcCb->devCb->jfcCnt++;
    1454            0 :     RsListAddTail(&jfcCb->list, &devCb->jfcList);
    1455            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1456              : 
    1457            0 :     return 0;
    1458              : 
    1459            1 : jfc_cb_init_err:
    1460            1 :     free(jfcCb);
    1461            1 :     jfcCb = NULL;
    1462              : 
    1463            1 :     return ret;
    1464              : }
    1465              : 
    1466            0 : STATIC bool RsUbIsJettyModeValid(int jettyMode, bool lockFlag)
    1467              : {
    1468            0 :     if (jettyMode < 0 || jettyMode >= JETTY_MODE_MAX || (jettyMode == JETTY_MODE_CCU_TA_CACHE && !lockFlag)) {
    1469            0 :         return false;
    1470              :     }
    1471              : 
    1472            0 :     return true;
    1473              : }
    1474              : 
    1475            0 : STATIC int RsUbJettyCbInit(struct RsUbDevCb *devCb, struct CtxQpAttr *jettyAttr,
    1476              :     struct RsCtxJettyCb *jettyCb)
    1477              : {
    1478            0 :     bool lockFlag = jettyAttr->ub.taCacheMode.lockFlag;
    1479            0 :     int jettyMode = jettyAttr->ub.mode;
    1480              : 
    1481            0 :     if (!RsUbIsJettyModeValid(jettyMode, lockFlag)) {
    1482            0 :         hccp_err("unsupported jetty_mode:%d, lockFlag:%d", jettyMode, lockFlag);
    1483            0 :         return -EINVAL;
    1484              :     }
    1485              : 
    1486            0 :     jettyCb->txDepth = jettyAttr->sqDepth;
    1487            0 :     jettyCb->rxDepth = jettyAttr->rqDepth;
    1488            0 :     jettyCb->devCb = devCb;
    1489            0 :     jettyCb->jettyMode = jettyMode;
    1490            0 :     jettyCb->jettyId = jettyAttr->ub.jettyId;
    1491            0 :     jettyCb->transportMode = jettyAttr->transportMode;
    1492            0 :     jettyCb->state = RS_QP_STATUS_DISCONNECT;
    1493            0 :     jettyCb->flag.value = jettyAttr->ub.flag.value;
    1494            0 :     jettyCb->jfsFlag.value = jettyAttr->ub.jfsFlag.value;
    1495            0 :     jettyCb->tokenIdAddr = jettyAttr->ub.tokenIdAddr;
    1496            0 :     jettyCb->tokenValue = jettyAttr->ub.tokenValue;
    1497            0 :     jettyCb->priority = jettyAttr->ub.priority;
    1498            0 :     jettyCb->rnrRetry = jettyAttr->ub.rnrRetry;
    1499            0 :     jettyCb->errTimeout = jettyAttr->ub.errTimeout;
    1500              : 
    1501            0 :     if (jettyCb->jettyMode == JETTY_MODE_CCU_TA_CACHE) {
    1502            0 :         jettyCb->taCacheMode.lockFlag = jettyAttr->ub.taCacheMode.lockFlag;
    1503            0 :         jettyCb->taCacheMode.sqeBufIdx = jettyAttr->ub.taCacheMode.sqeBufIdx;
    1504              :     } else {
    1505            0 :         jettyCb->extMode.sq = jettyAttr->ub.extMode.sq;
    1506            0 :         jettyCb->extMode.piType = jettyAttr->ub.extMode.piType;
    1507            0 :         jettyCb->extMode.cstmFlag = jettyAttr->ub.extMode.cstmFlag;
    1508            0 :         jettyCb->extMode.sqebbNum = jettyAttr->ub.extMode.sqebbNum;
    1509              :     }
    1510            0 :     return 0;
    1511              : }
    1512              : 
    1513              : #ifdef CUSTOM_INTERFACE
    1514            0 : STATIC int RsUbJettyCbBuffAlloc(struct RsUbDevCb *devCb, struct RsCtxJettyCb *jettyCb, enum JfcMode jfcType)
    1515              : {
    1516            0 :     unsigned int logicDevid = 0;
    1517            0 :     unsigned long flag = 0;
    1518            0 :     int ret = 0;
    1519              : 
    1520            0 :     if (jfcType != JFC_MODE_NORMAL) {
    1521            0 :         jettyCb->qpShareInfoAddr = NULL;
    1522            0 :         return 0;
    1523              :     }
    1524              : 
    1525            0 :     ret = rsGetLocalDevIDByHostDevID(devCb->phyId, &logicDevid);
    1526            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rsGetLocalDevIDByHostDevID failed, phyId(%u), ret(%d)",
    1527              :         devCb->phyId, ret), ret);
    1528              : 
    1529            0 :     flag = ((unsigned long)logicDevid << BUFF_FLAGS_DEVID_OFFSET) | BUFF_SP_SVM;
    1530            0 :     ret = DlHalBuffAllocAlignEx(sizeof(struct CtxQpShareInfo), CI_ADDR_BUFFER_ALIGN_4K_PAGE_SIZE, flag,
    1531            0 :         (int)devCb->rscb->grpId, (void **)&jettyCb->qpShareInfoAddr);
    1532            0 :     if (ret != 0) {
    1533            0 :         hccp_err("dl_hal_buff_alloc_align_ex failed, length:0x%llx, dev_id:0x%x, flag:0x%lx, grp_id:%u, ret:%d",
    1534              :             sizeof(struct CtxQpShareInfo), logicDevid, flag, devCb->rscb->grpId, ret);
    1535              :     }
    1536              : 
    1537            0 :     return ret;
    1538              : }
    1539              : #endif
    1540              : 
    1541            1 : STATIC int RsUbCtxInitJettyCb(struct RsUbDevCb *devCb, struct CtxQpAttr *attr,
    1542              :     struct RsCtxJettyCb **jettyCb)
    1543              : {
    1544            1 :     struct RsCtxJettyCb *tmpJettyCb = NULL;
    1545              :     int ret;
    1546              : 
    1547            1 :     tmpJettyCb = calloc(1, sizeof(struct RsCtxJettyCb));
    1548            1 :     CHK_PRT_RETURN(tmpJettyCb == NULL, hccp_err("calloc tmp_jetty_cb failed, errno:%d", errno), -ENOMEM);
    1549              : 
    1550            1 :     ret = pthread_mutex_init(&tmpJettyCb->mutex, NULL);
    1551            1 :     if (ret != 0) {
    1552            1 :         hccp_err("pthread_mutex_init failed, ret:%d", ret);
    1553            1 :         goto pthread_mutex_init_err;
    1554              :     }
    1555              : 
    1556            0 :     ret = pthread_mutex_init(&tmpJettyCb->crErrInfo.mutex, NULL);
    1557            0 :     if (ret != 0) {
    1558            0 :         hccp_err("pthread_mutex_init failed, ret:%d", ret);
    1559            0 :         goto cr_err_mutex_init_err;
    1560              :     }
    1561              : 
    1562            0 :     ret = RsUbJettyCbInit(devCb, attr, tmpJettyCb);
    1563            0 :     if (ret != 0) {
    1564            0 :         hccp_err("jetty_cb init failed ret:%d", ret);
    1565            0 :         goto jetty_cb_init_err;
    1566              :     }
    1567              : 
    1568            0 :     *jettyCb = tmpJettyCb;
    1569            0 :     return 0;
    1570              : 
    1571            0 : jetty_cb_init_err:
    1572            0 :     pthread_mutex_destroy(&tmpJettyCb->crErrInfo.mutex);
    1573            0 : cr_err_mutex_init_err:
    1574            0 :     pthread_mutex_destroy(&tmpJettyCb->mutex);
    1575            1 : pthread_mutex_init_err:
    1576            1 :     free(tmpJettyCb);
    1577            1 :     tmpJettyCb = NULL;
    1578              : 
    1579            1 :     return ret;
    1580              : }
    1581              : 
    1582            0 : STATIC void RsUbCtxFillJfsCfg(struct RsCtxJettyCb *jettyCb, struct RsCtxJfcCb *sendJfcCb,
    1583              :     urma_jfs_cfg_t *jfsCfg)
    1584              : {
    1585            0 :     jfsCfg->depth = (uint32_t)jettyCb->txDepth;
    1586            0 :     jfsCfg->flag.value = jettyCb->jfsFlag.value;
    1587            0 :     jfsCfg->trans_mode = jettyCb->transportMode;
    1588            0 :     jfsCfg->priority = jettyCb->priority;
    1589            0 :     jfsCfg->max_sge = (uint8_t)jettyCb->devCb->devAttr.sqMaxSge;
    1590            0 :     jfsCfg->max_rsge = (uint8_t)jettyCb->devCb->devAttr.ub.maxJfsRsge;
    1591            0 :     jfsCfg->max_inline_data = jettyCb->devCb->devAttr.ub.maxJfsInlineLen;
    1592            0 :     jfsCfg->rnr_retry = jettyCb->rnrRetry;
    1593            0 :     jfsCfg->err_timeout = jettyCb->errTimeout;
    1594            0 :     jfsCfg->jfc = (urma_jfc_t *)(uintptr_t)sendJfcCb->jfcAddr;
    1595            0 :     jfsCfg->user_ctx = (uint64_t)NULL;
    1596            0 : }
    1597              : 
    1598            0 : int RsUbCtxRegJettyDb(struct RsCtxJettyCb *jettyCb, struct udma_u_jetty_info *jettyInfo)
    1599              : {
    1600            0 :     struct MemRegAttrT memAttr = { 0 };
    1601            0 :     struct MemRegInfoT memInfo = { 0 };
    1602              :     int ret;
    1603              : 
    1604              :     // register dwqe_addr with page size 4096, return db_addr to use, specify ub to alloc token id
    1605            0 :     hccp_dbg("jetty_info->dwqe_addr:%pK, jettyInfo->dbAddr:%pK", jettyInfo->dwqe_addr, jettyInfo->db_addr);
    1606            0 :     memAttr.mem.addr = (uint64_t)(uintptr_t)jettyInfo->dwqe_addr;
    1607            0 :     memAttr.mem.size = 4096U;
    1608            0 :     memAttr.ub.flags.value = 0;
    1609            0 :     memAttr.ub.flags.bs.tokenPolicy = URMA_TOKEN_PLAIN_TEXT;
    1610            0 :     memAttr.ub.flags.bs.cacheable = URMA_NON_CACHEABLE;
    1611            0 :     memAttr.ub.flags.bs.access = MEM_SEG_ACCESS_READ | MEM_SEG_ACCESS_WRITE;
    1612            0 :     memAttr.ub.flags.bs.nonPin = 1;
    1613              :     // use user specified token id to register
    1614            0 :     if (jettyCb->tokenIdAddr != 0) {
    1615            0 :         memAttr.ub.flags.bs.tokenIdValid = URMA_TOKEN_ID_VALID;
    1616            0 :         memAttr.ub.tokenIdAddr = jettyCb->tokenIdAddr;
    1617              :     }
    1618            0 :     memAttr.ub.tokenValue = jettyCb->tokenValue;
    1619            0 :     ret = RsUbCtxLmemReg(jettyCb->devCb, &memAttr, &memInfo);
    1620            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("RsUbCtxLmemReg failed, ret:%d flags:0x%x", ret, memAttr.ub.flags.value), ret);
    1621              : 
    1622            0 :     jettyCb->dbTokenId = memInfo.ub.tokenId;
    1623            0 :     jettyCb->dbSegHandle = memInfo.ub.targetSegHandle;
    1624            0 :     return 0;
    1625              : }
    1626              : 
    1627            0 : STATIC int RsUbCtxDrvJettyCreate(struct RsCtxJettyCb *jettyCb, struct RsCtxJfcCb *sendJfcCb,
    1628              :     struct RsCtxJfcCb *recvJfcCb)
    1629              : {
    1630            0 :     urma_jetty_cfg_t jettyInitCfg = {0};
    1631            0 :     urma_jfs_cfg_t jfsCfg = {0};
    1632              : 
    1633            0 :     jettyInitCfg.id = jettyCb->jettyId;
    1634            0 :     jettyInitCfg.flag = jettyCb->flag;
    1635            0 :     RsUbCtxFillJfsCfg(jettyCb, sendJfcCb, &jfsCfg);
    1636            0 :     jettyInitCfg.jfs_cfg = jfsCfg;
    1637              : 
    1638            0 :     jettyInitCfg.shared.jfr = jettyCb->devCb->shareJfr;
    1639            0 :     jettyInitCfg.shared.jfc = (urma_jfc_t *)(uintptr_t)recvJfcCb->jfcAddr;
    1640              : 
    1641            0 :     if (jettyCb->jettyMode == JETTY_MODE_URMA_NORMAL) {
    1642            0 :         jettyCb->jetty = RsUrmaCreateJetty(jettyCb->devCb->urmaCtx, &jettyInitCfg);
    1643            0 :         if (jettyCb->jetty == NULL) {
    1644            0 :             hccp_err("rs_urma_create_jetty failed, errno=%d", errno);
    1645              :         }
    1646              :     } else {
    1647            0 :         RsUbCtxExtJettyCreate(jettyCb, &jettyInitCfg);
    1648              :     }
    1649              : 
    1650            0 :     if (jettyCb->jetty == NULL) {
    1651            0 :         return -ENOMEM;
    1652              :     }
    1653              : 
    1654            0 :     jettyCb->state = RS_JETTY_STATE_CREATED;
    1655              : 
    1656            0 :     hccp_run_info("chip_id:%u, devIndex:0x%x, jettyId:%u jetty create succ", jettyCb->devCb->rscb->chipId,
    1657              :         jettyCb->devCb->index, jettyCb->jetty->jetty_id.id);
    1658              : 
    1659            0 :     return 0;
    1660              : }
    1661              : 
    1662            0 : STATIC int RsUbFillJettyInfo(struct RsCtxJettyCb *jettyCb, struct QpCreateInfo *jettyInfo)
    1663              : {
    1664            0 :     struct RsJettyKeyInfo jettyKeyInfo = {0};
    1665              :     int ret;
    1666              : 
    1667            0 :     jettyKeyInfo.jettyId = jettyCb->jetty->jetty_id;
    1668            0 :     jettyKeyInfo.transMode = jettyCb->transportMode;
    1669            0 :     ret = memcpy_s(jettyInfo->key.value, DEV_QP_KEY_SIZE, &jettyKeyInfo, sizeof(struct RsJettyKeyInfo));
    1670            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("memcpy jetty_key_info failed, ret:%d", ret), -ESAFEFUNC);
    1671              : 
    1672            0 :     jettyInfo->key.size = (uint8_t)sizeof(struct RsJettyKeyInfo);
    1673            0 :     jettyInfo->ub.uasid = jettyCb->jetty->jetty_id.uasid;
    1674            0 :     jettyInfo->ub.id = jettyCb->jetty->jetty_id.id;
    1675            0 :     jettyInfo->ub.dbAddr = jettyCb->dbAddr;
    1676            0 :     jettyInfo->ub.sqBuffVa = jettyCb->sqBuffVa;
    1677            0 :     jettyInfo->ub.wqebbSize = WQE_BB_SIZE;
    1678            0 :     jettyInfo->ub.dbTokenId = jettyCb->dbTokenId;
    1679            0 :     jettyInfo->va = (uint64_t)(uintptr_t)jettyCb->jetty;
    1680            0 :     jettyInfo->ub.shareInfoAddr = (uint64_t)(uintptr_t)jettyCb->qpShareInfoAddr;
    1681            0 :     jettyInfo->ub.shareInfoLen = sizeof(struct CtxQpShareInfo);
    1682              : 
    1683            0 :     return 0;
    1684              : }
    1685              : 
    1686            0 : STATIC int RsUbQueryJfcCb(struct RsUbDevCb *devCb, unsigned long long scqIndex, unsigned long long rcqIndex,
    1687              :                               struct RsCtxJfcCb **sendJfcCb, struct RsCtxJfcCb **recvJfcCb)
    1688              : {
    1689              :     int ret;
    1690              : 
    1691            0 :     ret = RsUbGetJfcCb(devCb, scqIndex, sendJfcCb);
    1692            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("get send_jfc_cb failed, ret:%d scqIndex:0x%llx", ret, scqIndex), ret);
    1693              : 
    1694            0 :     ret = RsUbGetJfcCb(devCb, rcqIndex, recvJfcCb);
    1695            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("get recv_jfc_cb failed, ret:%d rcqIndex:0x%llx", ret, rcqIndex), ret);
    1696              : 
    1697            0 :     return 0;
    1698              : }
    1699              : 
    1700            2 : int RsUbCtxJettyCreate(struct RsUbDevCb *devCb, struct CtxQpAttr *attr, struct QpCreateInfo *info)
    1701              : {
    1702            2 :     struct RsCtxJfcCb *sendJfcCb = NULL;
    1703            2 :     struct RsCtxJfcCb *recvJfcCb = NULL;
    1704            2 :     struct RsCtxJettyCb *jettyCb = NULL;
    1705              :     int ret;
    1706              : 
    1707            2 :     ret = RsUbCtxInitJettyCb(devCb, attr, &jettyCb);
    1708            2 :     CHK_PRT_RETURN(ret != 0, hccp_err("alloc mem for jetty_cb failed, ret:%d", ret), ret);
    1709              : 
    1710            2 :     ret = RsUbQueryJfcCb(devCb, attr->scqIndex, attr->rcqIndex, &sendJfcCb, &recvJfcCb);
    1711            2 :     if (ret != 0) {
    1712            1 :         hccp_err("query jfc_cb scq_index:0x%llx rcq_index:0x%llx failed, ret:%d", attr->scqIndex, attr->rcqIndex,
    1713              :             ret);
    1714            1 :         goto free_jetty_cb;
    1715              :     }
    1716              : 
    1717              : #ifdef CUSTOM_INTERFACE
    1718            1 :     ret = RsUbJettyCbBuffAlloc(devCb, jettyCb, sendJfcCb->jfcType);
    1719            1 :     if (ret != 0) {
    1720            0 :         hccp_err("jetty_cb buff alloc failed ret:%d", ret);
    1721            0 :         goto free_jetty_cb;
    1722              :     }
    1723              : #endif
    1724              : 
    1725            1 :     ret = RsUbCtxDrvJettyCreate(jettyCb, sendJfcCb, recvJfcCb);
    1726            1 :     if (ret != 0) {
    1727            0 :         hccp_err("rs_ub_ctx_drv_jetty_create failed, ret:%d", ret);
    1728            0 :         goto free_jetty_cb;
    1729              :     }
    1730              : 
    1731            1 :     ret = RsUbFillJettyInfo(jettyCb, info);
    1732            1 :     if (ret != 0) {
    1733            1 :         hccp_err("rs_ub_fill_jetty_info failed, ret:%d", ret);
    1734            1 :         goto fill_jetty_info_err;
    1735              :     }
    1736              : 
    1737            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1738            0 :     jettyCb->scqIndex = attr->scqIndex;
    1739            0 :     jettyCb->rcqIndex = attr->rcqIndex;
    1740            0 :     RsListAddTail(&jettyCb->list, &devCb->jettyList);
    1741            0 :     devCb->jettyCnt++;
    1742            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1743              : 
    1744            0 :     hccp_run_info("[init][rs_ctx]devIndex:0x%x qp_id:%u mode:%d create success, jettyCnt:%u",
    1745              :         devCb->index, info->ub.id, jettyCb->jettyMode, devCb->jettyCnt);
    1746              : 
    1747            0 :     return 0;
    1748              : 
    1749            1 : fill_jetty_info_err:
    1750            1 :     RsUbCtxDrvJettyDelete(jettyCb);
    1751            2 : free_jetty_cb:
    1752            2 :     RsUbCtxFreeJettyCb(jettyCb);
    1753              : 
    1754            2 :     return ret;
    1755              : }
    1756              : 
    1757            2 : int RsUbGetJettyCb(struct RsUbDevCb *devCb, unsigned int jettyId, struct RsCtxJettyCb **jettyCb)
    1758              : {
    1759            2 :     struct RsCtxJettyCb **tempJettyCb = jettyCb;
    1760            2 :     struct RsCtxJettyCb *jettyCbCurr = NULL;
    1761            2 :     struct RsCtxJettyCb *jettyCbNext = NULL;
    1762              : 
    1763            2 :     RS_LIST_GET_HEAD_ENTRY(jettyCbCurr, jettyCbNext, &devCb->jettyList, list, struct RsCtxJettyCb);
    1764            3 :     for (; (&jettyCbCurr->list) != &devCb->jettyList;
    1765            1 :          jettyCbCurr = jettyCbNext,
    1766            1 :          jettyCbNext = list_entry(jettyCbNext->list.next, struct RsCtxJettyCb, list)) {
    1767            2 :         if (jettyCbCurr->jetty != NULL && jettyCbCurr->jetty->jetty_id.id == jettyId) {
    1768            1 :             *tempJettyCb = jettyCbCurr;
    1769            1 :             return 0;
    1770              :         }
    1771              :     }
    1772              : 
    1773            1 :     *tempJettyCb = NULL;
    1774            1 :     return -ENODEV;
    1775              : }
    1776              : 
    1777            0 : int RsUbCtxJettyDestroy(struct RsUbDevCb *devCb, unsigned int jettyId)
    1778              : {
    1779            0 :     struct RsCtxJettyCb *jettyCb = NULL;
    1780              :     int ret;
    1781              : 
    1782            0 :     ret = RsUbGetJettyCb(devCb, jettyId, &jettyCb);
    1783            0 :     CHK_PRT_RETURN(ret != 0, hccp_run_warn("get jetty_cb unsuccessful, ret:%d, jettyId %u", ret, jettyId), ret);
    1784            0 :     if (jettyCb->state != RS_JETTY_STATE_CREATED) {
    1785            0 :         hccp_err("jetty_cb->state:%u not support to destroy, jettyId:%u", jettyCb->state, jettyId);
    1786            0 :         return -EINVAL;
    1787              :     }
    1788              : 
    1789            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1790            0 :     RsListDel(&jettyCb->list);
    1791            0 :     devCb->jettyCnt--;
    1792            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1793              : 
    1794            0 :     RsUbCtxDrvJettyDelete(jettyCb);
    1795              : 
    1796            0 :     RsUbCtxFreeJettyCb(jettyCb);
    1797              : 
    1798            0 :     hccp_run_info("[deinit][rs_ctx]devIndex:0x%x qp_id:%u destroy success, jettyCnt:%u",
    1799              :         devCb->index, jettyId, devCb->jettyCnt);
    1800              : 
    1801            0 :     return 0;
    1802              : }
    1803              : 
    1804            2 : int RsUbCtxJettyFree(struct rs_cb *rscb, unsigned int ueInfo, unsigned int jettyId)
    1805              : {
    1806            2 :     struct RsUbDevCb *devCbCurr = NULL;
    1807            2 :     struct RsUbDevCb *devCbNext = NULL;
    1808            2 :     struct RsCtxJettyCb *jettyCb = NULL;
    1809            2 :     int ret = 0;
    1810              : 
    1811            2 :     RS_LIST_GET_HEAD_ENTRY(devCbCurr, devCbNext, &rscb->udevList, list, struct RsUbDevCb);
    1812            3 :     for (; (&devCbCurr->list) != &rscb->udevList;
    1813            1 :          devCbCurr = devCbNext, devCbNext = list_entry(devCbNext->list.next, struct RsUbDevCb, list)) {
    1814            2 :         if ((devCbCurr->index & DEV_INDEX_UE_INFO_MASK) != ueInfo) {
    1815            0 :             continue;
    1816              :         }
    1817              : 
    1818            2 :         RS_PTHREAD_MUTEX_LOCK(&devCbCurr->mutex);
    1819            2 :         ret = RsUbGetJettyCb(devCbCurr, jettyId, &jettyCb);
    1820            2 :         if (ret == 0) {
    1821            1 :             goto jetty_found;
    1822              :         }
    1823            1 :         RS_PTHREAD_MUTEX_ULOCK(&devCbCurr->mutex);
    1824              :     }
    1825              : 
    1826            1 :     hccp_run_warn("get jetty_cb unsuccessful, ueInfo:0x%x, jettyId:%u", ueInfo, jettyId);
    1827            1 :     return -ENODEV;
    1828              : 
    1829            1 : jetty_found:
    1830            1 :     RsListDel(&jettyCb->list);
    1831            1 :     devCbCurr->jettyCnt--;
    1832            1 :     RS_PTHREAD_MUTEX_ULOCK(&devCbCurr->mutex);
    1833              : 
    1834            1 :     if (jettyCb->state == RS_JETTY_STATE_BIND) {
    1835            1 :         hccp_info("jetty_id:%u will be unbind, devIndex:0x%x", jettyId, devCbCurr->index);
    1836            1 :         (void)RsUrmaUnbindJetty(jettyCb->jetty);
    1837              :     }
    1838              : 
    1839            1 :     if (jettyCb->state == RS_JETTY_STATE_BIND || jettyCb->state == RS_JETTY_STATE_CREATED) {
    1840            1 :         hccp_info("jetty_id:%u will be destroyed, devIndex:0x%x", jettyId, devCbCurr->index);
    1841            1 :         RsUbCtxDrvJettyDelete(jettyCb);
    1842              :     }
    1843              : 
    1844            1 :     RsUbCtxFreeJettyCb(jettyCb);
    1845            1 :     return 0;
    1846              : }
    1847              : 
    1848            0 : STATIC int RsUbCtxInitRjettyCb(struct RsUbDevCb *devCb, struct RsJettyImportAttr *importAttr,
    1849              :     struct RsCtxRemJettyCb **rjettyCb)
    1850              : {
    1851            0 :     struct RsCtxRemJettyCb *tmpRjettyCb = NULL;
    1852              : 
    1853            0 :     tmpRjettyCb = calloc(1, sizeof(struct RsCtxRemJettyCb));
    1854            0 :     CHK_PRT_RETURN(tmpRjettyCb == NULL, hccp_err("calloc tmp_rjetty_cb failed, errno:%d", errno), -ENOMEM);
    1855              : 
    1856            0 :     tmpRjettyCb->devCb = devCb;
    1857            0 :     tmpRjettyCb->jettyKey = importAttr->key;
    1858            0 :     tmpRjettyCb->mode = importAttr->attr.mode;
    1859            0 :     tmpRjettyCb->tokenValue = importAttr->attr.tokenValue;
    1860            0 :     tmpRjettyCb->policy = importAttr->attr.policy;
    1861            0 :     tmpRjettyCb->type = importAttr->attr.type;
    1862            0 :     tmpRjettyCb->flag = importAttr->attr.flag;
    1863            0 :     tmpRjettyCb->tpType = importAttr->attr.tpType;
    1864            0 :     tmpRjettyCb->expImportCfg = importAttr->attr.expImportCfg;
    1865              : 
    1866            0 :     *rjettyCb = tmpRjettyCb;
    1867            0 :     return 0;
    1868              : }
    1869              : 
    1870            1 : STATIC void RsUbCtxExpJettyImport(struct RsCtxRemJettyCb *rjettyCb, urma_rjetty_t *rjetty,
    1871              :     urma_token_t *tokenValue)
    1872              : {
    1873            1 :     urma_import_jetty_ex_cfg_t expCfg = {0};
    1874              : 
    1875            1 :     expCfg.tp_handle = rjettyCb->expImportCfg.tpHandle;
    1876            1 :     expCfg.peer_tp_handle = rjettyCb->expImportCfg.peerTpHandle;
    1877            1 :     expCfg.tag = rjettyCb->expImportCfg.tag;
    1878            1 :     expCfg.tp_attr.tx_psn = rjettyCb->expImportCfg.txPsn;
    1879            1 :     expCfg.tp_attr.rx_psn = rjettyCb->expImportCfg.rxPsn;
    1880              : 
    1881            1 :     rjettyCb->tjetty = RsUrmaImportJettyEx(rjettyCb->devCb->urmaCtx, rjetty, tokenValue, &expCfg);
    1882            1 : }
    1883              : 
    1884            1 : STATIC int RsUbCtxDrvJettyImport(struct RsCtxRemJettyCb *rjettyCb)
    1885              : {
    1886              :     struct RsJettyKeyInfo *jettyKeyInfo;
    1887            1 :     urma_token_t tokenValue = {0};
    1888            1 :     urma_rjetty_t rjetty = {0};
    1889              : 
    1890            1 :     tokenValue.token = rjettyCb->tokenValue;
    1891            1 :     jettyKeyInfo = (struct RsJettyKeyInfo *)rjettyCb->jettyKey.value;
    1892            1 :     rjetty.jetty_id = jettyKeyInfo->jettyId;
    1893            1 :     rjetty.trans_mode = jettyKeyInfo->transMode;
    1894            1 :     rjetty.policy = (urma_jetty_grp_policy_t)rjettyCb->policy;
    1895            1 :     rjetty.type = (urma_target_type_t)rjettyCb->type;
    1896            1 :     rjetty.flag.value = rjettyCb->flag.value;
    1897            1 :     rjetty.tp_type = rjettyCb->tpType;
    1898              : 
    1899            1 :     if (rjettyCb->mode == JETTY_IMPORT_MODE_NORMAL) {
    1900            0 :         rjettyCb->tjetty = RsUrmaImportJetty(rjettyCb->devCb->urmaCtx, &rjetty, &tokenValue);
    1901              :     } else { // rjetty_cb->mode == JETTY_IMPORT_MODE_EXP
    1902            1 :         RsUbCtxExpJettyImport(rjettyCb, &rjetty, &tokenValue);
    1903              :     }
    1904            1 :     CHK_PRT_RETURN(rjettyCb->tjetty == NULL, hccp_err("import_jetty failed, mode:%d errno:%d", rjettyCb->mode, errno),
    1905              :         -EOPENSRC);
    1906            1 :     return 0;
    1907              : }
    1908              : 
    1909            1 : int RsUbCtxJettyImport(struct RsUbDevCb *devCb, struct RsJettyImportAttr *importAttr,
    1910              :     struct RsJettyImportInfo *importInfo)
    1911              : {
    1912            1 :     struct RsCtxRemJettyCb *rjettyCb = NULL;
    1913              :     int ret;
    1914              : 
    1915            1 :     ret = RsUbCtxInitRjettyCb(devCb, importAttr, &rjettyCb);
    1916            1 :     CHK_PRT_RETURN(ret != 0, hccp_err("alloc mem for rjetty_cb failed, ret:%d", ret), ret);
    1917              : 
    1918            1 :     ret = RsUbCtxDrvJettyImport(rjettyCb);
    1919            1 :     if (ret != 0) {
    1920            1 :         hccp_err("rs_ub_ctx_drv_jetty_import failed, ret:%d", ret);
    1921            1 :         goto free_rjetty_cb;
    1922              :     }
    1923              : 
    1924            0 :     importInfo->remJettyId = rjettyCb->tjetty->id.id;
    1925            0 :     importInfo->info.tjettyHandle = (uint64_t)(uintptr_t)rjettyCb->tjetty;
    1926            0 :     importInfo->info.tpn = rjettyCb->tjetty->tp.tpn;
    1927              : 
    1928            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1929            0 :     RsListAddTail(&rjettyCb->list, &devCb->rjettyList);
    1930            0 :     devCb->rjettyCnt++;
    1931            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1932              : 
    1933            0 :     rjettyCb->state = RS_JETTY_STATE_IMPORTED;
    1934              : 
    1935            0 :     hccp_run_info("[init][rs_ctx]devIndex:0x%x rem_qp_id:%u mode:%d import success, rjettyCnt:%u",
    1936              :         devCb->index, importInfo->remJettyId, importAttr->attr.mode, devCb->rjettyCnt);
    1937              : 
    1938            0 :     return 0;
    1939              : 
    1940            1 : free_rjetty_cb:
    1941            1 :     free(rjettyCb);
    1942            1 :     rjettyCb = NULL;
    1943              : 
    1944            1 :     return ret;
    1945              : }
    1946              : 
    1947            0 : STATIC int RsUbGetRemJettyCb(struct RsUbDevCb *devCb, unsigned int remJettyId,
    1948              :                                   struct RsCtxRemJettyCb **rjettyCb)
    1949              : {
    1950            0 :     struct RsCtxRemJettyCb **tempJettyCb = rjettyCb;
    1951            0 :     struct RsCtxRemJettyCb *jettyCbCurr = NULL;
    1952            0 :     struct RsCtxRemJettyCb *jettyCbNext = NULL;
    1953              : 
    1954            0 :     RS_LIST_GET_HEAD_ENTRY(jettyCbCurr, jettyCbNext, &devCb->rjettyList, list, struct RsCtxRemJettyCb);
    1955            0 :     for (; (&jettyCbCurr->list) != &devCb->rjettyList;
    1956            0 :          jettyCbCurr = jettyCbNext,
    1957            0 :          jettyCbNext = list_entry(jettyCbNext->list.next, struct RsCtxRemJettyCb, list)) {
    1958            0 :         if (jettyCbCurr->tjetty == NULL) {
    1959            0 :             hccp_warn("rem_jetty_id:%u jetty_cb_curr->tjetty is NULL", remJettyId);
    1960            0 :             continue;
    1961              :         }
    1962            0 :         if (jettyCbCurr->tjetty->id.id == remJettyId) {
    1963            0 :             *tempJettyCb = jettyCbCurr;
    1964            0 :             return 0;
    1965              :         }
    1966              :     }
    1967              : 
    1968            0 :     *tempJettyCb = NULL;
    1969            0 :     hccp_err("rjetty_cb for rem_jetty %u do not available!", remJettyId);
    1970              : 
    1971            0 :     return -ENODEV;
    1972              : }
    1973              : 
    1974            0 : int RsUbCtxJettyUnimport(struct RsUbDevCb *devCb, unsigned int remJettyId)
    1975              : {
    1976            0 :     struct RsCtxRemJettyCb *rjettyCb = NULL;
    1977              :     unsigned int rjettyCnt;
    1978              :     int ret;
    1979              : 
    1980            0 :     ret = RsUbGetRemJettyCb(devCb, remJettyId, &rjettyCb);
    1981            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("get rjetty_cb failed, ret:%d remJettyId:%u", ret, remJettyId), ret);
    1982            0 :     CHK_PRT_RETURN(rjettyCb->state != RS_JETTY_STATE_IMPORTED, hccp_err("rjetty_cb->state:%u not support to "
    1983              :         "unimport, jettyId:%u", rjettyCb->state, remJettyId), -EINVAL);
    1984              : 
    1985            0 :     RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    1986            0 :     RsListDel(&rjettyCb->list);
    1987            0 :     devCb->rjettyCnt--;
    1988            0 :     rjettyCnt = devCb->rjettyCnt;
    1989            0 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    1990              : 
    1991            0 :     ret = RsUrmaUnimportJetty(rjettyCb->tjetty);
    1992            0 :     if (ret != 0) {
    1993            0 :         hccp_err("rs_urma_unimport_jetty failed, ret:%d, remJettyId %u", ret, remJettyId);
    1994            0 :         ret = -EOPENSRC;
    1995            0 :         goto out;
    1996              :     }
    1997              : 
    1998            0 :     hccp_run_info("[deinit][rs_qp]unimport jetty_id:%u success, rjettyCnt:%u, devIndex:0x%x",
    1999              :         remJettyId, rjettyCnt, devCb->index);
    2000            0 : out:
    2001            0 :     free(rjettyCb);
    2002            0 :     rjettyCb = NULL;
    2003            0 :     return ret;
    2004              : }
    2005              : 
    2006            0 : int RsUbCtxJettyBind(struct RsUbDevCb *devCb, struct RsCtxQpInfo *jettyInfo,
    2007              :     struct RsCtxQpInfo *rjettyInfo)
    2008              : {
    2009            0 :     struct RsCtxRemJettyCb *rjettyCb = NULL;
    2010            0 :     struct RsCtxJettyCb *jettyCb = NULL;
    2011              :     int ret;
    2012              : 
    2013            0 :     ret = RsUbGetJettyCb(devCb, jettyInfo->id, &jettyCb);
    2014            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("get jetty_cb failed, ret:%d, jettyId %u", ret, jettyInfo->id), ret);
    2015              : 
    2016            0 :     ret = RsUbGetRemJettyCb(devCb, rjettyInfo->id, &rjettyCb);
    2017            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("get rjetty_cb failed, ret:%d, remJettyId %u", ret, rjettyInfo->id), ret);
    2018              : 
    2019            0 :     if (jettyCb->state != RS_JETTY_STATE_CREATED || rjettyCb->state != RS_JETTY_STATE_IMPORTED) {
    2020            0 :         hccp_err("local jetty id:%u state:%u or remote jetty id:%u state:%u not support to bind",
    2021              :             jettyInfo->id, jettyCb->state, rjettyInfo->id, rjettyCb->state);
    2022            0 :         return -EINVAL;
    2023              :     }
    2024              : 
    2025            0 :     ret = RsUrmaBindJetty(jettyCb->jetty, rjettyCb->tjetty);
    2026            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_bind_jetty failed, ret:%d errno:%d", ret, errno), -EOPENSRC);
    2027              : 
    2028            0 :     jettyCb->state = RS_JETTY_STATE_BIND;
    2029              : 
    2030            0 :     hccp_run_info("rs ctx local jetty %u bind rem_jetty %u success, devIndex:0x%x",
    2031              :         jettyInfo->id, rjettyInfo->id, devCb->index);
    2032              : 
    2033            0 :     return 0;
    2034              : }
    2035              : 
    2036            0 : int RsUbCtxJettyUnbind(struct RsUbDevCb *devCb, unsigned int jettyId)
    2037              : {
    2038            0 :     struct RsCtxJettyCb *jettyCb = NULL;
    2039              :     int ret;
    2040              : 
    2041            0 :     ret = RsUbGetJettyCb(devCb, jettyId, &jettyCb);
    2042            0 :     CHK_PRT_RETURN(ret != 0, hccp_run_warn("get jetty_cb unsuccessful, ret:%d, jettyId %u", ret, jettyId), ret);
    2043            0 :     if (jettyCb->state != RS_JETTY_STATE_BIND) {
    2044            0 :         hccp_err("jetty_cb->state:%u not support to unbind, jettyId:%u", jettyCb->state, jettyId);
    2045            0 :         return -EINVAL;
    2046              :     }
    2047              : 
    2048            0 :     ret = RsUrmaUnbindJetty(jettyCb->jetty);
    2049            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_unbind_jetty failed, ret:%d jettyId %u", ret, jettyId), -EOPENSRC);
    2050              : 
    2051            0 :     jettyCb->state = RS_JETTY_STATE_CREATED;
    2052              : 
    2053            0 :     hccp_run_info("rs ctx local jetty %u unbind rem jetty success, devIndex:0x%x", jettyId, devCb->index);
    2054              : 
    2055            0 :     return 0;
    2056              : }
    2057              : 
    2058            0 : STATIC int RsUbCtxFillLsge(struct RsUbDevCb *devCb, urma_sge_t *lsge, struct BatchSendWrData *wrData,
    2059              :     unsigned int *totalLen, bool isInline)
    2060              : {
    2061            0 :     struct RsSegCb *segCb = NULL;
    2062            0 :     unsigned int totalLenTmp = 0;
    2063              :     unsigned int i;
    2064              :     int ret;
    2065              : 
    2066            0 :     if (isInline == false) {
    2067            0 :         for (i = 0; i < wrData->numSge; i++) {
    2068            0 :             lsge[i].addr = wrData->sges[i].addr;
    2069            0 :             lsge[i].len = wrData->sges[i].len;
    2070            0 :             totalLenTmp += lsge[i].len;
    2071            0 :             ret = RsUbQuerySegCb(devCb, wrData->sges[i].devLmemHandle, &segCb, &devCb->lsegList);
    2072            0 :             CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]can not find lmem seg cb for addr:0x%llx",
    2073              :                 lsge[i].addr), ret);
    2074            0 :             lsge[i].tseg = segCb->segment;
    2075              :         }
    2076              :     } else {
    2077            0 :         lsge[0].addr = (uint64_t)(uintptr_t)wrData->inlineData;
    2078            0 :         lsge[0].len = wrData->inlineSize;
    2079            0 :         lsge[0].tseg = NULL;
    2080              :     }
    2081              : 
    2082            0 :     *totalLen = totalLenTmp;
    2083            0 :     return 0;
    2084              : }
    2085              : 
    2086            0 : STATIC int RsUbCtxFillRsge(struct RsUbDevCb *devCb, urma_sge_t *rsge, struct BatchSendWrData *wrData,
    2087              :     unsigned int totalLen, urma_opcode_t opcode)
    2088              : {
    2089            0 :     struct RsSegCb *segCb = NULL;
    2090              :     int ret;
    2091              : 
    2092            0 :     rsge[0].addr = wrData->remoteAddr;
    2093            0 :     rsge[0].len = totalLen;
    2094            0 :     ret = RsUbQuerySegCb(devCb, wrData->devRmemHandle, &segCb, &devCb->rsegList);
    2095            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]can not find rmem seg cb for addr:0x%llx",
    2096              :         rsge[0].addr), ret);
    2097            0 :     rsge[0].tseg = segCb->segment;
    2098              : 
    2099            0 :     if (opcode == URMA_OPC_WRITE_NOTIFY) {
    2100            0 :         rsge[1].addr = wrData->ub.notifyInfo.notifyAddr;
    2101            0 :         rsge[1].len = 8; /* notify data is fixed 8 bytes */
    2102            0 :         ret = RsUbQuerySegCb(devCb, wrData->ub.notifyInfo.notifyHandle, &segCb, &devCb->rsegList);
    2103            0 :         CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]can not find rmem seg cb for addr:0x%llx",
    2104              :             rsge[1].addr), ret);
    2105            0 :         rsge[1].tseg = segCb->segment;
    2106              :     }
    2107              : 
    2108            0 :     return 0;
    2109              : }
    2110              : 
    2111            0 : STATIC int RsUbCtxInitRwWr(struct RsUbDevCb *devCb, urma_jfs_wr_t *ubWr, struct BatchSendWrData *wrData,
    2112              :     urma_sge_t *lsge, urma_sge_t *rsge)
    2113              : {
    2114              :     unsigned int lsgeNum, rsgeNum;
    2115            0 :     unsigned int totalLen = 0;
    2116              :     int ret;
    2117              : 
    2118            0 :     lsgeNum = (ubWr->flag.bs.inline_flag == 0) ? wrData->numSge : 1;
    2119            0 :     ret = RsUbCtxFillLsge(devCb, lsge, wrData, &totalLen, ubWr->flag.bs.inline_flag);
    2120            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]fill lsge failed, ret:%d", ret), ret);
    2121              : 
    2122              :     /* write with norify have 2 dst sge, sge[0] is data sge, sge[1] is notify sge */
    2123            0 :     rsgeNum = (ubWr->opcode == URMA_OPC_WRITE_NOTIFY) ? 2 : 1;
    2124            0 :     ret = RsUbCtxFillRsge(devCb, rsge, wrData, totalLen, ubWr->opcode);
    2125            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]fill rsge failed, ret:%d", ret), ret);
    2126              : 
    2127            0 :     if (ubWr->opcode == URMA_OPC_READ) {
    2128            0 :         ubWr->rw.src.sge = rsge;
    2129            0 :         ubWr->rw.src.num_sge = rsgeNum;
    2130            0 :         ubWr->rw.dst.sge = lsge;
    2131            0 :         ubWr->rw.dst.num_sge = lsgeNum;
    2132              :     } else {
    2133            0 :         ubWr->rw.src.sge = lsge;
    2134            0 :         ubWr->rw.src.num_sge = lsgeNum;
    2135            0 :         ubWr->rw.dst.sge = rsge;
    2136            0 :         ubWr->rw.dst.num_sge = rsgeNum;
    2137              :     }
    2138              : 
    2139              :     // assign notify data & imm data
    2140            0 :     if (ubWr->opcode == URMA_OPC_WRITE_NOTIFY) {
    2141            0 :         ubWr->rw.notify_data = wrData->ub.notifyInfo.notifyData;
    2142              :     } else {
    2143            0 :         ubWr->rw.notify_data = (uint64_t)wrData->immData;
    2144              :     }
    2145              : 
    2146            0 :     return 0;
    2147              : }
    2148              : 
    2149            0 : STATIC int RsUbCtxInitJfsWr(struct RsCtxJettyCb *jettyCb, struct udma_u_jfs_wr_ex *ubWr,
    2150              :     struct BatchSendWrData *wrData, urma_sge_t *lsge, urma_sge_t *rsge)
    2151              : {
    2152            0 :     urma_opcode_t opcode = (urma_opcode_t)wrData->ub.opcode;
    2153            0 :     struct RsCtxRemJettyCb *rjettyCb = NULL;
    2154              :     int ret;
    2155              : 
    2156            0 :     if (wrData->numSge > MAX_SGE_NUM) {
    2157            0 :         hccp_err("[send][rs_ub_ctx]num_sge is invalid, numSge[%d]", wrData->numSge);
    2158            0 :         return -EINVAL;
    2159              :     }
    2160              : 
    2161            0 :     ubWr->wr.opcode = opcode;
    2162            0 :     ubWr->wr.flag.value = wrData->ub.flags.value;
    2163            0 :     ubWr->wr.user_ctx = wrData->ub.userCtx;
    2164              : 
    2165            0 :     if (opcode == URMA_OPC_NOP) {
    2166            0 :         return 0;
    2167              :     }
    2168              : 
    2169              :     // only write & write with notify & read op support inline reduce
    2170            0 :     if (opcode == URMA_OPC_READ || opcode == URMA_OPC_WRITE || opcode == URMA_OPC_WRITE_NOTIFY) {
    2171            0 :         ubWr->reduce_en = wrData->ub.reduceInfo.reduceEn;
    2172            0 :         ubWr->reduce_opcode = wrData->ub.reduceInfo.reduceOpcode;
    2173            0 :         ubWr->reduce_data_type = wrData->ub.reduceInfo.reduceDataType;
    2174            0 :         hccp_dbg("[send][rs_ub_ctx]opcode[%d] reduce_en[%d] reduce_opcode[%d] reduce_data_type[%d]",
    2175              :             opcode, ubWr->reduce_en, ubWr->reduce_opcode, ubWr->reduce_data_type);
    2176              :     }
    2177              : 
    2178            0 :     if (opcode == URMA_OPC_READ || opcode == URMA_OPC_WRITE || opcode == URMA_OPC_WRITE_NOTIFY ||
    2179              :         opcode == URMA_OPC_WRITE_IMM) {
    2180            0 :         ret = RsUbGetRemJettyCb(jettyCb->devCb, (unsigned int)wrData->ub.remJetty, &rjettyCb);
    2181            0 :         CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]get rjetty_cb failed, ret:%d remJettyId:%llu", ret, wrData->ub.remJetty), ret);
    2182              : 
    2183            0 :         ubWr->wr.tjetty = rjettyCb->tjetty;
    2184            0 :         return RsUbCtxInitRwWr(jettyCb->devCb, &ubWr->wr, wrData, lsge, rsge);
    2185              :     }
    2186              : 
    2187            0 :     hccp_err("[send][rs_ub_ctx]invalid opcode[%d]", opcode);
    2188            0 :     return -EINVAL;
    2189              : }
    2190              : 
    2191            0 : STATIC int RsUbCtxBatchSendWrExt(struct RsCtxJettyCb *jettyCb, struct BatchSendWrData *wrData,
    2192              :     struct SendWrResp *wrResp, struct WrlistSendCompleteNum *wrlistNum)
    2193              : {
    2194              : #define UB_DWQE_BB_NUM  2U
    2195              : #define UB_DWQE_BB_SIZE 64U
    2196            0 :     unsigned int sendNum = wrlistNum->sendNum;
    2197            0 :     struct udma_u_jfs_wr_ex *badWr = NULL;
    2198            0 :     struct udma_u_post_info wrOut = {0};
    2199            0 :     urma_sge_t rsge[MAX_RSGE_NUM] = {0};
    2200            0 :     urma_sge_t lsge[MAX_SGE_NUM] = {0};
    2201            0 :     struct udma_u_jfs_wr_ex ubWr = {0};
    2202            0 :     struct udma_u_wr_ex wrIn = {0};
    2203            0 :     urma_user_ctl_out_t out = {0};
    2204            0 :     urma_user_ctl_in_t in = {0};
    2205              :     unsigned int i;
    2206            0 :     int ret = 0;
    2207              : 
    2208            0 :     for (i = 0; i < sendNum; i++) {
    2209            0 :         ret = RsUbCtxInitJfsWr(jettyCb, &ubWr, &wrData[i], &lsge[0], &rsge[0]);
    2210            0 :         if (ret != 0) {
    2211            0 :             hccp_err("[send][rs_ub_ctx]init jfs wr failed, ret:%d, curr_num[%u], sendNum[%u]", ret, i, sendNum);
    2212            0 :             break;
    2213              :         }
    2214              : 
    2215            0 :         wrIn.is_jetty = true;
    2216            0 :         wrIn.jetty = jettyCb->jetty;
    2217            0 :         wrIn.wr = &ubWr;
    2218            0 :         wrIn.bad_wr = &badWr;
    2219              : 
    2220            0 :         in.addr = (uint64_t)(uintptr_t)&wrIn;
    2221            0 :         in.len = (uint32_t)sizeof(struct udma_u_wr_ex);
    2222            0 :         in.opcode = UDMA_U_USER_CTL_POST_WR;
    2223              : 
    2224            0 :         out.addr = (uint64_t)(uintptr_t)&wrOut;
    2225            0 :         out.len = sizeof(struct udma_u_post_info);
    2226              : 
    2227            0 :         ret = RsUrmaUserCtl(jettyCb->devCb->urmaCtx, &in, &out);
    2228            0 :         if (ret != 0) {
    2229            0 :             hccp_err("rs_urma_user_ctl batch send wr failed, ret:%d, wr[%u], sendNum[%u] errno:%d",
    2230              :                 ret, i, sendNum, errno);
    2231            0 :             ret = -EOPENSRC;
    2232            0 :             break;
    2233              :         }
    2234              : 
    2235            0 :         wrResp[i].doorbellInfo.dieId = (uint16_t)jettyCb->devCb->devAttr.ub.dieId;
    2236            0 :         wrResp[i].doorbellInfo.funcId = (uint16_t)jettyCb->devCb->devAttr.ub.funcId;
    2237            0 :         wrResp[i].doorbellInfo.jettyId = (uint16_t)jettyCb->jetty->jetty_id.id;
    2238            0 :         wrResp[i].doorbellInfo.piVal = (uint16_t)wrOut.pi;
    2239              :         // prepare dwqe doorbell info, only support 2BB, each BB size is 64B
    2240            0 :         if (wrOut.pi - jettyCb->lastPi <= UB_DWQE_BB_NUM) {
    2241            0 :             wrResp[i].doorbellInfo.dwqeSize = (uint16_t)(wrOut.pi - jettyCb->lastPi) * UB_DWQE_BB_SIZE;
    2242            0 :             ret = memcpy_s(wrResp[i].doorbellInfo.dwqe, wrResp[i].doorbellInfo.dwqeSize,
    2243            0 :                 wrOut.ctrl, wrResp[i].doorbellInfo.dwqeSize);
    2244            0 :             if (ret != 0) {
    2245            0 :                 hccp_err("[send][rs_ub_ctx]memcpy_s failed, ret:%d, wr[%u], sendNum[%u]", ret, i, sendNum);
    2246            0 :                 ret = -ESAFEFUNC;
    2247            0 :                 break;
    2248              :             }
    2249              :         }
    2250            0 :         jettyCb->lastPi = wrOut.pi;
    2251              : 
    2252              :         // record doorbell info
    2253            0 :         hccp_dbg("jetty_id %u post info: dwqe_addr:%pK, dbAddr:%pK, ctrl:%pK, pi:%u",
    2254              :             jettyCb->jetty->jetty_id.id, wrOut.dwqe_addr, wrOut.db_addr, wrOut.ctrl, wrOut.pi);
    2255              :     }
    2256              : 
    2257            0 :     *wrlistNum->completeNum = i;
    2258            0 :     return ret;
    2259              : }
    2260              : 
    2261            2 : int RsUbCtxBatchSendWr(struct rs_cb *rsCb, struct WrlistBaseInfo *baseInfo,
    2262              :     struct BatchSendWrData *wrData, struct SendWrResp *wrResp, struct WrlistSendCompleteNum *wrlistNum)
    2263              : {
    2264            2 :     struct RsCtxJettyCb *jettyCb = NULL;
    2265            2 :     struct RsUbDevCb *devCb = NULL;
    2266              :     int ret;
    2267              : 
    2268            2 :     if (wrlistNum->sendNum > MAX_CTX_WR_NUM || wrlistNum->sendNum == 0) {
    2269            0 :         hccp_err("[send][rs_ub_ctx] send_num[%u] is invalid", wrlistNum->sendNum);
    2270            0 :         return -EINVAL;
    2271              :     }
    2272              : 
    2273            2 :     ret = RsUbGetDevCb(rsCb, baseInfo->devIndex, &devCb);
    2274            2 :     CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]get dev_cb failed, ret:%d, devIndex:0x%x", ret, baseInfo->devIndex), ret);
    2275              : 
    2276            1 :     ret = RsUbGetJettyCb(devCb, baseInfo->qpn, &jettyCb);
    2277            1 :     CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]get jetty_cb failed, ret:%d, jettyId[%u]", ret, baseInfo->qpn), ret);
    2278              : 
    2279            0 :     ret = RsUbCtxBatchSendWrExt(jettyCb, wrData, wrResp, wrlistNum);
    2280            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]send wr ext failed, ret:%d, sendNum[%u], completeNum[%u]",
    2281              :         ret, wrlistNum->sendNum, *wrlistNum->completeNum), ret);
    2282              : 
    2283            0 :     return 0;
    2284              : }
    2285              : 
    2286            0 : int RsUbCtxJettyUpdateCi(struct RsUbDevCb *devCb, unsigned int jettyId, uint16_t ci)
    2287              : {
    2288            0 :     struct RsCtxJettyCb *jettyCb = NULL;
    2289            0 :     struct udma_u_update_ci ciData = { 0 };
    2290            0 :     urma_user_ctl_out_t out = { 0 };
    2291            0 :     urma_user_ctl_in_t in = { 0 };
    2292              :     int ret;
    2293              : 
    2294            0 :     ret = RsUbGetJettyCb(devCb, jettyId, &jettyCb);
    2295            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("get jetty_cb failed, ret:%d, jettyId:%u", ret, jettyId), ret);
    2296              : 
    2297            0 :     ciData.is_jetty = true;
    2298            0 :     ciData.ci = ci;
    2299            0 :     ciData.jetty = jettyCb->jetty;
    2300            0 :     in.addr = (uint64_t)(uintptr_t)&ciData;
    2301            0 :     in.len = (uint32_t)sizeof(struct udma_u_update_ci);
    2302            0 :     in.opcode = UDMA_U_USER_CTL_UPDATE_CI;
    2303            0 :     ret = RsUrmaUserCtl(jettyCb->devCb->urmaCtx, &in, &out);
    2304            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_user_ctl update ci failed, ret:%d errno:%d jettyId:%u ci:%u",
    2305              :         ret, errno, jettyId, ci), -EOPENSRC);
    2306              : 
    2307            0 :     hccp_info("[update_ci]devIndex:0x%x jetty_id:%u update ci:%u success", devCb->index, jettyId, ci);
    2308              : 
    2309            0 :     return 0;
    2310              : }
    2311              : 
    2312            5 : STATIC int RsUbGetJettyDestroyBatchInfo(struct RsUbDevCb *devCb, unsigned int jettyIds[],
    2313              :     struct JettyDestroyBatchInfo *batchInfo, unsigned int *num)
    2314              : {
    2315              :     unsigned int i;
    2316            5 :     int ret = 0;
    2317              : 
    2318            8 :     for (i = 0; i < *num; ++i) {
    2319            5 :         ret = RsUbGetJettyCb(devCb, jettyIds[i], &batchInfo->jettyCbArr[i]);
    2320            5 :         CHK_PRT_RETURN(ret != 0, hccp_err("get jetty_cb[%u] failed, jettyId:%u, ret:%d", i, jettyIds[i], ret), ret);
    2321            4 :         CHK_PRT_RETURN(batchInfo->jettyCbArr[i]->state != RS_JETTY_STATE_CREATED, hccp_err("jetty_cb[%u]->state:%u "
    2322              :         "not support to destroy, jettyId:%u", i, batchInfo->jettyCbArr[i]->state, jettyIds[i]), -EINVAL);
    2323              : 
    2324            3 :         RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
    2325            3 :         RsListDel(&batchInfo->jettyCbArr[i]->list);
    2326            3 :         devCb->jettyCnt--;
    2327            3 :         RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
    2328              : 
    2329            3 :         batchInfo->jettyArr[i] = batchInfo->jettyCbArr[i]->jetty;
    2330              :     }
    2331              : 
    2332            3 :     return ret;
    2333              : }
    2334              : 
    2335            9 : int RsUbCtxJettyDestroyBatch(struct RsUbDevCb *devCb, unsigned int jettyIds[], unsigned int *num)
    2336              : {
    2337            9 :     struct JettyDestroyBatchInfo batchInfo = {0};
    2338              :     int ret;
    2339              : 
    2340            9 :     CHK_PRT_RETURN(*num == 0, hccp_err("num(%u) = 0, no need to destroy batch", *num), -EINVAL);
    2341              : 
    2342            8 :     ret = RsUbCallocJettyBatchInfo(&batchInfo, *num);
    2343            8 :     if (ret != 0) {
    2344            1 :         *num = 0;
    2345            1 :         hccp_err("rs_ub_calloc_jetty_batch_info failed, ret:%d", ret);
    2346            1 :         goto free_batch_info;
    2347              :     }
    2348              : 
    2349            7 :     ret = RsUbGetJettyDestroyBatchInfo(devCb, jettyIds, &batchInfo, num);
    2350            7 :     if (ret != 0) {
    2351            2 :         *num = 0;
    2352            2 :         hccp_err("get jetty destroy batch info failed, ret:%d", ret);
    2353            2 :         goto free_batch_info;
    2354              :     }
    2355              : 
    2356            5 :     ret = RsUbDestroyJettyCbBatch(&batchInfo, num);
    2357            5 :     if (ret != 0) {
    2358            2 :         hccp_err("rs_ub_destroy_jetty_cb_batch failed, ret:%d", ret);
    2359              :     }
    2360              : 
    2361            3 : free_batch_info:
    2362            8 :     RsUbFreeJettyBatchInfo(&batchInfo);
    2363            8 :     return ret;
    2364              : }
    2365              : 
    2366            3 : int RsUbCtxQueryJettyBatch(struct RsUbDevCb *devCb, unsigned int jettyIds[], struct JettyAttr attr[],
    2367              :     unsigned int *num)
    2368              : {
    2369            3 :     struct RsCtxJettyCb *jettyCb = NULL;
    2370            3 :     urma_jetty_attr_t attrTmp = {0};
    2371            3 :     urma_jetty_cfg_t cfg = {0};
    2372            3 :     unsigned int i = 0;
    2373            3 :     int ret = 0;
    2374              : 
    2375            6 :     for (i = 0; i < *num; ++i) {
    2376            5 :         (void)memset_s(&attrTmp, sizeof(urma_jetty_attr_t), 0, sizeof(urma_jetty_attr_t));
    2377            5 :         ret = RsUbGetJettyCb(devCb, jettyIds[i], &jettyCb);
    2378            5 :         if (ret != 0) {
    2379            1 :             hccp_err("get jetty_cb failed, ret:%d, jettyId[%u]:%u", ret, i, jettyIds[i]);
    2380            1 :             break;
    2381              :         }
    2382              : 
    2383            4 :         ret = RsUrmaQueryJetty(jettyCb->jetty, &cfg, &attrTmp);
    2384            4 :         if (ret != 0) {
    2385            1 :             hccp_err("rs_urma_query_jetty failed, ret:%d, jettyId[%u]:%u", ret, i, jettyIds[i]);
    2386            1 :             break;
    2387              :         }
    2388              : 
    2389            3 :         (void)memcpy_s(&attr[i], sizeof(urma_jetty_attr_t), &attrTmp, sizeof(urma_jetty_attr_t));
    2390              :     }
    2391              : 
    2392            3 :     *num = i;
    2393            3 :     return ret;
    2394              : }
        

Generated by: LCOV version 2.0-1