aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libglouglou/examples/ggtrace.c3
-rw-r--r--libglouglou/examples/traceroute.c3
-rw-r--r--libglouglou/libggnet_traceroute.c38
-rw-r--r--libglouglou/libggnet_traceroute.h3
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 <ip>\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 <ip>\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 *,