All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
@ 2013-08-27  5:44 Sunil Dutt
  2013-09-08  6:32 ` Sunil Dutt
  2013-10-02  9:00 ` Johannes Berg
  0 siblings, 2 replies; 13+ messages in thread
From: Sunil Dutt @ 2013-08-27  5:44 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, j

The information of the peer's supported channels and supported operating
classes are required for the driver to perform TDLS off channel
operations. This commit enhances the function nl80211_(new)set_station
to pass this information of the peer to the driver.

Signed-off-by: Sunil Dutt <c_duttus@qti.qualcomm.com>
---
 include/net/cfg80211.h       |  8 ++++++++
 include/uapi/linux/nl80211.h |  9 +++++++++
 net/wireless/nl80211.c       | 30 ++++++++++++++++++++++++++++++
 3 files changed, 47 insertions(+)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 9ab7a06..81889ca 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -735,6 +735,10 @@ enum station_parameters_apply_mask {
  * @capability: station capability
  * @ext_capab: extended capabilities of the station
  * @ext_capab_len: number of extended capabilities
+ * @supported_channels: supported channels in IEEE 802.11 format
+ * @supported_channels_len: number of supported channels
+ * @supported_oper_classes: supported oper classes in IEEE 802.11 format
+ * @supported_oper_classes_len: number of supported operating classes
  */
 struct station_parameters {
 	const u8 *supported_rates;
@@ -754,6 +758,10 @@ struct station_parameters {
 	u16 capability;
 	const u8 *ext_capab;
 	u8 ext_capab_len;
+	const u8 *supported_channels;
+	u8 supported_channels_len;
+	const u8 *supported_oper_classes;
+	u8 supported_oper_classes_len;
 };
 
 /**
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index 1f42bc3..61a21a4 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -1493,6 +1493,11 @@ enum nl80211_commands {
  * @NL80211_ATTR_CSA_C_OFF_PRESP: Offset of the channel switch counter
  *	field in the probe response (%NL80211_ATTR_PROBE_RESP).
  *
+ * @NL80211_ATTR_STA_SUPPORTED_CHANNELS: array of supported channels.
+ *
+ * @NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES: array of supported
+ *      supported operating classes.
+ *
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
  */
@@ -1801,6 +1806,10 @@ enum nl80211_attrs {
 	NL80211_ATTR_CSA_C_OFF_BEACON,
 	NL80211_ATTR_CSA_C_OFF_PRESP,
 
+	NL80211_ATTR_STA_SUPPORTED_CHANNELS,
+
+	NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES,
+
 	/* add attributes here, update the policy in nl80211.c */
 
 	__NL80211_ATTR_AFTER_LAST,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 741368c..0765b9a 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -354,6 +354,8 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
 	[NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
 	[NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_U16 },
 	[NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_U16 },
+	[NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
+	[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
 };
 
 /* policy for the key attributes */
@@ -3909,6 +3911,20 @@ static int nl80211_set_station_tdls(struct genl_info *info,
 		params->vht_capa =
 			nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
 
+	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
+		params->supported_channels =
+		     nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
+		params->supported_channels_len =
+		     nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
+	}
+
+	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
+		params->supported_oper_classes =
+		 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
+		params->supported_oper_classes_len =
+		  nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
+	}
+
 	return nl80211_parse_sta_wme(info, params);
 }
 
@@ -4089,6 +4105,20 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
 			return -EINVAL;
 	}
 
+	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
+		params->supported_channels =
+		     nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
+		params->supported_channels_len =
+		     nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
+	}
+
+	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
+		params->supported_oper_classes =
+		 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
+		params->supported_oper_classes_len =
+		  nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
+	}
+
 	err = nl80211_parse_sta_wme(info, &params);
 	if (err)
 		return err;
-- 
1.8.2.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
  2013-08-27  5:44 [PATCH] cfg80211: Pass station supported channel and oper class info to kernel Sunil Dutt
