aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2013-06-08 13:47:06 +0200
committerLaurent Ghigonis <laurent@p1sec.com>2013-06-08 13:47:06 +0200
commit9ad9ef1d70c80204f0456adf6741848e43fbec27 (patch)
treeb94c53d6b30075c25a82656bf83c9801bd507e94
parentlibglouglou: traceroute TCP working (diff)
downloadglouglou-9ad9ef1d70c80204f0456adf6741848e43fbec27.tar.xz
glouglou-9ad9ef1d70c80204f0456adf6741848e43fbec27.zip
libglouglou: move functions around
no functional change
-rw-r--r--libglouglou/libggnet_traceroute.c150
1 files changed, 76 insertions, 74 deletions
diff --git a/libglouglou/libggnet_traceroute.c b/libglouglou/libggnet_traceroute.c
index 6a635d0..2691d3e 100644
--- a/libglouglou/libggnet_traceroute.c
+++ b/libglouglou/libggnet_traceroute.c
@@ -75,14 +75,16 @@
#define TIMEOUT_AFTERTARGET_US 500000
static void _req_free(struct ggnet_traceroute_req *);
-static void _cb_recv(evutil_socket_t, short, void *);
static void _cb_send(evutil_socket_t, short, void *);
+static void _cb_recv(evutil_socket_t, short, void *);
static void _cb_trace_timeout(evutil_socket_t, short, void *);
+static void _timeout_set(struct ggnet_traceroute_req *, int, int);
static struct ggnet_traceroute_hop *
_hop_ip_id(struct ggnet_traceroute_req *, int);
static struct ggnet_traceroute_hop *
_hop_sport(struct ggnet_traceroute_req *, int);
-static void _timeout_set(struct ggnet_traceroute_req *, int, int);
+static struct ggnet_traceroute_hop *
+ _hop_last(struct ggnet_traceroute_req *);
static int pcap_dloff(pcap_t *); // XXX move to libggnet_utils ?
struct trace_pkt {
@@ -223,6 +225,69 @@ _req_free(struct ggnet_traceroute_req *req)
}
static void
+_cb_send(evutil_socket_t fd, short what, void *arg)
+{
+ struct ggnet_traceroute_req *req;
+ struct ggnet_traceroute_hop *hop;
+ struct ggnet_traceroute *ggtr;
+ u_char buf[BUFSIZ];
+ struct trace_pkt *pkt;
+ int len, lensent, ttl, ip_id, sport, i;
+
+ req = arg;
+ printf("XXX cbggnet_traceroute cb_send %s -> %s\n",
+ addr_ntoa(&req->srcip), addr_ntoa(&req->target->ip));
+ ggtr = req->ggtr;
+ pkt = (struct trace_pkt *)buf;
+ len = IP_HDR_LEN + TCP_HDR_LEN;
+
+ for (ttl=req->run.last_ttl_sent; ttl<15; ttl++) {
+ hop = calloc(1, sizeof(struct ggnet_traceroute_hop));
+ if (!hop) {
+ printf("cannot allocate ggnet_traceroute_hop\n");
+ exit(1);
+ }
+ 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->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,
+ rand_uint32(ggtr->pkt_rand), 0,
+ TH_SYN, rand_uint16(ggtr->pkt_rand), 0);
+ break;
+ case TRACEMODE_ICMP:
+ 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);
+ icmp_pack_hdr(&pkt->pkt_hdr_t.icmp, ICMP_ECHO, 8);
+ break;
+ }
+ ip_checksum(pkt, len);
+ TAILQ_INSERT_TAIL(&req->hops_list, hop, entry);
+ for (i=0; i<TRACEROUTE_NB_PROBES; i++) {
+ hop->ip_ids[i] = ip_id;
+ hop->sports[i] = sport;
+ lensent = ip_send(ggtr->pkt_ip, pkt, len);
+ if (len < 0)
+ warn("_cb_send : ip_send error");
+ if (lensent < len)
+ warn("_cb_send : ip_send short send (%d < %d",
+ lensent, len);
+ }
+ }
+ req->run.last_ttl_sent = ttl;
+ _timeout_set(req, TIMEOUT_TOTAL_S, 0);
+}
+
+static void
_cb_recv(evutil_socket_t fd, short what, void *arg)
{
struct ggnet_traceroute_req *req;
@@ -336,66 +401,20 @@ reschedule_recv:
}
static void
-_cb_send(evutil_socket_t fd, short what, void *arg)
+_cb_trace_timeout(evutil_socket_t fd, short what, void *arg)
{
struct ggnet_traceroute_req *req;
- struct ggnet_traceroute_hop *hop;
- struct ggnet_traceroute *ggtr;
- u_char buf[BUFSIZ];
- struct trace_pkt *pkt;
- int len, lensent, ttl, ip_id, sport, i;
+ struct ggnet_traceroute_hop *last;
req = arg;
- printf("XXX cbggnet_traceroute cb_send %s -> %s\n",
- addr_ntoa(&req->srcip), addr_ntoa(&req->target->ip));
- ggtr = req->ggtr;
- pkt = (struct trace_pkt *)buf;
- len = IP_HDR_LEN + TCP_HDR_LEN;
- for (ttl=req->run.last_ttl_sent; ttl<15; ttl++) {
- hop = calloc(1, sizeof(struct ggnet_traceroute_hop));
- if (!hop) {
- printf("cannot allocate ggnet_traceroute_hop\n");
- exit(1);
- }
- 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->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,
- rand_uint32(ggtr->pkt_rand), 0,
- TH_SYN, rand_uint16(ggtr->pkt_rand), 0);
- break;
- case TRACEMODE_ICMP:
- 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);
- icmp_pack_hdr(&pkt->pkt_hdr_t.icmp, ICMP_ECHO, 8);
- break;
- }
- ip_checksum(pkt, len);
- TAILQ_INSERT_TAIL(&req->hops_list, hop, entry);
- for (i=0; i<TRACEROUTE_NB_PROBES; i++) {
- hop->ip_ids[i] = ip_id;
- hop->sports[i] = sport;
- lensent = ip_send(ggtr->pkt_ip, pkt, len);
- if (len < 0)
- warn("_cb_send : ip_send error");
- if (lensent < len)
- warn("_cb_send : ip_send short send (%d < %d",
- lensent, len);
- }
- }
- req->run.last_ttl_sent = ttl;
- _timeout_set(req, TIMEOUT_TOTAL_S, 0);
+ printf("XXX cbggnet_traceroute cb_trace_timeout (%s -> %s)\n",
+ addr_ntoa(&req->srcip), addr_ntoa(&req->target->ip));
+ last = _hop_last(req);
+ printf("XXX last %p\n", last);
+ if (last)
+ req->target->ttl = last->ttl + 1;
+ req->cb_done(req, req->data);
}
static void
@@ -457,23 +476,6 @@ _hop_last(struct ggnet_traceroute_req *req)
return last;
}
-static void
-_cb_trace_timeout(evutil_socket_t fd, short what, void *arg)
-{
- struct ggnet_traceroute_req *req;
- struct ggnet_traceroute_hop *last;
-
- req = arg;
-
- printf("XXX cbggnet_traceroute cb_trace_timeout (%s -> %s)\n",
- addr_ntoa(&req->srcip), addr_ntoa(&req->target->ip));
- last = _hop_last(req);
- printf("XXX last %p\n", last);
- if (last)
- req->target->ttl = last->ttl + 1;
- req->cb_done(req, req->data);
-}
-
static int
pcap_dloff(pcap_t *pd)
{