⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hdlc.c

📁 在大型通信系统(机架插板式)中多块单板通过TDM总线
💻 C
📖 第 1 页 / 共 3 页
字号:
    WATCHDOG = ~WATCHDOG;

    /* 接收部分L2及L2-->L3 */
    if(m_sL2Que.ucRxPendNum>0)      /* 尚有接收帧需处理 */  
    {
        /* 判断帧类型 */
        switch (L2RxBuf[m_sL2Que.ucRxDealIndex].ucCRID)
        {
            case    SABME_CONTROL:      

                    /* 链路层发送队列未满   */  
                    if(m_sL2Que.ucTxPendNum <= L2TXBUFNUM)
                    {
                        /* 发送UA帧 */
                        L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength  = 4;
                        L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[0] = 0;                                                                                                     
                        L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[1] = 0;                                                                                                     
                        L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucCRID    = UA_CONTROL;                                                                                                        
                        L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv2    = 0;                                                                                                     
            
                        /* 调整L2发送指针 */
                        m_sL2Que.ucTxPlaceIndex++;
                        m_sL2Que.ucTxPlaceIndex = m_sL2Que.ucTxPlaceIndex%L2TXBUFNUM;
                        m_sL2Que.ucTxPendNum++;
                    }
                    else
                    {
                        /* 链路层发送队列满,来不及处理,置错误标志   */  
                        m_bL2TxErrorFlag = WRONG;
                    }
                                        
                    /* 标识链路状态 */
                    m_sL2Que.ucLinkState = DL_ESTABLISH;

                    m_sL2Que.ucTxIFrameStatus = IDLE;   /* 可以发送I帧了 */
                    m_sL2Que.ucRSendFlag = FALSE;       
                    m_sL2Que.ucT201Control = OFF;

                    break;

            case    IFRAME_CONTROL:     

                    if(m_sL2Que.ucLinkState == DL_ESTABLISH)    /* 链路建立时才将数据从L2-->l3  */
                    {
                        /* 数据包从L2缓冲区移至L3缓冲区 */
                        L3RxBuf[m_sL3Que.ucRxPlaceIndex].ucPID    = L2RxBuf[m_sL2Que.ucRxDealIndex].ucData[0];
                        L3RxBuf[m_sL3Que.ucRxPlaceIndex].ucLength = L2RxBuf[m_sL2Que.ucRxDealIndex].ucData[1];
                        L3RxBuf[m_sL3Que.ucRxPlaceIndex].uiType   = L2RxBuf[m_sL2Que.ucRxDealIndex].ucData[2];
                        L3RxBuf[m_sL3Que.ucRxPlaceIndex].uiType   = (L3RxBuf[m_sL3Que.ucRxPlaceIndex].uiType<<8)|
                                                                    L2RxBuf[m_sL2Que.ucRxDealIndex].ucData[3];
                    
                        for(i=0;i<L3RxBuf[m_sL3Que.ucRxPlaceIndex].ucLength-4;i++)   
                        {
                            L3RxBuf[m_sL3Que.ucRxPlaceIndex].ucData[i] = L2RxBuf[m_sL2Que.ucRxDealIndex].ucData[4+i];
                        }
                            
                        /* 剩余部分填充0 */
                        for(i=L3RxBuf[m_sL3Que.ucRxPlaceIndex].ucLength-4;i<BUFSIZE-8;i++)   
                        {
                            L3RxBuf[m_sL2Que.ucRxPlaceIndex].ucData[i] = 0;
                        }
                        
                        /* 调整接收部分L3<-->L2指针 */
                        m_sL3Que.ucRxPlaceIndex++;
                        m_sL3Que.ucRxPlaceIndex = m_sL3Que.ucRxPlaceIndex%L3RXBUFNUM;
                        m_sL3Que.ucRxPendNum++;
   
                        /* 链路层发送队列未满   */  
                        if(m_sL2Que.ucTxPendNum <= L2TXBUFNUM)
                        {
                            /* 发送RR帧 */
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength  = 4;
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[0] = 0;                                                                                                     
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[1] = 0;                                                                                                     
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucCRID    = RR_CONTROL;                                                                                                        
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv2    = 0;                                                                                                     
                
                            /* 调整L2发送指针 */
                            m_sL2Que.ucTxPlaceIndex++;
                            m_sL2Que.ucTxPlaceIndex = m_sL2Que.ucTxPlaceIndex%L2TXBUFNUM;
                            m_sL2Que.ucTxPendNum++;
                        }
                        else
                        {
                            /* 链路层发送队列满 */  
                            m_bL2TxErrorFlag = WRONG;
                        }
                    }
                        
                    break;

            case    UA_CONTROL:     

                    /* 标识链路状态 */
                    m_sL2Que.ucLinkState = DL_ESTABLISH;

                    /* 停止SABME重发 */
                    m_sL2Que.ucTxIFrameStatus = IDLE;   /* 可以发送I帧了 */
                    m_sL2Que.ucRSendFlag = FALSE;       
                    m_sL2Que.ucT201Control = OFF;

                    break;

            case    RR_CONTROL:     

                    /* 停止I帧重发 */
                    m_sL2Que.ucRSendFlag = FALSE;       
                    m_sL2Que.ucT201Control = OFF;

                    break;

            default:        

                    break;
        }       

        /* 调整L2接收指针 */
        m_sL2Que.ucRxDealIndex++;
        m_sL2Que.ucRxDealIndex = m_sL2Que.ucRxDealIndex%L2RXBUFNUM;
        m_sL2Que.ucRxPendNum--;
    }
           
    return;
}