@ 2013-09-08  6:32 ` Sunil Dutt
  2013-09-09 15:12   ` Johannes Berg
  2013-10-02  9:00 ` Johannes Berg
  1 sibling, 1 reply; 13+ messages in thread
From: Sunil Dutt @ 2013-09-08  6:32 UTC (permalink / raw)
  To: Sunil Dutt; +Cc: Johannes Berg, linux-wireless, j, Deepak (QCA), Ashwani

Hi Johannes,
Can you please help in reviewing the patch and upstream the same.
Regards,
Sunil

On Tue, Aug 27, 2013 at 11:14 AM, Sunil Dutt <c_duttus@qti.qualcomm.com> wrote:
> The information of the peer's supported channels and supported operating
> classes are required for the driver to perform TDLS off channel
> operations. This commit enhances the function nl80211_(new)set_station
> to pass this information of the peer to the driver.
>
> Signed-off-by: Sunil Dutt <c_duttus@qti.qualcomm.com>
> ---
>  include/net/cfg80211.h       |  8 ++++++++
>  include/uapi/linux/nl80211.h |  9 +++++++++
>  net/wireless/nl80211.c       | 30 ++++++++++++++++++++++++++++++
>  3 files changed, 47 insertions(+)
>
> diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
> index 9ab7a06..81889ca 100644
> --- a/include/net/cfg80211.h
> +++ b/include/net/cfg80211.h
> @@ -735,6 +735,10 @@ enum station_parameters_apply_mask {
>   * @capability: station capability
>   * @ext_capab: extended capabilities of the station
>   * @ext_capab_len: number of extended capabilities
> + * @supported_channels: supported channels in IEEE 802.11 format
> + * @supported_channels_len: number of supported channels
> + * @supported_oper_classes: supported oper classes in IEEE 802.11 format
> + * @supported_oper_classes_len: number of supported operating classes
>   */
>  struct station_parameters {
>         const u8 *supported_rates;
> @@ -754,6 +758,10 @@ struct station_parameters {
>         u16 capability;
>         const u8 *ext_capab;
>         u8 ext_capab_len;
> +       const u8 *supported_channels;
> +       u8 supported_channels_len;
> +       const u8 *supported_oper_classes;
> +       u8 supported_oper_classes_len;
>  };
>
>  /**
> diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
> index 1f42bc3..61a21a4 100644
> --- a/include/uapi/linux/nl80211.h
> +++ b/include/uapi/linux/nl80211.h
> @@ -1493,6 +1493,11 @@ enum nl80211_commands {
>   * @NL80211_ATTR_CSA_C_OFF_PRESP: Offset of the channel switch counter
>   *     field in the probe response (%NL80211_ATTR_PROBE_RESP).
>   *
> + * @NL80211_ATTR_STA_SUPPORTED_CHANNELS: array of supported channels.
> + *
> + * @NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES: array of supported
> + *      supported operating classes.
> + *
>   * @NL80211_ATTR_MAX: highest attribute number currently defined
>   * @__NL80211_ATTR_AFTER_LAST: internal use
>   */
> @@ -1801,6 +1806,10 @@ enum nl80211_attrs {
>         NL80211_ATTR_CSA_C_OFF_BEACON,
>         NL80211_ATTR_CSA_C_OFF_PRESP,
>
> +       NL80211_ATTR_STA_SUPPORTED_CHANNELS,
> +
> +       NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES,
> +
>         /* add attributes here, update the policy in nl80211.c */
>
>         __NL80211_ATTR_AFTER_LAST,
> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
> index 741368c..0765b9a 100644
> --- a/net/wireless/nl80211.c
> +++ b/net/wireless/nl80211.c
> @@ -354,6 +354,8 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
>         [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
>         [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_U16 },
>         [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_U16 },
> +       [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
> +       [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
>  };
>
>  /* policy for the key attributes */
> @@ -3909,6 +3911,20 @@ static int nl80211_set_station_tdls(struct genl_info *info,
>                 params->vht_capa =
>                         nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
>
> +       if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
> +               params->supported_channels =
> +                    nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
> +               params->supported_channels_len =
> +                    nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
> +       }
> +
> +       if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
> +               params->supported_oper_classes =
> +                nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
> +               params->supported_oper_classes_len =
> +                 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
> +       }
> +
>         return nl80211_parse_sta_wme(info, params);
>  }
>
> @@ -4089,6 +4105,20 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
>                         return -EINVAL;
>         }
>
> +       if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
> +               params->supported_channels =
> +                    nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
> +               params->supported_channels_len =
> +                    nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
> +       }
> +
> +       if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
> +               params->supported_oper_classes =
> +                nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
> +               params->supported_oper_classes_len =
> +                 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
> +       }
> +
>         err = nl80211_parse_sta_wme(info, &params);
>         if (err)
>                 return err;
> --
> 1.8.2.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
  2013-09-08  6:32 ` Sunil Dutt
@ 2013-09-09 15:12   ` Johannes Berg
  0 siblings, 0 replies; 13+ messages in thread
From: Johannes Berg @ 2013-09-09 15:12 UTC (permalink / raw)
  To: Sunil Dutt; +Cc: Sunil Dutt, linux-wireless, j, Deepak (QCA), Ashwani

On Sun, 2013-09-08 at 12:02 +0530, Sunil Dutt wrote:
> Hi Johannes,
> Can you please help in reviewing the patch and upstream the same.

Don't get impatient. The merge window is open, so there's no reason for
me to be applying patches.

johannes


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
  2013-08-27  5:44 [PATCH] cfg80211: Pass station supported channel and oper class info to kernel Sunil Dutt
  2013-09-08  6:32 ` Sunil Dutt
@ 2013-10-02  9:00 ` Johannes Berg
  2013-10-03  7:20   ` Undekari, Sunil Dutt
  1 sibling, 1 reply; 13+ messages in thread
From: Johannes Berg @ 2013-10-02  9:00 UTC (permalink / raw)
  To: Sunil Dutt; +Cc: linux-wireless, j

On Tue, 2013-08-27 at 11:14 +0530, Sunil Dutt wrote:

> +	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
> +		params->supported_channels =
> +		     nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
> +		params->supported_channels_len =
> +		     nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);

It seems you should validate that the length is even, and at least 2?

> +	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
> +		params->supported_oper_classes =
> +		 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
> +		params->supported_oper_classes_len =
> +		  nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);

Similarly here (with different rules)

Does this even make sense in set_station() rather than only
new_station()?

johannes


^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
  2013-10-02  9:00 ` Johannes Berg
@ 2013-10-03  7:20   ` Undekari, Sunil Dutt
  2013-10-07  8:37     ` Johannes Berg
  0 siblings, 1 reply; 13+ messages in thread
From: Undekari, Sunil Dutt @ 2013-10-03  7:20 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, j

VGhhbmtzIEpvaGFubmVzIGZvciB0aGUgcmV2aWV3Lg0KDQo+SXQgc2VlbXMgeW91IHNob3VsZCB2
YWxpZGF0ZSB0aGF0IHRoZSBsZW5ndGggaXMgZXZlbiwgYW5kIGF0IGxlYXN0IDI/DQpDYW4gSSBr
bm93IHdoeSB0aGUgY2hlY2sgZm9yIGV2ZW4vIGF0bGVhc3QgMiBpcz8gVGhvdWdoIEkgd291bGQg
dmFsaWRhdGUgZm9yIGEgbm9uIHplcm8gbGVuZ3RoIGFuZCByZXR1cm4gZmFpbHVyZSBpbiB0aGUg
ZWxzZSwgY29uc2lkZXJpbmcgYSBjYXNlIHdoZXJlIHRoZSBURExTIHBlZXIgYWR2ZXJ0aXNlcyBh
IHNpbmdsZSBjaGFubmVsLiBTaG91bGRuJ3QgaXQgc3VmZmljZT8NCg0KPiBEb2VzIHRoaXMgZXZl
biBtYWtlIHNlbnNlIGluIHNldF9zdGF0aW9uKCkgcmF0aGVyIHRoYW4gb25seSBuZXdfc3RhdGlv
bigpPw0KSSB3b3VsZCBoYXZlIHRoaXMgaW4gYm90aCBuZXdfc3RhdGlvbiBhbmQgc2V0X3N0YXRp
b24uIENvbnNpZGVyaW5nIHRoZSBjdXJyZW50IGJlaGF2aW9yIG9mIHRoZSBzdXBwbGljYW50IHdo
ZXJlIG5ld19zdGF0aW9uIGFuZCBzZXRfc3RhdGlvbiBhcmUgaW52b2tlZCBiZWZvcmUgYW5kIGFm
dGVyIHRoZSBUUEsgaGFuZHNoYWtlLCBpdCB3b3VsZCBiZSBmaW5lIHRvIGhhdmUgb25seSBpbiBz
ZXRfc3RhdGlvbiBidXQgSSBzdXBwb3NlIE5MIGNoYW5nZXMgc2hvdWxkIG5vdCByZWx5IG9uIHN1
cHBsaWNhbnQncyBiZWhhdmlvci4NCg0KUmVnYXJkcywNClN1bmlsDQotLS0tLU9yaWdpbmFsIE1l
c3NhZ2UtLS0tLQ0KRnJvbTogSm9oYW5uZXMgQmVyZyBbbWFpbHRvOmpvaGFubmVzQHNpcHNvbHV0
aW9ucy5uZXRdIA0KU2VudDogV2VkbmVzZGF5LCBPY3RvYmVyIDAyLCAyMDEzIDI6MzEgUE0NClRv
OiBVbmRla2FyaSwgU3VuaWwgRHV0dA0KQ2M6IGxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9y
ZzsgakB3MS5maQ0KU3ViamVjdDogUmU6IFtQQVRDSF0gY2ZnODAyMTE6IFBhc3Mgc3RhdGlvbiBz
dXBwb3J0ZWQgY2hhbm5lbCBhbmQgb3BlciBjbGFzcyBpbmZvIHRvIGtlcm5lbA0KDQpPbiBUdWUs
IDIwMTMtMDgtMjcgYXQgMTE6MTQgKzA1MzAsIFN1bmlsIER1dHQgd3JvdGU6DQoNCj4gKwlpZiAo
aW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfQ0hBTk5FTFNdKSB7DQo+ICsJ
CXBhcmFtcy0+c3VwcG9ydGVkX2NoYW5uZWxzID0NCj4gKwkJICAgICBubGFfZGF0YShpbmZvLT5h
dHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9DSEFOTkVMU10pOw0KPiArCQlwYXJhbXMt
PnN1cHBvcnRlZF9jaGFubmVsc19sZW4gPQ0KPiArCQkgICAgIG5sYV9sZW4oaW5mby0+YXR0cnNb
Tkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfQ0hBTk5FTFNdKTsNCg0KSXQgc2VlbXMgeW91IHNo
b3VsZCB2YWxpZGF0ZSB0aGF0IHRoZSBsZW5ndGggaXMgZXZlbiwgYW5kIGF0IGxlYXN0IDI/DQoN
Cj4gKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfT1BFUl9DTEFT
U0VTXSkgew0KPiArCQlwYXJhbXMtPnN1cHBvcnRlZF9vcGVyX2NsYXNzZXMgPQ0KPiArCQkgbmxh
X2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfT1BFUl9DTEFTU0VT
XSk7DQo+ICsJCXBhcmFtcy0+c3VwcG9ydGVkX29wZXJfY2xhc3Nlc19sZW4gPQ0KPiArCQkgIG5s
YV9sZW4oaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfT1BFUl9DTEFTU0VT
XSk7DQoNClNpbWlsYXJseSBoZXJlICh3aXRoIGRpZmZlcmVudCBydWxlcykNCg0KRG9lcyB0aGlz
IGV2ZW4gbWFrZSBzZW5zZSBpbiBzZXRfc3RhdGlvbigpIHJhdGhlciB0aGFuIG9ubHkgbmV3X3N0
YXRpb24oKT8NCg0Kam9oYW5uZXMNCg0K

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
  2013-10-03  7:20   ` Undekari, Sunil Dutt
