RadioTap Archive on lore.kernel.org
 help / color / Atom feed
From: Johannes Berg <johannes-cdvu00un1VgdHxzADdlk8Q@public.gmane.org>
To: radiotap-S783fYmB3Ccdnm+yROfE0A@public.gmane.org
Cc: aviya.erenfeld-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org
Subject: [FINAL] timestamp field
Date: Fri, 05 Aug 2016 07:48:21 +0200
Message-ID: <1470376101.2977.7.camel@sipsolutions.net> (raw)

[-- Attachment #1: Type: text/plain, Size: 212 bytes --]

Since there was no objection, reposting as final - will adopt in a week
from now unless there are any final objections.

The definition can be found at
http://www.radiotap.org/suggested-fields/timestamp

johannes

[-- Attachment #2: wireshark-radiotap-timstamp.patch --]
[-- Type: text/x-patch, Size: 9542 bytes --]

diff --git a/epan/dissectors/packet-ieee80211-radiotap-defs.h b/epan/dissectors/packet-ieee80211-radiotap-defs.h
index 25dd231bd7b9..6ea0ff23af14 100644
--- a/epan/dissectors/packet-ieee80211-radiotap-defs.h
+++ b/epan/dissectors/packet-ieee80211-radiotap-defs.h
@@ -207,6 +207,7 @@ enum ieee80211_radiotap_type {
 	IEEE80211_RADIOTAP_MCS = 19,
 	IEEE80211_RADIOTAP_AMPDU_STATUS = 20,
 	IEEE80211_RADIOTAP_VHT = 21,
+	IEEE80211_RADIOTAP_TIMESTAMP = 22,
 
 	/* valid in every it_present bitmap, even vendor namespaces */
 	IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29,
@@ -215,8 +216,8 @@ enum ieee80211_radiotap_type {
 };
 
 /* not (yet) defined Radiotap present flag */
-/* Bit 22 to 28 are not defined (in binary : 0001 1111 1100 0000 0000 0000 0000 0000 */
-#define IEEE80211_RADIOTAP_NOTDEFINED 0x1FC00000
+/* Bit 23 to 28 are not defined (in binary : 0001 1111 1000 0000 0000 0000 0000 0000 */
+#define IEEE80211_RADIOTAP_NOTDEFINED 0x1F800000
 
 /* Channel flags. */
 /* 0x00000001 through 0x00000008 undefined (reserved?) */
@@ -362,5 +363,19 @@ enum ieee80211_radiotap_type {
 #define IEEE80211_RADIOTAP_VHT_BW_20UUL		24
 #define IEEE80211_RADIOTAP_VHT_BW_20UUU		25
 
+/* for IEEE80211_RADIOTAP_TIMESTAMP */
+#define IEEE80211_RADIOTAP_TS_UNIT_MASK		0x0F
+#define IEEE80211_RADIOTAP_TS_UNIT_MSEC		0x00
+#define IEEE80211_RADIOTAP_TS_UNIT_USEC		0x01
+#define IEEE80211_RADIOTAP_TS_UNIT_NSEC		0x02
+#define IEEE80211_RADIOTAP_TS_SPOS_MASK		0xF0
+#define IEEE80211_RADIOTAP_TS_SPOS_SHIFT	4
+#define IEEE80211_RADIOTAP_TS_SPOS_MPDU		0x0
+#define IEEE80211_RADIOTAP_TS_SPOS_ACQ		0x1
+#define IEEE80211_RADIOTAP_TS_SPOS_EOF		0x2
+#define IEEE80211_RADIOTAP_TS_SPOS_UNDEF	0xF
+
+#define IEEE80211_RADIOTAP_TS_FLG_32BIT		0x01
+#define IEEE80211_RADIOTAP_TS_FLG_ACCURACY	0x02
 
 #endif				/* IEEE80211_RADIOTAP_H */
diff --git a/epan/dissectors/packet-ieee80211-radiotap-iter.c b/epan/dissectors/packet-ieee80211-radiotap-iter.c
index 799a78ecdc2d..1d1053d3dd8d 100644
--- a/epan/dissectors/packet-ieee80211-radiotap-iter.c
+++ b/epan/dissectors/packet-ieee80211-radiotap-iter.c
@@ -62,7 +62,8 @@ static const struct radiotap_align_size rtap_namespace_sizes[] = {
 	/* [IEEE80211_RADIOTAP_XCHANNEL] = 18 */		{ 0, 0 }, /* Unofficial, used by FreeBSD */
 	/* [IEEE80211_RADIOTAP_MCS] = 19 */			{ 1, 3 },
 	/* [IEEE80211_RADIOTAP_AMPDU_STATUS] = 20 */		{ 4, 8 },
-	/* [IEEE80211_RADIOTAP_VHT] = 21 */			{ 2, 12 }
+	/* [IEEE80211_RADIOTAP_VHT] = 21 */			{ 2, 12 },
+	/* [IEEE80211_RADIOTAP_TIMESTAMP] = 22 */		{ 8, 12 }
 
 	/*
 	 * add more here as they are defined in
diff --git a/epan/dissectors/packet-ieee80211-radiotap.c b/epan/dissectors/packet-ieee80211-radiotap.c
index 205b26427af9..728a9d5717cb 100644
--- a/epan/dissectors/packet-ieee80211-radiotap.c
+++ b/epan/dissectors/packet-ieee80211-radiotap.c
@@ -154,6 +154,14 @@ static int hf_radiotap_vht_datarate[4] = { -1, -1, -1, -1 };
 static int hf_radiotap_vht_gid = -1;
 static int hf_radiotap_vht_p_aid = -1;
 static int hf_radiotap_vht_user = -1;
+static int hf_radiotap_timestamp = -1;
+static int hf_radiotap_timestamp_ts = -1;
+static int hf_radiotap_timestamp_accuracy = -1;
+static int hf_radiotap_timestamp_unit = -1;
+static int hf_radiotap_timestamp_spos = -1;
+static int hf_radiotap_timestamp_flags = -1;
+static int hf_radiotap_timestamp_flags_32bit = -1;
+static int hf_radiotap_timestamp_flags_accuracy = -1;
 
 /* "Present" flags */
 static int hf_radiotap_present_tsft = -1;
@@ -176,6 +184,7 @@ static int hf_radiotap_present_xchannel = -1;
 static int hf_radiotap_present_mcs = -1;
 static int hf_radiotap_present_ampdu = -1;
 static int hf_radiotap_present_vht = -1;
+static int hf_radiotap_present_timestamp = -1;
 static int hf_radiotap_present_reserved = -1;
 static int hf_radiotap_present_rtap_ns = -1;
 static int hf_radiotap_present_vendor_ns = -1;
@@ -210,6 +219,8 @@ static gint ett_radiotap_ampdu_flags = -1;
 static gint ett_radiotap_vht = -1;
 static gint ett_radiotap_vht_known = -1;
 static gint ett_radiotap_vht_user = -1;
+static gint ett_radiotap_timestamp = -1;
+static gint ett_radiotap_timestamp_flags = -1;
 
 static expert_field ei_radiotap_data_past_header = EI_INIT;
 static expert_field ei_radiotap_present_reserved = EI_INIT;
@@ -430,6 +441,23 @@ static const true_false_string preamble_type = {
 	"Long",
 };
 
+static const value_string timestamp_unit[] = {
+	{ IEEE80211_RADIOTAP_TS_UNIT_MSEC, "msec" },
+	{ IEEE80211_RADIOTAP_TS_UNIT_USEC, "usec" },
+	{ IEEE80211_RADIOTAP_TS_UNIT_NSEC, "nsec" },
+	{ 0, NULL }
+};
+static value_string_ext timestamp_unit_ext = VALUE_STRING_EXT_INIT(timestamp_unit);
+
+static const value_string timestamp_spos[] = {
+	{ IEEE80211_RADIOTAP_TS_SPOS_MPDU, "first MPDU bit/symbol" },
+	{ IEEE80211_RADIOTAP_TS_SPOS_ACQ, "signal acquisition" },
+	{ IEEE80211_RADIOTAP_TS_SPOS_EOF, "end of frame" },
+	{ IEEE80211_RADIOTAP_TS_SPOS_UNDEF, "undefined" },
+	{ 0, NULL }
+};
+static value_string_ext timestamp_spos_ext = VALUE_STRING_EXT_INIT(timestamp_spos);
+
 /*
  * The NetBSD ieee80211_radiotap man page
  * (http://netbsd.gw.com/cgi-bin/man-cgi?ieee80211_radiotap+9+NetBSD-current)
@@ -744,6 +772,9 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* u
 			proto_tree_add_item(present_tree,
 					    hf_radiotap_present_vht, tvb,
 					    offset + 4, 4, ENC_LITTLE_ENDIAN);
+			proto_tree_add_item(present_tree,
+					    hf_radiotap_present_timestamp, tvb,
+					    offset + 4, 4, ENC_LITTLE_ENDIAN);
 			ti = proto_tree_add_item(present_tree,
 					    hf_radiotap_present_reserved, tvb,
 					    offset + 4, 4, ENC_LITTLE_ENDIAN);
@@ -1739,6 +1770,32 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* u
 
 			break;
 		}
+		case IEEE80211_RADIOTAP_TIMESTAMP:
+			if (tree) {
+				proto_item *it_root;
+				proto_tree *ts_tree, *flg_tree;
+
+				it_root = proto_tree_add_item(radiotap_tree, hf_radiotap_timestamp,
+						tvb, offset, 12, ENC_NA);
+				ts_tree = proto_item_add_subtree(it_root, ett_radiotap_timestamp);
+
+				proto_tree_add_item(ts_tree, hf_radiotap_timestamp_ts,
+						    tvb, offset, 8, ENC_LITTLE_ENDIAN);
+				if (tvb_get_letohs(tvb, offset + 11) & IEEE80211_RADIOTAP_TS_FLG_ACCURACY)
+					proto_tree_add_item(ts_tree, hf_radiotap_timestamp_accuracy,
+							    tvb, offset + 8, 2, ENC_LITTLE_ENDIAN);
+				proto_tree_add_item(ts_tree, hf_radiotap_timestamp_unit,
+						    tvb, offset + 10, 1, ENC_LITTLE_ENDIAN);
+				proto_tree_add_item(ts_tree, hf_radiotap_timestamp_spos,
+						    tvb, offset + 10, 1, ENC_LITTLE_ENDIAN);
+				flg_tree = proto_item_add_subtree(ts_tree, ett_radiotap_timestamp_flags);
+				proto_tree_add_item(flg_tree,
+						    hf_radiotap_timestamp_flags_32bit, tvb,
+						    offset + 11, 1, ENC_LITTLE_ENDIAN);
+				proto_tree_add_item(flg_tree,
+						    hf_radiotap_timestamp_flags_accuracy, tvb,
+						    offset + 11, 1, ENC_LITTLE_ENDIAN);
+			}
 		}
 	}
 
@@ -1927,6 +1984,11 @@ void proto_register_radiotap(void)
 		  FT_BOOLEAN, 32, TFS(&tfs_present_absent), RADIOTAP_MASK(VHT),
 		  "Specifies if the VHT field is present", HFILL}},
 
+		{&hf_radiotap_present_timestamp,
+		 {"frame timestamp", "radiotap.present.timestamp",
+		  FT_BOOLEAN, 32, TFS(&tfs_present_absent), RADIOTAP_MASK(TIMESTAMP),
+		  "Specifies if the timestamp field is present", HFILL}},
+
 		{&hf_radiotap_present_reserved,
 		 {"Reserved", "radiotap.present.reserved",
 		  FT_UINT32, BASE_HEX, NULL, IEEE80211_RADIOTAP_NOTDEFINED,
@@ -2586,6 +2648,48 @@ void proto_register_radiotap(void)
 		  FT_UINT16, BASE_DEC, NULL, 0x0,
 		  NULL, HFILL}},
 
+		{&hf_radiotap_timestamp,
+		 {"timestamp information", "radiotap.timestamp",
+		  FT_NONE, BASE_NONE, NULL, 0x0,
+		  NULL, HFILL}},
+
+		{&hf_radiotap_timestamp_ts,
+		 {"timestamp", "radiotap.timestamp.ts",
+		  FT_UINT64, BASE_DEC, NULL, 0x0,
+		  NULL, HFILL}},
+
+		{&hf_radiotap_timestamp_accuracy,
+		 {"accuracy", "radiotap.timestamp.accuracy",
+		  FT_UINT16, BASE_DEC, NULL, 0x0,
+		  NULL, HFILL}},
+
+		{&hf_radiotap_timestamp_unit,
+		 {"unit", "radiotap.timestamp.unit",
+		  FT_UINT8, BASE_DEC | BASE_EXT_STRING, &timestamp_unit_ext,
+		  IEEE80211_RADIOTAP_TS_UNIT_MASK,
+		  NULL, HFILL}},
+
+		{&hf_radiotap_timestamp_spos,
+		 {"sampling position", "radiotap.timestamp.samplingpos",
+		  FT_UINT8, BASE_DEC | BASE_EXT_STRING, &timestamp_spos_ext,
+		  IEEE80211_RADIOTAP_TS_SPOS_MASK,
+		  NULL, HFILL}},
+
+		{&hf_radiotap_timestamp_flags,
+		 {"timestamp flags", "radiotap.timestamp.flags",
+		  FT_NONE, BASE_NONE, NULL, 0x0,
+		  NULL, HFILL}},
+
+		{&hf_radiotap_timestamp_flags_32bit,
+		 {"32-bit counter", "radiotap.timestamp.flags.32bit",
+		  FT_BOOLEAN, 8, TFS(&tfs_yes_no), IEEE80211_RADIOTAP_TS_FLG_32BIT,
+		  NULL, HFILL}},
+
+		{&hf_radiotap_timestamp_flags_accuracy,
+		 {"accuracy field", "radiotap.timestamp.flags.accuracy",
+		  FT_BOOLEAN, 8, TFS(&tfs_present_absent), IEEE80211_RADIOTAP_TS_FLG_ACCURACY,
+		  NULL, HFILL}},
+
 		{&hf_radiotap_vendor_ns,
 		 {"Vendor namespace", "radiotap.vendor_namespace",
 		  FT_BYTES, BASE_NONE, NULL, 0x0,
@@ -2632,7 +2736,9 @@ void proto_register_radiotap(void)
 		&ett_radiotap_ampdu_flags,
 		&ett_radiotap_vht,
 		&ett_radiotap_vht_known,
-		&ett_radiotap_vht_user
+		&ett_radiotap_vht_user,
+		&ett_radiotap_timestamp,
+		&ett_radiotap_timestamp_flags,
 	};
 	static ei_register_info ei[] = {
 		{ &ei_radiotap_present, { "radiotap.present.radiotap_and_vendor", PI_MALFORMED, PI_ERROR, "Both radiotap and vendor namespace specified in bitmask word", EXPFILL }},

[-- Attachment #3: hwsim-radiotap-timestamp.patch --]
[-- Type: text/x-patch, Size: 1187 bytes --]

diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index c32889a1e39c..6b1082797861 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -551,6 +551,13 @@ struct hwsim_radiotap_hdr {
 	u8 rt_rate;
 	__le16 rt_channel;
 	__le16 rt_chbitmask;
+	__le16 reserved;
+	struct {
+		__le64 ts;
+		__le16 accuracy;
+		u8 unit_pos;
+		u8 flags;
+	} ts;
 } __packed;
 
 struct hwsim_radiotap_ack_hdr {
@@ -831,6 +838,7 @@ static void mac80211_hwsim_monitor_rx(struct ieee80211_hw *hw,
 	hdr->hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) |
 					  (1 << IEEE80211_RADIOTAP_RATE) |
 					  (1 << IEEE80211_RADIOTAP_TSFT) |
+					  BIT(22) |
 					  (1 << IEEE80211_RADIOTAP_CHANNEL));
 	hdr->rt_tsft = __mac80211_hwsim_get_tsf(data);
 	hdr->rt_flags = 0;
@@ -842,6 +850,10 @@ static void mac80211_hwsim_monitor_rx(struct ieee80211_hw *hw,
 	else
 		flags |= IEEE80211_CHAN_CCK;
 	hdr->rt_chbitmask = cpu_to_le16(flags);
+	hdr->ts.ts = cpu_to_le64(ktime_get_boot_ns());
+	hdr->ts.accuracy = 0;
+	hdr->ts.unit_pos = 0x22;
+	hdr->ts.flags = 0x02;
 
 	skb->dev = hwsim_mon;
 	skb_set_mac_header(skb, 0);

             reply index

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-05  5:48 Johannes Berg [this message]
     [not found] ` <1470376101.2977.7.camel-cdvu00un1VgdHxzADdlk8Q@public.gmane.org>
2016-08-05 10:46   ` Guy Harris
     [not found]     ` <3D113CB9-8919-47DB-96C1-9E40AB9AC9D6-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org>
2016-08-05 10:49       ` Johannes Berg
2016-08-12  7:45   ` [ADOPTED] " Johannes Berg

Reply instructions:

You may reply publically to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1470376101.2977.7.camel@sipsolutions.net \
    --to=johannes-cdvu00un1vgdhxzaddlk8q@public.gmane.org \
    --cc=aviya.erenfeld-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    --cc=radiotap-S783fYmB3Ccdnm+yROfE0A@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

RadioTap Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/radiotap/0 radiotap/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 radiotap radiotap/ https://lore.kernel.org/radiotap \
		radiotap@radiotap.org
	public-inbox-index radiotap

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.netbsd.radiotap


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git