📄 ipcp.c
字号:
/****************************************Copyright (c)**************************************************
** 广州周立功单片机发展有限公司
** 研 究 所
** 产品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: ipcp.h
**创 建 人: 陈明计
**最后修改日期: 2004年4月23日
**描 述: 端对端协议网间协议控制协议(IPCP)处理程序
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版 本: 0.10b
** 日 期: 2004年4月23日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_IPCP
#include "config.h"
extern uint8 PPPStateTransitionTable[MAX_PPP_EVENT][MAX_PPP_STATE];
extern uint8 PPPActionsTable[MAX_PPP_EVENT][MAX_PPP_STATE];
uint8 IPCPFlag;
uint8 IpcpCfg[] = {
PPP_FRAM_TYPE__IPCP / 256, PPP_FRAM_TYPE__IPCP % 256,
0x01, 0x00,
0x00, 0x04,
0x03, 0x06, 0x00, 0x00, 0x00, 0x00
};
void IPCPSendCFG(PppData *ThisPPP)
{
IpcpCfg[3] = ThisPPP->FramID++;
SendCfgFram(ThisPPP, IpcpCfg);
}
void IPCPOpen(PppData *ThisPPP)
{
IPCPFlag = IPCP_STATE_REQ_SEND;
IPCPSendCFG(ThisPPP);
}
void IPCPClose(PppData *ThisPPP)
{
ThisPPP = ThisPPP;
IPCPFlag = IPCP_STATE_STOPED;
IpcpCfg[5] = 0x04;
IpcpCfg[8] = 0;
IpcpCfg[9] = 0;
IpcpCfg[10] = 0;
IpcpCfg[11] = 0;
PPPClose();
}
uint8 IPCPReviceCfg(uint8 *Frame)
{
int16 Sum, SendSum;
uint8 temp, Ret, err;
uint8 *cp;
uint8 *cp2;
cp = Frame + 4;
Sum = cp[0] * 256 + cp[1] - 4;
cp += 2;
Ret = 0;
cp2 = cp;
SendSum = 4;
while (Sum > 0)
{
err = 0;
Sum -= cp[1];
switch (*cp)
{
case 3:
if (cp[1] == 0x06)
{
IpcpCfg[5] = 0x0a;
IpcpCfg[8] = cp[2];
IpcpCfg[9] = cp[3];
IpcpCfg[10] = cp[4];
IpcpCfg[11] = cp[5];
}
else
{
err =1;
}
break;
default:
err = 1;
break;
}
if (err == 1)
{
Ret = 1;
*cp2++ = *cp++;
temp = *cp;
SendSum += temp;
for (temp--; temp > 0; temp--)
{
*cp2++ = *cp++;
}
}
else
{
cp += cp[1];
}
}
if (Ret == 1)
{
Frame[2] = 0x04;
Frame[4] = SendSum / 256;
Frame[5] = SendSum % 256;
}
return Ret;
}
void IPCPGetCfg(PppData *ThisPPP, uint8 *Frame)
{
if ((Frame[0] == (PPP_FRAM_TYPE__IPCP / 256)) &&
(Frame[1] == (PPP_FRAM_TYPE__IPCP % 256)))
{
switch (Frame[2])
{
case LCP_CFG_REQ:
if (IPCPReviceCfg(Frame) == 1)
{
LCPSendCfgNak(ThisPPP, Frame);
}
else
{
LCPSendCfgAck(ThisPPP, Frame);
IPCPFlag = IPCP_STATE_ACK_SEND;
}
break;
case LCP_CFG_ACK:
if (IPCPFlag == IPCP_STATE_ACK_SEND)
{
PPP_zrc(Frame, 0);
IPCPFlag = IPCP_STATE_OPENED;
IPCPReviceCfg(Frame);
// PC_DispChar (20, 20, '-', DISP_FGND_WHITE);
// IPOpen();
}
else
{
IPCPSendCFG(ThisPPP);
IPCPFlag = IPCP_STATE_ACK_RCVD;
}
break;
case LCP_CFG_NAK:
if (Frame[6] == 0x03 && Frame[7] == 0x06)
{
IpcpCfg[5] = 0x0a;
IpcpCfg[8] = Frame[8];
IpcpCfg[9] = Frame[9];
IpcpCfg[10] = Frame[10];
IpcpCfg[11] = Frame[11];
}
/* 没有break不是错误 */
case LCP_CFG_REJ:
IPCPSendCFG(ThisPPP);
if (IPCPFlag == IPCP_STATE_ACK_SEND)
{
PPP_irc(Frame, 0);
}
else
{
IPCPFlag = IPCP_STATE_ACK_RCVD;
}
break;
// case LCP_TERM_REQ:
// LCPSendTermAck(ThisPPP, Frame);
// IPCPClose(ThisPPP);
// break;
// case LCP_TERM_ACK:
// IPCPClose(ThisPPP);
// break;
default :
break;
}
}
}
void IPCPGetFrame(PppData *ThisPPP, uint8 *Frame, uint8 Q)
{
//PC_DispChar (0, 0, IPCPFlag + '0', DISP_FGND_WHITE);
if ((IPCPFlag == IPCP_STATE_OPENED) && (Frame[0] == (PPP_FRAM_TYPE__IP / 256)) &&
(Frame[1] == (PPP_FRAM_TYPE__IP % 256)))
{
IPGetFrame(Frame + 2);
// PC_DispChar (1, 1, '+', DISP_FGND_WHITE);
}
else
{
switch (Q)
{
case PPP_EVENT_TO_R:
if (IPCPFlag != IPCP_STATE_STOPED && IPCPFlag != IPCP_STATE_OPENED)
{
IPCPSendCFG(ThisPPP);
}
break;
case PPP_EVENT_TO_E:
IPCPClose(ThisPPP);
break;
case PPP_EVENT_UP_LAYER:
IPCPGetCfg(ThisPPP, Frame);
break;
default:
break;
}
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -