Page MenuHomeFreeBSD

D36615.1784346377.diff
No OneTemporary

Size
8 KB
Referenced Files
None
Subscribers
None

D36615.1784346377.diff

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

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)

Event Timeline