[1/3] test: odp_timer_ping: removed

Message ID 1418078986-24980-2-git-send-email-ola.liljedahl@linaro.org
State New
Headers show

Commit Message

Ola Liljedahl Dec. 8, 2014, 10:49 p.m.
Signed-off-by: Ola Liljedahl <ola.liljedahl@linaro.org>
---
(This document/code contribution attached is provided under the terms of
agreement LES-LTM-21309)
Removed odp_timer_ping, it was neither a good test program nor a good ping
program.

 test/api_test/.gitignore       |   1 -
 test/api_test/Makefile.am      |   5 +-
 test/api_test/odp_timer_ping.c | 405 -----------------------------------------
 3 files changed, 1 insertion(+), 410 deletions(-)
 delete mode 100644 test/api_test/odp_timer_ping.c

Comments

Mike Holmes Dec. 9, 2014, 10:47 p.m. | #1
On 8 December 2014 at 17:49, Ola Liljedahl <ola.liljedahl@linaro.org> wrote:

> Signed-off-by: Ola Liljedahl <ola.liljedahl@linaro.org>
> ---
> (This document/code contribution attached is provided under the terms of
> agreement LES-LTM-21309)
> Removed odp_timer_ping, it was neither a good test program nor a good ping
> program.
>

This is good, but the rationale should be in the commit log for posterity,
just move it above ---



Removed odp_timer_ping, it was neither a good test program nor a good ping
program.

Signed-off-by: Ola Liljedahl <ola.liljedahl@linaro.org>
---



