diff options
author | Laurent Ghigonis <laurent@p1sec.com> | 2013-06-08 14:15:16 +0200 |
---|---|---|
committer | Laurent Ghigonis <laurent@p1sec.com> | 2013-06-08 14:15:16 +0200 |
commit | 391552b89ed2c4f9c3572e773c8205f086fba352 (patch) | |
tree | 64a22a27f6ad6538551387c505109b94940ac1ef | |
parent | libglouglou: move functions around (diff) | |
download | glouglou-391552b89ed2c4f9c3572e773c8205f086fba352.tar.xz glouglou-391552b89ed2c4f9c3572e773c8205f086fba352.zip |
libglouglou: traceroute simpler API, introduce req params
-rw-r--r-- | libglouglou/examples/traceroute.c | 3 | ||||
-rw-r--r-- | libglouglou/libggnet_traceroute.c | 46 | ||||
-rw-r--r-- | libglouglou/libggnet_traceroute.h | 31 |
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 *), |