aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2013-06-08 14:15:16 +0200
committerLaurent Ghigonis <laurent@p1sec.com>2013-06-08 14:15:16 +0200
commit391552b89ed2c4f9c3572e773c8205f086fba352 (patch)
tree64a22a27f6ad6538551387c505109b94940ac1ef
parentlibglouglou: move functions around (diff)
downloadglouglou-391552b89ed2c4f9c3572e773c8205f086fba352.tar.xz
glouglou-391552b89ed2c4f9c3572e773c8205f086fba352.zip
libglouglou: traceroute simpler API, introduce req params
-rw-r--r--libglouglou/examples/traceroute.c3
-rw-r--r--libglouglou/libggnet_traceroute.c46
-rw-r--r--libglouglou/libggnet_traceroute.h31
3 files changed, 60 insertions, 20 deletions
diff --git a/libglouglou/examples/traceroute.c b/libglouglou/examples/traceroute.c
index 504b3fc..5a618a2 100644
--- a/libglouglou/examples/traceroute.c
+++ b/libglouglou/examples/traceroute.c
@@ -47,8 +47,7 @@ main(int argc, char *argv[])
ggtr = ggnet_traceroute_new(_ev_base, get_iface(argv[1]));
droppriv("nobody", 1, NULL); /* bad practise, use dedicated user */
- ggnet_traceroute_trace(ggtr, &ip, TRACEMODE_AUTO,
- _cb_traceroute, NULL, NULL);
+ ggnet_traceroute_trace_tcp(ggtr, &ip, 80, _cb_traceroute, NULL, NULL);
event_base_loopexit(_ev_base, &tv);
event_base_dispatch(_ev_base);
diff --git a/libglouglou/libggnet_traceroute.c b/libglouglou/libggnet_traceroute.c
index 2691d3e..0efafb4 100644
--- a/libglouglou/libggnet_traceroute.c
+++ b/libglouglou/libggnet_traceroute.c
@@ -144,8 +144,33 @@ ggnet_traceroute_free(struct ggnet_traceroute *ggtr)
}
struct ggnet_traceroute_req *
-ggnet_traceroute_trace(struct ggnet_traceroute *ggtr,
- struct addr *ip, enum tracemode mode,
+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 *),
+ 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;
+ params->tcp.dport = dport;
+
+ return ggnet_traceroute_trace(ggtr, ip, params, cb_done, cb_hop, data);
+}
+
+/**
+ * Run a traceroute on ip
+ *
+ * mode_param: for TRACEMODE_TCP it specifies source port and activates
+ * 'intrace' like mode
+ */
+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 *),
void (*cb_hop)(struct ggnet_traceroute_req *,
struct ggnet_traceroute_hop *, void *),
@@ -172,11 +197,7 @@ ggnet_traceroute_trace(struct ggnet_traceroute *ggtr,
goto err;
}
memcpy(&req->srcip, &intf_entry.intf_addr, sizeof(struct addr));
- req->mode = mode;
- if (mode == TRACEMODE_ICMP) {
- printf("ERROR: ICMP trace not supported yet\n");
- return NULL;
- }
+ req->params = params;
TAILQ_INIT(&req->hops_list);
req->run.ev_recv = event_new(ggtr->ev_base,
@@ -217,6 +238,8 @@ _req_free(struct ggnet_traceroute_req *req)
{
if (req->target)
free(req->target);
+ if (req->params)
+ free(req->params);
if (req->run.ev_recv)
event_free(req->run.ev_recv);
if (req->run.ev_send)
@@ -251,15 +274,14 @@ _cb_send(evutil_socket_t fd, short what, void *arg)
//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->mode) {
+ switch (req->params->mode) {
case TRACEMODE_AUTO:
case TRACEMODE_TCP:
- req->params.tcp.dport = TRACE_DPORT;
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);
tcp_pack_hdr(&pkt->pkt_hdr_t.tcp,
- sport, req->params.tcp.dport,
+ sport, req->params->tcp.dport,
rand_uint32(ggtr->pkt_rand), 0,
TH_SYN, rand_uint16(ggtr->pkt_rand), 0);
break;
@@ -331,10 +353,10 @@ _cb_recv(evutil_socket_t fd, short what, void *arg)
goto reschedule_recv;
tcp = (struct tcp_hdr *)((u_char *)ip + IP_HDR_LEN);
printf("XXX TCP %d %d %d\n", ntohs(tcp->th_sport),
- req->params.tcp.dport, tcp->th_seq);
+ req->params->tcp.dport, tcp->th_seq);
if (((tcp->th_flags == TH_SYN + TH_ACK) ||
(tcp->th_flags == TH_RST + TH_ACK)) &&
- (ntohs(tcp->th_sport) == req->params.tcp.dport)) {
+ (ntohs(tcp->th_sport) == req->params->tcp.dport)) {
/* target answer */
printf("XXX found target !\n");
hop = _hop_sport(req, ntohs(tcp->th_dport));
diff --git a/libglouglou/libggnet_traceroute.h b/libglouglou/libggnet_traceroute.h
index 9cd64ad..5b172a9 100644
--- a/libglouglou/libggnet_traceroute.h
+++ b/libglouglou/libggnet_traceroute.h
@@ -31,18 +31,23 @@ struct ggnet_traceroute_hop {
int asn;
};
-struct ggnet_traceroute_req {
- LIST_ENTRY(ggnet_traceroute_req) entry;
- struct ggnet_traceroute_hop *target;
- struct addr srcip;
+struct ggnet_traceroute_req_params {
enum tracemode mode;
union {
struct {
int dport;
+ int sport;
} tcp;
struct icmp {
} icmp;
- } params;
+ };
+};
+
+struct ggnet_traceroute_req {
+ LIST_ENTRY(ggnet_traceroute_req) entry;
+ struct ggnet_traceroute_hop *target;
+ struct addr srcip;
+ struct ggnet_traceroute_req_params *params;
TAILQ_HEAD(tailhead, ggnet_traceroute_hop) hops_list;
struct {
struct event *ev_recv;
@@ -74,8 +79,22 @@ struct ggnet_traceroute *
ggnet_traceroute_new(struct event_base *, char *);
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 dport, int sport,
+ 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, enum tracemode,
+ 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 *),