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

📄 icmp_echo_tester.c

📁 由smsc公司改进的lwip2.1.1基于嵌入式系统的TCP/ip协议栈
💻 C
字号:
/* Copyright 2008 SMSC, All rights reserved
FILE: icmp_echo_tester.c
*/

#include "core/sps.h"
#include "applications/icmp_echo_tester.h"

#if !ICMPV4_ECHO_REQUEST_ENABLED
/*Echo request support is required for this tester application */
#error ICMPV4 Echo request is not enabled
#endif

static void IcmpEchoTester_Reply(void * param, struct PACKET_BUFFER * packet)
{
	PICMP_ECHO_TESTER testerData=(PICMP_ECHO_TESTER)param;
	SMSC_ASSERT(testerData!=NULL);
	CHECK_SIGNATURE(testerData,ICMP_ECHO_TESTER_SIGNATURE);
	if(packet==NULL) {
		SMSC_WARNING(1,("Icmpv4EchoTester_Reply: Echo Request Timed Out"));
		TaskManager_ScheduleAsSoonAsPossible((testerData->mTask));
	} else {
		/* Check packet has incrementing data data */
		u8_t data=0;
		struct PACKET_BUFFER * buffer=packet;
		while(buffer!=NULL) {
			u16_t index;
			u8_t * dataPointer=PacketBuffer_GetStartPoint(buffer);
			for(index=0;index<PacketBuffer_GetThisLength(buffer);index++,data++) {
				if(dataPointer[index]!=data) {
					SMSC_WARNING(1,("Icmpv4EchoTester_Reply: Data corruption detected"));
					goto RELEASE_PACKET;
				}
			}
			buffer=PacketBuffer_GetNextPointer(buffer);
		}
		testerData->mCount++;
#if SMSC_TRACE_ENABLED
		SMSC_TRACE(1,("Icmpv4EchoTester_Reply: Receive Echo Reply Correctly, count=%"U32_F,testerData->mCount));
#endif
	RELEASE_PACKET:
		PacketBuffer_DecreaseReference(packet);
		TaskManager_ScheduleByTimer((testerData->mTask),testerData->mPeriod);
	}
}

void IcmpEchoTester_Task(void * param)
{
	PICMP_ECHO_TESTER testerData=(PICMP_ECHO_TESTER)param;
	struct PACKET_BUFFER * packet=NULL;
	SMSC_ASSERT(testerData!=NULL);
	CHECK_SIGNATURE(testerData,ICMP_ECHO_TESTER_SIGNATURE);
	packet=Icmpv4_AllocatePacket(&(testerData->mDestination),testerData->mSize);
	if(packet==NULL) {
		SMSC_WARNING(1,("PING: Failed to Allocate Packet, size=%"U16_F,(u16_t)(testerData->mSize)));
		TaskManager_ScheduleByTimer((testerData->mTask),((u32_t)(testerData->mPeriod)));
		return;
	} else {
		/* Initialize packet with incrementing data */
		u8_t data=0;
		struct PACKET_BUFFER * buffer=packet;
		while(buffer!=NULL) {
			u16_t index;
			u8_t * dataPointer=PacketBuffer_GetStartPoint(buffer);
		#if SMSC_ERROR_ENABLED
			if(PacketBuffer_GetNextPointer(buffer)==NULL) {
				SMSC_ASSERT(
					PacketBuffer_GetThisLength(buffer)==
					PacketBuffer_GetTotalLength(buffer));
			} else {
				SMSC_ASSERT(
					PacketBuffer_GetThisLength(buffer)<
					PacketBuffer_GetTotalLength(buffer));
			}
		#endif /* SMSC_ERROR_ENABLED */
			for(index=0;index<PacketBuffer_GetThisLength(buffer);index++,data++) {
				dataPointer[index]=data;
			}
			buffer=PacketBuffer_GetNextPointer(buffer);
		}
		Icmpv4_SendEchoRequest(
			testerData->mDestination,packet,
			IcmpEchoTester_Reply,testerData,
			testerData->mTimeOut);
	}
}

void IcmpEchoTester_Initialize(PICMP_ECHO_TESTER testerData,IPV4_ADDRESS destination, u32_t size, u16_t period, u8_t timeOut)
{
	SMSC_ASSERT(testerData!=NULL);
#if SMSC_TRACE_ENABLED
	{
		char addressString[IPV4_ADDRESS_STRING_SIZE];
		SMSC_TRACE(1,("IcmpEchoTester_Initialize: "));
		SMSC_TRACE(1,("    destination = %s",IPV4_ADDRESS_TO_STRING(addressString,destination)));
		SMSC_TRACE(1,("    size = %"U32_F", period = %"U16_F", timeOut = %"U16_F,
			size,(u16_t)period,(u16_t)timeOut));
	}
#endif /* SMSC_TRACE_ENABLED */
	ASSIGN_SIGNATURE(testerData,ICMP_ECHO_TESTER_SIGNATURE);
	testerData->mDestination=destination;
	testerData->mSize=size;
	testerData->mCount=0;
	testerData->mPeriod=period;
	testerData->mTimeOut=timeOut;
	testerData->mTask=Task_Allocate(TASK_PRIORITY_APPLICATION_LOW,
		IcmpEchoTester_Task,(void *)testerData);
	SMSC_ASSERT(testerData->mTask!=NULL);
	TaskManager_ScheduleAsSoonAsPossible((testerData->mTask));
}

⌨️ 快捷键说明

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