Giles Scott: Add Wlan tap

svn path=/trunk/; revision=12799
This commit is contained in:
Jörg Mayer 2004-12-21 12:30:24 +00:00
parent 6b2d41a3fe
commit 773681fca3
6 changed files with 213 additions and 2 deletions

View File

@ -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> {

View File

@ -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",

View File

@ -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;

View File

@ -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 \

88
gtk/conversations_wlan.c Normal file
View File

@ -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);
}

90
gtk/hostlist_wlan.c Normal file
View File

@ -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);
}