1be3629f30
a time, so we dissect as far as we can. Set the length of the EAP protocol item to the length of an EAP header. Put information into the Info column about the EAP code and, for a request or response, the EAP type. svn path=/trunk/; revision=4798
169 lines
4.5 KiB
C
169 lines
4.5 KiB
C
/* packet-eap.c
|
|
* Routines for EAP Extensible Authentication Protocol header disassembly,
|
|
* RFC 2284
|
|
*
|
|
* $Id: packet-eap.c,v 1.11 2002/02/24 08:10:07 guy Exp $
|
|
*
|
|
* 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
|
|
|
|
#ifdef HAVE_NETINET_IN_H
|
|
# include <netinet/in.h>
|
|
#endif
|
|
|
|
#include <glib.h>
|
|
#include <epan/packet.h>
|
|
#include "packet-ieee8023.h"
|
|
#include "packet-ipx.h"
|
|
#include "packet-llc.h"
|
|
#include "etypes.h"
|
|
#include "ppptypes.h"
|
|
|
|
static int proto_eap = -1;
|
|
static int hf_eap_code = -1;
|
|
static int hf_eap_identifier = -1;
|
|
static int hf_eap_len = -1;
|
|
static int hf_eap_type = -1;
|
|
|
|
static gint ett_eap = -1;
|
|
|
|
#define EAP_REQUEST 1
|
|
#define EAP_RESPONSE 2
|
|
#define EAP_SUCCESS 3
|
|
#define EAP_FAILURE 4
|
|
|
|
static const value_string eap_code_vals[] = {
|
|
{ EAP_REQUEST, "Request" },
|
|
{ EAP_RESPONSE, "Response" },
|
|
{ EAP_SUCCESS, "Success" },
|
|
{ EAP_FAILURE, "Failure" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string eap_type_vals[] = {
|
|
{ 1, "Identity" },
|
|
{ 2, "Notification" },
|
|
{ 3, "Nak (Response only)" },
|
|
{ 4, "MD5-Challenge" },
|
|
{ 5, "One-Time Password (OTP) (RFC 1938)" },
|
|
{ 6, "Generic Token Card" },
|
|
{ 13, "EAP/TLS (RFC2716)" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static void
|
|
dissect_eap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|
{
|
|
guint8 eap_code;
|
|
guint8 eap_id;
|
|
guint16 eap_len;
|
|
guint8 eap_type;
|
|
guint len;
|
|
proto_tree *ti;
|
|
proto_tree *eap_tree = NULL;
|
|
|
|
if (check_col(pinfo->cinfo, COL_PROTOCOL))
|
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "EAP");
|
|
if (check_col(pinfo->cinfo, COL_INFO))
|
|
col_clear(pinfo->cinfo, COL_INFO);
|
|
|
|
eap_code = tvb_get_guint8(tvb, 0);
|
|
if (check_col(pinfo->cinfo, COL_INFO))
|
|
col_add_str(pinfo->cinfo, COL_INFO,
|
|
val_to_str(eap_code, eap_code_vals, "Unknown code (0x%02X)"));
|
|
if (tree) {
|
|
ti = proto_tree_add_item(tree, proto_eap, tvb, 0, 4, FALSE);
|
|
eap_tree = proto_item_add_subtree(ti, ett_eap);
|
|
|
|
proto_tree_add_uint(eap_tree, hf_eap_code, tvb, 0, 1, eap_code);
|
|
}
|
|
|
|
if (tree)
|
|
proto_tree_add_item(eap_tree, hf_eap_identifier, tvb, 1, 1, FALSE);
|
|
|
|
eap_len = tvb_get_ntohs(tvb, 2);
|
|
len = eap_len;
|
|
set_actual_length(tvb, len);
|
|
if (tree)
|
|
proto_tree_add_uint(eap_tree, hf_eap_len, tvb, 2, 2, eap_len);
|
|
|
|
switch (eap_code) {
|
|
|
|
case EAP_REQUEST:
|
|
case EAP_RESPONSE:
|
|
eap_type = tvb_get_guint8(tvb, 4);
|
|
if (check_col(pinfo->cinfo, COL_INFO))
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, ", %s",
|
|
val_to_str(eap_type, eap_type_vals, "Unknown type (0x%02X)"));
|
|
if (tree) {
|
|
proto_tree_add_uint(eap_tree, hf_eap_type, tvb, 4, 1, eap_type);
|
|
if (len > 5) {
|
|
proto_tree_add_text(eap_tree, tvb, 5, len - 5, "Type-Data (%d byte%s)",
|
|
len - 5, plurality(len - 5, "", "s"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
proto_register_eap(void)
|
|
{
|
|
static hf_register_info hf[] = {
|
|
{ &hf_eap_code, {
|
|
"Code", "eap.code", FT_UINT8, BASE_DEC,
|
|
VALS(eap_code_vals), 0x0, "", HFILL }},
|
|
{ &hf_eap_identifier, {
|
|
"Id", "eap.id", FT_UINT8, BASE_DEC,
|
|
NULL, 0x0, "", HFILL }},
|
|
{ &hf_eap_len, {
|
|
"Length", "eap.len", FT_UINT16, BASE_DEC,
|
|
NULL, 0x0, "", HFILL }},
|
|
{ &hf_eap_type, {
|
|
"Type", "eap.type", FT_UINT8, BASE_DEC,
|
|
VALS(eap_type_vals), 0x0, "", HFILL }},
|
|
};
|
|
static gint *ett[] = {
|
|
&ett_eap,
|
|
};
|
|
|
|
proto_eap = proto_register_protocol("Extensible Authentication Protocol",
|
|
"EAP", "eap");
|
|
proto_register_field_array(proto_eap, hf, array_length(hf));
|
|
proto_register_subtree_array(ett, array_length(ett));
|
|
|
|
register_dissector("eap", dissect_eap, proto_eap);
|
|
}
|
|
|
|
void
|
|
proto_reg_handoff_eap(void)
|
|
{
|
|
dissector_handle_t eap_handle;
|
|
|
|
eap_handle = find_dissector("eap");
|
|
dissector_add("ppp.protocol", PPP_EAP, eap_handle);
|
|
}
|