Fixed the problem causing a SIGSEGV, and fixed problems with
[obnox/wireshark/wip.git] / packet-bpdu.c
index 789f00bbf6e1f05ade60a2298e74b9484fd895f4..8b92eb3d9fc149a4871abd368cb769acad32bd23 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-bpdu.c
  * Routines for BPDU (Spanning Tree Protocol) disassembly
  *
- * $Id: packet-bpdu.c,v 1.3 1999/10/09 13:05:55 deniel Exp $
+ * $Id: packet-bpdu.c,v 1.6 1999/11/16 11:42:27 guy Exp $
  *
  * Copyright 1999 Christophe Tronche <ch.tronche@computer.org>
  * 
 #include "resolv.h"
 #include "util.h"
 
-/*  #ifndef __PACKET_IP_H__ */
-/*  #include "packet-ip.h" */
-/*  #endif */
-
 /* Offsets of fields within a BPDU */
 
 #define BPDU_IDENTIFIER          0
@@ -77,6 +73,8 @@ 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;
       guint8  protocol_version_identifier;
@@ -124,7 +122,7 @@ void dissect_bpdu(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
            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);
+           bpdu_tree = proto_item_add_subtree(ti, ett_bpdu);
            proto_tree_add_item_format(bpdu_tree, hf_bpdu_proto_id,
                                       offset + BPDU_IDENTIFIER, 2, 
                                       protocol_identifier,
@@ -158,10 +156,8 @@ 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_item_format(bpdu_tree, hf_bpdu_flags, 
-                                      offset + BPDU_FLAGS, 1, 
-                                      flags,
-                                      "Flags: 0x%02x", flags);
+           proto_tree_add_item(bpdu_tree, hf_bpdu_flags, 
+                               offset + BPDU_FLAGS, 1, flags);
            if (flags & 0x80)
                  proto_tree_add_text(bpdu_tree, offset + BPDU_FLAGS, 1, "   1... ....  Topology Change Acknowledgment");
            if (flags & 0x01)
@@ -186,11 +182,9 @@ void dissect_bpdu(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
            proto_tree_add_item_hidden(bpdu_tree, hf_bpdu_bridge_mac,
                                       offset + BPDU_BRIDGE_IDENTIFIER + 2, 6,
                                       bpdu + BPDU_BRIDGE_IDENTIFIER + 2);
-           proto_tree_add_item_format(bpdu_tree, hf_bpdu_port_id,
-                                      offset + BPDU_PORT_IDENTIFIER, 2, 
-                                      port_identifier,
-                                      "Port identifier: 0x%04x", 
-                                      port_identifier);
+           proto_tree_add_item(bpdu_tree, hf_bpdu_port_id,
+                               offset + BPDU_PORT_IDENTIFIER, 2, 
+                               port_identifier);
            proto_tree_add_item(bpdu_tree, hf_bpdu_msg_age,
                                offset + BPDU_MESSAGE_AGE, 2, 
                                message_age);
@@ -212,32 +206,59 @@ proto_register_bpdu(void)
 
   static hf_register_info hf[] = {
     { &hf_bpdu_proto_id,
-      { "Protocol Identifier", "stp.protocol",         FT_UINT16,  NULL }},
+      { "Protocol Identifier",         "stp.protocol",
+       FT_UINT16,      BASE_HEX,       NULL,   0x0,
+       "" }},
     { &hf_bpdu_version_id,
-      { "Protocol Version Identifier", "stp.version",  FT_UINT8,   NULL }},
+      { "Protocol Version Identifier", "stp.version",
+       FT_UINT8,       BASE_DEC,       NULL,   0x0,
+       "" }},
     { &hf_bpdu_type,
-      { "BPDU type",           "stp.type",             FT_UINT8,   NULL }},
+      { "BPDU type",                   "stp.type",
+       FT_UINT8,       BASE_HEX,       NULL,   0x0,
+       "" }},
     { &hf_bpdu_flags,
-      { "BPDU flags",          "stp.flags",            FT_UINT8,   NULL }},
+      { "BPDU flags",                  "stp.flags",
+       FT_UINT8,       BASE_HEX,       NULL,   0x0,
+       "" }},
     { &hf_bpdu_root_mac,
-      { "Root Identifier",     "stp.root.hw",          FT_ETHER,   NULL }},
+      { "Root Identifier",             "stp.root.hw",
+       FT_ETHER,       BASE_NONE,      NULL,   0x0,
+       "" }},
     { &hf_bpdu_root_cost,
-      { "Root Path Cost",      "stp.root.cost",        FT_UINT32,  NULL }},
+      { "Root Path Cost",              "stp.root.cost",
+       FT_UINT32,      BASE_DEC,       NULL,   0x0,
+       "" }},
     { &hf_bpdu_bridge_mac,
-      { "Bridge Identifier",    "stp.bridge.hw",       FT_ETHER,   NULL }},
+      { "Bridge Identifier",           "stp.bridge.hw",
+       FT_ETHER,       BASE_NONE,      NULL,   0x0,
+       ""}},
     { &hf_bpdu_port_id,
-      { "Port identifier",      "stp.port",            FT_UINT16,  NULL }},
+      { "Port identifier",             "stp.port",
+       FT_UINT16,      BASE_HEX,       NULL,   0x0,
+       ""}},
     { &hf_bpdu_msg_age,
-      { "Message Age",         "stp.msg_age",          FT_DOUBLE,  NULL }},
+      { "Message Age",                 "stp.msg_age",
+       FT_DOUBLE,      BASE_NONE,      NULL,   0x0,
+       "" }},
     { &hf_bpdu_max_age,
-      { "Max Age",             "stp.max_age",          FT_DOUBLE,  NULL }},
+      { "Max Age",                     "stp.max_age",
+       FT_DOUBLE,      BASE_NONE,      NULL,   0x0,
+       "" }},
     { &hf_bpdu_hello_time,
-      { "Hello Time",          "stp.hello",            FT_DOUBLE,  NULL }},
+      { "Hello Time",                  "stp.hello",
+       FT_DOUBLE,      BASE_NONE,      NULL,   0x0,
+       "" }},
     { &hf_bpdu_forward_delay,
-      { "Forward Delay",               "stp.forward",          FT_DOUBLE,  NULL }}
+      { "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));
 }