From 1494d0bcb29e9af40a1f085ae6b940cb5b5799f0 Mon Sep 17 00:00:00 2001 From: Laurent Ghigonis Date: Sat, 8 Jun 2013 16:30:36 +0200 Subject: libglouglou: traceroute delay --- libglouglou/examples/traceroute.c | 2 +- libglouglou/libggnet_traceroute.c | 24 ++++++++++++++++++++++-- libglouglou/libggnet_traceroute.h | 9 +++++---- libglouglou/utils.c | 1 + 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/libglouglou/examples/traceroute.c b/libglouglou/examples/traceroute.c index 5a618a2..a791b4d 100644 --- a/libglouglou/examples/traceroute.c +++ b/libglouglou/examples/traceroute.c @@ -55,7 +55,7 @@ main(int argc, char *argv[]) if (_answer) { printf("%s:\n", addr_ntoa(&ip)); TAILQ_FOREACH(hop, &_route->hops_list, entry) { - printf("%2.2d: %s (%d) [XXX %p]\n", hop->ttl, addr_ntoa(&hop->ip), hop->delay, hop); + printf("%.2d: %s %s %.2f [XXX %p]\n", hop->ttl, addr_ntoa(&hop->ip), hop->answer, hop->delay, hop); } } else { printf("no answer\n"); diff --git a/libglouglou/libggnet_traceroute.c b/libglouglou/libggnet_traceroute.c index 602e349..bd5d76f 100644 --- a/libglouglou/libggnet_traceroute.c +++ b/libglouglou/libggnet_traceroute.c @@ -86,6 +86,7 @@ static struct ggnet_traceroute_hop * static struct ggnet_traceroute_hop * _hop_last(struct ggnet_traceroute_req *); static int pcap_dloff(pcap_t *); // XXX move to libggnet_utils ? +double timeval_diff(struct timeval *, struct timeval *); struct trace_pkt { union { @@ -288,6 +289,7 @@ _cb_send(evutil_socket_t fd, short what, void *arg) } ip_checksum(pkt, len); TAILQ_INSERT_TAIL(&req->hops_list, hop, entry); + gettimeofday(&hop->sendtime, NULL); for (i=0; iip_ids[i] = ip_id; hop->sports[i] = sport; @@ -307,7 +309,7 @@ static void _cb_recv(evutil_socket_t fd, short what, void *arg) { struct ggnet_traceroute_req *req; - struct ggnet_traceroute_hop *hop; + struct ggnet_traceroute_hop *hop = NULL; struct ggnet_traceroute *ggtr; struct pcap_pkthdr ph; u_char *pread; @@ -315,6 +317,7 @@ _cb_recv(evutil_socket_t fd, short what, void *arg) struct tcp_hdr *tcp; struct icmp_hdr *icmp; struct addr ip_src; + struct timeval recvtime; char *p, *flags; req = arg; @@ -402,7 +405,7 @@ _cb_recv(evutil_socket_t fd, short what, void *arg) break; } } else if (icmp->icmp_type == ICMP_TIMEXCEED) { - strncpy(hop->answer, "A!", sizeof(hop->answer)); + strncpy(hop->answer, "X!", sizeof(hop->answer)); } if (hop->ttl == req->run.last_ttl_sent && addr_cmp(&hop->ip, &req->target->ip)) { @@ -414,6 +417,11 @@ _cb_recv(evutil_socket_t fd, short what, void *arg) reschedule_recv: event_add(req->run.ev_recv, NULL); + + if (hop) { + gettimeofday(&recvtime, NULL); + hop->delay = timeval_diff(&hop->sendtime, &recvtime) / 1000; + } } static void @@ -550,3 +558,15 @@ freerrset(answers); return asn; } */ + +double +timeval_diff(struct timeval *x, struct timeval *y) +{ + double x_ms , y_ms , diff; + + x_ms = (double)x->tv_sec*1000000 + (double)x->tv_usec; + y_ms = (double)y->tv_sec*1000000 + (double)y->tv_usec; + diff = (double)y_ms - (double)x_ms; + + return diff; +} diff --git a/libglouglou/libggnet_traceroute.h b/libglouglou/libggnet_traceroute.h index 5b172a9..85af279 100644 --- a/libglouglou/libggnet_traceroute.h +++ b/libglouglou/libggnet_traceroute.h @@ -24,10 +24,11 @@ struct ggnet_traceroute_hop { int ip_ids[TRACEROUTE_NB_PROBES]; int sports[TRACEROUTE_NB_PROBES]; struct addr ip; - int delay; - int delay_dev; - int loss; - int loss_dev; + struct timeval sendtime; + float delay; + float delay_dev; + float loss; + float loss_dev; int asn; }; diff --git a/libglouglou/utils.c b/libglouglou/utils.c index a7ceffd..050a753 100644 --- a/libglouglou/utils.c +++ b/libglouglou/utils.c @@ -214,3 +214,4 @@ get_iface(char *ip) { return strdup(entry.intf_name); } + -- cgit v1.2.3-59-g8ed1b