aboutsummaryrefslogtreecommitdiffstats
path: root/libglouglou/libggnet_traceroute.h
diff options
context:
space:
mode:
Diffstat (limited to 'libglouglou/libggnet_traceroute.h')
-rw-r--r--libglouglou/libggnet_traceroute.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/libglouglou/libggnet_traceroute.h b/libglouglou/libggnet_traceroute.h
new file mode 100644
index 0000000..833705b
--- /dev/null
+++ b/libglouglou/libggnet_traceroute.h
@@ -0,0 +1,62 @@
+#include <event.h>
+#include <dnet.h>
+#include <pcap.h>
+
+#if defined(__OpenBSD__)
+#include <sys/queue.h>
+#else
+#include <bsd/sys/queue.h>
+#endif
+
+#define TRACEROUTE_NB_PROBES 3
+
+struct ggnet_traceroute_hop {
+ TAILQ_ENTRY(ggnet_traceroute_hop) entry;
+ int ttl;
+ int answer_count; /* on TRACEROUTE_NB_PROBES sent probes */
+ char answer[2 * TRACEROUTE_NB_PROBES];
+ struct addr ip;
+ int delay;
+ int delay_dev;
+ int loss;
+ int loss_dev;
+ int asn;
+};
+
+struct ggnet_traceroute_req {
+ LIST_ENTRY(ggnet_traceroute_req) entry;
+ struct ggnet_traceroute_hop *target;
+ struct addr srcip;
+ int probes_count;
+ int hops_count;
+ TAILQ_HEAD(, ggnet_traceroute_hop) hops_list;
+ struct {
+ struct event *ev_recv;
+ struct event *ev_send;
+ struct evtimer *ev_timeout;
+ struct timeval tv_timeout;
+ int last_ttl_sent;
+ } run;
+ void (*cb_usr)(struct in_addr *, char *, void *);
+ void *data;
+};
+
+struct ggnet_traceroute {
+ struct event_base *ev_base;
+ pcap_t *pcap;
+ ip_t *pkt_ip;
+ rand_t *pkt_rand;
+ int pcap_fd;
+ int pcap_dllen; /* datalink layer hdr len */
+ int req_pending;
+ LIST_HEAD(, ggnet_traceroute_req) req_list;
+};
+
+struct ggnet_traceroute *ggnet_traceroute_new(struct event_base *, char *);
+void ggnet_traceroute_free(struct ggnet_traceroute *);
+struct ggnet_traceroute_req *ggnet_traceroute_trace(struct ggnet_traceroute *,
+ struct in_addr *ip,
+ void (*cb_usr)(struct in_addr *, struct ggnet_traceroute_req *, void *),
+ void *);
+void ggnet_traceroute_cancel(struct ggnet_traceroute *,
+ struct ggnet_traceroute_req *);