icmp.c
来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 104 行
C
104 行
//-----------------------------------------------------------------------------
// ICMP
//-----------------------------------------------------------------------------
#include <string.h>
#include "tcpip_stack.h"
#include "ip.h"
#include "icmp.h"
//-----------------------------------------------------------------------------
//Name:Icmp_Sum()
//Funcionality: Calculates the ICMP header checksum
//-----------------------------------------------------------------------------
u16 Icmp_Sum(u16 len_icmp_header, u8 buff[])
{
u16 word16;
u32 sum=0;
u16 i;
for (i=0;i<len_icmp_header;i=i+2){
word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
if (i!=2)sum = sum + (u32) word16;
}
while (sum>>16)
sum = (sum & 0xFFFF)+(sum >> 16);
sum = ~sum;
sum = ((sum >> 8) & 0x00FF) + ((sum << 8) & 0xFF00);
return ((u16) sum);
}
//-----------------------------------------------------------------------------
//Name:Tx_Icmp_Frame()
//Funcionality:
//-----------------------------------------------------------------------------
void Tx_Icmp_Frame(EthernetFrame *frame, u8 nLength)
{
}
//-----------------------------------------------------------------------------
//Name:Rx_Icmp_Frame()
//Funcionality: checksum check ,Returns type of ICMP message
//-----------------------------------------------------------------------------
s8 Rx_Icmp_Frame(EthernetFrame *frame, u16 length)
{
icmp_hdr *rx_icmp_hdr = (icmp_hdr *)((u8 *)frame + ETHER_HEADER_LENGTH + IP_HEADER_LENGTH);
u8 *chksum_hdr = (u8*)rx_icmp_hdr;
u16 checksum;
checksum = rx_icmp_hdr->chksum;
//checksum
if (checksum != Icmp_Sum(length, chksum_hdr)) return -1;
return rx_icmp_hdr->type;
}
//-----------------------------------------------------------------------------
//Name:Receive_ICMP()
//Funcionality: Used as an entry point to the ICMP stack part
//-----------------------------------------------------------------------------
void Receive_ICMP(EthernetFrame *frame){
ip_hdr *rx_ip_hdr = (ip_hdr *)((u8 *)frame + ETHER_HEADER_LENGTH);
icmp_hdr *rx_icmp_hdr = (icmp_hdr *)((u8 *)frame + ETHER_HEADER_LENGTH + IP_HEADER_LENGTH);
u8 *chksum_hdr = (u8*)rx_icmp_hdr;
u8 icmp_type;
u16 length = 0;
memcpy(destIP, rx_ip_hdr->srcIP, IP_ADDR_LEN);
length = rx_ip_hdr->length;
ChangeEndianess_16(length);
length -= IP_HEADER_LENGTH;
icmp_type = Rx_Icmp_Frame(frame, length);
switch (icmp_type){
case ICMP_ECHOREPLY: break;
case ICMP_DEST_UNREACH: break;
case ICMP_SOURCE_QUENCH: break;
case ICMP_REDIRECT: break;
case ICMP_ECHO:{
rx_icmp_hdr->type = ICMP_ECHOREPLY;
rx_icmp_hdr->chksum = Icmp_Sum(length, chksum_hdr);
Tx_Ip_Frame(frame, length, IP_ICMP);
break;
}
case ICMP_TIME_EXCEEDED: break;
case ICMP_PARAMETERPROB: break;
case ICMP_TIMESTAMP: break;
case ICMP_TIMESTAMPREPLY: break;
case ICMP_INFO_REQUEST: break;
case ICMP_INFO_REPLY: break;
case ICMP_ADDRESS: break;
case ICMP_ADDRESSREPLY: break;
default: break;
}
}
//-----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?