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

📄 icmp.c

📁 opentcp_mcf5282原代码
💻 C
字号:
/***************************************************************************************
File:			icmp.c

Date:			8.7.2002

Version:		0.1

Author:			Jari Lahti (jari@violasystems.com)

Description:	This file contains functions for processing ICMP

Version Info:	8.7.2002 - First version (JaL)
				22.1.2004 - Port for MCF5282
				26.3.2004 - Modified the packet lenght check (JaL)
***************************************************************************************/

#include "opentcp.h"


/********************************************************************************
Function:		ProcessICMPIn

Parameters:		struct IPFrame* frame - pointer to received IP frame structure
				UINT16 len - legth of data in bytes

Return val:		INT16 - (-1) Not OK
						>0 Packet OK


Date:			8.7.2002

Desc:			Check and process received ICMP frame
*********************************************************************************/

INT16 ProcessICMPIn (struct IPFrame* frame, UINT16 len)
{
	UINT8 type;
	UINT8 code;
	UINT16 checksum;
	UINT16 i;
	UINT16 j;
	UINT8 tbuf[16];


	/* Is this ICMP?	*/

	DEBUGOUT("Processing ICMP...\n\r");

	if( frame->protocol != IP_ICMP )
	{
		DEBUGOUT("ERROR: The protocol is not ICMP\n\r");
		return(-1);
	}

	/* Calculate checksum for received packet	*/


	i = len;
	checksum = 0;

	NETWORK_RECEIVE_INITIALIZE(frame->BufIndex);

	while(i>15)
	{

		RECEIVE_NETWORK_BUF(tbuf, 16);

		checksum = IpCheckSumBuf(checksum, tbuf,16);

		i -= 16;
	}

	for(j=0; j<i; j++)
	{
		checksum = IpCheckSum(checksum, RECEIVE_NETWORK_B(), (UINT8)j);
	}

	checksum = ~ checksum;

	if(checksum != IP_GOOD_CS)
	{
		DEBUGOUT("ERROR: ICMP Checksum failed!\n\r");
		return (-1);
	}


	DEBUGOUT("ICMP Checksum OK\n\r");

	/* Start processing the message	*/

	NETWORK_RECEIVE_INITIALIZE(frame->BufIndex);

	type = RECEIVE_NETWORK_B();
	code = RECEIVE_NETWORK_B();

	/* We have already checked the CS, skip it	*/

	RECEIVE_NETWORK_B();
	RECEIVE_NETWORK_B();

	switch(type)
	{
		case ICMP_ECHO_REQUEST:

			if(code != 0)
			{
				DEBUGOUT("ERROR:Misformed ICMP ECHO Request\n\r");
				return(-1);
			}

			DEBUGOUT("ICMP ECHO Request received\n\r");

			/* Is it a packet for setting temporary IP?	*/

			if(len == (ICMP_ECHOREQ_HLEN + ICMP_TEMPIPSET_DATALEN) )
			{
				/* Yep, set temporary IP address	*/

				DEBUGOUT("PING with 102 bytes of data, getting temp. IP\r\n");
				localmachine.localip = frame->dip;
				localmachine.defgw = frame->sip;
				localmachine.netmask = 0;

			}


			/* Same IP?		*/

			if(localmachine.localip != frame->dip)
				return(-1);

			/* Reply it	*/

			OTCP_TXBUF[0] = ICMP_ECHO_REPLY;
			OTCP_TXBUF[1] = 0;
			OTCP_TXBUF[2] = 0;
			OTCP_TXBUF[3] = 0;

			/* Copy with truncate if needed	*/

			if(len > (NETWORK_TX_BUFFER_SIZE - 4))
				len = NETWORK_TX_BUFFER_SIZE - 4;
				

			RECEIVE_NETWORK_BUF(&OTCP_TXBUF[4], len);

			/* Calculate Checksum for packet to be sent	*/

			checksum = 0;

			checksum = IpCheckSumBuf(checksum, &OTCP_TXBUF[0],len);

			checksum = ~ checksum;

			/* Put the checksum on place	*/

			OTCP_TXBUF[2] = (UINT8)(checksum>>8);
			OTCP_TXBUF[3] = (UINT8)checksum;

			/* Send it						*/

			ProcessIPOut(frame->sip, IP_ICMP, 0, 100, &OTCP_TXBUF[0], len);

			DEBUGOUT("ICMP Reply sent\n\r");

			return(0);


		break;

		case ICMP_ECHO_REPLY:

		break;

		default:				/* Unregognized ICMP message	*/

			DEBUGOUT("Unregognized ICMP message\n\r");
			return(-1);
	}


	return(-1);

}

⌨️ 快捷键说明

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