Ethereal-dev: [Ethereal-dev] PPP CHAP support
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Motonori Shindo <mshindo@xxxxxxxxxxx>
Date: Sun, 30 Sep 2001 22:24:37 +0900 (JST)
Hi, The following patch adds a support for CHAP in PPP almost in the same manner as PAP. Thanks! =--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--= +----+----+ |.. .| | Motonori Shindo |_~__| | | .. |~~_~| Sr. Systems Engineer | . | | CoSine Communications Inc. +----+----+ C o S i n e e-mail: mshindo@xxxxxxxxxxxxx Communications =--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=
Index: packet-ppp.c
===================================================================
RCS file: /cvsroot/ethereal/packet-ppp.c,v
retrieving revision 1.70
diff -u -r1.70 packet-ppp.c
--- packet-ppp.c 2001/08/05 19:44:13 1.70
+++ packet-ppp.c 2001/09/30 13:17:22
@@ -88,6 +88,13 @@
static gint ett_pap_password = -1;
static gint ett_pap_message = -1;
+static int proto_chap = -1; /* CHAP vars */
+static gint ett_chap = -1;
+static gint ett_chap_data = -1;
+static gint ett_chap_value = -1;
+static gint ett_chap_name = -1;
+static gint ett_chap_message = -1;
+
static dissector_table_t subdissector_table;
static dissector_handle_t chdlc_handle;
@@ -563,6 +570,19 @@
static void dissect_pap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+#define CHAP_CHAL 1 /* CHAP Challenge */
+#define CHAP_RESP 2 /* CHAP Response */
+#define CHAP_SUCC 3 /* CHAP Success */
+#define CHAP_FAIL 4 /* CHAP Failure */
+
+static const value_string chap_vals[] = {
+ {CHAP_CHAL, "Challenge" },
+ {CHAP_RESP, "Response" },
+ {CHAP_SUCC, "Success" },
+ {CHAP_FAIL, "Failure" },
+ {0, NULL } };
+
+static void dissect_chap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
const unsigned int fcstab_32[256] =
{
@@ -1558,6 +1578,107 @@
}
}
+/*
+ * Handles CHAP just as a protocol field
+ */
+static void
+dissect_chap( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) {
+ proto_item *ti;
+ proto_tree *fh_tree = NULL;
+ proto_item *tf;
+ proto_tree *field_tree;
+ proto_item *tv;
+ proto_tree *value_tree;
+ proto_item *tm;
+ proto_tree *message_tree;
+
+ guint8 code, id, value_size;
+ guint16 length;
+ int offset;
+ int name_length;
+
+ code = tvb_get_guint8(tvb, 0);
+ id = tvb_get_guint8(tvb, 1);
+ length = tvb_get_ntohs(tvb, 2);
+
+ if(check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL,
+ proto_get_protocol_short_name(proto_chap));
+
+ if(check_col(pinfo->fd, COL_INFO))
+ col_add_fstr(pinfo->fd, COL_INFO, "%s %s",
+ proto_get_protocol_short_name(proto_chap),
+ val_to_str(code, chap_vals, "Unknown"));
+
+ if(tree) {
+ ti = proto_tree_add_item(tree, proto_chap, tvb, 0, length, FALSE);
+ fh_tree = proto_item_add_subtree(ti, ett_chap);
+ proto_tree_add_text(fh_tree, tvb, 0, 1, "Code: %s (0x%02x)",
+ val_to_str(code, chap_vals, "Unknown"), code);
+ proto_tree_add_text(fh_tree, tvb, 1, 1, "Identifier: 0x%02x",
+ id);
+ proto_tree_add_text(fh_tree, tvb, 2, 2, "Length: %u",
+ length);
+ }
+ offset = 4;
+ length -= 4;
+
+ switch (code) {
+ case CHAP_CHAL:
+ case CHAP_RESP:
+ if(tree) {
+ if (length > 0) {
+ tf = proto_tree_add_text(fh_tree, tvb, offset, length,
+ "Data: (%d byte%s)", length,
+ plurality(length, "", "s"));
+ field_tree = proto_item_add_subtree(tf, ett_chap_data);
+ value_size = tvb_get_guint8(tvb, offset);
+ name_length = length - value_size - 1;
+ tv = proto_tree_add_text(field_tree, tvb, offset, 1,
+ "Value Size: %d byte%s",
+ value_size, plurality(value_size, "", "s"));
+ if (--length > 0) {
+ value_tree = proto_item_add_subtree(tv, ett_chap_value);
+ proto_tree_add_text(value_tree, tvb, ++offset,
+ ppp_min(value_size, length),
+ "Value (%d byte%s)",
+ value_size, plurality(value_size, "", "s"));
+ offset+=value_size;
+ length-=value_size;
+ if (length > 0) {
+ proto_tree_add_text(field_tree, tvb, offset,
+ ppp_min(name_length, length),
+ "Name (%d byte%s)", name_length,
+ plurality(name_length, "", "s"));
+ }
+ }
+ }
+ }
+ break;
+
+ case CHAP_SUCC:
+ case CHAP_FAIL:
+ if(tree) {
+ if (length > 0) {
+ tf = proto_tree_add_text(fh_tree, tvb, offset, length,
+ "Data: (%d byte%s)", length,
+ plurality(length, "", "s"));
+ field_tree = proto_item_add_subtree(tf, ett_chap_data);
+ tv = proto_tree_add_text(field_tree, tvb, offset, length,
+ "Message: %d byte%s",
+ length, plurality(length, "", "s"));
+ }
+ }
+ break;
+ default:
+ if (length > 0)
+ proto_tree_add_text(fh_tree, tvb, offset, length, "Stuff (%d byte%s)",
+ length, plurality(length, "", "s"));
+ break;
+ }
+}
+
+
void
proto_register_ppp(void)
{
@@ -1746,4 +1867,32 @@
* registering with the "ethertype" dissector table.
*/
dissector_add("ethertype", PPP_PAP, dissect_pap, proto_pap);
+}
+
+void
+proto_register_chap(void)
+{
+ static gint *ett[] = {
+ &ett_chap,
+ &ett_chap_data,
+ &ett_chap_value,
+ &ett_chap_name,
+ &ett_chap_message,
+ };
+
+ proto_chap = proto_register_protocol("PPP Challenge Handshake Authentication Protocol", "PPP CHAP",
+ "chap");
+ proto_register_subtree_array(ett, array_length(ett));
+}
+
+void
+proto_reg_handoff_chap(void)
+{
+ dissector_add("ppp.protocol", PPP_CHAP, dissect_chap, proto_chap);
+
+ /*
+ * See above comment about NDISWAN for an explanation of why we're
+ * registering with the "ethertype" dissector table.
+ */
+ dissector_add("ethertype", PPP_CHAP, dissect_chap, proto_chap);
}
- Prev by Date: [Ethereal-dev] Vendor-ID CoSine support for RADIUS
- Next by Date: Re: [Ethereal-dev] Vendor-ID CoSine support for RADIUS
- Previous by thread: Re: [Ethereal-dev] Vendor-ID CoSine support for RADIUS
- Index(es):





