aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2013-06-09 23:29:21 +0200
committerLaurent Ghigonis <laurent@p1sec.com>2013-06-09 23:29:21 +0200
commite79c1769d8cdd269f9c30a36409e7535ec47f2ff (patch)
treeff09cb2084c1b15b50bfafe398efe200f9664942
parentlibglouglou: add explanation header (diff)
downloadglouglou-e79c1769d8cdd269f9c30a36409e7535ec47f2ff.tar.xz
glouglou-e79c1769d8cdd269f9c30a36409e7535ec47f2ff.zip
libglouglou: traceroute TCP intrace mode
-rw-r--r--libglouglou/libggnet_traceroute.c41
-rw-r--r--libglouglou/libggnet_traceroute.h11
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 *),