@ 2013-10-07  8:37     ` Johannes Berg
  0 siblings, 0 replies; 13+ messages in thread
From: Johannes Berg @ 2013-10-07  8:37 UTC (permalink / raw)
  To: Undekari, Sunil Dutt; +Cc: linux-wireless, j

On Thu, 2013-10-03 at 07:20 +0000, Undekari, Sunil Dutt wrote:
> Thanks Johannes for the review.
> 
> >It seems you should validate that the length is even, and at least 2?
> Can I know why the check for even/ atleast 2 is? Though I would
> validate for a non zero length and return failure in the else,
> considering a case where the TDLS peer advertises a single channel.
> Shouldn't it suffice?

Yes, if you look at the 802.11 spec you can know why. Hint: a single
channel is advertised using 2 bytes.

johannes


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
  2013-10-09 15:15 Sunil Dutt
@ 2013-10-11 13:27 ` Johannes Berg
  0 siblings, 0 replies; 13+ messages in thread
From: Johannes Berg @ 2013-10-11 13:27 UTC (permalink / raw)
  To: Sunil Dutt; +Cc: j, linux-wireless

On Wed, 2013-10-09 at 20:45 +0530, Sunil Dutt wrote:
> The information of the peer's supported channels and supported operating
> classes are required for the driver to perform TDLS off channel
> operations. This commit enhances the function nl80211_(new)set_station
> to pass this information of the peer to the driver.

Applied, but I made it return an error for %2 case. Please adjust your
wpa_s changes accordingly.

