📄 lcp.c
字号:
/**---------------------版权 (c)----------------------------------------------------------***
*** 作者:颜章健 ***
*** 邮件:jenkinyan@163.com ***
*** ***
***---------------------File Info---------------------------------------------------------***
*** 创 建 人: 颜章健 ***
*** 创建日期: 2008-03-08 ***
*** 创建版本: ***
*** 文件描述: 链路控制协议 ***
***---------------------------------------------------------------------------------------***
*** 修 订 人: ***
*** 修订日期: ***
*** 修订版本: ***
*** 修订描述: ***
***---------------------------------------------------------------------------------------**/
#include "config.h"
NET_PKT LcpData;
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void LcpPutFrame(uint8 Code)
{
uint16 Length;
static uint8 Id = 0;
LCP_HEAD head;
NET_PKT LcpPkt;
head.s.Code = Code;
head.s.Id = Id++;
Length = LcpData.Length + 4;
head.b[3] = Length;
head.b[2] = Length >> 8;
LcpPkt.Next = &LcpData;
LcpPkt.Data = head.b;
LcpPkt.Length = 4;
LinkLayer.PutFrame(PPPF_LCP,&LcpPkt);
}
/********************************************************************************************
*** 函数名称: LcpTerReqProcess
*** 函数描述: 关闭请求处理
*** 入 口:
*** 出 口:
********************************************************************************************/
void LcpTerReqProcess(void)
{
LcpData.Data = LinkLayer.Rxd;
LcpData.Length = LinkLayer.Rxl;
LcpData.Next = NULL;
#ifdef DEBUG
_printf("同意关闭MODEM\r\n");
#endif
LcpPutFrame(LCPF_TERMA);
LinkLayer.State = PPPS_CLOSED;
#ifdef DEBUG
_printf("已经关闭MODEM\r\n");
#endif
PhyLayer.Close();
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void LcpEchoReqProcess(void)
{
#ifdef DEBUG
_printf("回显应答\r\n");
#endif
LcpData.Data = LinkLayer.Rxd;
LcpData.Length = LinkLayer.Rxl;
LcpData.Next = NULL;
*LinkLayer.Rxd = rand();
*LinkLayer.Rxd = rand();
*LinkLayer.Rxd = rand();
*LinkLayer.Rxd = rand();
LcpPutFrame(LCPF_ECHOA);
}
/********************************************************************************************
*** 函数名称: LcpCfgReqReceiveTaks
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
const uint8 PapReq[4] = {0x03,0x04,0xc0,0x23};
const uint8 MagReq[6] = {0x05,0x06,0x00,0x0a,0x00,0x00};
void LcpCfgReqProcess(void)
{
uint8 *ptr;
uint8 option,len,RCR_G;
uint16 i;
union {uint16 w; uint8 b[2];}value;
uint8 ap = PPPS_PAP;
ptr = LinkLayer.Rxd;
// 构造应答数据帧
RCR_G = 1;
LcpData.Data = LinkLayer.Rxd;
LcpData.Length = LinkLayer.Rxl;
LcpData.Next = NULL;
for(i=0; i<LinkLayer.Rxl; i++)
{
option = *ptr++;
switch(option)
{
case 1: // 最大接收单元MRU协商
len = *ptr++;
ptr = ptr + len - 2;
break;
case 2: // 异步控制字符映射协商
len = *ptr++;
if(*ptr++ == 0x00)
if(*ptr++ == 0x0a)
if(*ptr++ == 0x00)
if(*ptr++ == 0x00)
{
ptr = ptr + len - 6;
break;
}
#ifdef DEBUG
_printf("拒绝异步控制字符映射\r\n");
#endif
RCR_G = 0;
LcpData.Data = ptr - 6;
LcpData.Length = len;
LcpPutFrame(LCPF_CFGJ);
LcpData.Data = (uint8 *)MagReq;
LcpData.Length = 6;
LcpPutFrame(LCPF_CFGR);
ptr = ptr + len - 6;
break;
case 3: // 认证方式协商
len = *ptr++;
value.b[1] = *ptr++;
value.b[0] = *ptr++;
if(value.w == 0xc023) // PAP认证方式
{
#ifdef DEBUG
_printf("接受PAP认证方式\r\n");
#endif
ap = PPPS_PAP;
//ptr = ptr + len - 4;
}
else // CHAP认证方式
{
ap = PPPS_CHAP;
/*
#ifdef DEBUG
_printf("接收CHAP认证方式\r\n");
#endif
ptr = ptr + len - 4;
*/
#ifdef DEBUG
_printf("拒绝CHAP认证方式\r\n");
#endif
RCR_G = 0;
LcpData.Data = ptr - 4;
LcpData.Length = len;
LcpPutFrame(LCPF_CFGJ); // 拒绝CHAP方式
#ifdef DEBUG
//_printf("请求PAP认证方式\r\n");
#endif
LcpData.Data = (uint8 *)PapReq;
LcpData.Length = 4;
LcpPutFrame(LCPF_CFGR); // 请求PAP方式
}
ptr = ptr + len - 4;
break;
case 4: // 链路质量协议协商
len = *ptr++;
ptr = ptr + len - 2;
break;
case 5: // 魔术字
len = *ptr++;
*ptr++ = rand();
*ptr++ = rand();
*ptr++ = rand();
*ptr++ = rand();
ptr = ptr + len - 6;
break;
case 7: // 协议域压缩
len = *ptr++;
ptr = ptr + len - 2;
break;
case 8: // 地址域和控制域压缩
len = *ptr++;
ptr = ptr + len - 2;
break;
default: // 无定义
break;
}
}
if(RCR_G == 1)
{
#ifdef DEBUG
_printf("\r\n");
_printf("PPP进入验证阶段:");
#endif
LcpPutFrame(LCPF_CFGA);
LinkLayer.State = ap;
if(ap == PPPS_PAP)
{
PapRequest();
}
if(ap == PPPS_CHAP)
{
ChapChallenge();
}
}
}
/********************************************************************************************
*** 函数名称: LcpCfgAckProcess
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void LcpCfgAckProcess(void)
{
uint8 *ptr;
uint8 option,len;
uint16 i;
//union {uint16 w; uint8 b[2];}value;
ptr = LinkLayer.Rxd;
for(i=0; i<LinkLayer.Rxl; i++)
{
option = *ptr++;
switch(option)
{
case 1: // 最大接收单元MRU协商
len = *ptr++;
ptr = ptr + len - 2;
break;
case 2: // 异步控制字符映射协商
len = *ptr++;
ptr = ptr + len - 2;
break;
case 3: // 认证方式协商
len = *ptr++;
//value.b[1] = *ptr++;
//value.b[0] = *ptr++;
//LinkLayer.Config.AP = value.w;
ptr = ptr + len - 2;
break;
case 4: // 链路质量协议协商
len = *ptr++;
ptr = ptr + len - 2;
break;
case 5: // 魔术字
len = *ptr++;
ptr = ptr + len - 2;
break;
case 7: // 协议域压缩
len = *ptr++;
ptr = ptr + len - 2;
break;
case 8: // 地址域和控制域压缩
len = *ptr++;
ptr = ptr + len - 2;
break;
default: // 无定义
break;
}
}
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void LcpProcess(void)
{
uint8 Code;
Code = *LinkLayer.Rxd;
LinkLayer.Rxd += 4;
LinkLayer.Rxl -= 4;
switch(Code)
{
case LCPF_CFGR: // 配置请求包
#ifdef DEBUG
_printf("配置请求-");
#endif
LcpCfgReqProcess();
break;
case LCPF_TERMR: // 关闭请求
#ifdef DEBUG
_printf("关闭请求-");
#endif
LcpTerReqProcess();
break;
case LCPF_TERMA: // 关闭应答
#ifdef DEBUG
_printf("关闭应答\r\n");
#endif
LinkLayer.State = PPPS_CLOSED;
PhyLayer.Close();
break;
case LCPF_ECHOR: // 回显请求
#ifdef DEBUG
_printf("回显请求-");
#endif
LcpEchoReqProcess();
break;
case LCPF_CFGA: // 配置应答
#ifdef DEBUG
//_printf("配置应答\r\n");
#endif
LcpCfgAckProcess();
break;
case LCPF_CFGN: // 配置否认
#ifdef DEBUG
_printf("配置否认\r\n");
#endif
break;
case LCPF_CFGJ: // 配置拒绝
#ifdef DEBUG
_printf("配置拒绝\r\n");
#endif
break;
case LCPF_CODEJ: // 数据包拒绝
#ifdef DEBUG
_printf("数据包拒绝\r\n");
#endif
break;
case LCPF_PROTJ: // 协议拒绝
#ifdef DEBUG
_printf("协议拒绝\r\n");
#endif
break;
case LCPF_ECHOA: // 回显应答
#ifdef DEBUG
_printf("回显应答\r\n");
#endif
break;
case LCPF_DISCR: // Discard-Request
#ifdef DEBUG
_printf("未知数据包\r\n");
#endif
break;
default :
#ifdef DEBUG
_printf("未知数据包\r\n");
#endif
break;
}
}
/********************************************************************************************
*** 文件结束 ***
********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -