#ifndef _LIBGGNET_TRACEROUTE_H #define _LIBGGNET_TRACEROUTE_H 1 #include #include #include #if defined(__OpenBSD__) #include #else #include #endif #define TRACEROUTE_NB_PROBES 3 enum tracemode { TRACEMODE_ICMP = 0, TRACEMODE_TCP = 1, TRACEMODE_TCP_INTRACE = 2, }; 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]; int ip_ids[TRACEROUTE_NB_PROBES]; int sports[TRACEROUTE_NB_PROBES]; struct addr ip; struct timeval sendtime; float delay; float delay_dev; float loss; float loss_dev; int asn; }; struct ggnet_traceroute_req_params { enum tracemode mode; struct { int id; } ip; union { struct { int dport; int sport; } tcp; struct icmp { } icmp; }; }; struct ggnet_traceroute_req { LIST_ENTRY(ggnet_traceroute_req) entry; struct ggnet_traceroute_hop *target; struct addr srcip; struct ggnet_traceroute_req_params *params; int hopcount_total; int hopcount_answering; TAILQ_HEAD(tailhead, ggnet_traceroute_hop) hops_list; struct { struct event *ev_recv; struct event *ev_send; struct event *ev_timeout; struct timeval tv_timeout; int last_ttl_sent; } run; void (*cb_done)(struct ggnet_traceroute_req *, void *); void (*cb_hop)(struct ggnet_traceroute_req *, struct ggnet_traceroute_hop *, void *); void *data; struct ggnet_traceroute *ggtr; }; struct ggnet_traceroute { struct event_base *ev_base; pcap_t *pcap; intf_t *intf; ip_t *pkt_ip; rand_t *pkt_rand; 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 *, int); void ggnet_traceroute_free(struct ggnet_traceroute *); struct ggnet_traceroute_req * ggnet_traceroute_trace_tcp(struct ggnet_traceroute *, struct addr *ip, int dport, void (*cb_done)(struct ggnet_traceroute_req *, void *), void (*cb_hop)(struct ggnet_traceroute_req *, struct ggnet_traceroute_hop *, void *), void *); struct ggnet_traceroute_req * ggnet_traceroute_trace_tcp_intrace(struct ggnet_traceroute *, struct addr *ip, int, int, int, void (*cb_done)(struct ggnet_traceroute_req *, void *), void (*cb_hop)(struct ggnet_traceroute_req *, struct ggnet_traceroute_hop *, void *), void *); struct ggnet_traceroute_req * ggnet_traceroute_trace(struct ggnet_traceroute *, struct addr *ip, struct ggnet_traceroute_req_params *, void (*cb_done)(struct ggnet_traceroute_req *, void *), void (*cb_hop)(struct ggnet_traceroute_req *, struct ggnet_traceroute_hop *, void *), void *); void ggnet_traceroute_trace_free(struct ggnet_traceroute_req *); char *ggnet_traceroute_report(struct ggnet_traceroute_req *); #endif /* _LIBGGNET_TRACEROUTE_H */