2019-11-22 17:17:29

by James Prestwood

[permalink] [raw]
Subject: [PATCH v3 2/2] mac80211_hwsim: set rx_status mactime/flag for wmediumd path

This patch sets the required rx_status mactime and flags in order for
the parent TSF value to be calculated and sent to userspace. This is
already done elsewhere, but this patch allows this to work for the
wmediumd code path.

Signed-off-by: James Prestwood <[email protected]>
---
drivers/net/wireless/mac80211_hwsim.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)

diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index e9bc599481d4..01b2ac9707cc 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -3238,6 +3238,8 @@ static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,
int frame_data_len;
void *frame_data;
struct sk_buff *skb = NULL;
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb_2->data;
+ u64 now;

if (!info->attrs[HWSIM_ATTR_ADDR_RECEIVER] ||
!info->attrs[HWSIM_ATTR_FRAME] ||
@@ -3300,6 +3302,18 @@ static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,
rx_status.rate_idx = nla_get_u32(info->attrs[HWSIM_ATTR_RX_RATE]);
rx_status.signal = nla_get_u32(info->attrs[HWSIM_ATTR_SIGNAL]);

+ if (ieee80211_is_beacon(hdr->frame_control) ||
+ ieee80211_is_probe_resp(hdr->frame_control)) {
+ rx_status.boottime_ns = ktime_get_boottime_ns();
+ now = data2->abs_bcn_ts;
+ } else {
+ now = mac80211_hwsim_get_tsf_raw();
+ }
+
+ rx_status.mactime = now + data2->tsf_offset;
+
+ rx_status.flag |= RX_FLAG_MACTIME_START;
+
memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status));
data2->rx_pkts++;
data2->rx_bytes += skb->len;
--
2.17.1


2019-12-13 09:52:58

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] mac80211_hwsim: set rx_status mactime/flag for wmediumd path

On Fri, 2019-11-22 at 09:14 -0800, James Prestwood wrote:
> This patch sets the required rx_status mactime and flags in order for
> the parent TSF value to be calculated and sent to userspace. This is
> already done elsewhere, but this patch allows this to work for the
> wmediumd code path.
>
> Signed-off-by: James Prestwood <[email protected]>
> ---
> drivers/net/wireless/mac80211_hwsim.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
> index e9bc599481d4..01b2ac9707cc 100644
> --- a/drivers/net/wireless/mac80211_hwsim.c
> +++ b/drivers/net/wireless/mac80211_hwsim.c
> @@ -3238,6 +3238,8 @@ static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,
> int frame_data_len;
> void *frame_data;
> struct sk_buff *skb = NULL;
> + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb_2->data;
> + u64 now;
>
> if (!info->attrs[HWSIM_ATTR_ADDR_RECEIVER] ||
> !info->attrs[HWSIM_ATTR_FRAME] ||
> @@ -3300,6 +3302,18 @@ static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,
> rx_status.rate_idx = nla_get_u32(info->attrs[HWSIM_ATTR_RX_RATE]);
> rx_status.signal = nla_get_u32(info->attrs[HWSIM_ATTR_SIGNAL]);
>
> + if (ieee80211_is_beacon(hdr->frame_control) ||
> + ieee80211_is_probe_resp(hdr->frame_control)) {
> + rx_status.boottime_ns = ktime_get_boottime_ns();
> + now = data2->abs_bcn_ts;

I'm pretty sure this should be data, not data2, like in the other code
paths?

Also, please rebase - I already did the boottime_ns before overlapping
your change, so you can also get rid of the 'hdr' variable.

johannes