From 2e53c297135a3468afda4c4582408811595e5a58 Mon Sep 17 00:00:00 2001 From: Laurent Ghigonis Date: Sun, 16 Jun 2013 17:29:10 +0200 Subject: libglouglou: traceroute verbosity --- libglouglou/examples/ggtrace.c | 3 ++- libglouglou/examples/traceroute.c | 3 ++- libglouglou/libggnet_traceroute.c | 38 ++++++++++++++++++++++++-------------- libglouglou/libggnet_traceroute.h | 3 ++- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/libglouglou/examples/ggtrace.c b/libglouglou/examples/ggtrace.c index dd50fa9..813fcaa 100644 --- a/libglouglou/examples/ggtrace.c +++ b/libglouglou/examples/ggtrace.c @@ -33,6 +33,7 @@ main(int argc, char *argv[]) struct ggnet_traceroute_req *req; struct addr ip; struct timeval tv; + int verbose = 0; if (argc < 2) { printf("usage: traceroute \n"); @@ -45,7 +46,7 @@ main(int argc, char *argv[]) _ev_base = event_base_new(); - ggtr = ggnet_traceroute_new(_ev_base, get_iface(argv[1])); + ggtr = ggnet_traceroute_new(_ev_base, get_iface(argv[1]), verbose); droppriv("nobody", 1, NULL); /* bad practise, use dedicated user */ req = ggnet_traceroute_trace_tcp_intrace(ggtr, &ip, 80, 1234, 0x8888, _cb_done, NULL, NULL); diff --git a/libglouglou/examples/traceroute.c b/libglouglou/examples/traceroute.c index d2fbb37..fe1ca39 100644 --- a/libglouglou/examples/traceroute.c +++ b/libglouglou/examples/traceroute.c @@ -33,6 +33,7 @@ main(int argc, char *argv[]) struct ggnet_traceroute_req *req; struct addr ip; struct timeval tv; + int verbose = 0; if (argc < 2) { printf("usage: traceroute \n"); @@ -45,7 +46,7 @@ main(int argc, char *argv[]) _ev_base = event_base_new(); - ggtr = ggnet_traceroute_new(_ev_base, get_iface(argv[1])); + ggtr = ggnet_traceroute_new(_ev_base, get_iface(argv[1]), verbose); droppriv("nobody", 1, NULL); /* bad practise, use dedicated user */ req = ggnet_traceroute_trace_tcp(ggtr, &ip, 80, _cb_done, NULL, NULL); diff --git a/libglouglou/libggnet_traceroute.c b/libglouglou/libggnet_traceroute.c index c313488..0c18d9f 100644 --- a/libglouglou/libggnet_traceroute.c +++ b/libglouglou/libggnet_traceroute.c @@ -99,7 +99,7 @@ struct trace_pkt { }; struct ggnet_traceroute * -ggnet_traceroute_new(struct event_base *ev_base, char *iface) +ggnet_traceroute_new(struct event_base *ev_base, char *iface, int verbose) { struct ggnet_traceroute *ggtr; char ebuff[PCAP_ERRBUF_SIZE]; @@ -124,6 +124,7 @@ ggnet_traceroute_new(struct event_base *ev_base, char *iface) err(1, "pcap_open_live(%s)", iface); ggtr->pcap_dllen = pcap_dloff(ggtr->pcap); ggtr->pcap_fd = pcap_fileno(ggtr->pcap); + ggtr->verbose = verbose; return ggtr; } @@ -293,9 +294,10 @@ _cb_send(evutil_socket_t fd, short what, void *arg) int sport = -1; req = arg; - printf("XXX cbggnet_traceroute cb_send %s -> %s\n", - addr_ntoa(&req->srcip), addr_ntoa(&req->target->ip)); ggtr = req->ggtr; + if (ggtr->verbose) + printf("XXX cbggnet_traceroute cb_send %s -> %s\n", + addr_ntoa(&req->srcip), addr_ntoa(&req->target->ip)); pkt = (struct trace_pkt *)buf; len = IP_HDR_LEN + TCP_HDR_LEN; @@ -367,19 +369,20 @@ _cb_recv(evutil_socket_t fd, short what, void *arg) char *p, *flags; req = arg; - printf("XXX cbggnet_traceroute cb_recv %s -> %s\n", + ggtr = req->ggtr; + if (ggtr->verbose) + printf("XXX cbggnet_traceroute cb_recv %s -> %s\n", addr_ntoa(&req->srcip), addr_ntoa(&req->target->ip)); // XXX call cb_hop if hop successfuly detected // req->cb_hop(req, hop, req->data); - req = arg; - ggtr = req->ggtr; if ((pread = (u_char *) pcap_next(ggtr->pcap, &ph)) == NULL) { printf("libggnet_traceroute _cb_recv: read error\n"); goto reschedule_recv; } - printf("XXX packet received\n"); + if (ggtr->verbose) + printf("XXX packet received\n"); /* decode the current packet : ttl, ip, ... */ ip = (struct ip_hdr *) (pread + ggtr->pcap_dllen); if (ip->ip_v != 4) @@ -387,7 +390,9 @@ _cb_recv(evutil_socket_t fd, short what, void *arg) p = ip_ntoa(&ip->ip_src); if ((addr_aton(p, &ip_src)) == -1) goto reschedule_recv; - printf("XXX packet IP received from %s, ip_id %d\n", addr_ntoa(&ip_src), ntohs(ip->ip_id)); + if (ggtr->verbose) + printf("XXX packet IP received from %s, ip_id %d\n", + addr_ntoa(&ip_src), ntohs(ip->ip_id)); switch(ip->ip_p) { @@ -395,13 +400,15 @@ _cb_recv(evutil_socket_t fd, short what, void *arg) if (addr_cmp(&ip_src, &(req->target->ip)) != 0) goto reschedule_recv; tcp = (struct tcp_hdr *)((u_char *)ip + IP_HDR_LEN); - printf("XXX TCP %d %d %d\n", ntohs(tcp->th_sport), - req->params->tcp.dport, tcp->th_seq); + if (ggtr->verbose) + printf("XXX TCP %d %d %d\n", ntohs(tcp->th_sport), + req->params->tcp.dport, tcp->th_seq); if (((tcp->th_flags == TH_SYN + TH_ACK) || (tcp->th_flags == TH_RST + TH_ACK)) && (ntohs(tcp->th_sport) == req->params->tcp.dport)) { /* target answer */ - printf("XXX found target !\n"); + if (ggtr->verbose) + printf("XXX found target !\n"); hop = _hop_sport(req, ntohs(tcp->th_dport)); if (!hop) { printf("libggnet_traceroute _cb_recv: WARNING: TCP answer with dport not matching sent sport (%d) not found !\n", @@ -420,7 +427,8 @@ _cb_recv(evutil_socket_t fd, short what, void *arg) break; case IP_PROTO_ICMP: - printf("XXX is ICMP\n"); + if (ggtr->verbose) + printf("XXX is ICMP\n"); /* answer from a hop */ icmp = (struct icmp_hdr *)((u_char *)ip + IP_HDR_LEN); /* XXX ? look for TTL_EXPIRED, PROHIBITED msgs */ @@ -478,10 +486,12 @@ _cb_trace_timeout(evutil_socket_t fd, short what, void *arg) req = arg; - printf("XXX cbggnet_traceroute cb_trace_timeout (%s -> %s)\n", + if (req->ggtr->verbose) + printf("XXX cbggnet_traceroute cb_trace_timeout (%s -> %s)\n", addr_ntoa(&req->srcip), addr_ntoa(&req->target->ip)); last = _hop_last(req); - printf("XXX last %p\n", last); + if (req->ggtr->verbose) + printf("XXX last %p\n", last); if (last) req->target->ttl = last->ttl + 1; req->cb_done(req, req->data); diff --git a/libglouglou/libggnet_traceroute.h b/libglouglou/libggnet_traceroute.h index 8baa3db..7764319 100644 --- a/libglouglou/libggnet_traceroute.h +++ b/libglouglou/libggnet_traceroute.h @@ -76,11 +76,12 @@ struct ggnet_traceroute { int pcap_fd; int pcap_dllen; /* datalink layer hdr len */ int req_pending; + int verbose; LIST_HEAD(, ggnet_traceroute_req) req_list; }; struct ggnet_traceroute * - ggnet_traceroute_new(struct event_base *, char *); + ggnet_traceroute_new(struct event_base *, char *, int); void ggnet_traceroute_free(struct ggnet_traceroute *); struct ggnet_traceroute_req * ggnet_traceroute_trace_tcp(struct ggnet_traceroute *, -- cgit v1.2.3-59-g8ed1b