in modules/hl7802/cellular_hl7802_api.c [1356:1469]
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 = CELLULAR_HL7802_AT_TIMEOUT_60_SECONDS_MS;
char cmdBuf[ CELLULAR_AT_CMD_TYPICAL_MAX_SIZE ] = { '\0' };
CellularAtReq_t atReqSocketSend =
{
cmdBuf,
CELLULAR_AT_NO_RESULT,
NULL,
NULL,
NULL,
0,
};
CellularAtDataReq_t atDataReqSocketSend =
{
pData,
dataLength,
pSentDataLength,
( const uint8_t * ) SOCKET_END_PATTERN,
SOCKET_END_PATTERN_LEN
};
uint32_t sessionId = 0;
/* pContext is checked in _Cellular_CheckLibraryStatus function. */
cellularStatus = _Cellular_CheckLibraryStatus( pContext );
if( cellularStatus != CELLULAR_SUCCESS )
{
LogDebug( ( "_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;
}
/* Form the AT command. */
/* 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+KTCPSND=", sessionId, atDataReqSocketSend.dataLen );
pktStatus = _Cellular_TimeoutAtcmdDataSendSuccessToken( pContext, atReqSocketSend, atDataReqSocketSend,
CELLULAR_HL7802_AT_TIMEOUT_60_SECONDS_MS, sendTimeout,
_socketSendSuccesTokenTable, _socketSendSuccesTokenTableLength );
if( pktStatus != CELLULAR_PKT_STATUS_OK )
{
if( socketHandle->socketState == SOCKETSTATE_DISCONNECTED )
{
LogWarn( ( "Cellular_SocketSend: Data send fail. Socket is closed during the send operation." ) );
cellularStatus = CELLULAR_SOCKET_CLOSED;
}
else
{
LogError( ( "Cellular_SocketSend: Data send fail, PktRet: %d", pktStatus ) );
cellularStatus = _Cellular_TranslatePktStatus( pktStatus );
}
}
}
return cellularStatus;
}