diff options
author | Ethan Young <imfargo@gmail.com> | 2016-12-18 15:37:56 -0500 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2016-12-20 19:27:38 +0000 |
commit | caadaaf62317a88f99373d9095b827102999e4e3 (patch) | |
tree | 80ea1209f594bf1faa03fb093be15b81cc38df0b /epan | |
parent | b7ee557d88841bc77f65c1fdc8b70ee4751624d6 (diff) |
Make EAPOL packet types into a dissector table.
This decouples EAPOL from the few dissectors it needs to call based
on packet type and moves registration to the dissectors themselves.
Change-Id: Ia8412fe33370f4aeece52c2c80cda7f140a950cf
Reviewed-on: https://code.wireshark.org/review/19328
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/Makefile.am | 1 | ||||
-rw-r--r-- | epan/dissectors/packet-eap.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-eapol.c | 87 | ||||
-rw-r--r-- | epan/dissectors/packet-eapol.h | 51 | ||||
-rw-r--r-- | epan/dissectors/packet-mka.c | 12 |
5 files changed, 104 insertions, 49 deletions
diff --git a/epan/dissectors/Makefile.am b/epan/dissectors/Makefile.am index 090aa39173..1daedda589 100644 --- a/epan/dissectors/Makefile.am +++ b/epan/dissectors/Makefile.am @@ -1542,6 +1542,7 @@ DISSECTOR_INCLUDES = \ packet-erf.h \ packet-e164.h \ packet-e212.h \ + packet-eapol.h \ packet-edonkey.h \ packet-eigrp.h \ packet-epmd.h \ diff --git a/epan/dissectors/packet-eap.c b/epan/dissectors/packet-eap.c index 1320c0d753..f4cfb49942 100644 --- a/epan/dissectors/packet-eap.c +++ b/epan/dissectors/packet-eap.c @@ -33,6 +33,7 @@ #include <epan/expert.h> #include <epan/proto_data.h> +#include "packet-eapol.h" #include "packet-wps.h" #include "packet-e212.h" @@ -1713,6 +1714,7 @@ proto_reg_handoff_eap(void) ssl_handle = find_dissector_add_dependency("ssl", proto_eap); dissector_add_uint("ppp.protocol", PPP_EAP, eap_handle); + dissector_add_uint("eapol.type", EAPOL_EAP, eap_handle); } /* * Editor modelines diff --git a/epan/dissectors/packet-eapol.c b/epan/dissectors/packet-eapol.c index 09e0a2a4a9..9bf43c53d0 100644 --- a/epan/dissectors/packet-eapol.c +++ b/epan/dissectors/packet-eapol.c @@ -28,6 +28,8 @@ #include <epan/etypes.h> #include <epan/eapol_keydes_types.h> +#include "packet-eapol.h" + void proto_register_eapol(void); void proto_reg_handoff_eapol(void); @@ -51,26 +53,17 @@ static gint ett_eapol = -1; static gint ett_eapol_key_index = -1; static gint ett_keyinfo = -1; +static dissector_table_t eapol_type_dissector_table; static dissector_table_t eapol_keydes_type_dissector_table; static dissector_handle_t eapol_handle; -static dissector_handle_t eap_handle; -static dissector_handle_t mka_handle; - #define EAPOL_HDR_LEN 4 #define EAPOL_2001 1 #define EAPOL_2004 2 #define EAPOL_2010 3 -#define EAP_PACKET 0 -#define EAPOL_START 1 -#define EAPOL_LOGOFF 2 -#define EAPOL_KEY 3 -#define EAPOL_ENCAP_ASF_ALERT 4 -#define EAPOL_MKA 5 - static const value_string eapol_version_vals[] = { { EAPOL_2001, "802.1X-2001" }, { EAPOL_2004, "802.1X-2004" }, @@ -79,7 +72,7 @@ static const value_string eapol_version_vals[] = { }; static const value_string eapol_type_vals[] = { - { EAP_PACKET, "EAP Packet" }, + { EAPOL_EAP, "EAP Packet" }, { EAPOL_START, "Start" }, { EAPOL_LOGOFF, "Logoff" }, { EAPOL_KEY, "Key" }, @@ -106,7 +99,6 @@ dissect_eapol(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U int offset = 0; guint8 eapol_type; guint16 eapol_len; - guint8 keydesc_type; guint len; proto_tree *ti; proto_tree *eapol_tree; @@ -136,35 +128,33 @@ dissect_eapol(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U } offset += 2; - switch (eapol_type) { - - case EAP_PACKET: - next_tvb = tvb_new_subset_remaining(tvb, offset); - call_dissector(eap_handle, next_tvb, pinfo, eapol_tree); - break; - - case EAPOL_KEY: - keydesc_type = tvb_get_guint8(tvb, offset); - proto_tree_add_item(eapol_tree, hf_eapol_keydes_type, tvb, offset, 1, ENC_BIG_ENDIAN); - offset += 1; - next_tvb = tvb_new_subset_remaining(tvb, offset); - if (!dissector_try_uint_new(eapol_keydes_type_dissector_table, - keydesc_type, next_tvb, pinfo, eapol_tree, - FALSE, NULL)) - proto_tree_add_item(eapol_tree, hf_eapol_keydes_body, tvb, offset, -1, ENC_NA); - break; - - case EAPOL_MKA: - next_tvb = tvb_new_subset_remaining(tvb, offset); - call_dissector(mka_handle, next_tvb, pinfo, eapol_tree); - break; - - case EAPOL_ENCAP_ASF_ALERT: /* XXX - is this an SNMP trap? */ - default: - next_tvb = tvb_new_subset_remaining(tvb, offset); - call_data_dissector(next_tvb, pinfo, eapol_tree); - break; + next_tvb = tvb_new_subset_remaining(tvb, offset); + if (!dissector_try_uint_new(eapol_type_dissector_table, + eapol_type, next_tvb, pinfo, tree, + FALSE, eapol_tree)) { + call_data_dissector(next_tvb, pinfo, tree); + } + return tvb_captured_length(tvb); +} + +static int +dissect_eapol_key(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, void* data) +{ + guint8 keydesc_type; + int offset = 0; + tvbuff_t *next_tvb; + proto_tree* eapol_tree = (proto_tree*)data; + + keydesc_type = tvb_get_guint8(tvb, offset); + proto_tree_add_item(eapol_tree, hf_eapol_keydes_type, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + next_tvb = tvb_new_subset_remaining(tvb, offset); + if (!dissector_try_uint_new(eapol_keydes_type_dissector_table, + keydesc_type, next_tvb, pinfo, eapol_tree, + FALSE, NULL)) { + proto_tree_add_item(eapol_tree, hf_eapol_keydes_body, tvb, offset, -1, ENC_NA); } + return tvb_captured_length(tvb); } @@ -305,6 +295,10 @@ proto_register_eapol(void) proto_register_field_array(proto_eapol, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); + eapol_type_dissector_table = register_dissector_table("eapol.type", + "EAPOL Packet Type", + proto_eapol, FT_UINT8, + BASE_DEC); eapol_keydes_type_dissector_table = register_dissector_table("eapol.keydes.type", "EAPOL Key Descriptor Type", proto_eapol, FT_UINT8, @@ -314,13 +308,7 @@ proto_register_eapol(void) void proto_reg_handoff_eapol(void) { - dissector_handle_t eapol_rc4_key_handle; - - /* - * Get handles for the EAP and raw data dissectors. - */ - eap_handle = find_dissector_add_dependency("eap", proto_eapol); - mka_handle = find_dissector_add_dependency("mka", proto_eapol); + dissector_handle_t eapol_rc4_key_handle, eapol_key_handle; dissector_add_uint("ethertype", ETHERTYPE_EAPOL, eapol_handle); dissector_add_uint("ethertype", ETHERTYPE_RSN_PREAUTH, eapol_handle); @@ -328,9 +316,10 @@ proto_reg_handoff_eapol(void) /* * EAPOL key descriptor types. */ - eapol_rc4_key_handle = create_dissector_handle(dissect_eapol_rc4_key, - proto_eapol); + eapol_rc4_key_handle = create_dissector_handle(dissect_eapol_rc4_key, proto_eapol); dissector_add_uint("eapol.keydes.type", EAPOL_RC4_KEY, eapol_rc4_key_handle); + eapol_key_handle = create_dissector_handle(dissect_eapol_key, proto_eapol); + dissector_add_uint("eapol.type", EAPOL_KEY, eapol_key_handle); } /* diff --git a/epan/dissectors/packet-eapol.h b/epan/dissectors/packet-eapol.h new file mode 100644 index 0000000000..e4d9f0c06c --- /dev/null +++ b/epan/dissectors/packet-eapol.h @@ -0,0 +1,51 @@ +/* packet-eapol.h + * Common definitions for EAPOL protocol. + * Copyright 2016, Ethan Young <imfargo@gmail.com> + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef __PACKET_EAPOL_H__ +#define __PACKET_EAPOL_H__ + +/* EAPOL packet types. */ +#define EAPOL_EAP 0 +#define EAPOL_START 1 +#define EAPOL_LOGOFF 2 +#define EAPOL_KEY 3 +#define EAPOL_ENCAP_ASF_ALERT 4 +#define EAPOL_MKA 5 +#define EAPOL_ANNOUNCEMENT_GENERIC 6 +#define EAPOL_ANNOUNCEMENT_SPECIFIC 7 +#define EAPOL_ANNOUNCEMENT_REQUEST 8 + +#endif /* __PACKET_EAPOL_H__ */ + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ diff --git a/epan/dissectors/packet-mka.c b/epan/dissectors/packet-mka.c index 5eae03e741..32a6eaf065 100644 --- a/epan/dissectors/packet-mka.c +++ b/epan/dissectors/packet-mka.c @@ -29,6 +29,8 @@ #include <epan/packet.h> #include <epan/expert.h> +#include "packet-eapol.h" + #define BASIC_PARAM_SET_TYPE 1 #define LIVE_PEER_LIST_TYPE 1 #define POTENTIAL_PEER_LIST_TYPE 2 @@ -39,6 +41,7 @@ #define ICV_TYPE 255 void proto_register_mka(void); +void proto_reg_handoff_mka(void); static int proto_mka = -1; @@ -777,6 +780,15 @@ proto_register_mka(void) } +void +proto_reg_handoff_mka(void) +{ + static dissector_handle_t mka_handle; + + mka_handle = create_dissector_handle(dissect_mka, proto_mka); + dissector_add_uint("eapol.type", EAPOL_MKA, mka_handle); +} + /* * Editor modelines * |