--- /dev/null
+/* depend: */
+/* cflags: */
+/* linker: msg.o mtime.o test.o stat.o -lm -lrt */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <fcntl.h> /* For O_* constants */
+#include <sys/stat.h> /* For mode constants */
+#include <mqueue.h>
+
+#include <signal.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include "msg.h"
+#include "mtime.h"
+#include "test.h"
+
+/* global variables */
+
+dts_t *deltas = NULL;
+int nb_measurements = 0;
+
+char *message = "Message queue RTT";
+void (*usage_ext) (FILE *) = NULL;
+int (*parse_arg_ext) (char *) = NULL;
+
+#define MSGLEN 128
+#define MAXBUF 1024
+
+int ping (mqd_t mq)
+{
+
+ printf ("Sending ping...\n");
+ for (int i = 0; i < nb_measurements; i++) {
+
+ char *msg = get_msg (MSGLEN);
+ char buffer[MAXBUF] = { 0 };
+
+ ts_t ts1;
+ sys_timestamp (&ts1);
+
+ if (mq_send (mq, msg, MSGLEN, 0) == -1) {
+ fprintf (stderr, "ping error: mq_send (%d)\n", i);
+ return 1;
+ }
+ //printf ("send '%s'\n", buffer);
+
+ if (mq_receive (mq, buffer, sizeof(buffer) - 1, NULL) == -1) {
+ fprintf (stderr, "ping error: mq_receive (%d)\n", i);
+ return 1;
+ }
+ //printf ("receive '%s'\n", buffer);
+
+ ts_t ts2;
+ sys_timestamp (&ts2);
+ deltas[i] = diff_timestamp (&ts2, &ts1);
+ }
+
+ return 0;
+}
+
+int pong (mqd_t mq)
+{
+
+ printf ("Responding pong...\n");
+ for (int i = 0; i < nb_measurements; i++) {
+
+ char *msg = get_msg (MSGLEN);
+ char buffer[MAXBUF] = { 0 };
+
+ if (mq_receive (mq, buffer, sizeof(buffer) - 1, NULL) == -1) {
+ fprintf (stderr, "pong error: mq_receive (%d)\n", i);
+ return 1;
+ }
+ //printf ("receive '%s'\n", buffer);
+
+ if (mq_send (mq, msg, MSGLEN, 0) == -1) {
+ fprintf (stderr, "pong error: mq_send (%d)\n", i);
+ return 1;
+ }
+ //printf ("send '%s'\n", buffer);
+ }
+
+ return 0;
+}
+
+int test (dts_t *buffer, int nb)
+{
+
+ /* set global variables */
+
+ deltas = buffer;
+ nb_measurements = nb;
+
+ /* mq rtt test */
+
+ struct mq_attr attr;
+ attr.mq_flags = 0;
+ attr.mq_maxmsg = 5;
+ attr.mq_msgsize = MAXBUF;
+ attr.mq_curmsgs = 0;
+
+ mqd_t mq = mq_open ("/test_queue", O_CREAT | O_RDWR, 0644, &attr);
+ if (mq == -1) {
+ fprintf (stderr, "error: mq_open\n");
+ return 1;
+ }
+
+ pid_t pid = fork ();
+ if (pid == -1) {
+ fprintf (stderr, "error: fork\n");
+ return 1;
+ } else if (pid == 0) {
+ int rc = pong (mq);
+ mq_close (mq);
+ exit (rc);
+ }
+
+ int rc = ping (mq);
+ mq_close (mq);
+
+ if (kill (pid, SIGTERM) == 0) {
+ int wstatus;
+ if (waitpid (pid, &wstatus, WUNTRACED | WCONTINUED) == -1) {
+ fprintf (stderr, "error: waitpid\n");
+ }
+ }
+
+ return rc;
+}
--- /dev/null
+/* depend: */
+/* cflags: */
+/* linker: msg.o mtime.o test.o stat.o -lm -lrt */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <signal.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include "msg.h"
+#include "mtime.h"
+#include "test.h"
+
+/* global variables */
+
+dts_t *deltas = NULL;
+int nb_measurements = 0;
+
+char *message = "Pipe RTT";
+void (*usage_ext) (FILE *) = NULL;
+int (*parse_arg_ext) (char *) = NULL;
+
+#define MSGLEN 128
+#define MAXBUF 1024
+
+int ping (int fdin, int fdout)
+{
+
+ printf ("Sending ping...\n");
+ for (int i = 0; i < nb_measurements; i++) {
+
+ char *msg = get_msg (MSGLEN);
+ char buffer[MAXBUF] = { 0 };
+
+ ts_t ts1;
+ sys_timestamp (&ts1);
+
+ if (write (fdout, msg, MSGLEN) == -1) {
+ fprintf (stderr, "ping error: write (%d)\n", i);
+ return 1;
+ }
+ //printf ("write '%s'\n", buffer);
+
+ if (read (fdin, buffer, sizeof(buffer) - 1) == -1) {
+ fprintf (stderr, "ping error: read (%d)\n", i);
+ return 1;
+ }
+ //printf ("read '%s'\n", buffer);
+
+ ts_t ts2;
+ sys_timestamp (&ts2);
+ deltas[i] = diff_timestamp (&ts2, &ts1);
+ }
+
+ return 0;
+}
+
+int pong (int fdin, int fdout)
+{
+
+ printf ("Responding pong...\n");
+ for (int i = 0; i < nb_measurements; i++) {
+
+ char *msg = get_msg (MSGLEN);
+ char buffer[MAXBUF] = { 0 };
+
+ if (read (fdin, buffer, sizeof(buffer) - 1) == -1) {
+ fprintf (stderr, "pong error: read (%d)\n", i);
+ return 1;
+ }
+ //printf ("read '%s'\n", buffer);
+
+ if (write (fdout, msg, MSGLEN) == -1) {
+ fprintf (stderr, "pong error: write (%d)\n", i);
+ return 1;
+ }
+ //printf ("write '%s'\n", buffer);
+ }
+
+ return 0;
+}
+
+int test (dts_t *buffer, int nb)
+{
+
+ /* set global variables */
+
+ deltas = buffer;
+ nb_measurements = nb;
+
+ /* pipe test */
+
+ int pipefd[2] = { 0 };
+
+ if (pipe (pipefd) == -1) {
+ fprintf (stderr, "error: pipe\n");
+ return 1;
+ }
+
+ pid_t pid = fork ();
+ if (pid == -1) {
+ fprintf (stderr, "error: fork\n");
+ return 1;
+ } else if (pid == 0) {
+ int rc = pong (pipefd[0], pipefd[1]);
+ close (pipefd[0]);
+ close (pipefd[1]);
+ exit (rc);
+ }
+
+ int rc = ping (pipefd[0], pipefd[1]);
+ close (pipefd[0]);
+ close (pipefd[1]);
+
+ if (kill (pid, SIGTERM) == 0) {
+ int wstatus;
+ if (waitpid (pid, &wstatus, WUNTRACED | WCONTINUED) == -1) {
+ fprintf (stderr, "error: waitpid\n");
+ }
+ }
+
+ return rc;
+}
--- /dev/null
+/* depend: */
+/* cflags: */
+/* linker: msg.o mtime.o test.o stat.o -lm -lrt */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <signal.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include <netdb.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+
+#include "msg.h"
+#include "mtime.h"
+#include "test.h"
+
+/* global variables */
+
+dts_t *deltas = NULL;
+int nb_measurements = 0;
+
+char *local_host = "localhost";
+int local_port = 1024;
+char *remote_host = "localhost";
+int remote_port = 1025;
+int mode = 0;
+
+char *message = "UDP socket RTT";
+
+void _usage_ext (FILE *fd)
+{
+ fprintf (fd, "... lhost lport rhost rport [mode]\n");
+ fprintf (fd, " lhost: local host name (%s)\n", local_host);
+ fprintf (fd, " lport: local port number (%d)\n", local_port);
+ fprintf (fd, " rhost: remote host name (%s)\n", remote_host);
+ fprintf (fd, " rport: remote port number (%d)\n", remote_port);
+ fprintf (fd, " mode: 0 for ping-pong, 1 for ping, 2 for pong (%d)\n", mode);
+}
+void (*usage_ext) (FILE *) = _usage_ext;
+
+int _parse_arg_ext (char *arg)
+{
+ static int narg = 0;
+
+ int rc = 0;
+ switch (narg) {
+ case 0: local_host= arg; break;
+ case 1: local_port = atoi (arg); if (local_port < 0) rc = 1; break;
+ case 2: remote_host = arg; break;
+ case 3: remote_port = atoi (arg); if (remote_port < 0) rc = 1; break;
+ case 4: mode = atoi (arg); break;
+ default: rc = 1;
+ }
+ narg++;
+
+ return rc;
+}
+int (*parse_arg_ext) (char *) = _parse_arg_ext;
+
+#define MSGLEN 128
+#define MAXBUF 1024
+
+int ping (int local_port, int remote_addr, int remote_port)
+{
+
+ int sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ if (sock == -1) {
+ fprintf (stderr, "ping error: socket\n");
+ return 1;
+ }
+
+ struct sockaddr_in local = { 0 };
+ local.sin_family = AF_INET;
+ local.sin_port = htons (local_port);
+ local.sin_addr.s_addr = htonl (INADDR_ANY);
+
+ if (bind (sock, (struct sockaddr *)&local, sizeof (local)) == -1) {
+ fprintf (stderr, "ping error: bind\n");
+ return 1;
+ }
+
+ struct sockaddr_in remote = { 0 };
+ remote.sin_family = AF_INET;
+ remote.sin_port = htons (remote_port);
+ remote.sin_addr.s_addr = htonl (remote_addr);
+
+ printf ("Sending ping...\n");
+ for (int i = 0; i < nb_measurements; i++) {
+
+ char *msg = get_msg (MSGLEN);
+ char buffer[MAXBUF] = { 0 };
+
+ ts_t ts1;
+ sys_timestamp (&ts1);
+
+ if (sendto (sock, msg, MSGLEN, 0, (struct sockaddr *)&remote, sizeof (remote)) == -1) {
+ fprintf (stderr, "ping error: sendto (%d)\n", i);
+ return 1;
+ }
+ //printf ("sendto '%s'\n", buffer);
+
+ int len = recv (sock, buffer, sizeof (buffer) - 1, 0);
+ if (len == -1) {
+ fprintf (stderr, "ping error: recv_from (%d)\n", i);
+ return 1;
+ }
+ //printf ("recv_from '%s'\n", buffer);
+
+ ts_t ts2;
+ sys_timestamp (&ts2);
+ deltas[i] = diff_timestamp (&ts2, &ts1);
+ }
+
+ close (sock);
+
+ return 0;
+}
+
+int pong (int local_port, int remote_addr, int remote_port)
+{
+
+ int sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ if (sock == -1) {
+ fprintf (stderr, "pong error: socket\n");
+ return 1;
+ }
+
+ struct sockaddr_in local = { 0 };
+ local.sin_family = AF_INET;
+ local.sin_port = htons (local_port);
+ local.sin_addr.s_addr = htonl (INADDR_ANY);
+
+ if (bind (sock, (struct sockaddr *)&local, sizeof (local)) == -1) {
+ fprintf (stderr, "pong error: bind\n");
+ return 1;
+ }
+
+ struct sockaddr_in remote = { 0 };
+ remote.sin_family = AF_INET;
+ remote.sin_port = htons (remote_port);
+ remote.sin_addr.s_addr = htonl (remote_addr);
+
+ printf ("Sending pong...\n");
+ for (int i = 0; i < nb_measurements; i++) {
+
+ char *msg = get_msg (MSGLEN);
+ char buffer[MAXBUF] = { 0 };
+
+ int len = recv (sock, buffer, sizeof (buffer) - 1, 0);
+ if (len == -1) {
+ fprintf (stderr, "pong error: recv_from (%d)\n", i);
+ return 1;
+ }
+ //printf ("recv_from '%s'\n", buffer);
+
+ if (sendto (sock, msg, MSGLEN, 0, (struct sockaddr *)&remote, sizeof (remote)) == -1) {
+ fprintf (stderr, "pong error: sendto (%d)\n", i);
+ return 1;
+ }
+ //printf ("sendto '%s'\n", buffer);
+ }
+
+ close (sock);
+
+ return 0;
+}
+
+int get_ip (char *hostname) {
+ struct hostent *he = gethostbyname (hostname);
+ if (he == NULL) {
+ fprintf (stderr, "error: gethostbyname (%s)\n", hostname);
+ return -1;
+ }
+ struct in_addr **addr_list = (struct in_addr **) he->h_addr_list;
+ return ntohl (addr_list[0]->s_addr);
+}
+
+int test (dts_t *buffer, int nb)
+{
+
+ /* set global variables */
+
+ deltas = buffer;
+ nb_measurements = nb;
+
+ /* udp socket test */
+ int local_ip = get_ip (local_host);
+ if (local_ip == -1) {
+ return 1;
+ }
+ int remote_ip = get_ip (remote_host);
+ if (remote_ip == -1) {
+ return 1;
+ }
+
+ pid_t pid = (mode == 0 ) ? fork () : -2;
+ if (pid == -1) {
+ fprintf (stderr, "error: fork\n");
+ return 1;
+ } else if ((pid == 0) || (mode == 2)) {
+ int rc = pong (remote_port, local_ip, local_port);
+ exit (rc);
+ }
+
+ int rc = ping (local_port, remote_ip, remote_port);
+
+ if ((pid > 0) && (kill (pid, SIGTERM) == 0)) {
+ int wstatus;
+ if (waitpid (pid, &wstatus, WUNTRACED | WCONTINUED) == -1) {
+ fprintf (stderr, "error: waitpid\n");
+ }
+ }
+
+ return rc;
+}
+++ /dev/null
-/* depend: */
-/* cflags: */
-/* linker: msg.o mtime.o test.o stat.o -lm -lrt */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <fcntl.h> /* For O_* constants */
-#include <sys/stat.h> /* For mode constants */
-#include <mqueue.h>
-
-#include <signal.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-#include "msg.h"
-#include "mtime.h"
-#include "test.h"
-
-/* global variables */
-
-dts_t *deltas = NULL;
-int nb_measurements = 0;
-
-char *message = "Message queue RTT";
-void (*usage_ext) (FILE *) = NULL;
-int (*parse_arg_ext) (char *) = NULL;
-
-#define MSGLEN 128
-#define MAXBUF 1024
-
-int ping (mqd_t mq)
-{
-
- printf ("Sending ping...\n");
- for (int i = 0; i < nb_measurements; i++) {
-
- char *msg = get_msg (MSGLEN);
- char buffer[MAXBUF] = { 0 };
-
- ts_t ts1;
- sys_timestamp (&ts1);
-
- if (mq_send (mq, msg, MSGLEN, 0) == -1) {
- fprintf (stderr, "ping error: mq_send (%d)\n", i);
- return 1;
- }
- //printf ("send '%s'\n", buffer);
-
- if (mq_receive (mq, buffer, sizeof(buffer) - 1, NULL) == -1) {
- fprintf (stderr, "ping error: mq_receive (%d)\n", i);
- return 1;
- }
- //printf ("receive '%s'\n", buffer);
-
- ts_t ts2;
- sys_timestamp (&ts2);
- deltas[i] = diff_timestamp (&ts2, &ts1);
- }
-
- return 0;
-}
-
-int pong (mqd_t mq)
-{
-
- printf ("Responding pong...\n");
- for (int i = 0; i < nb_measurements; i++) {
-
- char *msg = get_msg (MSGLEN);
- char buffer[MAXBUF] = { 0 };
-
- if (mq_receive (mq, buffer, sizeof(buffer) - 1, NULL) == -1) {
- fprintf (stderr, "pong error: mq_receive (%d)\n", i);
- return 1;
- }
- //printf ("receive '%s'\n", buffer);
-
- if (mq_send (mq, msg, MSGLEN, 0) == -1) {
- fprintf (stderr, "pong error: mq_send (%d)\n", i);
- return 1;
- }
- //printf ("send '%s'\n", buffer);
- }
-
- return 0;
-}
-
-int test (dts_t *buffer, int nb)
-{
-
- /* set global variables */
-
- deltas = buffer;
- nb_measurements = nb;
-
- /* mq rtt test */
-
- struct mq_attr attr;
- attr.mq_flags = 0;
- attr.mq_maxmsg = 5;
- attr.mq_msgsize = MAXBUF;
- attr.mq_curmsgs = 0;
-
- mqd_t mq = mq_open ("/test_queue", O_CREAT | O_RDWR, 0644, &attr);
- if (mq == -1) {
- fprintf (stderr, "error: mq_open\n");
- return 1;
- }
-
- pid_t pid = fork ();
- if (pid == -1) {
- fprintf (stderr, "error: fork\n");
- return 1;
- } else if (pid == 0) {
- int rc = pong (mq);
- mq_close (mq);
- exit (rc);
- }
-
- int rc = ping (mq);
- mq_close (mq);
-
- if (kill (pid, SIGTERM) == 0) {
- int wstatus;
- if (waitpid (pid, &wstatus, WUNTRACED | WCONTINUED) == -1) {
- fprintf (stderr, "error: waitpid\n");
- }
- }
-
- return rc;
-}
+++ /dev/null
-/* depend: */
-/* cflags: */
-/* linker: msg.o mtime.o test.o stat.o -lm -lrt */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <signal.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-#include "msg.h"
-#include "mtime.h"
-#include "test.h"
-
-/* global variables */
-
-dts_t *deltas = NULL;
-int nb_measurements = 0;
-
-char *message = "Pipe RTT";
-void (*usage_ext) (FILE *) = NULL;
-int (*parse_arg_ext) (char *) = NULL;
-
-#define MSGLEN 128
-#define MAXBUF 1024
-
-int ping (int fdin, int fdout)
-{
-
- printf ("Sending ping...\n");
- for (int i = 0; i < nb_measurements; i++) {
-
- char *msg = get_msg (MSGLEN);
- char buffer[MAXBUF] = { 0 };
-
- ts_t ts1;
- sys_timestamp (&ts1);
-
- if (write (fdout, msg, MSGLEN) == -1) {
- fprintf (stderr, "ping error: write (%d)\n", i);
- return 1;
- }
- //printf ("write '%s'\n", buffer);
-
- if (read (fdin, buffer, sizeof(buffer) - 1) == -1) {
- fprintf (stderr, "ping error: read (%d)\n", i);
- return 1;
- }
- //printf ("read '%s'\n", buffer);
-
- ts_t ts2;
- sys_timestamp (&ts2);
- deltas[i] = diff_timestamp (&ts2, &ts1);
- }
-
- return 0;
-}
-
-int pong (int fdin, int fdout)
-{
-
- printf ("Responding pong...\n");
- for (int i = 0; i < nb_measurements; i++) {
-
- char *msg = get_msg (MSGLEN);
- char buffer[MAXBUF] = { 0 };
-
- if (read (fdin, buffer, sizeof(buffer) - 1) == -1) {
- fprintf (stderr, "ping error: read (%d)\n", i);
- return 1;
- }
- //printf ("read '%s'\n", buffer);
-
- if (write (fdout, msg, MSGLEN) == -1) {
- fprintf (stderr, "ping error: write (%d)\n", i);
- return 1;
- }
- //printf ("write '%s'\n", buffer);
- }
-
- return 0;
-}
-
-int test (dts_t *buffer, int nb)
-{
-
- /* set global variables */
-
- deltas = buffer;
- nb_measurements = nb;
-
- /* pipe test */
-
- int pipefd[2] = { 0 };
-
- if (pipe (pipefd) == -1) {
- fprintf (stderr, "error: pipe\n");
- return 1;
- }
-
- pid_t pid = fork ();
- if (pid == -1) {
- fprintf (stderr, "error: fork\n");
- return 1;
- } else if (pid == 0) {
- int rc = pong (pipefd[0], pipefd[1]);
- close (pipefd[0]);
- close (pipefd[1]);
- exit (rc);
- }
-
- int rc = ping (pipefd[0], pipefd[1]);
- close (pipefd[0]);
- close (pipefd[1]);
-
- if (kill (pid, SIGTERM) == 0) {
- int wstatus;
- if (waitpid (pid, &wstatus, WUNTRACED | WCONTINUED) == -1) {
- fprintf (stderr, "error: waitpid\n");
- }
- }
-
- return rc;
-}
+++ /dev/null
-/* depend: */
-/* cflags: */
-/* linker: msg.o mtime.o test.o stat.o -lm -lrt */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <signal.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-#include <netdb.h>
-#include <arpa/inet.h>
-#include <sys/socket.h>
-
-#include "msg.h"
-#include "mtime.h"
-#include "test.h"
-
-/* global variables */
-
-dts_t *deltas = NULL;
-int nb_measurements = 0;
-
-char *local_host = "localhost";
-int local_port = 1024;
-char *remote_host = "localhost";
-int remote_port = 1025;
-int mode = 0;
-
-char *message = "UDP socket RTT";
-
-void _usage_ext (FILE *fd)
-{
- fprintf (fd, "... lhost lport rhost rport [mode]\n");
- fprintf (fd, " lhost: local host name (%s)\n", local_host);
- fprintf (fd, " lport: local port number (%d)\n", local_port);
- fprintf (fd, " rhost: remote host name (%s)\n", remote_host);
- fprintf (fd, " rport: remote port number (%d)\n", remote_port);
- fprintf (fd, " mode: 0 for ping-pong, 1 for ping, 2 for pong (%d)\n", mode);
-}
-void (*usage_ext) (FILE *) = _usage_ext;
-
-int _parse_arg_ext (char *arg)
-{
- static int narg = 0;
-
- int rc = 0;
- switch (narg) {
- case 0: local_host= arg; break;
- case 1: local_port = atoi (arg); if (local_port < 0) rc = 1; break;
- case 2: remote_host = arg; break;
- case 3: remote_port = atoi (arg); if (remote_port < 0) rc = 1; break;
- case 4: mode = atoi (arg); break;
- default: rc = 1;
- }
- narg++;
-
- return rc;
-}
-int (*parse_arg_ext) (char *) = _parse_arg_ext;
-
-#define MSGLEN 128
-#define MAXBUF 1024
-
-int ping (int local_port, int remote_addr, int remote_port)
-{
-
- int sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (sock == -1) {
- fprintf (stderr, "ping error: socket\n");
- return 1;
- }
-
- struct sockaddr_in local = { 0 };
- local.sin_family = AF_INET;
- local.sin_port = htons (local_port);
- local.sin_addr.s_addr = htonl (INADDR_ANY);
-
- if (bind (sock, (struct sockaddr *)&local, sizeof (local)) == -1) {
- fprintf (stderr, "ping error: bind\n");
- return 1;
- }
-
- struct sockaddr_in remote = { 0 };
- remote.sin_family = AF_INET;
- remote.sin_port = htons (remote_port);
- remote.sin_addr.s_addr = htonl (remote_addr);
-
- printf ("Sending ping...\n");
- for (int i = 0; i < nb_measurements; i++) {
-
- char *msg = get_msg (MSGLEN);
- char buffer[MAXBUF] = { 0 };
-
- ts_t ts1;
- sys_timestamp (&ts1);
-
- if (sendto (sock, msg, MSGLEN, 0, (struct sockaddr *)&remote, sizeof (remote)) == -1) {
- fprintf (stderr, "ping error: sendto (%d)\n", i);
- return 1;
- }
- //printf ("sendto '%s'\n", buffer);
-
- int len = recv (sock, buffer, sizeof (buffer) - 1, 0);
- if (len == -1) {
- fprintf (stderr, "ping error: recv_from (%d)\n", i);
- return 1;
- }
- //printf ("recv_from '%s'\n", buffer);
-
- ts_t ts2;
- sys_timestamp (&ts2);
- deltas[i] = diff_timestamp (&ts2, &ts1);
- }
-
- close (sock);
-
- return 0;
-}
-
-int pong (int local_port, int remote_addr, int remote_port)
-{
-
- int sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (sock == -1) {
- fprintf (stderr, "pong error: socket\n");
- return 1;
- }
-
- struct sockaddr_in local = { 0 };
- local.sin_family = AF_INET;
- local.sin_port = htons (local_port);
- local.sin_addr.s_addr = htonl (INADDR_ANY);
-
- if (bind (sock, (struct sockaddr *)&local, sizeof (local)) == -1) {
- fprintf (stderr, "pong error: bind\n");
- return 1;
- }
-
- struct sockaddr_in remote = { 0 };
- remote.sin_family = AF_INET;
- remote.sin_port = htons (remote_port);
- remote.sin_addr.s_addr = htonl (remote_addr);
-
- printf ("Sending pong...\n");
- for (int i = 0; i < nb_measurements; i++) {
-
- char *msg = get_msg (MSGLEN);
- char buffer[MAXBUF] = { 0 };
-
- int len = recv (sock, buffer, sizeof (buffer) - 1, 0);
- if (len == -1) {
- fprintf (stderr, "pong error: recv_from (%d)\n", i);
- return 1;
- }
- //printf ("recv_from '%s'\n", buffer);
-
- if (sendto (sock, msg, MSGLEN, 0, (struct sockaddr *)&remote, sizeof (remote)) == -1) {
- fprintf (stderr, "pong error: sendto (%d)\n", i);
- return 1;
- }
- //printf ("sendto '%s'\n", buffer);
- }
-
- close (sock);
-
- return 0;
-}
-
-int get_ip (char *hostname) {
- struct hostent *he = gethostbyname (hostname);
- if (he == NULL) {
- fprintf (stderr, "error: gethostbyname (%s)\n", hostname);
- return -1;
- }
- struct in_addr **addr_list = (struct in_addr **) he->h_addr_list;
- return ntohl (addr_list[0]->s_addr);
-}
-
-int test (dts_t *buffer, int nb)
-{
-
- /* set global variables */
-
- deltas = buffer;
- nb_measurements = nb;
-
- /* udp socket test */
- int local_ip = get_ip (local_host);
- if (local_ip == -1) {
- return 1;
- }
- int remote_ip = get_ip (remote_host);
- if (remote_ip == -1) {
- return 1;
- }
-
- pid_t pid = (mode == 0 ) ? fork () : -2;
- if (pid == -1) {
- fprintf (stderr, "error: fork\n");
- return 1;
- } else if ((pid == 0) || (mode == 2)) {
- int rc = pong (remote_port, local_ip, local_port);
- exit (rc);
- }
-
- int rc = ping (local_port, remote_ip, remote_port);
-
- if ((pid > 0) && (kill (pid, SIGTERM) == 0)) {
- int wstatus;
- if (waitpid (pid, &wstatus, WUNTRACED | WCONTINUED) == -1) {
- fprintf (stderr, "error: waitpid\n");
- }
- }
-
- return rc;
-}