📄 icmp.c
字号:
/*==============================================*/
// ICMP协议程序
// FOR AVR DEV 1.0
// 版本: 1.0
// 作者: HAN 3366524@QQ.COM
// 日期: 2005年1月6日
// test ok, 2005/1/8
/*==============================================*/
#include "j60.h"
extern union netcard rxdnetbuf;
extern union netcard txdnetbuf;
extern union NetNode myNode;
extern unsigned int chksum(unsigned char *check,unsigned int size);
extern unsigned int Swap16U(unsigned int data16u);
/*==============================================*/
// 函数名称: PING应答
/*==============================================*/
void ping_answer(void)
{
unsigned int i;
unsigned int size;
unsigned int tosize;
union ethernet_address_type answeraddress;
// size = rxdnetbuf.etherframe.length;
// if(size == 60)
{
tosize = Swap16U(rxdnetbuf.ipframe.totallength) - 28; // real icmp data
size = tosize + 42;
}
if(rxdnetbuf.icmpframe.type == 0x08)
{ // 表示是ping请求
for (i = 16; i < (size+4); i++) // ADD form protocal
{ // 将数据复制到发送缓冲区
txdnetbuf.bytedata.bytebuf[i] = rxdnetbuf.bytedata.bytebuf[i];
}
for(i = 0; i < 6; i++)
{ // 源地址为目标地址
answeraddress.bytes[i] = rxdnetbuf.etherframe.sourcenodeid[i];
}
txdnetbuf.ipframe.ttl = txdnetbuf.ipframe.ttl - 1;
txdnetbuf.ipframe.crc = 0;
for(i = 0; i < 4; i++)
{
txdnetbuf.ipframe.destip[i] = rxdnetbuf.ipframe.sourceip[i];
txdnetbuf.ipframe.sourceip[i] = myNode.nodebytes.ipbytes[i];
}
txdnetbuf.ipframe.crc = 0xFFFF - chksum((txdnetbuf.bytedata.bytebuf + 18),20);
txdnetbuf.icmpframe.type = 0x00; // is icmp answer;
txdnetbuf.icmpframe.crc = 0;
txdnetbuf.icmpframe.crc = 0xFFFF - chksum((txdnetbuf.bytedata.bytebuf + 38),(size -34));
encPacketSend(&answeraddress,&txdnetbuf,size,IP_PACKET);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -