|
@@ -19,6 +19,7 @@
|
|
|
|
|
|
#include <linux/types.h>
|
|
|
#include <linux/if_ether.h>
|
|
|
+#include <linux/etherdevice.h>
|
|
|
#include <asm/byteorder.h>
|
|
|
#include <asm/unaligned.h>
|
|
|
|
|
@@ -2486,6 +2487,35 @@ static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr,
|
|
|
return mgmt->u.action.category == WLAN_CATEGORY_PUBLIC;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * _ieee80211_is_group_privacy_action - check if frame is a group addressed
|
|
|
+ * privacy action frame
|
|
|
+ * @hdr: the frame
|
|
|
+ */
|
|
|
+static inline bool _ieee80211_is_group_privacy_action(struct ieee80211_hdr *hdr)
|
|
|
+{
|
|
|
+ struct ieee80211_mgmt *mgmt = (void *)hdr;
|
|
|
+
|
|
|
+ if (!ieee80211_is_action(hdr->frame_control) ||
|
|
|
+ !is_multicast_ether_addr(hdr->addr1))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ return mgmt->u.action.category == WLAN_CATEGORY_MESH_ACTION ||
|
|
|
+ mgmt->u.action.category == WLAN_CATEGORY_MULTIHOP_ACTION;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * ieee80211_is_group_privacy_action - check if frame is a group addressed
|
|
|
+ * privacy action frame
|
|
|
+ * @skb: the skb containing the frame, length will be checked
|
|
|
+ */
|
|
|
+static inline bool ieee80211_is_group_privacy_action(struct sk_buff *skb)
|
|
|
+{
|
|
|
+ if (skb->len < IEEE80211_MIN_ACTION_SIZE)
|
|
|
+ return false;
|
|
|
+ return _ieee80211_is_group_privacy_action((void *)skb->data);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* ieee80211_tu_to_usec - convert time units (TU) to microseconds
|
|
|
* @tu: the TUs
|