diff options
author | Alexis La Goutte <alexis.lagoutte@gmail.com> | 2015-05-31 17:48:55 +0200 |
---|---|---|
committer | Alexis La Goutte <alexis.lagoutte@gmail.com> | 2015-06-06 09:47:35 +0000 |
commit | 7e2e8ef04c301bffd67958ed3d11d751ebd3e04c (patch) | |
tree | 7de15d3b21056166fd639f2f52410cd274642769 /epan | |
parent | 8d46c411e9b29569e806586b175b4764443374b4 (diff) |
Aruba ERM: Fix FCS for Type 1 (PEEK)
Type 1 is Peek type (using Peek dissector)
Peek dissector is also update for Cisco AP, Pass info to peek dissector it is "Aruba PEEK" (with buggy FCS)
Add also check of signal value (when signal strength = 100%) it is a TX packet and there is no FCS
Bug:11204
Change-Id: I435e0e3275bc0a03fa534e49e86251114f568040
Reviewed-on: https://code.wireshark.org/review/8710
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-aruba-erm.c | 5 | ||||
-rw-r--r-- | epan/dissectors/packet-peekremote.c | 23 |
2 files changed, 21 insertions, 7 deletions
diff --git a/epan/dissectors/packet-aruba-erm.c b/epan/dissectors/packet-aruba-erm.c index ac5fc781ab..8ea9328c2d 100644 --- a/epan/dissectors/packet-aruba-erm.c +++ b/epan/dissectors/packet-aruba-erm.c @@ -102,6 +102,8 @@ #define TYPE_PCAPPLUSRADIO 3 #define TYPE_PPI 4 +#define IS_ARUBA 0x01 + static const value_string aruba_erm_type_vals[] = { { TYPE_PCAP, "pcap (type 0)" }, { TYPE_PEEK, "peek (type 1)" }, @@ -209,7 +211,8 @@ dissect_aruba_erm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) call_dissector(wlan_withfcs, eth_tvb, pinfo, tree); break; case TYPE_PEEK: - call_dissector(peek_handle, tvb, pinfo, tree); + /* Say to PEEK dissector, it is a Aruba PEEK packet */ + call_dissector_with_data(peek_handle, tvb, pinfo, tree, GUINT_TO_POINTER(IS_ARUBA)); break; case TYPE_AIRMAGNET: /* Not (yet) supported launch data dissector */ diff --git a/epan/dissectors/packet-peekremote.c b/epan/dissectors/packet-peekremote.c index cec58ad67e..49e4050e09 100644 --- a/epan/dissectors/packet-peekremote.c +++ b/epan/dissectors/packet-peekremote.c @@ -57,6 +57,7 @@ #include <epan/packet.h> #include <epan/expert.h> +#define IS_ARUBA 0x01 void proto_register_peekremote(void); void proto_reg_handoff_peekremote(void); @@ -311,7 +312,9 @@ static gint ett_peekremote_flags = -1; static gint ett_peekremote_status = -1; static gint ett_peekremote_extflags = -1; -static dissector_handle_t ieee80211_handle; +static dissector_handle_t wlan_withfcs; +static dissector_handle_t wlan_withoutfcs; + static int dissect_peekremote_extflags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset) @@ -464,22 +467,23 @@ dissect_peekremote_new(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void proto_item_set_end(ti, tvb, offset); next_tvb = tvb_new_subset_remaining(tvb, offset); - call_dissector(ieee80211_handle, next_tvb, pinfo, tree); + call_dissector(wlan_withfcs, next_tvb, pinfo, tree); return TRUE; } static int -dissect_peekremote_legacy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *u) +dissect_peekremote_legacy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { tvbuff_t *next_tvb; proto_tree *peekremote_tree = NULL; proto_item *ti = NULL; + guint8 signal_percent; /* * Check whether this is peekremote-ng, and dissect it as such if it * is. */ - if (dissect_peekremote_new(tvb, pinfo, tree, u)) { + if (dissect_peekremote_new(tvb, pinfo, tree, data)) { /* Yup, it was peekremote-ng, and it's been dissected as such. */ return tvb_reported_length(tvb); } @@ -503,9 +507,15 @@ dissect_peekremote_legacy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, v proto_tree_add_item(peekremote_tree, &hfi_peekremote_signal_percent, tvb, 18, 1, ENC_NA); proto_tree_add_item(peekremote_tree, &hfi_peekremote_noise_percent, tvb, 19, 1, ENC_NA); } + signal_percent = tvb_get_guint8(tvb, 18); proto_item_set_end(ti, tvb, 20); next_tvb = tvb_new_subset_remaining(tvb, 20); - return 20 + call_dissector(ieee80211_handle, next_tvb, pinfo, tree); + /* When signal = 100 % and coming from ARUBA ERM, it is TX packet and there is no FCS */ + if (GPOINTER_TO_INT(data) == IS_ARUBA && signal_percent == 100){ + return 20 + call_dissector(wlan_withoutfcs, next_tvb, pinfo, tree); + } else { + return 20 + call_dissector(wlan_withfcs, next_tvb, pinfo, tree); + } } void @@ -588,7 +598,8 @@ proto_reg_handoff_peekremote(void) { dissector_handle_t peekremote_handle; - ieee80211_handle = find_dissector("wlan_withfcs"); + wlan_withfcs = find_dissector("wlan_withfcs"); + wlan_withoutfcs = find_dissector("wlan_withoutfcs"); peekremote_handle = new_create_dissector_handle(dissect_peekremote_legacy, proto_peekremote); dissector_add_uint("udp.port", 5000, peekremote_handle); |