johannes


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
@ 2013-10-09 15:15 Sunil Dutt
  2013-10-11 13:27 ` Johannes Berg
  0 siblings, 1 reply; 13+ messages in thread
From: Sunil Dutt @ 2013-10-09 15:15 UTC (permalink / raw)
  To: johannes; +Cc: j, linux-wireless, c_duttus

The information of the peer's supported channels and supported operating
classes are required for the driver to perform TDLS off channel
operations. This commit enhances the function nl80211_(new)set_station
to pass this information of the peer to the driver.

Signed-off-by: Sunil Dutt <c_duttus@qti.qualcomm.com>
---
 include/net/cfg80211.h       |  8 ++++++++
 include/uapi/linux/nl80211.h |  9 +++++++++
 net/wireless/nl80211.c       | 46 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 63 insertions(+)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index cb71091..b1cfc93 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -735,6 +735,10 @@ enum station_parameters_apply_mask {
  * @capability: station capability
  * @ext_capab: extended capabilities of the station
  * @ext_capab_len: number of extended capabilities
+ * @supported_channels: supported channels in IEEE 802.11 format
+ * @supported_channels_len: number of supported channels
+ * @supported_oper_classes: supported oper classes in IEEE 802.11 format
+ * @supported_oper_classes_len: number of supported operating classes
  */
 struct station_parameters {
 	const u8 *supported_rates;
@@ -754,6 +758,10 @@ struct station_parameters {
 	u16 capability;
 	const u8 *ext_capab;
 	u8 ext_capab_len;
+	const u8 *supported_channels;
+	u8 supported_channels_len;
+	const u8 *supported_oper_classes;
+	u8 supported_oper_classes_len;
 };
 
 /**
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index fde2c02..aec9a8a 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -1496,6 +1496,11 @@ enum nl80211_commands {
  * @NL80211_ATTR_RXMGMT_FLAGS: flags for nl80211_send_mgmt(), u32.
  *	As specified in the &enum nl80211_rxmgmt_flags.
  *
+ * @NL80211_ATTR_STA_SUPPORTED_CHANNELS: array of supported channels.
+ *
+ * @NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES: array of supported
+ *      supported operating classes.
+ *
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
  */
@@ -1806,6 +1811,10 @@ enum nl80211_attrs {
 
 	NL80211_ATTR_RXMGMT_FLAGS,
 
+	NL80211_ATTR_STA_SUPPORTED_CHANNELS,
+
+	NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES,
+
 	/* add attributes here, update the policy in nl80211.c */
 
 	__NL80211_ATTR_AFTER_LAST,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 626dc3b..dca1e8f 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -354,6 +354,8 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
 	[NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
 	[NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_U16 },
 	[NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_U16 },
+	[NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
+	[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
 };
 
 /* policy for the key attributes */
@@ -3896,9 +3898,45 @@ static int nl80211_parse_sta_wme(struct genl_info *info,
 	return 0;
 }
 
+static int nl80211_parse_sta_channel_info(struct genl_info *info,
+				      struct station_parameters *params)
+{
+	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
+		params->supported_channels =
+		     nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
+		params->supported_channels_len =
+		     nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
+		/*
+		 * Need to include at least One (first channel, number of
+		 * channels) tuple for each subband.
+		 */
+		if (params->supported_channels_len < 2)
+			return -EINVAL;
+		 /* Ignore any trailing byte signifying an invalid Tuple.*/
+		if (params->supported_channels_len % 2)
+			params->supported_channels_len -= 1;
+	}
+
+	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
+		params->supported_oper_classes =
+		 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
+		params->supported_oper_classes_len =
+		  nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
+		/*
+		 * The value of the Length field of the Supported Operating
+		 * Classes element is between 2 and 253.
+		 */
+		if (params->supported_oper_classes_len < 2 ||
+		    params->supported_oper_classes_len > 253)
+			return -EINVAL;
+	}
+	return 0;
+}
+
 static int nl80211_set_station_tdls(struct genl_info *info,
 				    struct station_parameters *params)
 {
+	int err;
 	/* Dummy STA entry gets updated once the peer capabilities are known */
 	if (info->attrs[NL80211_ATTR_PEER_AID])
 		params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
@@ -3909,6 +3947,10 @@ static int nl80211_set_station_tdls(struct genl_info *info,
 		params->vht_capa =
 			nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
 
+	err = nl80211_parse_sta_channel_info(info, params);
+	if (err)
+		return err;
+
 	return nl80211_parse_sta_wme(info, params);
 }
 
@@ -4089,6 +4131,10 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
 			return -EINVAL;
 	}
 
+	err = nl80211_parse_sta_channel_info(info, &params);
+	if (err)
+		return err;
+
 	err = nl80211_parse_sta_wme(info, &params);
 	if (err)
 		return err;
-- 
1.8.2.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
  2013-10-09 11:43 Sunil Dutt
@ 2013-10-09 11:48 ` Johannes Berg
  0 siblings, 0 replies; 13+ messages in thread
From: Johannes Berg @ 2013-10-09 11:48 UTC (permalink / raw)
  To: Sunil Dutt; +Cc: j, linux-wireless

> +static int nl80211_parse_sta_channel_info(struct genl_info *info,
> +				      struct station_parameters *params)
> +{
> +	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
> +		params->supported_channels =
> +		     nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
> +		params->supported_channels_len =
> +		     nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
> +		/*
> +		 * Need to include at least One (first channel, number of
> +		 * channels) tuple for each subband.Thus, reject any trailing
> +		 * byte.
> +		 */
> +		if (params->supported_channels_len % 2)
> +			params->supported_channels_len -= 1;
> +	}

That's not 'reject', that's ignore - and you're also not checking that
it's at least 2 bytes long.

> +
> +	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
> +		params->supported_oper_classes =
> +		 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
> +		params->supported_oper_classes_len =
> +		  nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
> +		/*
> +		 * The value of the Length field of the Supported Operating
> +		 * Classes element is between 2 and 253.
> +		 */
> +		if (params->supported_oper_classes_len < 2 ||
> +		    params->supported_oper_classes_len > 253)
> +			return -EINVAL;

