List of changes for this next release, which I'll probably call 0.9.0.
[obnox/wireshark/wip.git] / packet-bpdu.c
index 4e863953ee8df11c2bd30194101dcd96619aac58..c7c75ef6814f25b547d256cfe6eb7d70133d078f 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-bpdu.c
  * Routines for BPDU (Spanning Tree Protocol) disassembly
  *
- * $Id: packet-bpdu.c,v 1.2 1999/10/08 21:20:23 guy Exp $
+ * $Id: packet-bpdu.c,v 1.13 2000/08/13 14:08:04 deniel Exp $
  *
  * Copyright 1999 Christophe Tronche <ch.tronche@computer.org>
  * 
 #include <string.h>
 #include <glib.h>
 #include "packet.h"
+#include "llcsaps.h"
 #include "resolv.h"
-#include "util.h"
-
-/*  #ifndef __PACKET_IP_H__ */
-/*  #include "packet-ip.h" */
-/*  #endif */
 
 /* Offsets of fields within a BPDU */
 
 #define BPDU_FORWARD_DELAY      33
 
 static int proto_bpdu = -1;
+static int hf_bpdu_proto_id = -1;
+static int hf_bpdu_version_id = -1;
+static int hf_bpdu_type = -1;
+static int hf_bpdu_flags = -1;
+static int hf_bpdu_root_mac = -1;
+static int hf_bpdu_root_cost = -1;
+static int hf_bpdu_bridge_mac = -1;
+static int hf_bpdu_port_id = -1;
+static int hf_bpdu_msg_age = -1;
+static int hf_bpdu_max_age = -1;
+static int hf_bpdu_hello_time = -1;
+static int hf_bpdu_forward_delay = -1;
+
+static gint ett_bpdu = -1;
 
 void dissect_bpdu(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
       guint16 protocol_identifier;
@@ -85,6 +95,8 @@ void dissect_bpdu(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
       proto_item *ti;
       const u_char *bpdu;
 
+      OLD_CHECK_DISPLAY_AS_DATA(proto_bpdu, pd, offset, fd, tree);
+
       bpdu = pd + offset;
       bpdu_type = (guint8) bpdu[BPDU_TYPE];
       flags = (guint8) bpdu[BPDU_FLAGS];
@@ -111,21 +123,34 @@ void dissect_bpdu(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
            protocol_identifier = pntohs(bpdu + BPDU_IDENTIFIER);
            protocol_version_identifier = (guint8) bpdu[BPDU_VERSION_IDENTIFIER];
 
-           ti = proto_tree_add_item_format(tree, proto_bpdu, offset, 35, NULL, "Spanning Tree Protocol");
-           bpdu_tree = proto_item_add_subtree(ti, ETT_BPDU);
-           proto_tree_add_text(bpdu_tree, offset + BPDU_IDENTIFIER, 2, "Protocol Identifier: 0x%04x (%s)", 
-                               protocol_identifier,
-                               protocol_identifier == 0 ? "Spanning Tree" : "Unknown Protocol");
+           ti = proto_tree_add_protocol_format(tree, proto_bpdu, NullTVB, offset, 35,
+                               "Spanning Tree Protocol");
+           bpdu_tree = proto_item_add_subtree(ti, ett_bpdu);
+           proto_tree_add_uint_format(bpdu_tree, hf_bpdu_proto_id, NullTVB,
+                                      offset + BPDU_IDENTIFIER, 2, 
+                                      protocol_identifier,
+                                      "Protocol Identifier: 0x%04x (%s)", 
+                                      protocol_identifier,
+                                      protocol_identifier == 0 ? 
+                                      "Spanning Tree" : "Unknown Protocol");
 
-           proto_tree_add_text(bpdu_tree, offset + BPDU_VERSION_IDENTIFIER, 1, "Protocol Version Identifier: %d", protocol_version_identifier);
+           proto_tree_add_uint(bpdu_tree, hf_bpdu_version_id, NullTVB, 
+                               offset + BPDU_VERSION_IDENTIFIER, 1, 
+                               protocol_version_identifier);
            if (protocol_version_identifier != 0)
-                 proto_tree_add_text(bpdu_tree, offset + BPDU_VERSION_IDENTIFIER, 1, "   (Warning: this version of packet-bpdu only knows about version = 0)");
-           proto_tree_add_text(bpdu_tree, offset + BPDU_TYPE, 1, "BPDU Type: 0x%02x (%s)", 
-                               bpdu_type,
-                               bpdu_type == 0 ? "Configuration" :
-                               bpdu_type == 0x80 ? "Topology Change Notification" : "Unknown");
+                 proto_tree_add_text(bpdu_tree, NullTVB, offset + BPDU_VERSION_IDENTIFIER, 1, "   (Warning: this version of packet-bpdu only knows about version = 0)");
+           proto_tree_add_uint_format(bpdu_tree, hf_bpdu_type, NullTVB,
+                                      offset + BPDU_TYPE, 1, 
+                                      bpdu_type,
+                                      "BPDU Type: 0x%02x (%s)", 
+                                      bpdu_type,
+                                      bpdu_type == 0 ? "Configuration" :
+                                      bpdu_type == 0x80 ? "Topology Change Notification" : "Unknown");
 
-           if (bpdu_type != 0) return;
+           if (bpdu_type != 0) {
+             old_dissect_data(pd, offset + BPDU_TYPE + 1, fd, tree);
+             return;
+           }
 
            bridge_identifier_bridge_priority = pntohs(bpdu + BPDU_BRIDGE_IDENTIFIER);
            bridge_identifier_mac = ether_to_str(bpdu + BPDU_BRIDGE_IDENTIFIER + 2);
@@ -134,27 +159,115 @@ void dissect_bpdu(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
            hello_time = pntohs(bpdu + BPDU_HELLO_TIME) / 256.0;
            forward_delay = pntohs(bpdu + BPDU_FORWARD_DELAY) / 256.0;
 
-           proto_tree_add_text(bpdu_tree, offset + BPDU_FLAGS, 1, "Flags: 0x%02x", flags);
+           proto_tree_add_uint(bpdu_tree, hf_bpdu_flags, NullTVB, 
+                               offset + BPDU_FLAGS, 1, flags);
            if (flags & 0x80)
-                 proto_tree_add_text(bpdu_tree, offset + BPDU_FLAGS, 1, "   1... ....  Topology Change Acknowledgment");
+                 proto_tree_add_text(bpdu_tree, NullTVB, offset + BPDU_FLAGS, 1, "   1... ....  Topology Change Acknowledgment");
            if (flags & 0x01)
-                 proto_tree_add_text(bpdu_tree, offset + BPDU_FLAGS, 1, "   .... ...1  Topology Change");
+                 proto_tree_add_text(bpdu_tree, NullTVB, offset + BPDU_FLAGS, 1, "   .... ...1  Topology Change");
 
-           proto_tree_add_text(bpdu_tree, offset + BPDU_ROOT_IDENTIFIER, 8, "Root Identifier: %d / %s", root_identifier_bridge_priority, root_identifier_mac);
-           proto_tree_add_text(bpdu_tree, offset + BPDU_ROOT_PATH_COST, 4, "Root Path Cost: %d", root_path_cost);
-           proto_tree_add_text(bpdu_tree, offset + BPDU_BRIDGE_IDENTIFIER, 8, "Bridge Identifier: %d / %s", 
+           proto_tree_add_ether_hidden(bpdu_tree, hf_bpdu_root_mac, NullTVB,
+                                      offset + BPDU_ROOT_IDENTIFIER + 2, 6,
+                                      bpdu + BPDU_ROOT_IDENTIFIER + 2);
+           proto_tree_add_text(bpdu_tree, NullTVB, 
+                               offset + BPDU_ROOT_IDENTIFIER, 8, 
+                               "Root Identifier: %d / %s", 
+                               root_identifier_bridge_priority, 
+                               root_identifier_mac);
+           proto_tree_add_uint(bpdu_tree, hf_bpdu_root_cost, NullTVB, 
+                               offset + BPDU_ROOT_PATH_COST, 4, 
+                               root_path_cost);
+           proto_tree_add_text(bpdu_tree, NullTVB, 
+                               offset + BPDU_BRIDGE_IDENTIFIER, 8, 
+                               "Bridge Identifier: %d / %s", 
                                bridge_identifier_bridge_priority, 
                                bridge_identifier_mac);
-           proto_tree_add_text(bpdu_tree, offset + BPDU_PORT_IDENTIFIER, 2, "Port identifier: 0x%04x", port_identifier);
-           proto_tree_add_text(bpdu_tree, offset + BPDU_MESSAGE_AGE, 2, "Message Age: %f", message_age);
-           proto_tree_add_text(bpdu_tree, offset + BPDU_MAX_AGE, 2, "Max Age: %f", max_age);
-           proto_tree_add_text(bpdu_tree, offset + BPDU_HELLO_TIME, 2, "Hello Time: %f", hello_time);
-           proto_tree_add_text(bpdu_tree, offset + BPDU_FORWARD_DELAY, 2, "Forward Delay: %f", forward_delay);
+           proto_tree_add_ether_hidden(bpdu_tree, hf_bpdu_bridge_mac, NullTVB,
+                                      offset + BPDU_BRIDGE_IDENTIFIER + 2, 6,
+                                      bpdu + BPDU_BRIDGE_IDENTIFIER + 2);
+           proto_tree_add_uint(bpdu_tree, hf_bpdu_port_id, NullTVB,
+                               offset + BPDU_PORT_IDENTIFIER, 2, 
+                               port_identifier);
+           proto_tree_add_double(bpdu_tree, hf_bpdu_msg_age, NullTVB,
+                               offset + BPDU_MESSAGE_AGE, 2, 
+                               message_age);
+           proto_tree_add_double(bpdu_tree, hf_bpdu_max_age, NullTVB,
+                               offset + BPDU_MAX_AGE, 2, 
+                               max_age);
+           proto_tree_add_double(bpdu_tree, hf_bpdu_hello_time, NullTVB,
+                               offset + BPDU_HELLO_TIME, 2, 
+                               hello_time);
+           proto_tree_add_double(bpdu_tree, hf_bpdu_forward_delay, NullTVB,
+                               offset + BPDU_FORWARD_DELAY, 2, 
+                               forward_delay);
       }
 }
 
 void
 proto_register_bpdu(void)
 {
-        proto_bpdu = proto_register_protocol("Spanning Tree Protocol", "stp");
+
+  static hf_register_info hf[] = {
+    { &hf_bpdu_proto_id,
+      { "Protocol Identifier",         "stp.protocol",
+       FT_UINT16,      BASE_HEX,       NULL,   0x0,
+       "" }},
+    { &hf_bpdu_version_id,
+      { "Protocol Version Identifier", "stp.version",
+       FT_UINT8,       BASE_DEC,       NULL,   0x0,
+       "" }},
+    { &hf_bpdu_type,
+      { "BPDU type",                   "stp.type",
+       FT_UINT8,       BASE_HEX,       NULL,   0x0,
+       "" }},
+    { &hf_bpdu_flags,
+      { "BPDU flags",                  "stp.flags",
+       FT_UINT8,       BASE_HEX,       NULL,   0x0,
+       "" }},
+    { &hf_bpdu_root_mac,
+      { "Root Identifier",             "stp.root.hw",
+       FT_ETHER,       BASE_NONE,      NULL,   0x0,
+       "" }},
+    { &hf_bpdu_root_cost,
+      { "Root Path Cost",              "stp.root.cost",
+       FT_UINT32,      BASE_DEC,       NULL,   0x0,
+       "" }},
+    { &hf_bpdu_bridge_mac,
+      { "Bridge Identifier",           "stp.bridge.hw",
+       FT_ETHER,       BASE_NONE,      NULL,   0x0,
+       ""}},
+    { &hf_bpdu_port_id,
+      { "Port identifier",             "stp.port",
+       FT_UINT16,      BASE_HEX,       NULL,   0x0,
+       ""}},
+    { &hf_bpdu_msg_age,
+      { "Message Age",                 "stp.msg_age",
+       FT_DOUBLE,      BASE_NONE,      NULL,   0x0,
+       "" }},
+    { &hf_bpdu_max_age,
+      { "Max Age",                     "stp.max_age",
+       FT_DOUBLE,      BASE_NONE,      NULL,   0x0,
+       "" }},
+    { &hf_bpdu_hello_time,
+      { "Hello Time",                  "stp.hello",
+       FT_DOUBLE,      BASE_NONE,      NULL,   0x0,
+       "" }},
+    { &hf_bpdu_forward_delay,
+      { "Forward Delay",               "stp.forward",
+       FT_DOUBLE,      BASE_NONE,      NULL,   0x0,
+       "" }},
+  };
+  static gint *ett[] = {
+    &ett_bpdu,
+  };
+
+  proto_bpdu = proto_register_protocol("Spanning Tree Protocol", "stp");
+  proto_register_field_array(proto_bpdu, hf, array_length(hf));
+  proto_register_subtree_array(ett, array_length(ett));
+}
+
+void
+proto_reg_handoff_bpdu(void)
+{
+  old_dissector_add("llc.dsap", SAP_BPDU, dissect_bpdu);
 }