LCOV - code coverage report
Current view: top level - base_comm/resources/hccp/rdma_service - rs.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 81.1 % 1276 1035
Test Date: 2026-08-29 17:38:31 Functions: 96.5 % 85 82

            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              : #define _GNU_SOURCE
      12              : #include "rs.h"
      13              : #include "ra_rs_err.h"
      14              : #include <unistd.h>
      15              : #include <string.h>
      16              : #include <stdlib.h>
      17              : #include <sys/types.h>
      18              : #include <ifaddrs.h>
      19              : #include <netinet/in.h>
      20              : #include <sys/epoll.h>
      21              : #include <sys/eventfd.h>
      22              : #include <sys/socket.h>
      23              : #include <sys/fcntl.h>
      24              : #include <arpa/inet.h>
      25              : #include <dlfcn.h>
      26              : #include <fnmatch.h>
      27              : #include "securec.h"
      28              : #include "rs_common_inner.h"
      29              : #include "rs_inner.h"
      30              : #include "rs_rdma_inner.h"
      31              : #include "rs_nda.h"
      32              : #include "rs_epoll.h"
      33              : #include "rs_tls.h"
      34              : #include "ssl_adp.h"
      35              : #include "rs_socket.h"
      36              : #include "dl_ibverbs_function.h"
      37              : #include "dl_hal_function.h"
      38              : #include "rs_drv_rdma.h"
      39              : #include "file_opt.h"
      40              : #ifdef CONFIG_TLV
      41              : #include "rs_tlv.h"
      42              : #endif
      43              : #include "ra_rs_ctx.h"
      44              : #include "rs_ctx.h"
      45              : #include "rs_esched.h"
      46              : #include "dl_net_function.h"
      47              : #include "rs_ub.h"
      48              : #include "rs_ctx_inner.h"
      49              : 
      50              : __thread struct rs_cb *gRsCb = NULL;           // lint !e17
      51              : struct rs_cb *gRsCbList[RS_MAX_DEV_NUM] = {0}; // lint !e17
      52              : int gInitCounter[RS_MAX_DEV_NUM] = {0};
      53              : 
      54              : /* set current phyId g_rs_cb */
      55            1 : void RsSetCtx(unsigned int phyId)
      56              : {
      57            1 :     gRsCb = gRsCbList[phyId];
      58            1 : }
      59              : 
      60              : /* get current g_rs_cb */
      61            3 : static struct rs_cb *RsGetCurRsCb(void)
      62              : {
      63          195 :     for (int i = 0; i < RS_MAX_DEV_NUM; i++) {
      64          192 :         if (gRsCbList[i] != NULL) {
      65            0 :             hccp_info("[rs_get_cur_rs_cb], phyId[%u], rsCb[%p]", i, gRsCbList[i]);
      66            0 :             return gRsCbList[i];
      67              :         }
      68              :     }
      69            3 :     return NULL;
      70              : }
      71              : 
      72          364 : RS_ATTRI_VISI_DEF void RsGetCurTime(struct timeval *time)
      73              : {
      74              :     int ret;
      75              : 
      76          364 :     RS_CHECK_POINTER_NULL_RETURN_VOID(time);
      77          364 :     ret = gettimeofday(time, NULL);
      78          362 :     if (ret) {
      79            1 :         hccp_warn("gettimeofday unsuccessful, ret[%d] expect 0", ret);
      80            1 :         ret = memset_s(time, sizeof(struct timeval), 0, sizeof(struct timeval));
      81            1 :         if (ret) {
      82            1 :             hccp_warn("memset_s unsuccessful, ret[%d] expect 0", ret);
      83              :         }
      84              :     }
      85              : 
      86          362 :     return;
      87              : }
      88              : 
      89          166 : RS_ATTRI_VISI_DEF void HccpTimeInterval(struct timeval *endTime, struct timeval *startTime, float *msec)
      90              : {
      91          166 :     RS_CHECK_POINTER_NULL_RETURN_VOID(endTime);
      92          166 :     RS_CHECK_POINTER_NULL_RETURN_VOID(startTime);
      93          166 :     RS_CHECK_POINTER_NULL_RETURN_VOID(msec);
      94              : 
      95              :     /* if low position is sufficient, then borrow one from the high position */
      96          166 :     if (endTime->tv_usec < startTime->tv_usec) {
      97            0 :         endTime->tv_sec -= 1;
      98            0 :         endTime->tv_usec += MS_PER_SECOND_I * MS_PER_SECOND_I;
      99              :     }
     100              : 
     101          166 :     *msec = (float)((endTime->tv_sec - startTime->tv_sec) * MS_PER_SECOND_F +
     102          166 :                     (endTime->tv_usec - startTime->tv_usec) / US_PER_MS_F);
     103              : 
     104          166 :     return;
     105              : }
     106              : 
     107           77 : RS_ATTRI_VISI_DEF void RsHeartbeatAlivePrint(struct RsPthreadInfo *pthreadInfo)
     108              : {
     109           77 :     float timeCost = 0.0;
     110              :     struct timeval now;
     111              : 
     112           77 :     if (pthreadInfo == NULL) {
     113            0 :         hccp_err("pthread_info is NULL!");
     114            0 :         return;
     115              :     }
     116              : 
     117           77 :     RsGetCurTime(&now);
     118           77 :     HccpTimeInterval(&now, &pthreadInfo->lastCheckTime, &timeCost);
     119           77 :     if (timeCost >= RS_HEARTBEAT_TIME || timeCost <= 0) {
     120            0 :         hccp_info("pthread[%s] is alive!", pthreadInfo->pthreadName);
     121            0 :         RsGetCurTime(&pthreadInfo->lastCheckTime);
     122              :     }
     123              : 
     124           77 :     return;
     125              : }
     126              : 
     127          483 : int RsDev2rscb(uint32_t chipId, struct rs_cb **rsCb, bool initFlag)
     128              : {
     129          483 :     if (gRsCb == NULL) {
     130           44 :         if (initFlag == false) {
     131            2 :             hccp_warn("No device initialized !");
     132              :         }
     133           44 :         return -ENODEV;
     134              :     }
     135              : 
     136          439 :     if (chipId == gRsCb->chipId) {
     137          436 :         *rsCb = gRsCb;
     138          436 :         return 0;
     139              :     }
     140              : 
     141            3 :     hccp_warn("get rs cb unsuccessful for dev %u !", chipId);
     142            3 :     *rsCb = NULL;
     143              : 
     144            3 :     return -ENODEV;
     145              : }
     146              : 
     147           32 : int RsGetHccpMode(unsigned int chipId)
     148              : {
     149           32 :     struct rs_cb *rsCb = NULL;
     150              :     int ret;
     151              : 
     152           32 :     ret = RsDev2rscb(chipId, &rsCb, false);
     153           32 :     CHK_PRT_RETURN(ret, hccp_err("get rs_cb failed(%d)", ret), ret);
     154           31 :     return (int)rsCb->hccpMode;
     155              : }
     156              : 
     157           93 : int RsDev2conncb(uint32_t chipId, struct RsConnCb **connCb)
     158              : {
     159              :     int ret;
     160           93 :     struct rs_cb *rsCb = NULL;
     161              : 
     162           93 :     ret = RsDev2rscb(chipId, &rsCb, false);
     163           93 :     CHK_PRT_RETURN(ret, hccp_err("get rs_cb failed(%d)", ret), ret);
     164              : 
     165           93 :     *connCb = &(rsCb->connCb);
     166              : 
     167           93 :     return 0;
     168              : }
     169              : 
     170          262 : int RsGetRdevCb(struct rs_cb *rsCb, unsigned int rdevIndex, struct RsRdevCb **rdevCb)
     171              : {
     172          262 :     struct RsRdevCb *rdevCbTmp = NULL;
     173          262 :     struct RsRdevCb *rdevCbTmp2 = NULL;
     174              : 
     175          262 :     RS_LIST_GET_HEAD_ENTRY(rdevCbTmp, rdevCbTmp2, &rsCb->rdevList, list, struct RsRdevCb);
     176          263 :     for (; (&rdevCbTmp->list) != &rsCb->rdevList;
     177            1 :          rdevCbTmp = rdevCbTmp2, rdevCbTmp2 = list_entry(rdevCbTmp2->list.next, struct RsRdevCb, list)) {
     178          262 :         if (rdevCbTmp->rdevIndex == rdevIndex) {
     179          261 :             *rdevCb = rdevCbTmp;
     180          261 :             return 0;
     181              :         }
     182              :     }
     183              : 
     184            1 :     *rdevCb = NULL;
     185            1 :     hccp_err("rdev_cb for rdev_index[%u] do not available!", rdevIndex);
     186              : 
     187            1 :     return -ENODEV;
     188              : }
     189              : 
     190           47 : int RsRdev2rdevCb(unsigned int chipId, unsigned int rdevIndex, struct RsRdevCb **rdevCb)
     191              : {
     192              :     int ret;
     193           47 :     struct rs_cb *rsCb = NULL;
     194              : 
     195           47 :     ret = RsDev2rscb(chipId, &rsCb, false);
     196           47 :     CHK_PRT_RETURN(ret, hccp_err("get rs_cb failed for chipId:%u, ret:%d", chipId, ret), -ENODEV);
     197              : 
     198           47 :     ret = RsGetRdevCb(rsCb, rdevIndex, rdevCb);
     199           47 :     CHK_PRT_RETURN(ret, hccp_err("rs_get_rdev_cb failed!, ret %d, rdevIndex %u", ret, rdevIndex), ret);
     200              : 
     201           46 :     return 0;
     202              : }
     203              : 
     204           44 : STATIC int RsPthreadMutexInit(struct rs_cb *rscb, struct RsInitConfig *cfg)
     205              : {
     206              :     int ret;
     207              :     int err;
     208              : 
     209           44 :     RS_CHECK_POINTER_NULL_RETURN_INT(cfg);
     210           44 :     RS_CHECK_POINTER_NULL_RETURN_INT(rscb);
     211           44 :     rscb->chipId = cfg->chipId;
     212           44 :     rscb->hccpMode = cfg->hccpMode;
     213           44 :     rscb->connCb.rscb = rscb;
     214              : 
     215           44 :     ret = pthread_mutex_init(&rscb->mutex, NULL);
     216           44 :     CHK_PRT_RETURN(ret, hccp_err("rscb mutex_init failed ret %d!, normal ret 0", ret), -ESYSFUNC);
     217           43 :     ret = pthread_mutex_init(&rscb->connCb.connMutex, NULL);
     218           43 :     if (ret) {
     219            0 :         hccp_err("conn_cb mutex_init failed ret %d, normal ret 0!", ret);
     220            0 :         err = pthread_mutex_destroy(&rscb->mutex);
     221            0 :         hccp_dbg("pthread destroy ret %d", err);
     222            0 :         return -ESYSFUNC;
     223              :     }
     224              : 
     225           43 :     hccp_info("mutex init ok");
     226              : 
     227           43 :     RS_INIT_LIST_HEAD(&rscb->connCb.listenList);
     228           43 :     RS_INIT_LIST_HEAD(&rscb->connCb.serverAcceptList);
     229           43 :     RS_INIT_LIST_HEAD(&rscb->connCb.clientConnList);
     230           43 :     RS_INIT_LIST_HEAD(&rscb->connCb.serverConnList);
     231           43 :     RS_INIT_LIST_HEAD(&rscb->connCb.whiteList);
     232           43 :     RS_INIT_LIST_HEAD(&rscb->rdevList);
     233           43 :     RS_INIT_LIST_HEAD(&rscb->udevList);
     234           43 :     RS_INIT_LIST_HEAD(&rscb->heterogTcpFdList);
     235           43 :     rscb->connCb.wlistEnable = cfg->whiteListStatus;
     236           43 :     return 0;
     237              : }
     238              : 
     239           44 : STATIC int RsGetChipLogicId(unsigned int chipId, enum NetworkMode hccpMode, unsigned int *logicId)
     240              : {
     241              :     (void)hccpMode;
     242           44 :     int ret = 0;
     243              : 
     244           44 :     ret = DlDrvDeviceGetIndexByPhyId(chipId, logicId);
     245           44 :     CHK_PRT_RETURN(ret != 0, hccp_err("hal get logicId failed, chipId[%u], ret[%d]", chipId, ret), -ENODEV);
     246              : 
     247           44 :     return 0;
     248              : }
     249              : 
     250              : #ifdef CUSTOM_INTERFACE
     251           44 : STATIC int RsInitNetAdapt(struct rs_cb *rscb)
     252              : {
     253           44 :     int ret = 0;
     254              : 
     255           44 :     if (rscb->protocol != PROTOCOL_UDMA) {
     256           44 :         return 0;
     257              :     }
     258              : 
     259            0 :     ret = RsNetAdaptInit();
     260            0 :     CHK_PRT_RETURN(ret != 0,
     261              :         hccp_err("rs_net_adapt_init chipId[%u] logic_devid[%u] failed, ret=%d", rscb->chipId, rscb->logicId, ret), ret);
     262              : 
     263            0 :     return ret;
     264              : }
     265              : #endif
     266              : 
     267              : #ifdef CUSTOM_INTERFACE
     268            0 : STATIC void RsDeInitNetAdapt(struct rs_cb *rscb)
     269              : {
     270            0 :     if (rscb->protocol != PROTOCOL_UDMA) {
     271            0 :         return;
     272              :     }
     273              : 
     274            0 :     RsNetAdaptUninit();
     275              : }
     276              : #endif
     277              : 
     278           44 : STATIC int RsInitRscbCfg(struct rs_cb *rscb)
     279              : {
     280              :     enum ProductType productType;
     281              :     struct timeval start, end;
     282           44 :     float timeCost = 0.0;
     283              :     int ret;
     284              : 
     285           44 :     ret = RsGetChipLogicId(rscb->chipId, rscb->hccpMode, &rscb->logicId);
     286           44 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_get_chip_logic_id failed, ret[%d]", ret), ret);
     287              : 
     288           44 :     productType = RsGetProductType(rscb->logicId);
     289           44 :     CHK_PRT_RETURN(productType == PRODUCT_TYPE_INVALID, hccp_err("RsGetProductType failed, logicId:%u", rscb->logicId),
     290              :         -EINVAL);
     291              : #ifdef CUSTOM_INTERFACE
     292           44 :     if (RsIsUdmaSupported() || RsIsRdmaSupported()) {
     293            0 :         ret = RsGetChipProtocol(rscb->chipId, rscb->hccpMode, &rscb->protocol, rscb->logicId);
     294            0 :         CHK_PRT_RETURN(ret != 0, hccp_err("rs_get_chip_protocol failed, ret[%d]", ret), ret);
     295              :         // make sure RsRoceGetApiVersion and RsNetGetApiVersion are valid
     296            0 :         ret = RsCtxApiInit(rscb->hccpMode, rscb->protocol);
     297            0 :         CHK_PRT_RETURN(ret != 0, hccp_err("rs_ctx_api_init failed, ret[%d]", ret), ret);
     298            0 :         ret = RsEschedInit(rscb);
     299            0 :         if (ret != 0) {
     300            0 :             hccp_err("rs_esched_init chipId[%u] logic_devid[%u] failed, ret=%d productType=%d", rscb->chipId,
     301              :                 rscb->logicId, ret, productType);
     302            0 :             goto esched_init_err;
     303              :         }
     304              :     }
     305              : 
     306           44 :     ret = RsInitNetAdapt(rscb);
     307           44 :     if (ret != 0) {
     308            0 :         goto net_adapt_init_err;
     309              :     }
     310              : 
     311              : #endif
     312              : 
     313           44 :     ret = rs_ssl_init(rscb);
     314           44 :     if (ret != 0) {
     315            0 :         hccp_err("init ssl failed, ret[%d]", ret);
     316            0 :         goto ssl_init_err;
     317              :     }
     318              : 
     319           44 :     RsGetCurTime(&start);
     320           44 :     ret = RsEpollConnectHandleInit(rscb);
     321           44 :     if (ret != 0) {
     322            3 :         hccp_err("create pthread failed, ret[%d]", ret);
     323            3 :         goto create_pthread_err;
     324              :     }
     325              : 
     326           41 :     RsGetCurTime(&end);
     327           41 :     HccpTimeInterval(&end, &start, &timeCost);
     328           41 :     hccp_info("rs_epoll_connect_handle_init ok cost [%f] ms", timeCost);
     329           41 :     return 0;
     330              : 
     331            3 : create_pthread_err:
     332            3 :     rs_ssl_deinit(rscb);
     333            3 : ssl_init_err:
     334              : #ifdef CUSTOM_INTERFACE
     335            3 :     if (RsIsUdmaSupported() || RsIsRdmaSupported()) {
     336            0 :         RsDeInitNetAdapt(rscb);
     337            0 :     net_adapt_init_err:
     338            0 :         RsEschedDeinit(rscb->protocol);
     339            0 :     esched_init_err:
     340            0 :         (void)RsCtxApiDeinit(rscb->hccpMode, rscb->protocol);
     341              :     }
     342              : #endif
     343            3 :     return ret;
     344              : }
     345              : 
     346            1 : STATIC void RsDeinitRscbCfg(struct rs_cb *rscb)
     347              : {
     348            1 :     int tryAgain = RS_TRY_TIME;
     349            1 :     eventfd_t event = 1;
     350              :     int ret;
     351              : 
     352              : #ifdef CUSTOM_INTERFACE
     353            1 :     if (RsIsUdmaSupported() || RsIsRdmaSupported()) {
     354            0 :         RsDeInitNetAdapt(rscb);
     355            0 :         RsEschedDeinit(rscb->protocol);
     356            0 :         (void)RsCtxApiDeinit(rscb->hccpMode, rscb->protocol);
     357              :     }
     358              : #endif
     359            1 :     rs_ssl_deinit(rscb);
     360              :     // deinit resources in rs_epoll_connect_handle_init
     361              :     // deinit epoll thread, send event to eventfd to waking up epoll handle thread
     362            1 :     ret = (int)write(rscb->connCb.eventfd, &event, sizeof(eventfd_t));
     363            1 :     if (ret != sizeof(eventfd_t)) {
     364            0 :         hccp_warn("eventfd_write unsuccessful(0x%x), chipId:%u, errno:%d", ret, rscb->chipId, errno);
     365              :     }
     366            2 :     while (((rscb->state & RS_STATE_HALT) == 0) && (tryAgain != 0)) {
     367            1 :         usleep(RS_USLEEP_TIME);
     368            1 :         tryAgain--;
     369              :     };
     370            1 :     if (tryAgain == 0) {
     371            0 :         hccp_warn("try_again exhausted, epoll thread quit unsuccessful, rscb state:%u", rscb->state);
     372              :     }
     373            1 :     rscb->state &= ~RS_STATE_HALT;
     374              : 
     375              :     // deinit connect thread, already been RS_CONN_EXIT_FLAG, no need to change conn_flag
     376            1 :     if (rscb->connFlag != RS_CONN_EXIT_FLAG) {
     377            1 :         rscb->connFlag = 0;
     378              :     }
     379            1 :     tryAgain = RS_TRY_TIME;
     380          200 :     while ((rscb->connFlag != RS_CONN_EXIT_FLAG) && (tryAgain != 0)) {
     381          199 :         usleep(RS_USLEEP_TIME);
     382          199 :         tryAgain--;
     383              :     }
     384            1 :     if (tryAgain == 0) {
     385            0 :         hccp_warn("try_again exhausted, connect thread quit unsuccessful, rscb connFlag:%d", rscb->connFlag);
     386              :     }
     387              : 
     388            1 :     RsDestroyEpoll(rscb);
     389            1 : }
     390              : 
     391           45 : RS_ATTRI_VISI_DEF int RsInit(struct RsInitConfig *cfg)
     392              : {
     393           45 :     struct rs_cb *rscb = NULL;
     394              :     int ret;
     395              : 
     396           45 :     RS_CHECK_POINTER_NULL_RETURN_INT(cfg);
     397           45 :     ret = DlHalInit();
     398           45 :     if (ret != 0) {
     399            0 :         hccp_err("[init][rs_init]dl_hal_init failed, ret = %d", ret);
     400            0 :         return ret;
     401              :     }
     402              : 
     403           45 :     int counter = __sync_fetch_and_add(&(gInitCounter[cfg->chipId]), 1);
     404           45 :     if (counter > 0) {
     405            0 :         hccp_warn("rs has been init for device %u!", cfg->chipId);
     406            0 :         return 0;
     407              :     }
     408           45 :     ret = RsDev2rscb(cfg->chipId, &rscb, true);
     409           45 :     CHK_PRT_RETURN(ret == 0, hccp_err("rs_cb exist for device %u! do NOT init it again!", cfg->chipId), -EEXIST);
     410              : 
     411           45 :     rscb = calloc(1, sizeof(struct rs_cb));
     412           45 :     CHK_PRT_RETURN(rscb == NULL, hccp_err("calloc rscb failed"), -ENOMEM);
     413              : 
     414           44 :     ret = RsPthreadMutexInit(rscb, cfg);
     415           44 :     if (ret != 0) {
     416            1 :         hccp_err("Init mutex failed, ret[%d]", ret);
     417            1 :         goto pthread_mutex_err;
     418              :     }
     419              : 
     420           43 :     ret = RsInitRscbCfg(rscb);
     421           43 :     if (ret != 0) {
     422            3 :         hccp_err("rs init rscb configure failed,ret:%d", ret);
     423            3 :         pthread_mutex_destroy(&rscb->mutex);
     424            3 :         pthread_mutex_destroy(&rscb->connCb.connMutex);
     425            3 :         goto pthread_mutex_err;
     426              :     }
     427              : 
     428           40 :     rscb->fdMap = calloc(1, sizeof(void *) * RS_MAX_FD_NUM);
     429           40 :     if (rscb->fdMap == NULL) {
     430            0 :         hccp_err("no memory for fd_map");
     431            0 :         ret = -ENOMEM;
     432            0 :         goto fd_map_err;
     433              :     }
     434              : 
     435           40 :     ret = getifaddrs(&rscb->ifaddrList);
     436           40 :     if (ret != 0) {
     437            0 :         hccp_err("getifaddrs failed, ret:%d", ret);
     438            0 :         goto getifaddrs_err;
     439              :     }
     440              : 
     441           40 :     gRsCbList[cfg->chipId] = gRsCb;
     442              : 
     443           40 :     hccp_run_info("rs init success, chipId[%u]", cfg->chipId);
     444           40 :     return 0;
     445              : 
     446            0 : getifaddrs_err:
     447            0 :     free(rscb->fdMap);
     448            0 :     rscb->fdMap = NULL;
     449              : 
     450            0 : fd_map_err:
     451            0 :     pthread_mutex_destroy(&rscb->mutex);
     452            0 :     pthread_mutex_destroy(&rscb->connCb.connMutex);
     453            0 :     RsDeinitRscbCfg(rscb);
     454              : 
     455            4 : pthread_mutex_err:
     456            4 :     free(rscb);
     457            4 :     rscb = NULL;
     458            4 :     return ret;
     459              : }
     460              : 
     461            2 : RS_ATTRI_VISI_DEF int RsGetTlsEnable(unsigned int phyId, bool *tlsEnable)
     462              : {
     463            2 :     struct rs_cb *rsCb = NULL;
     464              :     int ret;
     465              : 
     466            2 :     CHK_PRT_RETURN(tlsEnable == NULL, hccp_err("param err, tlsEnable is NULL"), -EINVAL);
     467            1 :     ret = RsGetRsCb(phyId, &rsCb);
     468            1 :     CHK_PRT_RETURN(ret != 0, hccp_err("RsGetRsCb failed, phyId(%u) invalid, ret(%d)", phyId, ret), ret);
     469              : 
     470            0 :     *tlsEnable = (rsCb->sslEnable == 0) ? false : true;
     471            0 :     return 0;
     472              : }
     473              : 
     474            3 : STATIC const char *RsGetHccnCfgFilePath(int mode)
     475              : {
     476              : #define HCCN_OFFLINE_CFGFILE_PATH "/etc/hccl.cfg"
     477              : #define HCCN_PEER_ONLINE_CFGFILE_PATH "/etc/hcomm.cfg"
     478            3 :     if (mode == NETWORK_OFFLINE) {
     479            1 :         return HCCN_OFFLINE_CFGFILE_PATH;
     480              :     }
     481            2 :     if (mode == NETWORK_PEER_ONLINE) {
     482            1 :         return HCCN_PEER_ONLINE_CFGFILE_PATH;
     483              :     }
     484            1 :     return NULL;
     485              : }
     486              : 
     487            4 : RS_ATTRI_VISI_DEF int RsGetHccnCfg(struct RaInfo *info, enum HccnCfgKey key, char *value, unsigned int *valueLen)
     488              : {
     489            4 :     const char *keyName[HCCN_CFG_KEY_INVALID] = {
     490              :         "udp_port_mode", "multi_qp_count", "multi_qp_udp_ports", "resv_mem", "qos_dscp"};
     491            4 :     unsigned int cfg_key = (unsigned int)key;
     492            4 :     const char *cfgFilePath = NULL;
     493            4 :     unsigned int valLen = 0;
     494              :     unsigned int bufLen;
     495            4 :     int ret = 0;
     496              : 
     497            4 :     CHK_PRT_RETURN(info == NULL, hccp_err("param err, info is NULL"), -EINVAL);
     498            3 :     CHK_PRT_RETURN(value == NULL || valueLen == NULL, hccp_err("param err, value or valueLen is NULL"), -EINVAL);
     499            3 :     CHK_PRT_RETURN(cfg_key >= HCCN_CFG_KEY_INVALID,
     500              :         hccp_err("param err, key[%u] should < [%d]", cfg_key, HCCN_CFG_KEY_INVALID), -EINVAL);
     501              : 
     502            3 :     cfgFilePath = RsGetHccnCfgFilePath(info->mode);
     503            3 :     CHK_PRT_RETURN(cfgFilePath == NULL,
     504              :         hccp_err("param err, do not support mode[%d] phyId(%u)", info->mode, info->phyId), -ENOTSUPP);
     505              : 
     506            2 :     bufLen = *valueLen;
     507            2 :     CHK_PRT_RETURN(bufLen < HCCN_CFG_MSG_DATA_LEN,
     508              :         hccp_err("param err, bufLen[%u] should >= [%u]", bufLen, HCCN_CFG_MSG_DATA_LEN), -EINVAL);
     509              : 
     510            2 :     *valueLen = 0;
     511            2 :     ret = FileReadCfg(cfgFilePath, (int)info->phyId, keyName[cfg_key], value, bufLen);
     512            2 :     CHK_PRT_RETURN(ret == FILE_OPT_INNER_PARAM_ERR || ret == FILE_OPT_SYS_READ_FILE_ERR,
     513              :         hccp_run_warn("get hccn cfg file unsuccessful, ret(%d)", ret), 0);
     514            2 :     CHK_PRT_RETURN(ret == FILE_OPT_NO_MEM_ERR, hccp_err("value_len > buf_len[%d], ret(%d)", bufLen, ret), -ENOMEM);
     515            2 :     CHK_PRT_RETURN(ret != 0, hccp_run_warn("get hccn cfg [%s] unsuccessful, ret(%d)", keyName[cfg_key], ret), 0);
     516              : 
     517            2 :     valLen = (unsigned int)strlen(value);
     518            2 :     *valueLen = (valLen == 0) ? valLen : (valLen + 1);
     519            2 :     return 0;
     520              : }
     521              : 
     522            1 : RS_ATTRI_VISI_DEF int RsBindHostpid(unsigned int chipId, pid_t pid)
     523              : {
     524              : #define QUERY_BIND_HOST_PID_TIME_US 10000
     525              : #define QUERY_BIND_HOST_PID_CNT 12000
     526            1 :     struct rs_cb *rsCb = NULL;
     527              :     unsigned int hostPid;
     528              :     pid_t devPid;
     529              :     int ret;
     530              :     int i;
     531              : 
     532              :     // get current hccp pid on device
     533            1 :     devPid = getpid();
     534            1 :     CHK_PRT_RETURN(devPid < 0, hccp_err("getpid failed, ret:%d errno:%d", devPid, errno), -EINVAL);
     535              : 
     536              :     // query corresponding host_pid every 10ms, total timeout cost 120s
     537            1 :     for (i = 0; i < QUERY_BIND_HOST_PID_CNT; i++) {
     538            1 :         ret = DlDrvQueryProcessHostPid(devPid, NULL, NULL, &hostPid, NULL);
     539            1 :         if (ret == DRV_ERROR_NONE) {
     540            1 :             break;
     541              :         }
     542              : 
     543            0 :         usleep(QUERY_BIND_HOST_PID_TIME_US);
     544              :     }
     545              : 
     546            1 :     if (i >= QUERY_BIND_HOST_PID_CNT) {
     547            0 :         hccp_err("query process host_pid failed, i:%d >= %d ret:%d", i, QUERY_BIND_HOST_PID_CNT, ret);
     548            0 :         return -EINVAL;
     549              :     }
     550              : 
     551            1 :     if (pid != (pid_t)hostPid) {
     552            0 :         hccp_err("check process failed, pid from tsd: %d, process hostPid: %u", pid, hostPid);
     553            0 :         return -EINVAL;
     554              :     }
     555              : 
     556            1 :     hccp_dbg("dl_drv_query_process_host_pid success, total retry cnt:%d", i);
     557              : 
     558              :     // save host_pid for later setup sharemem
     559            1 :     ret = RsDev2rscb(chipId, &rsCb, false);
     560            1 :     CHK_PRT_RETURN(ret, hccp_err("get rs_cb failed, ret:%d, chipId:%u", ret, chipId), -ENODEV);
     561            0 :     rsCb->hostPid = pid;
     562              : 
     563            0 :     return 0;
     564              : }
     565              : 
     566              : #ifdef CUSTOM_INTERFACE
     567            1 : STATIC int RsSetRscbGrpId(struct rs_cb *rsCb, unsigned int devId)
     568              : {
     569            1 :     GrpQueryGroupIdInfo grpQueryOut = {0};
     570            1 :     unsigned int chipId = rsCb->chipId;
     571            1 :     GrpQueryGroupId grpQueryIn = {0};
     572            1 :     struct MemInfo memInfo = {0};
     573              :     unsigned int outLen;
     574              :     unsigned int grpId;
     575              :     int ret;
     576              : 
     577              :     // query grp_name
     578            1 :     ret = DlHalMemGetInfoEx(devId, MEM_INFO_TYPE_SVM_GRP_INFO, &memInfo);
     579            1 :     CHK_PRT_RETURN(ret, hccp_err("dl_hal_mem_get_info_ex failed, ret:%d chipId:%u devId:%u", ret, chipId, devId), ret);
     580              : 
     581            1 :     hccp_dbg("query group name success, chipId:%u devId:%u grp_name:%s", chipId, devId, memInfo.grp_info.name);
     582              : 
     583              :     // query grp_id
     584            1 :     ret = memcpy_s(&grpQueryIn.grpName, BUFF_GRP_NAME_LEN, &memInfo.grp_info.name, SVM_GRP_NAME_LEN);
     585            1 :     CHK_PRT_RETURN(ret, hccp_err("memcpy_s failed, ret:%d chipId:%u devId:%u", ret, chipId, devId), ret);
     586            1 :     outLen = (unsigned int)sizeof(grpQueryOut);
     587            1 :     ret = DlHalGrpQuery(GRP_QUERY_GROUP_ID, &grpQueryIn, sizeof(grpQueryIn), &grpQueryOut, &outLen);
     588            1 :     CHK_PRT_RETURN(ret, hccp_err("dl_hal_grp_query failed, ret:%d chipId:%u devId:%u", ret, chipId, devId), ret);
     589            1 :     grpId = (unsigned int)grpQueryOut.groupId;
     590              : 
     591              :     // set grp_id
     592            1 :     rsCb->grpId = grpId;
     593              : 
     594            1 :     hccp_dbg("query group id success, chipId:%u devId:%u grpId:%u grp_name:%s", chipId, devId, grpId,
     595              :         grpQueryIn.grpName);
     596            1 :     return 0;
     597              : }
     598              : 
     599            3 : STATIC int RsBindSibling(struct rs_cb *rsCb, int hostPid, unsigned int vfId, unsigned int devId)
     600              : {
     601              : #define QUERY_BIND_SIBLING_TIME_US 10000
     602              : #define QUERY_BIND_SIBLING_CNT 12000
     603            3 :     struct halQueryDevpidInfo pidInfo = {0};
     604              :     pid_t aicpuPid;
     605              :     int ret;
     606              :     int i;
     607              : 
     608              :     // query aicpu pid
     609            3 :     pidInfo.hostpid = hostPid;
     610            3 :     pidInfo.devid = devId;
     611            3 :     pidInfo.proc_type = DEVDRV_PROCESS_CP1;
     612            3 :     ret = DlHalQueryDevPid(pidInfo, &aicpuPid);
     613            3 :     CHK_PRT_RETURN(ret != 0, hccp_err("dl_hal_query_dev_pid failed, ret:%d devId:%u", ret, devId), ret);
     614              : 
     615              :     // try to bind sibling every 10ms, total timeout cost 120s
     616            1 :     for (i = 0; i < QUERY_BIND_SIBLING_CNT; i++) {
     617            1 :         ret = DlHalMemBindSibling(hostPid, aicpuPid, vfId, devId, SVM_MEM_BIND_SP_GRP);
     618            1 :         if (ret == DRV_ERROR_NONE) {
     619            1 :             break;
     620              :         }
     621              : 
     622            0 :         usleep(QUERY_BIND_SIBLING_TIME_US);
     623              :     }
     624              : 
     625            1 :     if (i >= QUERY_BIND_SIBLING_CNT) {
     626            0 :         hccp_err("bind sibling to setup sharemem failed, i:%d >= %d ret:%d", i, QUERY_BIND_SIBLING_CNT, ret);
     627            0 :         return -EINVAL;
     628              :     }
     629              : 
     630            1 :     rsCb->aicpuPid = aicpuPid;
     631            1 :     hccp_dbg("dl_hal_mem_bind_sibling success, total retry cnt:%d", i);
     632              : 
     633            1 :     return 0;
     634              : }
     635              : 
     636           36 : int RsSetupSharemem(struct rs_cb *rsCb, bool backupFlag, unsigned int backupPhyid)
     637              : {
     638           36 :     unsigned int chipId = rsCb->chipId;
     639           36 :     pid_t pid = rsCb->hostPid;
     640           36 :     int64_t deviceInfo = 0;
     641              :     unsigned int logicId;
     642              :     int ret;
     643              : 
     644              :     // setup sharemem or skipped already, no need to setup again
     645           36 :     if (rsCb->grpSetupFlag) {
     646            4 :         hccp_dbg("grp_setup_flag:%d grp_id:%u chipId:%u", rsCb->grpSetupFlag, rsCb->grpId, chipId);
     647            4 :         return 0;
     648              :     }
     649              : 
     650           32 :     ret = DlDrvDeviceGetIndexByPhyId(chipId, &logicId);
     651           32 :     CHK_PRT_RETURN(ret, hccp_err("dl_drv_device_get_index_by_phy_id failed, ret:%d chipId:%u", ret, chipId), ret);
     652           32 :     ret = DlHalGetDeviceInfo(logicId, MODULE_TYPE_SYSTEM, INFO_TYPE_VERSION, &deviceInfo);
     653           32 :     CHK_PRT_RETURN(ret != 0,
     654              :         hccp_err("dl_hal_get_device_info failed, ret:%d logicId:%u chipId:%u", ret, logicId, chipId), ret);
     655              :     // not 910b/910_93 and not protocol udma, skip to setup share mem
     656           32 :     if (DlHalPlatGetChip((uint64_t)deviceInfo) != CHIP_TYPE_910B_910_93 && rsCb->protocol != PROTOCOL_UDMA) {
     657           29 :         hccp_info("logicId:%u chipId:%u protocol:%d skip to setup share mem", logicId, chipId, rsCb->protocol);
     658           29 :         rsCb->grpSetupFlag = true;
     659           29 :         return 0;
     660              :     }
     661              : 
     662              :     // use backup info to setup share mem
     663            3 :     if (backupFlag) {
     664            1 :         ret = DlDrvGetLocalDevIdByHostDevId(backupPhyid, &logicId);
     665            1 :         CHK_PRT_RETURN(ret != 0, hccp_err("DlDrvGetLocalDevIdByHostDevId failed, phyId(%u), ret(%d)", backupPhyid, ret),
     666              :             ret);
     667            1 :         hccp_dbg("setup sharemem with backup, phyId:%u logicId:%u", backupPhyid, logicId);
     668              :     }
     669              : 
     670              :     // bind sibling, default vfid is 0; query & save grp_id on rs_cb
     671            3 :     ret = RsBindSibling(rsCb, pid, 0, logicId);
     672            3 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_bind_sibling failed, ret:%d logicId:%u chipId:%u", ret, logicId, chipId),
     673              :         ret);
     674              : 
     675              :     // query & save grp_id on rs_cb
     676            1 :     ret = RsSetRscbGrpId(rsCb, logicId);
     677            1 :     CHK_PRT_RETURN(ret, hccp_err("rs_set_rscb_grp_id failed, ret:%d logicId:%u chipId:%u", ret, logicId, chipId), ret);
     678              : 
     679            1 :     rsCb->grpSetupFlag = true;
     680            1 :     return 0;
     681              : }
     682              : #endif
     683              : 
     684           34 : STATIC int RsCompareIpGid(struct rdev rdevInfo, union ibv_gid *gid)
     685              : {
     686           34 :     return RsDrvCompareIpGid(rdevInfo.family, rdevInfo.localIp, gid);
     687              : }
     688              : 
     689           34 : int RsQueryGid(struct rdev rdevInfo, struct ibv_context *ibCtxTmp, uint8_t ibPort, int *gidIdx)
     690              : {
     691              :     static const char *portStates[] = {"Nop", "Down", "Init", "Armed", "", "Active Defer"};
     692           34 :     struct ibv_port_attr attr = {0};
     693              :     enum ibv_gid_type_sysfs type;
     694              :     union ibv_gid gidTmp;
     695              :     int ret;
     696              :     int i;
     697              : 
     698           34 :     CHK_PRT_RETURN(gidIdx == NULL, hccp_err("gid_idx is NULL"), -EINVAL);
     699              : 
     700           34 :     ret = RsIbvQueryPort(ibCtxTmp, ibPort, &attr);
     701           34 :     CHK_PRT_RETURN(ret, hccp_err("ibv_query_port failed, ret %d ibPort %u", ret, ibPort), -EOPENSRC);
     702              : 
     703           72 :     for (i = 0; i < attr.gid_tbl_len; i++) {
     704           70 :         ret = RsIbvQueryGidType(ibCtxTmp, ibPort, (unsigned int)i, &type);
     705           70 :         CHK_PRT_RETURN(ret, hccp_err("query gid type failed i %d, ret %d", i, ret), -EOPENSRC);
     706           70 :         if (type != IBV_GID_TYPE_SYSFS_ROCE_V2) {
     707           36 :             continue;
     708              :         }
     709           34 :         ret = RsIbvQueryGid(ibCtxTmp, ibPort, i, &gidTmp);
     710           34 :         CHK_PRT_RETURN(ret, hccp_err("query gid failed i %d, ret %d", i, ret), -EOPENSRC);
     711           34 :         ret = RsCompareIpGid(rdevInfo, &gidTmp);
     712           34 :         if (ret == 0) {
     713           32 :             CHK_PRT_RETURN(attr.state != IBV_PORT_ACTIVE,
     714              :                 hccp_err("port number %u state is %s", ibPort, portStates[attr.state]), -ENOLINK);
     715           30 :             *gidIdx = i;
     716           30 :             return 0;
     717              :         }
     718              :     }
     719              : 
     720            2 :     if (i == attr.gid_tbl_len) {
     721            2 :         return -EEXIST;
     722              :     }
     723            0 :     return 0;
     724              : }
     725              : 
     726           26 : STATIC int RsGetDevRdevIndex(struct RsRdevCb *rdevCb, unsigned int *rdevIndex, int index)
     727              : {
     728              :     (void)rdevCb;
     729              :     (void)rdevIndex;
     730              :     (void)index;
     731              : #ifdef CUSTOM_INTERFACE
     732           26 :     struct roce_dev_data rdevData = {0}; // lint !e565
     733              :     int retVal;
     734              : 
     735           26 :     if (RsIsCustomInterfaceSupported()) {
     736           26 :         RS_PTHREAD_MUTEX_LOCK(&rdevCb->rsCb->mutex);
     737              :         /*lint -e132*/
     738           26 :         rdevCb->devName = RsIbvGetDeviceName(rdevCb->devList[index]); // lint !e101
     739           26 :         retVal = RsRoceGetRoceDevData(rdevCb->devName, &rdevData);    // lint !e101
     740              :         /*lint +e132*/
     741           26 :         if (retVal) {
     742            0 :             hccp_err("rs_roce_get_roce_dev_data failed, retVal:%d, devName:%s", retVal, rdevCb->devName);
     743            0 :             RS_PTHREAD_MUTEX_ULOCK(&rdevCb->rsCb->mutex);
     744            0 :             return retVal;
     745              :         }
     746           26 :         *rdevIndex = rdevData.rdev_index; // rdev_index is same to port_id
     747           26 :         rdevCb->rdevIndex = *rdevIndex;
     748           26 :         RS_PTHREAD_MUTEX_ULOCK(&rdevCb->rsCb->mutex);
     749              :     }
     750              : #endif
     751           26 :     return 0;
     752              : }
     753              : 
     754            4 : STATIC int RsGetHostRdevIndex(struct rdev rdevInfo, struct RsRdevCb *rdevCb, unsigned int *rdevIndex, int index)
     755              : {
     756            4 :     struct RsRdevCb *rdevCbTmp2 = NULL;
     757            4 :     struct RsRdevCb *rdevCbTmp = NULL;
     758            4 :     unsigned int tmpRdevIndex = 0;
     759              : 
     760            4 :     RS_PTHREAD_MUTEX_LOCK(&rdevCb->rsCb->mutex);
     761            4 :     rdevCb->devName = RsIbvGetDeviceName(rdevCb->devList[index]);
     762            4 :     if (rdevCb->devName == NULL) {
     763            0 :         hccp_err("rs_ibv_get_device_name failed, errno:%d", errno);
     764            0 :         RS_PTHREAD_MUTEX_ULOCK(&rdevCb->rsCb->mutex);
     765            0 :         return -EINVAL;
     766              :     }
     767              : 
     768              :     struct RsIpAddrInfo localIp;
     769            4 :     int ret = RsConvertIpAddr(rdevInfo.family, &rdevInfo.localIp, &localIp);
     770            4 :     if (ret != 0) {
     771            1 :         hccp_err("convert(ntop) ip failed, ret:%d", ret);
     772            1 :         RS_PTHREAD_MUTEX_ULOCK(&rdevCb->rsCb->mutex);
     773            1 :         return ret;
     774              :     }
     775              : 
     776            3 :     RS_LIST_GET_HEAD_ENTRY(rdevCbTmp, rdevCbTmp2, &rdevCb->rsCb->rdevList, list, struct RsRdevCb);
     777            3 :     for (; (&rdevCbTmp->list) != &rdevCb->rsCb->rdevList;
     778            0 :          rdevCbTmp = rdevCbTmp2, rdevCbTmp2 = list_entry(rdevCbTmp2->list.next, struct RsRdevCb, list)) {
     779            0 :         tmpRdevIndex = rdevCbTmp->rdevIndex;
     780            0 :         if (!RsCompareIpAddr(&rdevCbTmp->localIp, &localIp)) {
     781            0 :             *rdevIndex = tmpRdevIndex;
     782            0 :             rdevCb->rdevIndex = *rdevIndex;
     783            0 :             rdevCb->localIp = localIp;
     784            0 :             RS_PTHREAD_MUTEX_ULOCK(&rdevCb->rsCb->mutex);
     785            0 :             return 0;
     786              :         }
     787              :     }
     788              : 
     789            3 :     *rdevIndex = tmpRdevIndex + 1;
     790            3 :     rdevCb->rdevIndex = *rdevIndex;
     791            3 :     rdevCb->localIp = localIp;
     792            3 :     RS_PTHREAD_MUTEX_ULOCK(&rdevCb->rsCb->mutex);
     793            3 :     return 0;
     794              : }
     795              : 
     796           31 : STATIC int RsGetIbCtxAndRdevIndex(struct rdev rdevInfo, struct RsRdevCb *rdevCb, unsigned int *rdevIndex)
     797              : {
     798           31 :     struct ibv_context *ibCtxTmp = NULL;
     799           31 :     int gidIndex = -1;
     800              :     int ret;
     801              :     int i;
     802              : 
     803           31 :     for (i = 0; (i < rdevCb->devNum) && (rdevCb->devList[i] != NULL); ++i) { // lint !e101
     804           31 :         ibCtxTmp = RsIbvOpenDevice(rdevCb->devList[i]);
     805           31 :         CHK_PRT_RETURN(ibCtxTmp == NULL, hccp_err("ibv_open_device failed !"), -ENODEV);
     806           31 :         ret = RsQueryGid(rdevInfo, ibCtxTmp, rdevCb->ibPort, &gidIndex);
     807           31 :         if (ret == 0) {
     808           29 :             if (rdevCb->rsCb->hccpMode == NETWORK_PEER_ONLINE) {
     809            3 :                 ret = RsGetHostRdevIndex(rdevInfo, rdevCb, rdevIndex, i);
     810              :             } else {
     811           26 :                 ret = RsGetDevRdevIndex(rdevCb, rdevIndex, i);
     812              :             }
     813           29 :             if (ret != 0) {
     814            0 :                 hccp_err("get index failed, ret:%d", ret);
     815            0 :                 RsIbvCloseDevice(ibCtxTmp);
     816            0 :                 return ret;
     817              :             }
     818           29 :             ret = RsIbvQueryDevice(ibCtxTmp, &rdevCb->deviceAttr);
     819           29 :             if (ret != 0) {
     820            0 :                 hccp_err("query device failed, ret:%d", ret);
     821            0 :                 RsIbvCloseDevice(ibCtxTmp);
     822            0 :                 return ret;
     823              :             }
     824           29 :             rdevCb->ibCtx = ibCtxTmp;
     825           29 :             return 0;
     826            2 :         } else if (ret == -EEXIST) {
     827            0 :             RsIbvCloseDevice(ibCtxTmp);
     828              :         } else {
     829            2 :             RsIbvCloseDevice(ibCtxTmp);
     830            2 :             hccp_err("rs_query_gid failed, ret:%d", ret);
     831            2 :             return ret;
     832              :         }
     833              :     }
     834              : 
     835            0 :     CHK_PRT_RETURN(i == rdevCb->devNum,
     836              :         hccp_err("can not find ib_ctx for phyId[%u] local_ip[0x%x] in dev_list!", rdevInfo.phyId,
     837              :             rdevInfo.localIp.addr.s_addr),
     838              :         -EEXIST);
     839            0 :     return 0;
     840              : }
     841              : 
     842           41 : int RsGetRsCb(unsigned int phyId, struct rs_cb **rsCb)
     843              : {
     844              :     unsigned int chipId;
     845              :     int ret;
     846              : 
     847           41 :     CHK_PRT_RETURN(phyId >= RS_MAX_DEV_NUM, hccp_err("rs set param error ! phyId:%u", phyId), -EINVAL);
     848           41 :     ret = rsGetLocalDevIDByHostDevID(phyId, &chipId);
     849           41 :     CHK_PRT_RETURN(ret, hccp_err("phyId[%u] invalid, ret %d", phyId, ret), ret);
     850              : 
     851           33 :     ret = RsDev2rscb(chipId, rsCb, false);
     852           33 :     CHK_PRT_RETURN(ret, hccp_err("get rs_cb failed, ret:%d", ret), -ENODEV);
     853           33 :     return 0;
     854              : }
     855              : 
     856           31 : STATIC int RsGetSqDepthAndQpMaxNum(struct RsRdevCb *rdevCb, unsigned int rdevIndex)
     857              : {
     858              :     (void)rdevCb;
     859              :     (void)rdevIndex;
     860              : #ifdef CUSTOM_INTERFACE
     861           31 :     unsigned int tempDepth = 0;
     862           31 :     unsigned int qpMaxNum = 0;
     863           31 :     unsigned int sqDepth = 0;
     864              :     int ret;
     865              : 
     866           31 :     if (RsIsCustomInterfaceSupported()) {
     867           31 :         ret = RsRoceGetTsqpDepth(rdevCb->devName, rdevIndex, &tempDepth, &qpMaxNum, &sqDepth);
     868           31 :         CHK_PRT_RETURN(ret,
     869              :             hccp_err("rs_roce_get_tsqp_depth failed, ret:%d, devName:%s, rdevIndex:%u", ret, rdevCb->devName,
     870              :                 rdevIndex),
     871              :             ret);
     872              : 
     873           31 :         rdevCb->txDepth = sqDepth;
     874           31 :         rdevCb->rxDepth = sqDepth;
     875           31 :         rdevCb->qpMaxNum = qpMaxNum;
     876           31 :         hccp_run_info("qp_max_num:%u, sqDepth:%u", qpMaxNum, sqDepth);
     877              :     }
     878              : #endif
     879           31 :     return 0;
     880              : }
     881              : 
     882           31 : STATIC int RsSetupPdAndNotify(struct RsRdevCb *rdevCb)
     883              : {
     884              :     int ret;
     885              : 
     886           31 :     ret = RsDrvQueryNotifyAndAllocPd(rdevCb);
     887           31 :     CHK_PRT_RETURN(ret, hccp_err("rs_drv_query_notify_and_alloc_pd failed, ret[%d]", ret), ret);
     888              : 
     889           30 :     ret = RsDrvRegNotifyMr(rdevCb);
     890           30 :     if (ret) {
     891            1 :         hccp_err("reg notify mr failed, ret[%d]", ret);
     892            1 :         goto dealloc_pd;
     893              :     }
     894              : 
     895           29 :     return 0;
     896            1 : dealloc_pd:
     897            1 :     RsIbvDeallocPd(rdevCb->ibPd);
     898            1 :     return ret;
     899              : }
     900              : 
     901           37 : STATIC int RsRdevCbInfoInit(struct rdev rdevInfo, struct rs_cb *rsCb, struct RsRdevCb *rdevCb)
     902              : {
     903              :     int ret;
     904              : 
     905           37 :     rdevCb->ibPort = RS_PORT_DEF;
     906           37 :     rdevCb->rsCb = rsCb;
     907           37 :     rdevCb->notifyVaBase = rsCb->notifyVaBase;
     908           37 :     rdevCb->notifySize = rsCb->notifySize;
     909              : 
     910           37 :     rdevCb->localIp.family = (uint32_t)rdevInfo.family;
     911           37 :     rdevCb->localIp.binAddr = rdevInfo.localIp;
     912           37 :     ret = RsInetNtop(rdevInfo.family, &(rdevInfo.localIp), rdevCb->localIp.readAddr, RS_MAX_IP_LEN);
     913           37 :     CHK_PRT_RETURN(ret, hccp_err("rs_inet_ntop failed, ret %d", ret), -EINVAL);
     914              : 
     915           37 :     return 0;
     916              : }
     917              : 
     918           37 : STATIC int RsRdevCbInit(struct rdev rdevInfo, struct RsRdevCb *rdevCb, struct rs_cb *rsCb, unsigned int *rdevIndex)
     919              : {
     920              :     int ret;
     921              : 
     922           37 :     ret = RsRdevCbInfoInit(rdevInfo, rsCb, rdevCb);
     923           37 :     CHK_PRT_RETURN(ret, hccp_err("rs_rdev_cb_info_init failed, ret %d", ret), ret);
     924              : 
     925           37 :     ret = pthread_mutex_init(&rdevCb->rdevMutex, NULL);
     926           37 :     CHK_PRT_RETURN(ret, hccp_err("rdev_cb mutex_init failed ret %d!, normal ret 0", ret), -ESYSFUNC);
     927              : 
     928           36 :     ret = pthread_mutex_init(&rdevCb->cqeErrCntMutex, NULL);
     929           36 :     if (ret) {
     930            0 :         hccp_err("rdev_cb cqe_err_cnt_mutex init failed ret %d!, normal ret 0", ret);
     931            0 :         goto destroy_rdev_mutex;
     932              :     }
     933              : 
     934           36 :     RS_PTHREAD_MUTEX_LOCK(&rdevCb->rdevMutex);
     935           36 :     RS_INIT_LIST_HEAD(&rdevCb->qpList);
     936           36 :     RS_INIT_LIST_HEAD(&rdevCb->typicalMrList);
     937           36 :     RS_PTHREAD_MUTEX_ULOCK(&rdevCb->rdevMutex);
     938              : 
     939           36 :     ret = RsGetIbCtxAndRdevIndex(rdevInfo, rdevCb, rdevIndex);
     940           36 :     if (ret) {
     941            3 :         hccp_err("rs_get_ib_ctx_and_rdev_index failed, ret:%d", ret);
     942            3 :         goto destroy_cqe_mutex;
     943              :     }
     944              : 
     945           33 :     ret = RsGetSqDepthAndQpMaxNum(rdevCb, *rdevIndex);
     946           33 :     if (ret) {
     947            1 :         hccp_err("rs_get_sq_depth_and_qp_max_num failed, ret[%d], rdevIndex[%u]", ret, *rdevIndex);
     948            1 :         goto close_dev;
     949              :     }
     950              : 
     951              : #ifdef CUSTOM_INTERFACE
     952           32 :     if (RsIsCustomInterfaceSupported()) {
     953           32 :         ret = RsRoceMmapAiDbReg(rdevCb->ibCtx, (unsigned int)rdevCb->rsCb->aicpuPid);
     954           32 :         if (ret) {
     955            0 :             hccp_err("rs_roce_mmap_ai_db_reg failed, ret[%d], rdevIndex[%u]", ret, *rdevIndex);
     956            0 :             goto close_dev;
     957              :         }
     958              :     }
     959              : #endif
     960              : 
     961           32 :     ret = RsInitNdaCb(rdevCb);
     962           32 :     if (ret != 0) {
     963            0 :         hccp_err("RsInitNdaCb failed, ret[%d], rdevIndex[%u]", ret, *rdevIndex);
     964            0 :         goto unmmap_ai_db;
     965              :     }
     966              : 
     967           32 :     ret = RsSetupPdAndNotify(rdevCb);
     968           32 :     if (ret != 0) {
     969            3 :         hccp_err("RsSetupPdAndNotify failed, ret[%d], rdevIndex[%u]", ret, *rdevIndex);
     970            3 :         goto free_nda_cb;
     971              :     }
     972              : 
     973           29 :     return 0;
     974              : 
     975            3 : free_nda_cb:
     976            3 :     RsDeinitNdaCb(rdevCb);
     977            3 : unmmap_ai_db:
     978              : #ifdef CUSTOM_INTERFACE
     979            3 :     if (RsIsCustomInterfaceSupported()) {
     980            3 :         (void)RsRoceUnmmapAiDbReg(rdevCb->ibCtx);
     981              :     }
     982              : #endif
     983            0 : close_dev:
     984            4 :     RsIbvCloseDevice(rdevCb->ibCtx);
     985            7 : destroy_cqe_mutex:
     986            7 :     pthread_mutex_destroy(&rdevCb->cqeErrCntMutex);
     987            7 : destroy_rdev_mutex:
     988            7 :     pthread_mutex_destroy(&rdevCb->rdevMutex);
     989            7 :     return ret;
     990              : }
     991              : 
     992            4 : int RsRetryTimeoutExceptionCheck(struct SensorNode *sensorNode)
     993              : {
     994            4 :     int ret = 0;
     995              : 
     996              :     /* sensor may not support, handle is 0 */
     997            4 :     if (sensorNode->sensorHandle == 0) {
     998            2 :         return 0;
     999              :     }
    1000              : 
    1001              :     /*
    1002              :      * The notification alarm framework does not filter alarms. In this example, only one notification
    1003              :      * alarm is reported by a single process, which does not need to be accurate. Therefore, no lock is used.
    1004              :      */
    1005            2 :     if (sensorNode->sensorUpdateCnt == 0) {
    1006            2 :         ret = DlHalSensorNodeUpdateState(sensorNode->logicDevid, sensorNode->sensorHandle,
    1007              :             RDMA_CQE_ERR_RETRY_TIMEOUT_EVENT_TYPE, GENERAL_EVENT_TYPE_ONE_TIME);
    1008            2 :         if (ret == 0) {
    1009            1 :             sensorNode->sensorUpdateCnt++;
    1010              :         }
    1011              :     }
    1012              : 
    1013            2 :     return ret;
    1014              : }
    1015              : 
    1016           39 : STATIC int RsRdevInitWithBackupInfo(struct rdev rdevInfo, struct RsBackupInfo backupInfo, unsigned int notifyType,
    1017              :     unsigned int *rdevIndex)
    1018              : {
    1019           39 :     unsigned int phyId = rdevInfo.phyId;
    1020           39 :     struct RsRdevCb *rdevCb = NULL;
    1021           39 :     struct rs_cb *rsCb = NULL;
    1022              :     int ret;
    1023              : 
    1024           39 :     RS_CHECK_POINTER_NULL_RETURN_INT(rdevIndex);
    1025              : 
    1026           39 :     ret = RsApiInit();
    1027           39 :     CHK_PRT_RETURN(ret, hccp_err("RsApiInit failed! ret[%d]", ret), ret);
    1028              : 
    1029           39 :     ret = RsGetRsCb(phyId, &rsCb);
    1030           39 :     if (ret) {
    1031            8 :         hccp_err("RsGetRsCb failed, phyId[%u] invalid, ret %d", phyId, ret);
    1032            8 :         goto get_rs_cb_fail;
    1033              :     }
    1034              : 
    1035           31 :     rdevCb = calloc(1, sizeof(struct RsRdevCb));
    1036           31 :     if (rdevCb == NULL) {
    1037            0 :         hccp_err("calloc for rdev_cb failed");
    1038            0 :         ret = -ENOMEM;
    1039            0 :         goto get_rs_cb_fail;
    1040              :     }
    1041              : 
    1042           31 :     rdevCb->backupInfo.backupFlag = backupInfo.backupFlag;
    1043           31 :     (void)memcpy_s(&rdevCb->backupInfo.rdevInfo, sizeof(struct rdev), &backupInfo.rdevInfo, sizeof(struct rdev));
    1044              : #ifdef CUSTOM_INTERFACE
    1045           31 :     if (RsIsCustomInterfaceSupported()) {
    1046              :         // setup sharemem for aicpu rdma unfold
    1047           31 :         ret = RsSetupSharemem(rsCb, rdevCb->backupInfo.backupFlag, rdevCb->backupInfo.rdevInfo.phyId);
    1048           31 :         if (ret != 0) {
    1049            0 :             hccp_err("[init][rs_rdev]RsSetupSharemem failed, phyId(%u), ret(%d)", phyId, ret);
    1050            0 :             goto free_rs_cb;
    1051              :         }
    1052              :     }
    1053              : #endif
    1054              : 
    1055           31 :     rdevCb->notifyType = notifyType;
    1056           31 :     rdevCb->devList = RsIbvGetDeviceList(&(rdevCb->devNum));
    1057           31 :     if (rdevCb->devList == NULL || rdevCb->devNum == 0) {
    1058            0 :         hccp_err("dev_list is NULL, or devNum[%d] is 0", rdevCb->devNum);
    1059            0 :         ret = -EINVAL;
    1060            0 :         goto free_rs_cb;
    1061              :     }
    1062              : 
    1063           31 :     ret = RsSensorNodeRegister(phyId, rsCb);
    1064           31 :     if (ret != 0) {
    1065            0 :         hccp_err("[init][rs_rdev]rs_sensor_node_register failed, phyId(%u), ret(%d)", phyId, ret);
    1066            0 :         goto free_dev_list;
    1067              :     }
    1068              : 
    1069           31 :     hccp_info("ibv_get_device_list phyId[%d] dev_num[%d]", phyId, rdevCb->devNum);
    1070              : 
    1071           31 :     ret = RsRdevCbInit(rdevInfo, rdevCb, rsCb, rdevIndex);
    1072           31 :     if (ret != 0) {
    1073            2 :         RsSensorNodeUnregister(rdevCb->rsCb);
    1074            2 :         hccp_err("rs_rdev_cb_init failed ret %d!, normal ret 0", ret);
    1075            2 :         goto free_dev_list;
    1076              :     }
    1077              : 
    1078           29 :     RS_PTHREAD_MUTEX_LOCK(&rsCb->mutex);
    1079           29 :     RsListAddTail(&rdevCb->list, &rsCb->rdevList);
    1080           29 :     RS_PTHREAD_MUTEX_ULOCK(&rsCb->mutex);
    1081           29 :     hccp_run_info("rdev init success, phyId:%u, localIp:%s, rdevIndex:%u", phyId, rdevCb->localIp.readAddr, *rdevIndex);
    1082           29 :     return 0;
    1083              : 
    1084            2 : free_dev_list:
    1085            2 :     RsIbvFreeDeviceList(rdevCb->devList);
    1086            2 : free_rs_cb:
    1087            2 :     free(rdevCb);
    1088            2 :     rdevCb = NULL;
    1089           10 : get_rs_cb_fail:
    1090           10 :     RsApiDeinit();
    1091           10 :     return ret;
    1092              : }
    1093              : 
    1094            1 : RS_ATTRI_VISI_DEF int RsRdevInitWithBackup(struct rdev rdevInfo, struct rdev backupRdevInfo, unsigned int notifyType,
    1095              :     unsigned int *rdevIndex)
    1096              : {
    1097            1 :     struct RsBackupInfo backupInfo = {0};
    1098              : 
    1099            1 :     backupInfo.backupFlag = true;
    1100            1 :     (void)memcpy_s(&backupInfo.rdevInfo, sizeof(struct rdev), &backupRdevInfo, sizeof(struct rdev));
    1101              : 
    1102            1 :     return RsRdevInitWithBackupInfo(rdevInfo, backupInfo, notifyType, rdevIndex);
    1103              : }
    1104              : 
    1105           38 : RS_ATTRI_VISI_DEF int RsRdevInit(struct rdev rdevInfo, unsigned int notifyType, unsigned int *rdevIndex)
    1106              : {
    1107           38 :     struct RsBackupInfo backupInfo = {0};
    1108              : 
    1109           38 :     return RsRdevInitWithBackupInfo(rdevInfo, backupInfo, notifyType, rdevIndex);
    1110              : }
    1111              : 
    1112           29 : STATIC void RsDestroyQpList(unsigned int phyId, unsigned int rdevIndex, struct RsRdevCb *rdevCb, struct RsQpCb *qpCb,
    1113              :     struct RsQpCb *qpCb2)
    1114              : {
    1115              :     int ret;
    1116              : 
    1117           29 :     if (!RsListEmpty(&rdevCb->qpList)) {
    1118            0 :         hccp_warn("qp list do not empty!");
    1119            0 :         RS_LIST_GET_HEAD_ENTRY(qpCb, qpCb2, &rdevCb->qpList, list, struct RsQpCb);
    1120            0 :         for (; (&qpCb->list) != &rdevCb->qpList;
    1121            0 :              qpCb = qpCb2, qpCb2 = list_entry(qpCb2->list.next, struct RsQpCb, list)) {
    1122            0 :             hccp_info("qpn[%u] will be destroyed", qpCb->ibQp->qp_num);
    1123            0 :             if (qpCb->ibQpEx != NULL) {
    1124            0 :                 ret = RsNdaQpDestroy(phyId, rdevIndex, qpCb->ibQp->qp_num);
    1125              :             } else {
    1126            0 :                 ret = RsQpDestroy(phyId, rdevIndex, qpCb->ibQp->qp_num);
    1127              :             }
    1128            0 :             if (ret != 0) {
    1129            0 :                 hccp_err("rs_qp_destroy failed, ret:%d", ret);
    1130              :             }
    1131              :         }
    1132              :     }
    1133              : 
    1134           29 :     return;
    1135              : }
    1136              : 
    1137           29 : STATIC void RsFreeTypicalMrCb(struct RsRdevCb *devCb)
    1138              : {
    1139           29 :     struct RsListHead *typicalMrList = &devCb->typicalMrList;
    1140           29 :     struct RsMrCb *mrCurr = NULL;
    1141           29 :     struct RsMrCb *mrNext = NULL;
    1142              : 
    1143           29 :     RS_PTHREAD_MUTEX_LOCK(&devCb->rdevMutex);
    1144           29 :     RS_LIST_GET_HEAD_ENTRY(mrCurr, mrNext, typicalMrList, list, struct RsMrCb);
    1145           29 :     for (; (&mrCurr->list) != typicalMrList;
    1146            0 :          mrCurr = mrNext, mrNext = list_entry(mrNext->list.next, struct RsMrCb, list)) {
    1147            0 :         (void)RsDrvMrDereg(mrCurr->ibMr);
    1148            0 :         RsListDel(&mrCurr->list);
    1149            0 :         free(mrCurr);
    1150            0 :         mrCurr = NULL;
    1151              :     }
    1152           29 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->rdevMutex);
    1153              : 
    1154           29 :     hccp_info("rs_free_typical_mr_cb is succ");
    1155           29 : }
    1156              : 
    1157           31 : RS_ATTRI_VISI_DEF int RsRdevDeinit(unsigned int phyId, unsigned int notifyType, unsigned int rdevIndex)
    1158              : {
    1159              :     (void)notifyType;
    1160           31 :     struct RsRdevCb *rdevCb = NULL;
    1161           31 :     struct RsQpCb *qpCb2 = NULL;
    1162           31 :     struct RsQpCb *qpCb = NULL;
    1163              :     unsigned int chipId;
    1164              :     int ret;
    1165              : 
    1166           31 :     hccp_info("rdev deinit start, phyId:%u, rdevIndex:%u", phyId, rdevIndex);
    1167           31 :     CHK_PRT_RETURN(phyId >= RS_MAX_DEV_NUM, hccp_err("rs set param error ! phyId:%u", phyId), -EINVAL);
    1168           31 :     ret = rsGetLocalDevIDByHostDevID(phyId, &chipId);
    1169           31 :     CHK_PRT_RETURN(ret, hccp_err("phyId[%u] invalid, ret %d", phyId, ret), ret);
    1170              : 
    1171           29 :     ret = RsRdev2rdevCb(chipId, rdevIndex, &rdevCb);
    1172           29 :     CHK_PRT_RETURN(ret || rdevCb == NULL, hccp_err("rs_rdev2rdev_cb for chipId[%u] failed, ret %d", chipId, ret), ret);
    1173              : 
    1174           29 :     if (rdevCb->notifyType != NO_USE && rdevCb->notifyMr != NULL) {
    1175           27 :         ret = RsDrvMrDereg(rdevCb->notifyMr);
    1176           27 :         if (ret) {
    1177            0 :             hccp_err("rs_drv_mr_dereg failed, ret %d", ret);
    1178              :         }
    1179              :     }
    1180              : 
    1181           29 :     hccp_info("poll_cqe_num[%d]", rdevCb->pollCqeNum);
    1182              : 
    1183           29 :     RsDestroyQpList(phyId, rdevIndex, rdevCb, qpCb, qpCb2);
    1184              : 
    1185           29 :     RsFreeTypicalMrCb(rdevCb);
    1186              : 
    1187              : #ifdef CUSTOM_INTERFACE
    1188           29 :     if (RsIsCustomInterfaceSupported()) {
    1189           29 :         (void)RsRoceUnmmapAiDbReg(rdevCb->ibCtx);
    1190              :     }
    1191              : #endif
    1192              : 
    1193           29 :     RsIbvDeallocPd(rdevCb->ibPd);
    1194              : 
    1195           29 :     RsDeinitNdaCb(rdevCb);
    1196              : 
    1197           29 :     RsIbvCloseDevice(rdevCb->ibCtx);
    1198              : 
    1199              : #ifdef CUSTOM_INTERFACE
    1200           29 :     if (RsIsCustomInterfaceSupported()) {
    1201           29 :         RsCloseBackupIbCtx(rdevCb);
    1202              :     }
    1203              : #endif
    1204              : 
    1205           29 :     pthread_mutex_destroy(&rdevCb->cqeErrCntMutex);
    1206              : 
    1207           29 :     pthread_mutex_destroy(&rdevCb->rdevMutex);
    1208              : 
    1209           29 :     RsIbvFreeDeviceList(rdevCb->devList);
    1210              : 
    1211           29 :     RS_PTHREAD_MUTEX_LOCK(&gRsCb->mutex);
    1212           29 :     RsListDel(&rdevCb->list);
    1213           29 :     RS_PTHREAD_MUTEX_ULOCK(&gRsCb->mutex);
    1214           29 :     RsSensorNodeUnregister(rdevCb->rsCb);
    1215           29 :     RsApiDeinit();
    1216           29 :     hccp_run_info("rdev deinit success, phyId:%u, rdevIndex:%u", phyId, rdevIndex);
    1217           29 :     free(rdevCb);
    1218           29 :     rdevCb = NULL;
    1219           29 :     return 0;
    1220              : }
    1221              : 
    1222            0 : STATIC void RsHeterogTcpFreeFdNode(struct RsHeterogTcpFdInfo *fdNode)
    1223              : {
    1224              :     int fd;
    1225              : 
    1226            0 :     RS_PTHREAD_MUTEX_LOCK(&gRsCb->mutex);
    1227            0 :     fd = fdNode->fd;
    1228            0 :     RsListDel(&fdNode->list);
    1229            0 :     free(fdNode);
    1230            0 :     fdNode = NULL;
    1231            0 :     gRsCb->fdMap[fd] = NULL;
    1232            0 :     RS_PTHREAD_MUTEX_ULOCK(&gRsCb->mutex);
    1233            0 : }
    1234              : 
    1235            1 : RS_ATTRI_VISI_DEF int RsEpollCtlAdd(const void *fdHandle, enum RaEpollEvent event)
    1236              : {
    1237            1 :     struct RsHeterogTcpFdInfo *fdNode = NULL;
    1238            1 :     unsigned int tmpEvent = event;
    1239            1 :     int fd = RS_FD_INVALID;
    1240              :     int ret;
    1241              : 
    1242            1 :     if (event == RA_EPOLLONESHOT) {
    1243            0 :         tmpEvent = EPOLLIN | EPOLLET | EPOLLONESHOT;
    1244            1 :     } else if (event == RA_EPOLLIN) {
    1245            1 :         tmpEvent = EPOLLIN;
    1246              :     } else {
    1247            0 :         hccp_err("unknown event[%u]", tmpEvent);
    1248            0 :         return -EINVAL;
    1249              :     }
    1250              : 
    1251            1 :     if (gRsCb == NULL) {
    1252            1 :         gRsCb = RsGetCurRsCb();
    1253            1 :         if (gRsCb == NULL) {
    1254            1 :             hccp_err("[rs_epoll_ctl_add]rs_get_cur_rs_cb failed rs_cb(NULL)");
    1255            1 :             return -EINVAL;
    1256              :         }
    1257              :     }
    1258            0 :     tmpEvent = tmpEvent | EPOLLRDHUP;
    1259            0 :     fdNode = calloc(1, sizeof(struct RsHeterogTcpFdInfo));
    1260            0 :     CHK_PRT_RETURN(fdNode == NULL, hccp_err("no memory for fd_node"), -ENOMEM);
    1261              : 
    1262            0 :     fd = ((const struct SocketPeerInfo *)fdHandle)->fd;
    1263            0 :     fdNode->fd = fd;
    1264            0 :     RS_PTHREAD_MUTEX_LOCK(&gRsCb->mutex);
    1265            0 :     RsListAddTail(&fdNode->list, &gRsCb->heterogTcpFdList);
    1266            0 :     gRsCb->fdMap[fd] = fdHandle;
    1267            0 :     RS_PTHREAD_MUTEX_ULOCK(&gRsCb->mutex);
    1268            0 :     ret = RsEpollCtl(gRsCb->connCb.epollfd, EPOLL_CTL_ADD, fd, tmpEvent);
    1269            0 :     if (ret != 0) {
    1270            0 :         hccp_err("[rs_epoll_ctl_add]RsEpollCtl failed ret(%d), fd:%d, event:%u", ret, fd, event);
    1271            0 :         goto out;
    1272              :     }
    1273            0 :     return 0;
    1274            0 : out:
    1275            0 :     RsHeterogTcpFreeFdNode(fdNode);
    1276            0 :     fdNode = NULL;
    1277            0 :     return ret;
    1278              : }
    1279              : 
    1280            5 : RS_ATTRI_VISI_DEF int RsEpollCtlMod(const void *fdHandle, enum RaEpollEvent event)
    1281              : {
    1282            5 :     unsigned int tmpEvent = event;
    1283            5 :     int fd = RS_FD_INVALID;
    1284              :     int ret;
    1285              : 
    1286            5 :     if (event == RA_EPOLLONESHOT) {
    1287            1 :         tmpEvent = EPOLLIN | EPOLLET | EPOLLONESHOT;
    1288            4 :     } else if (event == RA_EPOLLIN) {
    1289            3 :         tmpEvent = EPOLLIN;
    1290              :     } else {
    1291            1 :         hccp_err("unknown event[%u]", event);
    1292            1 :         return -EINVAL;
    1293              :     }
    1294              : 
    1295            4 :     tmpEvent = tmpEvent | EPOLLRDHUP;
    1296            4 :     fd = ((const struct SocketPeerInfo *)fdHandle)->fd;
    1297              : 
    1298            4 :     if (gRsCb == NULL) {
    1299            1 :         gRsCb = RsGetCurRsCb();
    1300            1 :         if (gRsCb == NULL) {
    1301            1 :             hccp_err("[rs_epoll_ctl_mod]rs_get_cur_rs_cb failed rs_cb(NULL)");
    1302            1 :             return -EINVAL;
    1303              :         }
    1304              :     }
    1305              : 
    1306            3 :     ret = RsEpollCtl(gRsCb->connCb.epollfd, EPOLL_CTL_MOD, fd, tmpEvent);
    1307            3 :     CHK_PRT_RETURN(ret, hccp_err("[rs_epoll_ctl_mod]RsEpollCtl failed ret(%d), fd:%d, event:%u", ret, fd, event), ret);
    1308            1 :     return 0;
    1309              : }
    1310              : 
    1311            3 : RS_ATTRI_VISI_DEF int RsEpollCtlDel(int fd)
    1312              : {
    1313              :     int ret;
    1314            3 :     struct RsHeterogTcpFdInfo *fdNode = NULL;
    1315            3 :     struct RsHeterogTcpFdInfo *fdNode1 = NULL;
    1316              : 
    1317            3 :     if (gRsCb == NULL) {
    1318            1 :         gRsCb = RsGetCurRsCb();
    1319            1 :         if (gRsCb == NULL) {
    1320            1 :             hccp_err("[rs_epoll_ctl_del]rs_get_cur_rs_cb failed rs_cb(NULL)");
    1321            1 :             return -EINVAL;
    1322              :         }
    1323              :     }
    1324            2 :     RS_LIST_GET_HEAD_ENTRY(fdNode, fdNode1, &gRsCb->heterogTcpFdList, list, struct RsHeterogTcpFdInfo);
    1325            2 :     for (; (&fdNode->list) != &gRsCb->heterogTcpFdList;
    1326            0 :          fdNode = fdNode1, fdNode1 = list_entry(fdNode1->list.next, struct RsHeterogTcpFdInfo, list)) {
    1327            0 :         if (fdNode->fd == fd) {
    1328              :             // 删除节点
    1329            0 :             RsHeterogTcpFreeFdNode(fdNode);
    1330            0 :             fdNode = NULL;
    1331            0 :             break; // lint !e108
    1332              :         }
    1333              :     }
    1334              : 
    1335              :     // 为了兼容epoll不同版本,这里加EPOLLIN参数
    1336            2 :     ret = RsEpollCtl(gRsCb->connCb.epollfd, EPOLL_CTL_DEL, fd, EPOLLIN);
    1337            2 :     CHK_PRT_RETURN(ret, hccp_err("[rs_epoll_ctl_del]RsEpollCtl failed ret(%d), fd:%d", ret, fd), ret);
    1338            1 :     return 0;
    1339              : }
    1340              : 
    1341            3 : RS_ATTRI_VISI_DEF void RsSetTcpRecvCallback(const void *callback)
    1342              : {
    1343            3 :     if (gRsCb == NULL) {
    1344            1 :         hccp_err("param error, gRsCb is NULL");
    1345            1 :         return;
    1346              :     }
    1347            2 :     gRsCb->tcpRecvCallback = (void (*)(const void *))callback;
    1348              : }
    1349              : 
    1350            1 : STATIC void RsFreeAcceptOneNode(struct rs_cb *rscb, struct RsAcceptInfo *accept)
    1351              : {
    1352              :     int ret;
    1353              : 
    1354            1 :     ret = RsEpollCtl(rscb->connCb.epollfd, EPOLL_CTL_DEL, accept->connFd, EPOLLIN);
    1355            1 :     if (ret) {
    1356            1 :         hccp_err("epoll ctl del fd %d failed, ret:%d", accept->connFd, ret);
    1357              :     }
    1358              : 
    1359            1 :     RS_PTHREAD_MUTEX_LOCK(&rscb->connCb.connMutex);
    1360            1 :     RsListDel(&accept->list);
    1361            1 :     RS_PTHREAD_MUTEX_ULOCK(&rscb->connCb.connMutex);
    1362              : 
    1363            1 :     if (rscb->sslEnable == RS_SSL_ENABLE) {
    1364            1 :         if (accept->ssl == NULL) {
    1365            0 :             hccp_warn("[Server] accept->ssl is NULL, it maybe has not establish tls link");
    1366              :         } else {
    1367            1 :             ssl_adp_shutdown(accept->ssl);
    1368            1 :             ssl_adp_free(accept->ssl);
    1369            1 :             accept->ssl = NULL;
    1370              :         }
    1371              :     }
    1372              : 
    1373            1 :     RS_CLOSE_RETRY_FOR_EINTR(ret, accept->connFd);
    1374              : 
    1375            1 :     hccp_info("free accept_server IP:%s, port:%d, connFd:%d", accept->serverIpAddr.readAddr, accept->sockPort,
    1376              :         accept->connFd);
    1377            1 :     accept->connFd = RS_FD_INVALID;
    1378              : 
    1379            1 :     free(accept);
    1380            1 :     accept = NULL;
    1381            1 : }
    1382              : 
    1383           40 : STATIC void RsFreeAccpetList(struct rs_cb *rscb)
    1384              : {
    1385           40 :     struct RsAcceptInfo *accept = NULL;
    1386           40 :     struct RsAcceptInfo *accept2 = NULL;
    1387              : 
    1388           40 :     if (!RsListEmpty(&rscb->connCb.serverAcceptList)) {
    1389            0 :         hccp_warn("Server accept list do not empty!");
    1390            0 :         RS_LIST_GET_HEAD_ENTRY(accept, accept2, &rscb->connCb.serverAcceptList, list, struct RsAcceptInfo);
    1391            0 :         for (; (&accept->list) != &rscb->connCb.serverAcceptList;
    1392            0 :              accept = accept2, accept2 = list_entry(accept2->list.next, struct RsAcceptInfo, list)) {
    1393            0 :             RsFreeAcceptOneNode(rscb, accept);
    1394            0 :             accept = NULL;
    1395              :         }
    1396              :     }
    1397              : 
    1398           40 :     return;
    1399              : }
    1400              : 
    1401           12 : STATIC void RsFreeDesignatedAccpetNode(struct rs_cb *rscb, struct RsIpAddrInfo *localIp)
    1402              : {
    1403           12 :     struct RsAcceptInfo *accept = NULL;
    1404           12 :     struct RsAcceptInfo *accept2 = NULL;
    1405              : 
    1406           12 :     if (!RsListEmpty(&rscb->connCb.serverAcceptList)) {
    1407            0 :         RS_LIST_GET_HEAD_ENTRY(accept, accept2, &rscb->connCb.serverAcceptList, list, struct RsAcceptInfo);
    1408            0 :         for (; (&accept->list) != &rscb->connCb.serverAcceptList;
    1409            0 :              accept = accept2, accept2 = list_entry(accept2->list.next, struct RsAcceptInfo, list)) {
    1410            0 :             if (!RsCompareIpAddr(&accept->serverIpAddr, localIp)) {
    1411            0 :                 RsFreeAcceptOneNode(rscb, accept);
    1412            0 :                 accept = NULL;
    1413              :             }
    1414              :         }
    1415              :     }
    1416              : 
    1417           12 :     return;
    1418              : }
    1419              : 
    1420            2 : STATIC void RsFreeConnOneNode(struct rs_cb *rscb, struct RsConnInfo *conn)
    1421              : {
    1422              :     int ret;
    1423              : 
    1424            2 :     RS_PTHREAD_MUTEX_LOCK(&rscb->connCb.connMutex);
    1425            2 :     RsListDel(&conn->list);
    1426            2 :     RS_PTHREAD_MUTEX_ULOCK(&rscb->connCb.connMutex);
    1427              : 
    1428            2 :     if (rscb->sslEnable == RS_SSL_ENABLE) {
    1429            0 :         if (conn->ssl == NULL) {
    1430            0 :             hccp_warn("[Client] conn->ssl is NULL, it maybe has not establish tls link");
    1431              :         } else {
    1432            0 :             ssl_adp_shutdown(conn->ssl);
    1433            0 :             ssl_adp_free(conn->ssl);
    1434            0 :             conn->ssl = NULL;
    1435              :         }
    1436              :     }
    1437              : 
    1438            2 :     RS_CLOSE_RETRY_FOR_EINTR(ret, conn->connfd);
    1439              : 
    1440            2 :     hccp_info("free for conn IP:%s, port:%d, connfd:%d, state:%u", conn->clientIp.readAddr, conn->port, conn->connfd,
    1441              :         conn->state);
    1442              : 
    1443            2 :     conn->connfd = RS_FD_INVALID;
    1444            2 :     conn->state = RS_CONN_STATE_RESET;
    1445              : 
    1446            2 :     free(conn);
    1447            2 :     conn = NULL;
    1448            2 : }
    1449              : 
    1450           40 : STATIC void RsFreeClientConnList(struct rs_cb *rscb)
    1451              : {
    1452           40 :     struct RsConnInfo *conn = NULL;
    1453           40 :     struct RsConnInfo *conn2 = NULL;
    1454              : 
    1455           40 :     if (!RsListEmpty(&rscb->connCb.clientConnList)) {
    1456            0 :         hccp_warn("Client conn node do not empty!");
    1457            0 :         RS_LIST_GET_HEAD_ENTRY(conn, conn2, &rscb->connCb.clientConnList, list, struct RsConnInfo);
    1458            0 :         for (; (&conn->list) != &rscb->connCb.clientConnList;
    1459            0 :              conn = conn2, conn2 = list_entry(conn2->list.next, struct RsConnInfo, list)) {
    1460            0 :             RsFreeConnOneNode(rscb, conn);
    1461            0 :             conn = NULL;
    1462              :         }
    1463              :     }
    1464              : 
    1465           40 :     return;
    1466              : }
    1467              : 
    1468           12 : STATIC void RsFreeDesignatedClientConnNode(struct rs_cb *rscb, struct RsIpAddrInfo *localIp)
    1469              : {
    1470           12 :     struct RsConnInfo *conn = NULL;
    1471           12 :     struct RsConnInfo *conn2 = NULL;
    1472              : 
    1473           12 :     if (!RsListEmpty(&rscb->connCb.clientConnList)) {
    1474            0 :         RS_LIST_GET_HEAD_ENTRY(conn, conn2, &rscb->connCb.clientConnList, list, struct RsConnInfo);
    1475            0 :         for (; (&conn->list) != &rscb->connCb.clientConnList;
    1476            0 :              conn = conn2, conn2 = list_entry(conn2->list.next, struct RsConnInfo, list)) {
    1477            0 :             if (!RsCompareIpAddr(&conn->clientIp, localIp)) {
    1478            0 :                 hccp_warn("Client conn node for IP[%s] do not empty!", localIp->readAddr);
    1479            0 :                 RsFreeConnOneNode(rscb, conn);
    1480            0 :                 conn = NULL;
    1481              :             }
    1482              :         }
    1483              :     }
    1484              : 
    1485           12 :     return;
    1486              : }
    1487              : 
    1488           40 : STATIC void RsFreeServerConnList(struct rs_cb *rscb)
    1489              : {
    1490           40 :     struct RsConnInfo *conn = NULL;
    1491           40 :     struct RsConnInfo *conn2 = NULL;
    1492              : 
    1493           40 :     if (!RsListEmpty(&rscb->connCb.serverConnList)) {
    1494            1 :         hccp_warn("Server conn node do not empty!");
    1495            1 :         RS_LIST_GET_HEAD_ENTRY(conn, conn2, &rscb->connCb.serverConnList, list, struct RsConnInfo);
    1496            2 :         for (; (&conn->list) != &rscb->connCb.serverConnList;
    1497            1 :              conn = conn2, conn2 = list_entry(conn2->list.next, struct RsConnInfo, list)) {
    1498            1 :             RsFreeConnOneNode(rscb, conn);
    1499            1 :             conn = NULL;
    1500              :         }
    1501              :     }
    1502              : 
    1503           40 :     return;
    1504              : }
    1505              : 
    1506           12 : STATIC void RsFreeDesignatedServerConnNode(struct rs_cb *rscb, struct RsIpAddrInfo *localIp)
    1507              : {
    1508           12 :     struct RsConnInfo *conn = NULL;
    1509           12 :     struct RsConnInfo *conn2 = NULL;
    1510              : 
    1511           12 :     if (!RsListEmpty(&rscb->connCb.serverConnList)) {
    1512            1 :         RS_LIST_GET_HEAD_ENTRY(conn, conn2, &rscb->connCb.serverConnList, list, struct RsConnInfo);
    1513            2 :         for (; (&conn->list) != &rscb->connCb.serverConnList;
    1514            1 :              conn = conn2, conn2 = list_entry(conn2->list.next, struct RsConnInfo, list)) {
    1515            1 :             if (!RsCompareIpAddr(&conn->serverIp, localIp)) {
    1516            1 :                 hccp_warn("Server conn node for IP[%s] do not empty!", localIp->readAddr);
    1517            1 :                 RsFreeConnOneNode(rscb, conn);
    1518            1 :                 conn = NULL;
    1519              :             }
    1520              :         }
    1521              :     }
    1522           12 :     return;
    1523              : }
    1524              : 
    1525            1 : STATIC void RsFreeListenOneNode(struct rs_cb *rscb, struct RsListenInfo *listen)
    1526              : {
    1527              :     int ret;
    1528              : 
    1529            1 :     ret = RsEpollCtl(rscb->connCb.epollfd, EPOLL_CTL_DEL, listen->listenFd, EPOLLIN);
    1530            1 :     if (ret) {
    1531            0 :         hccp_err("delete from epoll failed, ret:%d, epollfd:%d, listenFd:%d", ret, rscb->connCb.epollfd,
    1532              :             listen->listenFd);
    1533              :     }
    1534              : 
    1535            1 :     RS_PTHREAD_MUTEX_LOCK(&rscb->connCb.connMutex);
    1536            1 :     RsListDel(&listen->list);
    1537            1 :     RS_PTHREAD_MUTEX_ULOCK(&rscb->connCb.connMutex);
    1538              : 
    1539            1 :     RS_CLOSE_RETRY_FOR_EINTR(ret, listen->listenFd);
    1540              : 
    1541            1 :     hccp_info("free Listen IP:%s, port:%d, listenFd:%d, state:%u", listen->serverIpAddr.readAddr,
    1542              :         ntohs(listen->sockPort), listen->listenFd, listen->state);
    1543              : 
    1544            1 :     listen->listenFd = RS_FD_INVALID;
    1545            1 :     listen->state = RS_CONN_STATE_RESET;
    1546              : 
    1547            1 :     free(listen);
    1548            1 : }
    1549              : 
    1550           40 : STATIC void RsFreeListenList(struct rs_cb *rscb)
    1551              : {
    1552           40 :     struct RsListenInfo *listen = NULL;
    1553           40 :     struct RsListenInfo *listen2 = NULL;
    1554              : 
    1555           40 :     if (!RsListEmpty(&rscb->connCb.listenList)) {
    1556            1 :         hccp_warn("Server listen node do not empty!");
    1557            1 :         RS_LIST_GET_HEAD_ENTRY(listen, listen2, &rscb->connCb.listenList, list, struct RsListenInfo);
    1558            2 :         for (; (&listen->list) != &rscb->connCb.listenList;
    1559            1 :              listen = listen2, listen2 = list_entry(listen2->list.next, struct RsListenInfo, list)) {
    1560            1 :             RsFreeListenOneNode(rscb, listen);
    1561            1 :             listen = NULL;
    1562              :         }
    1563              :     }
    1564              : 
    1565           40 :     return;
    1566              : }
    1567              : 
    1568           12 : STATIC void RsFreeDesignatedListenNode(struct rs_cb *rscb, struct RsIpAddrInfo *localIp)
    1569              : {
    1570           12 :     struct RsListenInfo *listen = NULL;
    1571           12 :     struct RsListenInfo *listen2 = NULL;
    1572              : 
    1573           12 :     if (!RsListEmpty(&rscb->connCb.listenList)) {
    1574            0 :         RS_LIST_GET_HEAD_ENTRY(listen, listen2, &rscb->connCb.listenList, list, struct RsListenInfo);
    1575            0 :         for (; (&listen->list) != &rscb->connCb.listenList;
    1576            0 :              listen = listen2, listen2 = list_entry(listen2->list.next, struct RsListenInfo, list)) {
    1577            0 :             if (!RsCompareIpAddr(&listen->serverIpAddr, localIp)) {
    1578            0 :                 RsFreeListenOneNode(rscb, listen);
    1579            0 :                 listen = NULL;
    1580              :             }
    1581              :         }
    1582              :     }
    1583              : 
    1584           12 :     return;
    1585              : }
    1586              : 
    1587           11 : STATIC void RsWhiteListNodeFree(struct rs_cb *rscb, struct RsWhiteList *wlist)
    1588              : {
    1589           11 :     struct RsWhiteListInfo *wlistNode = NULL;
    1590           11 :     struct RsWhiteListInfo *wlistNode1 = NULL;
    1591              : 
    1592           11 :     if (!RsListEmpty(&wlist->whiteList)) {
    1593           10 :         RS_LIST_GET_HEAD_ENTRY(wlistNode, wlistNode1, &wlist->whiteList, list, struct RsWhiteListInfo);
    1594           21 :         for (; (&wlistNode->list) != &wlist->whiteList;
    1595           11 :              wlistNode = wlistNode1, wlistNode1 = list_entry(wlistNode1->list.next, struct RsWhiteListInfo, list)) {
    1596           11 :             RS_PTHREAD_MUTEX_LOCK(&rscb->connCb.connMutex);
    1597           11 :             RsListDel(&wlistNode->list);
    1598           11 :             RS_PTHREAD_MUTEX_ULOCK(&rscb->connCb.connMutex);
    1599              : 
    1600           11 :             hccp_info("free White list client IP:%s, tag:%s", wlistNode->clientIp.readAddr, wlistNode->tag);
    1601           11 :             free(wlistNode);
    1602           11 :             wlistNode = NULL;
    1603              :         }
    1604              :     }
    1605           11 : }
    1606              : 
    1607           11 : STATIC void RsFreeWhiteOneNode(struct rs_cb *rscb, struct RsWhiteList *wlist)
    1608              : {
    1609           11 :     RsWhiteListNodeFree(rscb, wlist);
    1610              : 
    1611           11 :     RS_PTHREAD_MUTEX_LOCK(&rscb->connCb.connMutex);
    1612           11 :     RsListDel(&wlist->list);
    1613           11 :     RS_PTHREAD_MUTEX_ULOCK(&rscb->connCb.connMutex);
    1614              : 
    1615           11 :     hccp_info("White list server IP:%s", wlist->serverIp.readAddr);
    1616           11 :     free(wlist);
    1617           11 :     wlist = NULL;
    1618           11 : }
    1619              : 
    1620           40 : STATIC void RsFreeWhiteList(struct rs_cb *rscb)
    1621              : {
    1622           40 :     struct RsWhiteList *wlist = NULL;
    1623           40 :     struct RsWhiteList *wlist2 = NULL;
    1624              : 
    1625           40 :     if (!RsListEmpty(&rscb->connCb.whiteList)) {
    1626            1 :         hccp_warn("Server white list do not empty!");
    1627            1 :         RS_LIST_GET_HEAD_ENTRY(wlist, wlist2, &rscb->connCb.whiteList, list, struct RsWhiteList);
    1628            2 :         for (; (&wlist->list) != &rscb->connCb.whiteList;
    1629            1 :              wlist = wlist2, wlist2 = list_entry(wlist2->list.next, struct RsWhiteList, list)) {
    1630            1 :             RsFreeWhiteOneNode(rscb, wlist);
    1631            1 :             wlist = NULL;
    1632              :         }
    1633              :     }
    1634              : 
    1635           40 :     return;
    1636              : }
    1637              : 
    1638           12 : STATIC void RsFreeDesignatedWhiteNode(struct rs_cb *rscb, struct RsIpAddrInfo *localIp)
    1639              : {
    1640           12 :     struct RsWhiteList *wlist = NULL;
    1641           12 :     struct RsWhiteList *wlist2 = NULL;
    1642              : 
    1643           12 :     if (!RsListEmpty(&rscb->connCb.whiteList)) {
    1644           10 :         RS_LIST_GET_HEAD_ENTRY(wlist, wlist2, &rscb->connCb.whiteList, list, struct RsWhiteList);
    1645           20 :         for (; (&wlist->list) != &rscb->connCb.whiteList;
    1646           10 :              wlist = wlist2, wlist2 = list_entry(wlist2->list.next, struct RsWhiteList, list)) {
    1647           10 :             if (!RsCompareIpAddr(&wlist->serverIp, localIp)) {
    1648           10 :                 RsFreeWhiteOneNode(rscb, wlist);
    1649           10 :                 wlist = NULL;
    1650              :             }
    1651              :         }
    1652              :     }
    1653              : 
    1654           12 :     return;
    1655              : }
    1656              : 
    1657           12 : STATIC void RsFreeSocketList(struct rs_cb *rscb, struct RsIpAddrInfo *localIp)
    1658              : {
    1659           12 :     RsFreeDesignatedAccpetNode(rscb, localIp);
    1660           12 :     RsFreeDesignatedClientConnNode(rscb, localIp);
    1661              : 
    1662           12 :     RsFreeDesignatedServerConnNode(rscb, localIp);
    1663              : 
    1664           12 :     RsFreeDesignatedListenNode(rscb, localIp);
    1665              : 
    1666           12 :     RsFreeDesignatedWhiteNode(rscb, localIp);
    1667              : 
    1668           12 :     return;
    1669              : }
    1670              : 
    1671           15 : RS_ATTRI_VISI_DEF int RsSocketDeinit(struct rdev rdevInfo)
    1672              : {
    1673              :     int ret;
    1674           15 :     unsigned int phyId = rdevInfo.phyId;
    1675              :     unsigned int chipId;
    1676           15 :     struct rs_cb *rscb = NULL;
    1677              : 
    1678           15 :     hccp_info("rs socket deinit start, phyId:%u", phyId);
    1679           15 :     CHK_PRT_RETURN(phyId >= RS_MAX_DEV_NUM, hccp_err("rs set param error ! phyId:%u", phyId), -EINVAL);
    1680           15 :     ret = rsGetLocalDevIDByHostDevID(phyId, &chipId);
    1681           15 :     CHK_PRT_RETURN(ret, hccp_err("phyId[%u] invalid, ret %d", phyId, ret), ret);
    1682              : 
    1683           15 :     CHK_PRT_RETURN((rdevInfo.family != AF_INET) && (rdevInfo.family != AF_INET6),
    1684              :         hccp_err("family[%d] invalid", rdevInfo.family), -EPROTONOSUPPORT);
    1685              : 
    1686           13 :     if (rdevInfo.family == AF_INET) {
    1687           13 :         unsigned int *localIp = NULL;
    1688           13 :         localIp = &(rdevInfo.localIp.addr.s_addr);
    1689           13 :         ret = RsSocketNodeid2vnic(*localIp, localIp);
    1690           13 :         hccp_info("socket deinit local IP is 0x%llx, ret:%d", *localIp, ret);
    1691              :     }
    1692              : 
    1693              :     struct RsIpAddrInfo localIp;
    1694           13 :     RsConvertIpAddr(rdevInfo.family, &rdevInfo.localIp, &localIp);
    1695              : 
    1696           13 :     ret = RsDev2rscb(chipId, &rscb, false);
    1697           13 :     CHK_PRT_RETURN(ret, hccp_err("get rscb failed for chipId:%u, ret:%d", chipId, ret), -ENODEV);
    1698              : 
    1699           12 :     RS_PTHREAD_MUTEX_LOCK(&rscb->mutex);
    1700           12 :     RsFreeSocketList(rscb, &localIp);
    1701           12 :     RS_PTHREAD_MUTEX_ULOCK(&rscb->mutex);
    1702           12 :     hccp_run_info("socket deinit success, phyId:%u, localIp:%s", phyId, localIp.readAddr);
    1703           12 :     return 0;
    1704              : }
    1705              : 
    1706           44 : STATIC void RsFreeRdevList(struct rs_cb *rsCb)
    1707              : {
    1708           44 :     struct RsRdevCb *rdevCbCurr = NULL;
    1709           44 :     struct RsRdevCb *rdevCbNext = NULL;
    1710           44 :     unsigned int phyId = 0;
    1711              :     int ret;
    1712              : 
    1713           44 :     if (RsListEmpty(&rsCb->rdevList)) {
    1714           41 :         return;
    1715              :     }
    1716              : 
    1717            3 :     hccp_run_warn("Rdev list is not empty!");
    1718            3 :     ret = rsGetDevIDByLocalDevID(rsCb->chipId, &phyId);
    1719            3 :     if (ret != 0) {
    1720            1 :         hccp_err("chipId[%u] invalid, ret %d", rsCb->chipId, ret);
    1721            1 :         return;
    1722              :     }
    1723              : 
    1724            2 :     RS_LIST_GET_HEAD_ENTRY(rdevCbCurr, rdevCbNext, &rsCb->rdevList, list, struct RsRdevCb);
    1725            4 :     for (; (&rdevCbCurr->list) != &rsCb->rdevList;
    1726            2 :          rdevCbCurr = rdevCbNext, rdevCbNext = list_entry(rdevCbNext->list.next, struct RsRdevCb, list)) {
    1727            2 :         ret = RsRdevDeinit(phyId, rdevCbCurr->notifyType, rdevCbCurr->rdevIndex);
    1728            2 :         if (ret != 0) {
    1729            1 :             hccp_err("rs_rdev_deinit failed, ret:%d, phyId:%u", ret, phyId);
    1730              :         }
    1731              :     }
    1732              : 
    1733            2 :     return;
    1734              : }
    1735              : 
    1736           43 : STATIC void RsFreeUdevList(struct rs_cb *rsCb)
    1737              : {
    1738           43 :     struct RsUbDevCb *udevCbCurr = NULL;
    1739           43 :     struct RsUbDevCb *udevCbNext = NULL;
    1740              :     int ret;
    1741              : 
    1742           43 :     if (RsListEmpty(&rsCb->udevList)) {
    1743           41 :         return;
    1744              :     }
    1745              : 
    1746            2 :     hccp_run_warn("Udev list is not empty!");
    1747            2 :     RS_LIST_GET_HEAD_ENTRY(udevCbCurr, udevCbNext, &rsCb->udevList, list, struct RsUbDevCb);
    1748            4 :     for (; (&udevCbCurr->list) != &rsCb->udevList;
    1749            2 :          udevCbCurr = udevCbNext, udevCbNext = list_entry(udevCbNext->list.next, struct RsUbDevCb, list)) {
    1750            2 :         ret = RsUbCtxDeinit(udevCbCurr);
    1751            2 :         if (ret != 0) {
    1752            1 :             hccp_err("rs_ub_ctx_deinit failed, ret:%d", ret);
    1753              :         }
    1754              :     }
    1755              : 
    1756            2 :     return;
    1757              : }
    1758              : 
    1759           40 : STATIC void RsFreeHeterogTcpFdList(struct rs_cb *rsCb)
    1760              : {
    1761           40 :     struct RsHeterogTcpFdInfo *fdNode = NULL;
    1762           40 :     struct RsHeterogTcpFdInfo *fdNode1 = NULL;
    1763              : 
    1764           40 :     if (!RsListEmpty(&rsCb->heterogTcpFdList)) {
    1765            0 :         hccp_warn("heterog_tcp_fd_list do not empty!");
    1766            0 :         RS_LIST_GET_HEAD_ENTRY(fdNode, fdNode1, &rsCb->heterogTcpFdList, list, struct RsHeterogTcpFdInfo);
    1767            0 :         for (; (&fdNode->list) != &rsCb->heterogTcpFdList;
    1768            0 :              fdNode = fdNode1, fdNode1 = list_entry(fdNode1->list.next, struct RsHeterogTcpFdInfo, list)) {
    1769            0 :             hccp_info(">>>>>fd_node->fd:%d", fdNode->fd);
    1770              :             // 删除节点
    1771            0 :             RS_PTHREAD_MUTEX_LOCK(&rsCb->mutex);
    1772            0 :             RsListDel(&fdNode->list);
    1773            0 :             free(fdNode);
    1774            0 :             fdNode = NULL;
    1775            0 :             RS_PTHREAD_MUTEX_ULOCK(&rsCb->mutex);
    1776              :         }
    1777              :     }
    1778              : 
    1779           40 :     return;
    1780              : }
    1781              : 
    1782           40 : STATIC void RsListFree(struct rs_cb *rscb)
    1783              : {
    1784           40 :     RsFreeAccpetList(rscb);
    1785           40 :     RsFreeClientConnList(rscb);
    1786              : 
    1787           40 :     RsFreeServerConnList(rscb);
    1788              : 
    1789           40 :     RsFreeListenList(rscb);
    1790              : 
    1791           40 :     RsFreeWhiteList(rscb);
    1792              : 
    1793           40 :     return;
    1794              : }
    1795              : 
    1796           41 : STATIC void RsSslFree(struct rs_cb *rscb)
    1797              : {
    1798           41 :     if (rscb->sslEnable == RS_SSL_ENABLE) {
    1799            2 :         if (rscb->skidSubjectCb != NULL) {
    1800            1 :             if (memset_s(rscb->skidSubjectCb, sizeof(struct RsCertSkidSubjectCb), 0,
    1801              :                     sizeof(struct RsCertSkidSubjectCb))) {
    1802            1 :                 hccp_warn("memset_s for skid_subject_cb unsuccessful");
    1803              :             }
    1804            1 :             free(rscb->skidSubjectCb);
    1805            1 :             rscb->skidSubjectCb = NULL;
    1806              :         }
    1807            2 :         ssl_adp_ctx_free(rscb->serverSslCtx);
    1808            2 :         rscb->serverSslCtx = NULL;
    1809            2 :         ssl_adp_ctx_free(rscb->clientSslCtx);
    1810            2 :         rscb->clientSslCtx = NULL;
    1811              :     }
    1812           41 : }
    1813              : 
    1814           40 : STATIC void RsDeinitFreeRscb(struct rs_cb *rscb)
    1815              : {
    1816           40 :     RS_PTHREAD_MUTEX_LOCK(&rscb->mutex);
    1817           40 :     RsListFree(rscb);
    1818              : 
    1819           40 :     free(rscb->fdMap);
    1820           40 :     rscb->fdMap = NULL;
    1821           40 :     freeifaddrs(rscb->ifaddrList);
    1822           40 :     rscb->ifaddrList = NULL;
    1823           40 :     RS_PTHREAD_MUTEX_ULOCK(&rscb->mutex);
    1824           40 :     RsFreeRdevList(rscb);
    1825           40 :     RsFreeUdevList(rscb);
    1826           40 :     RsSslFree(rscb);
    1827           40 :     RsFreeHeterogTcpFdList(rscb);
    1828              : #ifdef CONFIG_TLV
    1829              :     if (RsIsTlvSupported()) {
    1830              :         if (rscb->tlvCb.initFlag) {
    1831              :             RsTlvDeinit(rscb->tlvCb.phyId);
    1832              :         }
    1833              :     }
    1834              : #endif
    1835           40 :     pthread_mutex_destroy(&rscb->mutex);
    1836           40 :     pthread_mutex_destroy(&rscb->connCb.connMutex);
    1837           40 :     RsDestroyEpoll(rscb);
    1838              : 
    1839              : #ifdef CUSTOM_INTERFACE
    1840           40 :     if (RsIsUdmaSupported() || RsIsRdmaSupported()) {
    1841            0 :         RsDeInitNetAdapt(rscb);
    1842            0 :         RsEschedDeinit(rscb->protocol);
    1843            0 :         (void)RsCtxApiDeinit(rscb->hccpMode, rscb->protocol);
    1844              :     }
    1845              : #endif
    1846              : 
    1847           40 :     free(rscb);
    1848           40 :     rscb = NULL;
    1849           40 :     gRsCb = NULL;
    1850           40 : }
    1851              : 
    1852           44 : RS_ATTRI_VISI_DEF int RsDeinit(struct RsInitConfig *cfg)
    1853              : {
    1854           44 :     struct rs_cb *rscb = gRsCb;
    1855              :     unsigned int chipId;
    1856              :     eventfd_t event;
    1857              :     int ret;
    1858              : 
    1859           44 :     CHK_PRT_RETURN(cfg == NULL, hccp_err("param error, cfg is NULL"), -EINVAL);
    1860              : 
    1861           44 :     chipId = cfg->chipId;
    1862           44 :     if (__sync_fetch_and_sub(&(gInitCounter[chipId]), 1) > 1) {
    1863            0 :         return 0;
    1864              :     }
    1865           44 :     if (rscb && (chipId == rscb->chipId)) {
    1866           40 :         event = 1;
    1867              :         /* send event to eventfd to waking up epoll handle thread */
    1868           40 :         ret = (int)write(rscb->connCb.eventfd, &event, sizeof(eventfd_t));
    1869           40 :         CHK_PRT_RETURN(ret != sizeof(eventfd_t),
    1870              :             hccp_err("eventfd_write failed(0x%x), chipId:%u, errno:%d", ret, chipId, errno), -EFILEOPER);
    1871              : 
    1872           40 :         hccp_info("epoll wait up ok, rscb->connFlag:%d", rscb->connFlag);
    1873              :         // already been RS_CONN_EXIT_FLAG, no need to change conn_flag
    1874           40 :         if (rscb->connFlag != RS_CONN_EXIT_FLAG) {
    1875           40 :             rscb->connFlag = 0;
    1876              :         }
    1877           40 :         int tryAgain = RS_TRY_TIME;
    1878           80 :         while (((rscb->state & RS_STATE_HALT) == 0) && tryAgain > 0) {
    1879           40 :             usleep(RS_USLEEP_TIME);
    1880           40 :             tryAgain--;
    1881              :         };
    1882              : 
    1883           40 :         if (tryAgain == 0) {
    1884            0 :             hccp_warn("try_again exhausted, rscb state:%u", rscb->state);
    1885              :         }
    1886              : 
    1887           40 :         tryAgain = RS_TRY_TIME;
    1888         6363 :         while ((rscb->connFlag != RS_CONN_EXIT_FLAG) && tryAgain > 0) {
    1889         6323 :             usleep(RS_USLEEP_TIME);
    1890         6323 :             tryAgain--;
    1891              :         }
    1892              : 
    1893           40 :         CHK_PRT_RETURN(tryAgain == 0, hccp_warn("connect thread quit unsuccessful"), -EAGAIN);
    1894           40 :         rscb->state &= ~RS_STATE_HALT;
    1895           40 :         RsDeinitFreeRscb(rscb);
    1896           40 :         gRsCbList[chipId] = NULL;
    1897           40 :         DlHalDeinit();
    1898              : 
    1899           40 :         hccp_run_info("rs_deinit chipId[%u] ok", chipId);
    1900              : 
    1901           40 :         return 0;
    1902              :     }
    1903              : 
    1904            4 :     DlHalDeinit();
    1905            4 :     return -ENODEV;
    1906              : }
    1907              : 
    1908            0 : RS_ATTRI_VISI_DEF int RsGetVnicIp(unsigned int phyId, unsigned int *vnicIp)
    1909              : {
    1910            0 :     int64_t deviceInfo = 0;
    1911              :     int ret;
    1912              : 
    1913            0 :     CHK_PRT_RETURN(phyId >= RS_MAX_DEV_NUM, hccp_err("phyId:%u >= [%d], is invalid", phyId, RS_MAX_DEV_NUM), -EINVAL);
    1914            0 :     CHK_PRT_RETURN(vnicIp == NULL, hccp_err("vnic_ip is null!"), -EINVAL);
    1915              : 
    1916            0 :     ret = DlHalGetDeviceInfo(phyId, MODULE_TYPE_SYSTEM, INFO_TYPE_VNIC_IP, &deviceInfo);
    1917            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("phyId:%u dl_hal_get_device_info failed! ret:%d", phyId, ret), ret);
    1918              : 
    1919            0 :     *vnicIp = (unsigned int)deviceInfo;
    1920            0 :     return 0;
    1921              : }
    1922              : 
    1923            4 : STATIC int RsGetVnicIpInfo(unsigned int phyId, unsigned int id, enum IdType type, struct IpInfo *info)
    1924              : {
    1925            4 :     int64_t deviceInfo = 0;
    1926              :     unsigned int vnicIp;
    1927              :     int ret;
    1928              : 
    1929              :     // get vnic ip by id with different type
    1930            4 :     if (type == PHY_ID_VNIC_IP) {
    1931            1 :         ret = DlHalGetDeviceInfo(id, MODULE_TYPE_SYSTEM, INFO_TYPE_VNIC_IP, &deviceInfo);
    1932            1 :         CHK_PRT_RETURN(ret != 0,
    1933              :             hccp_err("cur_phy_id:%u dl_hal_get_device_info failed! phyId:%u ret:%d", phyId, id, ret), ret);
    1934            3 :     } else if (type == SDID_VNIC_IP) {
    1935            1 :         ret = DlHalGetDeviceInfo(id, MODULE_TYPE_SYSTEM, INFO_TYPE_SPOD_VNIC_IP, &deviceInfo);
    1936            1 :         CHK_PRT_RETURN(ret != 0, hccp_err("phyId:%u dl_hal_get_device_info failed! sdid:0x%x ret:%d", phyId, id, ret),
    1937              :             ret);
    1938              :     } else {
    1939            2 :         hccp_err("phyId:%u get vnic ip failed! id:0x%x, invalid type:%u", phyId, id, type);
    1940            2 :         return -EINVAL;
    1941              :     }
    1942              : 
    1943              :     // prepare ip info, only support IPv4
    1944            2 :     vnicIp = (unsigned int)deviceInfo;
    1945            2 :     info->family = AF_INET;
    1946            2 :     info->ip.addr.s_addr = vnicIp;
    1947              : 
    1948            2 :     hccp_dbg("phyId:%u query id:%u type:%u got vnic_ip:%u", phyId, id, type, vnicIp);
    1949              : 
    1950            2 :     return 0;
    1951              : }
    1952              : 
    1953            3 : RS_ATTRI_VISI_DEF int RsGetVnicIpInfos(unsigned int phyId, enum IdType type, unsigned int ids[], unsigned int num,
    1954              :     struct IpInfo infos[])
    1955              : {
    1956              :     unsigned int i;
    1957              :     int ret;
    1958              : 
    1959            3 :     CHK_PRT_RETURN(ids == NULL, hccp_err("phyId:%u, ids is null!", phyId), -EINVAL);
    1960            2 :     CHK_PRT_RETURN(infos == NULL, hccp_err("phyId:%u, infos is null!", phyId), -EINVAL);
    1961              : 
    1962            1 :     for (i = 0; i < num; i++) {
    1963            1 :         ret = RsGetVnicIpInfo(phyId, ids[i], type, &infos[i]);
    1964            1 :         if (ret != 0) {
    1965            1 :             hccp_err("phyId:%u get vnic ip info failed! ids[%u]:0x%x type:%u", phyId, i, ids[i], type);
    1966            1 :             return ret;
    1967              :         }
    1968              :     }
    1969              : 
    1970            0 :     return 0;
    1971              : }
    1972              : 
    1973          464 : int rsGetLocalDevIDByHostDevID(unsigned int phyId, unsigned int *chipId)
    1974              : {
    1975          464 :     CHK_PRT_RETURN(gRsCb == NULL, hccp_warn("No device initialized !"), -ENODEV);
    1976              : 
    1977          452 :     if (gRsCb->hccpMode == NETWORK_PEER_ONLINE) {
    1978           49 :         *chipId = phyId;
    1979           49 :         return 0;
    1980              :     } else {
    1981              :         // to be compatible with mdev scenario: ignore phyId to get current devId(chipId)
    1982          403 :         return DlDrvQueryProcessHostPid(getpid(), chipId, NULL, NULL, NULL);
    1983              :     }
    1984              : }
    1985              : 
    1986           15 : int rsGetDevIDByLocalDevID(unsigned int chipId, unsigned int *phyId)
    1987              : {
    1988           15 :     CHK_PRT_RETURN(gRsCb == NULL, hccp_warn("No device initialized !"), -ENODEV);
    1989              : 
    1990           15 :     if (gRsCb->hccpMode == NETWORK_PEER_ONLINE) {
    1991            0 :         *phyId = chipId;
    1992            0 :         return 0;
    1993              :     } else {
    1994           15 :         return DlDrvGetDevIdByLocalDevId(chipId, phyId);
    1995              :     }
    1996              : }
    1997              : 
    1998            2 : RS_ATTRI_VISI_DEF int RsSetQpAttrQos(unsigned int phyId, unsigned int rdevIndex, unsigned int qpn, struct QosAttr *attr)
    1999              : {
    2000            2 :     struct RsQpCb *qpCb = NULL;
    2001            2 :     int ret = 0;
    2002              : 
    2003            2 :     RS_QP_PARA_CHECK(phyId);
    2004            2 :     ret = RsQpn2qpcb(phyId, rdevIndex, qpn, &qpCb);
    2005            2 :     CHK_PRT_RETURN(ret != 0 || qpCb == NULL, hccp_err("get qp cb failed qpn %u, ret %d", qpn, ret), ret);
    2006              : 
    2007            2 :     qpCb->qosAttr.tc = attr->tc;
    2008            2 :     qpCb->qosAttr.sl = attr->sl;
    2009              : 
    2010            2 :     hccp_info("set qp qos attr: qpn[%u] tc[%u] sl[%u]", qpn, attr->tc, attr->sl);
    2011            2 :     return 0;
    2012              : }
    2013              : 
    2014            2 : RS_ATTRI_VISI_DEF int RsSetQpAttrTimeout(unsigned int phyId, unsigned int rdevIndex, unsigned int qpn,
    2015              :     unsigned int *timeout)
    2016              : {
    2017            2 :     struct RsQpCb *qpCb = NULL;
    2018            2 :     int ret = 0;
    2019              : 
    2020            2 :     RS_QP_PARA_CHECK(phyId);
    2021            2 :     ret = RsQpn2qpcb(phyId, rdevIndex, qpn, &qpCb);
    2022            2 :     CHK_PRT_RETURN(ret != 0 || qpCb == NULL, hccp_err("get qp cb failed qpn %u, ret %d", qpn, ret), ret);
    2023              : 
    2024            2 :     qpCb->timeout = *timeout;
    2025              : 
    2026            2 :     hccp_info("set qp qos attr: qpn[%u] timeout[%u]", qpn, *timeout);
    2027            2 :     return 0;
    2028              : }
    2029              : 
    2030            2 : RS_ATTRI_VISI_DEF int RsSetQpAttrRetryCnt(unsigned int phyId, unsigned int rdevIndex, unsigned int qpn,
    2031              :     unsigned int *retryCnt)
    2032              : {
    2033            2 :     struct RsQpCb *qpCb = NULL;
    2034            2 :     int ret = 0;
    2035              : 
    2036            2 :     RS_QP_PARA_CHECK(phyId);
    2037            2 :     ret = RsQpn2qpcb(phyId, rdevIndex, qpn, &qpCb);
    2038            2 :     CHK_PRT_RETURN(ret != 0 || qpCb == NULL, hccp_err("get qp cb failed qpn %u, ret %d", qpn, ret), ret);
    2039              : 
    2040            2 :     qpCb->retryCnt = *retryCnt;
    2041              : 
    2042            2 :     hccp_info("set qp qos attr: qpn[%u] retry_cnt[%u]", qpn, *retryCnt);
    2043            2 :     return 0;
    2044              : }
    2045              : 
    2046            1 : RS_ATTRI_VISI_DEF int RsGetCqeErrInfo(struct CqeErrInfo *info)
    2047              : {
    2048              :     int ret;
    2049              : 
    2050            1 :     ret = RsDrvGetCqeErrInfo(info);
    2051            1 :     CHK_PRT_RETURN(ret, hccp_err("get failed! ret:%d", ret), ret);
    2052            1 :     return 0;
    2053              : }
    2054              : 
    2055            2 : RS_ATTRI_VISI_DEF int RsGetCqeErrInfoNum(unsigned int phyId, unsigned int rdevIdx, unsigned int *num)
    2056              : {
    2057            2 :     struct RsRdevCb *rdevCb = NULL;
    2058              :     unsigned int chipId;
    2059              :     int ret;
    2060              : 
    2061            2 :     CHK_PRT_RETURN(phyId >= RS_MAX_DEV_NUM, hccp_err("rs get cqe err param error, phyId[%u]", phyId), -EINVAL);
    2062            1 :     ret = rsGetLocalDevIDByHostDevID(phyId, &chipId);
    2063            1 :     CHK_PRT_RETURN(ret, hccp_err("phyId[%u] invalid, ret %d", phyId, ret), ret);
    2064              : 
    2065            1 :     ret = RsRdev2rdevCb(chipId, rdevIdx, &rdevCb);
    2066            1 :     CHK_PRT_RETURN(ret != 0 || rdevCb == NULL, hccp_err("rs_rdev2rdev_cb for chipId[%u] failed, ret %d", chipId, ret),
    2067              :         ret);
    2068              : 
    2069            0 :     *num = rdevCb->cqeErrCnt;
    2070              : 
    2071            0 :     return 0;
    2072              : }
    2073              : 
    2074            3 : RS_ATTRI_VISI_DEF int RsGetCqeErrInfoList(unsigned int phyId, unsigned int rdevIdx, struct CqeErrInfo *info,
    2075              :     unsigned int *num)
    2076              : {
    2077            3 :     struct RsQpCb *qpCbCurr = NULL;
    2078            3 :     struct RsQpCb *qpCbNext = NULL;
    2079            3 :     struct RsRdevCb *rdevCb = NULL;
    2080            3 :     unsigned int cqeErrIdx = 0;
    2081            3 :     unsigned int numTmp = *num;
    2082              :     unsigned int chipId;
    2083              :     int ret;
    2084              : 
    2085            3 :     CHK_PRT_RETURN(phyId >= RS_MAX_DEV_NUM, hccp_err("rs get cqe err param error, phyId[%u]", phyId), -EINVAL);
    2086            2 :     ret = rsGetLocalDevIDByHostDevID(phyId, &chipId);
    2087            2 :     CHK_PRT_RETURN(ret, hccp_err("phyId[%u] invalid, ret %d", phyId, ret), ret);
    2088              : 
    2089            2 :     ret = RsRdev2rdevCb(chipId, rdevIdx, &rdevCb);
    2090            2 :     CHK_PRT_RETURN(ret != 0 || rdevCb == NULL, hccp_err("rs_rdev2rdev_cb for chipId[%u] failed, ret %d", chipId, ret),
    2091              :         ret);
    2092              : 
    2093            2 :     if (RsListEmpty(&rdevCb->qpList)) {
    2094            1 :         *num = 0;
    2095            1 :         return 0;
    2096              :     }
    2097              : 
    2098            1 :     RS_LIST_GET_HEAD_ENTRY(qpCbCurr, qpCbNext, &rdevCb->qpList, list, struct RsQpCb);
    2099            2 :     for (; (&qpCbCurr->list) != &rdevCb->qpList;
    2100            1 :          qpCbCurr = qpCbNext, qpCbNext = list_entry(qpCbNext->list.next, struct RsQpCb, list)) {
    2101            1 :         if (qpCbCurr->cqeErrInfo.info.status != 0) {
    2102            1 :             RS_PTHREAD_MUTEX_LOCK(&qpCbCurr->cqeErrInfo.mutex);
    2103            1 :             info[cqeErrIdx].status = qpCbCurr->cqeErrInfo.info.status;
    2104            1 :             info[cqeErrIdx].qpn = qpCbCurr->cqeErrInfo.info.qpn;
    2105            1 :             info[cqeErrIdx].time = qpCbCurr->cqeErrInfo.info.time;
    2106            1 :             qpCbCurr->cqeErrInfo.info.status = 0;
    2107            1 :             RS_PTHREAD_MUTEX_ULOCK(&qpCbCurr->cqeErrInfo.mutex);
    2108            1 :             RS_PTHREAD_MUTEX_LOCK(&qpCbCurr->rdevCb->cqeErrCntMutex);
    2109            1 :             qpCbCurr->rdevCb->cqeErrCnt--;
    2110            1 :             RS_PTHREAD_MUTEX_ULOCK(&qpCbCurr->rdevCb->cqeErrCntMutex);
    2111            1 :             cqeErrIdx++;
    2112            1 :             if (cqeErrIdx == numTmp) {
    2113            0 :                 break;
    2114              :             }
    2115              :         }
    2116              :     }
    2117              : 
    2118            1 :     *num = cqeErrIdx;
    2119              : 
    2120            1 :     return 0;
    2121              : }
    2122              : 
    2123            3 : int RsQueryMrCb(struct RsRdevCb *devCb, uint64_t addr, struct RsMrCb **mrCb, struct RsListHead *mrList)
    2124              : {
    2125            3 :     struct RsMrCb *mrCurr = NULL;
    2126            3 :     struct RsMrCb *mrNext = NULL;
    2127              : 
    2128            3 :     RS_PTHREAD_MUTEX_LOCK(&devCb->rdevMutex);
    2129            3 :     RS_LIST_GET_HEAD_ENTRY(mrCurr, mrNext, mrList, list, struct RsMrCb);
    2130            3 :     for (; (&mrCurr->list) != mrList; mrCurr = mrNext, mrNext = list_entry(mrNext->list.next, struct RsMrCb, list)) {
    2131            2 :         if ((mrCurr->mrInfo.addr <= addr) && (addr < mrCurr->mrInfo.addr + mrCurr->mrInfo.len)) {
    2132            2 :             *mrCb = mrCurr;
    2133            2 :             RS_PTHREAD_MUTEX_ULOCK(&devCb->rdevMutex);
    2134            2 :             return 0;
    2135              :         }
    2136              :     }
    2137              : 
    2138            1 :     *mrCb = NULL;
    2139            1 :     RS_PTHREAD_MUTEX_ULOCK(&devCb->rdevMutex);
    2140              : 
    2141            1 :     hccp_info("cannot find mrcb for addr@0x%lx !", addr);
    2142              : 
    2143            1 :     return -ENODEV;
    2144              : }
    2145              : 
    2146            4 : STATIC int RsGetLinuxVersion(struct RsLinuxVersionInfo *verInfo)
    2147              : {
    2148              : #define LINUX_VERSION_MAX_CHAR 1024
    2149              : #define LINUX_VERSION_TYPE_NUM 3
    2150              : #define LINUX_VERSION_STR "Linux version "
    2151            4 :     char buffer[LINUX_VERSION_MAX_CHAR] = {0};
    2152              :     char *versionStr;
    2153            4 :     int retClose = 0;
    2154            4 :     int ret = 0;
    2155              :     int fd;
    2156              : 
    2157            4 :     fd = open("/proc/version", O_RDONLY);
    2158            4 :     CHK_PRT_RETURN(fd < 0, hccp_run_warn("open proc/version unsuccessful, errno[%d] fd[%d]", errno, fd), -EFILEOPER);
    2159              : 
    2160              :     do {
    2161            3 :         ret = (int)read(fd, buffer, sizeof(buffer) - 1);
    2162            3 :     } while ((ret < 0) && (errno == EINTR));
    2163              : 
    2164            3 :     if (ret < 0) {
    2165            1 :         hccp_run_warn("read fd unsuccessful[%d]", ret);
    2166            1 :         RS_CLOSE_RETRY_FOR_EINTR(retClose, fd);
    2167            1 :         return -EFILEOPER;
    2168              :     }
    2169              : 
    2170            2 :     versionStr = strstr(buffer, LINUX_VERSION_STR);
    2171            2 :     if (versionStr == NULL) {
    2172            1 :         hccp_run_warn("can't get Linux version");
    2173            1 :         RS_CLOSE_RETRY_FOR_EINTR(retClose, fd);
    2174            1 :         return -EFILEOPER;
    2175              :     }
    2176            1 :     versionStr += strlen(LINUX_VERSION_STR);
    2177            1 :     if (sscanf_s(versionStr, "%d.%d.%d", &verInfo->major, &verInfo->minor, &verInfo->patch) != LINUX_VERSION_TYPE_NUM) {
    2178            1 :         hccp_run_warn("can't extract Linux version");
    2179            1 :         RS_CLOSE_RETRY_FOR_EINTR(retClose, fd);
    2180            1 :         return -EFILEOPER;
    2181              :     }
    2182              : 
    2183            0 :     RS_CLOSE_RETRY_FOR_EINTR(retClose, fd);
    2184            0 :     return retClose;
    2185              : }
    2186              : 
    2187            5 : RS_ATTRI_VISI_DEF int RsGetSecRandom(unsigned int *value)
    2188              : {
    2189              : #define SEC_LINUX_VERSION_MAJOR 5
    2190              : #define SEC_LINUX_VERSION_MINOR 18
    2191              : #define SEC_LINUX_VERSION_PATCH 0
    2192            5 :     struct RsLinuxVersionInfo verInfo = {0};
    2193              :     int ret;
    2194              : 
    2195            5 :     ret = RsGetLinuxVersion(&verInfo);
    2196            5 :     CHK_PRT_RETURN(ret, hccp_run_warn("[rs_get_random]get_linux_version unsuccessful ret(%d)", ret), ret);
    2197              : 
    2198              :     // linux_version > 5.18, urandom is secure
    2199            1 :     if (verInfo.major > SEC_LINUX_VERSION_MAJOR ||
    2200            1 :         (verInfo.major == SEC_LINUX_VERSION_MAJOR && verInfo.minor > SEC_LINUX_VERSION_MINOR) ||
    2201            0 :         (verInfo.major == SEC_LINUX_VERSION_MAJOR && verInfo.minor == SEC_LINUX_VERSION_MINOR &&
    2202            0 :             verInfo.patch > SEC_LINUX_VERSION_PATCH)) {
    2203            1 :         ret = RsDrvGetRandomNum((int *)value);
    2204              :     } else {
    2205            0 :         hccp_run_warn("[rs_get_random]linux_version is not secure version");
    2206            0 :         return -ENOTSUPP;
    2207              :     }
    2208              : 
    2209            1 :     if (ret != 0) {
    2210            1 :         hccp_run_warn("[get][get_random]rs_get_sec_random unsuccessful, ret(%d)", ret);
    2211              :     }
    2212            1 :     return ret;
    2213              : }
    2214              : 
    2215          452 : RS_ATTRI_VISI_DEF enum ProductType RsGetProductType(int devId)
    2216              : {
    2217              :     static enum ProductType type = PRODUCT_TYPE_NO_VALUE;
    2218              :     static halChipInfo chipInfo = {0};
    2219              :     int ret;
    2220              : 
    2221          452 :     if (type != PRODUCT_TYPE_NO_VALUE) { // Cache result after first query
    2222          450 :         hccp_info("[Get][ChipInfo]chip name is %s, type:%d", chipInfo.name, type);
    2223          450 :         return type;
    2224              :     }
    2225              : 
    2226            2 :     DlHalInit();
    2227            2 :     ret = DlHalGetChipInfo(devId, &chipInfo);
    2228            2 :     DlHalDeinit();
    2229              : 
    2230            2 :     CHK_PRT_RETURN(ret != 0, hccp_err("[Get][ChipInfo]DlHalGetChipInfo failed ret:%d", ret), PRODUCT_TYPE_INVALID);
    2231              : 
    2232            2 :     if (fnmatch("910_93[a-zA-Z1-9_]*", (const char *)chipInfo.name, 0) == 0) {
    2233            0 :         type = PRODUCT_TYPE_910_93;
    2234            2 :     } else if (fnmatch("910B[a-zA-Z1-9_]*", (const char *)chipInfo.name, 0) == 0) {
    2235            0 :         type = PRODUCT_TYPE_910B;
    2236            2 :     } else if (fnmatch("910_96[a-zA-Z1-9_]*", (const char *)chipInfo.name, 0) == 0) {
    2237            0 :         type = PRODUCT_TYPE_910_96;
    2238            2 :     } else if (fnmatch("910[a-zA-Z1-9]*", (const char *)chipInfo.name, 0) == 0) {
    2239            0 :         type = PRODUCT_TYPE_910;
    2240            2 :     } else if (fnmatch("310p[a-zA-Z1-9]*", (const char *)chipInfo.name, 0) == 0) {
    2241            0 :         type = PRODUCT_TYPE_310p;
    2242            2 :     } else if (fnmatch("950[a-zA-Z1-9]*", (const char *)chipInfo.name, 0) == 0) {
    2243            0 :         type = PRODUCT_TYPE_950;
    2244            2 :     } else if (fnmatch("350[a-zA-Z1-9]*", (const char *)chipInfo.name, 0) == 0) {
    2245            0 :         type = PRODUCT_TYPE_350;
    2246              :     } else {
    2247            2 :         type = PRODUCT_TYPE_OTHERS;
    2248              :     }
    2249              : 
    2250            2 :     hccp_run_info("[Get][ChipInfo]chip name is %s, type:%d", chipInfo.name, type);
    2251            2 :     return type;
    2252              : }
        

Generated by: LCOV version 2.0-1