>
>  test/api_test/.gitignore       |   1 -
>  test/api_test/Makefile.am      |   5 +-
>  test/api_test/odp_timer_ping.c | 405
> -----------------------------------------
>  3 files changed, 1 insertion(+), 410 deletions(-)
>  delete mode 100644 test/api_test/odp_timer_ping.c
>
> diff --git a/test/api_test/.gitignore b/test/api_test/.gitignore
> index 7ba56c7..84159e1 100644
> --- a/test/api_test/.gitignore
> +++ b/test/api_test/.gitignore
> @@ -1,4 +1,3 @@
>  odp_atomic
>  odp_ring
>  odp_shm
> -odp_timer_ping
> diff --git a/test/api_test/Makefile.am b/test/api_test/Makefile.am
> index 74e8612..f9326fa 100644
> --- a/test/api_test/Makefile.am
> +++ b/test/api_test/Makefile.am
> @@ -1,18 +1,15 @@
>  include $(top_srcdir)/test/Makefile.inc
>
> -bin_PROGRAMS = odp_atomic odp_shm odp_ring odp_timer_ping
> +bin_PROGRAMS = odp_atomic odp_shm odp_ring
>
>  odp_atomic_CFLAGS = $(AM_CFLAGS)
>  odp_shm_CFLAGS = $(AM_CFLAGS)
>  odp_ring_CFLAGS = $(AM_CFLAGS)
> -odp_timer_ping_CFLAGS = $(AM_CFLAGS)
>
>  odp_atomic_LDFLAGS = $(AM_LDFLAGS) -static
>  odp_shm_LDFLAGS = $(AM_LDFLAGS) -static
>  odp_ring_LDFLAGS = $(AM_LDFLAGS) -static
> -odp_timer_ping_LDFLAGS = $(AM_LDFLAGS) -static
>
>  dist_odp_atomic_SOURCES = odp_atomic_test.c odp_common.c
>  dist_odp_shm_SOURCES = odp_shm_test.c odp_common.c
>  dist_odp_ring_SOURCES = odp_ring_test.c odp_common.c
> -dist_odp_timer_ping_SOURCES = odp_timer_ping.c odp_common.c
> diff --git a/test/api_test/odp_timer_ping.c
> b/test/api_test/odp_timer_ping.c
> deleted file mode 100644
> index 48f1885..0000000
> --- a/test/api_test/odp_timer_ping.c
> +++ /dev/null
> @@ -1,405 +0,0 @@
> -/* Copyright (c) 2014, Linaro Limited
> - * All rights reserved.
> - *
> - * SPDX-License-Identifier:     BSD-3-Clause
> - */
> -
> -/**
> - * @file
> - *
> - * ODP timer ping example application.
> - * application open PF_INET socket, every ping send request
> - * will arm timer for some duration, if ping_ack rxvd with
> - * time band.. listen thread will cancel timer and free the
> - * tmo_buffer.. otherwise timer expiration event will exit
> - * application lead to test failure..
> - *  - two thread used, one listener other one sender.
> - *  - run ./odp_timer <ipadder>
> - *   In ubuntu, you need run using sudo ./odp_timer <ipaddr>
> - *  - so to tigger timeout explicitly.. ping with badipaddr
> - *    Otherwise timeout may happen bcz of slow nw speed
> - */
> -
> -#include <unistd.h>
> -#include <fcntl.h>
> -#include <errno.h>
> -#include <sys/socket.h>
> -#include <resolv.h>
> -#include <netdb.h>
> -#include <netinet/in.h>
> -#include <netinet/ip_icmp.h>
> -#include <arpa/inet.h>
> -#include <poll.h>
> -
> -#include <string.h>
> -#include <odp.h>
> -#include <odp_common.h>
> -#include <odp_timer.h>
> -#include <odph_linux.h>
> -#include <odph_chksum.h>
> -#include <test_debug.h>
> -
> -#define MSG_POOL_SIZE         (4*1024*1024)
> -#define BUF_SIZE               8
> -#define PING_CNT       10
> -#define PING_THRD      2       /* Send and Rx Ping thread */
> -
> -/* Nanoseconds */
> -#define RESUS  10000
> -#define MINUS  10000
> -#define MAXUS  10000000
> -
> -static odp_timer_t test_timer_ping;
> -static odp_timer_tmo_t test_ping_tmo;
> -
> -#define PKTSIZE      64
> -struct packet {
> -       struct icmphdr hdr;
> -       char msg[PKTSIZE-sizeof(struct icmphdr)];
> -};
> -
> -static int pid = -1;
> -static struct protoent *proto;
> -
> -static struct sockaddr_in dst_addr;
> -
> -/* local struct for ping_timer_thread argument */
> -typedef struct {
> -       pthrd_arg thrdarg;
> -       int result;
> -} ping_arg_t;
> -
> -static int ping_sync_flag;
> -
> -static void dump_icmp_pkt(void *buf, int bytes, int pkt_cnt)
> -{
> -       struct iphdr *ip = buf;
> -#ifdef PKT_SEQ_DUMP
> -       /* int i; */
> -       LOG_DBG("---dump icmp pkt_cnt %d------\n", pkt_cnt);
> -       for (i = 0; i < bytes; i++) {
> -               if (!(i & 15))
> -                       ODP_DBG("\n %x:  ", i);
> -               ODP_DBG("%d ", ((unsigned char *)buf)[i]);
> -       }
> -       LOG_DBG("\n");
> -#endif
> -       char addrstr[INET6_ADDRSTRLEN];
> -       inet_ntop(AF_INET, &ip->daddr, addrstr, sizeof(addrstr));
> -       LOG_DBG("byte %d, Ack rxvd for msg_cnt [%d] from %s\n", bytes,
> pkt_cnt,
> -               addrstr);
> -}
> -
> -static int listen_to_pingack(void)
> -{
> -       int sd, i;
> -       struct sockaddr_in addr;
> -       unsigned char buf[1024];
> -       int bytes, len;
> -       int err = 0;
> -
> -       sd = socket(PF_INET, SOCK_RAW, proto->p_proto);
> -       if (sd < 0) {
> -               LOG_ERR("Listener socket open failed\n");
> -               err = -1;
> -               goto err;
> -       }
> -
> -       for (i = 0; i < PING_CNT; i++) {
> -
> -               struct pollfd fd;
> -               int res;
> -
> -               fd.fd = sd;
> -               fd.events = POLLIN;
> -               res = poll(&fd, 1, 1000); /* 1000 ms timeout */
> -
> -               if (res == 0) {
> -                       LOG_DBG(" Rx timeout msg cnt [%d]\n", i);
> -                       err = -1;
> -               } else if (res == -1) {
> -                       LOG_ERR("recvfrom error");
> -                       err = -1;
> -                       goto err;
> -               } else {
> -                       len = sizeof(addr);
> -
> -                       bzero(buf, sizeof(buf));
> -                       bytes = recvfrom(sd, buf, sizeof(buf), 0,
> -                                        (struct sockaddr *)&addr,
> -                                        (socklen_t *)&len);
> -                       if (bytes > 0) {
> -                               /* pkt rxvd therefore cancel the timeout */
> -                               if (odp_timer_cancel_tmo(test_timer_ping,
> -                                                        test_ping_tmo) !=
> 0) {
> -                                       LOG_ERR("cancel_tmo failed
> ..exiting listner thread\n");
> -                                       /* avoid exiting from here even if
> tmo
> -                                        * failed for current ping,
> -                                        * allow subsequent ping_rx
> request */
> -                                       err = -1;
> -
> -                               }
> -                               /* cruel bad hack used for sender, listner
> ipc..
> -                                * euwww.. FIXME ..
> -                                */
> -                               ping_sync_flag = true;
> -                               odp_buffer_free(test_ping_tmo);
> -                               dump_icmp_pkt(buf, bytes, i);
> -                       }
> -               }
> -       }
> -
> -err:
> -       return err;
> -}
> -
> -static int send_ping_request(struct sockaddr_in *addr)
> -{
> -       const int val = 255;
> -       uint32_t i, j;
> -       int sd, cnt = 1;
> -       struct packet pckt;
> -
> -       uint64_t tick;
> -       odp_queue_t queue;
> -       odp_buffer_t buf;
> -
> -       int err = 0;
> -
> -       sd = socket(PF_INET, SOCK_RAW, proto->p_proto);
> -       if (sd < 0) {
> -               LOG_ERR("Sender socket open failed\n");
> -               return -1;
> -       }
> -
> -       if (setsockopt(sd, SOL_IP, IP_TTL, &val, sizeof(val)) != 0) {
> -               LOG_ERR("Error setting TTL option\n");
> -               err = -1;
> -               goto err;
> -       }
> -       if (fcntl(sd, F_SETFL, O_NONBLOCK) != 0) {
> -               LOG_ERR("Request for nonblocking I/O failed\n");
> -               err = -1;
> -               goto err;
> -       }
> -
> -       /* get the ping queue */
> -       queue = odp_queue_lookup("ping_timer_queue");
> -
> -       for (i = 0; i < PING_CNT; i++) {
> -               /* prepare icmp pkt */
> -               bzero(&pckt, sizeof(pckt));
> -               pckt.hdr.type = ICMP_ECHO;
> -               pckt.hdr.un.echo.id = pid;
> -
> -               for (j = 0; j < sizeof(pckt.msg)-1; j++)
> -                       pckt.msg[j] = j+'0';
> -
> -               pckt.msg[j] = 0;
> -               pckt.hdr.un.echo.sequence = cnt++;
> -               pckt.hdr.checksum = odp_chksum(&pckt, sizeof(pckt));
> -
> -
> -               /* txmit the pkt */
> -               if (sendto(sd, &pckt, sizeof(pckt), 0,
> -                          (struct sockaddr *)addr, sizeof(*addr)) <= 0) {
> -                       LOG_ERR("sendto operation failed msg_cnt
> [%d]..exiting"
> -                               "sender thread\n", i);
> -                       err = -1;
> -                       goto err;
> -               }
> -               printf(" icmp_sent msg_cnt %d\n", i);
> -
> -               /* arm the timer */
> -               tick = odp_timer_current_tick(test_timer_ping);
> -
> -               tick += 1000;
> -               test_ping_tmo = odp_timer_absolute_tmo(test_timer_ping,
> tick,
> -                                                      queue,
> -                                                      ODP_BUFFER_INVALID);
> -               /* wait for timeout event */
> -               while ((buf = odp_queue_deq(queue)) == ODP_BUFFER_INVALID)
> {
> -                       /* flag true means ack rxvd.. a cruel hack as I
> -                        * am confused on method to get away from while
> -                        * loop in case of ack rxvd..
> -                        * FIXME..
> -                        */
> -                       if (ping_sync_flag) {
> -                               ping_sync_flag = false;
> -                               LOG_DBG(" icmp_ack msg_cnt [%d]\n", i);
> -                               buf = ODP_BUFFER_INVALID;
> -                               break;
> -                       }
> -               }
> -
> -               /* free tmo_buf for timeout case */
> -               if (buf != ODP_BUFFER_INVALID) {
> -                       LOG_DBG(" timeout msg_cnt [%i]\n", i);
> -                       /* so to avoid seg fault commented */
> -                       odp_buffer_free(buf);
> -                       err = -1;
> -               }
> -       }
> -
> -err:
> -       close(sd);
> -       return err;
> -}
> -
> -static void *send_ping(void *arg)
> -{
> -       ping_arg_t *parg = (ping_arg_t *)arg;
> -       int thr;
> -
> -       thr = odp_thread_id();
> -
> -       printf("Send Ping thread %i starts\n", thr);
> -
> -       switch (parg->thrdarg.testcase) {
> -       case ODP_TIMER_PING_TEST:
> -               if (send_ping_request(&dst_addr) < 0)
> -                       parg->result = -1;
> -               break;
> -       default:
> -               LOG_ERR("Invalid test case [%d]\n",
> parg->thrdarg.testcase);
> -       }
> -
> -       fflush(stdout);
> -
> -       return parg;
> -}
> -
> -static void *rx_ping(void *arg)
> -{
> -       ping_arg_t *parg = (ping_arg_t *)arg;
> -       int thr;
> -
> -       thr = odp_thread_id();
> -
> -       printf("Rx Ping thread %i starts\n", thr);
> -
> -       switch (parg->thrdarg.testcase) {
> -       case ODP_TIMER_PING_TEST:
> -               if (listen_to_pingack() < 0)
> -                       parg->result = -1;
> -               break;
> -       default:
> -               LOG_ERR("Invalid test case [%d]\n",
> parg->thrdarg.testcase);
> -       }
> -
> -       fflush(stdout);
> -
> -       return parg;
> -}
> -
> -
> -static int ping_init(int count, char *name[])
> -{
> -       struct hostent *hname;
> -       if (count != 2) {
> -               LOG_ERR("usage: %s <hostaddr>\n", name[0]);
> -               return -1;
> -       }
> -
> -       if (count > 1) {
> -               pid = getpid();
> -               proto = getprotobyname("ICMP");
> -               hname = gethostbyname(name[1]);
> -               bzero(&dst_addr, sizeof(dst_addr));
> -               dst_addr.sin_family = hname->h_addrtype;
> -               dst_addr.sin_port = 0;
> -               inet_pton(AF_INET, name[1], &(dst_addr.sin_addr.s_addr));
> -       }
> -       printf("ping to addr %s\n", name[1]);
> -
> -       return 0;
> -}
> -
> -int main(int argc ODP_UNUSED, char *argv[] ODP_UNUSED)
> -{
> -       odph_linux_pthread_t thread_tbl[MAX_WORKERS];
> -       ping_arg_t pingarg;
> -       odp_queue_t queue;
> -       odp_buffer_pool_t pool;
> -       void *pool_base;
> -       int i;
> -       odp_shm_t shm;
> -
> -       if (odp_test_global_init() != 0)
> -               return -1;
> -
> -       odp_print_system_info();
> -
> -       if (ping_init(argc, argv) != 0)
> -               return -1;
> -
> -       /*
> -        * Create message pool
> -        */
> -       shm = odp_shm_reserve("msg_pool",
> -                             MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE, 0);
> -       pool_base = odp_shm_addr(shm);
> -
> -       pool = odp_buffer_pool_create("msg_pool", pool_base, MSG_POOL_SIZE,
> -                                     BUF_SIZE,
> -                                     ODP_CACHE_LINE_SIZE,
> -                                     ODP_BUFFER_TYPE_RAW);
> -       if (pool == ODP_BUFFER_POOL_INVALID) {
> -               LOG_ERR("Pool create failed.\n");
> -               return -1;
> -       }
> -
> -       /*
> -        * Create a queue for timer test
> -        */
> -       queue = odp_queue_create("ping_timer_queue", ODP_QUEUE_TYPE_SCHED,
> -                                NULL);
> -
> -       if (queue == ODP_QUEUE_INVALID) {
> -               LOG_ERR("Timer queue create failed.\n");
> -               return -1;
> -       }
> -
> -       test_timer_ping = odp_timer_create("ping_timer", pool,
> -                                          RESUS*ODP_TIME_USEC,
> -                                          MINUS*ODP_TIME_USEC,
> -                                          MAXUS*ODP_TIME_USEC);
> -
> -       if (test_timer_ping == ODP_TIMER_INVALID) {
> -               LOG_ERR("Timer create failed.\n");
> -               return -1;
> -       }
> -
> -       odp_shm_print_all();
> -
> -       pingarg.thrdarg.testcase = ODP_TIMER_PING_TEST;
> -       pingarg.thrdarg.numthrds = PING_THRD;
> -
> -       pingarg.result = 0;
> -
> -       memset(thread_tbl, 0, sizeof(thread_tbl));
> -
> -       /* create ping send and Receive thread */
> -       for (i = 0; i < PING_THRD; i++) {
> -               void *(*run_thread) (void *);
> -
> -               if (i == 0)
> -                       run_thread = send_ping;
> -               else
> -                       run_thread = rx_ping;
> -
> -               /* Create and launch worker threads */
> -               odph_linux_pthread_create(&thread_tbl[i], 1, i,
> -                                         run_thread, (pthrd_arg
> *)&pingarg);
> -       }
> -
> -       /* Wait for worker threads to exit */
> -       odph_linux_pthread_join(thread_tbl, PING_THRD);
> -
> -       LOG_DBG("ping timer test %s\n", (pingarg.result == 0) ? "passed" :
> -               "failed");
> -
> -       printf("ODP ping timer test complete\n\n");
> -
> -       return 0;
> -}
> --
> 1.9.1
>
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/lng-odp
>

Patch

diff --git a/test/api_test/.gitignore b/test/api_test/.gitignore
index 7ba56c7..84159e1 100644
--- a/test/api_test/.gitignore
+++ b/test/api_test/.gitignore
@@ -1,4 +1,3 @@ 
 odp_atomic
 odp_ring
 odp_shm
-odp_timer_ping
diff --git a/test/api_test/Makefile.am b/test/api_test/Makefile.am
index 74e8612..f9326fa 100644
--- a/test/api_test/Makefile.am
+++ b/test/api_test/Makefile.am
@@ -1,18 +1,15 @@ 
 include $(top_srcdir)/test/Makefile.inc
 
-bin_PROGRAMS = odp_atomic odp_shm odp_ring odp_timer_ping
+bin_PROGRAMS = odp_atomic odp_shm odp_ring
 
 odp_atomic_CFLAGS = $(AM_CFLAGS)
 odp_shm_CFLAGS = $(AM_CFLAGS)
 odp_ring_CFLAGS = $(AM_CFLAGS)
-odp_timer_ping_CFLAGS = $(AM_CFLAGS)
 
 odp_atomic_LDFLAGS = $(AM_LDFLAGS) -static
 odp_shm_LDFLAGS = $(AM_LDFLAGS) -static
 odp_ring_LDFLAGS = $(AM_LDFLAGS) -static
-odp_timer_ping_LDFLAGS = $(AM_LDFLAGS) -static
 
 dist_odp_atomic_SOURCES = odp_atomic_test.c odp_common.c
 dist_odp_shm_SOURCES = odp_shm_test.c odp_common.c
 dist_odp_ring_SOURCES = odp_ring_test.c odp_common.c
-dist_odp_timer_ping_SOURCES = odp_timer_ping.c odp_common.c
diff --git a/test/api_test/odp_timer_ping.c b/test/api_test/odp_timer_ping.c
deleted file mode 100644
index 48f1885..0000000
--- a/test/api_test/odp_timer_ping.c
+++ /dev/null
@@ -1,405 +0,0 @@ 
-/* Copyright (c) 2014, Linaro Limited
- * All rights reserved.
- *
- * SPDX-License-Identifier:     BSD-3-Clause
- */
-
-/**
- * @file
- *
- * ODP timer ping example application.
- * application open PF_INET socket, every ping send request
- * will arm timer for some duration, if ping_ack rxvd with
- * time band.. listen thread will cancel timer and free the
- * tmo_buffer.. otherwise timer expiration event will exit
- * application lead to test failure..
- *  - two thread used, one listener other one sender.
- *  - run ./odp_timer <ipadder>
- *   In ubuntu, you need run using sudo ./odp_timer <ipaddr>
- *  - so to tigger timeout explicitly.. ping with badipaddr
- *    Otherwise timeout may happen bcz of slow nw speed
- */
-
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/socket.h>
-#include <resolv.h>
-#include <netdb.h>
-#include <netinet/in.h>
-#include <netinet/ip_icmp.h>
-#include <arpa/inet.h>
-#include <poll.h>
-
-#include <string.h>
-#include <odp.h>
-#include <odp_common.h>
-#include <odp_timer.h>
-#include <odph_linux.h>
-#include <odph_chksum.h>
-#include <test_debug.h>
-
-#define MSG_POOL_SIZE         (4*1024*1024)
-#define BUF_SIZE		8
-#define PING_CNT	10
-#define PING_THRD	2	/* Send and Rx Ping thread */
-
-/* Nanoseconds */
-#define RESUS	10000
-#define MINUS	10000
-#define MAXUS	10000000
-
-static odp_timer_t test_timer_ping;
-static odp_timer_tmo_t test_ping_tmo;
-
-#define PKTSIZE      64
-struct packet {
-	struct icmphdr hdr;
-	char msg[PKTSIZE-sizeof(struct icmphdr)];
-};
-
-static int pid = -1;
-static struct protoent *proto;
-
-static struct sockaddr_in dst_addr;
-
-/* local struct for ping_timer_thread argument */
-typedef struct {
-	pthrd_arg thrdarg;
-	int result;
-} ping_arg_t;
-
-static int ping_sync_flag;
-
-static void dump_icmp_pkt(void *buf, int bytes, int pkt_cnt)
-{
-	struct iphdr *ip = buf;
-#ifdef PKT_SEQ_DUMP
-	/* int i; */
-	LOG_DBG("---dump icmp pkt_cnt %d------\n", pkt_cnt);
-	for (i = 0; i < bytes; i++) {
-		if (!(i & 15))
-			ODP_DBG("\n %x:  ", i);
-		ODP_DBG("%d ", ((unsigned char *)buf)[i]);
-	}
-	LOG_DBG("\n");
-#endif
-	char addrstr[INET6_ADDRSTRLEN];
-	inet_ntop(AF_INET, &ip->daddr, addrstr, sizeof(addrstr));
-	LOG_DBG("byte %d, Ack rxvd for msg_cnt [%d] from %s\n", bytes, pkt_cnt,
-		addrstr);
-}
-
-static int listen_to_pingack(void)
-{
-	int sd, i;
-	struct sockaddr_in addr;
-	unsigned char buf[1024];
-	int bytes, len;
-	int err = 0;
-
-	sd = socket(PF_INET, SOCK_RAW, proto->p_proto);
-	if (sd < 0) {
-		LOG_ERR("Listener socket open failed\n");
-		err = -1;
-		goto err;
-	}
-
-	for (i = 0; i < PING_CNT; i++) {
-
-		struct pollfd fd;
-		int res;
-
-		fd.fd = sd;
-		fd.events = POLLIN;
-		res = poll(&fd, 1, 1000); /* 1000 ms timeout */
-
-		if (res == 0) {
-			LOG_DBG(" Rx timeout msg cnt [%d]\n", i);
-			err = -1;
-		} else if (res == -1) {
-			LOG_ERR("recvfrom error");
-			err = -1;
-			goto err;
-		} else {
-			len = sizeof(addr);
-
-			bzero(buf, sizeof(buf));
-			bytes = recvfrom(sd, buf, sizeof(buf), 0,
-					 (struct sockaddr *)&addr,
-					 (socklen_t *)&len);
-			if (bytes > 0) {
-				/* pkt rxvd therefore cancel the timeout */
-				if (odp_timer_cancel_tmo(test_timer_ping,
-							 test_ping_tmo) != 0) {
-					LOG_ERR("cancel_tmo failed ..exiting listner thread\n");
-					/* avoid exiting from here even if tmo
-					 * failed for current ping,
-					 * allow subsequent ping_rx request */
-					err = -1;
-
-				}
-				/* cruel bad hack used for sender, listner ipc..
-				 * euwww.. FIXME ..
-				 */
-				ping_sync_flag = true;
-				odp_buffer_free(test_ping_tmo);
-				dump_icmp_pkt(buf, bytes, i);
-			}
-		}
-	}
-
-err:
-	return err;
-}
-
-static int send_ping_request(struct sockaddr_in *addr)
-{
-	const int val = 255;
-	uint32_t i, j;
-	int sd, cnt = 1;
-	struct packet pckt;
-
-	uint64_t tick;
-	odp_queue_t queue;
-	odp_buffer_t buf;
-
-	int err = 0;
-
-	sd = socket(PF_INET, SOCK_RAW, proto->p_proto);
-	if (sd < 0) {
-		LOG_ERR("Sender socket open failed\n");
-		return -1;
-	}
-
-	if (setsockopt(sd, SOL_IP, IP_TTL, &val, sizeof(val)) != 0) {
-		LOG_ERR("Error setting TTL option\n");
-		err = -1;
-		goto err;
-	}
-	if (fcntl(sd, F_SETFL, O_NONBLOCK) != 0) {
-		LOG_ERR("Request for nonblocking I/O failed\n");
-		err = -1;
-		goto err;
-	}
-
-	/* get the ping queue */
-	queue = odp_queue_lookup("ping_timer_queue");
-
-	for (i = 0; i < PING_CNT; i++) {
-		/* prepare icmp pkt */
-		bzero(&pckt, sizeof(pckt));
-		pckt.hdr.type = ICMP_ECHO;
-		pckt.hdr.un.echo.id = pid;
-
-		for (j = 0; j < sizeof(pckt.msg)-1; j++)
-			pckt.msg[j] = j+'0';
-
-		pckt.msg[j] = 0;
-		pckt.hdr.un.echo.sequence = cnt++;
-		pckt.hdr.checksum = odp_chksum(&pckt, sizeof(pckt));
-
-
-		/* txmit the pkt */
-		if (sendto(sd, &pckt, sizeof(pckt), 0,
-			   (struct sockaddr *)addr, sizeof(*addr)) <= 0) {
-			LOG_ERR("sendto operation failed msg_cnt [%d]..exiting"
-				"sender thread\n", i);
-			err = -1;
-			goto err;
-		}
-		printf(" icmp_sent msg_cnt %d\n", i);
-
-		/* arm the timer */
-		tick = odp_timer_current_tick(test_timer_ping);
-
-		tick += 1000;
-		test_ping_tmo = odp_timer_absolute_tmo(test_timer_ping, tick,
-						       queue,
-						       ODP_BUFFER_INVALID);
-		/* wait for timeout event */
-		while ((buf = odp_queue_deq(queue)) == ODP_BUFFER_INVALID) {
-			/* flag true means ack rxvd.. a cruel hack as I
-			 * am confused on method to get away from while
-			 * loop in case of ack rxvd..
-			 * FIXME..
-			 */
-			if (ping_sync_flag) {
-				ping_sync_flag = false;
-				LOG_DBG(" icmp_ack msg_cnt [%d]\n", i);
-				buf = ODP_BUFFER_INVALID;
-				break;
-			}
-		}
-
-		/* free tmo_buf for timeout case */
-		if (buf != ODP_BUFFER_INVALID) {
-			LOG_DBG(" timeout msg_cnt [%i]\n", i);
-			/* so to avoid seg fault commented */
-			odp_buffer_free(buf);
-			err = -1;
-		}
-	}
-
-err:
-	close(sd);
-	return err;
-}
-
-static void *send_ping(void *arg)
-{
-	ping_arg_t *parg = (ping_arg_t *)arg;
-	int thr;
-
-	thr = odp_thread_id();
-
-	printf("Send Ping thread %i starts\n", thr);
-
-	switch (parg->thrdarg.testcase) {
-	case ODP_TIMER_PING_TEST:
-		if (send_ping_request(&dst_addr) < 0)
-			parg->result = -1;
-		break;
-	default:
-		LOG_ERR("Invalid test case [%d]\n", parg->thrdarg.testcase);
-	}
-
-	fflush(stdout);
-
-	return parg;
-}
-
-static void *rx_ping(void *arg)
-{
-	ping_arg_t *parg = (ping_arg_t *)arg;
-	int thr;
-
-	thr = odp_thread_id();
-
-	printf("Rx Ping thread %i starts\n", thr);
-
-	switch (parg->thrdarg.testcase) {
-	case ODP_TIMER_PING_TEST:
-		if (listen_to_pingack() < 0)
-			parg->result = -1;
-		break;
-	default:
-		LOG_ERR("Invalid test case [%d]\n", parg->thrdarg.testcase);
-	}
-
-	fflush(stdout);
-
-	return parg;
-}
-
-
-static int ping_init(int count, char *name[])
-{
-	struct hostent *hname;
-	if (count != 2) {
-		LOG_ERR("usage: %s <hostaddr>\n", name[0]);
-		return -1;
-	}
-
-	if (count > 1) {
-		pid = getpid();
-		proto = getprotobyname("ICMP");
-		hname = gethostbyname(name[1]);
-		bzero(&dst_addr, sizeof(dst_addr));
-		dst_addr.sin_family = hname->h_addrtype;
-		dst_addr.sin_port = 0;
-		inet_pton(AF_INET, name[1], &(dst_addr.sin_addr.s_addr));
-	}
-	printf("ping to addr %s\n", name[1]);
-
-	return 0;
-}
-
-int main(int argc ODP_UNUSED, char *argv[] ODP_UNUSED)
-{
-	odph_linux_pthread_t thread_tbl[MAX_WORKERS];
-	ping_arg_t pingarg;
-	odp_queue_t queue;
-	odp_buffer_pool_t pool;
-	void *pool_base;
-	int i;
-	odp_shm_t shm;
-
-	if (odp_test_global_init() != 0)
-		return -1;
-
-	odp_print_system_info();
-
-	if (ping_init(argc, argv) != 0)
-		return -1;
-
-	/*
-	 * Create message pool
-	 */
-	shm = odp_shm_reserve("msg_pool",
-			      MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE, 0);
-	pool_base = odp_shm_addr(shm);
-
-	pool = odp_buffer_pool_create("msg_pool", pool_base, MSG_POOL_SIZE,
-				      BUF_SIZE,
-				      ODP_CACHE_LINE_SIZE,
-				      ODP_BUFFER_TYPE_RAW);
-	if (pool == ODP_BUFFER_POOL_INVALID) {
-		LOG_ERR("Pool create failed.\n");
-		return -1;
-	}
-
-	/*
-	 * Create a queue for timer test
-	 */
-	queue = odp_queue_create("ping_timer_queue", ODP_QUEUE_TYPE_SCHED,
-				 NULL);
-
-	if (queue == ODP_QUEUE_INVALID) {
-		LOG_ERR("Timer queue create failed.\n");
-		return -1;
-	}
-
-	test_timer_ping = odp_timer_create("ping_timer", pool,
-					   RESUS*ODP_TIME_USEC,
-					   MINUS*ODP_TIME_USEC,
-					   MAXUS*ODP_TIME_USEC);
-
-	if (test_timer_ping == ODP_TIMER_INVALID) {
-		LOG_ERR("Timer create failed.\n");
-		return -1;
-	}
-
-	odp_shm_print_all();
-
-	pingarg.thrdarg.testcase = ODP_TIMER_PING_TEST;
-	pingarg.thrdarg.numthrds = PING_THRD;
-
-	pingarg.result = 0;
-
-	memset(thread_tbl, 0, sizeof(thread_tbl));
-
-	/* create ping send and Receive thread */
-	for (i = 0; i < PING_THRD; i++) {
-		void *(*run_thread) (void *);
-
-		if (i == 0)
-			run_thread = send_ping;
-		else
-			run_thread = rx_ping;
-
-		/* Create and launch worker threads */
-		odph_linux_pthread_create(&thread_tbl[i], 1, i,
-					  run_thread, (pthrd_arg *)&pingarg);
-	}
-
-	/* Wait for worker threads to exit */
-	odph_linux_pthread_join(thread_tbl, PING_THRD);
-
-	LOG_DBG("ping timer test %s\n", (pingarg.result == 0) ? "passed" :
-		"failed");
-
-	printf("ODP ping timer test complete\n\n");
-
-	return 0;
-}