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

📄 ncp.c

📁 在S3C2440上运行的"电子日历“(支持平年,闰年,星期自动调整). 开发环境是RVDS2.2
💻 C
字号:
/**---------------------版权 (c)----------------------------------------------------------***
***                     作者:颜章健		                                              ***
***                     邮件:jenkinyan@163.com                                           ***
***                                                                                       ***
***---------------------File Info---------------------------------------------------------***
*** 创 建 人:			颜章健															  ***
*** 创建日期:			2008-03-13														  ***
*** 创建版本:																			  ***
*** 文件描述:			网络控制协议													  ***
***---------------------------------------------------------------------------------------***
*** 修 订 人:																			  ***
*** 修订日期:																			  ***
*** 修订版本:					      													  ***
*** 修订描述																			  ***
***---------------------------------------------------------------------------------------**/
#include "config.h"


NET_PKT		NcpData;
#ifdef	DEBUG
	static	char buf[100];
#endif



/********************************************************************************************
*** 函数名称:			
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
void	NcpPutFrame(uint8 Code)
{
	uint16			Length = 0;
	static	uint8	Id = 0;
	NCP_HEAD		head;
	NET_PKT			NcpPkt;
	NET_PKT			*p;
	
	p = &NcpData;
	while(p != NULL)
	{
		Length += p->Length;
		p  = p->Next;
	}
		
	head.s.Code 	= Code;
	head.s.Id		= Id++;
	Length      	= Length + 4;
	head.b[3]       = Length;
	head.b[2]       = Length >> 8;
	
	NcpPkt.Next   	= &NcpData;
	NcpPkt.Data   	= head.b;
	NcpPkt.Length 	= 4;		

	LinkLayer.PutFrame(PPPF_NCP,&NcpPkt);
}

/********************************************************************************************
*** 函数名称:	NcpRequest		
*** 函数描述:	NCP主动申请IP、DNS1	
*** 入    口:			
*** 出    口:			
********************************************************************************************/
const uint8	NcpReqFrame[] = 		// 顺序不可颠倒
{
	
	NCPO_IP,  0x06,0x00,0x00,0x00,0x00,	// 请求IP地址
	NCPO_DNS1,0x06,0x00,0x00,0x00,0x00,	// 请求DNS1
	NCPO_DNS2,0x06,0x00,0x00,0x00,0x00,	// 请求DNS2
	NCPO_GATE,0x06,0x00,0x00,0x00,0x00,	// 请求
	NCPO_SUB, 0x06,0x00,0x00,0x00,0x00	// 请求
};

void	NcpRequest(void)
{
	#ifdef	DEBUG
	_printf("请求网络地址\r\n");			
	#endif
	
	NcpData.Data    = (uint8 *)NcpReqFrame;
	NcpData.Length  = 18;
	NcpData.Next    = NULL;
	
	NcpPutFrame(NCPF_REQ);
}


/********************************************************************************************
*** 函数名称:	NcpNakProcess		
*** 函数描述:	ISP否认处理,用ISP建议的信息作请求		
*** 入    口:			
*** 出    口:			
********************************************************************************************/
void	NcpNakProcess(void)
{
	if(LinkLayer.Rxl > 0)
	{
		#ifdef	DEBUG
		_printf("ISP建议新地址,用新地址请求网络地址\r\n");			
		#endif		
		
		NcpData.Data   = LinkLayer.Rxd;
		NcpData.Length = LinkLayer.Rxl;
		NcpData.Next   = NULL;	
		
		NcpPutFrame(NCPF_REQ);
	}
}

