diff options
author | Laurent Ghigonis <laurent@p1sec.com> | 2013-06-05 19:32:43 +0200 |
---|---|---|
committer | Laurent Ghigonis <laurent@p1sec.com> | 2013-06-05 19:32:43 +0200 |
commit | b42438d9986ba1e46fa587ce72795481d3d86a03 (patch) | |
tree | 23d64931ef9fa7280aa02f2771d377be3114356c /libglouglou | |
parent | Merge branch 'master' into traceroute (diff) | |
download | glouglou-b42438d9986ba1e46fa587ce72795481d3d86a03.tar.xz glouglou-b42438d9986ba1e46fa587ce72795481d3d86a03.zip |
indent fix for branch traceroute
no functional change
Diffstat (limited to 'libglouglou')
-rw-r--r-- | libglouglou/examples/traceroute.c | 86 | ||||
-rw-r--r-- | libglouglou/libggnet_traceroute.c | 491 | ||||
-rw-r--r-- | libglouglou/libggnet_traceroute.h | 84 |
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 *); |