And this would be inconsistent, one is rejected and the other ignored?

Also - you missed sign-off.

johannes


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
@ 2013-10-09 11:43 Sunil Dutt
  2013-10-09 11:48 ` Johannes Berg
  0 siblings, 1 reply; 13+ messages in thread
From: Sunil Dutt @ 2013-10-09 11:43 UTC (permalink / raw)
  To: johannes; +Cc: j, linux-wireless, c_duttus

The information of the peer's supported channels and supported operating
classes are required for the driver to perform TDLS off channel
operations. This commit enhances the function nl80211_(new)set_station
to pass this information of the peer to the driver.
---
 include/net/cfg80211.h       |  8 ++++++++
 include/uapi/linux/nl80211.h |  9 +++++++++
 net/wireless/nl80211.c       | 44 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 61 insertions(+)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index cb71091..b1cfc93 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -735,6 +735,10 @@ enum station_parameters_apply_mask {
  * @capability: station capability
  * @ext_capab: extended capabilities of the station
  * @ext_capab_len: number of extended capabilities
+ * @supported_channels: supported channels in IEEE 802.11 format
+ * @supported_channels_len: number of supported channels
+ * @supported_oper_classes: supported oper classes in IEEE 802.11 format
+ * @supported_oper_classes_len: number of supported operating classes
  */
 struct station_parameters {
 	const u8 *supported_rates;
@@ -754,6 +758,10 @@ struct station_parameters {
 	u16 capability;
 	const u8 *ext_capab;
 	u8 ext_capab_len;
+	const u8 *supported_channels;
+	u8 supported_channels_len;
+	const u8 *supported_oper_classes;
+	u8 supported_oper_classes_len;
 };
 
 /**
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index fde2c02..aec9a8a 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -1496,6 +1496,11 @@ enum nl80211_commands {
  * @NL80211_ATTR_RXMGMT_FLAGS: flags for nl80211_send_mgmt(), u32.
  *	As specified in the &enum nl80211_rxmgmt_flags.
  *
+ * @NL80211_ATTR_STA_SUPPORTED_CHANNELS: array of supported channels.
+ *
+ * @NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES: array of supported
+ *      supported operating classes.
+ *
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
  */
@@ -1806,6 +1811,10 @@ enum nl80211_attrs {
 
 	NL80211_ATTR_RXMGMT_FLAGS,
 
+	NL80211_ATTR_STA_SUPPORTED_CHANNELS,
+
+	NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES,
+
 	/* add attributes here, update the policy in nl80211.c */
 
 	__NL80211_ATTR_AFTER_LAST,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 626dc3b..c234836 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -354,6 +354,8 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
 	[NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
 	[NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_U16 },
 	[NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_U16 },
+	[NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
+	[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
 };
 
 /* policy for the key attributes */
@@ -3896,9 +3898,43 @@ static int nl80211_parse_sta_wme(struct genl_info *info,
 	return 0;
 }
 
+static int nl80211_parse_sta_channel_info(struct genl_info *info,
+				      struct station_parameters *params)
+{
+	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
+		params->supported_channels =
+		     nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
+		params->supported_channels_len =
+		     nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
+		/*
+		 * Need to include at least One (first channel, number of
+		 * channels) tuple for each subband.Thus, reject any trailing
+		 * byte.
+		 */
+		if (params->supported_channels_len % 2)
+			params->supported_channels_len -= 1;
+	}
+
+	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
+		params->supported_oper_classes =
+		 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
+		params->supported_oper_classes_len =
+		  nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
+		/*
+		 * The value of the Length field of the Supported Operating
+		 * Classes element is between 2 and 253.
+		 */
+		if (params->supported_oper_classes_len < 2 ||
+		    params->supported_oper_classes_len > 253)
+			return -EINVAL;
+	}
+	return 0;
+}
+
 static int nl80211_set_station_tdls(struct genl_info *info,
 				    struct station_parameters *params)
 {
+	int err;
 	/* Dummy STA entry gets updated once the peer capabilities are known */
 	if (info->attrs[NL80211_ATTR_PEER_AID])
 		params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
@@ -3909,6 +3945,10 @@ static int nl80211_set_station_tdls(struct genl_info *info,
 		params->vht_capa =
 			nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
 
+	err = nl80211_parse_sta_channel_info(info, params);
+	if (err)
+		return err;
+
 	return nl80211_parse_sta_wme(info, params);
 }
 
@@ -4089,6 +4129,10 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
 			return -EINVAL;
 	}
 
+	err = nl80211_parse_sta_channel_info(info, &params);
+	if (err)
+		return err;
+
 	err = nl80211_parse_sta_wme(info, &params);
 	if (err)
 		return err;
-- 
1.8.2.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
  2013-10-09  9:13       ` Undekari, Sunil Dutt
