コード例 #1
0
BST_ERR_ENUM_UINT8 BST_OS_DeleteMbx( BST_OS_MBX_T *pstMbx )
{
    BST_OS_MAIL_T                     *pstContent;
    BST_OS_LOCKCNT_T                    tThreadLockCnt;

    BST_ASSERT_NULL_RTN( pstMbx,        BST_ERR_INVALID_PTR );
    BST_ASSERT_NULL_RTN( pstMbx->hSem,  BST_ERR_INVALID_PTR );

    BST_OS_DeleteSem( pstMbx->hSem );

    tThreadLockCnt                      = BST_OS_ThreadLock();    
    for (;;)
    {
        if( 0 == lstCount( &pstMbx->hList ) )
        {
            break;
        }
        pstContent                      = (BST_OS_MAIL_T *)lstGet( &pstMbx->hList );
        BST_OS_FREE( pstContent );
    }

    lstFree( &pstMbx->hList);
    
    BST_OS_FREE( pstMbx );

    BST_OS_ThreadUnLock( tThreadLockCnt );
/*lint -e438*/
    return( BST_NO_ERROR_MSG );
/*lint +e438*/
}
コード例 #2
0
BST_UINT32 BST_OS_RecvMail(
    BST_OS_MBX_T   *pstMbx,
    BST_VOID      **pMsg,
    BST_UINT32      ulExTime )
{
    BST_OS_MAIL_T                      *pstContent;
    BST_UINT32                          ulPendTime;
    BST_UINT32                          ulPastTime;
    BST_OS_LOCKCNT_T                    tThreadLockCnt;

    BST_ASSERT_NULL_RTN( pstMbx,        BST_ERR_INVALID_PTR );
    BST_ASSERT_NULL_RTN( pstMbx->hSem,  BST_ERR_INVALID_PTR );
    BST_ASSERT_NULL_RTN( pMsg,          BST_ERR_INVALID_PTR );

    *pMsg                               = BST_NULL_PTR;

    if( (BST_UINT32)BST_OS_SYS_FOREVER == ulExTime )
    {
        ulPendTime                      = (BST_UINT32)BST_OS_SYS_FOREVER;
    }
    else if( ulExTime < BST_OS_TICKS_MS )
    {
        ulPendTime                      = BST_OS_TICKS_MS;
    }
    else
    {
        ulPendTime                      = ulExTime;
    }

    ulPastTime = BST_OS_RecvSem( pstMbx->hSem, ulPendTime );

    if( BST_OS_SYS_TIMEOUT == ulPastTime )
    {
        return BST_OS_SYS_TIMEOUT;
    }

    tThreadLockCnt                      = (BST_OS_LOCKCNT_T)BST_OS_SpinLock( &g_MboxLock );

    pstContent                          = (BST_OS_MAIL_T *)lstGet( &pstMbx->hList );


    if ( BST_NULL_PTR == pstContent )
    {
       *pMsg                           = BST_NULL_PTR;
        BST_OS_SpinUnLock( &g_MboxLock, (BST_UINT32)tThreadLockCnt );
        return BST_OS_SYS_TIMEOUT;
    }
    *pMsg                               = pstContent->ulContent;

    BST_OS_FREE( pstContent );
    BST_OS_SpinUnLock( &g_MboxLock, (BST_UINT32)tThreadLockCnt );
    /*lint -e438*/
    return( ulPastTime );
    /*lint +e438*/
}
コード例 #3
0
/*lint -e438 -e429*/
BST_ERR_ENUM_UINT8 BST_SRV_CEvent::RcvAcomData( BST_UINT32 ulLength, BST_UINT8 *pucData )
{
    BST_ACOM_EVT_STRU                  *pstAcpuEvent;

    if( BST_NULL_PTR == m_pstEventMbx )
    {
        return BST_ERR_INVALID_PTR;
    }
    if( BST_NULL_PTR == pucData )
    {
        return BST_ERR_INVALID_PTR;
    }
    if( 0 == ulLength )
    {
        return BST_ERR_PAR_LEN;
    }
    pstAcpuEvent                        = (BST_ACOM_EVT_STRU *)BST_OS_MALLOC( BST_OS_SIZEOF(BST_ACOM_EVT_STRU) );
    BST_ASSERT_NULL_RTN( pstAcpuEvent, BST_ERR_NO_MEMORY );

    pstAcpuEvent->pucData               = (BST_UINT8 *)BST_OS_MALLOC( ulLength );
    if ( BST_NULL_PTR == pstAcpuEvent->pucData )
    {
        BST_OS_FREE( pstAcpuEvent );
        return BST_ERR_NO_MEMORY;
    }

    pstAcpuEvent->enId                  = BST_SRV_ACOM_EVENT;
    pstAcpuEvent->ulLength              = ulLength;
    BST_OS_MEMCPY( pstAcpuEvent->pucData, pucData, ulLength );

    return BST_OS_SendMail( m_pstEventMbx, pstAcpuEvent );
}
コード例 #4
0
/*lint -e438 -e429*/
BST_UINT32  BST_SRV_CEvent::RcvTimerExpired ( BST_OS_TIMERID_T ulTimerId )
{
    BST_TIMER_EVT_STRU                 *pstSendTimerEvent;

    if( BST_NULL_PTR == m_pstEventMbx )
    {
        return BST_ERR_INVALID_PTR;
    }

    pstSendTimerEvent                   = ( BST_TIMER_EVT_STRU *)BST_OS_MALLOC
                                          ( BST_OS_SIZEOF(BST_TIMER_EVT_STRU) );
    BST_ASSERT_NULL_RTN( pstSendTimerEvent, BST_ERR_NO_MEMORY );

    pstSendTimerEvent->pucData          = ( BST_UINT8 *)BST_OS_MALLOC
                                          ( BST_OS_SIZEOF(ulTimerId) );
    if ( BST_NULL_PTR == pstSendTimerEvent->pucData )
    {
        BST_OS_FREE( pstSendTimerEvent );
        return BST_ERR_NO_MEMORY;
    }

    pstSendTimerEvent->ulLength         = BST_OS_SIZEOF( ulTimerId );
    BST_OS_MEMCPY( pstSendTimerEvent->pucData, &ulTimerId, pstSendTimerEvent->ulLength );

    pstSendTimerEvent->enId             = BST_SRV_TIMER_EVENT;

    return BST_OS_SendMail( m_pstEventMbx, pstSendTimerEvent );
}
コード例 #5
0
/*lint -e438 -e429*/
BST_ERR_ENUM_UINT8 BST_SRV_CEvent::RcvTcpIpEvent ( BST_IP_EVENT_STRU *pstEvent )
{
    BST_NET_EVENT_STRU                 *pstNetEvent;
    BST_IP_EVENT_STRU                  *pstLwipEvent;

    if ( BST_NULL_PTR == m_pstEventMbx )
    {
        return BST_ERR_INVALID_PTR;
    }

    if ( BST_NULL_PTR == pstEvent )
    {
        return BST_ERR_INVALID_PTR;
    }

    pstLwipEvent                        = ( BST_IP_EVENT_STRU *)BST_OS_MALLOC
                                          ( BST_OS_SIZEOF ( BST_IP_EVENT_STRU ) );
    BST_ASSERT_NULL_RTN( pstLwipEvent, BST_ERR_NO_MEMORY );

    pstNetEvent                         = ( BST_NET_EVENT_STRU *)BST_OS_MALLOC
                                          ( BST_OS_SIZEOF ( BST_NET_EVENT_STRU ) );
    if ( BST_NULL_PTR == pstNetEvent )
    {
        BST_OS_FREE( pstLwipEvent );
        return BST_ERR_INVALID_PTR;
    }

    BST_OS_MEMCPY ( pstLwipEvent, pstEvent, BST_OS_SIZEOF ( BST_IP_EVENT_STRU ) );

    pstNetEvent->enId                  = BST_SRV_TCPIP_EVENT;
    pstNetEvent->pucData               = ( BST_UINT8 * )pstLwipEvent;
    pstNetEvent->ulLength              = BST_OS_SIZEOF ( BST_IP_EVENT_STRU );

    return BST_OS_SendMail( m_pstEventMbx, pstNetEvent );
}
コード例 #6
0
BST_ERR_ENUM_UINT8  BST_APP_CEmailIMAP::RunStateMachine( BST_VOID )
{
    BST_ERR_ENUM_UINT8          enErrMsg;

    BST_DBG_LOG1( "CEmailIMAP::RunStateMachine m_lServerState =%d",
                  m_lServerState );

    BST_ASSERT_NULL_RTN( m_pcServerResponse0, BST_ERR_INVALID_PTR );
    BST_ASSERT_NULL_RTN( m_pcServerResponse1, BST_ERR_INVALID_PTR );
    BST_ASSERT_NULL_RTN( m_pcServerResponse2, BST_ERR_INVALID_PTR );

    enErrMsg                    = BST_NO_ERROR_MSG;
    switch ( m_lServerState )
    {
        case BST_EMAIL_UNCONNECT:
            enErrMsg            = HandleWelcomResp();
            break;
        case BST_EMAIL_CONNECTED:
            enErrMsg            = HandleImapIDResp();
            break;

        case BST_EMAIL_IMAP_ID:
            enErrMsg            = HandleAuthResp();
            break;

        case BST_EMAIL_IMAP_LOGINED:
            enErrMsg            = HandleSelectResp();
            break;

        case BST_EMAIL_IMAP_SELECTED:
            enErrMsg            = HandleQueryResp();
            break;

        case BST_EMAIL_IMAP_QUERYED:
            enErrMsg            = HandleQuitResp();
            break;
        default:
            break;
    }
    BST_OS_MEMSET( m_pcServerResponse0, 0, BST_IMAP_COLUMN_MAX );
    BST_OS_MEMSET( m_pcServerResponse1, 0, BST_IMAP_COLUMN_MAX );
    BST_OS_MEMSET( m_pcServerResponse2, 0, BST_IMAP_COLUMN_MAX );
    return enErrMsg;
}
コード例 #7
0
BST_ERR_ENUM_UINT8 BST_SRV_CHNL_Send( 
    BST_SRV_CHNL_LINK_STRU     *pstChnlLink,
    BST_SRV_CHNL_HEAD_STRU     *pstPktItem )
{
    BST_ERR_ENUM_UINT8              enRtnVal;

    BST_ASSERT_NULL_RTN( pstChnlLink, BST_ERR_INVALID_PTR );
    BST_ASSERT_NULL_RTN( pstPktItem, BST_ERR_INVALID_PTR );

    enRtnVal                        = BST_ERR_UNREACHABLE;

    switch( pstChnlLink->enState )
    {
        case BST_SRV_CHNL_STATE_UN_INITED:
            if( (BST_DSPP_FLG_ADDTYPE_INET != pstPktItem->ucAddrType)
             && (BST_DSPP_FLG_ADDTYPE_TASK != pstPktItem->ucAddrType))
            {
                enRtnVal            = BST_ERR_ILLEGAL_PARAM;
                goto err_drop;
            }
            pstChnlLink->enState    = BST_SRV_CHNL_STATE_RUN;

        case BST_SRV_CHNL_STATE_RUN:
            enRtnVal                = BST_SRV_CHNL_Send_Runing( pstChnlLink, pstPktItem );
            if( BST_NO_ERROR_MSG != enRtnVal )
            {
                goto err_drop;
            }
        break;

        case BST_SRV_CHNL_STATE_SUSPEND:
            BST_SRV_CHNL_Send_Suspend( pstChnlLink, pstPktItem );
        break;

        default:
            enRtnVal                = BST_ERR_UNREACHABLE;
            goto err_drop;
    }
    return BST_NO_ERROR_MSG;
err_drop:
    BST_SRV_FreeIpBlock( pstPktItem );

    return enRtnVal;
}
コード例 #8
0
BST_UINT32 BST_SRV_RcvAcomData( BST_UINT32 ulLength, BST_UINT8 *pucData )
{
    BST_SRV_CEvent                       *pEvtProc;

    pEvtProc                            = BST_SRV_CEvent::GetInstance();
    BST_ASSERT_NULL_RTN( pEvtProc, 0 );

    pEvtProc->RcvAcomData( ulLength, pucData );
    return ulLength;
}
コード例 #9
0
BST_ERR_ENUM_UINT8  BST_APP_CEmailIMAP::ParseResponse(
    BST_UINT8          *pucData,
    const BST_UINT16    usLength )
{
    BST_UINT16                      i;
    BST_UINT16                      k;
    BST_UINT8                      *p;
    i                               = 0;
    k                               = 0;
    p                               = pucData;

    BST_ASSERT_0_RTN( usLength, BST_ERR_PAR_UNKNOW );
    BST_ASSERT_NULL_RTN( pucData, BST_ERR_PAR_UNKNOW );
    BST_ASSERT_NULL_RTN( m_pcServerResponse0, BST_ERR_PAR_UNKNOW );
    BST_ASSERT_NULL_RTN( m_pcServerResponse1, BST_ERR_PAR_UNKNOW );
    BST_ASSERT_NULL_RTN( m_pcServerResponse2, BST_ERR_PAR_UNKNOW );

    while ( ( ' ' != p[i] ) && ( i < usLength ) )
    {
        BST_APP_IMAP_CHECK(k);
        m_pcServerResponse0[k++]    = p[i];
        i++;
    }
    i++;
    k                               = 0;
    while ( ( ' ' != p[i] ) && ( i < usLength ) )
    {
        BST_APP_IMAP_CHECK(k);
        m_pcServerResponse1[k++]    = p[i];
        i++;
    }
    i++;
    k                               = 0;
    while ( (' ' != p[i]) && ( BST_APP_CR != p[i] ) && ( i < usLength ) )/*如果是回车符,也要退出循环*/
    {
        BST_APP_IMAP_CHECK(k);
        m_pcServerResponse2[k++]    = p[i];
        i++;
    }

    return BST_NO_ERROR_MSG;
}
コード例 #10
0
//lint -sem(lstAdd,custodial(2))
BST_ERR_ENUM_UINT8 BST_OS_SendMail( BST_OS_MBX_T *pstMbx, BST_VOID *pMsg )
{
    BST_OS_MAIL_T                      *pstContent;
    BST_OS_LOCKCNT_T                    tThreadLockCnt;

    BST_ASSERT_NULL_RTN( pstMbx, BST_ERR_INVALID_PTR );
    BST_ASSERT_NULL_RTN( pstMbx->hSem, BST_ERR_INVALID_PTR );

    pstContent                          = BST_OS_MALLOC( BST_OS_SIZEOF(BST_OS_MAIL_T) );
    BST_ASSERT_NULL_RTN( pstContent, BST_ERR_NO_MEMORY );

    tThreadLockCnt                      = (BST_OS_LOCKCNT_T)BST_OS_SpinLock( &g_MboxLock );
    pstContent->ulContent               = pMsg;

    lstAdd( &pstMbx->hList, ( NODE * )pstContent );
    BST_OS_SpinUnLock( &g_MboxLock,(BST_UINT32)tThreadLockCnt );
    BST_OS_SendSem( pstMbx->hSem );

    return( BST_NO_ERROR_MSG );
}
コード例 #11
0
BST_ERR_ENUM_UINT8 BST_Pal_DrvAcomSend( BST_UINT32 ulLength, BST_UINT8 *pucData )
{
#ifndef BST_MODEM_SELF
#ifndef BST_PEAK_SPEED_TEST

    BST_ACOM_MSG_STRU          *pstAcorMsg;
    BST_UINT8                  *ulTmpAddr;
    BST_ASSERT_NULL_RTN( pucData, BST_ERR_INVALID_PTR );
    pstAcorMsg                  = BST_ACOMM_ALLOC_MSG_WITH_HDR( ulLength );
    BST_ASSERT_NULL_RTN( pstAcorMsg, BST_ERR_NO_MEMORY );
    ulTmpAddr                   = (pstAcorMsg->aucValue);
    BST_OS_MEMCPY((BST_VOID*)ulTmpAddr, pucData, ulLength);

    pstAcorMsg->ulLen           = ulLength;
    BST_ACOMM_CFG_MSG_HDR( pstAcorMsg, ACPU_PID_BASTET_COMM );
    BST_ACOMM_SEND_MSG( pstAcorMsg );

#endif
#endif
    return BST_NO_ERROR_MSG;
}
コード例 #12
0
BST_BOOL BST_CTaskSchdler::TryTaskExist ( BST_VOID )
{
    BST_UINT32                  ulNextTick;
    BST_TASK_STATE_ENUM_UINT8   enTaskState;
    BST_SRV_CTaskMng           *pcTaskManager;
    BST_CORE_PTASK_NODE_STRU   *pstPtaskNode;

    ulNextTick                  = 0;
    pcTaskManager               = BST_SRV_CTaskMng::GetInstance ();
    BST_ASSERT_NULL_RTN( pcTaskManager, BST_FALSE );
    /*
     * 在当前系统值加一个TICK单位,获得下一时刻TICK值
     */
    ulNextTick                  = m_ulSystemTick + BST_TASK_SYS_TICKS;

    for ( pstPtaskNode = (BST_CORE_PTASK_NODE_STRU *)lstFirst( &g_stPTaskList );
          pstPtaskNode!= BST_NULL_PTR;
          pstPtaskNode = (BST_CORE_PTASK_NODE_STRU *)lstNext((NODE *)pstPtaskNode ) )
    {
        if ( BST_NULL_PTR == pstPtaskNode->pcTask )
        {
            continue;
        }
        /*
         * 如果任务没有执行完成,处于繁忙状态,则立即返回
         */
        if ( BST_TRUE == pstPtaskNode->pcTask->IsBusy () )
        {
            continue;
        }
       /*
        * 如果TICK值能够被任务周期整除,说明到了该任务周期
        */
        if ( 0 == ( ulNextTick % pstPtaskNode->pcTask->m_ulCycle ) )
        {
            enTaskState         = pstPtaskNode->pcTask->GetState ();
            if ( BST_TASK_STATE_START == enTaskState )
            {
                return BST_TRUE;
            }
            else
            {
                continue;
            }
        }
        else
        {
            continue;
        }
    }
    return BST_FALSE;
}
コード例 #13
0
BST_UINT32 BST_OS_PeekMail( BST_OS_MBX_T *pstMbx, BST_VOID **pMsg )
{
    BST_OS_MAIL_T                      *pstContent;
    BST_OS_LOCKCNT_T                    tThreadLockCnt;

    BST_ASSERT_NULL_RTN( pstMbx,        BST_ERR_INVALID_PTR );
    BST_ASSERT_NULL_RTN( pstMbx->hSem,  BST_ERR_INVALID_PTR );
    BST_ASSERT_NULL_RTN( pMsg,          BST_ERR_INVALID_PTR );

    *pMsg                               = BST_NULL_PTR;

    if( BST_OS_SYS_TIMEOUT == BST_OS_RecvSem( pstMbx->hSem, BST_OS_SYS_NOWAIT ) )
    {
        return BST_OS_SYS_TIMEOUT;
    }

    tThreadLockCnt                      = BST_OS_ThreadLock();

    pstContent                          = (BST_OS_MAIL_T *)lstGet( &pstMbx->hList );

    if ( BST_NULL_PTR == pstContent )        
    {
        BST_OS_ThreadUnLock( tThreadLockCnt );
        return BST_OS_SYS_TIMEOUT;
    }
    *pMsg                               = pstContent->ulContent;
#ifdef BST_OS_SIGNAL_COUNTER
    if ( pstMbx->hSem->ulCounter > 0U )
    {
        pstMbx->hSem->ulCounter--;
    }
#endif
    BST_OS_FREE( pstContent );
    BST_OS_ThreadUnLock( tThreadLockCnt );
    /*lint -e438*/
    return( BST_NO_ERROR_MSG );
    /*lint +e438*/
}
コード例 #14
0
BST_UINT32 BST_SRV_RcvTimerEvent( BST_OS_TIMERID_T ulTimerId )
{
    BST_SRV_CEvent                     *pEvtProc;
    BST_UINT32                          ulRtnVal;

    pEvtProc                            = BST_SRV_CEvent::GetInstance();
    BST_ASSERT_NULL_RTN( pEvtProc, 0 );

    ulRtnVal                            = pEvtProc->RcvTimerExpired( ulTimerId );
    if( BST_NO_ERROR_MSG == ulRtnVal )
    {
        return BST_OS_SIZEOF(BST_OS_TIMER_STRU);
    }
    BST_RLS_LOG1( "BST_SRV_RcvTimerEvent pEvtProc->RcvTimerExpired Err=%u",
                  ulRtnVal );
    return 0;
}
コード例 #15
0
BST_IP_ERR_T BST_IP_RawUdpSocket( BST_FD_T *pfd )
{
    struct udp_pcb                     *pstNewUdpPcb;

    BST_ASSERT_NULL_RTN( pfd, ERR_ARG );
    pstNewUdpPcb                        = udp_new();
    if( !BST_IP_IsLwipNull( pstNewUdpPcb ) )
    {
        udp_recv( pstNewUdpPcb,(udp_recv_fn)BST_IP_UdpRecvCB, LWIP_NULL_PTR );
        pfd->pFd                        = pstNewUdpPcb;
        return BST_IP_ERR_OK;
    }
    else
    {
        return BST_IP_ERR_MEM;
    }
}
BST_UINT32 BST_PAL_NetIpStackInput(
    const BST_UINT32   const ulLength,
    const BST_UINT8  * const pucData,
    const TTF_MEM_ST * const pstPktItem )
{
    BST_NET_PBUF_T                 *pbuf;
    BST_NETIF_T                    *pstNetif;
    BST_INT32                       lRtnVal;
    BST_UINT16                      usPortNum;

    if( 0 == ulLength )
    {
        return 0x00U;
    }
    if( BST_NULL_PTR == pucData )
    {
        return 0x00U;
    }
    if( BST_NULL_PTR == pstPktItem )
    {
        return 0x00U;
    }

    pbuf                            = pbuf_alloc( PBUF_LINK, (BST_UINT16)ulLength, PBUF_RAM );
    BST_ASSERT_NULL_RTN( pbuf, 0x00U );
    usPortNum                       = BST_IP_ApiRegistPacket(
                                    ( BST_IP_PKT_ID_T )pbuf, (BST_VOID*)pstPktItem );
    BST_DBG_UPDATE_RX_FLOW( usPortNum, ulLength );
    ( BST_VOID )pbuf_take( pbuf, pucData, (BST_UINT16)ulLength );
    pstNetif                        = BST_DRV_NetGetMainIfHandle();
    lRtnVal                         = pstNetif->input( pbuf, pstNetif );
    if ( lRtnVal < 0 )
    {
        BST_RLS_LOG1( "BST_PAL_NetIpStackInput, Write to Lwip Error=%s", lRtnVal );
        BST_IP_ApiUnRegistPacket( ( BST_IP_PKT_ID_T )pbuf );
        BST_PAL_NetApiPacketResume( (BST_VOID*)pstPktItem );
        pbuf_free( pbuf );
        return 0x00U;
    }
    else
    {
        return ulLength;
    }
}
コード例 #17
0
BST_UINT32 BST_SRV_RcvAsEvent(
    BST_AS_EVT_ENUM_UINT32  enAsEvent,
    BST_UINT32              ulLength,
    BST_VOID               *pvData )
{
    BST_SRV_CEvent                     *pEvtProc;
    BST_ERR_ENUM_UINT8                  ucRtnVal;

    pEvtProc                            = BST_SRV_CEvent::GetInstance();
    BST_ASSERT_NULL_RTN( pEvtProc, 0 );

    ucRtnVal                            = pEvtProc->RcvAsEvent( enAsEvent, ulLength, pvData );
    if( BST_NO_ERROR_MSG == ucRtnVal )
    {
        return ulLength;
    }
    BST_RLS_LOG1( "BST_SRV_RcvAsEvent pEvtProc->RcvAsEvent Err=%u",
                  ucRtnVal );
    return 0;
}
コード例 #18
0
BST_ERR_ENUM_UINT8 BST_APP_CEmailIMAP::QuitServer( BST_VOID )
{
    BST_CHAR           *pucLogoutCmd;
    BST_UINT16          usLogoutCmdLen;
    BST_ERR_ENUM_UINT8  enErrMsg;

    pucLogoutCmd        = (BST_CHAR *)BST_OS_MALLOC(BST_OTHER_CMD_MAX_LEN);
    BST_ASSERT_NULL_RTN( pucLogoutCmd, BST_ERR_NO_MEMORY );

    usLogoutCmdLen      = ( BST_UINT16 )snprintf(
                              pucLogoutCmd,
                              BST_OTHER_CMD_MAX_LEN,
                              "%d LOGOUT\r\n",
                              m_usTag );
    enErrMsg            = SendCommand( (BST_UINT8 *)pucLogoutCmd, usLogoutCmdLen );
    BST_APP_UPDATE_IMAP_TAG( m_usTag );

    BST_OS_FREE( pucLogoutCmd );
    return enErrMsg;
}
コード例 #19
0
/*lint -e438 -e429*/
BST_ERR_ENUM_UINT8 BST_SRV_CEvent::RcvAsEvent(
    BST_AS_EVT_ENUM_UINT32  enAsEvent,
    BST_UINT32              ulLength,
    BST_VOID               *pvData )
{
    BST_AS_EVT_STRU                    *pstSendAsEvent;

    if( BST_NULL_PTR == m_pstEventMbx )
    {
        return BST_ERR_INVALID_PTR;
    }
    if( !BST_SRV_IsValidAsEvent( enAsEvent ) )
    {
        return BST_ERR_INVALID_PTR;
    }
    pstSendAsEvent                      = (BST_AS_EVT_STRU *)BST_OS_MALLOC( BST_OS_SIZEOF(BST_AS_EVT_STRU) );
    BST_ASSERT_NULL_RTN( pstSendAsEvent, BST_ERR_NO_MEMORY );

    if( ( BST_NULL_PTR == pvData ) || ( 0 == ulLength ) )
    {
        pstSendAsEvent->pucData         = BST_NULL_PTR;
        pstSendAsEvent->ulLength        = 0;
    }
    else
    {
        pstSendAsEvent->pucData         = (BST_UINT8 *)BST_OS_MALLOC( ulLength );
        if ( BST_NULL_PTR == pstSendAsEvent->pucData )
        {
            BST_RLS_LOG( "BST_SRV_CEvent::RcvAsEvent No Memory" );
            BST_OS_FREE( pstSendAsEvent );
            return BST_ERR_NO_MEMORY;
        }
        pstSendAsEvent->ulLength        = ulLength;
        BST_OS_MEMCPY( pstSendAsEvent->pucData, pvData, ulLength );
    }

    pstSendAsEvent->enId                = BST_SRV_AS_EVENT;
    pstSendAsEvent->enAsEvent           = enAsEvent;

    return BST_OS_SendMail( m_pstEventMbx, pstSendAsEvent );
}
コード例 #20
0
BST_OS_MBX_T *BST_OS_CreateMbx( BST_VOID *pvArg, BST_UINT32 ulSize )
{
    BST_OS_MBX_T                       *pstMbx;

    pstMbx                              = BST_OS_MALLOC( BST_OS_SIZEOF(BST_OS_MBX_T) );
    BST_ASSERT_NULL_RTN( pstMbx, BST_NULL_PTR );
    pstMbx->hSem                        = BST_NULL_PTR;

    lstInit( &pstMbx->hList );
    pstMbx->hSem                        = BST_OS_CreateSem( pvArg, 0U );

    if( BST_NULL_PTR == pstMbx->hSem )
    {
        BST_DBG_LOG("Create Mail Box Fail.\n");
        lstFree( &pstMbx->hList );
        BST_OS_FREE(pstMbx);
        /*lint -e438*/
        return BST_NULL_PTR;
        /*lint +e438*/
    }
    return( pstMbx );
}
コード例 #21
0
BST_ERR_ENUM_UINT8 BST_SRV_CHNL_ProcInCB(
    BST_SRV_CHNL_LINK_STRU     *pstChnlLink )
{
    BST_SRV_CHNL_HEAD_STRU     *pstPktItem;
    BST_SRV_CHNL_HEAD_STRU     *pstPktItem2;
    BST_ERR_ENUM_UINT8          enRtnVal;

    BST_ASSERT_NULL_RTN( pstChnlLink, BST_ERR_INVALID_PTR );
    pstChnlLink->enState        = BST_SRV_CHNL_STATE_SUSPEND;
    BST_DBG_LOG("BST_SRV_CHNL_ProcInCB"); 
    for(;;)
    {
        pstPktItem              = BST_SRV_Q_PeekHead(pstChnlLink->pUnsendList);
        enRtnVal                = BST_NO_ERROR_MSG;
        if( BST_NULL_PTR == pstPktItem )
        {
            break;
        }
        enRtnVal                = BST_SRV_CHNL_Send_InCB( pstChnlLink, pstPktItem );
        if( BST_NO_ERROR_MSG == enRtnVal )
        {
            BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&pstChnlLink->pUnsendList,
                               (BST_SRV_CHNL_Q *)pstPktItem,
                               (BST_SRV_CHNL_Q **)&pstPktItem2 );
            BST_SRV_FreeIpBlock( pstPktItem );
            continue;
        }
        else
        {
            break;
        }
    }
    if( BST_SRV_Q_IsEmpty( pstChnlLink->pUnsendList ) )
    {
        pstChnlLink->enState    = BST_SRV_CHNL_STATE_RUN;
    }
    return BST_NO_ERROR_MSG;
}
コード例 #22
0
err_t BST_IP_TcpConnectedCB( BST_VOID *arg, struct tcp_pcb *tpcb, err_t err )
{
    err_t                               lErrType;
    BST_IP_CRcverMng                   *pcRcverMnger;
    BST_FD_T                            fd;
    BST_OS_LOCKCNT_T                    tThreadLockCnt;

    BST_ASSERT_NULL_RTN( tpcb, ERR_ARG );

    tThreadLockCnt                      = BST_OS_ThreadLock();
    pcRcverMnger                        = BST_IP_CRcverMng::GetInstance();
    BST_DBG_LOG1( "BST_IP_Tcp connect successfully , err: %d", err );

    if ( BST_NULL_PTR == pcRcverMnger )
    {
        BST_OS_ThreadUnLock( tThreadLockCnt );
        return ERR_MEM;
    }
    fd.pFd                              = tpcb;
    lErrType                            = pcRcverMnger->CnctedRcver( fd, err );
    BST_OS_ThreadUnLock( tThreadLockCnt );
    return lErrType;
}
コード例 #23
0
BST_IP_ERR_T BST_SRV_RcvTcpIpEvent( BST_IP_EVENT_STRU *pstEvent )
{
    BST_SRV_CEvent                     *pEvtProc;
    BST_ERR_ENUM_UINT8                  ucRtnVal;

    pEvtProc                            = BST_SRV_CEvent::GetInstance();
    BST_ASSERT_NULL_RTN( pEvtProc, BST_IP_ERR_ARG );

    ucRtnVal                            = pEvtProc->RcvTcpIpEvent( pstEvent );
    switch ( ucRtnVal )
    {
        case BST_ERR_NO_MEMORY:
            return BST_IP_ERR_MEM;

        case BST_ERR_INVALID_PTR:
            return BST_IP_ERR_VAL;

        case BST_NO_ERROR_MSG:
            return BST_IP_ERR_OK;

        default:
            return BST_IP_ERR_ARG;
    }
}
コード例 #24
0
BST_ERR_ENUM_UINT8 BST_SRV_CHNL_Acked (
    BST_SRV_CHNL_LINK_STRU     *pstLinkItem,
    const BST_UINT32            ulMinNumber,
    const BST_UINT32            ulMaxNumber )
{
    BST_SRV_CHNL_SENT_STRU             *pSentItem;
    BST_SRV_CHNL_SENT_STRU             *pSentItem2;
    BST_SRV_CHNL_HEAD_STRU             *pstPktItem;
    BST_SRV_CHNL_HEAD_STRU             *pstPktItem2;
    BST_UINT32                          ulSpinlockCnt;
    BST_UINT32                          ulOrigCounter;
    BST_DRV_STRU                       *pNetDrvHandle;
    BST_ERR_ENUM_UINT8                  enRtnVal;

    BST_ASSERT_NULL_RTN( pstLinkItem, BST_ERR_INVALID_PTR );
    BST_ASSERT_NORM_RTN( ulMaxNumber < ulMinNumber, BST_ERR_ILLEGAL_PARAM );

    BST_DBG_LOG2( "BST_SRV_CHNL_Acked ulMinNumber, ulMaxNumber",
                  ulMinNumber, ulMaxNumber );
    /*查找已发送的数据包的*/
    pSentItem                           = BST_SRV_Q_PeekHead(pstLinkItem->pSentList);
    ulOrigCounter                       = g_ulHighPriCnt;
    pSentItem2                          = BST_NULL_PTR;
    pstPktItem2                         = BST_NULL_PTR;
    while( pSentItem != BST_NULL_PTR )
    {
        if ( ( pSentItem->ulAckNo > ulMinNumber )
           &&( pSentItem->ulAckNo <=ulMaxNumber ) )
        {
            if( BST_DSPP_FLG_LVLTYPE_HS == pSentItem->usProcLevel )
            {
                ulSpinlockCnt           = BST_OS_SpinLock( &g_HighPriCntSpinLock );
                if ( g_ulHighPriCnt > 0 )
                {
                    g_ulHighPriCnt--;
                }
                BST_OS_SpinUnLock( &g_HighPriCntSpinLock , ulSpinlockCnt );
            }
            BST_DBG_LOG1("BST_SRV_CHNL_Acked,g_ulHighPriCnt--",g_ulHighPriCnt);
            BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&pstLinkItem->pSentList,
                               (BST_SRV_CHNL_Q *)pSentItem,
                               (BST_SRV_CHNL_Q **)&pSentItem2 );
            BST_OS_FREE( pSentItem );
        }
        else
        {
            pSentItem2                  = pSentItem->pNext;
        }
        pSentItem                       = pSentItem2;
    }

    pstPktItem                          = BST_SRV_Q_PeekHead(pstLinkItem->pUnsendList);
    while ( pstPktItem != BST_NULL_PTR )
    {
        if( BST_IP_SKT_PROP_NONE != pstPktItem->ucPropType )
        {
            if( ( ( pstPktItem->stProp.ulSeqNum + pstPktItem->ulUsed  ) > ulMinNumber )
              &&( ( pstPktItem->stProp.ulSeqNum + pstPktItem->ulUsed  ) <=ulMaxNumber ) )
            {
                BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&pstLinkItem->pUnsendList,
                                   (BST_SRV_CHNL_Q *)pstPktItem,
                                   (BST_SRV_CHNL_Q **)&pstPktItem2 );
                BST_SRV_FreeIpBlock( pstPktItem );
            }
            else
            {
                pstPktItem2             = pstPktItem->pNext;
            }
        }
        else
        {
            pstPktItem2                 = pstPktItem->pNext;
        }
        pstPktItem                      = pstPktItem2;
    }
    enRtnVal                            = BST_NO_ERROR_MSG;
    if( BST_NULL_PTR != pstLinkItem->pUnsendList )
    {
        BST_OS_TimerStop( pstLinkItem->ulTimerId );
        BST_DBG_LOG( "BST_SRV_CHNL_Acked, Proc Unsent List" );
        enRtnVal                        = BST_SRV_CHNL_ProcInCB( pstLinkItem );
    }

    /**
     * 刚刚有值,现在无值,那么说明全部高优先数据发送完成
     */
    if( ( 0 != ulOrigCounter ) && ( 0 == g_ulHighPriCnt ) )
    {
        pNetDrvHandle   = BST_DRV_NetGetDvcHandle();
        enRtnVal        = 0;
        pNetDrvHandle->pfIoCtrl( BST_DRV_CMD_HPR_DATA_FINISH, (BST_VOID *)&enRtnVal );
        BST_DBG_LOG( "BST_SRV_CHNL_Acked, BST_DRV_CMD_HPR_DATA_FINISH" );
    }

    return enRtnVal;
}
コード例 #25
0
BST_ERR_ENUM_UINT8 BST_SRV_CHNL_Itf(
    BST_SRV_CHNL_HEAD_STRU     *pstPktItem )
{
    BST_SRV_CHNL_LINK_STRU     *pstLinkItem = BST_NULL_PTR;
    BST_SRV_CHNL_LINK_STRU     *pstLinkItem2;
    BST_IP_CSocket             *pcSocket;
    BST_OS_TIMERID_T            ulTimerId;
    BST_ERR_ENUM_UINT8          enRtnVal;

    BST_ASSERT_NULL_RTN( pstPktItem, BST_ERR_INVALID_PTR );
    pstLinkItem                 = BST_SRV_Q_PeekHead( g_lstChnlMng );
    enRtnVal                    = BST_NO_ERROR_MSG;
    for(;;)
    {
        if( BST_NULL_PTR == pstLinkItem )
        {
            break;
        }
        if( ( pstLinkItem->stLink.ulMainLinkId == pstPktItem->ulMainLinkId )
          &&( pstLinkItem->stLink.ulAuxLinkId == pstPktItem->ulAuxLinkId ) )
        {
            break;
        }
        pstLinkItem             = pstLinkItem->pNext;
    }

    BST_DBG_LOG1( "CPC_PACKET_DROP pstPktItem->usCmdId", pstPktItem->usCmdId );
    switch( pstPktItem->usCmdId )
    {
        case BST_DSPP_FLG_CMD_CLEAR:
            if( BST_NULL_PTR != pstLinkItem )
            {
                BST_SRV_CHNL_Close( pstLinkItem );
                delete pstLinkItem->pcSocket;
                BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&g_lstChnlMng,
                                   (BST_SRV_CHNL_Q *)pstLinkItem,
                                   (BST_SRV_CHNL_Q **)&pstLinkItem2 );
                BST_OS_TimerRemove( pstLinkItem->ulTimerId );
                BST_OS_FREE( pstLinkItem );
            }
            else
            {
                enRtnVal        = BST_ERR_UNKNOW_OBJ;
            }
        break;

        case BST_DSPP_FLG_CMD_CLOSE:
            if( BST_NULL_PTR != pstLinkItem )
            {
                BST_SRV_CHNL_Close( pstLinkItem );
                delete pstLinkItem->pcSocket;
                BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&g_lstChnlMng,
                                   (BST_SRV_CHNL_Q *)pstLinkItem,
                                   (BST_SRV_CHNL_Q **)&pstLinkItem2 );
                BST_OS_TimerRemove( pstLinkItem->ulTimerId );
                BST_OS_FREE( pstLinkItem );
            }
            else
            {
                enRtnVal        = BST_ERR_UNKNOW_OBJ;
            }
        break;

        case BST_DSPP_FLG_CMD_SEND:
            BST_DBG_LOG1("BST_SRV_CHNL_Itf send pstLinkItem",pstLinkItem);
            if( BST_NULL_PTR == pstLinkItem )
            {
                pstLinkItem     = (BST_SRV_CHNL_LINK_STRU *)BST_OS_MALLOC
                                  ( BST_OS_SIZEOF(BST_SRV_CHNL_LINK_STRU) );
                if( BST_NULL_PTR == pstLinkItem )
                {
                    enRtnVal    = BST_ERR_NO_MEMORY;
                    break;
                }
                pcSocket        = BST_SRV_CHNL_CreateSocket( pstPktItem );
                if ( BST_NULL_PTR == pcSocket )
                {
                    BST_RLS_LOG("BST_SRV_CHNL_CreateSocket error");
                    enRtnVal    = BST_ERR_PAR_UNKNOW;
                    break;
                }
                ulTimerId       = BST_OS_TimerCreate
                                ( BST_SRV_CHNL_SysTimerExpired, BST_NULL_PTR, 
                                  BST_SRV_GetChnlCtrlHandle( 0 ) );
                BST_SRV_CHNL_InitLink( pstLinkItem, pcSocket, ulTimerId );
                pstLinkItem->ulAddrType             = BST_DSPP_FLG_ADDTYPE_INET;
                pstLinkItem->stLink.ulMainLinkId    = pstPktItem->ulMainLinkId;
                pstLinkItem->stLink.ulAuxLinkId     = pstPktItem->ulAuxLinkId;
                BST_SRV_Q_PushToTail( (BST_SRV_CHNL_Q **)&g_lstChnlMng,
                                      (BST_SRV_CHNL_Q *)pstLinkItem );
            }

            enRtnVal            = BST_SRV_CHNL_Send( pstLinkItem, pstPktItem );
            if( BST_ERR_ILLEGAL_PARAM == enRtnVal )
            {
                BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&g_lstChnlMng,
                                   (BST_SRV_CHNL_Q *)pstLinkItem,
                                   (BST_SRV_CHNL_Q **)&pstLinkItem2 );
                BST_OS_FREE( pstLinkItem );
            }

            return enRtnVal;

        default:
        break;
    }
    BST_SRV_FreeIpBlock( pstPktItem );
    return enRtnVal;
}
コード例 #26
0
BST_ERR_ENUM_UINT8 BST_SRV_CHNL_Send_Runing( 
    BST_SRV_CHNL_LINK_STRU     *pstChnlLink,
    BST_SRV_CHNL_HEAD_STRU     *pstPktItem )
{
    BST_SRV_CHNL_SENT_STRU     *pSentItem;
    BST_SRV_CHNL_HEAD_STRU     *pstUnsendItem;
    BST_SRV_CHNL_LINK_STRU     *pstLinkItem2;
    BST_IP_ERR_T                enIpErr;
    BST_DSPP_CAppUlVc          *pstDsppUl;
    BST_UINT32                  ulSpinlockCnt;
    BST_UINT16                  usFlags;

    BST_ASSERT_NULL_RTN( pstChnlLink, BST_ERR_INVALID_PTR );
    BST_ASSERT_NULL_RTN( pstPktItem, BST_ERR_INVALID_PTR );
    enIpErr                     = BST_IP_ERR_OK;
    if( BST_SRV_ChnlIsTail(pstPktItem) )
    {
        usFlags                 = BST_IP_SEND_FLAG_VOID;
    }
    else
    {
        usFlags                 = BST_IP_SEND_FLAG_MORE;
    }
    if( BST_IP_SKT_PROP_NONE != pstPktItem->ucPropType )
    {
        BST_SRV_CHNL_Set_LinkProp( pstChnlLink, pstPktItem );
        pstChnlLink->ulCurrentSeq
                                = pstPktItem->stProp.ulSeqNum;
    }

    BST_DBG_LOG4("BST_SRV_CHNL_Send_Runing Length, ProcLevel, PackAddr, Flag",
                    pstPktItem->ulUsed,
                    pstPktItem->usProcLevel,
                    pstPktItem->ucPktAddr,
                    usFlags );
    switch( pstPktItem->usProcLevel )
    {
        case BST_DSPP_FLG_LVLTYPE_NORMAL:
            enIpErr             = pstChnlLink->pcSocket->Write
                                  ( (const BST_UINT8 *)&pstPktItem->aucData[0],
                                    (BST_UINT16)pstPktItem->ulUsed, BST_IP_BSTT_DATA, usFlags );
        break;

        case BST_DSPP_FLG_LVLTYPE_HS:
            enIpErr             = pstChnlLink->pcSocket->Write
                                  ( (const BST_UINT8 *)&pstPktItem->aucData[0],
                                    (BST_UINT16)pstPktItem->ulUsed,
                                    BST_IP_HPRI_DATA,
                                    usFlags );
        break;

        case BST_DSPP_FLG_LVLTYPE_LP:
            enIpErr             = pstChnlLink->pcSocket->Write
                                  ( (const BST_UINT8 *)&pstPktItem->aucData[0],
                                    (BST_UINT16)pstPktItem->ulUsed,
                                    BST_IP_LPWR_DATA,
                                    usFlags );
        break;

        default:
            return BST_ERR_PAR_UNKNOW;
    }
    if( BST_IP_ERR_OK == enIpErr )
    {
        pSentItem               = ( BST_SRV_CHNL_SENT_STRU *)BST_OS_MALLOC(
                                  BST_OS_SIZEOF( BST_SRV_CHNL_SENT_STRU ) );
        if( BST_NULL_PTR == pSentItem )
        {
            return BST_ERR_NO_MEMORY;
        }
        pstChnlLink->ulCurrentSeq += pstPktItem->ulUsed;
        pSentItem->pNext        = BST_NULL_PTR;
        if ( BST_DSPP_FLG_LVLTYPE_HS == pstPktItem->usProcLevel )
        {
            ulSpinlockCnt       = BST_OS_SpinLock( &g_HighPriCntSpinLock );
            g_ulHighPriCnt++;
            BST_OS_SpinUnLock( &g_HighPriCntSpinLock , ulSpinlockCnt );
        }
        pSentItem->usProcLevel  = pstPktItem->usProcLevel;
        pSentItem->ulAckNo      = pstChnlLink->ulCurrentSeq;
        BST_SRV_Q_PushToTail( (BST_SRV_CHNL_Q **)&pstChnlLink->pSentList,
                              (BST_SRV_CHNL_Q *)pSentItem );
        BST_DBG_LOG3("tiger BST_SRV_FreeIpBlock1 g_ulHighPriCnt++, sent",pstPktItem, g_ulHighPriCnt, pstPktItem->ulUsed);
        BST_SRV_FreeIpBlock( pstPktItem );
    }
    else if( BST_IP_ERR_MEM == enIpErr )
    {
        /*申请空间存储未发送的数据,避免在处理完成时将数据释放*/
        pstUnsendItem           = BST_SRV_AlocIpBlock();
        if ( BST_NULL_PTR == pstUnsendItem )
        {
            return BST_ERR_NO_MEMORY;
        }
        BST_OS_MEMCPY( pstUnsendItem, pstPktItem, BST_OS_SIZEOF(BST_SRV_CHNL_HEAD_STRU));
        BST_SRV_CHNL_Send_Suspend( pstChnlLink, pstUnsendItem );
        pstChnlLink->enState    = BST_SRV_CHNL_STATE_SUSPEND;
        return BST_ERR_NO_MEMORY;
    }
    else
    {
        pstDsppUl               = BST_DSPP_CAppUlVc::GetInstance();
        if( pstChnlLink->ulAddrType == BST_DSPP_FLG_ADDTYPE_INET )
        {
            pstDsppUl->Report( BST_DSPP_FLG_CMD_CLOSE,
                               pstChnlLink->stLink.ulMainLinkId,
                               pstChnlLink->stLink.ulAuxLinkId );
            BST_SRV_CHNL_ReportTrafficFlow( pstChnlLink );
        }
        else
        {
            pstDsppUl->Report( BST_DSPP_FLG_CMD_CLOSE,
                               pstChnlLink->stDspp.usProcId,
                               pstChnlLink->stDspp.usTaskId );
        }
        BST_SRV_CHNL_Close( pstChnlLink );
        delete pstChnlLink->pcSocket;
        BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&g_lstChnlMng,
                           (BST_SRV_CHNL_Q *)pstChnlLink,
                           (BST_SRV_CHNL_Q **)&pstLinkItem2 );
        BST_OS_FREE(pstChnlLink);
        return BST_ERR_SOCKET_CLSD;
    }
    return BST_NO_ERROR_MSG;
}
コード例 #27
0
BST_ERR_ENUM_UINT8 BST_SRV_CHNL_Send_InCB( 
    BST_SRV_CHNL_LINK_STRU     *pstChnlLink,
    BST_SRV_CHNL_HEAD_STRU     *pstPktItem )
{
    BST_SRV_CHNL_SENT_STRU     *pSentItem;
    BST_IP_ERR_T                enIpErr;
    BST_UINT16                  usFlags;
    BST_UINT32                  ulSpinlockCnt;

    BST_ASSERT_NULL_RTN( pstChnlLink, BST_ERR_INVALID_PTR );
    BST_ASSERT_NULL_RTN( pstPktItem, BST_ERR_INVALID_PTR );
    enIpErr                     = BST_IP_ERR_OK;
    if( BST_SRV_ChnlIsTail(pstPktItem) )
    {
        usFlags                 = BST_IP_SEND_FLAG_VOID;
    }
    else
    {
        usFlags                 = BST_IP_SEND_FLAG_MORE;
    }

    if( BST_IP_SKT_PROP_NONE != pstPktItem->ucPropType )
    {
        BST_SRV_CHNL_Set_LinkProp( pstChnlLink, pstPktItem );
        pstChnlLink->ulCurrentSeq= pstPktItem->stProp.ulSeqNum;
    }
    BST_DBG_LOG4("BST_SRV_CHNL_Send_InCB Length, ProcLevel, PackAddr, Flag",
                    pstPktItem->ulUsed,
                    pstPktItem->usProcLevel,
                    pstPktItem->ucPktAddr,
                    usFlags );

    switch( pstPktItem->usProcLevel )
    {
        case BST_DSPP_FLG_LVLTYPE_NORMAL:
            enIpErr             = pstChnlLink->pcSocket->Write
                                  ( (const BST_UINT8 *)&pstPktItem->aucData[0],
                                    (BST_UINT16)pstPktItem->ulUsed, BST_IP_BSTT_DATA, usFlags );
        break;

        case BST_DSPP_FLG_LVLTYPE_HS:
            enIpErr             = pstChnlLink->pcSocket->Write
                                  ( (const BST_UINT8 *)&pstPktItem->aucData[0],
                                    (BST_UINT16)pstPktItem->ulUsed,
                                    BST_IP_HPRI_DATA,
                                    usFlags );
        break;

        case BST_DSPP_FLG_LVLTYPE_LP:
            enIpErr             = pstChnlLink->pcSocket->Write
                                  ( (const BST_UINT8 *)&pstPktItem->aucData[0],
                                    (BST_UINT16)pstPktItem->ulUsed,
                                    BST_IP_LPWR_DATA,
                                    usFlags );
        break;

        default:
            return BST_ERR_PAR_UNKNOW;
    }
    if( BST_IP_ERR_OK == enIpErr )
    {
        pSentItem               = ( BST_SRV_CHNL_SENT_STRU *)BST_OS_MALLOC(
                                  BST_OS_SIZEOF( BST_SRV_CHNL_SENT_STRU ) );
        if( BST_NULL_PTR == pSentItem )
        {
            return BST_ERR_INVALID_PTR;
        }
        pstChnlLink->ulCurrentSeq += pstPktItem->ulUsed;
        pstChnlLink->ulRetryTimes  = 0;
        pSentItem->usProcLevel  = pstPktItem->usProcLevel;
        pSentItem->pNext        = BST_NULL_PTR;
        pSentItem->ulAckNo      = pstChnlLink->ulCurrentSeq;
        BST_SRV_Q_PushToTail( (BST_SRV_CHNL_Q **)&pstChnlLink->pSentList,
                              (BST_SRV_CHNL_Q *)pSentItem );
        if ( BST_DSPP_FLG_LVLTYPE_HS == pstPktItem->usProcLevel )
        {
            ulSpinlockCnt       = BST_OS_SpinLock( &g_HighPriCntSpinLock );
            g_ulHighPriCnt++;
            BST_OS_SpinUnLock( &g_HighPriCntSpinLock , ulSpinlockCnt );
            BST_DBG_LOG2(" g_ulHighPriCnt++, sent", g_ulHighPriCnt, pstPktItem->ulUsed);
        }
    }
    else if( BST_IP_ERR_MEM == enIpErr )
    {
        pstChnlLink->ulRetryTimes++;
        BST_OS_TimerStart( pstChnlLink->ulTimerId, BST_SRV_CHNL_RTX_INTERVAL );
        return BST_ERR_NO_MEMORY;
    }
    else
    {
        return BST_ERR_SOCKET_CLSD;
    }
    return BST_NO_ERROR_MSG;
}
コード例 #28
0
/*lint -e438*/
err_t BST_IP_TcpRecvCB( BST_VOID *arg, struct tcp_pcb * tpcb, struct pbuf *p, BST_IP_ERR_T err )
{
    err_t                               ucErrMsg;
    BST_UINT16                          usCopyedLength;
    BST_IP_CRcverMng                   *pcRcverMnger;
    BST_IP_PKTPROC_MODE_ENUM            enProcMode;
    struct pbuf                        *q;
    BST_UINT8                          *pucSdu;
    BST_FD_T                            FdTmp;
    BST_OS_LOCKCNT_T                    tThreadLockCnt;

    BST_ASSERT_NULL_RTN( tpcb, ERR_ARG );

    tThreadLockCnt                      = BST_OS_ThreadLock();
    FdTmp.pFd                           = tpcb;
    pcRcverMnger                        = BST_IP_CRcverMng::GetInstance();
    pucSdu                              = BST_NULL_PTR;
    q                                   = BST_NULL_PTR;
    usCopyedLength                      = 0;
    ucErrMsg                            = ERR_OK;
    enProcMode                          = BST_IP_PKT_REMOVE_PROC;

    if( BST_NULL_PTR == pcRcverMnger )
    {
        ucErrMsg                        = ERR_MEM;
        BST_IP_TCP_RCVAPI_FREE();
    }

   /*                                          *
    * p=NULL means this pcb is closed by Remote*
    *                                          */
    if( BST_IP_IsLwipNull(p) )
    {
        pcRcverMnger->ClosedRcver ( FdTmp );
        BST_OS_ThreadUnLock( tThreadLockCnt );
        return ERR_OK;
    }

    if ( p->tot_len > 0 )
    {
        pucSdu = ( BST_UINT8 * )BST_OS_MALLOC( p->tot_len );
    }
    else
    {
        ucErrMsg                        = ERR_BUF;
        tcp_recved( tpcb, p->tot_len );
        BST_IP_TCP_RCVAPI_FREE();
    }

    if ( BST_NULL_PTR == pucSdu )
    {
        ucErrMsg                        = ERR_BUF;
        tcp_recved( tpcb, p->tot_len );
        BST_IP_TCP_RCVAPI_FREE();
    }

    q                                   = p;
    usCopyedLength                      = 0;

    while ( BST_NULL_PTR != q )
    {
        if ( ( q->len > 0 ) && ( BST_NULL_PTR != q->payload )
             && ( q->len + usCopyedLength <= p->tot_len ) )
        {
            BST_OS_MEMCPY( pucSdu + usCopyedLength, q->payload, q->len );
        }
        else
        {
            break;
        }

        usCopyedLength                 += q->len;
        q                               = q->next;
    }

    if ( usCopyedLength > 0 )
    {
        BST_IP_ApiRecordLastSktProp( (BST_IP_PKT_ID_T)p );
        /*                                                                       *
        *The Received Message must put it here where is before call Application CB.
        *This can avoid app close socket in callback when the rcv_wnd != TCP_WND.
        *                                                                        */
        tcp_recved( tpcb, p->tot_len );
        enProcMode                      = pcRcverMnger->PacketRcver( FdTmp,
                                                                     ( BST_UINT8 * )pucSdu,
                                                                     usCopyedLength );
        if( BST_IP_PKT_FORWARD_PROC == enProcMode )
        {
            BST_IP_ApiForwordPacket( (BST_IP_PKT_ID_T)p );
        }

        ucErrMsg                        = ERR_OK;
    }
    else
    {
        ucErrMsg                        = ERR_BUF;
    }
    BST_OS_FREE( pucSdu );
    BST_IP_TCP_RCVAPI_FREE();
}
コード例 #29
0
BST_UINT32 BST_OS_GetMailAmount( BST_OS_MBX_T *pstMbx )
{
    BST_ASSERT_NULL_RTN( pstMbx,        0U );
    BST_ASSERT_NULL_RTN( pstMbx->hSem,  0U );
    return( (BST_UINT32)lstCount( &pstMbx->hList ) );
}
コード例 #30
0
BST_IP_CSocket *BST_SRV_CHNL_CreateSocket(
    BST_SRV_CHNL_HEAD_STRU     *pstPktItem )
{
    BST_IP_CSocket             *pcSocket;
    BST_IP_CNetRcver           *pNetRcver;
    BST_SCKT_TYPE_ENUM_UINT32   enSocketType;
    BST_IP_ERR_T                enIpErrMsg;

    BST_ASSERT_NULL_RTN( pstPktItem, BST_NULL_PTR );
    enSocketType                = BST_SCKT_TYPE_TCP;

#if( BST_VER_TYPE == BST_DBG_VER )
    pcSocket                    = new BST_IP_CSocket ( 0, 0 );
#else
    pcSocket                    = new BST_IP_CSocket ();
#endif
    pNetRcver                   = BST_SRV_CChnlIpRcver::GetInstance();
    if ( BST_NULL_PTR == pNetRcver )
    {
        delete pcSocket;
        return BST_NULL_PTR;
    }

    enIpErrMsg                  = pcSocket->IoCtrl ( BST_SCKT_CMD_DEF_TYPE,
                                                    ( BST_VOID  *)&enSocketType );
    if ( BST_IP_ERR_OK != enIpErrMsg )
    {
        BST_DBG_LOG("BST_APP_CPRITask CreateSocket BST_SCKT_CMD_DEF_TYPE");
        delete pcSocket;
        return BST_NULL_PTR;
    }
    enIpErrMsg                  = pcSocket->IoCtrl( BST_SCKT_CMD_SET_ADDRESS,
                                                    ( BST_VOID  *)&pstPktItem->stAddr.stInet );
    if ( BST_IP_ERR_OK != enIpErrMsg )
    {
        BST_DBG_LOG("BST_APP_CPRITask CreateSocket BST_SCKT_CMD_SET_ADDRESS");
        delete pcSocket;
        return BST_NULL_PTR;
    }

    enIpErrMsg                  = pcSocket->IoCtrl( BST_SCKT_CMD_REG_CALLBACK,
                                                    pNetRcver ); 
    if ( BST_IP_ERR_OK != enIpErrMsg )
    {
        BST_DBG_LOG("BST_APP_CPRITask CreateSocket BST_SCKT_CMD_REG_CALLBACK");
        delete pcSocket;
        return BST_NULL_PTR;
    }
    enIpErrMsg                  = pcSocket->Socket( BST_SRV_GetChnlCtrlHandle( 0 ) );
    if ( BST_IP_ERR_OK != enIpErrMsg )
    {
        BST_DBG_LOG("BST_APP_CPRITask CreateSocket Socket error");
        delete pcSocket;
        return BST_NULL_PTR;
    }
#if ( ( BST_OS_VER == BST_WIN32 && BST_VER_TYPE == BST_DBG_VER )||( BST_MODEM_SELF == 1 ) )
    pcSocket->Bind();
    pcSocket->Connect();
#else
    enIpErrMsg                  = pcSocket->Clone();
#endif
    if ( BST_IP_ERR_OK != enIpErrMsg )
    {
        BST_RLS_LOG( "BST_APP_CPRITask Clone err" );
        return BST_NULL_PTR;
    }
    return pcSocket;
}