/********************************************************************************/
/*  函数名称:void CheckTxL2Layer(void)                                          */
/*  简要描述:监测链路层L2发送通讯函数                                           */
/*                                                                              */
/*  时    间:2002年02月21日                                                     */
/********************************************************************************/
void CheckTxL2Layer(void)                   
{     
    uchar data i;
    
    /* 看门狗 */   
    WATCHDOG = ~WATCHDOG;

    /* 发送部分L3-->L2,I帧 */
    if( (m_sL2Que.ucLinkState == DL_ESTABLISH) && (m_sL3Que.ucTxPendNum > 0) )
    {   
        /* 链路已建立且L3尚有发送帧需处理        */
        if(m_sL2Que.ucTxPendNum <= L2TXBUFNUM)
        {
            /* 链路已建立且链路层发送队列未满   */  
            if(m_sL2Que.ucTxIFrameStatus == IDLE)       /* 可发送且             */
            {
                /* 当前没有I帧在发送    */
                if(m_sL2Que.ucRSendFlag == FALSE)       /* 首次发送部分         */
                {                                   
                    /* 数据包从L3缓冲区移至L2缓冲区 */
                    L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength  = L3TxBuf[m_sL3Que.ucTxDealIndex].ucLength+4;
                
                    L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[0] = 0;                                                                                                     
                    L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[1] = 0;                                                                                                     
                    L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucCRID    = IFRAME_CONTROL;                                                                                                        
                    L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv2    = 0;                                                                                                     
            
                    L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[0] = L3TxBuf[m_sL3Que.ucTxDealIndex].ucPID;
                    L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[1] = L3TxBuf[m_sL3Que.ucTxDealIndex].ucLength;
                    L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[2] = (L3TxBuf[m_sL3Que.ucTxDealIndex].uiType>>8)&0xff;
                    L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[3] = (L3TxBuf[m_sL3Que.ucTxDealIndex].uiType)&0xff;
                        
                    for(i=4;i<L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength-4;i++)   
                    {
                        L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[i] = L3TxBuf[m_sL3Que.ucTxDealIndex].ucData[i-4];
                    }
                                
                    /* 剩余部分填充0 */
                    for(i=L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength-4;i<BUFSIZE-4;i++)   
                    {
                        L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[i] = 0;
                    }
            
                    /* 调整L2指针 */
                    m_sL2Que.ucTxPlaceIndex++;
                    m_sL2Que.ucTxPlaceIndex = m_sL2Que.ucTxPlaceIndex%L2TXBUFNUM;
                    m_sL2Que.ucTxPendNum++;
        
                    /* 首次发送,置相关参数 */
                    m_sL2Que.ucTxIFrameStatus = BUSY;
                    m_sL2Que.ucRSendFlag = TRUE;
                    m_sL2Que.ucT201Control = ON;
                    m_sL2Que.ucT201 = 0;
                    m_sL2Que.ucN200 = 0;
                }    
            }
            else
            {
                /* 有I帧在发送  */
                if(m_sL2Que.ucRSendFlag == TRUE)       /* 重发部分                  */
                {                                   
                    /* 需重发,不调整L3指针 */
                    if(m_sL2Que.ucN200 < (N200-1))
                    {
                        if(m_sL2Que.ucT201 > T201)      
                        {
                            /* 定时到,重发 */
                            m_sL2Que.ucN200++;          /* 重发计数 */
                            m_sL2Que.ucT201 = 0;        /* 重发定时器清零 */
            
        
                            /* 数据包从L3缓冲区移至L2缓冲区 */
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength  = L3RxBuf[m_sL3Que.ucTxDealIndex].ucLength+4;
                        
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[0] = 0;                                                                                                     
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[1] = 0;                                                                                                     
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucCRID    = IFRAME_CONTROL;                                                                                                        
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv2    = 0;                                                                                                     
                    
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[0] = L3TxBuf[m_sL3Que.ucTxDealIndex].ucPID;
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[1] = L3TxBuf[m_sL3Que.ucTxDealIndex].ucLength;
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[2] = (L3TxBuf[m_sL3Que.ucTxDealIndex].uiType>>8)&0xff;
                            L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[3] = (L3TxBuf[m_sL3Que.ucTxDealIndex].uiType)&0xff;
                                
                            for(i=4;i<L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength-4;i++)   
                            {
                                L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[i] = L3TxBuf[m_sL3Que.ucTxDealIndex].ucData[i-4];
                            }
                                        
                            /* 剩余部分填充0 */
                            for(i=L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength-4;i<BUFSIZE-4;i++)   
                            {
                                L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[i] = 0;
                            }
                    
                            /* 调整L2指针 */
                            m_sL2Que.ucTxPlaceIndex++;
                            m_sL2Que.ucTxPlaceIndex = m_sL2Que.ucTxPlaceIndex%L2TXBUFNUM;
                            m_sL2Que.ucTxPendNum++;
                        }   
                    }
                    else                                    
                    {
                        /* 重发次数超出规定值 */
                        m_sL2Que.ucLinkState = DL_RELEASE;
                        m_sL2Que.ucTxIFrameStatus = IDLE;   /* 弃掉当前处理的I帧 */
                        m_sL2Que.ucRSendFlag = FALSE;       
                        m_sL2Que.ucT201Control = OFF;
        
                        /* 不再需要重发,调整L3指针 */
                        m_sL3Que.ucTxDealIndex++;
                        m_sL3Que.ucTxDealIndex = m_sL3Que.ucTxDealIndex%L3TXBUFNUM;
                        m_sL3Que.ucTxPendNum--;
        
                    }
                }
                else
                {
                    /* 结束重发部分 */
                    m_sL2Que.ucTxIFrameStatus = IDLE;       /* 弃掉当前处理的I帧 */
                    m_sL2Que.ucT201Control = OFF;
        
                    /* 不再需要重发,调整L3指针 */
                    m_sL3Que.ucTxDealIndex++;
                    m_sL3Que.ucTxDealIndex = m_sL3Que.ucTxDealIndex%L3TXBUFNUM;
                    m_sL3Que.ucTxPendNum--;
                }
            }
        }
        else
        {
            /* 链路层发送队列满 */  
            m_bL2TxErrorFlag = WRONG;
        }
    }       

    /* 发送部分L2,SABME帧 */
    if(m_sL2Que.ucLinkState == DL_RELEASE)      /* 尚未建立链路 */
    {
        if(m_sL2Que.ucRSendFlag == FALSE)       /* 首次发送      */
        {                                   
            m_sL2Que.ucRSendFlag = TRUE;
            m_sL2Que.ucT201Control = ON;
            m_sL2Que.ucT201 = 0;
            m_sL2Que.ucN200 = 0;
        }
        else
        {
            /* 定时到发送SABME帧 */
            if(m_sL2Que.ucT201 > T201)
            {
                m_sL2Que.ucT201 = 0;                /* 重发定时器清零 */
    
                L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength  = 4;
                L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[0] = 0;                                                                                                     
                L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[1] = 0;                                                                                                     
                L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucCRID    = SABME_CONTROL;                                                                                                     
                L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv2    = 0;                                                                                                     
                    
                /* 调整L2发送指针 */
                m_sL2Que.ucTxPlaceIndex++;
                m_sL2Que.ucTxPlaceIndex = m_sL2Que.ucTxPlaceIndex%L2TXBUFNUM;
                m_sL2Que.ucTxPendNum++;
            }
        }                       
    }       


    /* 发送部分L2-->L1 */
    if(m_sL2Que.ucTxPendNum>0)      /* L2尚有发送帧需处理        */
    {
        /* 数据包从L2缓冲区移至L1缓冲区 */
        L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucLength  = L2TxBuf[m_sL2Que.ucTxDealIndex].ucLength;
        L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[0] = L2TxBuf[m_sL2Que.ucTxDealIndex].ucRsv1[0];     
        L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[1] = L2TxBuf[m_sL2Que.ucTxDealIndex].ucRsv1[1];     
        L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[2] = L2TxBuf[m_sL2Que.ucTxDealIndex].ucCRID;        
        L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[3] = L2TxBuf[m_sL2Que.ucTxDealIndex].ucRsv2;        

        for(i=4;i<L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucLength;i++)   
        {
            L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[i] = L2TxBuf[m_sL2Que.ucTxDealIndex].ucData[i-4];
        }
        /* 剩余部分填充0 */
        for(i=L1TxBuf[m_sL1Que.ucTxDealIndex].ucLength;i<BUFSIZE;i++)   
        {
            L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[i] = 0;
        }

        /* 调整指针 */
        m_sL1Que.ucTxPlaceIndex++;
        m_sL1Que.ucTxPlaceIndex = m_sL1Que.ucTxPlaceIndex%L1TXBUFNUM;
        m_sL1Que.ucTxPendNum++;

        m_sL2Que.ucTxDealIndex++;
        m_sL2Que.ucTxDealIndex = m_sL2Que.ucTxDealIndex%L2TXBUFNUM;
        m_sL2Que.ucTxPendNum--;
    }       


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -