Module Name: src Committed By: christos Date: Sat Mar 30 01:05:49 UTC 2013
Modified Files: src/sys/net80211: ieee80211.h ieee80211_proto.h Log Message: EDCA and QOS additions from OpenBSD To generate a diff of this commit: cvs rdiff -u -r1.22 -r1.23 src/sys/net80211/ieee80211.h cvs rdiff -u -r1.19 -r1.20 src/sys/net80211/ieee80211_proto.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net80211/ieee80211.h diff -u src/sys/net80211/ieee80211.h:1.22 src/sys/net80211/ieee80211.h:1.23 --- src/sys/net80211/ieee80211.h:1.22 Mon Aug 20 03:30:10 2012 +++ src/sys/net80211/ieee80211.h Fri Mar 29 21:05:48 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: ieee80211.h,v 1.22 2012/08/20 07:30:10 christos Exp $ */ +/* $NetBSD: ieee80211.h,v 1.23 2013/03/30 01:05:48 christos Exp $ */ /*- * Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting @@ -149,6 +149,21 @@ struct ieee80211_qosframe_addr4 { #define IEEE80211_FC0_SUBTYPE_QOS 0x80 #define IEEE80211_FC0_SUBTYPE_QOS_NULL 0xc0 +/* + * DS bit usage + * + * TA = transmitter address + * RA = receiver address + * DA = destination address + * SA = source address + * + * ToDS FromDS A1(RA) A2(TA) A3 A4 Use + * ----------------------------------------------------------------- + * 0 0 DA SA BSSID - IBSS/DLS + * 0 1 DA BSSID SA - AP -> STA + * 1 0 BSSID SA DA - AP <- STA + * 1 1 RA TA DA SA unspecified (WDS) + */ #define IEEE80211_FC1_DIR_MASK 0x03 #define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */ #define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */ @@ -188,12 +203,24 @@ struct ieee80211_qosframe_addr4 { #define IEEE80211_QOS_TID 0x000f /* does frame have QoS sequence control data */ +/* XXX: use ieee80211_has_qos() instead */ #define IEEE80211_QOS_HAS_SEQ(wh) \ (((wh)->i_fc[0] & \ (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS)) == \ (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS)) /* + * EDCA Access Categories. + */ +enum ieee80211_edca_ac { + EDCA_AC_BK = 1, /* Background */ + EDCA_AC_BE = 0, /* Best Effort */ + EDCA_AC_VI = 2, /* Video */ + EDCA_AC_VO = 3 /* Voice */ +}; +#define EDCA_NUM_AC 4 + +/* * WME/802.11e information element. */ struct ieee80211_wme_info { @@ -346,6 +373,50 @@ struct ieee80211_frame_cfend { /* NB: a /* FCS */ } __packed; +static __inline int +ieee80211_has_seq(const struct ieee80211_frame *wh) +{ + return (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != + IEEE80211_FC0_TYPE_CTL; +} + +static __inline int +ieee80211_has_addr4(const struct ieee80211_frame *wh) +{ + return (wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) == + IEEE80211_FC1_DIR_DSTODS; +} + +static __inline int +ieee80211_has_qos(const struct ieee80211_frame *wh) +{ + return (wh->i_fc[0] & + (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS)) == + (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS); +} + +static __inline int +ieee80211_has_htc(const struct ieee80211_frame *wh) +{ + return (wh->i_fc[1] & IEEE80211_FC1_ORDER) && + (ieee80211_has_qos(wh) || + (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == + IEEE80211_FC0_TYPE_MGT); +} + +static __inline u_int16_t +ieee80211_get_qos(const struct ieee80211_frame *wh) +{ + const u_int8_t *frm; + + if (ieee80211_has_addr4(wh)) + frm = ((const struct ieee80211_qosframe_addr4 *)wh)->i_qos; + else + frm = ((const struct ieee80211_qosframe *)wh)->i_qos; + + return le16toh(*(const u_int16_t *)frm); +} + /* * BEACON management packets * Index: src/sys/net80211/ieee80211_proto.h diff -u src/sys/net80211/ieee80211_proto.h:1.19 src/sys/net80211/ieee80211_proto.h:1.20 --- src/sys/net80211/ieee80211_proto.h:1.19 Thu Jan 10 12:40:10 2013 +++ src/sys/net80211/ieee80211_proto.h Fri Mar 29 21:05:48 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: ieee80211_proto.h,v 1.19 2013/01/10 17:40:10 christos Exp $ */ +/* $NetBSD: ieee80211_proto.h,v 1.20 2013/03/30 01:05:48 christos Exp $ */ /*- * Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting @@ -223,7 +223,7 @@ void ieee80211_wme_updateparams_locked(s #define ieee80211_new_state(_ic, _nstate, _arg) \ (((_ic)->ic_newstate)((_ic), (_nstate), (_arg))) -extern int ieee80211_compute_duration(const struct ieee80211_frame_min *, +int ieee80211_compute_duration(const struct ieee80211_frame_min *, const struct ieee80211_key *, int, uint32_t, int, int, struct ieee80211_duration *, struct ieee80211_duration *, int *, int); @@ -263,4 +263,5 @@ void ieee80211_notify_node_join(struct i void ieee80211_notify_node_leave(struct ieee80211com *, struct ieee80211_node *); void ieee80211_notify_scan_done(struct ieee80211com *); + #endif /* !_NET80211_IEEE80211_PROTO_H_ */