diff options
author | Laurent Ghigonis <laurent@p1sec.com> | 2013-06-09 23:29:21 +0200 |
---|---|---|
committer | Laurent Ghigonis <laurent@p1sec.com> | 2013-06-09 23:29:21 +0200 |
commit | e79c1769d8cdd269f9c30a36409e7535ec47f2ff (patch) | |
tree | ff09cb2084c1b15b50bfafe398efe200f9664942 | |
parent | libglouglou: add explanation header (diff) | |
download | glouglou-e79c1769d8cdd269f9c30a36409e7535ec47f2ff.tar.xz glouglou-e79c1769d8cdd269f9c30a36409e7535ec47f2ff.zip |
libglouglou: traceroute TCP intrace mode
-rw-r--r-- | libglouglou/libggnet_traceroute.c | 41 | ||||
-rw-r--r-- | libglouglou/libggnet_traceroute.h | 11 |
2 files changed, 42 insertions, 10 deletions
diff --git a/libglouglou/libggnet_traceroute.c b/libglouglou/libggnet_traceroute.c index 92b1149..c313488 100644 --- a/libglouglou/libggnet_traceroute.c +++ b/libglouglou/libggnet_traceroute.c @@ -145,8 +145,8 @@ ggnet_traceroute_free(struct ggnet_traceroute *ggtr) } struct ggnet_traceroute_req * -ggnet_traceroute_trace_tcp(struct ggnet_traceroute *ggtr, struct addr *ip, - int dport, +ggnet_traceroute_trace_tcp(struct ggnet_traceroute *ggtr, + 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 *), @@ -164,6 +164,27 @@ ggnet_traceroute_trace_tcp(struct ggnet_traceroute *ggtr, struct addr *ip, } struct ggnet_traceroute_req * +ggnet_traceroute_trace_tcp_intrace(struct ggnet_traceroute *ggtr, + struct addr *ip, int sport, int dport, int ip_id, + 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_req_params *params; + + params = calloc(1, sizeof(struct ggnet_traceroute_req_params)); + if (!params) + err(1, "could not allocate ggnet_traceroute_req_params\n"); + params->mode = TRACEMODE_TCP_INTRACE; + params->ip.id = ip_id; + params->tcp.dport = dport; + params->tcp.sport = sport; + + return ggnet_traceroute_trace(ggtr, ip, params, cb_done, cb_hop, data); +} + +struct ggnet_traceroute_req * ggnet_traceroute_trace(struct ggnet_traceroute *ggtr, struct addr *ip, struct ggnet_traceroute_req_params *params, void (*cb_done)(struct ggnet_traceroute_req *, void *), @@ -267,7 +288,9 @@ _cb_send(evutil_socket_t fd, short what, void *arg) struct ggnet_traceroute *ggtr; u_char buf[BUFSIZ]; struct trace_pkt *pkt; - int len, lensent, ttl, ip_id, sport, i; + int len, lensent, ttl, i; + int ip_id = -1; + int sport = -1; req = arg; printf("XXX cbggnet_traceroute cb_send %s -> %s\n", @@ -284,11 +307,16 @@ _cb_send(evutil_socket_t fd, short what, void *arg) } hop->ttl = ttl; //addr_pack(hop->ip, ADDR_TYPE_IP, IP_ADDR_BITS, ip, IP_ADDR_LEN); - ip_id = rand_uint16(ggtr->pkt_rand); - sport = rand_uint16(ggtr->pkt_rand); switch (req->params->mode) { - case TRACEMODE_AUTO: case TRACEMODE_TCP: + case TRACEMODE_TCP_INTRACE: + if (req->params->mode == TRACEMODE_TCP) { + ip_id = rand_uint16(ggtr->pkt_rand); + sport = rand_uint16(ggtr->pkt_rand); + } else { + ip_id = req->params->ip.id; + sport = req->params->tcp.sport; + } ip_pack_hdr(&pkt->pkt_hdr_i.ip, IP_TOS_LOWDELAY, len, ip_id, 0, ttl, IP_PROTO_TCP, req->srcip.addr_ip, req->target->ip.addr_ip); @@ -298,6 +326,7 @@ _cb_send(evutil_socket_t fd, short what, void *arg) TH_SYN, rand_uint16(ggtr->pkt_rand), 0); break; case TRACEMODE_ICMP: + ip_id = rand_uint16(ggtr->pkt_rand); ip_pack_hdr(&pkt->pkt_hdr_i.ip, IP_TOS_LOWDELAY, len, ip_id, 0, ttl, IP_PROTO_ICMP, req->srcip.addr_ip, req->target->ip.addr_ip); diff --git a/libglouglou/libggnet_traceroute.h b/libglouglou/libggnet_traceroute.h index 2507af8..8baa3db 100644 --- a/libglouglou/libggnet_traceroute.h +++ b/libglouglou/libggnet_traceroute.h @@ -11,9 +11,9 @@ #define TRACEROUTE_NB_PROBES 3 enum tracemode { - TRACEMODE_AUTO = 0, - TRACEMODE_ICMP = 1, - TRACEMODE_TCP = 2, + TRACEMODE_ICMP = 0, + TRACEMODE_TCP = 1, + TRACEMODE_TCP_INTRACE = 2, }; struct ggnet_traceroute_hop { @@ -34,6 +34,9 @@ struct ggnet_traceroute_hop { struct ggnet_traceroute_req_params { enum tracemode mode; + struct { + int id; + } ip; union { struct { int dport; @@ -88,7 +91,7 @@ struct ggnet_traceroute_req * void *); struct ggnet_traceroute_req * ggnet_traceroute_trace_tcp_intrace(struct ggnet_traceroute *, - struct addr *ip, int dport, int sport, + 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 *), |