diff mbox

[v2,03/10] rtlwifi: Add sta_statistics of mac80211's op, and set filled=0 by default

Message ID 20180111070932.9929-4-pkshih@realtek.com (mailing list archive)
State Changes Requested
Delegated to: Kalle Valo
Headers show

Commit Message

Ping-Ke Shih Jan. 11, 2018, 7:09 a.m. UTC
From: Ping-Ke Shih <pkshih@realtek.com>

When using iwconfig to check wifi status, wext uses 'static struct' of
sinfo to get station info so sinfo->filled will be persistent. Since the
commit 2b9a7e1bac24 ("mac80211: allow drivers to provide most station
statistics") assumes driver initializes sinfo->filled to declare supported
fields, without initialization it will report wrong info. This commit
simply set 'filled' to be zero simply, and left sinfo to be filled by
mac80211.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/core.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

Larry Finger Jan. 15, 2018, 6:51 p.m. UTC | #1
On 01/11/2018 01:09 AM, pkshih@realtek.com wrote:
> From: Ping-Ke Shih <pkshih@realtek.com>
> 
> When using iwconfig to check wifi status, wext uses 'static struct' of
> sinfo to get station info so sinfo->filled will be persistent. Since the
> commit 2b9a7e1bac24 ("mac80211: allow drivers to provide most station
> statistics") assumes driver initializes sinfo->filled to declare supported
> fields, without initialization it will report wrong info. This commit
> simply set 'filled' to be zero simply, and left sinfo to be filled by
> mac80211.
> 
> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> ---
>   drivers/net/wireless/realtek/rtlwifi/core.c | 10 ++++++++++
>   1 file changed, 10 insertions(+)

Acked-by: Larry Finger <Larry.Finger@lwfinger.net>


> 
> diff --git a/drivers/net/wireless/realtek/rtlwifi/core.c b/drivers/net/wireless/realtek/rtlwifi/core.c
> index a78b828f531a..ec639fa8095e 100644
> --- a/drivers/net/wireless/realtek/rtlwifi/core.c
> +++ b/drivers/net/wireless/realtek/rtlwifi/core.c
> @@ -992,6 +992,15 @@ static int _rtl_get_hal_qnum(u16 queue)
>   	return qnum;
>   }
>   
> +static void rtl_op_sta_statistics(struct ieee80211_hw *hw,
> +				  struct ieee80211_vif *vif,
> +				  struct ieee80211_sta *sta,
> +				  struct station_info *sinfo)
> +{
> +	/* nothing filled by driver, so mac80211 will update all info */
> +	sinfo->filled = 0;
> +}
> +
>   /*
>    *for mac80211 VO = 0, VI = 1, BE = 2, BK = 3
>    *for rtl819x  BE = 0, BK = 1, VI = 2, VO = 3
> @@ -1878,6 +1887,7 @@ const struct ieee80211_ops rtl_ops = {
>   	.config = rtl_op_config,
>   	.configure_filter = rtl_op_configure_filter,
>   	.set_key = rtl_op_set_key,
> +	.sta_statistics = rtl_op_sta_statistics,
>   	.conf_tx = rtl_op_conf_tx,
>   	.bss_info_changed = rtl_op_bss_info_changed,
>   	.get_tsf = rtl_op_get_tsf,
>
Kalle Valo Jan. 16, 2018, 3:42 p.m. UTC | #2
<pkshih@realtek.com> writes:

> From: Ping-Ke Shih <pkshih@realtek.com>
>
> When using iwconfig to check wifi status, wext uses 'static struct' of
> sinfo to get station info so sinfo->filled will be persistent. Since the
> commit 2b9a7e1bac24 ("mac80211: allow drivers to provide most station
> statistics") assumes driver initializes sinfo->filled to declare supported
> fields, without initialization it will report wrong info. This commit
> simply set 'filled' to be zero simply, and left sinfo to be filled by
> mac80211.
>
> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> ---
>  drivers/net/wireless/realtek/rtlwifi/core.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/drivers/net/wireless/realtek/rtlwifi/core.c b/drivers/net/wireless/realtek/rtlwifi/core.c
> index a78b828f531a..ec639fa8095e 100644
> --- a/drivers/net/wireless/realtek/rtlwifi/core.c
> +++ b/drivers/net/wireless/realtek/rtlwifi/core.c
> @@ -992,6 +992,15 @@ static int _rtl_get_hal_qnum(u16 queue)
>  	return qnum;
>  }
>  
> +static void rtl_op_sta_statistics(struct ieee80211_hw *hw,
> +				  struct ieee80211_vif *vif,
> +				  struct ieee80211_sta *sta,
> +				  struct station_info *sinfo)
> +{
> +	/* nothing filled by driver, so mac80211 will update all info */
> +	sinfo->filled = 0;
> +}
> +
>  /*
>   *for mac80211 VO = 0, VI = 1, BE = 2, BK = 3
>   *for rtl819x  BE = 0, BK = 1, VI = 2, VO = 3
> @@ -1878,6 +1887,7 @@ const struct ieee80211_ops rtl_ops = {
>  	.config = rtl_op_config,
>  	.configure_filter = rtl_op_configure_filter,
>  	.set_key = rtl_op_set_key,
> +	.sta_statistics = rtl_op_sta_statistics,

Adding an empty op like that feels pointless, IMHO (but without checking
mac80211 sources) not having the op should be the same as filled = 0. To
me this smells like a bug in mac80211.

Johannes, what do you think?
Johannes Berg Jan. 16, 2018, 10:06 p.m. UTC | #3
On Tue, 2018-01-16 at 17:42 +0200, Kalle Valo wrote:

> > When using iwconfig to check wifi status, wext uses 'static struct' of
> > sinfo to get station info so sinfo->filled will be persistent. Since the
> > commit 2b9a7e1bac24 ("mac80211: allow drivers to provide most station
> > statistics") assumes driver initializes sinfo->filled to declare supported
> > fields, without initialization it will report wrong info. This commit
> > simply set 'filled' to be zero simply, and left sinfo to be filled by
> > mac80211.

Huh, this can't be right.

> Adding an empty op like that feels pointless, IMHO (but without checking
> mac80211 sources) not having the op should be the same as filled = 0. To
> me this smells like a bug in mac80211.
> 
> Johannes, what do you think?

It can't be right. It would've broken each and every driver out there,
other than the one or two who implement this.

However, it looks like PK is actually correct - *wext* does appear to
be broken! nl80211 does this:

                memset(&sinfo, 0, sizeof(sinfo));
                err = rdev_dump_station(rdev, wdev->netdev, sta_idx,
                                        mac_addr, &sinfo);


and

        memset(&sinfo, 0, sizeof(sinfo));

...

        err = rdev_get_station(rdev, dev, mac_addr, &sinfo);

and has a bug in cfg80211_cqm_rssi_update(). Wext also has bugs, I'll
send out a fix.

johannes
diff mbox

Patch

diff --git a/drivers/net/wireless/realtek/rtlwifi/core.c b/drivers/net/wireless/realtek/rtlwifi/core.c
index a78b828f531a..ec639fa8095e 100644
--- a/drivers/net/wireless/realtek/rtlwifi/core.c
+++ b/drivers/net/wireless/realtek/rtlwifi/core.c
@@ -992,6 +992,15 @@  static int _rtl_get_hal_qnum(u16 queue)
 	return qnum;
 }
 
+static void rtl_op_sta_statistics(struct ieee80211_hw *hw,
+				  struct ieee80211_vif *vif,
+				  struct ieee80211_sta *sta,
+				  struct station_info *sinfo)
+{
+	/* nothing filled by driver, so mac80211 will update all info */
+	sinfo->filled = 0;
+}
+
 /*
  *for mac80211 VO = 0, VI = 1, BE = 2, BK = 3
  *for rtl819x  BE = 0, BK = 1, VI = 2, VO = 3
@@ -1878,6 +1887,7 @@  const struct ieee80211_ops rtl_ops = {
 	.config = rtl_op_config,
 	.configure_filter = rtl_op_configure_filter,
 	.set_key = rtl_op_set_key,
+	.sta_statistics = rtl_op_sta_statistics,
 	.conf_tx = rtl_op_conf_tx,
 	.bss_info_changed = rtl_op_bss_info_changed,
 	.get_tsf = rtl_op_get_tsf,