in modules/sara_r4/cellular_r4_api.c [652:755]
CellularError_t Cellular_SocketSend( CellularHandle_t cellularHandle,
CellularSocketHandle_t socketHandle,
const uint8_t * pData,
uint32_t dataLength,
/* coverity[misra_c_2012_rule_8_13_violation] */
uint32_t * pSentDataLength )
{
CellularContext_t * pContext = ( CellularContext_t * ) cellularHandle;
CellularError_t cellularStatus = CELLULAR_SUCCESS;
CellularPktStatus_t pktStatus = CELLULAR_PKT_STATUS_OK;
uint32_t sendTimeout = DATA_SEND_TIMEOUT_MS;
char cmdBuf[ CELLULAR_AT_CMD_TYPICAL_MAX_SIZE ] = { '\0' };
CellularAtReq_t atReqSocketSend = { 0 };
CellularAtDataReq_t atDataReqSocketSend = { 0 };
uint32_t sessionId = 0;
atReqSocketSend.atCmdType = CELLULAR_AT_NO_RESULT;
atReqSocketSend.pAtCmd = cmdBuf;
atDataReqSocketSend.pData = pData;
atDataReqSocketSend.dataLen = dataLength;
atDataReqSocketSend.pSentDataLength = pSentDataLength;
/* pContext is checked in _Cellular_CheckLibraryStatus function. */
cellularStatus = _Cellular_CheckLibraryStatus( pContext );
if( cellularStatus != CELLULAR_SUCCESS )
{
LogDebug( ( "Cellular_SocketSend: _Cellular_CheckLibraryStatus failed" ) );
}
else if( socketHandle == NULL )
{
cellularStatus = CELLULAR_INVALID_HANDLE;
}
else if( ( pData == NULL ) || ( pSentDataLength == NULL ) || ( dataLength == 0U ) )
{
LogDebug( ( "Cellular_SocketSend: Invalid parameter" ) );
cellularStatus = CELLULAR_BAD_PARAMETER;
}
else if( socketHandle->socketState != SOCKETSTATE_CONNECTED )
{
/* Check the socket connection state. */
if( ( socketHandle->socketState == SOCKETSTATE_ALLOCATED ) || ( socketHandle->socketState == SOCKETSTATE_CONNECTING ) )
{
cellularStatus = CELLULAR_SOCKET_NOT_CONNECTED;
}
else
{
cellularStatus = CELLULAR_SOCKET_CLOSED;
}
}
else
{
sessionId = _Cellular_GetSessionId( pContext, socketHandle->socketId );
if( sessionId == INVALID_SESSION_ID )
{
LogError( ( "Cellular_SocketSend : invalid session ID for socket index %u",
socketHandle->socketId ) );
cellularStatus = CELLULAR_INVALID_HANDLE;
}
}
if( cellularStatus == CELLULAR_SUCCESS )
{
/* Send data length check. */
if( dataLength > ( uint32_t ) CELLULAR_MAX_SEND_DATA_LEN )
{
atDataReqSocketSend.dataLen = ( uint32_t ) CELLULAR_MAX_SEND_DATA_LEN;
}
/* Check send timeout. If not set by setsockopt, use default value. */
if( socketHandle->sendTimeoutMs != 0U )
{
sendTimeout = socketHandle->sendTimeoutMs;
}
/* 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+USOWR=", sessionId, atDataReqSocketSend.dataLen );
pktStatus = _Cellular_AtcmdDataSend( pContext, atReqSocketSend, atDataReqSocketSend,
socketSendDataPrefix, NULL,
PACKET_REQ_TIMEOUT_MS, sendTimeout, 200U );
if( pktStatus != CELLULAR_PKT_STATUS_OK )
{
if( socketHandle->socketState == SOCKETSTATE_DISCONNECTED )
{
LogInfo( ( "Cellular_SocketSend: Data send fail, socket already closed" ) );
cellularStatus = CELLULAR_SOCKET_CLOSED;
}
else
{
LogError( ( "Cellular_SocketSend: Data send fail, PktRet: %d", pktStatus ) );
cellularStatus = _Cellular_TranslatePktStatus( pktStatus );
}
}
}
return cellularStatus;
}