CellularError_t Cellular_SetPdnConfig()

in sim70x0/cellular_sim70x0_api.c [2191:2280]


CellularError_t Cellular_SetPdnConfig( CellularHandle_t cellularHandle,
                                       uint8_t contextId,
                                       const CellularPdnConfig_t * pPdnConfig )
{
    CellularContext_t * pContext = ( CellularContext_t * ) cellularHandle;
    CellularError_t cellularStatus = CELLULAR_SUCCESS;
    CellularPktStatus_t pktStatus = CELLULAR_PKT_STATUS_OK;

    char cmdBuf[ CELLULAR_AT_CMD_MAX_SIZE * 2 ] = { '\0' }; /* APN and auth info is too long */

    CellularAtReq_t atReqSetPdn =
    {
        cmdBuf,
        CELLULAR_AT_NO_RESULT,
        NULL,
        NULL,
        NULL,
        0,
    };

    if( pPdnConfig == NULL )
    {
        LogError( ( "Cellular_ATCommandRaw: Input parameter is NULL" ) );
        cellularStatus = CELLULAR_BAD_PARAMETER;
    }

    if( cellularStatus == CELLULAR_SUCCESS )
    {
        cellularStatus = IsValidPDP( contextId ) ? CELLULAR_SUCCESS : CELLULAR_BAD_PARAMETER; /* 0-3 */
    }

    if( cellularStatus == CELLULAR_SUCCESS )
    {
        /* Make sure the library is open. */
        cellularStatus = _Cellular_CheckLibraryStatus( pContext );
    }

    if( cellularStatus == CELLULAR_SUCCESS )
    {
        const char * pPdnType = "IP"; /*default: CELLULAR_PDN_CONTEXT_IPV4  */

        if( pPdnConfig->pdnContextType == CELLULAR_PDN_CONTEXT_IPV6 )
        {
            pPdnType = "IPV6";
        }
        else if( pPdnConfig->pdnContextType == CELLULAR_PDN_CONTEXT_IPV4V6 )
        {
            pPdnType = "IPV4V6";
        }

        ( void ) snprintf( cmdBuf, sizeof( cmdBuf ), "AT+CGDCONT=%d,\"%s\",\"%s\"",
                           CELLULAR_PDN_CONTEXT_ID,
                           pPdnType,
                           pPdnConfig->apnName );

        pktStatus = _Cellular_AtcmdRequestWithCallback( pContext, atReqSetPdn );

        if( pktStatus != CELLULAR_PKT_STATUS_OK )
        {
            LogError( ( "Cellular_SetPdnConfig: can't set PDN, cmdBuf:%s, PktRet: %d", cmdBuf, pktStatus ) );
            cellularStatus = _Cellular_TranslatePktStatus( pktStatus );
        }

        if( pPdnConfig->pdnAuthType == 0 )
        {
            ( void ) snprintf( cmdBuf, sizeof( cmdBuf ), "AT+CGAUTH=%d,0", CELLULAR_PDN_CONTEXT_ID );
        }
        else
        {
            ( void ) snprintf( cmdBuf, sizeof( cmdBuf ), "AT+CGAUTH=%d,%d,\"%s\",\"%s\"",
                               CELLULAR_PDN_CONTEXT_ID,
                               pPdnConfig->pdnAuthType,
                               pPdnConfig->password,
                               pPdnConfig->username );
        }

        cellularModuleContext_t * pSimContex = ( cellularModuleContext_t * ) pContext->pModueContext;
        memcpy( &pSimContex->pdnCfg, pPdnConfig, sizeof( CellularPdnConfig_t ) );

        pktStatus = _Cellular_AtcmdRequestWithCallback( pContext, atReqSetPdn );

        if( pktStatus != CELLULAR_PKT_STATUS_OK )
        {
            LogError( ( "Cellular_SetPdnConfig: can't set PDN, cmdBuf:%s, PktRet: %d", cmdBuf, pktStatus ) );
            cellularStatus = _Cellular_TranslatePktStatus( pktStatus );
        }
    }

    return cellularStatus;
}