@ 2013-10-09  9:17         ` Johannes Berg
  0 siblings, 0 replies; 13+ messages in thread
From: Johannes Berg @ 2013-10-09  9:17 UTC (permalink / raw)
  To: Undekari, Sunil Dutt; +Cc: j@w1.fi.com, linux-wireless

On Wed, 2013-10-09 at 09:13 +0000, Undekari, Sunil Dutt wrote:
> > It's just a question of where to address this - in the kernel or the supplicant. In a way, I'd rather have the kernel reject it and do the policy of ignoring invalid stuff in the supplicant.
> The above statement from you made me to rethink for the following check in the patch sent.  
> 
> +               if (params->supported_oper_classes_len < 2 ||
> +                   params->supported_oper_classes_len > 253)
> +                       return -EINVAL;
> 
> Are you fine to return a failure for the invalid length for the supported_oper_classes_len? If yes, then shouldn't we also do the similar check for invalid supported_channels_len ( < 2 ).

Certainly works for me - but there should also be something like % 2 I
guess

johannes


^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
  2013-10-09  8:31     ` Johannes Berg
@ 2013-10-09  9:13       ` Undekari, Sunil Dutt
  2013-10-09  9:17         ` Johannes Berg
  0 siblings, 1 reply; 13+ messages in thread
From: Undekari, Sunil Dutt @ 2013-10-09  9:13 UTC (permalink / raw)
  To: Johannes Berg; +Cc: j@w1.fi.com, linux-wireless

