diff options
author | Guy Harris <guy@alum.mit.edu> | 2009-05-02 21:51:51 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2009-05-02 21:51:51 +0000 |
commit | 359381545502871e573fa7e08ae46e7bea50bd52 (patch) | |
tree | 1cd96ed8d6c1055262ff4dc8b4a1a63c85b0be38 /epan/dissectors/packet-llc.c | |
parent | 3b23d3dbd524b67438efcdd5a1122988c8adf6d2 (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.c | 45 |
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 */ |