Ethereal-dev: [Ethereal-dev] More MSTP extensions

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Clive A Stubbings <eth@xxxxxxxxxxxxxxxx>
Date: Tue, 24 Sep 2002 23:13:27 +0100
Ok, here is the rest of the MSTP (802.1s) support..
This adds decoding of the MST instance records too..

The diff is against the current CVS tree..

Cheers
Clive

--- packet-bpdu.orig.c	Tue Sep 24 23:04:14 2002
+++ packet-bpdu.c	Tue Sep 24 23:06:52 2002
@@ -59,10 +59,19 @@
 #define BPDU_CIST_INTERNAL_ROOT_PATH_COST 89
 #define BPDU_CIST_BRIDGE_IDENTIFIER 93
 #define BPDU_CIST_REMAINING_HOPS	101
+#define BPDU_MSTI			102
+#define MSTI_FLAGS			0
+#define MSTI_REGIONAL_ROOT		1
+#define MSTI_INTERNAL_ROOT_PATH_COST 	9
+#define MSTI_BRIDGE_IDENTIFIER_PRIORITY	13
+#define MSTI_PORT_IDENTIFIER_PRIORITY	14
+#define MSTI_REMAINING_HOPS		15
 
 #define CONF_BPDU_SIZE		35
 #define TC_BPDU_SIZE		4
 #define RST_BPDU_SIZE		36
+#define VERSION_3_STATIC_LENGTH 64
+#define	MSTI_MESSAGE_SIZE	16
 
 /* Flag bits */
 
@@ -104,10 +113,17 @@
 static int hf_bpdu_cist_internal_root_path_cost = -1;
 static int hf_bpdu_cist_bridge_identifier_mac = -1;
 static int hf_bpdu_cist_remaining_hops = -1;
+static int hf_bpdu_msti_flags = -1;
+static int hf_bpdu_msti_regional_root_mac = -1;
+static int hf_bpdu_msti_internal_root_path_cost = -1;
+static int hf_bpdu_msti_bridge_identifier_priority = -1;
+static int hf_bpdu_msti_port_identifier_priority = -1;
+static int hf_bpdu_msti_remaining_hops = -1;
 
 static gint ett_bpdu = -1;
 static gint ett_bpdu_flags = -1;
 static gint ett_mstp = -1;
+static gint ett_msti = -1;
 
 static dissector_handle_t gvrp_handle;
 static dissector_handle_t gmrp_handle;
@@ -183,12 +199,18 @@
       gchar   *cist_bridge_identifier_mac_str;
       const guint8 *mst_config_name;
       guint16 mst_config_revision_level;
-      guint8 cist_remaining_hops;
+      guint8 cist_remaining_hops, msti_remaining_hops;
+      guint32 msti_internal_root_path_cost;
+      guint32 msti_regional_root_mstid, msti_regional_root_priority;
+      const guint8  *msti_regional_root_mac;
+      gchar   *msti_regional_root_mac_str;
+      guint8 msti_bridge_identifier_priority, msti_port_identifier_priority;
+      int	length, offset, msti;
 
       proto_tree *bpdu_tree;
-      proto_tree *mstp_tree;
+      proto_tree *mstp_tree, *msti_tree;
       proto_item *bpdu_item;
-      proto_item *mstp_item;
+      proto_item *mstp_item, *msti_item;
       proto_tree *flags_tree;
       proto_item *flags_item;
       guint8	rstp_bpdu, mstp_bpdu=0;
@@ -489,8 +511,77 @@
 		proto_tree_add_uint(mstp_tree, hf_bpdu_cist_remaining_hops, tvb,
 			BPDU_CIST_REMAINING_HOPS, 1, cist_remaining_hops);
 
