⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 icmp.c

📁 用单片机实现GPRS modem通讯的源程序,实现了ppp拨号,tcp/udp等通讯协议包含了串口控制协议
💻 C
字号:
/*/////////////////////////////////////////////////////////////////////////////

File Name : ICMP.c

Author : Rene Trenado

Location : Motorola Applications Lab, Baja California

Date Created : January 2001

Current Revision : 0.0

Notes : This file contains the code to handle and create ICMP messages

//////////////////////////////////////////////////////////////////////////////*/
#include "IP.h"
#include "ICMP.h"


/***********************************************************************
Function : 	ICMPPing

Parameters : 	IP Address to ping

Date : 		September 2000

Desc : 		Sends a ICMP ECHO message to a remote host

***********************************************************************/
void IcmpPing (BYTE Ip[]) {
WORD Value;
static BYTE Seq = 0xAB;

        ip_out->SourceAddress [0] = IPAddress [0];			// Ping will have our source address 
        ip_out->SourceAddress [1] = IPAddress [1];	
        ip_out->SourceAddress [2] = IPAddress [2];
        ip_out->SourceAddress [3] = IPAddress [3];

        ip_out->DestAddress [0] = Ip[0];				// Set destination IP address
        ip_out->DestAddress [1] = Ip[1];
        ip_out->DestAddress [2] = Ip[2];
        ip_out->DestAddress [3] = Ip[3];

        ip_out->Payload [0] = ECHO;					// ICMP message type set to ECHO
        ip_out->Payload [1] = 0;					// ICMP code must by set to zero
        ip_out->Payload [2] = 0;					// reset checksum 
        ip_out->Payload [3] = 0;

        ip_out->Payload [4] = 1;					// set ID of ICMP message
	ip_out->Payload [5] = 0;
	Seq++;
        ip_out->Payload [6] = (Seq >> 8) & 0xFF;			// set sequence number of ICMP message
        ip_out->Payload [7] = Seq & 0xFF;

	ip_out->Protocol = ICMP;					// IP datagram will carry ICMP data
	ip_out->Length = 28;						// ECHO message would not include extra data

	Value = IPCheckSum ((BYTE *)&ip_out->Payload[0], (ip_out->Length - 20) >> 1);
	ip_out->Payload [2] = (Value >> 8);				// obtain ICMP checksum
	ip_out->Payload [3] = (Value & 0xFF);

	IPNetSend (ip_out);						// Net send to IP layer
}




/***********************************************************************
Function : 	ICMP_Handler

Parameters : 	IP Datagram containing ICMP data

Date : 		September 2000

Desc : 		Handles incoming IP datagrams according to the TYPE field
		of the ICMP message contained in the input IP datagram

***********************************************************************/
void IcmpHandler (IPDatagram* ip) {
WORD Value;

	switch (ip->Payload [0]) {

		case ECHO:
			Move ((BYTE *)ip, (BYTE *)ip_out, ip->Length);  /* Move ping datagram to output buffer */

		        /* Swap source and destination IP addresses on Output Buffer */
	        	ip_out->DestAddress [0] = ip->SourceAddress [0];
	        	ip_out->DestAddress [1] = ip->SourceAddress [1];
        		ip_out->DestAddress [2] = ip->SourceAddress [2];
			ip_out->DestAddress [3] = ip->SourceAddress [3];

		       	ip_out->SourceAddress [0] = ip->DestAddress [0];
        		ip_out->SourceAddress [1] = ip->DestAddress [1];
		     	ip_out->SourceAddress [2] = ip->DestAddress [2];
	        	ip_out->SourceAddress [3] = ip->DestAddress [3];

			ip_out->Payload [0] = ECHO_REPLY;		/* This will be the echo reply */
			ip_out->Payload [1] = 0;			/* Set ICMP Code to 0 */
			ip_out->Payload [2] = 0;			/* Set ICMP checksum field to 0 to avoid miscalculations */
			ip_out->Payload [3] = 0;			/* during checksum generation */

			Value = IPCheckSum ((BYTE *)&ip_out->Payload[0], (ip->Length - 20) >> 1);	/* Calculate ICMP checksum */

			ip_out->Payload [2] = (Value >> 8);		/* Set ICMP checksum */
			ip_out->Payload [3] = (Value & 0xFF);
			IPNetSend (ip_out);				/* Send ICMP packet over IP */
		break;

		case ECHO_REPLY:					// Code to handle ping responses 
 									// goes here
			NoOperation;
			
		break;

		case TRACEROUTE:
		break;

		default:
		break;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -