@@ -205,22 +205,33 @@ static int iwl_mvm_create_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
return 0;
}
+/* put a TLV on the skb and return data pointer
+ *
+ * Also pad to 4 the len and zero out all data part
+ */
+static void *
+iwl_mvm_radiotap_put_tlv(struct sk_buff *skb, u16 type, u16 len)
+{
+ struct ieee80211_radiotap_tlv *tlv;
+
+ tlv = skb_put(skb, sizeof(*tlv));
+ tlv->type = cpu_to_le16(type);
+ tlv->len = cpu_to_le16(len);
+ return skb_put_zero(skb, ALIGN(len, 4));
+}
+
static void iwl_mvm_add_rtap_sniffer_config(struct iwl_mvm *mvm,
struct sk_buff *skb)
{
struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
- struct ieee80211_radiotap_vendor_tlv *radiotap;
+ struct ieee80211_radiotap_vendor_content *radiotap;
const u16 vendor_data_len = sizeof(mvm->cur_aid);
- const u16 padding = ALIGN(vendor_data_len, 4) - vendor_data_len;
if (!mvm->cur_aid)
return;
- radiotap = skb_put(skb, sizeof(*radiotap) + vendor_data_len + padding);
- radiotap->type = cpu_to_le16(IEEE80211_RADIOTAP_VENDOR_NAMESPACE);
- radiotap->len = cpu_to_le16(sizeof(*radiotap) -
- sizeof(struct ieee80211_radiotap_tlv) +
- vendor_data_len);
+ radiotap = iwl_mvm_radiotap_put_tlv(skb, IEEE80211_RADIOTAP_VENDOR_NAMESPACE,
+ sizeof(*radiotap) + vendor_data_len);
/* Intel OUI */
radiotap->oui[0] = 0xf6;
@@ -229,12 +240,9 @@ static void iwl_mvm_add_rtap_sniffer_config(struct iwl_mvm *mvm,
/* radiotap sniffer config sub-namespace */
radiotap->oui_subtype = 1;
radiotap->vendor_type = 0;
- /* clear reserved field */
- radiotap->reserved = 0;
+
/* fill the data now */
memcpy(radiotap->data, &mvm->cur_aid, sizeof(mvm->cur_aid));
- /* and clear the padding */
- memset(radiotap->data + vendor_data_len, 0, padding);
rx_status->flag |= RX_FLAG_RADIOTAP_TLV_AT_END;
}
@@ -1556,14 +1556,14 @@ static void mac80211_hwsim_add_vendor_rtap(struct sk_buff *skb)
sizeof(vendor_data));
rtap->type = cpu_to_le16(IEEE80211_RADIOTAP_VENDOR_NAMESPACE);
- rtap->oui[0] = HWSIM_RADIOTAP_OUI[0];
- rtap->oui[1] = HWSIM_RADIOTAP_OUI[1];
- rtap->oui[2] = HWSIM_RADIOTAP_OUI[2];
- rtap->oui_subtype = 127;
+ rtap->content.oui[0] = HWSIM_RADIOTAP_OUI[0];
+ rtap->content.oui[1] = HWSIM_RADIOTAP_OUI[1];
+ rtap->content.oui[2] = HWSIM_RADIOTAP_OUI[2];
+ rtap->content.oui_subtype = 127;
/* clear reserved field */
- rtap->reserved = 0;
- rtap->vendor_type = 0;
- memcpy(rtap->data, vendor_data, sizeof(vendor_data));
+ rtap->content.reserved = 0;
+ rtap->content.vendor_type = 0;
+ memcpy(rtap->content.data, vendor_data, sizeof(vendor_data));
IEEE80211_SKB_RXCB(skb)->flag |= RX_FLAG_RADIOTAP_TLV_AT_END;
#endif
@@ -370,18 +370,14 @@ struct ieee80211_radiotap_tlv {
} __packed;
/**
- * struct ieee80211_radiotap_vendor_tlv - vendor radiotap data information
- * @type: should always be set to IEEE80211_RADIOTAP_VENDOR_NAMESPACE
- * @len: length of data
+ * struct ieee80211_radiotap_vendor_content - vendor radiotap content information
* @oui: radiotap vendor namespace OUI
* @oui_subtype: radiotap vendor sub namespace
* @vendor_type: radiotap vendor type
* @reserved: should always be set to zero (to avoid leaking memory)
* @data: the actual vendor namespace data
*/
-struct ieee80211_radiotap_vendor_tlv {
- __le16 type; /* IEEE80211_RADIOTAP_VENDOR_NAMESPACE */
- __le16 len;
+struct ieee80211_radiotap_vendor_content {
u8 oui[3];
u8 oui_subtype;
__le16 vendor_type;
@@ -389,6 +385,18 @@ struct ieee80211_radiotap_vendor_tlv {
u8 data[];
} __packed;
+/**
+ * struct ieee80211_radiotap_vendor_tlv - vendor radiotap data information
+ * @type: should always be set to IEEE80211_RADIOTAP_VENDOR_NAMESPACE
+ * @len: length of data
+ * @content: vendor content see @ieee80211_radiotap_vendor_content
+ */
+struct ieee80211_radiotap_vendor_tlv {
+ __le16 type; /* IEEE80211_RADIOTAP_VENDOR_NAMESPACE */
+ __le16 len;
+ struct ieee80211_radiotap_vendor_content content;
+};
+
/* ieee80211_radiotap_eht_usig - content of U-SIG tlv (type 33)
* see www.radiotap.org/fields/U-SIG.html for details
*/