* Florian octo Forster <octo at verplant.org>
*/
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-
-#include <netinet/in.h>
-
-#include <pcap.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <time.h>
-#include <ctype.h>
-#include <curses.h>
-#include <assert.h>
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
-#ifdef __APPLE__
-#include <arpa/nameser_compat.h>
-#endif
-
-#include <sys/socket.h>
-#include <net/if_arp.h>
-#include <net/if.h>
-#include <netinet/if_ether.h>
-
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/ip6.h>
-#include <netinet/udp.h>
-
-#include <netdb.h>
+#include "collectd.h"
+
+#if HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#if HAVE_PCAP_H
+# include <pcap.h>
+#endif
+#if HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+
+#if HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#elif HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#if HAVE_NET_IF_ARP_H
+# include <net/if_arp.h>
+#endif
+#if HAVE_NET_IF_H
+# include <net/if.h>
+#endif
+#if HAVE_NETINET_IF_ETHER_H
+# include <netinet/if_ether.h>
+#endif
+#if HAVE_NET_IF_PPP_H
+# include <net/if_ppp.h>
+#endif
+
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#if HAVE_NETDB_H
+# include <netdb.h>
+#endif
+
+#if HAVE_NETINET_IN_SYSTM_H
+# include <netinet/in_systm.h>
+#endif
+#if HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#if HAVE_NETINET_IP_H
+# include <netinet/ip.h>
+#endif
+#ifdef HAVE_NETINET_IP_VAR_H
+# include <netinet/ip_var.h>
+#endif
+#if HAVE_NETINET_IP6_H
+# include <netinet/ip6.h>
+#endif
+#if HAVE_NETINET_UDP_H
+# include <netinet/udp.h>
+#endif
#define PCAP_SNAPLEN 1460
#ifndef ETHER_HDR_LEN
# define ETHERTYPE_IPV6 0x86DD
#endif
-#include <net/if_ppp.h>
#ifndef PPP_ADDRESS_VAL
# define PPP_ADDRESS_VAL 0xff /* The address byte value */
#endif
int opcode_counts[OP_MAX];
int qclass_counts[C_MAX];
+#if HAVE_PCAP_H
static pcap_t *pcap_obj = NULL;
+#endif
static ip_list_t *IgnoreList = NULL;
+#if HAVE_PCAP_H
static void (*Callback) (const rfc1035_header_t *) = NULL;
static int query_count_intvl = 0;
static int query_count_total = 0;
-#ifdef __OpenBSD__
+# ifdef __OpenBSD__
static struct bpf_timeval last_ts;
-#else
+# else
static struct timeval last_ts;
-#endif
+# endif /* __OpenBSD__ */
+#endif /* HAVE_PCAP_H */
static int cmp_in6_addr (const struct in6_addr *a,
const struct in6_addr *b)
{
int i;
- for (i = 0; i < 4; i++)
- if (a->s6_addr32[i] != b->s6_addr32[i])
+ assert (sizeof (struct in6_addr) == 16);
+
+ for (i = 0; i < 16; i++)
+ if (a->s6_addr[i] != b->s6_addr[i])
break;
- if (i >= 4)
+ if (i >= 16)
return (0);
- return (a->s6_addr32[i] > b->s6_addr32[i] ? 1 : -1);
+ return (a->s6_addr[i] > b->s6_addr[i] ? 1 : -1);
} /* int cmp_addrinfo */
static inline int ignore_list_match (const struct in6_addr *addr)
{
if (ai_ptr->ai_family == AF_INET)
{
- addr.s6_addr32[0] = 0;
- addr.s6_addr32[1] = 0;
- addr.s6_addr32[2] = htonl (0x0000FFFF);
- addr.s6_addr32[3] = ((struct sockaddr_in *) ai_ptr->ai_addr)->sin_addr.s_addr;
+ memset (&addr, '\0', sizeof (addr));
+ addr.s6_addr[10] = 0xFF;
+ addr.s6_addr[11] = 0xFF;
+ memcpy (addr.s6_addr + 12, &((struct sockaddr_in *) ai_ptr->ai_addr)->sin_addr, 4);
ignore_list_add (&addr);
}
freeaddrinfo (ai_list);
}
+#if HAVE_PCAP_H
static void in6_addr_from_buffer (struct in6_addr *ia,
const void *buf, size_t buf_len,
int family)
memset (ia, 0, sizeof (struct in6_addr));
if ((AF_INET == family) && (sizeof (uint32_t) == buf_len))
{
- ia->s6_addr32[2] = htonl (0x0000FFFF);
- ia->s6_addr32[3] = *((uint32_t *) buf);
+ ia->s6_addr[10] = 0xFF;
+ ia->s6_addr[11] = 0xFF;
+ memcpy (ia->s6_addr + 12, buf, buf_len);
}
else if ((AF_INET6 == family) && (sizeof (struct in6_addr) == buf_len))
{
return 1;
}
+#if HAVE_NET_IF_PPP_H
static int
handle_ppp(const u_char * pkt, int len)
{
memcpy(buf, pkt, len);
return handle_ip((struct ip *) buf, len);
}
+#endif /* HAVE_NET_IF_PPP_H */
static int
handle_null(const u_char * pkt, int len)
return handle_ip((struct ip *) buf, len);
}
+#ifdef DLT_LINUX_SLL
+static int
+handle_linux_sll (const u_char *pkt, int len)
+{
+ struct sll_header
+ {
+ uint16_t pkt_type;
+ uint16_t dev_type;
+ uint16_t addr_len;
+ uint8_t addr[8];
+ uint16_t proto_type;
+ } *hdr;
+ uint16_t etype;
+
+ if (len < sizeof (struct sll_header))
+ return (0);
+
+ hdr = (struct sll_header *) pkt;
+ pkt = (u_char *) (hdr + 1);
+ len -= sizeof (struct sll_header);
+
+ etype = ntohs (hdr->proto_type);
+
+ if ((ETHERTYPE_IP != etype)
+ && (ETHERTYPE_IPV6 != etype))
+ return 0;
+
+ if (ETHERTYPE_IPV6 == etype)
+ return (handle_ipv6 ((struct ip6_hdr *) pkt, len));
+ else
+ return handle_ip((struct ip *) pkt, len);
+}
+#endif /* DLT_LINUX_SLL */
+
/* public function */
void handle_pcap(u_char *udata, const struct pcap_pkthdr *hdr, const u_char *pkt)
{
case DLT_EN10MB:
status = handle_ether (pkt, hdr->caplen);
break;
+#if HAVE_NET_IF_PPP_H
case DLT_PPP:
status = handle_ppp (pkt, hdr->caplen);
break;
+#endif
#ifdef DLT_LOOP
case DLT_LOOP:
status = handle_loop (pkt, hdr->caplen);
status = handle_raw (pkt, hdr->caplen);
break;
#endif
+#ifdef DLT_LINUX_SLL
+ case DLT_LINUX_SLL:
+ status = handle_linux_sll (pkt, hdr->caplen);
+ break;
+#endif
case DLT_NULL:
status = handle_null (pkt, hdr->caplen);
break;
query_count_total++;
last_ts = hdr->ts;
}
+#endif /* HAVE_PCAP_H */
const char *qtype_str(int t)
{
case DLT_EN10MB:
handle_datalink = handle_ether;
break;
-#if USE_PPP
+#if HAVE_NET_IF_PPP_H
case DLT_PPP:
handle_datalink = handle_ppp;
break;
return 0;
} /* static int main(int argc, char *argv[]) */
#endif
+/*
+ * vim:shiftwidth=4:tabstop=8:softtabstop=4
+ */