📄 ncp.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 + -