📄 ppp.c
字号:
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void PPPIllegalEvent(uint8 *DataBuf, uint8 Q)
{
DataBuf = DataBuf;
Q = Q;
}
/*********************************************************************************************************
** 函数名称: PPP_UpLayer()
** 功能描述: This-Layer-Up
** 动作给自动进入打开阶段的上边的层做指示。
** 典型的,该动作被LCP用于对一个NCP发送向上的事件信号,或者链路质量协议,或者可以被一个NCP用于显示该链路可用于它的网络层往来。
** 或者可以被一个NCP用于显示该链路可用于它的网络层往来。
** 输 入: DataBuf :接收到的数据包
** Q :接收到的消息(本函数没有用到)
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void PPP_UpLayer(uint8 *DataBuf, uint8 Q)
{
NCPGetFrame(&PPPData, DataBuf, Q);
}
/*********************************************************************************************************
** 函数名称: PPPDriverInit()
** 功能描述: PPP驱动接收初始化
** 输 入: 无
** 输 出: 无
** 全局变量: PPPData
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 PPPDriverInit(void)
{
PPPData.HardDrive = NULL;
PPPData.Event = OSQCreate(PPPData.QBuf, PPP_DRIVER_Q_BUF_LEN);
if (PPPData.Event == NULL)
{
return FALSE;
}
else
{
return TRUE;
}
}
uint8 PPPLowLayerUpQ[1];
uint8 PPPLowLayerDownQ[1];
uint8 PPPOpenQ[1];
uint8 PPPCloseQ[1];
uint8 PPPLowLayerUp(void)
{
#if OS_TASK_CREATE_EN > 0
#if OS_STK_GROWTH > 0
OSTaskCreate(PPPReviceTask, NULL, Stk[1] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_PRIO + 1);
#else
OSTaskCreate(PPPReviceTask, NULL, Stk[1], PPP_DRIVER_TASK_PRIO + 1);
#endif
#else
#if OS_STK_GROWTH > 0
OSTaskCreateExt(PPPReviceTask, NULL, Stk[1] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_PRIO + 1, PPP_DRIVER_TASK_PRIO + 1, Stk[1],
PPP_DRIVER_TASK_STK_SIZE, NULL, 0);
#else
OSTaskCreateExt(PPPReviceTask, NULL, Stk[1], PPP_DRIVER_TASK_PRIO + 1,
PPP_DRIVER_TASK_PRIO + 1, Stk[1] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_STK_SIZE, NULL, 0);
#endif
#endif
PPPLowLayerUpQ[0] = PPP_EVENT_LOWER_UP;
OSQPost(PPPData.Event, (void *)PPPLowLayerUpQ);
return 0;
}
uint8 PPPLowLayerDown(void)
{
PPPLowLayerDownQ[0] = PPP_EVENT_LOWER_DOWN;
OSQPost(PPPData.Event, (void *)PPPLowLayerDownQ);
OSTaskDel(PPP_DRIVER_TASK_PRIO + 1);
return 0;
}
uint8 PPPOpen(void)
{
PPPOpenQ[0] = PPP_EVENT_OPEN;
OSQPost(PPPData.Event, (void *)PPPOpenQ);
return 0;
}
uint8 PPPClose(void)
{
PPPCloseQ[0] = PPP_EVENT_CLOSE;
OSQPost(PPPData.Event, (void *)PPPCloseQ);
return 0;
}
uint8 PPPCreate(NetHardDrivesSocket *HardDrive)
{
if (PPPData.HardDrive == NULL && HardDrive != NULL)
{
PPPData.HardDrive = HardDrive;
HardDrive->ThisLayerUp = PPPLowLayerUp;
HardDrive->ThisLayerDown = PPPLowLayerDown;
PPPData.MaxTerminate = 3 * OS_TICKS_PER_SEC;
PPPData.MaxConfigure = 2 * OS_TICKS_PER_SEC;
PPPData.MaxFailure = 10;
PPPData.DelayTime = 0;
PPPData.OverTimeSum = 0;
PPPData.State = PPP_STATE_INITIAL;
PPPData.FramID = 0;
#if OS_TASK_CREATE_EN > 0
#if OS_STK_GROWTH > 0
OSTaskCreate(PPPDriverTask, NULL, Stk[0] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_PRIO);
#else
OSTaskCreate(PPPDriverTask, NULL, Stk[0], PPP_DRIVER_TASK_PRIO);
#endif
#else
#if OS_STK_GROWTH > 0
OSTaskCreateExt(PPPDriverTask, NULL, Stk[0] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_PRIO, PPP_DRIVER_TASK_PRIO, Stk[0],
PPP_DRIVER_TASK_STK_SIZE, NULL, 0);
#else
OSTaskCreateExt(PPPDriverTask, NULL, Stk[0], PPP_DRIVER_TASK_PRIO,
PPP_DRIVER_TASK_PRIO, Stk[0] + PPP_DRIVER_TASK_STK_SIZE - 1,
PPP_DRIVER_TASK_STK_SIZE, NULL, 0);
#endif
#endif
return TRUE;
}
else
{
return FALSE;
}
}
/*********************************************************************************************************
** 函数名称: PPPDriveWrite()
** 功能描述: 使用PPP协议发送一个数据包,调用此函数前必须调用PPPDriveGetSendBuf获取数据缓冲
** 输 入: HardDrive :发送的硬件驱动
** Buf :指向发送的数据
** NByte:发送的字节数
** 输 出: TRUE :函数调用成功
** FALSE:函数调用失败
** 全局变量: PPPUseHardDrive,PPPFcs16
** 调用模块:
**
** 作 者: 陈明计
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 PPPDriveWrite(NetHardDrivesSocket *HardDrive, uint8 *Buf, uint16 Nbyte)
{
uint16 Fcs;
uint8 Temp;
if (HardDrive != NULL)
if (HardDrive->GetFlag != NULL)
if (HardDrive->GetFlag() == NET_HARD_OPEN)
if (HardDrive->Putch != NULL)
{
Fcs = PPPFcs16(PPP_HARD_FCS16, Buf, Nbyte);
Fcs = ~Fcs;
/* 取得信号量 */
HardDrive->Putch(PPP_HARD_CHAR);
HardDrive->Putch(PPP_ADDR_CHAR);
HardDrive->Putch(PPP_DLE_CHAR);
HardDrive->Putch(PPP_CTR_CHAR ^ PPP_DLE_XOR_CHAR);
while (Nbyte--)
{
Temp = *Buf;
if ((Temp == PPP_HARD_CHAR) || (Temp == PPP_DLE_CHAR) || (Temp < 0x20))
{
HardDrive->Putch(PPP_DLE_CHAR);
HardDrive->Putch(Temp ^ PPP_DLE_XOR_CHAR);
}
else
{
HardDrive->Putch(*Buf);
}
Buf++;
}
Temp = Fcs % 256;
if ((Temp == PPP_HARD_CHAR) || (Temp == PPP_DLE_CHAR) || (Temp < 0x20))
{
HardDrive->Putch(PPP_DLE_CHAR);
HardDrive->Putch(Temp ^ PPP_DLE_XOR_CHAR);
}
else
{
HardDrive->Putch(Temp);
}
Temp = Fcs / 256;
if ((Temp == PPP_HARD_CHAR) || (Temp == PPP_DLE_CHAR) || (Temp < 0x20))
{
HardDrive->Putch(PPP_DLE_CHAR);
HardDrive->Putch(Temp ^ PPP_DLE_XOR_CHAR);
}
else
{
HardDrive->Putch(Temp);
}
HardDrive->Putch(PPP_HARD_CHAR);
/* 发送信号量 */
return TRUE;
}
return FALSE;
}
/*********************************************************************************************************
** 函数名称: PPPGetch()
** 功能描述: 接收一个字节
** 输 入: 无
** 输 出: 接收到的数据
** 全局变量: PPPUseHardDrive
** 调用模块: OSTaskSuspend
**
** 作 者: 陈明计
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 PPPGetch(NetHardDrivesSocket *HardDrive)
{
uint8 Temp,err;
while (1)
{
err = HardDrive->Getch(&Temp);
if (err == NO_ERR)
{
break;
}
}
return Temp;
}
/*********************************************************************************************************
** 函数名称: PPPDriverGetFrame()
** 功能描述: PPP驱动接收到数据帧处理
** 输 入: Fram :数据帧的起始地址
** NByte:数据帧大小
** 输 出: 无
** 全局变量: FramType
** 调用模块: PPPFcs16,IPReviceFram,ICPCReviceFram,PAPReviceFram,LCPReviceFram
**
** 作 者: 陈明计
** 日 期: 2004年4月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -