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.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/gg_sniff/pcap.c b/gg_sniff/pcap.c
index 91e76c9..f98a47a 100644
--- a/gg_sniff/pcap.c
+++ b/gg_sniff/pcap.c
@@ -81,6 +81,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 struct phandler phandlers[] = {
{ phandler_ether, DLT_EN10MB },
@@ -139,8 +140,10 @@ ggsniff_pcap_init(struct event_base *ev_base, struct gg_client *ggcli,
if (evtimer_add(_cap.conntimer_ev, &_cap.conntimer_tv) == -1)
gg_log_fatal("user: event_add conntimer failed: %s", strerror(errno));
- if (active)
+ if (active) {
ggnet_set_dns(net, 1, ev_base, cb_nodename);
+ ggnet_set_traceroute(net, 1, ev_base, cb_nodetraceroute);
+ }
_cap.ggcli = ggcli;
_cap.net = net;
@@ -350,6 +353,24 @@ cb_nodename(struct ggnet *net, struct ggnet_node *n)
}
}
+static void
+cb_nodetraceroute(struct ggnet *net, struct ggnet_node *n)
+{
+ struct gg_packet pkt;
+ int len;
+
+ 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);
+ }
+}
+
/*
* Parse an IP packet and descide what to do with it.
* 'ip' is a pointer the the captured IP packet