From patchwork Thu Dec 27 21:43:55 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Pedersen X-Patchwork-Id: 1913711 Return-Path: X-Original-To: patchwork-linux-wireless@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 574223FF0F for ; Thu, 27 Dec 2012 21:44:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751827Ab2L0Voe (ORCPT ); Thu, 27 Dec 2012 16:44:34 -0500 Received: from mail-pb0-f48.google.com ([209.85.160.48]:46004 "EHLO mail-pb0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751492Ab2L0Voe (ORCPT ); Thu, 27 Dec 2012 16:44:34 -0500 Received: by mail-pb0-f48.google.com with SMTP id rq13so5559036pbb.35 for ; Thu, 27 Dec 2012 13:44:33 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:x-gm-message-state; bh=Y8nPY/miAh6r9nnaY1A4fDcOk85ZyKO6qs7PRAkiQqg=; b=XuKRRkjrsdTTEE7OjaDAU4FqkB1zvMV4eQLFKMz0xMQ6p9INBhwPlVkDd1gpA4YG94 1ORWVLRDcwcT578NggQ52PdgJ8pWqvDn/SYm9/xK8IDSqAnwCgFte8dryBC5Bhbt4GWw xKenwWbdqzrxt6Pb0sYksXGz6eeiZ0ASEZahpUHkoyyFdzTO2horfwAvtDNP05qKkA/W fBKGCQhaxcBjjLIyuuxiWsI1jrmmoLhzZP57dVBQiKb/TmvZLq3dlfFyk2ag1bKMx+Ws jAb0VUMCUUiUYsfjAdPCLoXsKOuoRM73i/HqKt3CKcRbacPnvWqGC56wo3MAynPqfn68 aUQQ== X-Received: by 10.66.84.10 with SMTP id u10mr93639830pay.24.1356644673639; Thu, 27 Dec 2012 13:44:33 -0800 (PST) Received: from cable.lan (70-35-43-50.static.wiline.com. [70.35.43.50]) by mx.google.com with ESMTPS id kl3sm18416026pbc.15.2012.12.27.13.44.31 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 27 Dec 2012 13:44:32 -0800 (PST) From: Thomas Pedersen To: linville@tuxdriver.org Cc: j@w1.fi, linux-wireless@vger.kernel.org, johannes@sipsolutions.net, Thomas Pedersen Subject: [PATCH 3/4] mac80211_hwsim: fix beacon timing Date: Thu, 27 Dec 2012 13:43:55 -0800 Message-Id: <1356644636-5309-3-git-send-email-thomas@cozybit.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1356644636-5309-1-git-send-email-thomas@cozybit.com> References: <1356644636-5309-1-git-send-email-thomas@cozybit.com> X-Gm-Message-State: ALoCoQkyy4uKsBHErHBifEu+t3flrtbybNHxMpWEOkD7JiV6QT3gCn2vcPFIGHTJ9JuimpemNrot Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org A beacon period starts at TSF time 0. Spoof this by rounding the starting beacon time to a multiple of the beacon interval, and keep TBTT aligned on TSF adjustment. Signed-off-by: Thomas Pedersen --- drivers/net/wireless/mac80211_hwsim.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index f353d5e..d513c3e 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c @@ -358,6 +358,7 @@ struct mac80211_hwsim_data { /* difference between this hw's clock and the real clock, in usecs */ s64 tsf_offset; + s64 bcn_delta; }; @@ -424,9 +425,12 @@ static void mac80211_hwsim_set_tsf(struct ieee80211_hw *hw, { struct mac80211_hwsim_data *data = hw->priv; u64 now = mac80211_hwsim_get_tsf(hw, vif); + u32 bcn_int = data->beacon_int; s64 delta = tsf - now; data->tsf_offset += delta; + /* adjust after beaconing with new timestamp at old TBTT */ + data->bcn_delta = do_div(delta, bcn_int); } static void mac80211_hwsim_monitor_rx(struct ieee80211_hw *hw, @@ -1001,6 +1005,11 @@ mac80211_hwsim_beacon(struct hrtimer *timer) hw, IEEE80211_IFACE_ITER_NORMAL, mac80211_hwsim_beacon_tx, data); + /* beacon at new TBTT + beacon interval */ + if (data->bcn_delta) { + bcn_int -= data->bcn_delta; + data->bcn_delta = 0; + } next_bcn = ktime_add(hrtimer_get_expires(timer), ns_to_ktime(bcn_int * 1000)); @@ -1046,8 +1055,12 @@ static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed) if (!data->started || !data->beacon_int) tasklet_hrtimer_cancel(&data->beacon_timer); else if (!hrtimer_is_queued(&data->beacon_timer.timer)) { + u64 tsf = mac80211_hwsim_get_tsf(hw, NULL); + u32 bcn_int = data->beacon_int; + u64 until_tbtt = bcn_int - do_div(tsf, bcn_int); + tasklet_hrtimer_start(&data->beacon_timer, - ns_to_ktime(data->beacon_int * 1000), + ns_to_ktime(until_tbtt * 1000), HRTIMER_MODE_REL); } @@ -1107,11 +1120,15 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw, if (data->started && !hrtimer_is_queued(&data->beacon_timer.timer) && info->enable_beacon) { + u64 tsf, until_tbtt; + u32 bcn_int; if (WARN_ON(!data->beacon_int)) data->beacon_int = 1000 * 1024; + tsf = mac80211_hwsim_get_tsf(hw, vif); + bcn_int = data->beacon_int; + until_tbtt = bcn_int - do_div(tsf, bcn_int); tasklet_hrtimer_start(&data->beacon_timer, - ns_to_ktime(data->beacon_int * - 1000), + ns_to_ktime(until_tbtt * 1000), HRTIMER_MODE_REL); } else if (!info->enable_beacon) tasklet_hrtimer_cancel(&data->beacon_timer);