Ping.c

Ping.c example details

MAX_PING_DATA is used to specify the maximum data to be pinged. For normal operation a value 64 to 100 should be sufficient. For testing IP-fragmentation over hub, switch or router increase the size to a value greater than 1480 bytes. The value mustn't exceed 65500 Byte.

To ping the DSP type in a console window:

>ping 192.168.168.200

If the settings and network connections are correct, the pings will be replied.

To start the IP-fragmentation test type in a console window:

>ping 192.168.168.200 -l 5000

One ICMP-packet with 5000 data bytes will be split into four Ethernet packets using IP-fragmentation. Sometimes you find the first ping on fragmented IP-data not replied. This is a bug in some windows ICMP-sockets:

When the ARP-cache on PC is empty, the first ICMP packet sent to the DSP causes an ARP-request which will be answered from DSP immediately. But instead of sending the first ICMP packet with correct address information afterwards, the PC-stack sends out the remaining ICMP packets. Fragmented IP packets lack the message information ( protocol, length, checksum etc.). Only the first packet contains all necessary protocol header informations. As a result the DSP is not able to read the entire message which leads to an unanswered ping request.

Note
The internal data buffer size you specify is allocated from heap and never be freed!
See also
ICMP Internet Control Message Protocol
/***************************************************************************//**
@file Ping.c
@brief Ping example
@verbatim
_ _ _
__| | ___(_) ____ _ __ | |_
/ _` | / __| |/ _` | '_ \| __|
| (_| | _ \__ \ | (_| | | | | |_
\__,_|(_) ___/_|\__, |_| |_|\__|
Signalprocessing |___/ Technology
@endverbatim
@author D.SignT GmbH & Co. KG, Claus Hermbusche
@date 2019-06-04
@anchor PINGEX
@cond Software License Agreement
Copyright (C) 2001-2019 D.SignT GmbH & Co. KG - http://www.dsignt.de
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the
distribution.
Neither the name of D.SignT GmbH & Co. KG nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
Disclaimer
THIS SOFTWARE IS PROVIDED BY D.SIGNT GMBH & CO. KG "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL D.SIGNT GMBH & CO. KG BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@endcond
*******************************************************************************/
/*******************************************************************************
include stdtypes.h to avoid data type mismatch
*******************************************************************************/
/*******************************************************************************
include Runtime Source
*******************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <inttypes.h>
#include <time.h>
#include <string.h>
/*******************************************************************************
network support functions
*******************************************************************************/
#include <Libs/NETlib/net.h> /* D.Module network support */
/*******************************************************************************
board specific functions
*******************************************************************************/
#include <BoardSupport/inc/BoardSpecific.h> /* board support functions */
/*******************************************************************************
common support functions
*******************************************************************************/
#include <Common/Common.h> /* on exit function */
#include <Common/uartio.h> /* UART support */
#include <Common/timer.h> /* timer setting */
#include <Common/CPrintf.h> /* CPrintf defines */
/*******************************************************************************
network configuration
*******************************************************************************/
#include <BoardSupport/config/netconfig.c> /* network configuration */
#ifdef __cplusplus
extern "C" {
#endif /* !__cplusplus */
/*******************************************************************************
local prototypes
*******************************************************************************/
#ifdef __cplusplus
} // extern "C"
#endif
/*******************************************************************************
* *
* DEFINES *
* *
*******************************************************************************/
/*******************************************************************************
MAX_PING_DATA is used to specify the maximum data to be pinged. For normal
operation a value 64 to 100 should be sufficient. For testing IP-fragmentation
over hub, switch or router increase the size to a value greater than 1480
bytes. The value mustn't exceed 65500 Byte.
To ping the DSP type
>ping 192.168.168.200
If the settings and network connections are correct, the pings will be re-
plied.
IP-fragmentation test:
>ping 192.168.168.200 -l 5000
One ICMP-packet with 5000 data bytes will be split into four Ethernet
packets using IP-fragmentation. Sometimes you find the first ping on
fragmented IP-data not replied. This is a bug in some windows ICMP-sockets:
When the ARP-cache on PC is empty, the first ICMP packet sent to the DSP
causes an ARP-request which will be answered from DSP immediately. But
instead of sending the first ICMP packet with correct address information
afterwards, the PC-stack sends out the remaining ICMP packets. Fragmented
IP packets lack the message information ( protocol, length, checksum etc.).
Only the first packet contains all necessary protocol header informations.
As a result the DSP is not able to read the entire message which leads
to an unanswered ping request.
note: The internal data buffer size you specify is allocated from heap and
never be freed!
*******************************************************************************/
//#define MAX_PING_DATA 100 /* normal data size */
#define MAX_PING_DATA 5000 /* IP-fragmentation */
//#define MAX_PING_DATA 65500 /* absolute maximum */
/*******************************************************************************
* *
* GLOBALS *
* *
*******************************************************************************/
/*******************************************************************************
program name
*******************************************************************************/
char *program_name = "Ping";
/*******************************************************************************
* *
* FUNCTIONS *
* *
*******************************************************************************/
/*******************************************************************************
@brief Main application
@param -
@return never
*******************************************************************************/
#pragma CODE_SECTION(main , ".commontext");
int main ( void )
{
/***************************************************************************
locals
***************************************************************************/
int main_loop = 1; /* main loop switch, set to 0 to exit */
timeval stamp1, stamp2, delta; /* used to determine startup time */
/***************************************************************************
initialize application (e.g. timer clocks, PLL settings, EMIF etc.)
(ref. \Common\Common.c)
***************************************************************************/
/***************************************************************************
select output device for CPrintf (ref. \Common\cprintf.c)
possible settings:
CPRINTF_UART_OUTPUT -> output to UART
CPRINTF_CCS_OUTPUT -> output to CCS
CPRINTF_UART_OUTPUT | CPRINTF_CCS_OUTPUT -> output to UART and CCS
***************************************************************************/
/***************************************************************************
print a start up message
***************************************************************************/
/**************************************************************************/
// CPrintfProgress (" Heap check ");
// at least 0x2000 bytes required for this app
/**************************************************************************/
// CPrintfProgressSuccess();
/**************************************************************************/
CPrintfProgress (" Setup system time ");
// CPU interrupt 14, timer 1, 1 milli seconds resolution
/**************************************************************************/
CPrintf (" *** timer %d mapped to CPU int %d ***\r\n",
/**************************************************************************/
CPrintfProgress (" Enable interrupts ");
/**************************************************************************/
/**************************************************************************/
CPrintfProgress (" Start system timer ");
/**************************************************************************/
CPrintf (" *** timer %d running at %"PRId32" Hz ***\r\n", SystemTimerDev, RES_SECONDS/GetSystemTimerRes());
/***************************************************************************
measure network initialization time
***************************************************************************/
stamp1 = GetTimeStamp();
/**************************************************************************/
CPrintfProgress (" Initialize network ");
/**************************************************************************/
stamp2 = GetTimeStamp();
tv_interval (&delta, &stamp1, &stamp2);
CPuts (" network startup time [sec]: ");
"%"PRId32".%03"PRId32"\r\n"
delta.tv_sec,
delta.tv_usec/1000);
/***************************************************************************
main loop
***************************************************************************/
CPuts (" IP-fragmentation test:\r\n\n");
CPrintf (">ping %s -l 5000\r\n",eth.ip);
/***************************************************************************
main program loop: set main_loop to 0 to exit loop
***************************************************************************/
CPuts ("\r\n Entering main loop ...\r\n");
while ( main_loop )
{
/***********************************************************************
process net_isq()
***********************************************************************/
net_isq (); // process ISQ
/***********************************************************************
monitor link status
***********************************************************************/
/***********************************************************************
try to detect IP assignment
if DHCP is used, the assigned IP address may change
***********************************************************************/
/***********************************************************************
show that the program is running, perform symbol animation
***********************************************************************/
}
/***************************************************************************
exit program, shut down peripherals
***************************************************************************/
return (0);
}