📄 icmp_echo_tester.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 + -