diff options
Diffstat (limited to 'libglouglou/libggnet_traceroute.h')
-rw-r--r-- | libglouglou/libggnet_traceroute.h | 62 |
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 *); |