/********************************************************************************************
*** 函数名称:	NcpRejProcess		
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
void	NcpRejProcess(void)
{
	uint8	*ptr;
	uint8	option,len;
	uint16	i;
	uint8	en;	// 从位0~5分别对应于IP,DNS1,DNS2,GATE,SUB
	
	#ifdef	DEBUG
	//uint8 j;
	#endif
	
	en = 0x1f;
	ptr = LinkLayer.Rxd;
	for(i=0; i<LinkLayer.Rxl; i++)
	{
		option = *ptr++;
		switch(option)
		{
			case	NCPO_IP:	// IP地址拒绝
				en &= 0x01;
				len = *ptr++;
				ptr = ptr + len - 2;
				#ifdef	DEBUG
				_printf("IP地址\r\n");			
				#endif
				break;
				
			case	NCPO_DNS1:	// DNS1拒绝
				en &= 0x02;
				len = *ptr++;
				ptr = ptr + len - 2;
				#ifdef	DEBUG
				_printf("DNS1\r\n");			
				#endif
				break;
			
			case	NCPO_DNS2:	// DNS2拒绝
				en &= 0x04;
				len = *ptr++;
				ptr = ptr + len - 2;
				#ifdef	DEBUG
				_printf("DNS2\r\n");			
				#endif
				break;
			
			case	NCPO_GATE:
				en &= 0x08;
				len = *ptr++;
				ptr = ptr + len - 2;
				#ifdef	DEBUG
				_printf("网关?\r\n");			
				#endif
				break;
				
			case	NCPO_SUB:
				en &= 0x10;
				len = *ptr++;
				ptr = ptr + len - 2;
				#ifdef	DEBUG
				_printf("子网掩码?\r\n");			
				#endif
				break;
			
			case	NCPO_VAN:
				len = *ptr++;
				ptr = ptr + len - 2;
				#ifdef	DEBUG
				_printf("VanJacobson压缩TCP/IP头\r\n");			
				#endif
				break;
				
			default:
				//len = *ptr++;
				//ptr = ptr + len - 2;
				#ifdef	DEBUG
				//_printf("未知类型选项:\r\n");
				
				//sprintf(buf,"%x ",*(ptr-1));
				//_printf(buf);
				
				
				//sprintf(buf,"%x ",len = *ptr++);
				//_printf(buf);
				
				/*
				for(j=0; j<len-2; j++)
				{
					sprintf(buf,"%x ",*ptr++);
					_printf(buf);
				}*/
				//_printf("\r\n");
							
				#endif
				break;
				
		}
	}
	#ifdef	DEBUG	
	_printf("\r\n");
	LinkLayer.Rxd -= 9;
	LinkLayer.Rxl += 12;
	for(i=0; i<LinkLayer.Rxl; i++)
	{
		sprintf(buf,"%02x ",*(LinkLayer.Rxd++));
		_printf(buf);
	}
	_printf("\r\n");
	_printf("继续请求IP\r\n");
	#endif
	NcpData.Data   = (uint8 *)NcpReqFrame;
	NcpData.Length = 12;
	NcpData.Next   = NULL;
	
	NcpPutFrame(NCPF_REQ);
}

