aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2013-06-08 16:30:36 +0200
committerLaurent Ghigonis <laurent@p1sec.com>2013-06-08 16:30:36 +0200
commit1494d0bcb29e9af40a1f085ae6b940cb5b5799f0 (patch)
treedd7148a0a00567ba8bfe19dceb3901786b6d816c
parentlibglouglou: remove useless comment (diff)
downloadglouglou-1494d0bcb29e9af40a1f085ae6b940cb5b5799f0.tar.xz
glouglou-1494d0bcb29e9af40a1f085ae6b940cb5b5799f0.zip
libglouglou: traceroute delay
-rw-r--r--libglouglou/examples/traceroute.c2
-rw-r--r--libglouglou/libggnet_traceroute.c24
-rw-r--r--libglouglou/libggnet_traceroute.h9
-rw-r--r--libglouglou/utils.c1
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; i<TRACEROUTE_NB_PROBES; i++) {
hop->ip_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);
}
+