LCOV - code coverage report
Current view: top level - base_comm/resources/hccp/rdma_agent/hdc/async - ra_hdc_async_socket.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 53.1 % 262 139
Test Date: 2026-07-28 12:11:00 Functions: 72.7 % 11 8

            Line data    Source code
       1              : /**
       2              :  * Copyright (c) 2025 Huawei Technologies Co., Ltd.
       3              :  * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
       4              :  * CANN Open Software License Agreement Version 2.0 (the "License").
       5              :  * Please refer to the License for details. You may not use this file except in compliance with the License.
       6              :  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
       7              :  * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
       8              :  * See LICENSE in the root of the software repository for the full text of the License.
       9              :  */
      10              : 
      11              : #include "securec.h"
      12              : #include "user_log.h"
      13              : #include "ra.h"
      14              : #include "ra_comm.h"
      15              : #include "ra_async.h"
      16              : #include "ra_rs_comm.h"
      17              : #include "ra_rs_err.h"
      18              : #include "ra_hdc.h"
      19              : #include "ra_hdc_socket.h"
      20              : #include "ra_hdc_async.h"
      21              : #include "ra_hdc_async_socket.h"
      22              : 
      23            1 : int RaHdcSocketSendAsync(const struct SocketHdcInfo *fdHandle, const void *data, unsigned long long size,
      24              :     unsigned long long *sentSize, void **reqHandle)
      25              : {
      26            1 :     unsigned long long sendSize = (size > SOCKET_SEND_MAXLEN) ? SOCKET_SEND_MAXLEN : size;
      27            1 :     struct RaRequestHandle *reqHandleTmp = NULL;
      28            1 :     union OpSocketSendData *asyncData = NULL;
      29            1 :     unsigned int phyId = fdHandle->phyId;
      30            1 :     int ret = 0;
      31              : 
      32            1 :     asyncData = (union OpSocketSendData *)calloc(sizeof(union OpSocketSendData), sizeof(char));
      33            1 :     CHK_PRT_RETURN(asyncData == NULL, hccp_err("[send][ra_hdc_socket]calloc async_data failed, phyId(%u)", phyId),
      34              :         -ENOMEM);
      35              : 
      36            1 :     asyncData->txData.fd = (unsigned int)fdHandle->fd;
      37            1 :     asyncData->txData.sendSize = sendSize;
      38            1 :     ret = memcpy_s(asyncData->txData.dataSend, SOCKET_SEND_MAXLEN, data, sendSize);
      39            1 :     if (ret != 0) {
      40            0 :         hccp_err("[send][ra_hdc_socket]memcpy_s data failed, ret(%d) sendSize(%llu) phyId(%u)",
      41              :             ret, sendSize, phyId);
      42            0 :         ret = -ESAFEFUNC;
      43            0 :         goto out;
      44              :     }
      45              : 
      46            1 :     reqHandleTmp = (struct RaRequestHandle *)calloc(1, sizeof(struct RaRequestHandle));
      47            1 :     if (reqHandleTmp == NULL) {
      48            0 :         hccp_err("[send][ra_hdc_socket]calloc req_handle_tmp failed, phyId[%u]", phyId);
      49            0 :         ret = -ENOMEM;
      50            0 :         goto out;
      51              :     }
      52            1 :     *sentSize = 0;
      53            1 :     reqHandleTmp->privData = (void *)sentSize;
      54              : 
      55            1 :     ret = RaHdcSendMsgAsync(RA_RS_SOCKET_SEND, phyId, (char *)asyncData, sizeof(union OpSocketSendData),
      56              :         reqHandleTmp);
      57            1 :     if (ret != 0) {
      58            0 :         hccp_err("[send][ra_hdc_socket]hdc async send message process failed ret(%d) phyId(%u)", ret, phyId);
      59            0 :         free(reqHandleTmp);
      60            0 :         reqHandleTmp = NULL;
      61            0 :         goto out;
      62              :     }
      63              : 
      64            1 :     *reqHandle = (void *)reqHandleTmp;
      65              : 
      66            1 : out:
      67            1 :     free(asyncData);
      68            1 :     asyncData = NULL;
      69            1 :     return ret;
      70              : }
      71              : 
      72            0 : void RaHdcAsyncHandleSocketSend(struct RaRequestHandle *reqHandle)
      73              : {
      74            0 :     union OpSocketSendData *asyncData = NULL;
      75              : 
      76            0 :     if (reqHandle->opRet > 0) {
      77            0 :         asyncData = (union OpSocketSendData *)reqHandle->recvBuf;
      78            0 :         *(unsigned long long *)reqHandle->privData = asyncData->rxData.realSendSize;
      79            0 :         reqHandle->opRet = 0;
      80            0 :     } else if (reqHandle->opRet == 0) {
      81            0 :         hccp_warn("[send][ra_hdc_socket]socket has been closed. sent_size is 0");
      82            0 :         *(unsigned long long *)reqHandle->privData = 0;
      83            0 :         reqHandle->opRet = -ESOCKCLOSED;
      84              :     } else {
      85            0 :         if (reqHandle->opRet != -EAGAIN) {
      86            0 :             hccp_warn("[send][ra_hdc_socket]socket send unsuccessful ret(%d) phyId(%u)", reqHandle->opRet,
      87              :                 reqHandle->phyId);
      88              :         }
      89            0 :         *(unsigned long long *)reqHandle->privData = 0;
      90              :     }
      91              : 
      92            0 :     return;
      93              : }
      94              : 
      95            1 : STATIC void RaHdcSocketPrepareRecvRsp(struct RaResponseSocketRecv *recvRsp, void *data,
      96              :     unsigned long long size, unsigned long long *receivedSize)
      97              : {
      98            1 :     recvRsp->data = data;
      99            1 :     recvRsp->size = size;
     100            1 :     *receivedSize = 0;
     101            1 :     recvRsp->receivedSize = receivedSize;
     102            1 : }
     103              : 
     104            1 : int RaHdcSocketRecvAsync(const struct SocketHdcInfo *fdHandle, void *data, unsigned long long size,
     105              :     unsigned long long *receivedSize, void **reqHandle)
     106              : {
     107            1 :     unsigned long long recvSize = (size > SOCKET_SEND_MAXLEN) ? SOCKET_SEND_MAXLEN : size;
     108            1 :     struct RaResponseSocketRecv *recvRsp = NULL;
     109            1 :     struct RaRequestHandle *reqHandleTmp = NULL;
     110            1 :     union OpSocketRecvData *asyncData = NULL;
     111            1 :     unsigned int phyId = fdHandle->phyId;
     112            1 :     int ret = 0;
     113              : 
     114            1 :     recvRsp = (struct RaResponseSocketRecv *)calloc(1, sizeof(struct RaResponseSocketRecv));
     115            1 :     CHK_PRT_RETURN(recvRsp == NULL, hccp_err("[recv][ra_hdc_socket]calloc recv_rsp failed, phyId(%u)", phyId),
     116              :         -ENOMEM);
     117            1 :     RaHdcSocketPrepareRecvRsp(recvRsp, data, recvSize, receivedSize);
     118              : 
     119            1 :     asyncData = (union OpSocketRecvData *)calloc(sizeof(union OpSocketRecvData) + recvSize, sizeof(char));
     120            1 :     if (asyncData == NULL) {
     121            0 :         hccp_err("[recv][ra_hdc_socket]calloc async_data failed, phyId(%u)", phyId);
     122            0 :         ret = -ENOMEM;
     123            0 :         goto free_recv_rsp;
     124              :     }
     125              : 
     126            1 :     asyncData->txData.fd = (unsigned int)fdHandle->fd;
     127            1 :     asyncData->txData.recvSize = recvSize;
     128            1 :     reqHandleTmp = (struct RaRequestHandle *)calloc(1, sizeof(struct RaRequestHandle));
     129            1 :     if (reqHandleTmp == NULL) {
     130            0 :         hccp_err("[recv][ra_hdc_socket]calloc req_handle_tmp failed, phyId[%u]", phyId);
     131            0 :         ret = -ENOMEM;
     132            0 :         goto out;
     133              :     }
     134            1 :     reqHandleTmp->privData = (void *)recvRsp;
     135            1 :     ret = RaHdcSendMsgAsync(RA_RS_SOCKET_RECV, phyId, (char *)asyncData,
     136              :         (unsigned int)(sizeof(union OpSocketRecvData) + recvSize), reqHandleTmp);
     137            1 :     if (ret != 0) {
     138            0 :         hccp_err("[recv][ra_hdc_socket]hdc async send message process failed ret(%d) phyId(%u)", ret, phyId);
     139            0 :         free(reqHandleTmp);
     140            0 :         reqHandleTmp = NULL;
     141            0 :         goto out;
     142              :     }
     143              : 
     144            1 :     free(asyncData);
     145            1 :     asyncData = NULL;
     146            1 :     *reqHandle = (void *)reqHandleTmp;
     147            1 :     return 0;
     148              : 
     149            0 : out:
     150            0 :     free(asyncData);
     151            0 :     asyncData = NULL;
     152            0 : free_recv_rsp:
     153            0 :     free(recvRsp);
     154            0 :     recvRsp = NULL;
     155            0 :     return ret;
     156              : }
     157              : 
     158            0 : void RaHdcAsyncHandleSocketRecv(struct RaRequestHandle *reqHandle)
     159              : {
     160            0 :     struct RaResponseSocketRecv *recvRsp = NULL;
     161            0 :     union OpSocketRecvData *asyncData = NULL;
     162            0 :     unsigned long long realRecvSize = 0;
     163            0 :     unsigned int phyId = 0;
     164            0 :     int ret = 0;
     165              : 
     166            0 :     phyId = reqHandle->phyId;
     167            0 :     if (reqHandle->opRet == 0) {
     168            0 :         hccp_warn("[recv][ra_hdc_socket]socket has been closed. received_size is 0");
     169            0 :         reqHandle->opRet = -ESOCKCLOSED;
     170            0 :         goto out;
     171            0 :     } else if (reqHandle->opRet < 0) {
     172            0 :         if (reqHandle->opRet != -EAGAIN) {
     173            0 :             hccp_warn("[recv][ra_hdc_socket]socket recv ret(%d) phyId(%u)", reqHandle->opRet, phyId);
     174              :         }
     175            0 :         goto out;
     176              :     }
     177              : 
     178            0 :     asyncData = (union OpSocketRecvData *)reqHandle->recvBuf;
     179            0 :     realRecvSize = asyncData->rxData.realRecvSize;
     180            0 :     if (realRecvSize > SOCKET_SEND_MAXLEN) {
     181            0 :         hccp_err("[recv][ra_hdc_socket]real_recv_size:%llu invalid, phyId(%u)", realRecvSize, phyId);
     182            0 :         reqHandle->opRet = -EINVAL;
     183            0 :         goto out;
     184              :     }
     185              : 
     186            0 :     recvRsp = (struct RaResponseSocketRecv *)reqHandle->privData;
     187            0 :     ret = memcpy_s(recvRsp->data, recvRsp->size, (char *)asyncData + sizeof(union OpSocketRecvData),
     188              :         realRecvSize);
     189            0 :     if (ret != 0) {
     190            0 :         hccp_err("[recv][ra_hdc_socket]memcpy_s failed, ret(%d) phyId(%u) size(%llu) realRecvSize(%llu)",
     191              :             ret, phyId, recvRsp->size, realRecvSize);
     192            0 :         reqHandle->opRet = -ESAFEFUNC;
     193            0 :         goto out;
     194              :     }
     195              : 
     196            0 :     reqHandle->opRet = 0;
     197            0 :     *recvRsp->receivedSize = realRecvSize;
     198              : 
     199            0 : out:
     200            0 :     free(reqHandle->privData);
     201            0 :     reqHandle->privData = NULL;
     202            0 :     return;
     203              : }
     204              : 
     205            1 : int RaHdcSocketListenStartAsync(unsigned int phyId, struct SocketListenInfoT conn[], unsigned int num,
     206              :     void **reqHandle)
     207              : {
     208            1 :     struct RaResponseSocketListen *asyncRsp = NULL;
     209            1 :     struct RaRequestHandle *reqHandleTmp = NULL;
     210            1 :     union OpSocketListenData asyncData = {0};
     211            1 :     int ret = 0;
     212              : 
     213            1 :     ret = RaGetSocketListenInfo(conn, num, asyncData.txData.conn, MAX_SOCKET_NUM);
     214            1 :     CHK_PRT_RETURN(ret != 0, hccp_err("[listen_start][ra_hdc_socket]get_socket_listen_info failed, ret(%d) phyId(%u)",
     215              :         ret, phyId), -EINVAL);
     216            1 :     asyncData.txData.num = num | (1U << SOCKET_USE_PORT_BIT);
     217              : 
     218            1 :     asyncRsp = (struct RaResponseSocketListen *)calloc(1, sizeof(struct RaResponseSocketListen));
     219            1 :     CHK_PRT_RETURN(asyncRsp == NULL, hccp_err("[listen_start][ra_hdc_socket]calloc async_rsp failed, phyId(%u)",
     220              :         phyId), -ENOMEM);
     221            1 :     asyncRsp->conn = conn;
     222            1 :     asyncRsp->num = num;
     223            1 :     reqHandleTmp = (struct RaRequestHandle *)calloc(1, sizeof(struct RaRequestHandle));
     224            1 :     if (reqHandleTmp == NULL) {
     225            0 :         hccp_err("[listen_start][ra_hdc_socket]calloc RaRequestHandle failed, phyId[%u]", phyId);
     226            0 :         ret = -ENOMEM;
     227            0 :         goto out;
     228              :     }
     229            1 :     reqHandleTmp->privData = (void *)asyncRsp;
     230              : 
     231            1 :     ret = RaHdcSendMsgAsync(RA_RS_SOCKET_LISTEN_START, phyId, (char *)&asyncData,
     232              :         sizeof(union OpSocketListenData), reqHandleTmp);
     233            1 :     if (ret != 0) {
     234            0 :         hccp_err("[listen_start][ra_hdc_socket]hdc async send message process failed ret(%d) phyId(%u)", ret, phyId);
     235            0 :         free(reqHandleTmp);
     236            0 :         reqHandleTmp = NULL;
     237            0 :         goto out;
     238              :     }
     239            1 :     *reqHandle = (void *)reqHandleTmp;
     240            1 :     return 0;
     241              : 
     242            0 : out:
     243            0 :     free(asyncRsp);
     244            0 :     asyncRsp = NULL;
     245            0 :     return ret;
     246              : }
     247              : 
     248            1 : void RaHdcAsyncHandleSocketListenStart(struct RaRequestHandle *reqHandle)
     249              : {
     250            1 :     struct RaResponseSocketListen *asyncRsp = NULL;
     251            1 :     union OpSocketListenData *asyncData = NULL;
     252            1 :     unsigned int phyId = reqHandle->phyId;
     253            1 :     int ret = 0;
     254              : 
     255            1 :     asyncData = (union OpSocketListenData *)reqHandle->recvBuf;
     256            1 :     asyncRsp = (struct RaResponseSocketListen *)reqHandle->privData;
     257            1 :     ret = RaGetSocketListenResult(asyncData->rxData.conn, asyncRsp->num, asyncRsp->conn, MAX_SOCKET_NUM);
     258            1 :     if (ret != 0) {
     259            1 :         hccp_err("[listen_start][ra_hdc_socket]ra_get_socket_listen_result failed, ret(%d) phyId(%u)", ret, phyId);
     260            1 :         reqHandle->opRet = -EINVAL;
     261            1 :         goto out;
     262              :     }
     263            0 :     return;
     264              : 
     265            1 : out:
     266            1 :     free(reqHandle->privData);
     267            1 :     reqHandle->privData = NULL;
     268            1 :     return;
     269              : }
     270              : 
     271            1 : int RaHdcSocketListenStopAsync(unsigned int phyId, struct SocketListenInfoT conn[], unsigned int num,
     272              :     void **reqHandle)
     273              : {
     274            1 :     struct RaRequestHandle *reqHandleTmp = NULL;
     275            1 :     union OpSocketListenData asyncData = {0};
     276            1 :     int ret = 0;
     277              : 
     278            1 :     ret = RaGetSocketListenInfo(conn, num, asyncData.txData.conn, MAX_SOCKET_NUM);
     279            1 :     CHK_PRT_RETURN(ret != 0, hccp_err("[listen_stop][ra_hdc_socket]get_socket_listen_info failed, ret(%d) phyId(%u)",
     280              :         ret, phyId), -EINVAL);
     281            1 :     asyncData.txData.num = num | (1U << SOCKET_USE_PORT_BIT);
     282              : 
     283            1 :     reqHandleTmp = (struct RaRequestHandle *)calloc(1, sizeof(struct RaRequestHandle));
     284            1 :     CHK_PRT_RETURN(reqHandleTmp == NULL,
     285              :         hccp_err("[listen_stop][ra_hdc_socket]calloc RaRequestHandle failed, phyId[%u]", phyId), -ENOMEM);
     286              : 
     287            1 :     ret = RaHdcSendMsgAsync(RA_RS_SOCKET_LISTEN_STOP, phyId, (char *)&asyncData,
     288              :         sizeof(union OpSocketListenData), reqHandleTmp);
     289            1 :     if (ret != 0) {
     290            0 :         hccp_err("[listen_stop][ra_hdc_socket]hdc async send message process failed ret(%d) phyId(%u)", ret, phyId);
     291            0 :         free(reqHandleTmp);
     292            0 :         reqHandleTmp = NULL;
     293            0 :         return ret;
     294              :     }
     295              : 
     296            1 :     *reqHandle = (void *)reqHandleTmp;
     297            1 :     return 0;
     298              : }
     299              : 
     300            1 : int RaHdcSocketBatchConnectAsync(unsigned int phyId, struct SocketConnectInfoT conn[], unsigned int num,
     301              :     void **reqHandle)
     302              : {
     303            1 :     struct RaRequestHandle *reqHandleTmp = NULL;
     304            1 :     union OpSocketConnectData *asyncData = NULL;
     305            1 :     int ret = 0;
     306              : 
     307            1 :     asyncData = (union OpSocketConnectData *)calloc(sizeof(union OpSocketConnectData), sizeof(char));
     308            1 :     CHK_PRT_RETURN(asyncData == NULL, hccp_err("[batch_connect][ra_hdc_socket]calloc async_data failed, phyId(%u)",
     309              :         phyId), -ENOMEM);
     310              : 
     311            1 :     asyncData->txData.num = num | (1U << SOCKET_USE_PORT_BIT);
     312            1 :     ret = RaGetSocketConnectInfo(conn, num, asyncData->txData.conn, MAX_SOCKET_NUM);
     313            1 :     if (ret != 0) {
     314            0 :         hccp_err("[batch_connect][ra_hdc_socket]ra_get_socket_connect_info failed, ret(%d) phyId(%u)", ret, phyId);
     315            0 :         goto out;
     316              :     }
     317              : 
     318            1 :     reqHandleTmp = (struct RaRequestHandle *)calloc(1, sizeof(struct RaRequestHandle));
     319            1 :     if (reqHandleTmp == NULL) {
     320            0 :         hccp_err("[batch_connect][ra_hdc_socket]calloc RaRequestHandle failed, phyId[%u]", phyId);
     321            0 :         ret = -ENOMEM;
     322            0 :         goto out;
     323              :     }
     324              : 
     325            1 :     ret = RaHdcSendMsgAsync(RA_RS_SOCKET_CONN, phyId, (char *)asyncData, sizeof(union OpSocketConnectData),
     326              :         reqHandleTmp);
     327            1 :     if (ret != 0) {
     328            0 :         hccp_err("[batch_connect][ra_hdc_socket]hdc async send message process failed ret(%d) phyId(%u)", ret, phyId);
     329            0 :         free(reqHandleTmp);
     330            0 :         reqHandleTmp = NULL;
     331            0 :         goto out;
     332              :     }
     333              : 
     334            1 :     *reqHandle = (void *)reqHandleTmp;
     335              : 
     336            1 : out:
     337            1 :     free(asyncData);
     338            1 :     asyncData = NULL;
     339            1 :     return ret;
     340              : }
     341              : 
     342            1 : int RaHdcSocketBatchCloseAsync(unsigned int phyId, struct SocketCloseInfoT conn[], unsigned int num,
     343              :     void **reqHandle)
     344              : {
     345            1 :     struct RaResponseSocketBatchClose *asyncRsp = NULL;
     346            1 :     struct RaRequestHandle *reqHandleTmp = NULL;
     347            1 :     union OpSocketCloseData asyncData = {0};
     348              :     unsigned int i;
     349            1 :     int ret = 0;
     350              : 
     351            2 :     for (i = 0; i < num; i++) {
     352            1 :         if (conn[i].fdHandle == NULL) {
     353            0 :             hccp_err("[batch_close][ra_hdc_socket]i(%u), conn fdHandle is NULL", i);
     354            0 :             ret = -EINVAL;
     355            0 :             goto out;
     356              :         }
     357            1 :         asyncData.txData.conn[i].phyId = phyId;
     358            1 :         asyncData.txData.conn[i].closeFd = ((struct SocketHdcInfo *)conn[i].fdHandle)->fd;
     359              :     }
     360              :     // use attr disuse_linger of the fist conn as the common attr for all(0 by default)
     361            1 :     asyncData.txData.num = (conn[0].disuseLinger != 0) ? (num | (1U << SOCKET_DISUSE_LINGER_BIT)) : num;
     362              : 
     363            1 :     asyncRsp = (struct RaResponseSocketBatchClose *)calloc(1, sizeof(struct RaResponseSocketBatchClose));
     364            1 :     CHK_PRT_RETURN(asyncRsp == NULL, hccp_err("[batch_close][ra_hdc_socket]calloc async_rsp failed, phyId(%u)",
     365              :         phyId), -ENOMEM);
     366            1 :     asyncRsp->conn = conn;
     367            1 :     asyncRsp->num = num;
     368              : 
     369            1 :     reqHandleTmp = (struct RaRequestHandle *)calloc(1, sizeof(struct RaRequestHandle));
     370            1 :     if (reqHandleTmp == NULL) {
     371            0 :         hccp_err("[batch_close][ra_hdc_socket]calloc RaRequestHandle failed, phyId[%u]", phyId);
     372            0 :         ret = -ENOMEM;
     373            0 :         goto out;
     374              :     }
     375              : 
     376            1 :     reqHandleTmp->privData = (void *)asyncRsp;
     377              : 
     378            1 :     ret = RaHdcSendMsgAsync(RA_RS_SOCKET_CLOSE, phyId, (char *)&asyncData,
     379              :         sizeof(union OpSocketCloseData), reqHandleTmp);
     380            1 :     if (ret != 0) {
     381            0 :         hccp_err("[batch_close][ra_hdc_socket]hdc async send message process failed, ret(%d) phyId(%u)",
     382              :             ret, phyId);
     383            0 :         free(reqHandleTmp);
     384            0 :         reqHandleTmp = NULL;
     385            0 :         goto out;
     386              :     }
     387              : 
     388            1 :     *reqHandle = (void *)reqHandleTmp;
     389            1 :     return 0;
     390              : 
     391            0 : out:
     392            0 :     free(asyncRsp);
     393            0 :     asyncRsp = NULL;
     394            0 :     return ret;
     395              : }
     396              : 
     397            0 : void RaHdcAsyncHandleSocketBatchClose(struct RaRequestHandle *reqHandle)
     398              : {
     399            0 :     struct RaResponseSocketBatchClose *asyncRsp = NULL;
     400              :     unsigned int i;
     401              : 
     402              :     // should free fd_handle when op_ret is not EAGAIN, otherwise caller will retry
     403            0 :     if (reqHandle->opRet == -EAGAIN) {
     404            0 :         return;
     405              :     }
     406              : 
     407            0 :     asyncRsp = (struct RaResponseSocketBatchClose *)reqHandle->privData;
     408            0 :     for (i = 0; i < asyncRsp->num; i++) {
     409            0 :         if (asyncRsp->conn[i].fdHandle != NULL) {
     410            0 :             free(asyncRsp->conn[i].fdHandle);
     411            0 :             asyncRsp->conn[i].fdHandle = NULL;
     412              :         }
     413              :     }
     414            0 :     return;
     415              : }
        

Generated by: LCOV version 2.0-1