📄 ping.c
字号:
#define IN_PING
#include "config.h"
extern void OSPuts(char *cp);
extern uint8 IpcpCfg[];
extern NetHardDrivesSocket ModemDrive;
uint8 ICMPDataBuf[1500];
uint16 ChkSum(uint16 SumFirst, uint16 *Data, uint16 Length)
{
uint32 Sum;
Sum = 0;
Sum += SumFirst;
while(Length > 1)
{
Sum += *Data++;
Length -= 2;
}
if(Length > 0)
{
Sum += *(uint8 *)Data;
}
while(Sum>>16)
{
Sum = (Sum & 0xffff) + ((Sum >> 16) & 0xffff);
}
return ~Sum;
}
void PingAnswer(uint8 *Frame)
{
union Netcard *np;
uint16 NByte;
uint8 temp,i;
np = (union Netcard *)Frame;
NByte = np->IpFrame.TotalLen[0] * 256 | np->IpFrame.TotalLen[1];
np->IpFrame.ttl--;
for (i = 0; i < 4; i++)
{
temp = np->IpFrame.SourceIp[i];
np->IpFrame.SourceIp[i] = np->IpFrame.DestIp[i];
np->IpFrame.DestIp[i] = temp;
}
np->IpFrame.Sum = 0;
np->IpFrame.Sum = ChkSum(0, np->WordBuf, 20);
np->IcmpFrame.type = 0;
np->IcmpFrame.Sum = 0;
np->IcmpFrame.Sum = ChkSum(0, np->WordBuf + 10, NByte - 20);
np->IcmpFrame.type = 0x00;
PPPDriveWrite(&ModemDrive, Frame - 2, NByte + 2);
}
void IPGetFrame(uint8 *Frame)
{
union Netcard *np;
// int8 s[200];
np = (union Netcard *)Frame;
if (((np->IpFrame.VerandIphLen) & 0xf0) == 0x40)
{
switch(np->IpFrame.NextProtocal)
{
case 1://表示为icmp协议
//sprintf(s, "Get a ICMP Frame From %u.%u.%u.%u to %u.%u.%u.%u\n",
// np->IpFrame.SourceIp[0], np->IpFrame.SourceIp[1],
// np->IpFrame.SourceIp[2], np->IpFrame.SourceIp[3],
// np->IpFrame.DestIp[0], np->IpFrame.DestIp[1],
// np->IpFrame.DestIp[2], np->IpFrame.DestIp[3]);
//OSPuts(s);
if((np->IcmpFrame.type) == 8) //是一个ping的请求包
{
//OSPuts("Get a ping request\n");
PingAnswer(Frame);
}
else if(np->IcmpFrame.type == 0)
{
//OSPuts("Get a ping Answer\n");
OSTimeDlyResume(22);
} //是一个ping的应答包
break;
case 6: //表示是tcp协议
// OSPuts("Get a TCP Frame\n");
break;
case 0x11: //表示是udp协议
// OSPuts("Get a UDP Frame\n");
break;
default:
break;
}
}
}
uint16 IPFrameIndex = 0;
void Ping(void *Pdata)
{
uint8 *cp;
union Netcard * ICMPData;
uint32 Now;
uint8 i;
char s[80];
cp = (uint8 *)Pdata;
IPFrameIndex = 0;
ICMPData = (union Netcard *)(ICMPDataBuf + 2);
ICMPDataBuf[0] = 0x00;
ICMPDataBuf[1] = 0x21;
ICMPData->IpFrame.VerandIphLen = 0x45;
ICMPData->IpFrame.ServerType = 0;
ICMPData->IpFrame.TotalLen[0] = 0;
ICMPData->IpFrame.TotalLen[1] = 60;
ICMPData->IpFrame.ttl = 0x80;
ICMPData->IpFrame.Segment[0] =0;
ICMPData->IpFrame.Segment[1] =0;
ICMPData->IpFrame.NextProtocal = 0x01;
ICMPData->IpFrame.SourceIp[0] = IpcpCfg[8];
ICMPData->IpFrame.SourceIp[1] = IpcpCfg[9];
ICMPData->IpFrame.SourceIp[2] = IpcpCfg[10];
ICMPData->IpFrame.SourceIp[3] = IpcpCfg[11];
// ICMPData->IpFrame.DestIp[0] = 192;
// ICMPData->IpFrame.DestIp[1] = 168;
// ICMPData->IpFrame.DestIp[2] = 0;
// ICMPData->IpFrame.DestIp[3] = 2;
ICMPData->IpFrame.DestIp[0] = *cp++;
ICMPData->IpFrame.DestIp[1] = *cp++;
ICMPData->IpFrame.DestIp[2] = *cp++;
ICMPData->IpFrame.DestIp[3] = *cp;
ICMPData->IcmpFrame.type = 0x08;
ICMPData->IcmpFrame.option = 0;
ICMPData->IcmpFrame.id[0] = 0x03;
ICMPData->IcmpFrame.id[1] = 0x00;
cp -= 3;
sprintf(s, "ping %u.%u.%u.%u...\n", cp[0], cp[1], cp[2], cp[3]);
OSPuts(s);
/*
for (i = 0; i < 40; i++)
{
ICMPData->IpFrame.ttl = i + 1;
ICMPData->IpFrame.FrameIndex[0] = IPFrameIndex / 256;
ICMPData->IpFrame.FrameIndex[1] = IPFrameIndex % 256;
ICMPData->IpFrame.Sum = 0;
ICMPData->IpFrame.Sum = ChkSum(0, ICMPData->WordBuf, 20);
ICMPData->IcmpFrame.seq[0] = IPFrameIndex / 256;
ICMPData->IcmpFrame.seq[1] = IPFrameIndex % 256;
ICMPData->IcmpFrame.Sum = 0;
ICMPData->IcmpFrame.Sum = ChkSum(0, ICMPData->WordBuf + 10, 40);
IPFrameIndex++;
PPPDriveWrite(&ModemDrive, ICMPDataBuf, 62);
Now = OSTimeGet();
OSTimeDly(OS_TICKS_PER_SEC * 2);
Now = (OSTimeGet() - Now) * (1000 / OS_TICKS_PER_SEC);
if(Now < 2000)
{
sprintf(s, "Reply Form %u.%u.%u.%u; time = %ums\n", cp[0], cp[1], cp[2], cp[3], Now);
OSPuts(s);
}
else
{
OSPuts("Ping Time Out\n");
}
}
*/
for (i = 0; i < 4; i++)
{
ICMPData->IpFrame.FrameIndex[0] = IPFrameIndex / 256;
ICMPData->IpFrame.FrameIndex[1] = IPFrameIndex % 256;
ICMPData->IpFrame.Sum = 0;
ICMPData->IpFrame.Sum = ChkSum(0, ICMPData->WordBuf, 20);
ICMPData->IcmpFrame.seq[0] = IPFrameIndex / 256;
ICMPData->IcmpFrame.seq[1] = IPFrameIndex % 256;
ICMPData->IcmpFrame.Sum = 0;
ICMPData->IcmpFrame.Sum = ChkSum(0, ICMPData->WordBuf + 10, 40);
IPFrameIndex++;
PPPDriveWrite(&ModemDrive, ICMPDataBuf, 62);
Now = OSTimeGet();
OSTimeDly(OS_TICKS_PER_SEC * 2);
Now = (OSTimeGet() - Now) * (1000 / OS_TICKS_PER_SEC);
if(Now < 2000)
{
sprintf(s, "Reply Form %u.%u.%u.%u; time = %ums\n", cp[0], cp[1], cp[2], cp[3], Now);
OSPuts(s);
}
else
{
OSPuts("Ping Time Out\n");
}
}
OSPuts("Ping exit\n");
OSTaskDel(OS_PRIO_SELF);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -