aboutsummaryrefslogtreecommitdiffstats
path: root/libglouglou/libggnet_traceroute.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglouglou/libggnet_traceroute.c')
-rw-r--r--libglouglou/libggnet_traceroute.c41
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);