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 + -
显示快捷键?