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.3 % 1528 387
Test Date: 2026-08-17 10:19:35 Functions: 29.1 % 86 25

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

Generated by: LCOV version 2.0-1