📄 icmp.c
字号:
#include <string.h>
#include "tcptask.h"
/*
* ICMP packet definition
*/
typedef struct _ICMP_PACKET
{
BYTE Type;
BYTE Code;
WORD Checksum;
WORD Identifier;
WORD SequenceNumber;
BYTE Data[MAX_ICMP_DATA];
} ICMP_PACKET;
#define ICMP_HEADER_SIZE (sizeof(ICMP_PACKET) - MAX_ICMP_DATA)
void SwapICMPPacket(ICMP_PACKET* p);
/*********************************************************************
* Function: BOOL ICMPGet(ICMP_CODE *code,
* BYTE *data,
* BYTE *len,
* WORD *id,
* WORD *seq)
*
* PreCondition: MAC buffer contains ICMP type packet.
*
* Input: code - Buffer to hold ICMP code value
* data - Buffer to hold ICMP data
* len - Buffer to hold ICMP data length
* id - Buffer to hold ICMP id
* seq - Buffer to hold ICMP seq
*
* Output: TRUE if valid ICMP packet was received
* FALSE otherwise.
*
* Side Effects: None
*
* Overview: None
*
* Note: None
********************************************************************/
BOOL ICMPGet(ICMP_CODE *code,
BYTE *data,
BYTE *len,
WORD *id,
WORD *seq)
{
ICMP_PACKET packet;
WORD checksums[2];
WORD CalcChecksum;
WORD ReceivedChecksum;
char i,j;
BYTE *c;
MACGetArray((BYTE*)&packet, ICMP_HEADER_SIZE);
c=(BYTE*)&packet;
for(i=0;i<8;i++)
{
while(!TXSTAbits.TRMT);
putcUSART(*(c++));
}
ReceivedChecksum = packet.Checksum;
packet.Checksum = 0;
checksums[0] = ~CalcIPChecksum((BYTE*)&packet, ICMP_HEADER_SIZE);
*len -= ICMP_HEADER_SIZE;
MACGetArray(data, *len);
if((*len)>0)
{ c=data;
j=*len;
for(i=0;i<j;i++)
{
while(!TXSTAbits.TRMT);
putcUSART(*(c++));
}
}
checksums[1] = ~CalcIPChecksum(data, *len);
CalcChecksum = CalcIPChecksum((BYTE*)checksums, 2 * sizeof(WORD));
SwapICMPPacket(&packet);
*code = packet.Type;
*id = packet.Identifier;
*seq = packet.SequenceNumber;
return ( CalcChecksum == ReceivedChecksum );
}
/*********************************************************************
* Function: void ICMPPut(NODE_INFO *remote,
* ICMP_CODE code,
* BYTE *data,
* BYTE len,
* WORD id,
* WORD seq)
*
* PreCondition: ICMPIsTxReady() == TRUE
*
* Input: remote - Remote node info
* code - ICMP_ECHO_REPLY or ICMP_ECHO_REQUEST
* data - Data bytes
* len - Number of bytes to send
* id - ICMP identifier
* seq - ICMP sequence number
*
* Output: None
*
* Side Effects: None
*
* Note: A ICMP packet is created and put on MAC.
*
********************************************************************/
void ICMPPut(NODE_INFO *remote,
ICMP_CODE code,
BYTE *data,
BYTE len,
WORD id,
WORD seq)
{
ICMP_PACKET packet;
packet.Code = 0;
packet.Type = code;
packet.Checksum = 0;
packet.Identifier = id;
packet.SequenceNumber = seq;
memcpy((void*)packet.Data, (void*)data, len);
SwapICMPPacket(&packet);
packet.Checksum = CalcIPChecksum((BYTE*)&packet,
(WORD)(ICMP_HEADER_SIZE + len));
IPPutHeader(remote,
IP_PROT_ICMP,
(WORD)(ICMP_HEADER_SIZE + len));
IPPutArray((BYTE*)&packet, (WORD)(ICMP_HEADER_SIZE + len));
MACFlush();
}
/*********************************************************************
* Function: void SwapICMPPacket(ICMP_PACKET* p)
*
* PreCondition: None
*
* Input: p - ICMP packet header
*
* Output: ICMP packet is swapped
*
* Side Effects: None
*
* Overview: None
*
* Note: None
********************************************************************/
void SwapICMPPacket(ICMP_PACKET* p)
{
p->Identifier = swaps(p->Identifier);
p->SequenceNumber = swaps(p->SequenceNumber);
p->Checksum = swaps(p->Checksum);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -