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

📄 lcp.c

📁 在S3C2440上运行的"电子日历“(支持平年,闰年,星期自动调整). 开发环境是RVDS2.2
💻 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 + -