📄 icmp.c
字号:
/********************************************************************
* File: ICMP.c
*
* Copyright: Peak Microtech Corporation
*
*******************************************************************/
#define ICMP_GLOBALS
#include "NET_CFG.H"
const char IcmpData[32] =
{
0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d,
0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x61, 0x62,
0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69
};
// send ping command request
void Ping_Request()
{
int i;
TxdNetBuff.EtherFrame.DestMacId[0] = Ping_MAC.words[0];
// Fill etherframe destination MAC address
TxdNetBuff.EtherFrame.DestMacId[1] = Ping_MAC.words[1];
TxdNetBuff.EtherFrame.DestMacId[2] = Ping_MAC.words[2];
TxdNetBuff.EtherFrame.NextProtocal = 0x0008; // IP protocol ID
TxdNetBuff.IpFrame.VerandIphLen = 0x45;
TxdNetBuff.IpFrame.ServerType = 0x00; // Service Type: default is 0
TxdNetBuff.IpFrame.TotalLen = 0x3C00; //The total length of IP packet is 40 byte
TxdNetBuff.IpFrame.ttl = 0x80; // Set IP TTL
TxdNetBuff.IpFrame.FrameIndex = FrameIndex; // Frame Number
FrameIndex++; //
TxdNetBuff.IpFrame.Segment = 0x0000;
TxdNetBuff.IpFrame.NextProtocal = 0x01; // ICMP protocol ID
TxdNetBuff.IpFrame.Crc = 0;
TxdNetBuff.IpFrame.DestId[0] = Ping_Ip_Address.words[0];
TxdNetBuff.IpFrame.DestId[1] = Ping_Ip_Address.words[1];
TxdNetBuff.IpFrame.SourceIp[0] = My_Ip_Address.words[0];
TxdNetBuff.IpFrame.SourceIp[1] = My_Ip_Address.words[1];
// Create IP header CRC
TxdNetBuff.IpFrame.Crc = CreateIpHeadCrc();
TxdNetBuff.IcmpFrame.type = 0x08; // Ping request
TxdNetBuff.IcmpFrame.option = 0x00;
TxdNetBuff.IcmpFrame.Crc = 0;
TxdNetBuff.IcmpFrame.id = 0x0002;
TxdNetBuff.IcmpFrame.seq = FrameIndex; //ICMP Frame Number
for (i = 0; i < 32; i++)
{
TxdNetBuff.IcmpFrame.icmpdata[i] = IcmpData[i];
}
TxdNetBuff.IcmpFrame.Crc = CreateIcmpCrc();
Send_Packet(&TxdNetBuff, 74); // Send data packet
}
// Ping answer
void Ping_Answer()
{
uchar i;
U16 length;
if (RxdNetBuff.IcmpFrame.type == 0x08)
// Ping request type ID
{
length = RxdNetBuff.EtherFrame.length;
length = length >> 8;
for (i = 16; i < length; i++)
{
// Copy data to Tx Buffer
TxdNetBuff.bytes.bytebuf[i] = RxdNetBuff.bytes.bytebuf[i];
}
TxdNetBuff.EtherFrame.DestMacId[0] = RxdNetBuff.EtherFrame.SourceMacId[0];
TxdNetBuff.EtherFrame.DestMacId[1] = RxdNetBuff.EtherFrame.SourceMacId[1];
TxdNetBuff.EtherFrame.DestMacId[2] = RxdNetBuff.EtherFrame.SourceMacId[2];
// The life of IP packet dec 1
TxdNetBuff.IpFrame.ttl = TxdNetBuff.IpFrame.ttl - 1;
TxdNetBuff.IpFrame.Crc = 0;
TxdNetBuff.IpFrame.DestId[0] = RxdNetBuff.IpFrame.SourceIp[0];
TxdNetBuff.IpFrame.DestId[1] = RxdNetBuff.IpFrame.SourceIp[1];
TxdNetBuff.IpFrame.SourceIp[0] = My_Ip_Address.words[0];
TxdNetBuff.IpFrame.SourceIp[1] = My_Ip_Address.words[1];
TxdNetBuff.IpFrame.Crc = CreateIpHeadCrc();
TxdNetBuff.IcmpFrame.type = 0x00; // 00 is ICMP answer
TxdNetBuff.IcmpFrame.Crc = 0;
for (i = 21; i < 41; i++)
{
TxdNetBuff.words.wordbuf[i] = RxdNetBuff.words.wordbuf[i];
}
TxdNetBuff.IcmpFrame.Crc = CreateIcmpCrc();
Send_Packet(&TxdNetBuff, length);
}
}
// ping reply
void Ping_Echo()
{
union Ip_Address_Type ip;
ip.words[0] = RxdNetBuff.IpFrame.SourceIp[0];
ip.words[1] = RxdNetBuff.IpFrame.SourceIp[1];
UartPrintfCh1("\r\n Reply From IP=");
Printf_IPStr(ip);
UartPrintfCh1(" Bytes=32 ");
UartPrintfCh1("TTL=");
Printf_Hex(RxdNetBuff.IpFrame.ttl);
UartPrintfCh1("\r\n");
}
// Deal with ping packet
void Process_Ping()
{
if (Ping_Count > 0)
{
Ping_Count--;
if (Ping_Count > 0)
{
if ((Ping_IP_TTL > 0) || (Gateway_IP_TTL > 0))
// After ARP request, ARP answer will set some global var
// Ping_IP_TTL > 0 : one pc ping answer
// Gateway_IP_TTL > 0 : gate ping anser
{
// IP address has been parse
UartPrintfCh1("\r\nSend Ping Request...");
Ping_Request();
}
else
{
// IP address hasn't been parse
UartPrintfCh1("\r\nSend ARP Request...\r\n ");
Arp_Request(Ping_Ip_Address.dwords);
}
if (Ping_Ip_Address.dwords == My_Ip_Address.dwords)
// Ping IP = My IP
{
UartPrintfCh1("\r\nReply From IP=");
Printf_IPStr(My_Ip_Address);
UartPrintfCh1(" Bytes=32 ");
UartPrintfCh1("TTL=10");
}
}
if (Ping_Count == 0)
{
if (((Ping_Ip_Address.dwords != My_Ip_Address.dwords) &(Ping_IP_TTL == 0))
|| ((Ping_Ip_Address.dwords = Gateway_Ip_Address.dwords) &(Gateway_IP_TTL
== 0)))
UartPrintfCh1("\r\nRequest Timed out.\r\n");
UartPrintfCh1("\r\nPing Command Finished.\r\n");
Ping_IP_TTL = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -