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 02735c8..fd9470f 100644
--- a/gg_sniff/pcap.c
+++ b/gg_sniff/pcap.c
@@ -80,6 +80,7 @@ static void phandler_sll(u_char *,
#endif
static void cb_pcap(int, short, void *);
static void cb_conntimer(int, short, void *);
+static void cb_nodename(struct ggnet *, struct ggnet_node *);
static struct phandler phandlers[] = {
{ phandler_ether, DLT_EN10MB },
@@ -97,7 +98,7 @@ static struct _cap_t _cap;
int
ggsniff_pcap_init(struct event_base *ev_base, struct gg_client *ggcli,
- struct ggnet *net, char *iface)
+ struct ggnet *net, char *iface, int active)
{
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program bprog;
@@ -136,6 +137,9 @@ 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)
+ ggnet_set_dns(net, 1, ev_base, cb_nodename);
+
_cap.ggcli = ggcli;
_cap.net = net;
@@ -327,6 +331,23 @@ cb_conntimer(int fd, short why, void *data)
gg_log_fatal("user: event_add conntimer failed : %s", strerror(errno));
}
+static void
+cb_nodename(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_NAME;
+ pkt.name_addr = n->addr.s_addr;
+ 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