PiBJdCdzIGp1c3QgYSBxdWVzdGlvbiBvZiB3aGVyZSB0byBhZGRyZXNzIHRoaXMgLSBpbiB0aGUg
a2VybmVsIG9yIHRoZSBzdXBwbGljYW50LiBJbiBhIHdheSwgSSdkIHJhdGhlciBoYXZlIHRoZSBr
ZXJuZWwgcmVqZWN0IGl0IGFuZCBkbyB0aGUgcG9saWN5IG9mIGlnbm9yaW5nIGludmFsaWQgc3R1
ZmYgaW4gdGhlIHN1cHBsaWNhbnQuDQpUaGUgYWJvdmUgc3RhdGVtZW50IGZyb20geW91IG1hZGUg
bWUgdG8gcmV0aGluayBmb3IgdGhlIGZvbGxvd2luZyBjaGVjayBpbiB0aGUgcGF0Y2ggc2VudC4g
IA0KDQorICAgICAgICAgICAgICAgaWYgKHBhcmFtcy0+c3VwcG9ydGVkX29wZXJfY2xhc3Nlc19s
ZW4gPCAyIHx8DQorICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+c3VwcG9ydGVkX29wZXJfY2xh
c3Nlc19sZW4gPiAyNTMpDQorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsN
Cg0KQXJlIHlvdSBmaW5lIHRvIHJldHVybiBhIGZhaWx1cmUgZm9yIHRoZSBpbnZhbGlkIGxlbmd0
aCBmb3IgdGhlIHN1cHBvcnRlZF9vcGVyX2NsYXNzZXNfbGVuPyBJZiB5ZXMsIHRoZW4gc2hvdWxk
bid0IHdlIGFsc28gZG8gdGhlIHNpbWlsYXIgY2hlY2sgZm9yIGludmFsaWQgc3VwcG9ydGVkX2No
YW5uZWxzX2xlbiAoIDwgMiApLg0KDQpSZWdhcmRzLA0KU3VuaWwNCg0KLS0tLS1PcmlnaW5hbCBN
ZXNzYWdlLS0tLS0NCkZyb206IEpvaGFubmVzIEJlcmcgW21haWx0bzpqb2hhbm5lc0BzaXBzb2x1
dGlvbnMubmV0XSANClNlbnQ6IFdlZG5lc2RheSwgT2N0b2JlciAwOSwgMjAxMyAyOjAyIFBNDQpU
bzogVW5kZWthcmksIFN1bmlsIER1dHQNCkNjOiBqQHcxLmZpLmNvbTsgbGludXgtd2lyZWxlc3NA
dmdlci5rZXJuZWwub3JnDQpTdWJqZWN0OiBSZTogW1BBVENIXSBjZmc4MDIxMTogUGFzcyBzdGF0
aW9uIHN1cHBvcnRlZCBjaGFubmVsIGFuZCBvcGVyIGNsYXNzIGluZm8gdG8ga2VybmVsDQoNCk9u
IFdlZCwgMjAxMy0xMC0wOSBhdCAwODoxOSArMDAwMCwgVW5kZWthcmksIFN1bmlsIER1dHQgd3Jv
dGU6DQo+IEhpIEpvaGFubmVzLA0KPiANCj4gPkkgZ3Vlc3MgdGhlbiB3cGFfc3VwcGxpY2FudCB3
b3VsZCBoYXZlIHRvIHJlbW92ZSB0aGUgaW5mbyAtIG1heWJlIHRoZSBmYWlsdXJlIGNhc2Ugc2hv
dWxkbid0IGJlIHF1aXRlIGFzIGRyYWNvbmljPyBNYXliZSBtYWtlIGl0IGlnbm9yZSBhbnkgZXh0
cmEgdHJhaWxpbmcgYnl0ZT8NCj4gVGhhbmtzIGZvciB5b3VyIHBvaW50LiANCj4gSSBzdXBwb3Nl
LCByZXR1cm5pbmcgYSBmYWlsdXJlIGZvciB0aGUgbGVuZ3RoIGJlaW5nIGxlc3MgdGhhbiAyIGV2
ZW4gYWZ0ZXIgaWdub3JpbmcgdGhlIHRyYWlsaW5nIGJ5dGUgaXMgbm90IHJlcXVpcmVkIGZvciB0
aGUgcmVhc29uIHRoYXQgdGhlIHN1cHBvcnRlZCBjaGFubmVscyBpcyBub3QgYSBtYW5kYXRvcnkg
ZmllbGQgKGF0IGxlYXN0IHcuci50IFRETFMpLiBJdCBzaG91bGQgYmUgZmluZSB0byBqdXN0IHBh
c3MgdGhlIGxlbmd0aCBhcyAwIHRvIHRoZSBob3N0IGRyaXZlci4gUGxlYXNlIGNvcnJlY3QgbWUu
DQoNCkl0J3MganVzdCBhIHF1ZXN0aW9uIG9mIHdoZXJlIHRvIGFkZHJlc3MgdGhpcyAtIGluIHRo
ZSBrZXJuZWwgb3IgdGhlIHN1cHBsaWNhbnQuIEluIGEgd2F5LCBJJ2QgcmF0aGVyIGhhdmUgdGhl
IGtlcm5lbCByZWplY3QgaXQgYW5kIGRvIHRoZSBwb2xpY3kgb2YgaWdub3JpbmcgaW52YWxpZCBz
dHVmZiBpbiB0aGUgc3VwcGxpY2FudC4NCg0Kam9oYW5uZXMNCg0K

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] cfg80211: Pass station supported channel and oper class info to kernel
       [not found]   ` <26F3B0343EE4744AA14EEEF9E1E534511F725129@aphydexd01a>
@ 2013-10-09  8:31     ` Johannes Berg
  2013-10-09  9:13       ` Undekari, Sunil Dutt
  0 siblings, 1 reply; 13+ messages in thread
From: Johannes Berg @ 2013-10-09  8:31 UTC (permalink / raw)
  To: Undekari, Sunil Dutt; +Cc: j@w1.fi.com, linux-wireless

On Wed, 2013-10-09 at 08:19 +0000, Undekari, Sunil Dutt wrote:
> Hi Johannes,
> 
> >I guess then wpa_supplicant would have to remove the info - maybe the failure case shouldn't be quite as draconic? Maybe make it ignore any extra trailing byte?
> Thanks for your point. 
> I suppose, returning a failure for the length being less than 2 even after ignoring the trailing byte is not required for the reason that the supported channels is not a mandatory field (at least w.r.t TDLS). It should be fine to just pass the length as 0 to the host driver. Please correct me.

It's just a question of where to address this - in the kernel or the
supplicant. In a way, I'd rather have the kernel reject it and do the
policy of ignoring invalid stuff in the supplicant.

johannes


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2013-10-11 13:27 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-27  5:44 [PATCH] cfg80211: Pass station supported channel and oper class info to kernel Sunil Dutt
2013-09-08  6:32 ` Sunil Dutt
2013-09-09 15:12   ` Johannes Berg
2013-10-02  9:00 ` Johannes Berg
2013-10-03  7:20   ` Undekari, Sunil Dutt
2013-10-07  8:37     ` Johannes Berg
     [not found] <1381150309-27293-1-git-send-email-c_duttus@qti.qualcomm.com>
     [not found] ` <1381222569.13359.3.camel@jlt4.sipsolutions.net>
     [not found]   ` <26F3B0343EE4744AA14EEEF9E1E534511F725129@aphydexd01a>
2013-10-09  8:31     ` Johannes Berg
2013-10-09  9:13       ` Undekari, Sunil Dutt
2013-10-09  9:17         ` Johannes Berg
2013-10-09 11:43 Sunil Dutt
2013-10-09 11:48 ` Johannes Berg
2013-10-09 15:15 Sunil Dutt
2013-10-11 13:27 ` Johannes Berg

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.