summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2012-10-14 22:40:43 +0000
committerGuy Harris <guy@alum.mit.edu>2012-10-14 22:40:43 +0000
commitbb68b6cf4f17e6ace4092e577cf66cf375ae0ed3 (patch)
tree83aaec247c8eb696e199aca0b9b48e37d0f5f1e2
parent9d33c9d8070eb62234e239b607012dd2cc96c381 (diff)
downloadwireshark-bb68b6cf4f17e6ace4092e577cf66cf375ae0ed3.tar.gz
Copy over r45545 from trunk:
------------------------------------------------------------------------ r45545 | guy | 2012-10-14 15:38:58 -0700 (Sun, 14 Oct 2012) | 28 lines According to http://home.martin.cc/linux/prism there's a set of DID type values different from the ones we were using, and there are captures out there that use values from both sets. Support both sets. That page also says that a "status" value of 0 means "supplied"; treat zero as meaning "supplied", and, if it's not zero for a field, don't include it. The "Mac Time" is, according to that page, the lower 32 bits of the MAC timestamp; report it as such. Fix some field names that were copied-and-pasted but not changed. The RSSI and signal quality values are numbers, so show them in decimal. The "signal" and "noise" values appear to be signed numbers, so make them signed rather than unsigned and show them in decimal. Show the data rate in the same style as it's shown in the radiotap dissector. Show the frame length in decimal; we probably have relatively few users with 16 fingers. svn path=/trunk-1.8/; revision=45546
-rw-r--r--epan/dissectors/packet-ieee80211-prism.c277
1 files changed, 174 insertions, 103 deletions
diff --git a/epan/dissectors/packet-ieee80211-prism.c b/epan/dissectors/packet-ieee80211-prism.c
index fbc1168445..0cb5c17a9f 100644
--- a/epan/dissectors/packet-ieee80211-prism.c
+++ b/epan/dissectors/packet-ieee80211-prism.c
@@ -117,39 +117,87 @@ static gint ett_prism_did = -1;
*
* XXX - what about other drivers that supply Prism headers, such as
* old versions of the MadWifi driver?
+ *
+ * I'm not sure where these DID values come from, but they work with
+ * at least one capture file. However, in
+ *
+ * http://ask.wireshark.org/questions/14963/how-to-get-the-field-did-unknown-4041-into-the-column
+ *
+ * somebody reports a capture where *different* DID values, corresponding
+ * to
+ *
+ * http://home.martin.cc/linux/prism
+ *
+ * are used (and that's not a byte-order issue, as those values are *not*
+ * just byte-swapped versions of the other values).
*/
#define PRISM_HEADER_LENGTH 144 /* Default Prism Header Length */
-#define PRISM_DID_HOSTTIME 0x00010044 /* Host time element */
-#define PRISM_DID_MACTIME 0x00020044 /* Mac time element */
-#define PRISM_DID_CHANNEL 0x00030044 /* Channel element */
-#define PRISM_DID_RSSI 0x00040044 /* RSSI element */
-#define PRISM_DID_SQ 0x00050044 /* SQ element */
-#define PRISM_DID_SIGNAL 0x00060044 /* Signal element */
-#define PRISM_DID_NOISE 0x00070044 /* Noise element */
-#define PRISM_DID_RATE 0x00080044 /* Rate element */
-#define PRISM_DID_ISTX 0x00090044 /* Is Tx frame */
-#define PRISM_DID_FRMLEN 0x000A0044 /* Frame length */
+
+/*
+ * From the page cited above. What's this?
+ */
+#define PRISM_MSGCODE 0x00000041 /* Monitor Frame */
+
+/*
+ * DID codes - PRISM_DID1_xxx are the non-home.martin.cc values, and
+ * PRISM_DID2_xxx are the home.martin.cc values.
+ */
+#define PRISM_DID1_HOSTTIME 0x00010044 /* Host time element */
+#define PRISM_DID2_HOSTTIME 0x00001041
+#define PRISM_DID1_MACTIME 0x00020044 /* Mac time element */
+#define PRISM_DID2_MACTIME 0x00002041
+#define PRISM_DID1_CHANNEL 0x00030044 /* Channel element */
+#define PRISM_DID2_CHANNEL 0x00003041
+#define PRISM_DID1_RSSI 0x00040044 /* RSSI element */
+#define PRISM_DID2_RSSI 0x00004041
+#define PRISM_DID1_SQ 0x00050044 /* SQ element */
+#define PRISM_DID2_SQ 0x00005041
+#define PRISM_DID1_SIGNAL 0x00060044 /* Signal element */
+#define PRISM_DID2_SIGNAL 0x00006041
+#define PRISM_DID1_NOISE 0x00070044 /* Noise element */
+#define PRISM_DID2_NOISE 0x00007041
+#define PRISM_DID1_RATE 0x00080044 /* Rate element */
+#define PRISM_DID2_RATE 0x00008041
+#define PRISM_DID1_ISTX 0x00090044 /* Is Tx frame */
+#define PRISM_DID2_ISTX 0x00009041
+#define PRISM_DID1_FRMLEN 0x000A0044 /* Frame length */
+#define PRISM_DID2_FRMLEN 0x0000A041
static const value_string prism_did_vals[] =
{
- { PRISM_DID_HOSTTIME, "Host Time" },
- { PRISM_DID_MACTIME, "Mac Time" },
- { PRISM_DID_CHANNEL, "Channel" },
- { PRISM_DID_RSSI, "RSSI" },
- { PRISM_DID_SQ, "SQ" },
- { PRISM_DID_SIGNAL, "Signal" },
- { PRISM_DID_NOISE, "Noise" },
- { PRISM_DID_RATE, "Rate" },
- { PRISM_DID_ISTX, "Is Tx" },
- { PRISM_DID_FRMLEN, "Frame Length" },
+ { PRISM_DID1_HOSTTIME, "Host Time" },
+ { PRISM_DID2_HOSTTIME, "Host Time" },
+ { PRISM_DID1_MACTIME, "Mac Time" },
+ { PRISM_DID2_MACTIME, "Mac Time" },
+ { PRISM_DID1_CHANNEL, "Channel" },
+ { PRISM_DID2_CHANNEL, "Channel" },
+ { PRISM_DID1_RSSI, "RSSI" },
+ { PRISM_DID2_RSSI, "RSSI" },
+ { PRISM_DID1_SQ, "SQ" },
+ { PRISM_DID2_SQ, "SQ" },
+ { PRISM_DID1_SIGNAL, "Signal" },
+ { PRISM_DID2_SIGNAL, "Signal" },
+ { PRISM_DID1_NOISE, "Noise" },
+ { PRISM_DID2_NOISE, "Noise" },
+ { PRISM_DID1_RATE, "Rate" },
+ { PRISM_DID2_RATE, "Rate" },
+ { PRISM_DID1_ISTX, "Is Tx" },
+ { PRISM_DID2_ISTX, "Is Tx" },
+ { PRISM_DID1_FRMLEN, "Frame Length" },
+ { PRISM_DID2_FRMLEN, "Frame Length" },
{ 0, NULL}
};
+/*
+ * The header file mentioned above says 0 means "supplied" and 1 means
+ * "not supplied". I haven't seen a capture file with anything other
+ * than 0 there.
+ */
static const value_string prism_status_vals[] =
{
- { 0, "Not Supplied" },
- { 1, "Supplied" },
+ { 0, "Supplied" },
+ { 1, "Not Supplied" },
{ 0, NULL}
};
@@ -215,6 +263,7 @@ dissect_prism(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
tvbuff_t *next_tvb;
int offset;
guint32 msgcode, msglen, did;
+ guint16 status;
guint8 *devname;
offset = 0;
@@ -275,6 +324,7 @@ dissect_prism(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/* Status */
+ status = tvb_get_letohs(tvb, offset);
if(tree) {
proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_status, tvb, offset, 2, ENC_LITTLE_ENDIAN);
}
@@ -286,77 +336,98 @@ dissect_prism(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
offset += 2;
- /* Data... */
- switch(did){
- case PRISM_DID_HOSTTIME:
- if(tree){
- proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_hosttime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti_did, " %d", tvb_get_letohl(tvb, offset) );
- }
- break;
- case PRISM_DID_MACTIME:
- if(tree){
- proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_mactime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti_did, " %d", tvb_get_letohl(tvb, offset) );
- }
- break;
- case PRISM_DID_CHANNEL:
- if(tree){
- proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_channel, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti_did, " %d", tvb_get_letohl(tvb, offset) );
- }
- col_add_fstr(pinfo->cinfo, COL_FREQ_CHAN, "%u", tvb_get_letohl(tvb, offset));
- break;
- case PRISM_DID_RSSI:
- if(tree){
- proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_rssi, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti_did, " 0x%x", tvb_get_letohl(tvb, offset) );
- }
- col_add_fstr(pinfo->cinfo, COL_RSSI, "%d", tvb_get_letohl(tvb, offset));
- break;
- case PRISM_DID_SQ:
- if(tree){
- proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_sq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti_did, " 0x%x", tvb_get_letohl(tvb, offset) );
- }
- break;
- case PRISM_DID_SIGNAL:
- if(tree){
- proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_signal, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti_did, " 0x%x", tvb_get_letohl(tvb, offset) );
- }
- break;
- case PRISM_DID_NOISE:
- if(tree){
- proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_noise, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti_did, " 0x%x", tvb_get_letohl(tvb, offset) );
- }
- break;
- case PRISM_DID_RATE:
- if(tree){
- proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_rate, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti_did, " %s Mb/s", prism_rate_return(tvb_get_letohl(tvb, offset)) );
- }
- col_add_fstr(pinfo->cinfo, COL_TX_RATE, "%s", prism_rate_return(tvb_get_letohl(tvb, offset)) );
-
- break;
- case PRISM_DID_ISTX:
- if(tree){
- proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_istx, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti_did, " 0x%x", tvb_get_letohl(tvb, offset) );
- }
- break;
- case PRISM_DID_FRMLEN:
- if(tree){
- proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_frmlen, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti_did, " %d", tvb_get_letohl(tvb, offset) );
- }
- break;
- default:
- if(tree){
- proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_unknown, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ /* Data, if present... */
+ if (status == 0) {
+ switch(did){
+ case PRISM_DID1_HOSTTIME:
+ case PRISM_DID2_HOSTTIME:
+ if(tree){
+ proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_hosttime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti_did, " %d", tvb_get_letohl(tvb, offset) );
+ }
+ break;
+
+ case PRISM_DID1_MACTIME:
+ case PRISM_DID2_MACTIME:
+ if(tree){
+ proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_mactime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti_did, " %d", tvb_get_letohl(tvb, offset) );
+ }
+ break;
+
+ case PRISM_DID1_CHANNEL:
+ case PRISM_DID2_CHANNEL:
+ if(tree){
+ proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_channel, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti_did, " %d", tvb_get_letohl(tvb, offset) );
+ }
+ col_add_fstr(pinfo->cinfo, COL_FREQ_CHAN, "%u", tvb_get_letohl(tvb, offset));
+ break;
+
+ case PRISM_DID1_RSSI:
+ case PRISM_DID2_RSSI:
+ if(tree){
+ proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_rssi, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti_did, " 0x%x", tvb_get_letohl(tvb, offset) );
+ }
+ col_add_fstr(pinfo->cinfo, COL_RSSI, "%d", tvb_get_letohl(tvb, offset));
+ break;
+
+ case PRISM_DID1_SQ:
+ case PRISM_DID2_SQ:
+ if(tree){
+ proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_sq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti_did, " 0x%x", tvb_get_letohl(tvb, offset) );
+ }
+ break;
+
+ case PRISM_DID1_SIGNAL:
+ case PRISM_DID2_SIGNAL:
+ if(tree){
+ proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_signal, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti_did, " 0x%x", tvb_get_letohl(tvb, offset) );
+ }
+ break;
+
+ case PRISM_DID1_NOISE:
+ case PRISM_DID2_NOISE:
+ if(tree){
+ proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_noise, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti_did, " 0x%x", tvb_get_letohl(tvb, offset) );
+ }
+ break;
+
+ case PRISM_DID1_RATE:
+ case PRISM_DID2_RATE:
+ if(tree){
+ proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_rate, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti_did, " %s Mb/s", prism_rate_return(tvb_get_letohl(tvb, offset)) );
+ }
+ col_add_fstr(pinfo->cinfo, COL_TX_RATE, "%s", prism_rate_return(tvb_get_letohl(tvb, offset)) );
+ break;
+
+ case PRISM_DID1_ISTX:
+ case PRISM_DID2_ISTX:
+ if(tree){
+ proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_istx, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti_did, " 0x%x", tvb_get_letohl(tvb, offset) );
+ }
+ break;
+
+ case PRISM_DID1_FRMLEN:
+ case PRISM_DID2_FRMLEN:
+ if(tree){
+ proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_frmlen, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti_did, " %d", tvb_get_letohl(tvb, offset) );
+ }
+ break;
+
+ default:
+ if(tree){
+ proto_tree_add_item(prism_did_tree, hf_ieee80211_prism_did_unknown, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ }
+ break;
}
- break;
}
offset += 4;
}
@@ -402,39 +473,39 @@ static hf_register_info hf_prism[] = {
"In jiffies - for our system this is in 10ms units", HFILL }},
{ &hf_ieee80211_prism_did_mactime,
- {"Mac Time", "prism.did.hosttime", FT_UINT32, BASE_DEC, NULL, 0x0,
- "In micro-seconds", HFILL }},
+ {"MAC timestamp (lower 32 bits)", "prism.did.mactime", FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Lower 32 bits of value in microseconds of the MAC's Time Synchronization Function timer when the first bit of the MPDU arrived at the MAC.", HFILL }},
{ &hf_ieee80211_prism_did_channel,
- {"Channel", "prism.did.hosttime", FT_UINT32, BASE_DEC, NULL, 0x0,
+ {"Channel", "prism.did.channel", FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_ieee80211_prism_did_rssi,
- {"RSSI", "prism.did.rssi", FT_UINT32, BASE_HEX, NULL, 0x0,
+ {"RSSI", "prism.did.rssi", FT_INT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_ieee80211_prism_did_sq,
- {"SQ", "prism.did.sq", FT_UINT32, BASE_HEX, NULL, 0x0,
+ {"Signal Quality", "prism.did.sq", FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_ieee80211_prism_did_signal,
- {"Signal", "prism.did.signal", FT_UINT32, BASE_HEX, NULL, 0x0,
+ {"Signal", "prism.did.signal", FT_INT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_ieee80211_prism_did_noise,
- {"Noise", "prism.did.noise", FT_UINT32, BASE_HEX, NULL, 0x0,
+ {"Noise", "prism.did.noise", FT_INT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_ieee80211_prism_did_rate,
- {"Rate (In Mb/s)", "prism.did.rate", FT_UINT32, BASE_CUSTOM, prism_rate_base_custom, 0x0,
- "In Mb/s", HFILL }},
+ {"Data rate (Mb/s)", "prism.did.rate", FT_UINT32, BASE_CUSTOM, prism_rate_base_custom, 0x0,
+ "Speed this frame was sent/received at", HFILL }},
{ &hf_ieee80211_prism_did_istx,
{"IsTX", "prism.did.istx", FT_UINT32, BASE_HEX, VALS(prism_istx_vals), 0x0,
- "Type of packet (RX or TX ?)", HFILL }},
+ "Type of packet (RX or TX?)", HFILL }},
{ &hf_ieee80211_prism_did_frmlen,
- {"Frame Length", "prism.did.frmlen", FT_UINT32, BASE_HEX_DEC, NULL, 0x0,
+ {"Frame Length", "prism.did.frmlen", FT_UINT32, BASE_DEC, NULL, 0x0,
"Length of the following frame in bytes", HFILL }},
{ &hf_ieee80211_prism_did_unknown,