aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-llc.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2009-05-02 21:51:51 +0000
committerGuy Harris <guy@alum.mit.edu>2009-05-02 21:51:51 +0000
commit359381545502871e573fa7e08ae46e7bea50bd52 (patch)
tree1cd96ed8d6c1055262ff4dc8b4a1a63c85b0be38 /epan/dissectors/packet-llc.c
parent3b23d3dbd524b67438efcdd5a1122988c8adf6d2 (diff)
Add the mesh header dissector for OLPC mesh network packets, and have
the LLC dissector recognize and handle those packets. svn path=/trunk/; revision=28253
Diffstat (limited to 'epan/dissectors/packet-llc.c')
-rw-r--r--epan/dissectors/packet-llc.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/epan/dissectors/packet-llc.c b/epan/dissectors/packet-llc.c
index 9eb6fadc65..2d6eb508ce 100644
--- a/epan/dissectors/packet-llc.c
+++ b/epan/dissectors/packet-llc.c
@@ -87,12 +87,15 @@ static gint ett_llc_basicxid = -1;
static dissector_table_t subdissector_table;
static dissector_table_t xid_subdissector_table;
+static dissector_table_t ethertype_subdissector_table;
+
static dissector_handle_t bpdu_handle;
static dissector_handle_t eth_withoutfcs_handle;
static dissector_handle_t eth_withfcs_handle;
static dissector_handle_t fddi_handle;
static dissector_handle_t tr_handle;
static dissector_handle_t turbo_handle;
+static dissector_handle_t mesh_handle;
static dissector_handle_t data_handle;
/*
@@ -371,6 +374,16 @@ capture_snap(const guchar *pd, int offset, int len, packet_counts *ld)
capture_ethertype(etype, pd, offset+5, len, ld);
break;
+ case OUI_MARVELL:
+ /*
+ * OLPC packet. The PID is an Ethertype, but
+ * there's a mesh header between the PID and
+ * the payload. (We assume the header is
+ * 5 bytes, for now).
+ */
+ capture_ethertype(etype, pd, offset+5+5, len, ld);
+ break;
+
default:
ld->other++;
break;
@@ -582,6 +595,7 @@ dissect_snap(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
oui_info_t *oui_info;
dissector_table_t subdissector_table;
int hf;
+ int mesh_header_len;
/*
* XXX - what about non-UI frames?
@@ -696,6 +710,31 @@ dissect_snap(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
call_dissector(turbo_handle, next_tvb, pinfo, tree);
break;
+ case OUI_MARVELL:
+ /*
+ * OLPC packet. The PID is an Ethertype, but
+ * there's a mesh header between the PID and
+ * the payload.
+ */
+ if (XDLC_IS_INFORMATION(control)) {
+ if (tree) {
+ proto_tree_add_uint(snap_tree, hf_llc_type,
+ tvb, offset+3, 2, etype);
+ }
+ next_tvb = tvb_new_subset(tvb, offset+5, -1, -1);
+ mesh_header_len = call_dissector(mesh_handle,
+ next_tvb, pinfo, tree);
+ next_tvb = tvb_new_subset(tvb, offset+5+mesh_header_len,
+ -1, -1);
+ if (!dissector_try_port(ethertype_subdissector_table,
+ etype, next_tvb, pinfo, tree))
+ call_dissector(data_handle,next_tvb, pinfo, tree);
+ } else {
+ next_tvb = tvb_new_subset(tvb, offset+5, -1, -1);
+ call_dissector(data_handle,next_tvb, pinfo, tree);
+ }
+ break;
+
default:
/*
* Do we have information for this OUI?
@@ -891,8 +930,14 @@ proto_reg_handoff_llc(void)
fddi_handle = find_dissector("fddi");
tr_handle = find_dissector("tr");
turbo_handle = find_dissector("turbocell");
+ mesh_handle = find_dissector("mesh");
data_handle = find_dissector("data");
+ /*
+ * Get the Ethertype dissector table.
+ */
+ ethertype_subdissector_table = find_dissector_table("ethertype");
+
llc_handle = find_dissector("llc");
dissector_add("wtap_encap", WTAP_ENCAP_ATM_RFC1483, llc_handle);
/* RFC 2043 */