Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F147778601
D36615.1784346377.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D36615.1784346377.diff
View Options
diff --git a/sys/net80211/ieee80211.h b/sys/net80211/ieee80211.h
--- a/sys/net80211/ieee80211.h
+++ b/sys/net80211/ieee80211.h
@@ -192,24 +192,114 @@
#define IEEE80211_CTL_EXT_TDD_BF 0x0b /* TDD Beamforming, 80211ay-2021 */
/* 1100-1111 Reserved 0xc-0xf */
+/* Check the version field */
+#define IEEE80211_IS_FC0_CHECK_VER(wh, v) \
+ (((wh)->i_fc[0] & IEEE80211_FC0_VERSION_MASK) == (v))
+
+/* Check the version and type field */
+#define IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, v, t) \
+ (((((wh)->i_fc[0] & IEEE80211_FC0_VERSION_MASK) == (v))) && \
+ (((wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == (t)))
+
+/* Check the version, type and subtype field */
+#define IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, v, t, st) \
+ (((((wh)->i_fc[0] & IEEE80211_FC0_VERSION_MASK) == (v))) && \
+ (((wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == (t)) && \
+ (((wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) == (st)))
+
+/* Frame version/type checks - mgmt, ctl, data, all version 0 */
+
#define IEEE80211_IS_MGMT(wh) \
- (!! (((wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK) \
- == IEEE80211_FC0_TYPE_MGT))
+ (IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_MGT))
#define IEEE80211_IS_CTL(wh) \
- (!! (((wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK) \
- == IEEE80211_FC0_TYPE_CTL))
+ (IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_CTL))
#define IEEE80211_IS_DATA(wh) \
- (!! (((wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK) \
- == IEEE80211_FC0_TYPE_DATA))
+ (IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_DATA))
#define IEEE80211_IS_EXT(wh) \
- (!! (((wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK) \
- == IEEE80211_FC0_TYPE_EXT))
+ (IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_EXT))
+
+/* Management frame types */
+
+#define IEEE80211_IS_BEACON(wh) \
+ (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
+ IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_MGT, \
+ IEEE80211_FC0_SUBTYPE_BEACON)) \
+
+#define IEEE80211_IS_AUTH(wh) \
+ (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
+ IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_MGT, \
+ IEEE80211_FC0_SUBTYPE_AUTH)) \
+
+/*
+ * Note: ACTION and ACTION_NOACK are both action frames, just
+ * the ACK is different.
+ */
+#define IEEE80211_IS_ACTION_ACK(wh) \
+ (IEEE80211_IS_MGMT(wh) && \
+ (((wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) \
+ == IEEE80211_FC0_SUBTYPE_ACTION))
+#define IEEE80211_IS_ACTION_NOACK(wh) \
+ (IEEE80211_IS_MGMT(wh) && \
+ (((wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) \
+ == IEEE80211_FC0_SUBTYPE_ACTION_NOACK))
+#define IEEE80211_IS_ACTION(wh) \
+ ((IEEE80211_IS_ACTION_ACK(wh)) || \
+ (IEEE80211_IS_ACTION_NOACK(wh)))
+
+#define IEEE80211_IS_DEAUTH(wh) \
+ (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
+ IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_MGT, \
+ IEEE80211_FC0_SUBTYPE_DEAUTH)) \
+
+#define IEEE80211_IS_DISASSOC(wh) \
+ (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
+ IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_MGT, \
+ IEEE80211_FC0_SUBTYPE_DISASSOC)) \
+
+/* Control frame types */
+
+/* Data frame types */
#define IEEE80211_FC0_QOSDATA \
(IEEE80211_FC0_TYPE_DATA|IEEE80211_FC0_SUBTYPE_QOS_DATA|IEEE80211_FC0_VERSION_0)
+/*
+ * This returns true if it's any of the QOS frame types, not just
+ * data frames.
+ */
+#define IEEE80211_IS_QOS_ANY(wh) \
+ ((IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_DATA)) && \
+ ((wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS_DATA))
+
+/* This is /only/ for QOS data */
#define IEEE80211_IS_QOSDATA(wh) \
- ((wh)->i_fc[0] == IEEE80211_FC0_QOSDATA)
+ (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
+ IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_DATA, \
+ IEEE80211_FC0_SUBTYPE_QOS_DATA)) \
+
+/* This is /only/ for non-QoS NULL frames */
+#define IEEE80211_IS_DATA_NULL(wh) \
+ (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
+ IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_DATA, \
+ IEEE80211_FC0_SUBTYPE_NODATA)) \
+
+/* This is /only/ for QoS NULL frames */
+#define IEEE80211_IS_DATA_QOSNULL(wh) \
+ (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
+ IEEE80211_FC0_VERSION_0, \
+ IEEE80211_FC0_TYPE_DATA, \
+ IEEE80211_FC0_SUBTYPE_QOS_NULL)) \
#define IEEE80211_FC1_DIR_MASK 0x03
#define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */
diff --git a/sys/net80211/ieee80211_adhoc.c b/sys/net80211/ieee80211_adhoc.c
--- a/sys/net80211/ieee80211_adhoc.c
+++ b/sys/net80211/ieee80211_adhoc.c
@@ -366,8 +366,7 @@
*/
wh = mtod(m, struct ieee80211_frame *);
- if ((wh->i_fc[0] & IEEE80211_FC0_VERSION_MASK) !=
- IEEE80211_FC0_VERSION_0) {
+ if (! IEEE80211_IS_FC0_CHECK_VER(wh, IEEE80211_FC0_VERSION_0)) {
IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
ni->ni_macaddr, NULL, "wrong version, fc %02x:%02x",
wh->i_fc[0], wh->i_fc[1]);
diff --git a/sys/net80211/ieee80211_crypto_tkip.c b/sys/net80211/ieee80211_crypto_tkip.c
--- a/sys/net80211/ieee80211_crypto_tkip.c
+++ b/sys/net80211/ieee80211_crypto_tkip.c
@@ -862,7 +862,8 @@
break;
}
- if (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS_DATA) {
+ /* Note: yes this is checking if it's /any/ QoS frame */
+ if (IEEE80211_IS_QOS_ANY(wh)) {
const struct ieee80211_qosframe *qwh =
(const struct ieee80211_qosframe *) wh;
hdr[12] = qwh->i_qos[0] & IEEE80211_QOS_TID;
diff --git a/sys/net80211/ieee80211_hostap.c b/sys/net80211/ieee80211_hostap.c
--- a/sys/net80211/ieee80211_hostap.c
+++ b/sys/net80211/ieee80211_hostap.c
@@ -532,8 +532,7 @@
*/
wh = mtod(m, struct ieee80211_frame *);
- if ((wh->i_fc[0] & IEEE80211_FC0_VERSION_MASK) !=
- IEEE80211_FC0_VERSION_0) {
+ if (! IEEE80211_IS_FC0_CHECK_VER(wh,IEEE80211_FC0_VERSION_0)) {
IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
ni->ni_macaddr, NULL, "wrong version, fc %02x:%02x",
wh->i_fc[0], wh->i_fc[1]);
diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c
--- a/sys/net80211/ieee80211_ht.c
+++ b/sys/net80211/ieee80211_ht.c
@@ -1019,7 +1019,7 @@
/* NB: m_len known to be sufficient */
wh = mtod(m, struct ieee80211_qosframe *);
- if (wh->i_fc[0] != IEEE80211_FC0_QOSDATA) {
+ if (! IEEE80211_IS_QOSDATA(wh)) {
/*
* Not QoS data, shouldn't get here but just
* return it to the caller for processing.
diff --git a/sys/net80211/ieee80211_mesh.c b/sys/net80211/ieee80211_mesh.c
--- a/sys/net80211/ieee80211_mesh.c
+++ b/sys/net80211/ieee80211_mesh.c
@@ -1567,8 +1567,7 @@
*/
wh = mtod(m, struct ieee80211_frame *);
- if ((wh->i_fc[0] & IEEE80211_FC0_VERSION_MASK) !=
- IEEE80211_FC0_VERSION_0) {
+ if (! IEEE80211_IS_FC0_CHECK_VER(wh, IEEE80211_FC0_VERSION_0)) {
IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
ni->ni_macaddr, NULL, "wrong version %x", wh->i_fc[0]);
vap->iv_stats.is_rx_badversion++;
diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c
--- a/sys/net80211/ieee80211_output.c
+++ b/sys/net80211/ieee80211_output.c
@@ -604,8 +604,7 @@
return (EINVAL);
wh = mtod(m, struct ieee80211_frame *);
- if ((wh->i_fc[0] & IEEE80211_FC0_VERSION_MASK) !=
- IEEE80211_FC0_VERSION_0)
+ if (! IEEE80211_IS_FC0_CHECK_VER(wh, IEEE80211_FC0_VERSION_0))
return (EINVAL);
type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
diff --git a/sys/net80211/ieee80211_proto.h b/sys/net80211/ieee80211_proto.h
--- a/sys/net80211/ieee80211_proto.h
+++ b/sys/net80211/ieee80211_proto.h
@@ -325,6 +325,22 @@
return (((struct ieee80211_qosframe *)wh)->i_qos);
}
+/*
+ * Return offset to the QoS field from a QOS frame.
+ */
+static __inline int
+ieee80211_getqos_offset(void *data)
+{
+ struct ieee80211_frame *wh = data;
+
+ KASSERT(IEEE80211_QOS_HAS_SEQ(wh), ("QoS field is absent!"));
+
+ if (IEEE80211_IS_DSTODS(wh))
+ return 30;
+ else
+ return 24;
+}
+
/*
* Return the WME TID from a QoS frame. If no TID
* is present return the index for the "non-QoS" entry.
diff --git a/sys/net80211/ieee80211_sta.c b/sys/net80211/ieee80211_sta.c
--- a/sys/net80211/ieee80211_sta.c
+++ b/sys/net80211/ieee80211_sta.c
@@ -572,8 +572,7 @@
vap->iv_stats.is_rx_tooshort++;
goto err;
}
- if ((wh->i_fc[0] & IEEE80211_FC0_VERSION_MASK) !=
- IEEE80211_FC0_VERSION_0) {
+ if (! IEEE80211_IS_FC0_CHECK_VER(wh, IEEE80211_FC0_VERSION_0)) {
IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
ni->ni_macaddr, NULL, "wrong version, fc %02x:%02x",
wh->i_fc[0], wh->i_fc[1]);
diff --git a/sys/net80211/ieee80211_wds.c b/sys/net80211/ieee80211_wds.c
--- a/sys/net80211/ieee80211_wds.c
+++ b/sys/net80211/ieee80211_wds.c
@@ -469,8 +469,7 @@
if (!IEEE80211_IS_MULTICAST(wh->i_addr1))
ni->ni_inact = ni->ni_inact_reload;
- if ((wh->i_fc[0] & IEEE80211_FC0_VERSION_MASK) !=
- IEEE80211_FC0_VERSION_0) {
+ if (! IEEE80211_IS_FC0_CHECK_VER(wh, IEEE80211_FC0_VERSION_0)) {
IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
ni->ni_macaddr, NULL, "wrong version, fc %02x:%02x",
wh->i_fc[0], wh->i_fc[1]);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jul 18, 3:46 AM (1 h, 52 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29178422
Default Alt Text
D36615.1784346377.diff (8 KB)
Attached To
Mode
D36615: net80211: clean up / add more macros to check the frame types
Attached
Detach File
Event Timeline
Log In to Comment