Ethereal-dev: [Ethereal-dev] L2TP AVP decoding correction

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, 14 Oct 2001 02:12:11 +0900 (JST)
Hi,

Current packet-l2tp.c doesn't take the Vendor-Specific Attribute into
consideration. Attribute Type is only meaningful in a given Vendor ID
context. For example, Attribute Type 7 is a "Host Name" AVP in IETF
(i.e. Vendor ID = 0) context , but Attribute Type 7 can be something
totally different in other Vendor-Specific context.

Here's a patch to packet-l2tp.c so that

 1) it decodes all currently-supported Attribute Types only if it's
    under IETF context.

 2) If the attribute is Vendor-Specific, print the Vendor Name (if
    possible) and simply indicate that it's a Vendor-Specific
    attribute (no further decoding for the time being).

Regards,

=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=
 +----+----+     
 |.. .|    |     Motonori Shindo
 |_~__|    |     
 | .. |~~_~|     Sr. Systems Engineer
 | .  |    |     CoSine Communications Inc.
 +----+----+     
 C o S i n e     e-mail:  mshindo@xxxxxxxxxxxxx 
Communications
=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=




Index: packet-l2tp.c
===================================================================
RCS file: /cvsroot/ethereal/packet-l2tp.c,v
retrieving revision 1.24
diff -u -r1.24 packet-l2tp.c
--- packet-l2tp.c	2001/06/18 02:17:48	1.24
+++ packet-l2tp.c	2001/10/13 17:16:50
@@ -261,6 +261,39 @@
   { 0,                         NULL }
 };
 
+/*
+ * These are SMI Network Management Private Enterprise Codes for
+ * organizations; see
+ *
+ *      http://www.isi.edu/in-notes/iana/assignments/enterprise-numbers
+ *
+ * for a list.
+ */
+#define VENDOR_IETF 0
+#define VENDOR_ACC 5
+#define VENDOR_CISCO 9
+#define VENDOR_SHIVA 166
+#define VENDOR_LIVINGSTON 307
+#define VENDOR_3COM 429
+#define VENDOR_ASCEND 529
+#define VENDOR_BAY 1584
+#define VENDOR_JUNIPER 2636
+#define VENDOR_COSINE 3085
+#define VENDOR_UNISPHERE 4874
+
+static const value_string avp_vendor_id_vals[] = 
+{{VENDOR_IETF,"IETF"},
+{VENDOR_ACC,"ACC"},
+{VENDOR_CISCO,"Cisco"},
+{VENDOR_SHIVA,"Shiva"},
+{VENDOR_LIVINGSTON,"Livingston"},
+{VENDOR_3COM,"3Com"},
+{VENDOR_ASCEND,"Ascend"},
+{VENDOR_BAY,"Bay Networks"},
+{VENDOR_JUNIPER,"Juniper Networks"},
+{VENDOR_COSINE,"CoSine Communications"},
+{VENDOR_UNISPHERE,"Unisphere Networks"},
+{0,NULL}};
 
 static gchar textbuffer[200];
 
@@ -280,6 +313,7 @@
   guint16 cid;			/* Call ID */
   guint16 offset_size;		/* Offset size */
   guint16 ver_len_hidden;
+  guint16 avp_vendor_id;
   guint16 avp_type;
   guint16 msg_type;
   guint16 avp_len;
@@ -446,11 +480,19 @@
 	while (index < length ) {    /* Process AVP's */
    		ver_len_hidden	= tvb_get_ntohs(tvb, index);
    		avp_len		= AVP_LENGTH(ver_len_hidden);
+		avp_vendor_id	= tvb_get_ntohs(tvb, index + 2);
    		avp_type	= tvb_get_ntohs(tvb, index + 4);
 
-		tf =  proto_tree_add_text(l2tp_tree, tvb, index, avp_len,
-		    "%s AVP",
-		    val_to_str(avp_type, avp_type_vals, "Unknown (%u)"));
+		if (avp_vendor_id == VENDOR_IETF) {
+			tf =  proto_tree_add_text(l2tp_tree, tvb, index, 
+			avp_len, "%s AVP",
+		        val_to_str(avp_type, avp_type_vals, "Unknown (%u)"));
+		} else {	 /* Vendor-Specific AVP */
+			tf =  proto_tree_add_text(l2tp_tree, tvb, index, 
+			avp_len, "Vendor %s AVP",
+		        val_to_str(avp_vendor_id, avp_vendor_id_vals, "Unknown (%u)"));
+		}
+
                 l2tp_avp_tree = proto_item_add_subtree(tf,  ett_l2tp_avp);
 
                 proto_tree_add_boolean_format(l2tp_avp_tree,hf_l2tp_avp_mandatory, tvb, index, 1,
@@ -479,6 +521,21 @@
 		index += 2;
 		avp_len -= 2;
 
+		if (avp_vendor_id != VENDOR_IETF) {
+			proto_tree_add_text(l2tp_avp_tree, tvb, index, 2,
+					    "Type: %u", avp_type);
+			index += 2;
+			avp_len -= 2;
+
+			/* For the time being, we don't decode any Vendor-
+			   specific AVP. */
+			proto_tree_add_text(l2tp_avp_tree, tvb, index, 
+					    avp_len, "Vendor-Specific AVP");
+
+			index += avp_len;
+			continue;
+		}
+
 		proto_tree_add_uint(l2tp_avp_tree, hf_l2tp_avp_type,
 		    tvb, index, 2, avp_type);
 		index += 2;
@@ -947,7 +1004,7 @@
 			"AVP Length", HFILL }},
 
 		{ &hf_l2tp_avp_vendor_id,
-		{ "Vendor ID", "lt2p.avp.vendor_id", FT_UINT16, BASE_DEC, NULL, 0,
+		{ "Vendor ID", "lt2p.avp.vendor_id", FT_UINT16, BASE_DEC, VALS(avp_vendor_id_vals), 0,
 			"AVP Vendor ID", HFILL }},
 
 		{ &hf_l2tp_avp_type,