CellularError_t Cellular_SocketRecv()

in modules/sara_r4/cellular_r4_api.c [512:609]


CellularError_t Cellular_SocketRecv( CellularHandle_t cellularHandle,
                                     CellularSocketHandle_t socketHandle,
                                     /* coverity[misra_c_2012_rule_8_13_violation] */
                                     uint8_t * pBuffer,
                                     uint32_t bufferLength,
                                     /* coverity[misra_c_2012_rule_8_13_violation] */
                                     uint32_t * pReceivedDataLength )
{
    CellularContext_t * pContext = ( CellularContext_t * ) cellularHandle;
    CellularError_t cellularStatus = CELLULAR_SUCCESS;
    CellularPktStatus_t pktStatus = CELLULAR_PKT_STATUS_OK;
    char cmdBuf[ CELLULAR_AT_CMD_TYPICAL_MAX_SIZE ] = { '\0' };
    uint32_t recvTimeout = DATA_READ_TIMEOUT_MS;
    uint32_t recvLen = bufferLength;
    _socketDataRecv_t dataRecv = { 0 };
    CellularAtReq_t atReqSocketRecv =
    {
        NULL,
        CELLULAR_AT_MULTI_DATA_WO_PREFIX,
        "+USORD",
        _Cellular_RecvFuncData,
        NULL,
        0,
    };
    uint32_t sessionId = 0;

    dataRecv.pDataLen = pReceivedDataLength;
    dataRecv.pData = pBuffer;

    atReqSocketRecv.pAtCmd = cmdBuf;
    atReqSocketRecv.pData = ( void * ) &dataRecv;
    atReqSocketRecv.dataLen = bufferLength;

    cellularStatus = _Cellular_CheckLibraryStatus( pContext );

    if( cellularStatus != CELLULAR_SUCCESS )
    {
        LogDebug( ( "Cellular_SocketRecv: _Cellular_CheckLibraryStatus failed" ) );
    }
    else if( socketHandle == NULL )
    {
        cellularStatus = CELLULAR_INVALID_HANDLE;
    }
    else if( ( pBuffer == NULL ) || ( pReceivedDataLength == NULL ) || ( bufferLength == 0U ) )
    {
        LogDebug( ( "Cellular_SocketRecv: Bad input Param" ) );
        cellularStatus = CELLULAR_BAD_PARAMETER;
    }
    else
    {
        sessionId = _Cellular_GetSessionId( pContext, socketHandle->socketId );

        if( sessionId == INVALID_SESSION_ID )
        {
            LogError( ( "Cellular_SocketRecv : invalid session ID for socket index %u",
                        socketHandle->socketId ) );
            cellularStatus = CELLULAR_INVALID_HANDLE;
        }
    }

    if( cellularStatus == CELLULAR_SUCCESS )
    {
        /* Update recvLen to maximum module length. */
        if( CELLULAR_MAX_RECV_DATA_LEN <= bufferLength )
        {
            recvLen = ( uint32_t ) CELLULAR_MAX_RECV_DATA_LEN;
        }

        /* Update receive timeout to default timeout if not set with setsocketopt. */
        if( recvLen > 0 )
        {
            if( socketHandle->recvTimeoutMs != 0U )
            {
                recvTimeout = socketHandle->recvTimeoutMs;
            }

            /* The return value of snprintf is not used.
             * The max length of the string is fixed and checked offline. */
            /* coverity[misra_c_2012_rule_21_6_violation]. */
            ( void ) snprintf( cmdBuf, CELLULAR_AT_CMD_TYPICAL_MAX_SIZE,
                               "%s%u,%u", "AT+USORD=", sessionId, recvLen );
            pktStatus = _Cellular_TimeoutAtcmdDataRecvRequestWithCallback( pContext,
                                                                           atReqSocketRecv,
                                                                           recvTimeout,
                                                                           socketRecvDataPrefix,
                                                                           NULL );

            if( pktStatus != CELLULAR_PKT_STATUS_OK )
            {
                /* Reset data handling parameters. */
                LogError( ( "Cellular_SocketRecv: Data Receive fail, pktStatus: %d", pktStatus ) );
                cellularStatus = _Cellular_TranslatePktStatus( pktStatus );
            }
        }
    }

    return cellularStatus;
}