From patchwork Thu Jan 21 13:47:30 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sven Eckelmann X-Patchwork-Id: 4998 Return-Path: Received-SPF: Neutral (access neither permitted nor denied) identity=mailfrom; client-ip=74.125.82.43; helo=mail-wm0-f43.google.com; envelope-from=sven@open-mesh.com; receiver=b.a.t.m.a.n@lists.open-mesh.org Authentication-Results: open-mesh.org; dmarc=none header.from=open-mesh.com Authentication-Results: open-mesh.org; dkim=pass reason="2048-bit key; unprotected key" header.d=open-mesh-com.20150623.gappssmtp.com header.i=@open-mesh-com.20150623.gappssmtp.com header.b=OWVKjxA8; dkim-adsp=none (unprotected policy); dkim-atps=neutral Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by open-mesh.org (Postfix) with ESMTPS id 7943380F0F for ; Thu, 21 Jan 2016 14:47:32 +0100 (CET) Received: by mail-wm0-f43.google.com with SMTP id u188so227082102wmu.1 for ; Thu, 21 Jan 2016 05:47:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=open-mesh-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:user-agent:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=WJCMlgUQJVXpJdGmqsWUwg+2Qe8INZRh/PR0pqMCMCU=; b=OWVKjxA8GdV6+TP4mIYLhReF819KcbXYG5JixTuuagxb1dtg4QEkyBHcdSSHZR0WrF IXTi1iQJmpDy1sN2rowbhZs8c16Au3Tp1ZaIDx08x3Yw+0+xBsHnQys3gIJq39NOFhIh bJiC/1WtVFoSLIggMfG3fsMdN2x+7cnP7R/USnfLzPtT3FqPUKwjSTnAN2Hz5d2vrMN9 52nM+2EqSlxQGhQfBugELE5tqckv/t4fRB6Aubj1JZPTpmAWCOv4FYRiUTJJBwh3rCs6 r2xz/o8SfmKW+inQQmicTJaECSt+muqtmt9Li5ZiLH+qFpVvBsDGfAkDZCW6ZNmjlSAb lNKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:user-agent :in-reply-to:references:mime-version:content-type :content-transfer-encoding; bh=WJCMlgUQJVXpJdGmqsWUwg+2Qe8INZRh/PR0pqMCMCU=; b=Ve2M2ZGhh8YUTfkCMeMKMZc+q8+JDTwXNOaUrwVzncymiyTeeeB996N2/z0GH4H0vp WexdnaYLGlbAznSnyTJVYquvAHEYkX52bhg/bAY8m67TlQp14oS2Xga7SCCJb9Gxzymw Tfx6Nuoz8tVUbyAnKcOj5/Bk8qYnlK/cWT5/ZToAW4bsNjVyft09c7SlHXBksZ93fekA TID1tpKbED42wMXOo7kJPwymLtgGbSVlMrN6Mw1zjbp7NbIowOA4Zpc7XrKH02m2BHY8 V4vPe5AXaeSKmui91w6fTf7os3btv3Vv3nfgPno5uPWcxb6+OwAdaTkyWDJejbNO5TVy WtJA== X-Gm-Message-State: ALoCoQnrXyEwSXLWInGPvwo29Ax9AdZA7Pq4ndVVoU1iGu86GNwKE9oXWeZ3wANWSs+MZs+ecfDbvZfOgJWdALfEVyH8rog+VQ== X-Received: by 10.194.243.103 with SMTP id wx7mr47087157wjc.136.1453384052374; Thu, 21 Jan 2016 05:47:32 -0800 (PST) Received: from bentobox.localnet (x4d05afc7.dyn.telefonica.de. [77.5.175.199]) by smtp.gmail.com with ESMTPSA id y188sm3050638wmy.11.2016.01.21.05.47.31 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 21 Jan 2016 05:47:31 -0800 (PST) From: Sven Eckelmann To: b.a.t.m.a.n@lists.open-mesh.org Date: Thu, 21 Jan 2016 14:47:30 +0100 Message-ID: <4178376.2Vigxs1Xtt@bentobox> User-Agent: KMail/4.14.10 (Linux/4.3.0-1-amd64; KDE/4.14.14; x86_64; ; ) In-Reply-To: <6825353.GnzNjs5eRJ@bentobox> References: <8047297.0qIFjkW2bL@voltaire> <6825353.GnzNjs5eRJ@bentobox> MIME-Version: 1.0 Cc: Felix Fietkau , openwrt-devel@lists.openwrt.org, Marek Lindner Subject: [B.A.T.M.A.N.] OpenWrt cfg80211.h station_info incompatibility with kernel+mac80211 [was: B.A.T.M.A.N. V leaves the nest v2] X-BeenThere: b.a.t.m.a.n@lists.open-mesh.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: The list for a Better Approach To Mobile Ad-hoc Networking List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Jan 2016 13:47:33 -0000 On Thursday 21 January 2016 12:56:01 Sven Eckelmann wrote: > Just installed in on some hardware (2x OM5P + OpenWrt 44654 + compat-wireless > 2015-10-26) and enabled BATMAN_V. > > [ 168.540000] CPU 0 Unable to handle kernel paging request at virtual address fffffff0, epc == 86d8301c, ra == 86d8301c > [ 168.550000] Oops[#1]: > [ 168.550000] CPU: 0 PID: 265 Comm: kworker/u2:2 Tainted: P 3.18.8 #1 > [ 168.550000] Workqueue: bat_events batadv_v_elp_throughput_metric_update [batman_adv] [..] > [ 168.550000] epc : 86d8301c batadv_v_elp_throughput_metric_update+0x20/0x58 [batman_adv] > [ 168.550000] Tainted: P > [ 168.550000] ra : 86d8301c batadv_v_elp_throughput_metric_update+0x20/0x58 [batman_adv] Who knew that struct station_info changed in v3.18-6219-g6de3980, v3.18-6235-gb51f3be and v3.18-6217-ga76b194? Wieder keiner!? :) So what basically happened was a stack corruption causing the return address to be bogus. This only happened because the kernel version of cfg80211.h (which is used to compile batman-adv) is different than the version in the mac80211 package (which is used at runtime) I have now synced that structure between the OpenWrt kernel and the used compat-wireless, rebuild my OpenWrt and tried again. I hope this helps anyone trying to use B.A.T.M.A.N. V on OpenWrt. @Felix, would it be ok for you when I propose a "*-sync-cfg80211-station_info.patch" for the 3.18 generic kernel patches? Or do you have a good idea how to force the openwrt-routing batman-adv package against the cfg80211.h of compat-wireless? Kind regards, Sven From: Sven Eckelmann Date: Thu, 21 Jan 2016 14:07:32 +0100 Subject: [PATCH] sync cfg80211 station_info batman-adv v2016.0 with B.A.T.M.A.N. V enabled will query the cfg80211 module for wireless station information. But the module is compiled against the OpenWrt kernel but will be with the cfg80211 module from the mac80211 package. The result is a stack corruption when the definition of these two headers are different. But the cfg80211.h from the kernel can be synced easily against the compat-wireless patch because it should not be used by the OpenWrt kernel. This problem happens for example with the kernel v3.18 and compat-wireless generated from 3.19 or later. The patch tries to avoid this by synching the structure against mac80211 2016-01-10. --- include/net/cfg80211.h | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index a2ddcf2..60c91cf 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -945,12 +945,14 @@ enum rate_info_flags { * @mcs: mcs index if struct describes a 802.11n bitrate * @legacy: bitrate in 100kbit/s for 802.11abg * @nss: number of streams (VHT only) + * @bw: bandwidth (from &enum rate_info_bw) */ struct rate_info { u8 flags; u8 mcs; u16 legacy; u8 nss; + u8 bw; }; /** @@ -984,6 +986,24 @@ struct sta_bss_parameters { u16 beacon_interval; }; +/** + * struct cfg80211_tid_stats - per-TID statistics + * @filled: bitmap of flags using the bits of &enum nl80211_tid_stats to + * indicate the relevant values in this struct are filled + * @rx_msdu: number of received MSDUs + * @tx_msdu: number of (attempted) transmitted MSDUs + * @tx_msdu_retries: number of retries (not counting the first) for + * transmitted MSDUs + * @tx_msdu_failed: number of failed transmitted MSDUs + */ +struct cfg80211_tid_stats { + u32 filled; + u64 rx_msdu; + u64 tx_msdu; + u64 tx_msdu_retries; + u64 tx_msdu_failed; +}; + #define IEEE80211_MAX_CHAINS 4 /** @@ -991,11 +1011,12 @@ struct sta_bss_parameters { * * Station information filled by driver for get_station() and dump_station. * - * @filled: bitflag of flags from &enum station_info_flags + * @filled: bitflag of flags using the bits of &enum nl80211_sta_info to + * indicate the relevant values in this struct for them * @connected_time: time(in secs) since a station is last connected * @inactive_time: time since last station activity (tx/rx) in milliseconds - * @rx_bytes: bytes received from this station - * @tx_bytes: bytes transmitted to this station + * @rx_bytes: bytes (size of MPDUs) received from this station + * @tx_bytes: bytes (size of MPDUs) transmitted to this station * @llid: mesh local link id * @plid: mesh peer link id * @plink_state: mesh peer link state @@ -1008,10 +1029,10 @@ struct sta_bss_parameters { * @chain_signal_avg: per-chain signal strength average in dBm * @txrate: current unicast bitrate from this station * @rxrate: current unicast bitrate to this station - * @rx_packets: packets received from this station - * @tx_packets: packets transmitted to this station - * @tx_retries: cumulative retry counts - * @tx_failed: number of failed transmissions (retries exceeded, no ACK) + * @rx_packets: packets (MSDUs & MMPDUs) received from this station + * @tx_packets: packets (MSDUs & MMPDUs) transmitted to this station + * @tx_retries: cumulative retry counts (MPDUs) + * @tx_failed: number of failed transmissions (MPDUs) (retries exceeded, no ACK) * @rx_dropped_misc: Dropped for un-specified reason. * @bss_param: current BSS parameters * @generation: generation number for nl80211 dumps. @@ -1031,6 +1052,11 @@ struct sta_bss_parameters { * @nonpeer_pm: non-peer mesh STA power save mode * @expected_throughput: expected throughput in kbps (including 802.11 headers) * towards this station. + * @rx_beacon: number of beacons received from this peer + * @rx_beacon_signal_avg: signal strength average (in dBm) for beacons received + * from this peer + * @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last + * (IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs. */ struct station_info { u32 filled; @@ -1071,10 +1097,9 @@ struct station_info { u32 expected_throughput; - /* - * Note: Add a new enum station_info_flags value for each new field and - * use it to check which fields are initialized. - */ + u64 rx_beacon; + u8 rx_beacon_signal_avg; + struct cfg80211_tid_stats pertid[IEEE80211_NUM_TIDS + 1]; }; /**