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

Generated by: LCOV version 2.0-1