aboutsummaryrefslogtreecommitdiffstats
path: root/gg_sniff/pcap.c
diff options
context:
space:
mode:
Diffstat (limited to 'gg_sniff/pcap.c')
-rw-r--r--gg_sniff/pcap.c45
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;