diff options
Diffstat (limited to 'gg_sniff/pcap.c')
-rw-r--r-- | gg_sniff/pcap.c | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/gg_sniff/pcap.c b/gg_sniff/pcap.c index 78c7211..d0b326a 100644 --- a/gg_sniff/pcap.c +++ b/gg_sniff/pcap.c @@ -80,7 +80,7 @@ static void phandler_sll(u_char *, static void cb_pcap(int, short, void *); static void cb_conntimer(int, short, void *); static void cb_nodename(struct ggnet *, struct ggnet_node *); -static void cb_nodetraceroute(struct ggnet *, struct ggnet_node *); +static void cb_nodetraceroute(struct ggnet *, struct ggnet_traceroute_req *); static struct phandler phandlers[] = { { phandler_ether, DLT_EN10MB }, @@ -140,8 +140,11 @@ ggsniff_pcap_init(struct event_base *ev_base, struct gg_client *ggcli, gg_log_fatal("user: event_add conntimer failed: %s", strerror(errno)); if (active) { + gg_log_info("active mode"); ggnet_set_dns(net, 1, ev_base, cb_nodename); - //ggnet_set_traceroute(net, 1, ev_base, cb_nodetraceroute); + // XXX IN PROGRESS traceroute, disabled for now, 20130705 + // laurent + //ggnet_set_traceroute(net, 1, iface, ev_base, cb_nodetraceroute); } _cap.ggcli = ggcli; @@ -341,6 +344,7 @@ cb_nodename(struct ggnet *net, struct ggnet_node *n) struct gg_packet pkt; int len; + gg_log_debug("cb_nodename"); len = strnlen(n->fqdn, GGNET_DNSNAME_MAX); if (len > 0) { pkt.ver = PACKET_VERSION; @@ -353,21 +357,30 @@ cb_nodename(struct ggnet *net, struct ggnet_node *n) } static void -cb_nodetraceroute(struct ggnet *net, struct ggnet_node *n) +cb_nodetraceroute(struct ggnet *net, struct ggnet_traceroute_req *req) { + struct ggnet_traceroute_hop *h; struct gg_packet pkt; - int len; + int i; - len = strnlen(n->fqdn, GGNET_DNSNAME_MAX); - if (len > 0) { - pkt.ver = PACKET_VERSION; - pkt.type = PACKET_TRACE; - pkt.name_addr = n->addr.s_addr; - // XXX IN PROGRESS - //pkt.name_len = len; - //strncpy((char *)pkt.name_fqdn, n->fqdn, sizeof(pkt.name_fqdn)); - gg_client_send(_cap.ggcli, &pkt); + if (req->hopcount_answering == 0) + return; + + gg_log_debug("cb_nodetraceroute"); + pkt.ver = PACKET_VERSION; + pkt.type = PACKET_TRACE; + pkt.trace_addr = req->target->ip.addr_ip; + pkt.trace_hopcount = req->hopcount_total; + i = 0; + TAILQ_FOREACH(h, &req->hops_list, entry) { + pkt.trace_hops[i].addr = h->ip.addr_ip; + pkt.trace_hops[i].delay = h->delay; + pkt.trace_hops[i].loss = h->loss; + pkt.trace_hops[i].asn = h->asn; + i++; } + gg_client_send(_cap.ggcli, &pkt); + ggnet_traceroute_trace_free(req); } /* @@ -387,7 +400,7 @@ ip_handle(struct ip *ip, const u_char *pend, u_int wirelen) const u_char *cp; struct tcphdr *tcph; struct udphdr *udph; - struct icmp *icmp; + struct icmp_hdr *icmp; struct in_addr src, dst; u_int src_port, dst_port; u_int proto, close; @@ -475,12 +488,14 @@ ip_handle(struct ip *ip, const u_char *pend, u_int wirelen) break; case IPPROTO_ICMP: - icmp = (struct icmp *)cp; + icmp = (struct icmp_hdr *)cp; if (NOTRECEIVED(*icmp)) { log_pinvalid("user: icmp too small"); _cap.pinvalid++; return; } + if (icmp->icmp_type == ICMP_TIMEXCEED) + return; /* not considered real node */ proto = IPPROTO_ICMP; break; |