-	/* TODO: MSTI messages */
-
+	/* MSTI messages */
+		length = version_3_length - VERSION_3_STATIC_LENGTH;
+		offset = BPDU_MSTI;
+		msti = 1;
+		while (length >= MSTI_MESSAGE_SIZE) {
+		    msti_regional_root_mstid = tvb_get_guint8(tvb,  offset+ MSTI_REGIONAL_ROOT);
+		    msti_regional_root_priority = (msti_regional_root_mstid &0xf0) << 8;
+		    msti_regional_root_mstid = ((msti_regional_root_mstid & 0x0f) << 8) +
+				tvb_get_guint8(tvb,  offset+ MSTI_REGIONAL_ROOT+1);;
+		    msti_regional_root_mac = tvb_get_ptr(tvb, offset+ MSTI_REGIONAL_ROOT + 2, 6);
+		    msti_regional_root_mac_str = ether_to_str(msti_regional_root_mac);
+
+		    msti_item = proto_tree_add_text(mstp_tree, tvb, offset, 16,
+			"MSTID %d, Regional Root Identifier %d / %s",
+			msti_regional_root_mstid, msti_regional_root_priority,
+			msti_regional_root_mac_str);
+		    msti_tree = proto_item_add_subtree(msti_item, ett_msti);
+
+		    /* flags */
+		    flags_item = proto_tree_add_uint(msti_tree, hf_bpdu_msti_flags, tvb,
+			offset+MSTI_FLAGS, 1, flags);
+
+		    sep = initial_sep;
+		    APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_TCACK, flags_item, "%sMaster");
+		    APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_AGREEMENT, flags_item, "%sAgreement");
+		    APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_FORWARDING, flags_item, "%sForwarding");
+		    APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_LEARNING, flags_item, "%sLearning");
+		    if (flags_item) {
+			guint8 port_role;
+			port_role = (flags & BPDU_FLAGS_PORT_ROLE_MASK) >> BPDU_FLAGS_PORT_ROLE_SHIFT;
+			proto_item_append_text(flags_item, "%sPort Role: %s", sep,
+				       val_to_str(port_role, role_vals, "Unknown (%u)"));
+		    }
+		    sep = cont_sep;
+		    APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_PROPOSAL, flags_item, "%sProposal");
+		    APPEND_BOOLEAN_FLAG(flags & BPDU_FLAGS_TC, flags_item, "%sTopology Change");
+		    if (sep != initial_sep) { 	      /* We put something in; put in the terminating ")" */
+			proto_item_append_text(flags_item, ")");
+		    }
+
+		    /* pri, MSTID, Regional root */
+		    proto_tree_add_ether_hidden(msti_tree, hf_bpdu_msti_regional_root_mac, tvb,
+				       offset + MSTI_REGIONAL_ROOT + 2, 6,
+				       msti_regional_root_mac);
+		    proto_tree_add_text(msti_tree, tvb, offset + MSTI_REGIONAL_ROOT, 8,
+				"MSTID %d, priority %d Root Identifier %s",
+				msti_regional_root_mstid, msti_regional_root_priority,
+				msti_regional_root_mac_str);
+
+
+		    msti_internal_root_path_cost = tvb_get_ntohs(tvb, offset+MSTI_INTERNAL_ROOT_PATH_COST);
+		    proto_tree_add_uint(msti_tree, hf_bpdu_msti_internal_root_path_cost, tvb,
+			offset+MSTI_INTERNAL_ROOT_PATH_COST, 4, msti_internal_root_path_cost);
+
+		    msti_bridge_identifier_priority = tvb_get_guint8(tvb, offset+MSTI_BRIDGE_IDENTIFIER_PRIORITY) >> 4;
+		    msti_port_identifier_priority = tvb_get_guint8(tvb, offset+MSTI_PORT_IDENTIFIER_PRIORITY) >> 4;
+
+		    proto_tree_add_uint(msti_tree, hf_bpdu_msti_bridge_identifier_priority, tvb,
+			offset+MSTI_BRIDGE_IDENTIFIER_PRIORITY, 1, msti_bridge_identifier_priority);
+		    proto_tree_add_uint(msti_tree, hf_bpdu_msti_port_identifier_priority, tvb,
+			offset+MSTI_PORT_IDENTIFIER_PRIORITY, 1, msti_port_identifier_priority);
+		    
+		    msti_remaining_hops = tvb_get_guint8(tvb, offset+MSTI_REMAINING_HOPS);
+		    proto_tree_add_uint(msti_tree, hf_bpdu_msti_remaining_hops, tvb,
+			offset + MSTI_REMAINING_HOPS, 1, msti_remaining_hops);
+
+		    length -= MSTI_MESSAGE_SIZE;
+		    offset += MSTI_MESSAGE_SIZE;
+		    msti++;
+		}
+		
 	    }
       }
 }
@@ -586,7 +677,7 @@
 	FT_UINT8,	BASE_DEC,	NULL,	0x0,
       	"", HFILL }},
     { &hf_bpdu_version_3_length,
-      { "Version 3 Length",		"mstp.version_3_length",
+      { "MST Extension, Length",		"mstp.version_3_length",
 	FT_UINT16,	BASE_DEC,	NULL,	0x0,
       	"", HFILL }},
     { &hf_bpdu_mst_config_format_selector,
@@ -617,11 +708,37 @@
       { "CIST Remaining hops",		"mstp.cist_remaining_hops",
 	FT_UINT8,	BASE_DEC,	NULL,	0x0,
       	"", HFILL }},
+    { &hf_bpdu_msti_flags,
+      { "MSTI flags",			"mstp.msti.flags",
+	FT_UINT8,	BASE_HEX,	NULL,	0x0,
+      	"", HFILL }},
+    { &hf_bpdu_msti_regional_root_mac,
+      { "Regional Root",		"mstp.msti.root.hw",
+	FT_ETHER,	BASE_DEC,	NULL,	0x0,
+      	"", HFILL }},
+    { &hf_bpdu_msti_internal_root_path_cost,
+      { "Internal root path cost",		"mstp.msti.root_cost",
+	FT_UINT32,	BASE_DEC,	NULL,	0x0,
+      	"", HFILL }},
+    { &hf_bpdu_msti_bridge_identifier_priority,
+      { "Bridge Identifier Priority",		"mstp.msti.bridge_priority",
+	FT_UINT8,	BASE_DEC,	NULL,	0x0,
+      	"", HFILL }},
+    { &hf_bpdu_msti_port_identifier_priority,
+      { "Port identifier prority",		"mstp.msti.port_priority",
+	FT_UINT8,	BASE_DEC,	NULL,	0x0,
+      	"", HFILL }},
+    { &hf_bpdu_msti_remaining_hops,
+      { "Remaining hops",		"mstp.msti.remaining_hops",
+	FT_UINT8,	BASE_DEC,	NULL,	0x0,
+      	"", HFILL }},
+
   };
   static gint *ett[] = {
     &ett_bpdu,
     &ett_bpdu_flags,
     &ett_mstp,
+    &ett_msti
   };
 
   proto_bpdu = proto_register_protocol("Spanning Tree Protocol", "STP", "stp");