aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJörg Mayer <jmayer@loplof.de>2004-12-21 12:30:24 +0000
committerJörg Mayer <jmayer@loplof.de>2004-12-21 12:30:24 +0000
commit773681fca3fed0fccf97148ecdbd5069003c074c (patch)
treeebf482d5f87812b5bf1eb87a431e4f46f5e66fb6
parent6b2d41a3fe3e75cbc41c0bc690afd60df8c54c6d (diff)
Giles Scott: Add Wlan tap
svn path=/trunk/; revision=12799
-rw-r--r--AUTHORS1
-rw-r--r--epan/dissectors/packet-ieee80211.c27
-rw-r--r--epan/dissectors/packet-ieee80211.h7
-rw-r--r--gtk/Makefile.common2
-rw-r--r--gtk/conversations_wlan.c88
-rw-r--r--gtk/hostlist_wlan.c90
6 files changed, 213 insertions, 2 deletions
diff --git a/AUTHORS b/AUTHORS
index 8d4dea27c8..de03e6e425 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1912,6 +1912,7 @@ Giles Scott <gscott [AT] arubanetworks.com> {
Alteon/Nortel Transparent Proxy Control Protocol support
Ethernet MAC Control Frame support
Port weak key detection from Airsnort
+ Wlan tap
}
Vincent Jardin <vincent.jardin [AT] 6wind.com> {
diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c
index 68d8059711..acf69e4025 100644
--- a/epan/dissectors/packet-ieee80211.c
+++ b/epan/dissectors/packet-ieee80211.c
@@ -68,6 +68,7 @@
#include "packet-ieee80211.h"
#include "etypes.h"
#include <epan/crc32.h>
+#include <epan/tap.h>
#include <ctype.h>
#include "isprint.h"
@@ -512,6 +513,8 @@ static dissector_handle_t ipx_handle;
static dissector_handle_t eth_withoutfcs_handle;
static dissector_handle_t data_handle;
+static int wlan_tap = -1;
+
/* ************************************************************************* */
/* Return the length of the current header (in bytes) */
/* ************************************************************************* */
@@ -1684,6 +1687,10 @@ dissect_ieee80211_common (tvbuff_t * tvb, packet_info * pinfo,
char out_buff[SHORT_STR];
gint is_iv_bad;
guchar iv_buff[4];
+ wlan_hdr *whdr;
+ static wlan_hdr whdrs[4];
+
+ whdr= &whdrs[0];
if (check_col (pinfo->cinfo, COL_PROTOCOL))
col_set_str (pinfo->cinfo, COL_PROTOCOL, "IEEE 802.11");
@@ -1843,6 +1850,11 @@ dissect_ieee80211_common (tvbuff_t * tvb, packet_info * pinfo,
SET_ADDRESS(&pinfo->dl_dst, AT_ETHER, 6, dst);
SET_ADDRESS(&pinfo->dst, AT_ETHER, 6, dst);
+ /* for tap */
+ SET_ADDRESS(&whdr->bssid, AT_ETHER, 6, tvb_get_ptr(tvb, 16,6));
+ SET_ADDRESS(&whdr->src, AT_ETHER, 6, src);
+ SET_ADDRESS(&whdr->dst, AT_ETHER, 6, dst);
+
seq_control = tvb_get_letohs(tvb, 22);
frag_number = COOK_FRAGMENT_NUMBER(seq_control);
seq_number = COOK_SEQUENCE_NUMBER(seq_control);
@@ -1992,6 +2004,12 @@ dissect_ieee80211_common (tvbuff_t * tvb, packet_info * pinfo,
SET_ADDRESS(&pinfo->dl_dst, AT_ETHER, 6, dst);
SET_ADDRESS(&pinfo->dst, AT_ETHER, 6, dst);
+ /* for tap */
+
+ SET_ADDRESS(&whdr->bssid, AT_ETHER, 6, tvb_get_ptr(tvb, 16,6));
+ SET_ADDRESS(&whdr->src, AT_ETHER, 6, src);
+ SET_ADDRESS(&whdr->dst, AT_ETHER, 6, dst);
+
seq_control = tvb_get_letohs(tvb, 22);
frag_number = COOK_FRAGMENT_NUMBER(seq_control);
seq_number = COOK_SEQUENCE_NUMBER(seq_control);
@@ -2342,7 +2360,7 @@ dissect_ieee80211_common (tvbuff_t * tvb, packet_info * pinfo,
{
/* Some wireless drivers (such as Centrino) WEP payload already decrypted */
call_dissector(data_handle, next_tvb, pinfo, tree);
- return;
+ goto end_of_wlan;
}
} else {
@@ -2450,7 +2468,7 @@ dissect_ieee80211_common (tvbuff_t * tvb, packet_info * pinfo,
next_tvb = tvb_new_subset (tvb, hdr_len, len, reported_len);
call_dissector(data_handle, next_tvb, pinfo, tree);
pinfo->fragmented = save_fragmented;
- return;
+ goto end_of_wlan;
}
switch (COOK_FRAME_TYPE (fcf))
@@ -2523,6 +2541,9 @@ dissect_ieee80211_common (tvbuff_t * tvb, packet_info * pinfo,
break;
}
pinfo->fragmented = save_fragmented;
+
+ end_of_wlan:
+ tap_queue_packet(wlan_tap, pinfo, whdr);
}
/*
@@ -3198,6 +3219,8 @@ proto_register_ieee80211 (void)
register_dissector("wlan_bsfc", dissect_ieee80211_bsfc, proto_wlan);
register_init_routine(wlan_defragment_init);
+ wlan_tap = register_tap("wlan");
+
/* Register configuration options */
wlan_module = prefs_register_protocol(proto_wlan, init_wepkeys);
prefs_register_bool_preference(wlan_module, "defragment",
diff --git a/epan/dissectors/packet-ieee80211.h b/epan/dissectors/packet-ieee80211.h
index c80bb7bd4e..6ab638d2c4 100644
--- a/epan/dissectors/packet-ieee80211.h
+++ b/epan/dissectors/packet-ieee80211.h
@@ -32,3 +32,10 @@ void capture_ieee80211_fixed (const guchar *, int, int, packet_counts *);
void ieee_80211_add_tagged_parameters (tvbuff_t * tvb, int offset,
packet_info * pinfo, proto_tree * tree, int tagged_parameters_len);
+
+typedef struct _wlan_hdr {
+ address bssid;
+ address src;
+ address dst;
+ guint16 type;
+} wlan_hdr;
diff --git a/gtk/Makefile.common b/gtk/Makefile.common
index f651bce996..123ba2c3cc 100644
--- a/gtk/Makefile.common
+++ b/gtk/Makefile.common
@@ -99,6 +99,7 @@ ETHEREAL_TAP_SRC = \
conversations_tcpip.c \
conversations_tr.c \
conversations_udpip.c \
+ conversations_wlan.c \
dcerpc_stat.c \
fc_stat.c \
gsm_a_stat.c \
@@ -115,6 +116,7 @@ ETHEREAL_TAP_SRC = \
hostlist_tcpip.c \
hostlist_tr.c \
hostlist_udpip.c \
+ hostlist_wlan.c \
http_stat.c \
io_stat.c \
isup_stat.c \
diff --git a/gtk/conversations_wlan.c b/gtk/conversations_wlan.c
new file mode 100644
index 0000000000..97e2593e10
--- /dev/null
+++ b/gtk/conversations_wlan.c
@@ -0,0 +1,88 @@
+/* conversations_wlan.c 2004 Giles Scott
+ * conversations_eth 2003 Ronnie Sahlberg
+ *
+ * $Id $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <string.h>
+#include "epan/packet.h"
+#include "tap_menu.h"
+#include <epan/tap.h>
+#include "../register.h"
+#include "conversations_table.h"
+#include <epan/dissectors/packet-ieee80211.h>
+
+
+static int
+wlan_conversation_packet(void *pct, packet_info *pinfo, epan_dissect_t *edt _U_, void *vip)
+{
+ wlan_hdr *whdr=vip;
+
+ add_conversation_table_data((conversations_table *)pct, &whdr->src, &whdr->dst, 0, 0, 1, pinfo->fd->pkt_len, SAT_ETHER, PT_NONE);
+
+ return 1;
+}
+
+
+
+static void
+wlan_conversation_init(char *optarg)
+{
+ char *filter=NULL;
+
+ if(!strncmp(optarg,"conv,wlan,",10)){
+ filter=optarg+10;
+ } else {
+ filter=NULL;
+ }
+
+ init_conversation_table(TRUE, "WLAN", "wlan", filter, (void *)wlan_conversation_packet);
+
+}
+
+
+static void
+wlan_endpoints_cb(GtkWidget *w _U_, gpointer d _U_)
+{
+ wlan_conversation_init("conv,wlan");
+}
+
+
+void
+register_tap_listener_wlan_conversation(void)
+{
+ register_ethereal_tap("conv,wlan", wlan_conversation_init);
+
+ register_tap_menu_item("WLAN", REGISTER_TAP_GROUP_CONVERSATION_LIST,
+ wlan_endpoints_cb, NULL, NULL, NULL);
+
+ register_conversation_table(TRUE, "WLAN", "wlan", NULL /*filter*/, (void *)wlan_conversation_packet);
+}
+
diff --git a/gtk/hostlist_wlan.c b/gtk/hostlist_wlan.c
new file mode 100644
index 0000000000..be9051c347
--- /dev/null
+++ b/gtk/hostlist_wlan.c
@@ -0,0 +1,90 @@
+/* hostlist_wlan.c 2004 Giles Scott
+ * modified from endpoint_talkers_eth.c 2003 Ronnie Sahlberg
+ *
+ * $Id $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <string.h>
+#include "epan/packet.h"
+#include "tap_menu.h"
+#include <epan/tap.h>
+#include "../register.h"
+#include "hostlist_table.h"
+#include <epan/dissectors/packet-ieee80211.h>
+
+
+static int
+wlan_hostlist_packet(void *pit, packet_info *pinfo, epan_dissect_t *edt _U_, void *vip)
+{
+ hostlist_table *hosts=(hostlist_table *)pit;
+ wlan_hdr *whdr=vip;
+
+ /* Take two "add" passes per packet, adding for each direction, ensures that all
+ packets are counted properly (even if address is sending to itself)
+ XXX - this could probably be done more efficiently inside hostlist_table */
+ add_hostlist_table_data(hosts, &whdr->src, 0, TRUE, 1, pinfo->fd->pkt_len, SAT_ETHER, PT_NONE);
+ add_hostlist_table_data(hosts, &whdr->dst, 0, FALSE, 1, pinfo->fd->pkt_len, SAT_ETHER, PT_NONE);
+
+ return 1;
+}
+
+static void
+gtk_wlan_hostlist_init(char *optarg)
+{
+ char *filter=NULL;
+
+ if(!strncmp(optarg,"hosts,wlan,",11)){
+ filter=optarg+11;
+ } else {
+ filter=NULL;
+ }
+
+ init_hostlist_table(TRUE, "Wlan Hosts", "wlan", filter, (void *)wlan_hostlist_packet);
+
+}
+
+
+static void
+gtk_wlan_hostlist_cb(GtkWidget *w _U_, gpointer d _U_)
+{
+ gtk_wlan_hostlist_init("hosts,wlan");
+}
+
+
+void
+register_tap_listener_wlan_hostlist(void)
+{
+ register_ethereal_tap("hosts,wlan", gtk_wlan_hostlist_init);
+
+ register_tap_menu_item("Wlan", REGISTER_TAP_GROUP_ENDPOINT_LIST,
+ gtk_wlan_hostlist_cb, NULL, NULL, NULL);
+
+ register_hostlist_table(TRUE, "WLAN", "wlan", NULL /*filter*/, (void *)wlan_hostlist_packet);
+}