mac80211: configure default wmm params correctly
PATCH 1/1 mac80211: configure default wmm params correctly
Default WMM params have to be set according to beacon/probe response information prior to authentication (or IBSS start/join). This does not affect the use of 'real' WMM params as reported by AP.
---
net/mac80211/ieee80211_sta.c +55 -32
@@ -220,6 +220,58 @@ static int ecw2cw(int ecw)return (1 << ecw) -1 ; } + +static void ieee80211_sta_def_wmm_params (struct net_device *dev, +struct ieee80211_sta_bss *bss) +{ +struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local = sdata->local; +int i, have_higher_than_11mbit =0 ; + + +/* cf. IEEE 802.11 9.2.12 */ +for (i =0 ; i < bss->supp_rates_len; i++) +if ((bss->supp_rates[i] &0x7f ) *5 >110 ) + have_higher_than_11mbit =1 ; + +if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && + have_higher_than_11mbit) + sdata->flags |=IEEE80211_SDATA_OPERATING_GMODE ; +else + sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE ; + + +if (local->ops->conf_tx) { +struct ieee80211_tx_queue_params qparam; +int i; + +memset (&qparam,0 ,sizeof (qparam)); + + qparam.aifs =2 ; + +if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && + !(sdata->flags &IEEE80211_SDATA_OPERATING_GMODE )) + qparam.cw_min =31 ; +else + qparam.cw_min =15 ; + + qparam.cw_max =1023 ; + qparam.txop =0 ; + +for (i =IEEE80211_TX_QUEUE_DATA0 ; i <NUM_TX_DATA_QUEUES ; i++) + local->ops->conf_tx (local_to_hw (local), + i +IEEE80211_TX_QUEUE_DATA0 , + &qparam); + +/* IBSS uses different parameters for Beacon sending */ + qparam.cw_min++; + qparam.cw_min *=2 ; + qparam.cw_min--; + local->ops->conf_tx (local_to_hw (local), +IEEE80211_TX_QUEUE_BEACON , &qparam); + } +} +static void ieee80211_sta_wmm_params (struct net_device *dev,struct ieee80211_if_sta *ifsta,u8 *wmm_param,size_t wmm_param_len)
@@ -2289,6 +2341,8 @@ static int ieee80211_sta_join_ibss(struct net_device *dev, rates |=BIT (j); } ifsta->supp_rates_bits[local->hw.conf.channel->band] = rates; + +ieee80211_sta_def_wmm_params (dev, bss); }while (0 );if (skb) {
@@ -3274,6 +3328,7 @@ static int ieee80211_sta_config_auth(struct net_device *dev,ieee80211_sta_set_ssid (dev, selected->ssid, selected->ssid_len);ieee80211_sta_set_bssid (dev, selected->bssid); +ieee80211_sta_def_wmm_params (dev, selected);ieee80211_rx_bss_put (dev, selected); ifsta->state =IEEE80211_AUTHENTICATE ;ieee80211_sta_reset_auth (dev, ifsta);
@@ -3453,38 +3508,6 @@ int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len)if (len >IEEE80211_MAX_SSID_LEN )return -EINVAL ; -/* TODO: This should always be done for IBSS, even if IEEE80211_QOS is -* not defined. */ -if (local->ops->conf_tx) { -struct ieee80211_tx_queue_params qparam; -int i; - -memset (&qparam,0 ,sizeof (qparam)); - - qparam.aifs =2 ; - -if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && - !(sdata->flags &IEEE80211_SDATA_OPERATING_GMODE )) - qparam.cw_min =31 ; -else - qparam.cw_min =15 ; - - qparam.cw_max =1023 ; - qparam.txop =0 ; - -for (i =IEEE80211_TX_QUEUE_DATA0 ; i <NUM_TX_DATA_QUEUES ; i++) - local->ops->conf_tx (local_to_hw (local), - i +IEEE80211_TX_QUEUE_DATA0 , - &qparam); - -/* IBSS uses different parameters for Beacon sending */ - qparam.cw_min++; - qparam.cw_min *=2 ; - qparam.cw_min--; - local->ops->conf_tx (local_to_hw (local), -IEEE80211_TX_QUEUE_BEACON , &qparam); - } - ifsta = &sdata->u.sta;if (ifsta->ssid_len != len ||memcmp (ifsta->ssid, ssid, len) !=0 )
Johannes Berg
maintainerQuoted 5 lines · Vladimir Koutny
Default WMM params have to be set according to beacon/probe response information prior to authentication (or IBSS start/join). This does not affect the use of 'real' WMM params as reported by AP.
Signed-off-by Vladimir Koutny <[email protected]>
Looks ok, but
Review
Quoted 1 line
(quoted diff) +1
-0+
There is lots of trailing whitespace (use scripts/checkpatch.pl)
net/mac80211/ieee80211_sta.c static int ecw2cw(int ecw) · line 238
Quoted 2 lines
net/mac80211/ieee80211_sta.c +2
-0+if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && + have_higher_than_11mbit)
and that really needs to be indented differently.
net/mac80211/ieee80211_sta.c static int ecw2cw(int ecw) · line 271
Quoted 6 lines
net/mac80211/ieee80211_sta.c +6
-0+/* IBSS uses different parameters for Beacon sending */ + qparam.cw_min++; + qparam.cw_min *=2 ; + qparam.cw_min--; + local->ops->conf_tx (local_to_hw (local), +IEEE80211_TX_QUEUE_BEACON , &qparam);
And shouldn't we do that only for IBSS? I'm in favour of removing it completely, however, since the beacon queue is a way to construct hardware, not do things in software...
johannes
Quoted 8 lines
There is lots of trailing whitespace (use
scripts/checkpatch.pl)net/mac80211/ieee80211_sta.c static int ecw2cw(int ecw) · line 238
Quoted 2 lines
net/mac80211/ieee80211_sta.c +2
-0+if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && + have_higher_than_11mbit)and that really needs to be indented differently.
Oops, sorry for that :(
Quoted 10 lines
net/mac80211/ieee80211_sta.c static int ecw2cw(int ecw) · line 271
Quoted 6 lines
net/mac80211/ieee80211_sta.c +6
-0+/* IBSS uses different parameters for Beacon sending */ + qparam.cw_min++; + qparam.cw_min *=2 ; + qparam.cw_min--; + local->ops->conf_tx (local_to_hw (local), +IEEE80211_TX_QUEUE_BEACON , &qparam);And shouldn't we do that only for IBSS? I'm in favour of removing it completely, however, since the beacon queue is a way to construct hardware, not do things in software...
Good question; I've just moved this part of code out of ieee80211_sta_set_ssid as that is not the best place for it. I don't object to removing that code completely; seems that noone uses IEEE80211_TX_QUEUE_BEACON anyway. On the other hand, it can be a good hint for those implementing beaconing on hw where it has to be set explicitly..
Vlado
Johannes Berg
maintainerQuoted 12 lines
Quoted 11 lines
net/mac80211/ieee80211_sta.c static int ecw2cw(int ecw) · line 271
Quoted 7 lines
net/mac80211/ieee80211_sta.c +6
-0+/* IBSS uses different parameters for Beacon sending */ + qparam.cw_min++; + qparam.cw_min *=2 ; + qparam.cw_min--; + local->ops->conf_tx (local_to_hw (local), +IEEE80211_TX_QUEUE_BEACON , &qparam);And shouldn't we do that only for IBSS? I'm in favour of removing it completely, however, since the beacon queue is a way to construct hardware, not do things in software...
Quoted 6 lines
Good question; I've just moved this part of code out of
ieee80211_sta_set_ssidas that is not the best place for it. I don't object to removing that code completely; seems that noone usesIEEE80211_TX_QUEUE_BEACONanyway. On the other hand, it can be a good hint for those implementing beaconing on hw where it has to be set explicitly..
I disagree with the latter part, but let's just leave it for now, I think my QoS patch (the one Ron is adopting) will kill it anyway.
johannes
PATCH v2 1/1 mac80211: configure default wmm params correctly
Default WMM params have to be set according to beacon/probe response information prior to authentication (or IBSS start/join); beacon queue is configured only in IBSS. This does not affect the use of 'real' WMM params as reported by AP.
---
net/mac80211/ieee80211_sta.c +58 -33
@@ -220,6 +220,61 @@ static int ecw2cw(int ecw)return (1 << ecw) -1 ; } + +static void ieee80211_sta_def_wmm_params (struct net_device *dev, +struct ieee80211_sta_bss *bss, +int ibss) +{ +struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local = sdata->local; +int i, have_higher_than_11mbit =0 ; + + +/* cf. IEEE 802.11 9.2.12 */ +for (i =0 ; i < bss->supp_rates_len; i++) +if ((bss->supp_rates[i] &0x7f ) *5 >110 ) + have_higher_than_11mbit =1 ; + +if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && + have_higher_than_11mbit) + sdata->flags |=IEEE80211_SDATA_OPERATING_GMODE ; +else + sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE ; + + +if (local->ops->conf_tx) { +struct ieee80211_tx_queue_params qparam; +int i; + +memset (&qparam,0 ,sizeof (qparam)); + + qparam.aifs =2 ; + +if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && + !(sdata->flags &IEEE80211_SDATA_OPERATING_GMODE )) + qparam.cw_min =31 ; +else + qparam.cw_min =15 ; + + qparam.cw_max =1023 ; + qparam.txop =0 ; + +for (i =IEEE80211_TX_QUEUE_DATA0 ; i <NUM_TX_DATA_QUEUES ; i++) + local->ops->conf_tx (local_to_hw (local), + i +IEEE80211_TX_QUEUE_DATA0 , + &qparam); + +if (ibss) { +/* IBSS uses different parameters for Beacon sending */ + qparam.cw_min++; + qparam.cw_min *=2 ; + qparam.cw_min--; + local->ops->conf_tx (local_to_hw (local), +IEEE80211_TX_QUEUE_BEACON , &qparam); + } + } +} +static void ieee80211_sta_wmm_params (struct net_device *dev,struct ieee80211_if_sta *ifsta,u8 *wmm_param,size_t wmm_param_len)
@@ -2289,6 +2344,8 @@ static int ieee80211_sta_join_ibss(struct net_device *dev, rates |=BIT (j); } ifsta->supp_rates_bits[local->hw.conf.channel->band] = rates; + +ieee80211_sta_def_wmm_params (dev, bss,1 ); }while (0 );if (skb) {
@@ -3274,6 +3331,7 @@ static int ieee80211_sta_config_auth(struct net_device *dev,ieee80211_sta_set_ssid (dev, selected->ssid, selected->ssid_len);ieee80211_sta_set_bssid (dev, selected->bssid); +ieee80211_sta_def_wmm_params (dev, selected,0 );ieee80211_rx_bss_put (dev, selected); ifsta->state =IEEE80211_AUTHENTICATE ;ieee80211_sta_reset_auth (dev, ifsta);
@@ -3448,43 +3506,10 @@ int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len) {struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev);struct ieee80211_if_sta *ifsta; -struct ieee80211_local *local =wdev_priv (dev->ieee80211_ptr);if (len >IEEE80211_MAX_SSID_LEN )return -EINVAL ; -/* TODO: This should always be done for IBSS, even if IEEE80211_QOS is -* not defined. */ -if (local->ops->conf_tx) { -struct ieee80211_tx_queue_params qparam; -int i; - -memset (&qparam,0 ,sizeof (qparam)); - - qparam.aifs =2 ; - -if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && - !(sdata->flags &IEEE80211_SDATA_OPERATING_GMODE )) - qparam.cw_min =31 ; -else - qparam.cw_min =15 ; - - qparam.cw_max =1023 ; - qparam.txop =0 ; - -for (i =IEEE80211_TX_QUEUE_DATA0 ; i <NUM_TX_DATA_QUEUES ; i++) - local->ops->conf_tx (local_to_hw (local), - i +IEEE80211_TX_QUEUE_DATA0 , - &qparam); - -/* IBSS uses different parameters for Beacon sending */ - qparam.cw_min++; - qparam.cw_min *=2 ; - qparam.cw_min--; - local->ops->conf_tx (local_to_hw (local), -IEEE80211_TX_QUEUE_BEACON , &qparam); - } - ifsta = &sdata->u.sta;if (ifsta->ssid_len != len ||memcmp (ifsta->ssid, ssid, len) !=0 )
Johannes Berg
maintainernet/mac80211/ieee80211_sta.c static int ecw2cw(int ecw) · line 240
Quoted 4 lines
net/mac80211/ieee80211_sta.c +3
-0+if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && + have_higher_than_11mbit) + sdata->flags |=IEEE80211_SDATA_OPERATING_GMODE ;
I don't know what CodingStyle says, but I very much prefer
if (local->hw..... &&
have_higher_than_11mbit) sdata->flags |= ...
since that visually puts the continuation of the condition together with the start of it. Mind changing that?
johannes
Quoted 8 lines
I don't know what CodingStyle says, but I very much prefer
if (
local->hw..... &&have_higher_than_11mbit) sdata->flags |= ...since that visually puts the continuation of the condition together with the start of it. Mind changing that?
No problem (and better don't ask what CodingStyle thinks about spaces..) Here we go:
---
Default WMM params have to be set according to beacon/probe response information prior to authentication (or IBSS start/join); beacon queue is configured only in IBSS. This does not affect the use of 'real' WMM params as reported by AP.
---
net/mac80211/ieee80211_sta.c +58 -33
@@ -220,6 +220,61 @@ static int ecw2cw(int ecw)return (1 << ecw) -1 ; } + +static void ieee80211_sta_def_wmm_params (struct net_device *dev, +struct ieee80211_sta_bss *bss, +int ibss) +{ +struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local = sdata->local; +int i, have_higher_than_11mbit =0 ; + + +/* cf. IEEE 802.11 9.2.12 */ +for (i =0 ; i < bss->supp_rates_len; i++) +if ((bss->supp_rates[i] &0x7f ) *5 >110 ) + have_higher_than_11mbit =1 ; + +if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && + have_higher_than_11mbit) + sdata->flags |=IEEE80211_SDATA_OPERATING_GMODE ; +else + sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE ; + + +if (local->ops->conf_tx) { +struct ieee80211_tx_queue_params qparam; +int i; + +memset (&qparam,0 ,sizeof (qparam)); + + qparam.aifs =2 ; + +if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && + !(sdata->flags &IEEE80211_SDATA_OPERATING_GMODE )) + qparam.cw_min =31 ; +else + qparam.cw_min =15 ; + + qparam.cw_max =1023 ; + qparam.txop =0 ; + +for (i =IEEE80211_TX_QUEUE_DATA0 ; i <NUM_TX_DATA_QUEUES ; i++) + local->ops->conf_tx (local_to_hw (local), + i +IEEE80211_TX_QUEUE_DATA0 , + &qparam); + +if (ibss) { +/* IBSS uses different parameters for Beacon sending */ + qparam.cw_min++; + qparam.cw_min *=2 ; + qparam.cw_min--; + local->ops->conf_tx (local_to_hw (local), +IEEE80211_TX_QUEUE_BEACON , &qparam); + } + } +} +static void ieee80211_sta_wmm_params (struct net_device *dev,struct ieee80211_if_sta *ifsta,u8 *wmm_param,size_t wmm_param_len)
@@ -2289,6 +2344,8 @@ static int ieee80211_sta_join_ibss(struct net_device *dev, rates |=BIT (j); } ifsta->supp_rates_bits[local->hw.conf.channel->band] = rates; + +ieee80211_sta_def_wmm_params (dev, bss,1 ); }while (0 );if (skb) {
@@ -3274,6 +3331,7 @@ static int ieee80211_sta_config_auth(struct net_device *dev,ieee80211_sta_set_ssid (dev, selected->ssid, selected->ssid_len);ieee80211_sta_set_bssid (dev, selected->bssid); +ieee80211_sta_def_wmm_params (dev, selected,0 );ieee80211_rx_bss_put (dev, selected); ifsta->state =IEEE80211_AUTHENTICATE ;ieee80211_sta_reset_auth (dev, ifsta);
@@ -3448,43 +3506,10 @@ int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len) {struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev);struct ieee80211_if_sta *ifsta; -struct ieee80211_local *local =wdev_priv (dev->ieee80211_ptr);if (len >IEEE80211_MAX_SSID_LEN )return -EINVAL ; -/* TODO: This should always be done for IBSS, even if IEEE80211_QOS is -* not defined. */ -if (local->ops->conf_tx) { -struct ieee80211_tx_queue_params qparam; -int i; - -memset (&qparam,0 ,sizeof (qparam)); - - qparam.aifs =2 ; - -if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && - !(sdata->flags &IEEE80211_SDATA_OPERATING_GMODE )) - qparam.cw_min =31 ; -else - qparam.cw_min =15 ; - - qparam.cw_max =1023 ; - qparam.txop =0 ; - -for (i =IEEE80211_TX_QUEUE_DATA0 ; i <NUM_TX_DATA_QUEUES ; i++) - local->ops->conf_tx (local_to_hw (local), - i +IEEE80211_TX_QUEUE_DATA0 , - &qparam); - -/* IBSS uses different parameters for Beacon sending */ - qparam.cw_min++; - qparam.cw_min *=2 ; - qparam.cw_min--; - local->ops->conf_tx (local_to_hw (local), -IEEE80211_TX_QUEUE_BEACON , &qparam); - } - ifsta = &sdata->u.sta;if (ifsta->ssid_len != len ||memcmp (ifsta->ssid, ssid, len) !=0 )
Quoted 10 lines · Vladimir Koutny
Quoted 8 lines
I don't know what CodingStyle says, but I very much prefer
if (
local->hw..... &&have_higher_than_11mbit) sdata->flags |= ...since that visually puts the continuation of the condition together with the start of it. Mind changing that?
No problem (and better don't ask what CodingStyle thinks about spaces..) Here we go:
Thanks.
Quoted 7 lines
---
Default WMM params have to be set according to beacon/probe response information prior to authentication (or IBSS start/join); beacon queue is configured only in IBSS. This does not affect the use of 'real' WMM params as reported by AP.Signed-off-by Vladimir Koutny <[email protected]>
Quoted 129 lines
---
net/mac80211/ieee80211_sta.c +58
-33@@ -220,6 +220,61 @@ static int ecw2cw(int ecw)return (1 << ecw) -1 ; } + +static void ieee80211_sta_def_wmm_params (struct net_device *dev, +struct ieee80211_sta_bss *bss, +int ibss) +{ +struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local = sdata->local; +int i, have_higher_than_11mbit =0 ; + + +/* cf. IEEE 802.11 9.2.12 */ +for (i =0 ; i < bss->supp_rates_len; i++) +if ((bss->supp_rates[i] &0x7f ) *5 >110 ) + have_higher_than_11mbit =1 ; + +if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && + have_higher_than_11mbit) + sdata->flags |=IEEE80211_SDATA_OPERATING_GMODE ; +else + sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE ; + + +if (local->ops->conf_tx) { +struct ieee80211_tx_queue_params qparam; +int i; + +memset (&qparam,0 ,sizeof (qparam)); + + qparam.aifs =2 ; + +if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && + !(sdata->flags &IEEE80211_SDATA_OPERATING_GMODE )) + qparam.cw_min =31 ; +else + qparam.cw_min =15 ; + + qparam.cw_max =1023 ; + qparam.txop =0 ; + +for (i =IEEE80211_TX_QUEUE_DATA0 ; i <NUM_TX_DATA_QUEUES ; i++) + local->ops->conf_tx (local_to_hw (local), + i +IEEE80211_TX_QUEUE_DATA0 , + &qparam); + +if (ibss) { +/* IBSS uses different parameters for Beacon sending */ + qparam.cw_min++; + qparam.cw_min *=2 ; + qparam.cw_min--; + local->ops->conf_tx (local_to_hw (local), +IEEE80211_TX_QUEUE_BEACON , &qparam); + } + } +} +static void ieee80211_sta_wmm_params (struct net_device *dev,struct ieee80211_if_sta *ifsta,u8 *wmm_param,size_t wmm_param_len)@@ -2289,6 +2344,8 @@ static int ieee80211_sta_join_ibss(struct net_device *dev, rates |=BIT (j); } ifsta->supp_rates_bits[local->hw.conf.channel->band] = rates; + +ieee80211_sta_def_wmm_params (dev, bss,1 ); }while (0 );if (skb) {@@ -3274,6 +3331,7 @@ static int ieee80211_sta_config_auth(struct net_device *dev,ieee80211_sta_set_ssid (dev, selected->ssid, selected->ssid_len);ieee80211_sta_set_bssid (dev, selected->bssid); +ieee80211_sta_def_wmm_params (dev, selected,0 );ieee80211_rx_bss_put (dev, selected); ifsta->state =IEEE80211_AUTHENTICATE ;ieee80211_sta_reset_auth (dev, ifsta);@@ -3448,43 +3506,10 @@ int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len) {struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev);struct ieee80211_if_sta *ifsta; -struct ieee80211_local *local =wdev_priv (dev->ieee80211_ptr);if (len >IEEE80211_MAX_SSID_LEN )return -EINVAL ; -/* TODO: This should always be done for IBSS, even if IEEE80211_QOS is -* not defined. */ -if (local->ops->conf_tx) { -struct ieee80211_tx_queue_params qparam; -int i; - -memset (&qparam,0 ,sizeof (qparam)); - - qparam.aifs =2 ; - -if (local->hw.conf.channel->band ==IEEE80211_BAND_2GHZ && - !(sdata->flags &IEEE80211_SDATA_OPERATING_GMODE )) - qparam.cw_min =31 ; -else - qparam.cw_min =15 ; - - qparam.cw_max =1023 ; - qparam.txop =0 ; - -for (i =IEEE80211_TX_QUEUE_DATA0 ; i <NUM_TX_DATA_QUEUES ; i++) - local->ops->conf_tx (local_to_hw (local), - i +IEEE80211_TX_QUEUE_DATA0 , - &qparam); - -/* IBSS uses different parameters for Beacon sending */ - qparam.cw_min++; - qparam.cw_min *=2 ; - qparam.cw_min--; - local->ops->conf_tx (local_to_hw (local), -IEEE80211_TX_QUEUE_BEACON , &qparam); - } - ifsta = &sdata->u.sta;if (ifsta->ssid_len != len ||memcmp (ifsta->ssid, ssid, len) !=0 )