Add data types and structures for IEEE802.11e/WMM TS management and DLS.
Signed-off-by: Zhu Yi <[email protected]>
---
include/linux/ieee80211.h | 168 ++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 166 insertions(+), 2 deletions(-)
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index 0cd2d35..00e9f99 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -123,6 +123,52 @@ struct ieee80211_ht_additional_info {
u8 basic_set[16];
}__attribute__ ((packed));
+
+#define IEEE80211_TSINFO_TYPE(a) ((a.short1 & 0x0001) >> 0)
+#define IEEE80211_TSINFO_TSID(a) ((a.short1 & 0x001E) >> 1)
+#define IEEE80211_TSINFO_DIR(a) ((a.short1 & 0x0060) >> 5)
+#define IEEE80211_TSINFO_POLICY(a) ((a.short1 & 0x0180) >> 7)
+#define IEEE80211_TSINFO_AGG(a) ((a.short1 & 0x0200) >> 9)
+#define IEEE80211_TSINFO_APSD(a) ((a.short1 & 0x0400) >> 10)
+#define IEEE80211_TSINFO_UP(a) ((a.short1 & 0x3800) >> 11)
+#define IEEE80211_TSINFO_ACK(a) ((a.short1 & 0xC000) >> 14)
+#define IEEE80211_TSINFO_SCHEDULE(a) ((a.byte3 & 0x01) >> 0)
+
+#define SET_TSINFO_TYPE(i, d) (i.short1 |= (d << 0) & 0x0001)
+#define SET_TSINFO_TSID(i, d) (i.short1 |= (d << 1) & 0x001E)
+#define SET_TSINFO_DIR(i, d) (i.short1 |= (d << 5) & 0x0060)
+#define SET_TSINFO_POLICY(i, d) (i.short1 |= (d << 7) & 0x0180)
+#define SET_TSINFO_AGG(i, d) (i.short1 |= (d << 9) & 0x0200)
+#define SET_TSINFO_APSD(i, d) (i.short1 |= (d << 10) & 0x0400)
+#define SET_TSINFO_UP(i, d) (i.short1 |= (d << 11) & 0x3800)
+#define SET_TSINFO_ACK(i, d) (i.short1 |= (d << 14) & 0xC000)
+#define SET_TSINFO_SCHEDULE(i, d) (i.byte3 |= (d << 0) & 0x01)
+
+struct ieee80211_ts_info {
+ __le16 short1;
+ u8 byte3;
+} __attribute__ ((packed));
+
+struct ieee80211_elem_tspec {
+ struct ieee80211_ts_info ts_info;
+ __le16 nominal_msdu_size;
+ __le16 max_msdu_size;
+ __le32 min_service_interval;
+ __le32 max_service_interval;
+ __le32 inactivity_interval;
+ __le32 suspension_interval;
+ __le32 service_start_time;
+ __le32 min_data_rate;
+ __le32 mean_data_rate;
+ __le32 peak_data_rate;
+ __le32 burst_size;
+ __le32 delay_bound;
+ __le32 min_phy_rate;
+ __le16 surplus_band_allow;
+ __le16 medium_time;
+} __attribute__ ((packed));
+
+
struct ieee80211_mgmt {
__le16 frame_control;
__le16 duration;
@@ -190,9 +236,51 @@ struct ieee80211_mgmt {
struct {
u8 action_code;
u8 dialog_token;
+ u8 variable[0];
+ } __attribute__ ((packed)) addts_req;
+ struct {
+ u8 action_code;
+ u8 dialog_token;
+ __le16 status_code;
+ u8 variable[0];
+ } __attribute__ ((packed)) addts_resp;
+ struct {
+ u8 action_code;
+ struct ieee80211_ts_info ts_info;
+ __le16 reason_code;
+ } __attribute__ ((packed)) delts;
+ struct {
+ u8 action_code;
+ u8 dialog_token;
u8 status_code;
u8 variable[0];
} __attribute__ ((packed)) wme_action;
+ struct {
+ u8 action_code;
+ u8 dest[6];
+ u8 src[6];
+ __le16 capab_info;
+ __le16 timeout;
+ /* Followed by Supported Rates and
+ * Extended Supported Rates */
+ u8 variable[0];
+ } __attribute__ ((packed)) dls_req;
+ struct {
+ u8 action_code;
+ __le16 status_code;
+ u8 dest[6];
+ u8 src[6];
+ /* Followed by Capability Information,
+ * Supported Rates and Extended
+ * Supported Rates */
+ u8 variable[0];
+ } __attribute__ ((packed)) dls_resp;
+ struct {
+ u8 action_code;
+ u8 dest[6];
+ u8 src[6];
+ __le16 reason_code;
+ } __attribute__ ((packed)) dls_teardown;
struct{
u8 action_code;
u8 element_id;
@@ -287,8 +375,6 @@ enum ieee80211_statuscode {
/* 802.11g */
WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25,
WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26,
- /* 802.11e */
- WLAN_STATUS_REQUEST_DECLINED = 37,
/* 802.11i */
WLAN_STATUS_INVALID_IE = 40,
WLAN_STATUS_INVALID_GROUP_CIPHER = 41,
@@ -297,6 +383,18 @@ enum ieee80211_statuscode {
WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
+ /* 802.11e */
+ WLAN_STATUS_UNSPECIFIED_QOS = 32,
+ WLAN_STATUS_ASSOC_DENIED_NOBANDWIDTH = 33,
+ WLAN_STATUS_ASSOC_DENIED_LOWACK = 34,
+ WLAN_STATUS_ASSOC_DENIED_UNSUPP_QOS = 35,
+ WLAN_STATUS_REQUEST_DECLINED = 37,
+ WLAN_STATUS_INVALID_QOS_PARAM = 38,
+ WLAN_STATUS_CHANGE_TSPEC = 39,
+ WLAN_STATUS_WAIT_TS_DELAY = 47,
+ WLAN_STATUS_NO_DIRECT_LINK = 48,
+ WLAN_STATUS_STA_NOT_PRESENT = 49,
+ WLAN_STATUS_STA_NOT_QSTA = 50,
};
@@ -327,6 +425,16 @@ enum ieee80211_reasoncode {
WLAN_REASON_INVALID_RSN_IE_CAP = 22,
WLAN_REASON_IEEE8021X_FAILED = 23,
WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
+ /* 802.11e */
+ WLAN_REASON_DISASSOC_UNSPECIFIED_QOS = 32,
+ WLAN_REASON_DISASSOC_QAP_NO_BANDWIDTH = 33,
+ WLAN_REASON_DISASSOC_LOW_ACK = 34,
+ WLAN_REASON_DISASSOC_QAP_EXCEED_TXOP = 35,
+ WLAN_REASON_QSTA_LEAVE_QBSS = 36,
+ WLAN_REASON_QSTA_NOT_USE = 37,
+ WLAN_REASON_QSTA_REQUIRE_SETUP = 38,
+ WLAN_REASON_QSTA_TIMEOUT = 39,
+ WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45,
};
@@ -339,6 +447,20 @@ enum ieee80211_category {
WLAN_CATEGORY_WMM = 17,
};
+/* QoS Action Code */
+enum ieee80211_qos_actioncode {
+ WLAN_ACTION_QOS_ADDTS_REQ = 0,
+ WLAN_ACTION_QOS_ADDTS_RESP = 1,
+ WLAN_ACTION_QOS_DELTS = 2,
+ WLAN_ACTION_QOS_SCHEDULE = 3,
+};
+
+/* DLS Action Code */
+enum ieee80211_dls_actioncode {
+ WLAN_ACTION_DLS_REQ = 0,
+ WLAN_ACTION_DLS_RESP = 1,
+ WLAN_ACTION_DLS_TEARDOWN = 2,
+};
/* BACK Action Code */
enum ieee80211_back_actioncode {
@@ -362,6 +484,15 @@ enum ieee80211_eid {
WLAN_EID_HP_PARAMS = 8,
WLAN_EID_HP_TABLE = 9,
WLAN_EID_REQUEST = 10,
+ /* 802.11e */
+ WLAN_EID_QBSS_LOAD = 11,
+ WLAN_EID_EDCA_PARAM_SET = 12,
+ WLAN_EID_TSPEC = 13,
+ WLAN_EID_TCLAS = 14,
+ WLAN_EID_SCHEDULE = 15,
+ WLAN_EID_TS_DELAY = 43,
+ WLAN_EID_TCLAS_PROCESSING = 44,
+ WLAN_EID_QOS_CAPA = 46,
/* 802.11h */
WLAN_EID_PWR_CONSTRAINT = 32,
WLAN_EID_PWR_CAPABILITY = 33,
@@ -400,4 +531,37 @@ enum ieee80211_eid {
#define WLAN_MAX_KEY_LEN 32
+enum ieee80211_tsinfo_direction {
+ WLAN_TSINFO_UPLINK = 0,
+ WLAN_TSINFO_DOWNLINK = 1,
+ WLAN_TSINFO_DIRECTLINK = 2,
+ WLAN_TSINFO_BIDIRECTIONAL = 3,
+};
+
+enum ieee80211_tsinfo_access {
+ WLAN_TSINFO_EDCA = 1,
+ WLAN_TSINFO_HCCA = 2,
+ WLAN_TSINFO_HEMM = 3,
+};
+
+enum ieee80211_tsinfo_psb {
+ WLAN_TSINFO_PSB_LEGACY = 0,
+ WLAN_TSINFO_PSB_APSD = 1,
+};
+
+
+/* WI-FI Alliance OUI Type and Subtype */
+enum wifi_oui_type {
+ WIFI_OUI_TYPE_WPA = 1,
+ WIFI_OUI_TYPE_WMM = 2,
+ WIFI_OUI_TYPE_WSC = 4,
+ WIFI_OUI_TYPE_PSD = 6,
+};
+
+enum wifi_oui_stype_wmm {
+ WIFI_OUI_STYPE_WMM_INFO = 0,
+ WIFI_OUI_STYPE_WMM_PARAM = 1,
+ WIFI_OUI_STYPE_WMM_TSPEC = 2,
+};
+
#endif /* IEEE80211_H */
--
1.5.0.rc2.g73a2
On Wed, 6 Jun 2007 16:22:10 +0800, Zhu Yi wrote:
> --- a/include/linux/ieee80211.h
> +++ b/include/linux/ieee80211.h
> @@ -106,6 +106,52 @@ struct ieee80211_hdr {
> } __attribute__ ((packed));
>
>
> +
> +#define IEEE80211_TSINFO_TYPE(a) ((a.short1 & 0x0001) >> 0)
> +#define IEEE80211_TSINFO_TSID(a) ((a.short1 & 0x001E) >> 1)
> +#define IEEE80211_TSINFO_DIR(a) ((a.short1 & 0x0060) >> 5)
> +#define IEEE80211_TSINFO_POLICY(a) ((a.short1 & 0x0180) >> 7)
> +#define IEEE80211_TSINFO_AGG(a) ((a.short1 & 0x0200) >> 9)
> +#define IEEE80211_TSINFO_APSD(a) ((a.short1 & 0x0400) >> 10)
> +#define IEEE80211_TSINFO_UP(a) ((a.short1 & 0x3800) >> 11)
> +#define IEEE80211_TSINFO_ACK(a) ((a.short1 & 0xC000) >> 14)
> +#define IEEE80211_TSINFO_SCHEDULE(a) ((a.byte3 & 0x01) >> 0)
> +
> +#define SET_TSINFO_TYPE(i, d) (i.short1 |= (d << 0) & 0x0001)
> +#define SET_TSINFO_TSID(i, d) (i.short1 |= (d << 1) & 0x001E)
> +#define SET_TSINFO_DIR(i, d) (i.short1 |= (d << 5) & 0x0060)
> +#define SET_TSINFO_POLICY(i, d) (i.short1 |= (d << 7) & 0x0180)
> +#define SET_TSINFO_AGG(i, d) (i.short1 |= (d << 9) & 0x0200)
> +#define SET_TSINFO_APSD(i, d) (i.short1 |= (d << 10) & 0x0400)
> +#define SET_TSINFO_UP(i, d) (i.short1 |= (d << 11) & 0x3800)
> +#define SET_TSINFO_ACK(i, d) (i.short1 |= (d << 14) & 0xC000)
> +#define SET_TSINFO_SCHEDULE(i, d) (i.byte3 |= (d << 0) & 0x01)
Please add IEEE80211_ prefix here as well. For consistency and not
polluting a name space.
> [...]
> +enum ieee80211_tsinfo_psb {
> + WLAN_TSINFO_PSB_LEGACY = 0,
> + WLAN_TSINFO_PSB_APSD = 1,
> +};
> +
> +
> +/* WI-FI Alliance OUI Type and Subtype */
> +enum wifi_oui_type {
> + WIFI_OUI_TYPE_WPA = 1,
> + WIFI_OUI_TYPE_WMM = 2,
> + WIFI_OUI_TYPE_WSC = 4,
> + WIFI_OUI_TYPE_PSD = 6,
> +};
> +
> +enum wifi_oui_stype_wmm {
> + WIFI_OUI_STYPE_WMM_INFO = 0,
> + WIFI_OUI_STYPE_WMM_PARAM = 1,
> + WIFI_OUI_STYPE_WMM_TSPEC = 2,
> +};
Please don't invent new useless prefixes. Also, a registered trademark
doesn't seem to be a good prefix.
Thanks,
Jiri
--
Jiri Benc
SUSE Labs
On Thu, 07 Jun 2007 21:32:33 -0700, jketreno wrote:
> It doesn't really look like he invented a 'new useless' prefix. It looks
> to me like he picked a prefix that correlates attribution of the data
> declaration to the entity that created it. You may not like that he
> provided attribution, but that doesn't mean its useless.
By "useless", I meant "if you use a WLAN_ prefix like in all other #defines
in that file, it will do the same job". Ok, I understand the argument about
attribution, but it shouldn't be in exchange of consistency and clarity.
> If you'd rather use a different prefix, send a patch to fix it.
I'd appreciate if you use a WLAN_ prefix in the next respin of the patch.
> Who holds 'WIFI' as a registered trademark?
Wi-Fi Alliance? Ok, it's "Wi-Fi", but you can use only capitals in macros
and you cannot use dash, so it looks really similar.
Thanks,
Jiri
--
Jiri Benc
SUSE Labs
On Wednesday 06 June 2007 01:22, Zhu Yi wrote:
> +#define IEEE80211_TSINFO_TYPE(a) ((a.short1 & 0x0001) >> 0)
> +#define IEEE80211_TSINFO_TSID(a) ((a.short1 & 0x001E) >> 1)
> +#define IEEE80211_TSINFO_DIR(a) ((a.short1 & 0x0060) >> 5)
> +#define IEEE80211_TSINFO_POLICY(a) ((a.short1 & 0x0180) >> 7)
> +#define IEEE80211_TSINFO_AGG(a) ((a.short1 & 0x0200) >> 9)
> +#define IEEE80211_TSINFO_APSD(a) ((a.short1 & 0x0400) >> 10)
> +#define IEEE80211_TSINFO_UP(a) ((a.short1 & 0x3800) >> 11)
> +#define IEEE80211_TSINFO_ACK(a) ((a.short1 & 0xC000) >> 14)
> +#define IEEE80211_TSINFO_SCHEDULE(a) ((a.byte3 & 0x01) >> 0)
> +
> +#define SET_TSINFO_TYPE(i, d) (i.short1 |= (d << 0) & 0x0001)
> +#define SET_TSINFO_TSID(i, d) (i.short1 |= (d << 1) & 0x001E)
> +#define SET_TSINFO_DIR(i, d) (i.short1 |= (d << 5) & 0x0060)
> +#define SET_TSINFO_POLICY(i, d) (i.short1 |= (d << 7) & 0x0180)
> +#define SET_TSINFO_AGG(i, d) (i.short1 |= (d << 9) & 0x0200)
> +#define SET_TSINFO_APSD(i, d) (i.short1 |= (d << 10) & 0x0400)
> +#define SET_TSINFO_UP(i, d) (i.short1 |= (d << 11) & 0x3800)
> +#define SET_TSINFO_ACK(i, d) (i.short1 |= (d << 14) & 0xC000)
> +#define SET_TSINFO_SCHEDULE(i, d) (i.byte3 |= (d << 0) & 0x01)
> +
Everything that touches short1 looks broken on big endian.
-Michael Wu
On Fri, 2007-06-08 at 09:34 +0800, Zhu Yi wrote:
> I think we have talked this early and now you know correctly WIFI is not
> a trademark. You define IEEE80211_STYPE_ASSOC_REQ, etc, but defines
> those for Wi-Fi with WLAN prefix? WLAN prefix should be used by symbols
> defined by mac80211, for example: WLAN_CAPABILITY_ESS.
FWIW, I agree, and not using WIFI_ because it might be a trademark...
Jiri, feel free to put a note in the header that "all mentioned names
may be trademarks of their respective owners" or something, but
something that is defined by the wifi alliance should reasonably be
called WIFI_... too.
johannes
On Fri, Jun 08, 2007 at 12:49:09AM +0200, Jiri Benc wrote:
> On Thu, 07 Jun 2007 21:32:33 -0700, jketreno wrote:
> > It doesn't really look like he invented a 'new useless' prefix. It looks
> > to me like he picked a prefix that correlates attribution of the data
> > declaration to the entity that created it. You may not like that he
> > provided attribution, but that doesn't mean its useless.
>
> By "useless", I meant "if you use a WLAN_ prefix like in all other #defines
> in that file, it will do the same job". Ok, I understand the argument about
> attribution, but it shouldn't be in exchange of consistency and clarity.
WLAN_ prefix is currently mostly (only?) used for values defined in
IEEE 802.11 while the WMM parameters are defined in WFA specification,
not IEEE 802.11.
--
Jouni Malinen PGP id EFC895FA
Jiri Benc wrote:
> On Wed, 6 Jun 2007 16:22:10 +0800, Zhu Yi wrote:
>> --- a/include/linux/ieee80211.h
>> +++ b/include/linux/ieee80211.h
>> @@ -106,6 +106,52 @@ struct ieee80211_hdr {
...
>> +enum wifi_oui_stype_wmm {
>> + WIFI_OUI_STYPE_WMM_INFO = 0,
>> + WIFI_OUI_STYPE_WMM_PARAM = 1,
>> + WIFI_OUI_STYPE_WMM_TSPEC = 2,
>> +};
>
> Please don't invent new useless prefixes.
It doesn't really look like he invented a 'new useless' prefix. It looks to me like he picked a prefix that correlates attribution of the data declaration to the entity that created it. You may not like that he provided attribution, but that doesn't mean its useless.
If you'd rather use a different prefix, send a patch to fix it.
> Also, a registered trademark doesn't seem to be a good prefix.
Who holds 'WIFI' as a registered trademark?
James
On Thu, 2007-06-07 at 19:14 -0700, Michael Wu wrote:
> > +#define SET_TSINFO_ACK(i, d) (i.short1 |= (d << 14) &
> 0xC000)
> > +
> Everything that touches short1 looks broken on big endian.
No. These are safe on all endians as long as you touch short1 with these
macros. Because from the macro mask, you can see no value d is more than
a byte.
Thanks,
-yi
On Fri, Jun 08, 2007 at 12:16:28PM +0200, Jiri Benc wrote:
> No. Michael is right and I'm really blind I haven't seen that myself.
> That's totally broken. You cannot do _any_ bit operation on __le16.
>
> Let's assume that a value of short1 is 0x34 0x12 (two bytes as stored
> in a memory). Now let's look at the result of (short1 & 0xff).
>
> On a LE platform that's (0x1234 & 0xff), i.e. 0x34.
>
> On a BE platform that's (0x3412 & 0xff), i.e. 0x12.
>
> How that could be correct?
You and Michael are right. The mask (i.e 0x00ff) need a cpu_to_le16()
in this case. I will replace the short with 2 bytes to fix this issue.
Thanks,
-yi
On Thu, 2007-06-07 at 22:30 +0200, Jiri Benc wrote:
> > +#define SET_TSINFO_SCHEDULE(i, d) (i.byte3 |= (d << 0) & 0x01)
>
> Please add IEEE80211_ prefix here as well. For consistency and not
> polluting a name space.
Point accepted.
> > +enum wifi_oui_stype_wmm {
> > + WIFI_OUI_STYPE_WMM_INFO = 0,
> > + WIFI_OUI_STYPE_WMM_PARAM = 1,
> > + WIFI_OUI_STYPE_WMM_TSPEC = 2,
> > +};
>
> Please don't invent new useless prefixes. Also, a registered trademark
> doesn't seem to be a good prefix.
I think we have talked this early and now you know correctly WIFI is not
a trademark. You define IEEE80211_STYPE_ASSOC_REQ, etc, but defines
those for Wi-Fi with WLAN prefix? WLAN prefix should be used by symbols
defined by mac80211, for example: WLAN_CAPABILITY_ESS.
Thanks,
-yi
On Fri, 08 Jun 2007 11:40:19 +0800, Zhu Yi wrote:
> On Thu, 2007-06-07 at 19:14 -0700, Michael Wu wrote:
> > > +#define SET_TSINFO_ACK(i, d) (i.short1 |= (d << 14) &
> > 0xC000)
> > > +
> > Everything that touches short1 looks broken on big endian.
>
> No. These are safe on all endians as long as you touch short1 with these
> macros. Because from the macro mask, you can see no value d is more than
> a byte.
No. Michael is right and I'm really blind I haven't seen that myself.
That's totally broken. You cannot do _any_ bit operation on __le16.
Let's assume that a value of short1 is 0x34 0x12 (two bytes as stored
in a memory). Now let's look at the result of (short1 & 0xff).
On a LE platform that's (0x1234 & 0xff), i.e. 0x34.
On a BE platform that's (0x3412 & 0xff), i.e. 0x12.
How that could be correct?
Jiri
--
Jiri Benc
SUSE Labs
On Fri, 08 Jun 2007 09:34:37 +0800, Zhu Yi wrote:
> On Thu, 2007-06-07 at 22:30 +0200, Jiri Benc wrote:
> > > +#define SET_TSINFO_SCHEDULE(i, d) (i.byte3 |= (d << 0) & 0x01)
> >
> > Please add IEEE80211_ prefix here as well. For consistency and not
> > polluting a name space.
>
> Point accepted.
Thanks :-)
> I think we have talked this early and now you know correctly WIFI is not
> a trademark. You define IEEE80211_STYPE_ASSOC_REQ, etc, but defines
> those for Wi-Fi with WLAN prefix? WLAN prefix should be used by symbols
> defined by mac80211, for example: WLAN_CAPABILITY_ESS.
You and Jouni are right, WLAN_ is used for IEEE 802.11 stuff. So
another prefix makes sense here. And I realized my other comment wasn't
meaningful too, as also IEEE 802.11 is a trademark. ACK for those
names, thanks for the clarification.
Jiri
--
Jiri Benc
SUSE Labs