diff options
Diffstat (limited to 'libglouglou/libggnet_traceroute.c')
-rw-r--r-- | libglouglou/libggnet_traceroute.c | 41 |
1 files changed, 35 insertions, 6 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); |