/********************************************************************************************
*** 函数名称:			
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
void	NcpAckProcess(void)
{
	uint8	*ptr;
	uint8	option,len;
	uint16	i,Len;
	
	//#ifdef	DEBUG
	uint8	j;
	//#endif
	
	ptr = LinkLayer.Rxd;
	Len = LinkLayer.Rxl;
	

	for(i=0; i<Len; i++)
	{
		option = *ptr++;
		switch(option)
		{
			case	NCPO_IP:	// IP地址
				len = *ptr++;
				//#ifdef	DEBUG
				_printf("IP:");
				//#endif	
				LinkLayer.Config.Ip[0] = *ptr++;
				LinkLayer.Config.Ip[1] = *ptr++;
				LinkLayer.Config.Ip[2] = *ptr++;
				LinkLayer.Config.Ip[3] = *ptr++;
				LinkLayer.Config.Ip[4] = 1;
				ptr = ptr + len - 6;
				
				//#ifdef	DEBUG
				for(j=0; j<4; j++)
				{
					Printf("%d.",LinkLayer.Config.Ip[j]);
				}
				_printf("\r\n");		
				//#endif
				LinkLayer.State = PPPS_OPENED;
				break;
				
			case	NCPO_DNS1:	// DNS1
				len = *ptr++;
				//#ifdef	DEBUG
				_printf("DNS1:");
				//#endif
				LinkLayer.Config.DNS1[0] = *ptr++;
				LinkLayer.Config.DNS1[1] = *ptr++;
				LinkLayer.Config.DNS1[2] = *ptr++;
				LinkLayer.Config.DNS1[3] = *ptr++;
				LinkLayer.Config.DNS1[4] = 1;
				ptr = ptr + len - 6;
				//#ifdef	DEBUG	
				for(j=0; j<4; j++)
				{
					Printf("%d.",LinkLayer.Config.DNS1[j]);
				}
				_printf("\r\n");		
				//#endif
				break;
			
			case	NCPO_DNS2:	// DNS2
				len = *ptr++;
				//#ifdef	DEBUG
				_printf("DNS2:");
				//#endif
				LinkLayer.Config.DNS2[0] = *ptr++;
				LinkLayer.Config.DNS2[1] = *ptr++;
				LinkLayer.Config.DNS2[2] = *ptr++;
				LinkLayer.Config.DNS2[3] = *ptr++;
				LinkLayer.Config.DNS2[4] = 1;
				ptr = ptr + len - 6;
				//#ifdef	DEBUG
				for(j=0; j<4; j++)
				{
					Printf("%d.",LinkLayer.Config.DNS2[j]);
				}
				_printf("\r\n");			
				//#endif
				break;
			
			case	NCPO_GATE:
				len = *ptr++;
				#ifdef	DEBUG
				_printf("获得网关:");
				#endif
				LinkLayer.Config.Gate[0] = *ptr++;
				LinkLayer.Config.Gate[1] = *ptr++;
				LinkLayer.Config.Gate[2] = *ptr++;
				LinkLayer.Config.Gate[3] = *ptr++;
				LinkLayer.Config.Gate[4] = 1;
				ptr = ptr + len - 6;
				#ifdef	DEBUG
				for(j=0; j<4; j++)
				{
					sprintf(buf,"%3d.",LinkLayer.Config.Gate[j]);
					_printf(buf);
				}
				_printf("\r\n");		
				#endif
				break;
				
			case	NCPO_SUB:
				len = *ptr++;
				#ifdef	DEBUG
				_printf("获得子网掩码:");
				#endif
				LinkLayer.Config.Mask[0] = *ptr++;
				LinkLayer.Config.Mask[1] = *ptr++;
				LinkLayer.Config.Mask[2] = *ptr++;
				LinkLayer.Config.Mask[3] = *ptr++;
				LinkLayer.Config.Mask[4] = 1;
				ptr = ptr + len - 6;
				#ifdef	DEBUG
				for(j=0; j<4; j++)
				{
					sprintf(buf,"%3d.",LinkLayer.Config.Mask[j]);
					_printf(buf);
				}
				_printf("\r\n");		
				#endif
				break;
				
			default:
				len = *ptr++;
				ptr = ptr + len - 2;
				#ifdef	DEBUG
				//_printf("未知数据\r\n");
				#endif
				break;
				
		}
	}
}


/********************************************************************************************
*** 函数名称:			
*** 函数描述:	
*** 入    口:			
*** 出    口:			
********************************************************************************************/
void	NcpReqProcess(void)
{
	if(LinkLayer.Rxl > 0)
	{
		NcpData.Data   = LinkLayer.Rxd;
		NcpData.Length = LinkLayer.Rxl;
		NcpData.Next   = NULL;			
		NcpPutFrame(NCPF_ACK);
	}
}


/********************************************************************************************
*** 函数名称:			
*** 函数描述:	
*** 入    口:			
*** 出    口:			
********************************************************************************************/
void	NcpProcess(void)
{
	uint8	Code;

	Code	 = *LinkLayer.Rxd;
	LinkLayer.Rxd += 4;
	LinkLayer.Rxl -= 4;
	
	switch(Code)
	{
		case	NCPF_REQ:
			NcpReqProcess();
			break;	
				
		case	NCPF_ACK:
			NcpAckProcess();
			break;
			
		case	NCPF_NAK:
			#ifdef	DEBUG
			_printf("ISP否认申请地址\r\n");			
			#endif
			NcpNakProcess();
			break;
		
		case	NCPF_REJ:
			#ifdef	DEBUG
			_printf("拒绝\r\n");			
			#endif
			//NcpRejProcess();
			break;
			
		default:
			break;
	}
}

/********************************************************************************************
*** 					文件结束														  ***	
********************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -