2016-08-05 04:35:34

by Purushottam Kushwaha

[permalink] [raw]
Subject: [PATCH] cfg80211: Add support for user configurable beacon data rate

This will allow user to configure beacon tx rate (u8) from userspace.

Signed-off-by: Purushottam Kushwaha <[email protected]>
---
include/net/cfg80211.h | 25 +++++++++++---------
net/wireless/nl80211.c | 62 +++++++++++++++++++++++++++++++++-----------------
2 files changed, 55 insertions(+), 32 deletions(-)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 9c23f4d3..dd900de 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -676,6 +676,18 @@ struct cfg80211_acl_data {
struct mac_address mac_addrs[];
};

+/*
+ * cfg80211_bitrate_mask - masks for bitrate control
+ */
+struct cfg80211_bitrate_mask {
+ struct {
+ u32 legacy;
+ u8 ht_mcs[IEEE80211_HT_MCS_MASK_LEN];
+ u16 vht_mcs[NL80211_VHT_NSS_MAX];
+ enum nl80211_txrate_gi gi;
+ } control[NUM_NL80211_BANDS];
+};
+
/**
* struct cfg80211_ap_settings - AP configuration
*
@@ -700,6 +712,7 @@ struct cfg80211_acl_data {
* MAC address based access control
* @pbss: If set, start as a PCP instead of AP. Relevant for DMG
* networks.
+ * @beacon_rate: masks for setting user configured beacon tx rate.
*/
struct cfg80211_ap_settings {
struct cfg80211_chan_def chandef;
@@ -719,6 +732,7 @@ struct cfg80211_ap_settings {
bool p2p_opp_ps;
const struct cfg80211_acl_data *acl;
bool pbss;
+ struct cfg80211_bitrate_mask beacon_rate;
};

/**
@@ -2001,17 +2015,6 @@ enum wiphy_params_flags {
WIPHY_PARAM_DYN_ACK = 1 << 5,
};

-/*
- * cfg80211_bitrate_mask - masks for bitrate control
- */
-struct cfg80211_bitrate_mask {
- struct {
- u32 legacy;
- u8 ht_mcs[IEEE80211_HT_MCS_MASK_LEN];
- u16 vht_mcs[NL80211_VHT_NSS_MAX];
- enum nl80211_txrate_gi gi;
- } control[NUM_NL80211_BANDS];
-};
/**
* struct cfg80211_pmksa - PMK Security Association
*
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 46417f9..53e7bf5 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -36,6 +36,8 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
struct genl_info *info);
static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
struct genl_info *info);
+static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
+ struct cfg80211_bitrate_mask *mask);

/* the netlink family */
static struct genl_family nl80211_fam = {
@@ -3457,6 +3459,11 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
err = cfg80211_validate_beacon_int(rdev, params.beacon_interval);
if (err)
return err;
+ if (info->attrs[NL80211_ATTR_TX_RATES]) {
+ err = nl80211_parse_tx_bitrate_mask(info, &params.beacon_rate);
+ if (err)
+ return err;
+ }

/*
* In theory, some of these attributes should be required here
@@ -8696,22 +8703,17 @@ static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
[NL80211_TXRATE_GI] = { .type = NLA_U8 },
};

-static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
- struct genl_info *info)
+static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
+ struct cfg80211_bitrate_mask *mask)
{
struct nlattr *tb[NL80211_TXRATE_MAX + 1];
struct cfg80211_registered_device *rdev = info->user_ptr[0];
- struct cfg80211_bitrate_mask mask;
int rem, i;
- struct net_device *dev = info->user_ptr[1];
struct nlattr *tx_rates;
struct ieee80211_supported_band *sband;
u16 vht_tx_mcs_map;

- if (!rdev->ops->set_bitrate_mask)
- return -EOPNOTSUPP;
-
- memset(&mask, 0, sizeof(mask));
+ memset(mask, 0, sizeof(*mask));
/* Default to all rates enabled */
for (i = 0; i < NUM_NL80211_BANDS; i++) {
sband = rdev->wiphy.bands[i];
@@ -8719,16 +8721,16 @@ static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
if (!sband)
continue;

- mask.control[i].legacy = (1 << sband->n_bitrates) - 1;
- memcpy(mask.control[i].ht_mcs,
+ mask->control[i].legacy = (1 << sband->n_bitrates) - 1;
+ memcpy(mask->control[i].ht_mcs,
sband->ht_cap.mcs.rx_mask,
- sizeof(mask.control[i].ht_mcs));
+ sizeof(mask->control[i].ht_mcs));

if (!sband->vht_cap.vht_supported)
continue;

vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
- vht_build_mcs_mask(vht_tx_mcs_map, mask.control[i].vht_mcs);
+ vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs);
}

/* if no rates are given set it back to the defaults */
@@ -8754,11 +8756,11 @@ static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
if (err)
return err;
if (tb[NL80211_TXRATE_LEGACY]) {
- mask.control[band].legacy = rateset_to_mask(
+ mask->control[band].legacy = rateset_to_mask(
sband,
nla_data(tb[NL80211_TXRATE_LEGACY]),
nla_len(tb[NL80211_TXRATE_LEGACY]));
- if ((mask.control[band].legacy == 0) &&
+ if ((mask->control[band].legacy == 0) &&
nla_len(tb[NL80211_TXRATE_LEGACY]))
return -EINVAL;
}
@@ -8767,24 +8769,24 @@ static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
sband,
nla_data(tb[NL80211_TXRATE_HT]),
nla_len(tb[NL80211_TXRATE_HT]),
- mask.control[band].ht_mcs))
+ mask->control[band].ht_mcs))
return -EINVAL;
}
if (tb[NL80211_TXRATE_VHT]) {
if (!vht_set_mcs_mask(
sband,
nla_data(tb[NL80211_TXRATE_VHT]),
- mask.control[band].vht_mcs))
+ mask->control[band].vht_mcs))
return -EINVAL;
}
if (tb[NL80211_TXRATE_GI]) {
- mask.control[band].gi =
+ mask->control[band].gi =
nla_get_u8(tb[NL80211_TXRATE_GI]);
- if (mask.control[band].gi > NL80211_TXRATE_FORCE_LGI)
+ if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI)
return -EINVAL;
}

- if (mask.control[band].legacy == 0) {
+ if (mask->control[band].legacy == 0) {
/* don't allow empty legacy rates if HT or VHT
* are not even supported.
*/
@@ -8793,11 +8795,11 @@ static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
return -EINVAL;

for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
- if (mask.control[band].ht_mcs[i])
+ if (mask->control[band].ht_mcs[i])
goto out;

for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
- if (mask.control[band].vht_mcs[i])
+ if (mask->control[band].vht_mcs[i])
goto out;

/* legacy and mcs rates may not be both empty */
@@ -8806,6 +8808,24 @@ static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
}

out:
+ return 0;
+}
+
+static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
+ struct genl_info *info)
+{
+ struct cfg80211_bitrate_mask mask;
+ struct cfg80211_registered_device *rdev = info->user_ptr[0];
+ struct net_device *dev = info->user_ptr[1];
+ int err;
+
+ if (!rdev->ops->set_bitrate_mask)
+ return -EOPNOTSUPP;
+
+ err = nl80211_parse_tx_bitrate_mask(info, &mask);
+ if (err)
+ return err;
+
return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
}

--
1.9.1



2016-08-05 09:03:12

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH] cfg80211: Add support for user configurable beacon data rate

On Fri, 2016-08-05 at 10:05 +0530, Purushottam Kushwaha wrote:

> +static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
> +  struct cfg80211_bitrate_mask *mask);

I think you should move the function instead.

> @@ -3457,6 +3459,11 @@ static int nl80211_start_ap(struct sk_buff
> *skb, struct genl_info *info)
>   err = cfg80211_validate_beacon_int(rdev,
> params.beacon_interval);
>   if (err)
>   return err;
> + if (info->attrs[NL80211_ATTR_TX_RATES]) {
> + err = nl80211_parse_tx_bitrate_mask(info,
> &params.beacon_rate);
> + if (err)
> + return err;
> + }

Doesn't this have to check that it actually got information for the
right band?

johannes

2016-08-06 21:44:02

by Sunil Dutt Undekari

[permalink] [raw]
Subject: RE: [PATCH] cfg80211: Add support for user configurable beacon data rate

PiBEb2Vzbid0IHRoaXMgaGF2ZSB0byBjaGVjayB0aGF0IGl0IGFjdHVhbGx5IGdvdCBpbmZvcm1h
dGlvbiBmb3IgdGhlIHJpZ2h0IGJhbmQ/DQpIaSBKb2hhbm5lcyAsDQpubDgwMjExX3BhcnNlX3R4
X2JpdHJhdGVfbWFzayAoIGEgbmV3IHdyYXBwZXIgdG8gdGhlIGV4aXN0aW5nIGZ1bmN0aW9uYWxp
dHkgaW4gbmw4MDIxMV9zZXRfdHhfYml0cmF0ZV9tYXNrICkgZG9lcyB0aGlzICwgaXNuJ3QgPyAN
Cg0KUmVnYXJkcywNClN1bmlsDQoNCg0KDQotLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KRnJv
bTogSm9oYW5uZXMgQmVyZyBbbWFpbHRvOmpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXRdIA0KU2Vu
dDogRnJpZGF5LCBBdWd1c3QgNSwgMjAxNiAyOjMzIFBNDQpUbzogS3VzaHdhaGEsIFB1cnVzaG90
dGFtIDxwa3VzaHdhaEBxdGkucXVhbGNvbW0uY29tPg0KQ2M6IGxpbnV4LXdpcmVsZXNzQHZnZXIu
a2VybmVsLm9yZzsgTWFsaW5lbiwgSm91bmkgPGpvdW5pQHFjYS5xdWFsY29tbS5jb20+OyBVbmRl
a2FyaSwgU3VuaWwgRHV0dCA8dXNkdXR0QHF0aS5xdWFsY29tbS5jb20+OyBLb25kYWJhdHRpbmks
IEdhbmVzaCA8Z2FuZXNoa0BxdGkucXVhbGNvbW0uY29tPjsgS2FsaWtvdCBWZWV0aWwsIE1haGVz
aCBLdW1hciA8bWthbGlrb3RAcWNhLnF1YWxjb21tLmNvbT47IEh1bGx1ciBTdWJyYW1hbnlhbSwg
QW1hcm5hdGggPGFtYXJuYXRoQHFjYS5xdWFsY29tbS5jb20+DQpTdWJqZWN0OiBSZTogW1BBVENI
XSBjZmc4MDIxMTogQWRkIHN1cHBvcnQgZm9yIHVzZXIgY29uZmlndXJhYmxlIGJlYWNvbiBkYXRh
IHJhdGUNCg0KT24gRnJpLCAyMDE2LTA4LTA1IGF0IDEwOjA1ICswNTMwLCBQdXJ1c2hvdHRhbSBL
dXNod2FoYSB3cm90ZToNCj7CoA0KPiArc3RhdGljIGludCBubDgwMjExX3BhcnNlX3R4X2JpdHJh
dGVfbWFzayhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLA0KPiArCQkJCQnCoHN0cnVjdCBjZmc4MDIx
MV9iaXRyYXRlX21hc2sgKm1hc2spOw0KDQpJIHRoaW5rIHlvdSBzaG91bGQgbW92ZSB0aGUgZnVu
Y3Rpb24gaW5zdGVhZC4NCg0KPiBAQCAtMzQ1Nyw2ICszNDU5LDExIEBAIHN0YXRpYyBpbnQgbmw4
MDIxMV9zdGFydF9hcChzdHJ1Y3Qgc2tfYnVmZiANCj4gKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAq
aW5mbykNCj4gwqAJZXJyID0gY2ZnODAyMTFfdmFsaWRhdGVfYmVhY29uX2ludChyZGV2LA0KPiBw
YXJhbXMuYmVhY29uX2ludGVydmFsKTsNCj4gwqAJaWYgKGVycikNCj4gwqAJCXJldHVybiBlcnI7
DQo+ICsJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9UWF9SQVRFU10pIHsNCj4gKwkJZXJy
ID0gbmw4MDIxMV9wYXJzZV90eF9iaXRyYXRlX21hc2soaW5mbywNCj4gJnBhcmFtcy5iZWFjb25f
cmF0ZSk7DQo+ICsJCWlmIChlcnIpDQo+ICsJCQlyZXR1cm4gZXJyOw0KPiArCX0NCg0KRG9lc24n
dCB0aGlzIGhhdmUgdG8gY2hlY2sgdGhhdCBpdCBhY3R1YWxseSBnb3QgaW5mb3JtYXRpb24gZm9y
IHRoZSByaWdodCBiYW5kPw0KDQpqb2hhbm5lcw0K

2016-08-26 08:14:54

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH] cfg80211: Add support for user configurable beacon data rate

On Wed, 2016-08-24 at 12:30 +0000, Undekari, Sunil Dutt wrote:

> > It also doesn't check that you specified exactly one rate, but it's
> > not clear how else this would work?
> I can think of the following options here . 
> 1. Consider these rates as only the preference ( in order ) to the
> host driver , but the User space would have no way of knowing what
> the driver has selected.
> 2. Limit this beacon rate to only one . cfg80211 to verify that there
> is exactly one rate to be specified. 
>
> Is option 2 a viable option ?
>
Yeah, I think option 1 doesn't make much sense.

johannes

2016-08-24 12:30:18

by Sunil Dutt Undekari

[permalink] [raw]
Subject: RE: [PATCH] cfg80211: Add support for user configurable beacon data rate

Pkl0IGNoZWNrcyB0aGF0IGV2ZXJ5dGhpbmcgbWF0Y2hlcyB1cCB3aXRoIGNhcGFiaWxpdGllcywg
YnV0IGl0IGRvZXNuJ3QgY2hlY2sgdGhhdCBpZiB5b3Ugc3BlY2lmaWVkIE5MODAyMTFfQVRUUl9U
WF9SQVRFUyB5b3UgZGlkbid0IGRvIHNvbWV0aGluZyBzdHVwaWQgbGlrZSBzcGVjaWZ5aW5nIGl0
IGZvciAyLjRHSHogd2hpbGUgeW91ciBBUCBpcyA+c3RhcnRpbmcgdXAgb24gNUdIei4NClRoYW5r
cyBmb3IgdGhlIHN1Z2dlc3Rpb24gLiBXZSBzaGFsbCBlbnN1cmUgdG8gY29uc2lkZXIgdGhlIGJl
YWNvbiByYXRlcyBjb25maWd1cmVkIG9uIHRoZSBzcGVjaWZpYyBiYW5kIGNvcnJlc3BvbmRpbmcg
dG8gdGhlIENoYW5uZWwgb24gd2hpY2ggdGhlIEFQIGlzIGdldHRpbmcgc3RhcnRlZC4gbmw4MDIx
MV9wYXJzZV90eF9iaXRyYXRlX21hc2sgc2hhbGwgYW55d2F5cyB2YWxpZGF0ZSB0aGUgYmVhY29u
IHJhdGVzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgb25lcyBzdXBwb3J0ZWQgLyBhZHZlcnRpc2VkIG9u
IGEgc3BlY2lmaWMgYmFuZC4gDQoNCj5JdCBhbHNvIGRvZXNuJ3QgY2hlY2sgdGhhdCB5b3Ugc3Bl
Y2lmaWVkIGV4YWN0bHkgb25lIHJhdGUsIGJ1dCBpdCdzIG5vdCBjbGVhciBob3cgZWxzZSB0aGlz
IHdvdWxkIHdvcms/DQpJIGNhbiB0aGluayBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMgaGVyZSAu
IA0KMS4gQ29uc2lkZXIgdGhlc2UgcmF0ZXMgYXMgb25seSB0aGUgcHJlZmVyZW5jZSAoIGluIG9y
ZGVyICkgdG8gdGhlIGhvc3QgZHJpdmVyICwgYnV0IHRoZSBVc2VyIHNwYWNlIHdvdWxkIGhhdmUg
bm8gd2F5IG9mIGtub3dpbmcgd2hhdCB0aGUgZHJpdmVyIGhhcyBzZWxlY3RlZC4NCjIuIExpbWl0
IHRoaXMgYmVhY29uIHJhdGUgdG8gb25seSBvbmUgLiBjZmc4MDIxMSB0byB2ZXJpZnkgdGhhdCB0
aGVyZSBpcyBleGFjdGx5IG9uZSByYXRlIHRvIGJlIHNwZWNpZmllZC4gDQoNCklzIG9wdGlvbiAy
IGEgdmlhYmxlIG9wdGlvbiA/DQoNClJlZ2FyZHMsDQpTdW5pbA0KDQotLS0tLU9yaWdpbmFsIE1l
c3NhZ2UtLS0tLQ0KRnJvbTogSm9oYW5uZXMgQmVyZyBbbWFpbHRvOmpvaGFubmVzQHNpcHNvbHV0
aW9ucy5uZXRdIA0KU2VudDogU3VuZGF5LCBBdWd1c3QgNywgMjAxNiAxOjI4IEFNDQpUbzogVW5k
ZWthcmksIFN1bmlsIER1dHQgPHVzZHV0dEBxdGkucXVhbGNvbW0uY29tPjsgS3VzaHdhaGEsIFB1
cnVzaG90dGFtIDxwa3VzaHdhaEBxdGkucXVhbGNvbW0uY29tPg0KQ2M6IGxpbnV4LXdpcmVsZXNz
QHZnZXIua2VybmVsLm9yZzsgTWFsaW5lbiwgSm91bmkgPGpvdW5pQHFjYS5xdWFsY29tbS5jb20+
OyBLb25kYWJhdHRpbmksIEdhbmVzaCA8Z2FuZXNoa0BxdGkucXVhbGNvbW0uY29tPjsgS2FsaWtv
dCBWZWV0aWwsIE1haGVzaCBLdW1hciA8bWthbGlrb3RAcWNhLnF1YWxjb21tLmNvbT47IEh1bGx1
ciBTdWJyYW1hbnlhbSwgQW1hcm5hdGggPGFtYXJuYXRoQHFjYS5xdWFsY29tbS5jb20+DQpTdWJq
ZWN0OiBSZTogW1BBVENIXSBjZmc4MDIxMTogQWRkIHN1cHBvcnQgZm9yIHVzZXIgY29uZmlndXJh
YmxlIGJlYWNvbiBkYXRhIHJhdGUNCg0KT24gU2F0LCAyMDE2LTA4LTA2IGF0IDA0OjM4ICswMDAw
LCBVbmRla2FyaSwgU3VuaWwgRHV0dCB3cm90ZToNCj4gPiANCj4gPiBEb2Vzbid0IHRoaXMgaGF2
ZSB0byBjaGVjayB0aGF0IGl0IGFjdHVhbGx5IGdvdCBpbmZvcm1hdGlvbiBmb3IgdGhlIA0KPiA+
IHJpZ2h0IGJhbmQ/DQo+IEhpIEpvaGFubmVzICwNCj4gbmw4MDIxMV9wYXJzZV90eF9iaXRyYXRl
X21hc2sgKCBhIG5ldyB3cmFwcGVyIHRvIHRoZSBleGlzdGluZyANCj4gZnVuY3Rpb25hbGl0eSBp
biBubDgwMjExX3NldF90eF9iaXRyYXRlX21hc2sgKSBkb2VzIHRoaXMgLCBpc24ndCA/DQo+IA0K
SXQgY2hlY2tzIHRoYXQgZXZlcnl0aGluZyBtYXRjaGVzIHVwIHdpdGggY2FwYWJpbGl0aWVzLCBi
dXQgaXQgZG9lc24ndCBjaGVjayB0aGF0IGlmIHlvdSBzcGVjaWZpZWQgTkw4MDIxMV9BVFRSX1RY
X1JBVEVTIHlvdSBkaWRuJ3QgZG8gc29tZXRoaW5nIHN0dXBpZCBsaWtlIHNwZWNpZnlpbmcgaXQg
Zm9yIDIuNEdIeiB3aGlsZSB5b3VyIEFQIGlzIHN0YXJ0aW5nIHVwIG9uIDVHSHouDQoNCkl0IGFs
c28gZG9lc24ndCBjaGVjayB0aGF0IHlvdSBzcGVjaWZpZWQgZXhhY3RseSBvbmUgcmF0ZSwgYnV0
IGl0J3Mgbm90IGNsZWFyIGhvdyBlbHNlIHRoaXMgd291bGQgd29yaz8NCg0Kam9oYW5uZXMNCg==

2016-08-06 20:30:19

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH] cfg80211: Add support for user configurable beacon data rate

On Sat, 2016-08-06 at 04:38 +0000, Undekari, Sunil Dutt wrote:
> >
> > Doesn't this have to check that it actually got information for the
> > right band?
> Hi Johannes ,
> nl80211_parse_tx_bitrate_mask ( a new wrapper to the existing
> functionality in nl80211_set_tx_bitrate_mask ) does this , isn't ? 
>
It checks that everything matches up with capabilities, but it doesn't
check that if you specified NL80211_ATTR_TX_RATES you didn't do
something stupid like specifying it for 2.4GHz while your AP is
starting up on 5GHz.

It also doesn't check that you specified exactly one rate, but it's not
clear how else this would work?

johannes