The first field of a MAC Control frame isn't the "pause" field, it's the
authorGuy Harris <guy@alum.mit.edu>
Sat, 31 Oct 2009 19:44:17 +0000 (19:44 -0000)
committerGuy Harris <guy@alum.mit.edu>
Sat, 31 Oct 2009 19:44:17 +0000 (19:44 -0000)
opcode; an opcode of 0x0001 means PAUSE.  Dissect the opcode field even
if it's not a PAUSE frame.

The second field of a PAUSE frame isn't the "quanta" field, it's the
pause_time field; it's in *units* of quanta.

Don't fetch fields until we need them (so we don't throw an exception if
they're missing until we actually look at them).

Clean up indentation.

svn path=/trunk/; revision=30785

epan/dissectors/packet-maccontrol.c

index bef490f9dcea69e15d35bf065183aa5ae1f937f7..2b52efadc3e68ac4f79f088386cf470da1177f28 100644 (file)
 static int proto_macctrl = -1;
 
 static gint ett_macctrl = -1;
-static int hf_macctrl_pause = -1;
-static int hf_macctrl_quanta = -1;
+static int hf_macctrl_opcode = -1;
+static int hf_macctrl_pause_time = -1;
 
+#define MACCTRL_PAUSE  0x0001
+
+static const value_string opcode_vals[] = {
+  { MACCTRL_PAUSE, "Pause" },
+  { 0, NULL }
+};
 
 static void
 dissect_macctrl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
   proto_tree *ti;
-  proto_tree *volatile macctrl_tree;
-       guint16 pause;
-       guint16 pause_quanta;
-
-       pause = tvb_get_ntohs(tvb, 0);
-       pause_quanta = tvb_get_ntohs(tvb, 2);
+  proto_tree *macctrl_tree = NULL;
+  guint16 opcode;
+  guint16 pause_time;
 
   col_set_str(pinfo->cinfo, COL_PROTOCOL, "CTRL");
   col_clear(pinfo->cinfo, COL_INFO);
 
-  if (pause==1){
-    if (check_col(pinfo->cinfo, COL_INFO)) {
-      col_add_fstr(pinfo->cinfo, COL_INFO, "MAC PAUSE: Quanta %d", pause_quanta);
-    }
-  } 
-
-  macctrl_tree = NULL;
-
+  opcode = tvb_get_ntohs(tvb, 0);
   if (tree) {
-               ti = proto_tree_add_item(tree, proto_macctrl, tvb, 0, 4, FALSE);
-               macctrl_tree = proto_item_add_subtree(ti, ett_macctrl);
+    ti = proto_tree_add_item(tree, proto_macctrl, tvb, 0, 4, FALSE);
+    macctrl_tree = proto_item_add_subtree(ti, ett_macctrl);
                
-               proto_tree_add_uint(macctrl_tree, hf_macctrl_pause, tvb, 0, 2, pause);
-    proto_tree_add_uint(macctrl_tree, hf_macctrl_quanta, tvb, 2, 2, pause_quanta);
-       }
-
+    proto_tree_add_uint(macctrl_tree, hf_macctrl_opcode, tvb, 0, 2, opcode);
+  }
+
+  switch (opcode) {
+
+  case MACCTRL_PAUSE:
+    pause_time = tvb_get_ntohs(tvb, 2);
+    col_add_fstr(pinfo->cinfo, COL_INFO, "MAC PAUSE: pause_time %u quanta",
+                 pause_time);
+    if (tree)
+      proto_tree_add_uint(macctrl_tree, hf_macctrl_pause_time, tvb, 2, 2,
+                          pause_time);
+    break;
+  } 
 }
 
-
 void
 proto_register_macctrl(void)
 {
-       static hf_register_info hf[] = {
-        { &hf_macctrl_pause, 
-        {  "Pause", "macctrl.pause", FT_UINT16, BASE_HEX,
-           NULL, 0x0, "MAC control Pause", HFILL}},
-
-        { &hf_macctrl_quanta,
-        { "Quanta", "macctrl.quanta", FT_UINT16, BASE_DEC,
-          NULL, 0x0, "MAC control quanta", HFILL }}
-       };
+  static hf_register_info hf[] = {
+    { &hf_macctrl_opcode, 
+      { "Opcode", "macctrl.opcode", FT_UINT16, BASE_HEX,
+        VALS(opcode_vals), 0x0, "MAC Control opcode", HFILL}},
+
+    { &hf_macctrl_pause_time,
+      { "pause_time", "macctrl.pause_time", FT_UINT16, BASE_DEC,
+        NULL, 0x0, "MAC control PAUSE frame pause_time", HFILL }}
+  };
 
   static gint *ett[] = {
         &ett_macctrl,
   };
   proto_macctrl = proto_register_protocol("MAC Control", "MACC", "macc");
-       proto_register_field_array(proto_macctrl, hf, array_length(hf));
+  proto_register_field_array(proto_macctrl, hf, array_length(hf));
   proto_register_subtree_array(ett, array_length(ett));
 }