Added two new arguments to epan_init() and proto_init() to
[obnox/wireshark/wip.git] / packet-frame.c
index 01456f429c50525efe6ad17e77a8a85f9cc559cd..cd698e72800a18f51f00ff408f01d9d9e669977c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * Top-most dissector. Decides dissector based on Wiretap Encapsulation Type.
  *
- * $Id: packet-frame.c,v 1.1 2000/10/06 10:10:49 gram Exp $
+ * $Id: packet-frame.c,v 1.7 2001/04/01 21:12:05 hagbard Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 #include "tvbuff.h"
 #include "packet-frame.h"
 
-#include "packet-ascend.h"
-#include "packet-atalk.h"
-#include "packet-atm.h"
-#include "packet-clip.h"
-#include "packet-eth.h"
-#include "packet-fddi.h"
-#include "packet-ipv6.h"
-#include "packet-lapb.h"
-#include "packet-lapd.h"
-#include "packet-llc.h"
-#include "packet-null.h"
-#include "packet-ppp.h"
-#include "packet-raw.h"
-#include "packet-sna.h"
-#include "packet-tr.h"
-#include "packet-v120.h"
-#include "packet-vines.h"
-
-
 static int proto_frame = -1;
 static int hf_frame_arrival_time = -1;
 static int hf_frame_time_delta = -1;
+static int hf_frame_time_relative = -1;
 static int hf_frame_number = -1;
 static int hf_frame_packet_len = -1;
 static int hf_frame_capture_len = -1;
@@ -70,6 +52,8 @@ static const value_string p2p_dirs[] = {
        { P2P_DIR_RECV, "Received" },
        { 0, NULL }
 };
+
+static dissector_table_t wtap_encap_dissector_table;
        
 void
 dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
@@ -110,6 +94,12 @@ dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
          proto_tree_add_time(fh_tree, hf_frame_time_delta, tvb,
                0, 0, &tv);
 
+         tv.tv_sec = pinfo->fd->rel_secs;
+         tv.tv_usec = pinfo->fd->rel_usecs;
+
+         proto_tree_add_time(fh_tree, hf_frame_time_relative, tvb,
+               0, 0, &tv);
+
          proto_tree_add_uint(fh_tree, hf_frame_number, tvb,
                0, 0, pinfo->fd->num);
 
@@ -130,60 +120,25 @@ dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
 
        TRY {
-               switch (pinfo->fd->lnk_t) {
-                       case WTAP_ENCAP_ETHERNET :
-                               dissect_eth(tvb, pinfo, tree);
-                               break;
-                       case WTAP_ENCAP_FDDI :
-                               dissect_fddi(tvb, pinfo, tree, FALSE);
-                               break;
-                       case WTAP_ENCAP_FDDI_BITSWAPPED :
-                               dissect_fddi(tvb, pinfo, tree, TRUE);
-                               break;
-                       case WTAP_ENCAP_TOKEN_RING :
-                               dissect_tr(tvb, pinfo, tree);
-                               break;
-                       case WTAP_ENCAP_NULL :
-                               dissect_null(tvb, pinfo, tree);
-                               break;
-                       case WTAP_ENCAP_PPP :
-                       case WTAP_ENCAP_PPP_WITH_PHDR :
-                               dissect_ppp(tvb, pinfo, tree);
-                               break;
-                       case WTAP_ENCAP_LAPB :
-                               dissect_lapb(tvb, pinfo, tree);
-                               break;
-                       case WTAP_ENCAP_RAW_IP :
-                               dissect_raw(tvb, pinfo, tree);
-                               break;
-                       case WTAP_ENCAP_LINUX_ATM_CLIP :
-                               dissect_clip(tvb, pinfo, tree);
-                               break;
-                       case WTAP_ENCAP_ATM_SNIFFER :
-                               dissect_atm(tvb, pinfo, tree);
-                               break;
-                       case WTAP_ENCAP_ASCEND :
-                               dissect_ascend(tvb, pinfo, tree);
-                               break;
-                       case WTAP_ENCAP_LAPD :
-                               dissect_lapd(tvb, pinfo, tree);
-                               break;
-                       case WTAP_ENCAP_V120 :
-                               dissect_v120(tvb, pinfo, tree);
-                               break;
-                       case WTAP_ENCAP_ATM_RFC1483:
-                               dissect_llc(tvb, pinfo, tree);
-                               break;
-                       default:
-                               g_assert_not_reached();
-                               break;
+               if (!dissector_try_port(wtap_encap_dissector_table, pinfo->fd->lnk_t,
+                                       tvb, pinfo, tree)) {
+
+                       if (check_col(pinfo->fd, COL_PROTOCOL))
+                               col_set_str(pinfo->fd, COL_PROTOCOL, "UNKNOWN");
+                       if (check_col(pinfo->fd, COL_INFO))
+                               col_add_fstr(pinfo->fd, COL_INFO, "WTAP_ENCAP = 0x%x", pinfo->fd->lnk_t);
+                       dissect_data(tvb, 0, pinfo, tree);
                }
        }
        CATCH(BoundsError) {
+               if (check_col(pinfo->fd, COL_INFO))
+                       col_append_str(pinfo->fd, COL_INFO, "[Short Frame]");
                proto_tree_add_protocol_format(tree, proto_short, tvb, 0, 0,
                                "[Short Frame: %s]", pinfo->current_proto );
        }
        CATCH(ReportedBoundsError) {
+               if (check_col(pinfo->fd, COL_INFO))
+                       col_append_str(pinfo->fd, COL_INFO, "[Malformed Frame]");
                proto_tree_add_protocol_format(tree, proto_malformed, tvb, 0, 0,
                                "[Malformed Frame: %s]", pinfo->current_proto );
        }
@@ -203,6 +158,11 @@ proto_register_frame(void)
                        0x0,
                        "" }},
 
+               { &hf_frame_time_relative,
+               { "Time relative to first packet",      "frame.time_relative", FT_RELATIVE_TIME, BASE_NONE, NULL,
+                       0x0,
+                       "" }},
+
                { &hf_frame_number,
                { "Frame Number",               "frame.number", FT_UINT32, BASE_DEC, NULL, 0x0,
                        "" }},
@@ -223,11 +183,23 @@ proto_register_frame(void)
                &ett_frame,
        };
 
-       proto_frame = proto_register_protocol("Frame", "frame");
+       wtap_encap_dissector_table = register_dissector_table("wtap_encap");
+
+       proto_frame = proto_register_protocol("Frame", "Frame", "frame");
        proto_register_field_array(proto_frame, hf, array_length(hf));
        proto_register_subtree_array(ett, array_length(ett));
+       register_dissector("frame",dissect_frame,proto_frame);
+
+       /* You can't disable dissection of "Frame", as that would be
+          tantamount to not doing any dissection whatsoever. */
+       proto_set_cant_disable(proto_frame);
 
-       proto_short = proto_register_protocol("Short Frame", "short");
-       proto_malformed = proto_register_protocol("Malformed Frame", "malformed");
+       proto_short = proto_register_protocol("Short Frame", "Short frame", "short");
+       proto_malformed = proto_register_protocol("Malformed Frame",
+           "Malformed frame", "malformed");
 
+       /* "Short Frame" and "Malformed Frame" aren't really protocols,
+          they're error indications; disabling them makes no sense. */
+       proto_set_cant_disable(proto_short);
+       proto_set_cant_disable(proto_malformed);
 }