aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2013-06-05 19:32:43 +0200
committerLaurent Ghigonis <laurent@p1sec.com>2013-06-05 19:32:43 +0200
commitb42438d9986ba1e46fa587ce72795481d3d86a03 (patch)
tree23d64931ef9fa7280aa02f2771d377be3114356c
parentMerge branch 'master' into traceroute (diff)
downloadglouglou-b42438d9986ba1e46fa587ce72795481d3d86a03.tar.xz
glouglou-b42438d9986ba1e46fa587ce72795481d3d86a03.zip
indent fix for branch traceroute
no functional change
-rw-r--r--libglouglou/examples/traceroute.c86
-rw-r--r--libglouglou/libggnet_traceroute.c491
-rw-r--r--libglouglou/libggnet_traceroute.h84
3 files changed, 332 insertions, 329 deletions
diff --git a/libglouglou/examples/traceroute.c b/libglouglou/examples/traceroute.c
index 080274f..b5d89b1 100644
--- a/libglouglou/examples/traceroute.c
+++ b/libglouglou/examples/traceroute.c
@@ -21,7 +21,7 @@
static void _droppriv(char *, int, char *);
static void _cb_traceroute(struct in_addr *,
- struct ggnet_traceroute_req *, void *);
+ struct ggnet_traceroute_req *, void *);
struct event_base *_ev_base;
struct ggnet_traceroute_req *_route = NULL;
@@ -30,39 +30,39 @@ int _answer = 0;
int
main(int argc, char *argv[])
{
- struct ggnet_traceroute *ggtr;
- struct ggnet_traceroute_hop *hop;
- struct in_addr ip;
- struct timeval tv;
-
- if (argc < 2) {
- printf("usage: traceroute <ip>\n");
- exit(1);
- }
- inet_aton(argv[1], &ip);
- ip.s_addr = ntohl(ip.s_addr);
-
- bzero(&tv, sizeof(struct timeval));
- tv.tv_sec = 10;
-
- _ev_base = event_base_new();
-
- ggtr = ggnet_traceroute_new(_ev_base, "lo"); // XXX rm iface
- _droppriv("nobody", 1, NULL); /* bad practise you should use dedicated user */
- ggnet_traceroute_trace(ggtr, &ip, _cb_traceroute, NULL);
-
- event_base_loopexit(_ev_base, &tv);
- event_base_dispatch(_ev_base);
-
- if (_answer) {
- printf("%x:\n", ip.s_addr);
- LIST_FOREACH(hop, &_route->hops, entry) {
- printf("%x (%d)\n", hop->ip.s_addr, hop->delay);
- }
- } else {
- printf("no answer\n");
- }
- return 0;
+ struct ggnet_traceroute *ggtr;
+ struct ggnet_traceroute_hop *hop;
+ struct in_addr ip;
+ struct timeval tv;
+
+ if (argc < 2) {
+ printf("usage: traceroute <ip>\n");
+ exit(1);
+ }
+ inet_aton(argv[1], &ip);
+ ip.s_addr = ntohl(ip.s_addr);
+
+ bzero(&tv, sizeof(struct timeval));
+ tv.tv_sec = 10;
+
+ _ev_base = event_base_new();
+
+ ggtr = ggnet_traceroute_new(_ev_base, "lo"); // XXX rm iface
+ _droppriv("nobody", 1, NULL); /* bad practise you should use dedicated user */
+ ggnet_traceroute_trace(ggtr, &ip, _cb_traceroute, NULL);
+
+ event_base_loopexit(_ev_base, &tv);
+ event_base_dispatch(_ev_base);
+
+ if (_answer) {
+ printf("%x:\n", ip.s_addr);
+ LIST_FOREACH(hop, &_route->hops, entry) {
+ printf("%x (%d)\n", hop->ip.s_addr, hop->delay);
+ }
+ } else {
+ printf("no answer\n");
+ }
+ return 0;
}
/* from libglouglou utils.c */
@@ -75,11 +75,11 @@ _droppriv(char *user, int do_chroot, char *chroot_path)
if (!pw)
err(1, "unknown user %s", user);
if (do_chroot) {
- if (!chroot_path)
- chroot_path = pw->pw_dir;
- if (chroot(chroot_path) != 0)
- err(1, "unable to chroot");
- }
+ if (!chroot_path)
+ chroot_path = pw->pw_dir;
+ if (chroot(chroot_path) != 0)
+ err(1, "unable to chroot");
+ }
if (chdir("/") != 0)
err(1, "unable to chdir");
if (setgroups(1, &pw->pw_gid) == -1)
@@ -95,9 +95,9 @@ _droppriv(char *user, int do_chroot, char *chroot_path)
static void
_cb_traceroute(struct in_addr *ip,
- struct ggnet_traceroute_req *route, void *data)
+ struct ggnet_traceroute_req *route, void *data)
{
- _route = route;
- _answer = 1;
- event_base_loopexit(_ev_base, NULL);
+ _route = route;
+ _answer = 1;
+ event_base_loopexit(_ev_base, NULL);
}
diff --git a/libglouglou/libggnet_traceroute.c b/libglouglou/libggnet_traceroute.c
index 96a6201..de1d764 100644
--- a/libglouglou/libggnet_traceroute.c
+++ b/libglouglou/libggnet_traceroute.c
@@ -35,7 +35,7 @@
* check if src IP is for us in hop_list
* tcp / udp
* is it answer from the target ?
- XXX we might still want to continue a few hops after target
+ XXX we might still want to continue a few hops after target
* target info write in hop_list
* recv timeout in 0.5s
* icmp unreach / exceed :
@@ -91,26 +91,26 @@ struct trace_pkt {
struct ggnet_traceroute *
ggnet_traceroute_new(struct event_base *ev_base, char *iface)
{
- struct ggnet_traceroute *ggtr;
+ struct ggnet_traceroute *ggtr;
char ebuff[PCAP_ERRBUF_SIZE];
- ggtr = calloc(1, sizeof(struct ggnet_traceroute));
- if (!ggtr) {
- printf("could not allocate ggnet_traceroute\n");
- exit(1);
- }
- ggtr->ev_base = ev_base;
- ggtr->pkt_ip = ip_open();
- if (!ggtr->pkt_ip) {
- printf("ip_open() failed\n");
- ggnet_traceroute_free(ggtr);
- return NULL;
- }
+ ggtr = calloc(1, sizeof(struct ggnet_traceroute));
+ if (!ggtr) {
+ printf("could not allocate ggnet_traceroute\n");
+ exit(1);
+ }
+ ggtr->ev_base = ev_base;
+ ggtr->pkt_ip = ip_open();
+ if (!ggtr->pkt_ip) {
+ printf("ip_open() failed\n");
+ ggnet_traceroute_free(ggtr);
+ return NULL;
+ }
ggtr->pkt_rand = rand_open();
- /* XXX get iface from route_open, route_get and pcap_lookupnet.
- * will need to do so in ggnet_traceroute_trace() so user privs, so will need
- * to prefetch the routes / interfaces, maybe */
+ /* XXX get iface from route_open, route_get and pcap_lookupnet.
+ * will need to do so in ggnet_traceroute_trace() so user privs, so will need
+ * to prefetch the routes / interfaces, maybe */
ggtr->pcap = pcap_open_live(iface, 1500, 1, 500, ebuff);
if (ggtr->pcap == NULL)
@@ -118,246 +118,247 @@ ggnet_traceroute_new(struct event_base *ev_base, char *iface)
ggtr->pcap_dllen = pcap_dloff(ggtr->pcap);
ggtr->pcap_fd = pcap_fileno(ggtr->pcap);
- return ggtr;
+ return ggtr;
}
void
ggnet_traceroute_free(struct ggnet_traceroute *ggtr)
{
- struct ggnet_traceroute_req *req;
-
- if (ggtr->pcap)
- pcap_close(ggtr->pcap);
- if (ggtr->pkt_ip)
- ip_close(ggtr->pkt_ip);
- if (ggtr->pkt_rand)
- rand_close(ggtr->pkt_rand);
- LIST_FOREACH(req, &ggtr->req_list, entry)
- _req_free(req);
- free(ggtr);
+ struct ggnet_traceroute_req *req;
+
+ if (ggtr->pcap)
+ pcap_close(ggtr->pcap);
+ if (ggtr->pkt_ip)
+ ip_close(ggtr->pkt_ip);
+ if (ggtr->pkt_rand)
+ rand_close(ggtr->pkt_rand);
+ LIST_FOREACH(req, &ggtr->req_list, entry)
+ _req_free(req);
+ free(ggtr);
}
struct ggnet_traceroute_req *
ggnet_traceroute_trace(struct ggnet_traceroute *ggtr,
- struct in_addr *ip,
- void (*cb_usr)(struct in_addr *, struct ggnet_traceroute_req *, void *),
- void *data)
+ struct in_addr *ip,
+ void (*cb_usr)(struct in_addr *, struct ggnet_traceroute_req *, void *),
+ void *data)
{
- struct ggnet_traceroute_req *req;
- struct ggnet_traceroute_hop *target;
-
- req = calloc(1, sizeof(struct ggnet_traceroute_req));
- if (!req) {
- printf("could not allocate ggnet_traceroute_req\n");
- exit(1);
- }
- target = calloc(1, sizeof(struct ggnet_traceroute_hop));
- if (!target) {
- printf("cannot allocate ggnet_traceroute_hop\n");
- exit(1);
- }
-
- addr_aton("127.0.0.1", &req->target->ip);
- addr_aton("127.0.0.1", &req->srcip);
-
- req->ev_recv = event_new(ggtr->ev_base,
- ggtr->pcap_fd, EV_READ, _cb_recv, req);
- event_add(req->ev_recv, NULL);
- req->ev_send = event_new(ggtr->ev_base,
- ggtr->pcap_fd, EV_WRITE, _cb_send, req);
- event_add(req->ev_send, NULL);
-
- // XXX evtimer timeout !!!
- evtimer_new(ggtr->ev_base, _cb_trace_timeout, req);
-
- LIST_INSERT_HEAD(&ggtr->req_list, req, entry);
- return req;
+ struct ggnet_traceroute_req *req;
+ struct ggnet_traceroute_hop *target;
+
+ req = calloc(1, sizeof(struct ggnet_traceroute_req));
+ if (!req) {
+ printf("could not allocate ggnet_traceroute_req\n");
+ exit(1);
+ }
+ target = calloc(1, sizeof(struct ggnet_traceroute_hop));
+ if (!target) {
+ printf("cannot allocate ggnet_traceroute_hop\n");
+ exit(1);
+ }
+
+ addr_aton("127.0.0.1", &req->target->ip);
+ addr_aton("127.0.0.1", &req->srcip);
+
+ req->ev_recv = event_new(ggtr->ev_base,
+ ggtr->pcap_fd, EV_READ, _cb_recv, req);
+ event_add(req->ev_recv, NULL);
+ req->ev_send = event_new(ggtr->ev_base,
+ ggtr->pcap_fd, EV_WRITE, _cb_send, req);
+ event_add(req->ev_send, NULL);
+
+ // XXX evtimer timeout !!!
+ evtimer_new(ggtr->ev_base, _cb_trace_timeout, req);
+
+ LIST_INSERT_HEAD(&ggtr->req_list, req, entry);
+ return req;
}
void
ggnet_traceroute_cancel(struct ggnet_traceroute *ggtr,
- struct ggnet_traceroute_req *req)
+ struct ggnet_traceroute_req *req)
{
- LIST_REMOVE(req, entry);
- ggtr->req_pending--;
- _req_free(req);
+ LIST_REMOVE(req, entry);
+ ggtr->req_pending--;
+ _req_free(req);
}
static void
_req_free(struct ggnet_traceroute_req *req)
{
- if (req->ev_recv)
- event_free(req->ev_recv);
- if (req->ev_send)
- event_free(req->ev_send);
- free(req);
+ if (req->ev_recv)
+ event_free(req->ev_recv);
+ if (req->ev_send)
+ event_free(req->ev_send);
+ free(req);
}
static void
_cb_recv(evutil_socket_t fd, short what, void *arg)
{
- struct ggnet_traceroute_hop *hop;
- struct ggnet_traceroute_req *req;
- struct ggnet_traceroute *ggtr;
- struct pcap_pkthdr ph;
- u_char *pread, *tmp;
- struct ip_hdr *ip, ip_in;
- struct tcp_hdr *tcp;
- struct icmp_hdr *icmp;
- struct addr ip_src;
- char *reply = "U!";
- char *p;
-
- printf("cbggnet_traceroute cb_recv %s\n", addr_ntoa(&req->target->ip));
- req = arg;
- ggtr = req->ggtr;
-
- if ((pread = (u_char *) pcap_next(ggtr->pcap, &ph)) == NULL) {
- printf("libggnet_traceroute _cb_recv: read error\n");
- return;
- }
-
- /* decode the current packet : ttl, ip, ... */
- tmp = pread + ctx->dl_len;
- ip = (struct ip_hdr *) tmp;
- if (ip_h->ip_v != 4)
- return;
- p = inet_ntoasc(ip_h->ip_src);
- if ((addr_aton(p, &ip_src)) == -1)
- return;
-
- switch(ip_h->ip_p) {
-
- case IP_PROTO_TCP:
- /* should be our target */
- if (addr_cmp(&ip_src, &(req->target->ip)) != 0)
- return;
- tcp = (struct tcp_hdr *)(ip + IP_HDR_LEN);
- if (((tcp->th_flags == TH_SYN + TH_ACK) ||
- (tcp->th_flags == TH_RST + TH_ACK)) &&
- (htons(tcp->th_sport) == ctx->dport)) {
- hop = req->target;
- hop->answer_count++;
- flags = "SA";
- if (tcp->th_flags == TH_RST + TH_ACK)
- flags = "R";
- strncpy(hop->answer, flags, sizeof(hop->answer));
- _timeout_set(req, 0, TIMEOUT_AFTERTARGET_US);
- }
- break;
-
- case IP_PROTO_ICMP:
- /* answer from a hop */
- icmp = (struct icmp_hdr *)(ip + IP_HDR_LEN);
- /* XXX ? look for TTL_EXPIRED, PROHIBITED msgs */
- ip_in = (struct iphdr *) (ip + sizeof(struct iphdr) +
- sizeof(struct icmphdr));
- hop = _hop_ttl(req, ip_in->ttl);
- if (!hop) {
- printf("libggnet_traceroute _cb_recv: WARNING: hop ttl %d not found !",
- ip_in->ttl);
- return;
- }
- hop->answer_count++;
- if (icmp->icmp_type == ICMP_UNREACH) {
- switch (icmp->icmp_code) {
- case ICMP_UNREACH_NET:
- strncpy(hop->answer, "N!", sizeof(hop->answer));
- break;
- case ICMP_UNREACH_HOST:
- strncpy(hop->answer, "H!", sizeof(hop->answer));
- break;
- case ICMP_UNREACH_PROTO:
- strncpy(hop->answer, "P!", sizeof(hop->answer));
- break;
- case ICMP_UNREACH_NET_PROHIB:
- case ICMP_UNREACH_HOST_PROHIB:
- strncpy(hop->answer, "A!", sizeof(hop->answer));
- break;
- }
- } else if (icmp->icmp_type == ICMP_TIMEXCEED) {
- strncpy(hop->answer, "A!", sizeof(hop->answer));
- reply = "X!";
- event_add(&ctx->send_ev, &ctx->tv);
- }
- ctx->hop++;
- break;
- }
- fflush(stdout);
-
- /* do we need to send more packets ? */
+ struct ggnet_traceroute_hop *hop;
+ struct ggnet_traceroute_req *req;
+ struct ggnet_traceroute *ggtr;
+ struct pcap_pkthdr ph;
+ u_char *pread, *tmp;
+ struct ip_hdr *ip, ip_in;
+ struct tcp_hdr *tcp;
+ struct icmp_hdr *icmp;
+ struct addr ip_src;
+ char *reply = "U!";
+ char *p;
+
+ printf("cbggnet_traceroute cb_recv %s\n", addr_ntoa(&req->target->ip));
+ req = arg;
+ ggtr = req->ggtr;
+
+ if ((pread = (u_char *) pcap_next(ggtr->pcap, &ph)) == NULL) {
+ printf("libggnet_traceroute _cb_recv: read error\n");
+ return;
+ }
+
+ /* decode the current packet : ttl, ip, ... */
+ tmp = pread + ctx->dl_len;
+ ip = (struct ip_hdr *) tmp;
+ if (ip_h->ip_v != 4)
+ return;
+ p = inet_ntoasc(ip_h->ip_src);
+ if ((addr_aton(p, &ip_src)) == -1)
+ return;
+
+ switch(ip_h->ip_p) {
+
+ case IP_PROTO_TCP:
+ /* should be our target */
+ if (addr_cmp(&ip_src, &(req->target->ip)) != 0)
+ return;
+ tcp = (struct tcp_hdr *)(ip + IP_HDR_LEN);
+ if (((tcp->th_flags == TH_SYN + TH_ACK) ||
+ (tcp->th_flags == TH_RST + TH_ACK)) &&
+ (htons(tcp->th_sport) == ctx->dport)) {
+ hop = req->target;
+ hop->answer_count++;
+ flags = "SA";
+ if (tcp->th_flags == TH_RST + TH_ACK)
+ flags = "R";
+ strncpy(hop->answer, flags, sizeof(hop->answer));
+ _timeout_set(req, 0, TIMEOUT_AFTERTARGET_US);
+ }
+ break;
+
+ case IP_PROTO_ICMP:
+ /* answer from a hop */
+ icmp = (struct icmp_hdr *)(ip + IP_HDR_LEN);
+ /* XXX ? look for TTL_EXPIRED, PROHIBITED msgs */
+ ip_in = (struct iphdr *) (ip + sizeof(struct iphdr) +
+ sizeof(struct icmphdr));
+ hop = _hop_ttl(req, ip_in->ttl);
+ if (!hop) {
+ printf("libggnet_traceroute _cb_recv: WARNING: hop ttl %d not found !",
+ ip_in->ttl);
+ return;
+ }
+ hop->answer_count++;
+ if (icmp->icmp_type == ICMP_UNREACH) {
+ switch (icmp->icmp_code) {
+ case ICMP_UNREACH_NET:
+ strncpy(hop->answer, "N!", sizeof(hop->answer));
+ break;
+ case ICMP_UNREACH_HOST:
+ strncpy(hop->answer, "H!", sizeof(hop->answer));
+ break;
+ case ICMP_UNREACH_PROTO:
+ strncpy(hop->answer, "P!", sizeof(hop->answer));
+ break;
+ case ICMP_UNREACH_NET_PROHIB:
+ case ICMP_UNREACH_HOST_PROHIB:
+ strncpy(hop->answer, "A!", sizeof(hop->answer));
+ break;
+ }
+ } else if (icmp->icmp_type == ICMP_TIMEXCEED) {
+ strncpy(hop->answer, "A!", sizeof(hop->answer));
+ reply = "X!";
+ event_add(&ctx->send_ev, &ctx->tv);
+ }
+ ctx->hop++;
+ break;
+ }
+ fflush(stdout);
+
+ /* do we need to send more packets ? */
}
static void
_cb_send(evutil_socket_t fd, short what, void *arg)
{
- struct ggnet_traceroute_req *req;
- struct ggnet_traceroute *ggtr;
+ struct ggnet_traceroute_req *req;
+ struct ggnet_traceroute *ggtr;
u_char buf[BUFSIZ];
struct trace_pkt *pkt;
int len;
int ttl;
- printf("cbggnet_traceroute cb_send %s\n", addr_ntoa(&req->ip));
- req = arg;
- ggtr = req->ggtr;
+ printf("cbggnet_traceroute cb_send %s\n", addr_ntoa(&req->ip));
+ req = arg;
+ ggtr = req->ggtr;
pkt = (struct trace_pkt *)buf;
len = IP_HDR_LEN + TCP_HDR_LEN;
- for (ttl=req->ttl_sent; i<15; i++) {
- 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_pack_hdr(&pkt->pkt_hdr_i.ip, IP_TOS_LOWDELAY, len,
- rand_uint16(ggtr->pkt_rand), 0, ttl, IP_PROTO_TCP,
- req->src.addr_ip, req->dst.addr_ip);
- tcp_pack_hdr(&pkt->pkt_hdr_t.tcp, rand_uint16(ggtr->pkt_rand), TRACE_DPORT,
- rand_uint32(ggtr->pkt_rand), rand_uint32(ggtr->pkt_rand),
- TH_SYN, rand_uint16(ggtr->pkt_rand), 0);
- ip_checksum(pkt, len);
- TAILQ_INSERT_TAIL(&req->hops_list, hop, entry);
- for (i=0; i<TRACEROUTE_NB_PROBES; i++)
- if (ip_send(ggtr->pkt_ip, pkt, len) < 0)
- warn("_cb_send : ip_send short send");
- _timeout_set(req, TIMEOUT_TOTAL_S, 0);
- }
- req->ttl_sent = ttl;
+ for (ttl=req->ttl_sent; i<15; i++) {
+ 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_pack_hdr(&pkt->pkt_hdr_i.ip, IP_TOS_LOWDELAY, len,
+ rand_uint16(ggtr->pkt_rand), 0, ttl, IP_PROTO_TCP,
+ req->src.addr_ip, req->dst.addr_ip);
+ tcp_pack_hdr(&pkt->pkt_hdr_t.tcp, rand_uint16(ggtr->pkt_rand), TRACE_DPORT,
+ rand_uint32(ggtr->pkt_rand), rand_uint32(ggtr->pkt_rand),
+ TH_SYN, rand_uint16(ggtr->pkt_rand), 0);
+ ip_checksum(pkt, len);
+ TAILQ_INSERT_TAIL(&req->hops_list, hop, entry);
+ for (i=0; i<TRACEROUTE_NB_PROBES; i++)
+ if (ip_send(ggtr->pkt_ip, pkt, len) < 0)
+ warn("_cb_send : ip_send short send");
+ _timeout_set(req, TIMEOUT_TOTAL_S, 0);
+ }
+ req->ttl_sent = ttl;
}
static void
_timeout_set(struct ggnet_traceroute_req *req, int sec, int usec)
{
- evtimer_del(req->run.ev_timeout);
- req->run.tv_timeout.secs = sec;
- req->run.tv_timeout.usecs = usec;
- evtimer_add(req->run.ev_timeout, req->run.tv_timeout);
+ evtimer_del(req->run.ev_timeout);
+ req->run.tv_timeout.secs = sec;
+ req->run.tv_timeout.usecs = usec;
+ evtimer_add(req->run.ev_timeout, req->run.tv_timeout);
}
static ggnet_traceroute_hop *
_hop_last(ggnet_traceroute_req *req)
{
- struct ggnet_traceroute_hop *h;
+ struct ggnet_traceroute_hop *h;
- TAILQ_FOREACH_REVERSE(h, req->hop_list, entry) {
- if (h->answer_count > 0)
- return h;
- }
- return NULL;
+ TAILQ_FOREACH_REVERSE(h, req->hop_list, entry) {
+ if (h->answer_count > 0)
+ return h;
+ }
+ return NULL;
}
-void _cb_trace_timeout(evutil_socket_t fd, short what, void *arg)
+void
+_cb_trace_timeout(evutil_socket_t fd, short what, void *arg)
{
- struct ggnet_traceroute_req *req;
+ struct ggnet_traceroute_req *req;
- req = arg;
+ req = arg;
- // XXX IN PROGRESS
- last = _hop_last(req);
- req->target->ttl = last->ttl + 1;
+ // XXX IN PROGRESS
+ last = _hop_last(req);
+ req->target->ttl = last->ttl + 1;
}
static int
@@ -366,55 +367,55 @@ pcap_dloff(pcap_t *pd)
int i;
i = pcap_datalink(pd);
-
+
switch (i) {
- case DLT_EN10MB:
- i = 14;
- break;
- case DLT_IEEE802:
- i = 22;
- break;
- case DLT_FDDI:
- i = 21;
- break;
- case DLT_NULL:
- i = 4;
- break;
- default:
- i = -1;
- break;
+ case DLT_EN10MB:
+ i = 14;
+ break;
+ case DLT_IEEE802:
+ i = 22;
+ break;
+ case DLT_FDDI:
+ i = 21;
+ break;
+ case DLT_NULL:
+ i = 4;
+ break;
+ default:
+ i = -1;
+ break;
}
return (i);
}
/* XXX do it with evdns
-static int
-get_asn(struct in_addr in)
-{
- const u_char *uaddr = (const u_char *)&in.s_addr;
- int i, counter;
- struct rrsetinfo *answers = NULL;
- char qbuf[MAXDNAME];
- int asn = -1;
-
- if (snprintf(qbuf, sizeof qbuf, "%u.%u.%u.%u.origin.asn.cymru.com",
- (uaddr[3] & 0xff), (uaddr[2] & 0xff),
- (uaddr[1] & 0xff), (uaddr[0] & 0xff)) >= sizeof (qbuf))
- return;
- if (getrrsetbyname(qbuf, C_IN, T_TXT, 0, &answers) != 0)
- return;
- for (counter = 0; counter < answers->rri_nrdatas; counter++) {
- char *p, *as = answers->rri_rdatas[counter].rdi_data;
- as++; // skip first byte, it contains length
- if (p = strchr(as,'|')) {
- p[-1] = 0;
- asn = atoi(as);
- goto ret;
- }
- }
+ static int
+ get_asn(struct in_addr in)
+ {
+ const u_char *uaddr = (const u_char *)&in.s_addr;
+ int i, counter;
+ struct rrsetinfo *answers = NULL;
+ char qbuf[MAXDNAME];
+ int asn = -1;
+
+ if (snprintf(qbuf, sizeof qbuf, "%u.%u.%u.%u.origin.asn.cymru.com",
+ (uaddr[3] & 0xff), (uaddr[2] & 0xff),
+ (uaddr[1] & 0xff), (uaddr[0] & 0xff)) >= sizeof (qbuf))
+ return;
+ if (getrrsetbyname(qbuf, C_IN, T_TXT, 0, &answers) != 0)
+ return;
+ for (counter = 0; counter < answers->rri_nrdatas; counter++) {
+ char *p, *as = answers->rri_rdatas[counter].rdi_data;
+ as++; // skip first byte, it contains length
+ if (p = strchr(as,'|')) {
+ p[-1] = 0;
+ asn = atoi(as);
+ goto ret;
+ }
+ }
ret:
- freerrset(answers);
- return asn;
+freerrset(answers);
+return asn;
}
*/
diff --git a/libglouglou/libggnet_traceroute.h b/libglouglou/libggnet_traceroute.h
index 833705b..92b2d43 100644
--- a/libglouglou/libggnet_traceroute.h
+++ b/libglouglou/libggnet_traceroute.h
@@ -11,52 +11,54 @@
#define TRACEROUTE_NB_PROBES 3
struct ggnet_traceroute_hop {
- TAILQ_ENTRY(ggnet_traceroute_hop) entry;
- int ttl;
- int answer_count; /* on TRACEROUTE_NB_PROBES sent probes */
- char answer[2 * TRACEROUTE_NB_PROBES];
- struct addr ip;
- int delay;
- int delay_dev;
- int loss;
- int loss_dev;
- int asn;
+ TAILQ_ENTRY(ggnet_traceroute_hop) entry;
+ int ttl;
+ int answer_count; /* on TRACEROUTE_NB_PROBES sent probes */
+ char answer[2 * TRACEROUTE_NB_PROBES];
+ struct addr ip;
+ int delay;
+ int delay_dev;
+ int loss;
+ int loss_dev;
+ int asn;
};
struct ggnet_traceroute_req {
- LIST_ENTRY(ggnet_traceroute_req) entry;
- struct ggnet_traceroute_hop *target;
- struct addr srcip;
- int probes_count;
- int hops_count;
- TAILQ_HEAD(, ggnet_traceroute_hop) hops_list;
- struct {
- struct event *ev_recv;
- struct event *ev_send;
- struct evtimer *ev_timeout;
- struct timeval tv_timeout;
- int last_ttl_sent;
- } run;
- void (*cb_usr)(struct in_addr *, char *, void *);
- void *data;
+ LIST_ENTRY(ggnet_traceroute_req) entry;
+ struct ggnet_traceroute_hop *target;
+ struct addr srcip;
+ int probes_count;
+ int hops_count;
+ TAILQ_HEAD(, ggnet_traceroute_hop) hops_list;
+ struct {
+ struct event *ev_recv;
+ struct event *ev_send;
+ struct evtimer *ev_timeout;
+ struct timeval tv_timeout;
+ int last_ttl_sent;
+ } run;
+ void (*cb_usr)(struct in_addr *, char *, void *);
+ void *data;
};
struct ggnet_traceroute {
- struct event_base *ev_base;
- pcap_t *pcap;
- ip_t *pkt_ip;
- rand_t *pkt_rand;
- int pcap_fd;
- int pcap_dllen; /* datalink layer hdr len */
- int req_pending;
- LIST_HEAD(, ggnet_traceroute_req) req_list;
+ struct event_base *ev_base;
+ pcap_t *pcap;
+ ip_t *pkt_ip;
+ rand_t *pkt_rand;
+ int pcap_fd;
+ int pcap_dllen; /* datalink layer hdr len */
+ int req_pending;
+ LIST_HEAD(, ggnet_traceroute_req) req_list;
};
-struct ggnet_traceroute *ggnet_traceroute_new(struct event_base *, char *);
-void ggnet_traceroute_free(struct ggnet_traceroute *);
-struct ggnet_traceroute_req *ggnet_traceroute_trace(struct ggnet_traceroute *,
- struct in_addr *ip,
- void (*cb_usr)(struct in_addr *, struct ggnet_traceroute_req *, void *),
- void *);
-void ggnet_traceroute_cancel(struct ggnet_traceroute *,
- struct ggnet_traceroute_req *);
+struct ggnet_traceroute *
+ ggnet_traceroute_new(struct event_base *, char *);
+void ggnet_traceroute_free(struct ggnet_traceroute *);
+struct ggnet_traceroute_req *
+ ggnet_traceroute_trace(struct ggnet_traceroute *,
+ struct in_addr *ip,
+ void (*cb_usr)(struct in_addr *, struct ggnet_traceroute_req *, void *),
+ void *);
+void ggnet_traceroute_cancel(struct ggnet_traceroute *,
+ struct ggnet_traceroute_req *);