aboutsummaryrefslogtreecommitdiffstats
path: root/packet-fddi.c
diff options
context:
space:
mode:
authordeniel <deniel@f5534014-38df-0310-8fa8-9805f1628bb7>2003-06-10 19:34:36 +0000
committerdeniel <deniel@f5534014-38df-0310-8fa8-9805f1628bb7>2003-06-10 19:34:36 +0000
commit67d0066767ac5572968c98117710e0957e267c3f (patch)
tree6cfdd8ee5e3765dc4fa04f5df00ffc2e60e15620 /packet-fddi.c
parent156d84ce20da8e783ab56a9f95316c8e4476c5e2 (diff)
Add a preference for the FDDI dissector to be able to decode
some FDDI captures where 3-byte padding is added in order to align the FDDI header (case of tcpdump/packetfilters on Tru64 UNIX for instance). git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@7833 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'packet-fddi.c')
-rw-r--r--packet-fddi.c68
1 files changed, 42 insertions, 26 deletions
diff --git a/packet-fddi.c b/packet-fddi.c
index 4207f4fed8..3cfde074fd 100644
--- a/packet-fddi.c
+++ b/packet-fddi.c
@@ -3,7 +3,7 @@
*
* Laurent Deniel <laurent.deniel@free.fr>
*
- * $Id: packet-fddi.c,v 1.60 2003/01/26 19:35:24 deniel Exp $
+ * $Id: packet-fddi.c,v 1.61 2003/06/10 19:34:36 deniel Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -33,8 +33,10 @@
#include <glib.h>
#include <epan/bitswap.h>
#include <epan/packet.h>
+#include "prefs.h"
#include "packet-fddi.h"
#include "packet-llc.h"
+
#include <epan/resolv.h>
static int proto_fddi = -1;
@@ -50,6 +52,10 @@ static int hf_fddi_addr = -1;
static gint ett_fddi = -1;
static gint ett_fddi_fc = -1;
+static gboolean fddi_padding = FALSE;
+
+#define FDDI_PADDING ((fddi_padding) ? 3 : 0)
+
/* FDDI Frame Control values */
#define FDDI_FC_VOID 0x00 /* Void frame */
@@ -140,13 +146,13 @@ capture_fddi(const guchar *pd, int len, packet_counts *ld)
{
int offset = 0, fc;
- if (!BYTES_ARE_IN_FRAME(0, len, FDDI_HEADER_SIZE)) {
+ if (!BYTES_ARE_IN_FRAME(0, len, FDDI_HEADER_SIZE + FDDI_PADDING)) {
ld->other++;
return;
}
- offset = FDDI_HEADER_SIZE;
+ offset = FDDI_PADDING + FDDI_HEADER_SIZE;
- fc = (int) pd[FDDI_P_FC];
+ fc = (int) pd[FDDI_P_FC+FDDI_PADDING];
switch (fc) {
@@ -266,44 +272,44 @@ dissect_fddi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_set_str(pinfo->cinfo, COL_PROTOCOL, "FDDI");
- fc = (int) tvb_get_guint8(tvb, FDDI_P_FC);
+ fc = (int) tvb_get_guint8(tvb, FDDI_P_FC + FDDI_PADDING);
fc_str = fddifc_to_str(fc);
if (check_col(pinfo->cinfo, COL_INFO))
col_add_str(pinfo->cinfo, COL_INFO, fc_str);
if (tree) {
- ti = proto_tree_add_protocol_format(tree, proto_fddi, tvb, 0, FDDI_HEADER_SIZE,
+ ti = proto_tree_add_protocol_format(tree, proto_fddi, tvb, 0, FDDI_HEADER_SIZE+FDDI_PADDING,
"Fiber Distributed Data Interface, %s", fc_str);
fh_tree = proto_item_add_subtree(ti, ett_fddi);
- ti = proto_tree_add_uint_format(fh_tree, hf_fddi_fc, tvb, FDDI_P_FC, 1, fc,
+ ti = proto_tree_add_uint_format(fh_tree, hf_fddi_fc, tvb, FDDI_P_FC + FDDI_PADDING, 1, fc,
"Frame Control: 0x%02x (%s)", fc, fc_str);
fc_tree = proto_item_add_subtree(ti, ett_fddi_fc);
- proto_tree_add_uint(fc_tree, hf_fddi_fc_clf, tvb, FDDI_P_FC, 1, fc);
+ proto_tree_add_uint(fc_tree, hf_fddi_fc_clf, tvb, FDDI_P_FC + FDDI_PADDING, 1, fc);
switch (fc & FDDI_FC_CLFF) {
case FDDI_FC_SMT:
- proto_tree_add_uint(fc_tree, hf_fddi_fc_smt_subtype, tvb, FDDI_P_FC, 1, fc);
+ proto_tree_add_uint(fc_tree, hf_fddi_fc_smt_subtype, tvb, FDDI_P_FC + FDDI_PADDING, 1, fc);
break;
case FDDI_FC_MAC:
if (fc != FDDI_FC_RT)
- proto_tree_add_uint(fc_tree, hf_fddi_fc_mac_subtype, tvb, FDDI_P_FC, 1, fc);
+ proto_tree_add_uint(fc_tree, hf_fddi_fc_mac_subtype, tvb, FDDI_P_FC + FDDI_PADDING, 1, fc);
break;
case FDDI_FC_LLC_ASYNC:
if (!(fc & FDDI_FC_ASYNC_R))
- proto_tree_add_uint(fc_tree, hf_fddi_fc_prio, tvb, FDDI_P_FC, 1, fc);
+ proto_tree_add_uint(fc_tree, hf_fddi_fc_prio, tvb, FDDI_P_FC + FDDI_PADDING, 1, fc);
break;
}
}
/* Extract the destination address, possibly bit-swapping it. */
if (bitswapped)
- swap_mac_addr(dst, tvb_get_ptr(tvb, FDDI_P_DHOST, 6));
+ swap_mac_addr(dst, tvb_get_ptr(tvb, FDDI_P_DHOST + FDDI_PADDING, 6));
else
- memcpy(dst, tvb_get_ptr(tvb, FDDI_P_DHOST, 6), sizeof dst);
- swap_mac_addr(dst_swapped, tvb_get_ptr(tvb, FDDI_P_DHOST, 6));
+ memcpy(dst, tvb_get_ptr(tvb, FDDI_P_DHOST + FDDI_PADDING, 6), sizeof dst);
+ swap_mac_addr(dst_swapped, tvb_get_ptr(tvb, FDDI_P_DHOST + FDDI_PADDING, 6));
/* XXX - copy them to some buffer associated with "pi", rather than
just making "dst" static? */
@@ -311,20 +317,20 @@ dissect_fddi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
SET_ADDRESS(&pinfo->dst, AT_ETHER, 6, &dst[0]);
if (fh_tree) {
- proto_tree_add_ether(fh_tree, hf_fddi_dst, tvb, FDDI_P_DHOST, 6, dst);
- proto_tree_add_ether_hidden(fh_tree, hf_fddi_addr, tvb, FDDI_P_DHOST, 6, dst);
+ proto_tree_add_ether(fh_tree, hf_fddi_dst, tvb, FDDI_P_DHOST + FDDI_PADDING, 6, dst);
+ proto_tree_add_ether_hidden(fh_tree, hf_fddi_addr, tvb, FDDI_P_DHOST + FDDI_PADDING, 6, dst);
/* hide some bit-swapped mac address fields in the proto_tree, just in case */
- proto_tree_add_ether_hidden(fh_tree, hf_fddi_dst, tvb, FDDI_P_DHOST, 6, dst_swapped);
- proto_tree_add_ether_hidden(fh_tree, hf_fddi_addr, tvb, FDDI_P_DHOST, 6, dst_swapped);
+ proto_tree_add_ether_hidden(fh_tree, hf_fddi_dst, tvb, FDDI_P_DHOST + FDDI_PADDING, 6, dst_swapped);
+ proto_tree_add_ether_hidden(fh_tree, hf_fddi_addr, tvb, FDDI_P_DHOST + FDDI_PADDING, 6, dst_swapped);
}
/* Extract the source address, possibly bit-swapping it. */
if (bitswapped)
- swap_mac_addr(src, tvb_get_ptr(tvb, FDDI_P_SHOST, 6));
+ swap_mac_addr(src, tvb_get_ptr(tvb, FDDI_P_SHOST + FDDI_PADDING, 6));
else
- memcpy(src, tvb_get_ptr(tvb, FDDI_P_SHOST, 6), sizeof src);
- swap_mac_addr(src_swapped, tvb_get_ptr(tvb, FDDI_P_SHOST, 6));
+ memcpy(src, tvb_get_ptr(tvb, FDDI_P_SHOST + FDDI_PADDING, 6), sizeof src);
+ swap_mac_addr(src_swapped, tvb_get_ptr(tvb, FDDI_P_SHOST + FDDI_PADDING, 6));
/* XXX - copy them to some buffer associated with "pi", rather than
just making "src" static? */
@@ -332,15 +338,15 @@ dissect_fddi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
SET_ADDRESS(&pinfo->src, AT_ETHER, 6, &src[0]);
if (fh_tree) {
- proto_tree_add_ether(fh_tree, hf_fddi_src, tvb, FDDI_P_SHOST, 6, src);
- proto_tree_add_ether_hidden(fh_tree, hf_fddi_addr, tvb, FDDI_P_SHOST, 6, src);
+ proto_tree_add_ether(fh_tree, hf_fddi_src, tvb, FDDI_P_SHOST + FDDI_PADDING, 6, src);
+ proto_tree_add_ether_hidden(fh_tree, hf_fddi_addr, tvb, FDDI_P_SHOST + FDDI_PADDING, 6, src);
/* hide some bit-swapped mac address fields in the proto_tree, just in case */
- proto_tree_add_ether_hidden(fh_tree, hf_fddi_src, tvb, FDDI_P_SHOST, 6, src_swapped);
- proto_tree_add_ether_hidden(fh_tree, hf_fddi_addr, tvb, FDDI_P_SHOST, 6, src_swapped);
+ proto_tree_add_ether_hidden(fh_tree, hf_fddi_src, tvb, FDDI_P_SHOST + FDDI_PADDING, 6, src_swapped);
+ proto_tree_add_ether_hidden(fh_tree, hf_fddi_addr, tvb, FDDI_P_SHOST + FDDI_PADDING, 6, src_swapped);
}
- next_tvb = tvb_new_subset(tvb, FDDI_HEADER_SIZE, -1, -1);
+ next_tvb = tvb_new_subset(tvb, FDDI_HEADER_SIZE + FDDI_PADDING, -1, -1);
switch (fc) {
@@ -433,6 +439,8 @@ proto_register_fddi(void)
&ett_fddi_fc,
};
+ module_t *fddi_module;
+
proto_fddi = proto_register_protocol("Fiber Distributed Data Interface",
"FDDI", "fddi");
proto_register_field_array(proto_fddi, hf, array_length(hf));
@@ -443,6 +451,14 @@ proto_register_fddi(void)
* We assume the MAC addresses in them aren't bitswapped.
*/
register_dissector("fddi", dissect_fddi_not_bitswapped, proto_fddi);
+
+ fddi_module = prefs_register_protocol(proto_fddi, NULL);
+ prefs_register_bool_preference(fddi_module, "padding",
+ "Add 3-byte padding to all FDDI packets",
+ "Whether the FDDI dissector should add 3-byte padding to all "
+ "captured FDDI packets (useful with e.g. Tru64 UNIX tcpdump)",
+ &fddi_padding);
+
}
void