📄 hdlc.c
字号:
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 + -