*
* 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;
{ 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)
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);
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 );
}
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,
"" }},
&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);
}