Some more updates:
* use shash in mac80211 crypto code where applicable * some documentation fixes * pass RSSI levels up in change notifications * remove unused rfkill-regulator * various other cleanups -----BEGIN PGP SIGNATURE----- iQIcBAABCgAGBQJYnHuZAAoJEGt7eEactAAdorYP/iIfEZjLblLZNui+93OHpmsq QgXeQ9Vl/Xgq8g6vEb6jpHE6pvT/xoW/jt0s5rpYpPDzP7WRgkFQI144Jflx9gE+ 7KRHYc7k9XqugbFGFakjT+DyduxrGkEhZ7Vpd39D+zlPaf+p/31Jk6C4MNwk2oG3 AA7ARUJfOKGpct3+l+cpnWQPUYQQKrSnjnMIwHL3Tu5pvGPDapdDWXbfn6T75Aof 3oVQSNtbEtdzW/Ty+HgDn/boOCRXzXlOCxFlE7OiH2AXfe2mqGU/hkcm/wZ0QxOf 9m3CxVjKH10tY6nsjDiXTOzFn+Zkzuum9/gcKtsgx+6BZ4qod2XuhtzmTeXggI8F b7nGeadSfSS6/unUu5Fibdn+X4Cw8+Yu5Qyiwo+jLL6yyTLUg6aKN6N9HWddhBfa pIjWAZVA1iB2m2XqUqRB/asEhslndSSfDmZK8nruYJSZWtQBNkNUdHXqqbqbBSHv KtKbHMOKoLU4zKmV2vMWGy0qypZCxtZkNF6GURhMh2m89qBcIAApFwQMzK09MwmP d5TcMwfi8YcKRb1Gw6n7gnJsC8e+tFDGXMi9w6z0FDGZvMbOlnO3ctSd/BY3B01H DWimkX8Ev3kt6KKTgbJ/n0lR/vEmDGdKo2ahH1uHOTPudrjpOHUg0cdDzS/VPZqi Qw4+FbVArISNrI2skTrA =sqkq -----END PGP SIGNATURE----- Merge tag 'mac80211-next-for-davem-2017-02-09' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next Johannes Berg says: ==================== Some more updates: * use shash in mac80211 crypto code where applicable * some documentation fixes * pass RSSI levels up in change notifications * remove unused rfkill-regulator * various other cleanups ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
0d2164af26
|
@ -586,6 +586,7 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
|
|||
ieee80211_cqm_rssi_notify(
|
||||
vif,
|
||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
||||
sig,
|
||||
GFP_KERNEL);
|
||||
} else if (sig > thold &&
|
||||
(last_event == 0 || sig > last_event + hyst)) {
|
||||
|
@ -595,6 +596,7 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
|
|||
ieee80211_cqm_rssi_notify(
|
||||
vif,
|
||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
|
||||
sig,
|
||||
GFP_KERNEL);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -824,7 +824,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
|
|||
case EVENT_RSSI_LOW:
|
||||
cfg80211_cqm_rssi_notify(priv->netdev,
|
||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
||||
GFP_KERNEL);
|
||||
0, GFP_KERNEL);
|
||||
mwifiex_send_cmd(priv, HostCmd_CMD_RSSI_INFO,
|
||||
HostCmd_ACT_GEN_GET, 0, NULL, false);
|
||||
priv->subsc_evt_rssi_state = RSSI_LOW_RECVD;
|
||||
|
@ -839,7 +839,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
|
|||
case EVENT_RSSI_HIGH:
|
||||
cfg80211_cqm_rssi_notify(priv->netdev,
|
||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
|
||||
GFP_KERNEL);
|
||||
0, GFP_KERNEL);
|
||||
mwifiex_send_cmd(priv, HostCmd_CMD_RSSI_INFO,
|
||||
HostCmd_ACT_GEN_GET, 0, NULL, false);
|
||||
priv->subsc_evt_rssi_state = RSSI_HIGH_RECVD;
|
||||
|
|
|
@ -3187,7 +3187,7 @@ static void rndis_do_cqm(struct usbnet *usbdev, s32 rssi)
|
|||
return;
|
||||
|
||||
priv->last_cqm_event_rssi = rssi;
|
||||
cfg80211_cqm_rssi_notify(usbdev->net, event, GFP_KERNEL);
|
||||
cfg80211_cqm_rssi_notify(usbdev->net, event, rssi, GFP_KERNEL);
|
||||
}
|
||||
|
||||
#define DEVICE_POLLER_JIFFIES (HZ)
|
||||
|
|
|
@ -877,7 +877,7 @@ static void rsi_perform_cqm(struct rsi_common *common,
|
|||
|
||||
common->cqm_info.last_cqm_event_rssi = rssi;
|
||||
rsi_dbg(INFO_ZONE, "CQM: Notifying event: %d\n", event);
|
||||
ieee80211_cqm_rssi_notify(adapter->vifs[0], event, GFP_KERNEL);
|
||||
ieee80211_cqm_rssi_notify(adapter->vifs[0], event, rssi, GFP_KERNEL);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -1019,7 +1019,7 @@ void cw1200_event_handler(struct work_struct *work)
|
|||
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW :
|
||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH;
|
||||
pr_debug("[CQM] RSSI event: %d.\n", rcpi_rssi);
|
||||
ieee80211_cqm_rssi_notify(priv->vif, cqm_evt,
|
||||
ieee80211_cqm_rssi_notify(priv->vif, cqm_evt, rcpi_rssi,
|
||||
GFP_KERNEL);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -150,7 +150,7 @@ static int wl1251_event_process(struct wl1251 *wl, struct event_mailbox *mbox)
|
|||
"ROAMING_TRIGGER_LOW_RSSI_EVENT");
|
||||
ieee80211_cqm_rssi_notify(wl->vif,
|
||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
||||
GFP_KERNEL);
|
||||
0, GFP_KERNEL);
|
||||
}
|
||||
|
||||
if (vector & ROAMING_TRIGGER_REGAINED_RSSI_EVENT_ID) {
|
||||
|
@ -158,7 +158,7 @@ static int wl1251_event_process(struct wl1251 *wl, struct event_mailbox *mbox)
|
|||
"ROAMING_TRIGGER_REGAINED_RSSI_EVENT");
|
||||
ieee80211_cqm_rssi_notify(wl->vif,
|
||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
|
||||
GFP_KERNEL);
|
||||
0, GFP_KERNEL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -129,7 +129,8 @@ void wlcore_event_rssi_trigger(struct wl1271 *wl, s8 *metric_arr)
|
|||
|
||||
vif = wl12xx_wlvif_to_vif(wlvif);
|
||||
if (event != wlvif->last_rssi_event)
|
||||
ieee80211_cqm_rssi_notify(vif, event, GFP_KERNEL);
|
||||
ieee80211_cqm_rssi_notify(vif, event, metric,
|
||||
GFP_KERNEL);
|
||||
wlvif->last_rssi_event = event;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1043,8 +1043,9 @@ struct ieee80211_mgmt {
|
|||
} u;
|
||||
} __packed __aligned(2);
|
||||
|
||||
/* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */
|
||||
/* Supported rates membership selectors */
|
||||
#define BSS_MEMBERSHIP_SELECTOR_HT_PHY 127
|
||||
#define BSS_MEMBERSHIP_SELECTOR_VHT_PHY 126
|
||||
|
||||
/* mgmt header + 1 byte category code */
|
||||
#define IEEE80211_MIN_ACTION_SIZE offsetof(struct ieee80211_mgmt, u.action.u)
|
||||
|
@ -2324,31 +2325,33 @@ enum ieee80211_sa_query_action {
|
|||
};
|
||||
|
||||
|
||||
/* cipher suite selectors */
|
||||
#define WLAN_CIPHER_SUITE_USE_GROUP 0x000FAC00
|
||||
#define WLAN_CIPHER_SUITE_WEP40 0x000FAC01
|
||||
#define WLAN_CIPHER_SUITE_TKIP 0x000FAC02
|
||||
/* reserved: 0x000FAC03 */
|
||||
#define WLAN_CIPHER_SUITE_CCMP 0x000FAC04
|
||||
#define WLAN_CIPHER_SUITE_WEP104 0x000FAC05
|
||||
#define WLAN_CIPHER_SUITE_AES_CMAC 0x000FAC06
|
||||
#define WLAN_CIPHER_SUITE_GCMP 0x000FAC08
|
||||
#define WLAN_CIPHER_SUITE_GCMP_256 0x000FAC09
|
||||
#define WLAN_CIPHER_SUITE_CCMP_256 0x000FAC0A
|
||||
#define WLAN_CIPHER_SUITE_BIP_GMAC_128 0x000FAC0B
|
||||
#define WLAN_CIPHER_SUITE_BIP_GMAC_256 0x000FAC0C
|
||||
#define WLAN_CIPHER_SUITE_BIP_CMAC_256 0x000FAC0D
|
||||
#define SUITE(oui, id) (((oui) << 8) | (id))
|
||||
|
||||
#define WLAN_CIPHER_SUITE_SMS4 0x00147201
|
||||
/* cipher suite selectors */
|
||||
#define WLAN_CIPHER_SUITE_USE_GROUP SUITE(0x000FAC, 0)
|
||||
#define WLAN_CIPHER_SUITE_WEP40 SUITE(0x000FAC, 1)
|
||||
#define WLAN_CIPHER_SUITE_TKIP SUITE(0x000FAC, 2)
|
||||
/* reserved: SUITE(0x000FAC, 3) */
|
||||
#define WLAN_CIPHER_SUITE_CCMP SUITE(0x000FAC, 4)
|
||||
#define WLAN_CIPHER_SUITE_WEP104 SUITE(0x000FAC, 5)
|
||||
#define WLAN_CIPHER_SUITE_AES_CMAC SUITE(0x000FAC, 6)
|
||||
#define WLAN_CIPHER_SUITE_GCMP SUITE(0x000FAC, 8)
|
||||
#define WLAN_CIPHER_SUITE_GCMP_256 SUITE(0x000FAC, 9)
|
||||
#define WLAN_CIPHER_SUITE_CCMP_256 SUITE(0x000FAC, 10)
|
||||
#define WLAN_CIPHER_SUITE_BIP_GMAC_128 SUITE(0x000FAC, 11)
|
||||
#define WLAN_CIPHER_SUITE_BIP_GMAC_256 SUITE(0x000FAC, 12)
|
||||
#define WLAN_CIPHER_SUITE_BIP_CMAC_256 SUITE(0x000FAC, 13)
|
||||
|
||||
#define WLAN_CIPHER_SUITE_SMS4 SUITE(0x001472, 1)
|
||||
|
||||
/* AKM suite selectors */
|
||||
#define WLAN_AKM_SUITE_8021X 0x000FAC01
|
||||
#define WLAN_AKM_SUITE_PSK 0x000FAC02
|
||||
#define WLAN_AKM_SUITE_8021X_SHA256 0x000FAC05
|
||||
#define WLAN_AKM_SUITE_PSK_SHA256 0x000FAC06
|
||||
#define WLAN_AKM_SUITE_TDLS 0x000FAC07
|
||||
#define WLAN_AKM_SUITE_SAE 0x000FAC08
|
||||
#define WLAN_AKM_SUITE_FT_OVER_SAE 0x000FAC09
|
||||
#define WLAN_AKM_SUITE_8021X SUITE(0x000FAC, 1)
|
||||
#define WLAN_AKM_SUITE_PSK SUITE(0x000FAC, 2)
|
||||
#define WLAN_AKM_SUITE_8021X_SHA256 SUITE(0x000FAC, 5)
|
||||
#define WLAN_AKM_SUITE_PSK_SHA256 SUITE(0x000FAC, 6)
|
||||
#define WLAN_AKM_SUITE_TDLS SUITE(0x000FAC, 7)
|
||||
#define WLAN_AKM_SUITE_SAE SUITE(0x000FAC, 8)
|
||||
#define WLAN_AKM_SUITE_FT_OVER_SAE SUITE(0x000FAC, 9)
|
||||
|
||||
#define WLAN_MAX_KEY_LEN 32
|
||||
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* rfkill-regulator.c - Regulator consumer driver for rfkill
|
||||
*
|
||||
* Copyright (C) 2009 Guiming Zhuo <gmzhuo@gmail.com>
|
||||
* Copyright (C) 2011 Antonio Ospite <ospite@studenti.unina.it>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_RFKILL_REGULATOR_H
|
||||
#define __LINUX_RFKILL_REGULATOR_H
|
||||
|
||||
/*
|
||||
* Use "vrfkill" as supply id when declaring the regulator consumer:
|
||||
*
|
||||
* static struct regulator_consumer_supply pcap_regulator_V6_consumers [] = {
|
||||
* { .dev_name = "rfkill-regulator.0", .supply = "vrfkill" },
|
||||
* };
|
||||
*
|
||||
* If you have several regulator driven rfkill, you can append a numerical id to
|
||||
* .dev_name as done above, and use the same id when declaring the platform
|
||||
* device:
|
||||
*
|
||||
* static struct rfkill_regulator_platform_data ezx_rfkill_bt_data = {
|
||||
* .name = "ezx-bluetooth",
|
||||
* .type = RFKILL_TYPE_BLUETOOTH,
|
||||
* };
|
||||
*
|
||||
* static struct platform_device a910_rfkill = {
|
||||
* .name = "rfkill-regulator",
|
||||
* .id = 0,
|
||||
* .dev = {
|
||||
* .platform_data = &ezx_rfkill_bt_data,
|
||||
* },
|
||||
* };
|
||||
*/
|
||||
|
||||
#include <linux/rfkill.h>
|
||||
|
||||
struct rfkill_regulator_platform_data {
|
||||
char *name; /* the name for the rfkill switch */
|
||||
enum rfkill_type type; /* the type as specified in rfkill.h */
|
||||
};
|
||||
|
||||
#endif /* __LINUX_RFKILL_REGULATOR_H */
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||
* Copyright 2015-2016 Intel Deutschland GmbH
|
||||
* Copyright 2015-2017 Intel Deutschland GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
|
@ -748,6 +748,10 @@ struct cfg80211_bitrate_mask {
|
|||
* @pbss: If set, start as a PCP instead of AP. Relevant for DMG
|
||||
* networks.
|
||||
* @beacon_rate: bitrate to be used for beacons
|
||||
* @ht_cap: HT capabilities (or %NULL if HT isn't enabled)
|
||||
* @vht_cap: VHT capabilities (or %NULL if VHT isn't enabled)
|
||||
* @ht_required: stations must support HT
|
||||
* @vht_required: stations must support VHT
|
||||
*/
|
||||
struct cfg80211_ap_settings {
|
||||
struct cfg80211_chan_def chandef;
|
||||
|
@ -768,6 +772,10 @@ struct cfg80211_ap_settings {
|
|||
const struct cfg80211_acl_data *acl;
|
||||
bool pbss;
|
||||
struct cfg80211_bitrate_mask beacon_rate;
|
||||
|
||||
const struct ieee80211_ht_cap *ht_cap;
|
||||
const struct ieee80211_vht_cap *vht_cap;
|
||||
bool ht_required, vht_required;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -2408,11 +2416,13 @@ struct cfg80211_qos_map {
|
|||
* This struct defines NAN configuration parameters
|
||||
*
|
||||
* @master_pref: master preference (1 - 255)
|
||||
* @dual: dual band operation mode, see &enum nl80211_nan_dual_band_conf
|
||||
* @bands: operating bands, a bitmap of &enum nl80211_band values.
|
||||
* For instance, for NL80211_BAND_2GHZ, bit 0 would be set
|
||||
* (i.e. BIT(NL80211_BAND_2GHZ)).
|
||||
*/
|
||||
struct cfg80211_nan_conf {
|
||||
u8 master_pref;
|
||||
u8 dual;
|
||||
u8 bands;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -2420,11 +2430,11 @@ struct cfg80211_nan_conf {
|
|||
* configuration
|
||||
*
|
||||
* @CFG80211_NAN_CONF_CHANGED_PREF: master preference
|
||||
* @CFG80211_NAN_CONF_CHANGED_DUAL: dual band operation
|
||||
* @CFG80211_NAN_CONF_CHANGED_BANDS: operating bands
|
||||
*/
|
||||
enum cfg80211_nan_conf_changes {
|
||||
CFG80211_NAN_CONF_CHANGED_PREF = BIT(0),
|
||||
CFG80211_NAN_CONF_CHANGED_DUAL = BIT(1),
|
||||
CFG80211_NAN_CONF_CHANGED_BANDS = BIT(1),
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -3178,22 +3188,6 @@ struct ieee80211_iface_limit {
|
|||
|
||||
/**
|
||||
* struct ieee80211_iface_combination - possible interface combination
|
||||
* @limits: limits for the given interface types
|
||||
* @n_limits: number of limitations
|
||||
* @num_different_channels: can use up to this many different channels
|
||||
* @max_interfaces: maximum number of interfaces in total allowed in this
|
||||
* group
|
||||
* @beacon_int_infra_match: In this combination, the beacon intervals
|
||||
* between infrastructure and AP types must match. This is required
|
||||
* only in special cases.
|
||||
* @radar_detect_widths: bitmap of channel widths supported for radar detection
|
||||
* @radar_detect_regions: bitmap of regions supported for radar detection
|
||||
* @beacon_int_min_gcd: This interface combination supports different
|
||||
* beacon intervals.
|
||||
* = 0 - all beacon intervals for different interface must be same.
|
||||
* > 0 - any beacon interval for the interface part of this combination AND
|
||||
* *GCD* of all beacon intervals from beaconing interfaces of this
|
||||
* combination must be greater or equal to this value.
|
||||
*
|
||||
* With this structure the driver can describe which interface
|
||||
* combinations it supports concurrently.
|
||||
|
@ -3252,13 +3246,60 @@ struct ieee80211_iface_limit {
|
|||
*
|
||||
*/
|
||||
struct ieee80211_iface_combination {
|
||||
/**
|
||||
* @limits:
|
||||
* limits for the given interface types
|
||||
*/
|
||||
const struct ieee80211_iface_limit *limits;
|
||||
|
||||
/**
|
||||
* @num_different_channels:
|
||||
* can use up to this many different channels
|
||||
*/
|
||||
u32 num_different_channels;
|
||||
|
||||
/**
|
||||
* @max_interfaces:
|
||||
* maximum number of interfaces in total allowed in this group
|
||||
*/
|
||||
u16 max_interfaces;
|
||||
|
||||
/**
|
||||
* @n_limits:
|
||||
* number of limitations
|
||||
*/
|
||||
u8 n_limits;
|
||||
|
||||
/**
|
||||
* @beacon_int_infra_match:
|
||||
* In this combination, the beacon intervals between infrastructure
|
||||
* and AP types must match. This is required only in special cases.
|
||||
*/
|
||||
bool beacon_int_infra_match;
|
||||
|
||||
/**
|
||||
* @radar_detect_widths:
|
||||
* bitmap of channel widths supported for radar detection
|
||||
*/
|
||||
u8 radar_detect_widths;
|
||||
|
||||
/**
|
||||
* @radar_detect_regions:
|
||||
* bitmap of regions supported for radar detection
|
||||
*/
|
||||
u8 radar_detect_regions;
|
||||
|
||||
/**
|
||||
* @beacon_int_min_gcd:
|
||||
* This interface combination supports different beacon intervals.
|
||||
*
|
||||
* = 0
|
||||
* all beacon intervals for different interface must be same.
|
||||
* > 0
|
||||
* any beacon interval for the interface part of this combination AND
|
||||
* GCD of all beacon intervals from beaconing interfaces of this
|
||||
* combination must be greater or equal to this value.
|
||||
*/
|
||||
u32 beacon_int_min_gcd;
|
||||
};
|
||||
|
||||
|
@ -3557,6 +3598,10 @@ struct wiphy_iftype_ext_capab {
|
|||
* attribute indices defined in &enum nl80211_bss_select_attr.
|
||||
*
|
||||
* @cookie_counter: unique generic cookie counter, used to identify objects.
|
||||
* @nan_supported_bands: bands supported by the device in NAN mode, a
|
||||
* bitmap of &enum nl80211_band values. For instance, for
|
||||
* NL80211_BAND_2GHZ, bit 0 would be set
|
||||
* (i.e. BIT(NL80211_BAND_2GHZ)).
|
||||
*/
|
||||
struct wiphy {
|
||||
/* assign these fields before you register the wiphy */
|
||||
|
@ -3688,6 +3733,8 @@ struct wiphy {
|
|||
|
||||
u64 cookie_counter;
|
||||
|
||||
u8 nan_supported_bands;
|
||||
|
||||
char priv[0] __aligned(NETDEV_ALIGN);
|
||||
};
|
||||
|
||||
|
@ -5351,6 +5398,7 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
|
|||
* cfg80211_cqm_rssi_notify - connection quality monitoring rssi event
|
||||
* @dev: network device
|
||||
* @rssi_event: the triggered RSSI event
|
||||
* @rssi_level: new RSSI level value or 0 if not available
|
||||
* @gfp: context flags
|
||||
*
|
||||
* This function is called when a configured connection quality monitoring
|
||||
|
@ -5358,7 +5406,7 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
|
|||
*/
|
||||
void cfg80211_cqm_rssi_notify(struct net_device *dev,
|
||||
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
||||
gfp_t gfp);
|
||||
s32 rssi_level, gfp_t gfp);
|
||||
|
||||
/**
|
||||
* cfg80211_cqm_pktloss_notify - notify userspace about packetloss to peer
|
||||
|
|
|
@ -1,201 +1,54 @@
|
|||
/*
|
||||
* Copyright (c) 2003, 2004 David Young. All rights reserved.
|
||||
* Copyright (c) 2017 Intel Deutschland GmbH
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of David Young may not be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DAVID
|
||||
* YOUNG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE.
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
#ifndef __RADIOTAP_H
|
||||
#define __RADIOTAP_H
|
||||
|
||||
/*
|
||||
* Modifications to fit into the linux IEEE 802.11 stack,
|
||||
* Mike Kershaw (dragorn@kismetwireless.net)
|
||||
*/
|
||||
|
||||
#ifndef IEEE80211RADIOTAP_H
|
||||
#define IEEE80211RADIOTAP_H
|
||||
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
/* Base version of the radiotap packet header data */
|
||||
#define PKTHDR_RADIOTAP_VERSION 0
|
||||
|
||||
/* A generic radio capture format is desirable. There is one for
|
||||
* Linux, but it is neither rigidly defined (there were not even
|
||||
* units given for some fields) nor easily extensible.
|
||||
*
|
||||
* I suggest the following extensible radio capture format. It is
|
||||
* based on a bitmap indicating which fields are present.
|
||||
*
|
||||
* I am trying to describe precisely what the application programmer
|
||||
* should expect in the following, and for that reason I tell the
|
||||
* units and origin of each measurement (where it applies), or else I
|
||||
* use sufficiently weaselly language ("is a monotonically nondecreasing
|
||||
* function of...") that I cannot set false expectations for lawyerly
|
||||
* readers.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The radio capture header precedes the 802.11 header.
|
||||
* All data in the header is little endian on all platforms.
|
||||
/**
|
||||
* struct ieee82011_radiotap_header - base radiotap header
|
||||
*/
|
||||
struct ieee80211_radiotap_header {
|
||||
u8 it_version; /* Version 0. Only increases
|
||||
* for drastic changes,
|
||||
* introduction of compatible
|
||||
* new fields does not count.
|
||||
*/
|
||||
u8 it_pad;
|
||||
__le16 it_len; /* length of the whole
|
||||
* header in bytes, including
|
||||
* it_version, it_pad,
|
||||
* it_len, and data fields.
|
||||
*/
|
||||
__le32 it_present; /* A bitmap telling which
|
||||
* fields are present. Set bit 31
|
||||
* (0x80000000) to extend the
|
||||
* bitmap by another 32 bits.
|
||||
* Additional extensions are made
|
||||
* by setting bit 31.
|
||||
*/
|
||||
/**
|
||||
* @it_version: radiotap version, always 0
|
||||
*/
|
||||
uint8_t it_version;
|
||||
|
||||
/**
|
||||
* @it_pad: padding (or alignment)
|
||||
*/
|
||||
uint8_t it_pad;
|
||||
|
||||
/**
|
||||
* @it_len: overall radiotap header length
|
||||
*/
|
||||
__le16 it_len;
|
||||
|
||||
/**
|
||||
* @it_present: (first) present word
|
||||
*/
|
||||
__le32 it_present;
|
||||
} __packed;
|
||||
|
||||
/* Name Data type Units
|
||||
* ---- --------- -----
|
||||
*
|
||||
* IEEE80211_RADIOTAP_TSFT __le64 microseconds
|
||||
*
|
||||
* Value in microseconds of the MAC's 64-bit 802.11 Time
|
||||
* Synchronization Function timer when the first bit of the
|
||||
* MPDU arrived at the MAC. For received frames, only.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_CHANNEL 2 x __le16 MHz, bitmap
|
||||
*
|
||||
* Tx/Rx frequency in MHz, followed by flags (see below).
|
||||
*
|
||||
* IEEE80211_RADIOTAP_FHSS __le16 see below
|
||||
*
|
||||
* For frequency-hopping radios, the hop set (first byte)
|
||||
* and pattern (second byte).
|
||||
*
|
||||
* IEEE80211_RADIOTAP_RATE u8 500kb/s
|
||||
*
|
||||
* Tx/Rx data rate
|
||||
*
|
||||
* IEEE80211_RADIOTAP_DBM_ANTSIGNAL s8 decibels from
|
||||
* one milliwatt (dBm)
|
||||
*
|
||||
* RF signal power at the antenna, decibel difference from
|
||||
* one milliwatt.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_DBM_ANTNOISE s8 decibels from
|
||||
* one milliwatt (dBm)
|
||||
*
|
||||
* RF noise power at the antenna, decibel difference from one
|
||||
* milliwatt.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_DB_ANTSIGNAL u8 decibel (dB)
|
||||
*
|
||||
* RF signal power at the antenna, decibel difference from an
|
||||
* arbitrary, fixed reference.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_DB_ANTNOISE u8 decibel (dB)
|
||||
*
|
||||
* RF noise power at the antenna, decibel difference from an
|
||||
* arbitrary, fixed reference point.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_LOCK_QUALITY __le16 unitless
|
||||
*
|
||||
* Quality of Barker code lock. Unitless. Monotonically
|
||||
* nondecreasing with "better" lock strength. Called "Signal
|
||||
* Quality" in datasheets. (Is there a standard way to measure
|
||||
* this?)
|
||||
*
|
||||
* IEEE80211_RADIOTAP_TX_ATTENUATION __le16 unitless
|
||||
*
|
||||
* Transmit power expressed as unitless distance from max
|
||||
* power set at factory calibration. 0 is max power.
|
||||
* Monotonically nondecreasing with lower power levels.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_DB_TX_ATTENUATION __le16 decibels (dB)
|
||||
*
|
||||
* Transmit power expressed as decibel distance from max power
|
||||
* set at factory calibration. 0 is max power. Monotonically
|
||||
* nondecreasing with lower power levels.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_DBM_TX_POWER s8 decibels from
|
||||
* one milliwatt (dBm)
|
||||
*
|
||||
* Transmit power expressed as dBm (decibels from a 1 milliwatt
|
||||
* reference). This is the absolute power level measured at
|
||||
* the antenna port.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_FLAGS u8 bitmap
|
||||
*
|
||||
* Properties of transmitted and received frames. See flags
|
||||
* defined below.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_ANTENNA u8 antenna index
|
||||
*
|
||||
* Unitless indication of the Rx/Tx antenna for this packet.
|
||||
* The first antenna is antenna 0.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_RX_FLAGS __le16 bitmap
|
||||
*
|
||||
* Properties of received frames. See flags defined below.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_TX_FLAGS __le16 bitmap
|
||||
*
|
||||
* Properties of transmitted frames. See flags defined below.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_RTS_RETRIES u8 data
|
||||
*
|
||||
* Number of rts retries a transmitted frame used.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_DATA_RETRIES u8 data
|
||||
*
|
||||
* Number of unicast retries a transmitted frame used.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_MCS u8, u8, u8 unitless
|
||||
*
|
||||
* Contains a bitmap of known fields/flags, the flags, and
|
||||
* the MCS index.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_AMPDU_STATUS u32, u16, u8, u8 unitless
|
||||
*
|
||||
* Contains the AMPDU information for the subframe.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_VHT u16, u8, u8, u8[4], u8, u8, u16
|
||||
*
|
||||
* Contains VHT information about this frame.
|
||||
*
|
||||
* IEEE80211_RADIOTAP_TIMESTAMP u64, u16, u8, u8 variable
|
||||
*
|
||||
* Contains timestamp information for this frame.
|
||||
*/
|
||||
enum ieee80211_radiotap_type {
|
||||
/* version is always 0 */
|
||||
#define PKTHDR_RADIOTAP_VERSION 0
|
||||
|
||||
/* see the radiotap website for the descriptions */
|
||||
enum ieee80211_radiotap_presence {
|
||||
IEEE80211_RADIOTAP_TSFT = 0,
|
||||
IEEE80211_RADIOTAP_FLAGS = 1,
|
||||
IEEE80211_RADIOTAP_RATE = 2,
|
||||
|
@ -214,7 +67,7 @@ enum ieee80211_radiotap_type {
|
|||
IEEE80211_RADIOTAP_TX_FLAGS = 15,
|
||||
IEEE80211_RADIOTAP_RTS_RETRIES = 16,
|
||||
IEEE80211_RADIOTAP_DATA_RETRIES = 17,
|
||||
|
||||
/* 18 is XChannel, but it's not defined yet */
|
||||
IEEE80211_RADIOTAP_MCS = 19,
|
||||
IEEE80211_RADIOTAP_AMPDU_STATUS = 20,
|
||||
IEEE80211_RADIOTAP_VHT = 21,
|
||||
|
@ -226,129 +79,135 @@ enum ieee80211_radiotap_type {
|
|||
IEEE80211_RADIOTAP_EXT = 31
|
||||
};
|
||||
|
||||
/* Channel flags. */
|
||||
#define IEEE80211_CHAN_TURBO 0x0010 /* Turbo channel */
|
||||
#define IEEE80211_CHAN_CCK 0x0020 /* CCK channel */
|
||||
#define IEEE80211_CHAN_OFDM 0x0040 /* OFDM channel */
|
||||
#define IEEE80211_CHAN_2GHZ 0x0080 /* 2 GHz spectrum channel. */
|
||||
#define IEEE80211_CHAN_5GHZ 0x0100 /* 5 GHz spectrum channel */
|
||||
#define IEEE80211_CHAN_PASSIVE 0x0200 /* Only passive scan allowed */
|
||||
#define IEEE80211_CHAN_DYN 0x0400 /* Dynamic CCK-OFDM channel */
|
||||
#define IEEE80211_CHAN_GFSK 0x0800 /* GFSK channel (FHSS PHY) */
|
||||
#define IEEE80211_CHAN_GSM 0x1000 /* GSM (900 MHz) */
|
||||
#define IEEE80211_CHAN_STURBO 0x2000 /* Static Turbo */
|
||||
#define IEEE80211_CHAN_HALF 0x4000 /* Half channel (10 MHz wide) */
|
||||
#define IEEE80211_CHAN_QUARTER 0x8000 /* Quarter channel (5 MHz wide) */
|
||||
/* for IEEE80211_RADIOTAP_FLAGS */
|
||||
enum ieee80211_radiotap_flags {
|
||||
IEEE80211_RADIOTAP_F_CFP = 0x01,
|
||||
IEEE80211_RADIOTAP_F_SHORTPRE = 0x02,
|
||||
IEEE80211_RADIOTAP_F_WEP = 0x04,
|
||||
IEEE80211_RADIOTAP_F_FRAG = 0x08,
|
||||
IEEE80211_RADIOTAP_F_FCS = 0x10,
|
||||
IEEE80211_RADIOTAP_F_DATAPAD = 0x20,
|
||||
IEEE80211_RADIOTAP_F_BADFCS = 0x40,
|
||||
};
|
||||
|
||||
/* For IEEE80211_RADIOTAP_FLAGS */
|
||||
#define IEEE80211_RADIOTAP_F_CFP 0x01 /* sent/received
|
||||
* during CFP
|
||||
*/
|
||||
#define IEEE80211_RADIOTAP_F_SHORTPRE 0x02 /* sent/received
|
||||
* with short
|
||||
* preamble
|
||||
*/
|
||||
#define IEEE80211_RADIOTAP_F_WEP 0x04 /* sent/received
|
||||
* with WEP encryption
|
||||
*/
|
||||
#define IEEE80211_RADIOTAP_F_FRAG 0x08 /* sent/received
|
||||
* with fragmentation
|
||||
*/
|
||||
#define IEEE80211_RADIOTAP_F_FCS 0x10 /* frame includes FCS */
|
||||
#define IEEE80211_RADIOTAP_F_DATAPAD 0x20 /* frame has padding between
|
||||
* 802.11 header and payload
|
||||
* (to 32-bit boundary)
|
||||
*/
|
||||
#define IEEE80211_RADIOTAP_F_BADFCS 0x40 /* bad FCS */
|
||||
/* for IEEE80211_RADIOTAP_CHANNEL */
|
||||
enum ieee80211_radiotap_channel_flags {
|
||||
IEEE80211_CHAN_CCK = 0x0020,
|
||||
IEEE80211_CHAN_OFDM = 0x0040,
|
||||
IEEE80211_CHAN_2GHZ = 0x0080,
|
||||
IEEE80211_CHAN_5GHZ = 0x0100,
|
||||
IEEE80211_CHAN_DYN = 0x0400,
|
||||
IEEE80211_CHAN_HALF = 0x4000,
|
||||
IEEE80211_CHAN_QUARTER = 0x8000,
|
||||
};
|
||||
|
||||
/* For IEEE80211_RADIOTAP_RX_FLAGS */
|
||||
#define IEEE80211_RADIOTAP_F_RX_BADPLCP 0x0002 /* frame has bad PLCP */
|
||||
/* for IEEE80211_RADIOTAP_RX_FLAGS */
|
||||
enum ieee80211_radiotap_rx_flags {
|
||||
IEEE80211_RADIOTAP_F_RX_BADPLCP = 0x0002,
|
||||
};
|
||||
|
||||
/* For IEEE80211_RADIOTAP_TX_FLAGS */
|
||||
#define IEEE80211_RADIOTAP_F_TX_FAIL 0x0001 /* failed due to excessive
|
||||
* retries */
|
||||
#define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */
|
||||
#define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */
|
||||
#define IEEE80211_RADIOTAP_F_TX_NOACK 0x0008 /* don't expect an ack */
|
||||
/* for IEEE80211_RADIOTAP_TX_FLAGS */
|
||||
enum ieee80211_radiotap_tx_flags {
|
||||
IEEE80211_RADIOTAP_F_TX_FAIL = 0x0001,
|
||||
IEEE80211_RADIOTAP_F_TX_CTS = 0x0002,
|
||||
IEEE80211_RADIOTAP_F_TX_RTS = 0x0004,
|
||||
IEEE80211_RADIOTAP_F_TX_NOACK = 0x0008,
|
||||
};
|
||||
|
||||
/* for IEEE80211_RADIOTAP_MCS "have" flags */
|
||||
enum ieee80211_radiotap_mcs_have {
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_BW = 0x01,
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_MCS = 0x02,
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_GI = 0x04,
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_FMT = 0x08,
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_FEC = 0x10,
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_STBC = 0x20,
|
||||
};
|
||||
|
||||
/* For IEEE80211_RADIOTAP_MCS */
|
||||
#define IEEE80211_RADIOTAP_MCS_HAVE_BW 0x01
|
||||
#define IEEE80211_RADIOTAP_MCS_HAVE_MCS 0x02
|
||||
#define IEEE80211_RADIOTAP_MCS_HAVE_GI 0x04
|
||||
#define IEEE80211_RADIOTAP_MCS_HAVE_FMT 0x08
|
||||
#define IEEE80211_RADIOTAP_MCS_HAVE_FEC 0x10
|
||||
#define IEEE80211_RADIOTAP_MCS_HAVE_STBC 0x20
|
||||
enum ieee80211_radiotap_mcs_flags {
|
||||
IEEE80211_RADIOTAP_MCS_BW_MASK = 0x03,
|
||||
IEEE80211_RADIOTAP_MCS_BW_20 = 0,
|
||||
IEEE80211_RADIOTAP_MCS_BW_40 = 1,
|
||||
IEEE80211_RADIOTAP_MCS_BW_20L = 2,
|
||||
IEEE80211_RADIOTAP_MCS_BW_20U = 3,
|
||||
|
||||
#define IEEE80211_RADIOTAP_MCS_BW_MASK 0x03
|
||||
#define IEEE80211_RADIOTAP_MCS_BW_20 0
|
||||
#define IEEE80211_RADIOTAP_MCS_BW_40 1
|
||||
#define IEEE80211_RADIOTAP_MCS_BW_20L 2
|
||||
#define IEEE80211_RADIOTAP_MCS_BW_20U 3
|
||||
#define IEEE80211_RADIOTAP_MCS_SGI 0x04
|
||||
#define IEEE80211_RADIOTAP_MCS_FMT_GF 0x08
|
||||
#define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10
|
||||
#define IEEE80211_RADIOTAP_MCS_STBC_MASK 0x60
|
||||
#define IEEE80211_RADIOTAP_MCS_STBC_1 1
|
||||
#define IEEE80211_RADIOTAP_MCS_STBC_2 2
|
||||
#define IEEE80211_RADIOTAP_MCS_STBC_3 3
|
||||
IEEE80211_RADIOTAP_MCS_SGI = 0x04,
|
||||
IEEE80211_RADIOTAP_MCS_FMT_GF = 0x08,
|
||||
IEEE80211_RADIOTAP_MCS_FEC_LDPC = 0x10,
|
||||
IEEE80211_RADIOTAP_MCS_STBC_MASK = 0x60,
|
||||
IEEE80211_RADIOTAP_MCS_STBC_1 = 1,
|
||||
IEEE80211_RADIOTAP_MCS_STBC_2 = 2,
|
||||
IEEE80211_RADIOTAP_MCS_STBC_3 = 3,
|
||||
IEEE80211_RADIOTAP_MCS_STBC_SHIFT = 5,
|
||||
};
|
||||
|
||||
#define IEEE80211_RADIOTAP_MCS_STBC_SHIFT 5
|
||||
/* for IEEE80211_RADIOTAP_AMPDU_STATUS */
|
||||
enum ieee80211_radiotap_ampdu_flags {
|
||||
IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN = 0x0001,
|
||||
IEEE80211_RADIOTAP_AMPDU_IS_ZEROLEN = 0x0002,
|
||||
IEEE80211_RADIOTAP_AMPDU_LAST_KNOWN = 0x0004,
|
||||
IEEE80211_RADIOTAP_AMPDU_IS_LAST = 0x0008,
|
||||
IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR = 0x0010,
|
||||
IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN = 0x0020,
|
||||
};
|
||||
|
||||
/* For IEEE80211_RADIOTAP_AMPDU_STATUS */
|
||||
#define IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN 0x0001
|
||||
#define IEEE80211_RADIOTAP_AMPDU_IS_ZEROLEN 0x0002
|
||||
#define IEEE80211_RADIOTAP_AMPDU_LAST_KNOWN 0x0004
|
||||
#define IEEE80211_RADIOTAP_AMPDU_IS_LAST 0x0008
|
||||
#define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR 0x0010
|
||||
#define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN 0x0020
|
||||
/* for IEEE80211_RADIOTAP_VHT */
|
||||
enum ieee80211_radiotap_vht_known {
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_STBC = 0x0001,
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_TXOP_PS_NA = 0x0002,
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_GI = 0x0004,
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_SGI_NSYM_DIS = 0x0008,
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_LDPC_EXTRA_OFDM_SYM = 0x0010,
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED = 0x0020,
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH = 0x0040,
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_GROUP_ID = 0x0080,
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_PARTIAL_AID = 0x0100,
|
||||
};
|
||||
|
||||
/* For IEEE80211_RADIOTAP_VHT */
|
||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_STBC 0x0001
|
||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_TXOP_PS_NA 0x0002
|
||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_GI 0x0004
|
||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_SGI_NSYM_DIS 0x0008
|
||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_LDPC_EXTRA_OFDM_SYM 0x0010
|
||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED 0x0020
|
||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH 0x0040
|
||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_GROUP_ID 0x0080
|
||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_PARTIAL_AID 0x0100
|
||||
enum ieee80211_radiotap_vht_flags {
|
||||
IEEE80211_RADIOTAP_VHT_FLAG_STBC = 0x01,
|
||||
IEEE80211_RADIOTAP_VHT_FLAG_TXOP_PS_NA = 0x02,
|
||||
IEEE80211_RADIOTAP_VHT_FLAG_SGI = 0x04,
|
||||
IEEE80211_RADIOTAP_VHT_FLAG_SGI_NSYM_M10_9 = 0x08,
|
||||
IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM = 0x10,
|
||||
IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED = 0x20,
|
||||
};
|
||||
|
||||
#define IEEE80211_RADIOTAP_VHT_FLAG_STBC 0x01
|
||||
#define IEEE80211_RADIOTAP_VHT_FLAG_TXOP_PS_NA 0x02
|
||||
#define IEEE80211_RADIOTAP_VHT_FLAG_SGI 0x04
|
||||
#define IEEE80211_RADIOTAP_VHT_FLAG_SGI_NSYM_M10_9 0x08
|
||||
#define IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM 0x10
|
||||
#define IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED 0x20
|
||||
enum ieee80211_radiotap_vht_coding {
|
||||
IEEE80211_RADIOTAP_CODING_LDPC_USER0 = 0x01,
|
||||
IEEE80211_RADIOTAP_CODING_LDPC_USER1 = 0x02,
|
||||
IEEE80211_RADIOTAP_CODING_LDPC_USER2 = 0x04,
|
||||
IEEE80211_RADIOTAP_CODING_LDPC_USER3 = 0x08,
|
||||
};
|
||||
|
||||
#define IEEE80211_RADIOTAP_CODING_LDPC_USER0 0x01
|
||||
#define IEEE80211_RADIOTAP_CODING_LDPC_USER1 0x02
|
||||
#define IEEE80211_RADIOTAP_CODING_LDPC_USER2 0x04
|
||||
#define IEEE80211_RADIOTAP_CODING_LDPC_USER3 0x08
|
||||
/* for IEEE80211_RADIOTAP_TIMESTAMP */
|
||||
enum ieee80211_radiotap_timestamp_unit_spos {
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MASK = 0x000F,
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MS = 0x0000,
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US = 0x0001,
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_UNIT_NS = 0x0003,
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_SPOS_MASK = 0x00F0,
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_SPOS_BEGIN_MDPU = 0x0000,
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_SPOS_PLCP_SIG_ACQ = 0x0010,
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_SPOS_EO_PPDU = 0x0020,
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_SPOS_EO_MPDU = 0x0030,
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_SPOS_UNKNOWN = 0x00F0,
|
||||
};
|
||||
|
||||
/* For IEEE80211_RADIOTAP_TIMESTAMP */
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MASK 0x000F
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MS 0x0000
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US 0x0001
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_UNIT_NS 0x0003
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_SPOS_MASK 0x00F0
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_SPOS_BEGIN_MDPU 0x0000
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_SPOS_PLCP_SIG_ACQ 0x0010
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_SPOS_EO_PPDU 0x0020
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_SPOS_EO_MPDU 0x0030
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_SPOS_UNKNOWN 0x00F0
|
||||
enum ieee80211_radiotap_timestamp_flags {
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_FLAG_64BIT = 0x00,
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_FLAG_32BIT = 0x01,
|
||||
IEEE80211_RADIOTAP_TIMESTAMP_FLAG_ACCURACY = 0x02,
|
||||
};
|
||||
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_FLAG_64BIT 0x00
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_FLAG_32BIT 0x01
|
||||
#define IEEE80211_RADIOTAP_TIMESTAMP_FLAG_ACCURACY 0x02
|
||||
|
||||
/* helpers */
|
||||
static inline int ieee80211_get_radiotap_len(unsigned char *data)
|
||||
/**
|
||||
* ieee80211_get_radiotap_len - get radiotap header length
|
||||
*/
|
||||
static inline u16 ieee80211_get_radiotap_len(const char *data)
|
||||
{
|
||||
struct ieee80211_radiotap_header *hdr =
|
||||
(struct ieee80211_radiotap_header *)data;
|
||||
struct ieee80211_radiotap_header *hdr = (void *)data;
|
||||
|
||||
return get_unaligned_le16(&hdr->it_len);
|
||||
}
|
||||
|
||||
#endif /* IEEE80211_RADIOTAP_H */
|
||||
#endif /* __RADIOTAP_H */
|
||||
|
|
|
@ -1768,15 +1768,6 @@ struct ieee80211_sta_rates {
|
|||
* @max_amsdu_subframes: indicates the maximal number of MSDUs in a single
|
||||
* A-MSDU. Taken from the Extended Capabilities element. 0 means
|
||||
* unlimited.
|
||||
* @max_amsdu_len: indicates the maximal length of an A-MSDU in bytes. This
|
||||
* field is always valid for packets with a VHT preamble. For packets
|
||||
* with a HT preamble, additional limits apply:
|
||||
* + If the skb is transmitted as part of a BA agreement, the
|
||||
* A-MSDU maximal size is min(max_amsdu_len, 4065) bytes.
|
||||
* + If the skb is not part of a BA aggreement, the A-MSDU maximal
|
||||
* size is min(max_amsdu_len, 7935) bytes.
|
||||
* Both additional HT limits must be enforced by the low level driver.
|
||||
* This is defined by the spec (IEEE 802.11-2012 section 8.3.2.2 NOTE 2).
|
||||
* @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not.
|
||||
* @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by rate control.
|
||||
* @txq: per-TID data TX queues (if driver uses the TXQ abstraction)
|
||||
|
@ -1799,6 +1790,22 @@ struct ieee80211_sta {
|
|||
bool tdls_initiator;
|
||||
bool mfp;
|
||||
u8 max_amsdu_subframes;
|
||||
|
||||
/**
|
||||
* @max_amsdu_len:
|
||||
* indicates the maximal length of an A-MSDU in bytes.
|
||||
* This field is always valid for packets with a VHT preamble.
|
||||
* For packets with a HT preamble, additional limits apply:
|
||||
*
|
||||
* * If the skb is transmitted as part of a BA agreement, the
|
||||
* A-MSDU maximal size is min(max_amsdu_len, 4065) bytes.
|
||||
* * If the skb is not part of a BA aggreement, the A-MSDU maximal
|
||||
* size is min(max_amsdu_len, 7935) bytes.
|
||||
*
|
||||
* Both additional HT limits must be enforced by the low level
|
||||
* driver. This is defined by the spec (IEEE 802.11-2012 section
|
||||
* 8.3.2.2 NOTE 2).
|
||||
*/
|
||||
u16 max_amsdu_len;
|
||||
bool support_p2p_ps;
|
||||
u16 max_rc_amsdu_len;
|
||||
|
@ -3203,26 +3210,6 @@ enum ieee80211_reconfig_type {
|
|||
* Returns non-zero if this device sent the last beacon.
|
||||
* The callback can sleep.
|
||||
*
|
||||
* @ampdu_action: Perform a certain A-MPDU action
|
||||
* The RA/TID combination determines the destination and TID we want
|
||||
* the ampdu action to be performed for. The action is defined through
|
||||
* ieee80211_ampdu_mlme_action.
|
||||
* When the action is set to %IEEE80211_AMPDU_TX_OPERATIONAL the driver
|
||||
* may neither send aggregates containing more subframes than @buf_size
|
||||
* nor send aggregates in a way that lost frames would exceed the
|
||||
* buffer size. If just limiting the aggregate size, this would be
|
||||
* possible with a buf_size of 8:
|
||||
* - TX: 1.....7
|
||||
* - RX: 2....7 (lost frame #1)
|
||||
* - TX: 8..1...
|
||||
* which is invalid since #1 was now re-transmitted well past the
|
||||
* buffer size of 8. Correct ways to retransmit #1 would be:
|
||||
* - TX: 1 or 18 or 81
|
||||
* Even "189" would be wrong since 1 could be lost again.
|
||||
*
|
||||
* Returns a negative error code on failure.
|
||||
* The callback can sleep.
|
||||
*
|
||||
* @get_survey: Return per-channel survey information
|
||||
*
|
||||
* @rfkill_poll: Poll rfkill hardware state. If you need this, you also
|
||||
|
@ -3575,6 +3562,35 @@ struct ieee80211_ops {
|
|||
s64 offset);
|
||||
void (*reset_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
|
||||
int (*tx_last_beacon)(struct ieee80211_hw *hw);
|
||||
|
||||
/**
|
||||
* @ampdu_action:
|
||||
* Perform a certain A-MPDU action.
|
||||
* The RA/TID combination determines the destination and TID we want
|
||||
* the ampdu action to be performed for. The action is defined through
|
||||
* ieee80211_ampdu_mlme_action.
|
||||
* When the action is set to %IEEE80211_AMPDU_TX_OPERATIONAL the driver
|
||||
* may neither send aggregates containing more subframes than @buf_size
|
||||
* nor send aggregates in a way that lost frames would exceed the
|
||||
* buffer size. If just limiting the aggregate size, this would be
|
||||
* possible with a buf_size of 8:
|
||||
*
|
||||
* - ``TX: 1.....7``
|
||||
* - ``RX: 2....7`` (lost frame #1)
|
||||
* - ``TX: 8..1...``
|
||||
*
|
||||
* which is invalid since #1 was now re-transmitted well past the
|
||||
* buffer size of 8. Correct ways to retransmit #1 would be:
|
||||
*
|
||||
* - ``TX: 1 or``
|
||||
* - ``TX: 18 or``
|
||||
* - ``TX: 81``
|
||||
*
|
||||
* Even ``189`` would be wrong since 1 could be lost again.
|
||||
*
|
||||
* Returns a negative error code on failure.
|
||||
* The callback can sleep.
|
||||
*/
|
||||
int (*ampdu_action)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_ampdu_params *params);
|
||||
|
@ -5262,6 +5278,7 @@ void ieee80211_resume_disconnect(struct ieee80211_vif *vif);
|
|||
*
|
||||
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
* @rssi_event: the RSSI trigger event type
|
||||
* @rssi_level: new RSSI level value or 0 if not available
|
||||
* @gfp: context flags
|
||||
*
|
||||
* When the %IEEE80211_VIF_SUPPORTS_CQM_RSSI is set, and a connection quality
|
||||
|
@ -5270,6 +5287,7 @@ void ieee80211_resume_disconnect(struct ieee80211_vif *vif);
|
|||
*/
|
||||
void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
|
||||
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
||||
s32 rssi_level,
|
||||
gfp_t gfp);
|
||||
|
||||
/**
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
* Copyright 2008, 2009 Luis R. Rodriguez <lrodriguez@atheros.com>
|
||||
* Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
|
||||
* Copyright 2008 Colin McCabe <colin@cozybit.com>
|
||||
* Copyright 2015 Intel Deutschland GmbH
|
||||
* Copyright 2015-2017 Intel Deutschland GmbH
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
|
@ -854,12 +854,15 @@
|
|||
* cfg80211_scan_done().
|
||||
*
|
||||
* @NL80211_CMD_START_NAN: Start NAN operation, identified by its
|
||||
* %NL80211_ATTR_WDEV interface. This interface must have been previously
|
||||
* created with %NL80211_CMD_NEW_INTERFACE. After it has been started, the
|
||||
* NAN interface will create or join a cluster. This command must have a
|
||||
* valid %NL80211_ATTR_NAN_MASTER_PREF attribute and optional
|
||||
* %NL80211_ATTR_NAN_DUAL attributes.
|
||||
* After this command NAN functions can be added.
|
||||
* %NL80211_ATTR_WDEV interface. This interface must have been
|
||||
* previously created with %NL80211_CMD_NEW_INTERFACE. After it
|
||||
* has been started, the NAN interface will create or join a
|
||||
* cluster. This command must have a valid
|
||||
* %NL80211_ATTR_NAN_MASTER_PREF attribute and optional
|
||||
* %NL80211_ATTR_BANDS attributes. If %NL80211_ATTR_BANDS is
|
||||
* omitted or set to 0, it means don't-care and the device will
|
||||
* decide what to use. After this command NAN functions can be
|
||||
* added.
|
||||
* @NL80211_CMD_STOP_NAN: Stop the NAN operation, identified by
|
||||
* its %NL80211_ATTR_WDEV interface.
|
||||
* @NL80211_CMD_ADD_NAN_FUNCTION: Add a NAN function. The function is defined
|
||||
|
@ -880,10 +883,14 @@
|
|||
* This command is also used as a notification sent when a NAN function is
|
||||
* terminated. This will contain a %NL80211_ATTR_NAN_FUNC_INST_ID
|
||||
* and %NL80211_ATTR_COOKIE attributes.
|
||||
* @NL80211_CMD_CHANGE_NAN_CONFIG: Change current NAN configuration. NAN
|
||||
* must be operational (%NL80211_CMD_START_NAN was executed).
|
||||
* It must contain at least one of the following attributes:
|
||||
* %NL80211_ATTR_NAN_MASTER_PREF, %NL80211_ATTR_NAN_DUAL.
|
||||
* @NL80211_CMD_CHANGE_NAN_CONFIG: Change current NAN
|
||||
* configuration. NAN must be operational (%NL80211_CMD_START_NAN
|
||||
* was executed). It must contain at least one of the following
|
||||
* attributes: %NL80211_ATTR_NAN_MASTER_PREF,
|
||||
* %NL80211_ATTR_BANDS. If %NL80211_ATTR_BANDS is omitted, the
|
||||
* current configuration is not changed. If it is present but
|
||||
* set to zero, the configuration is changed to don't-care
|
||||
* (i.e. the device can decide what to do).
|
||||
* @NL80211_CMD_NAN_FUNC_MATCH: Notification sent when a match is reported.
|
||||
* This will contain a %NL80211_ATTR_NAN_MATCH nested attribute and
|
||||
* %NL80211_ATTR_COOKIE.
|
||||
|
@ -1963,10 +1970,13 @@ enum nl80211_commands {
|
|||
* %NL80211_CMD_CHANGE_NAN_CONFIG. Its type is u8 and it can't be 0.
|
||||
* Also, values 1 and 255 are reserved for certification purposes and
|
||||
* should not be used during a normal device operation.
|
||||
* @NL80211_ATTR_NAN_DUAL: NAN dual band operation config (see
|
||||
* &enum nl80211_nan_dual_band_conf). This attribute is used with
|
||||
* %NL80211_CMD_START_NAN and optionally with
|
||||
* %NL80211_CMD_CHANGE_NAN_CONFIG.
|
||||
* @NL80211_ATTR_BANDS: operating bands configuration. This is a u32
|
||||
* bitmask of BIT(NL80211_BAND_*) as described in %enum
|
||||
* nl80211_band. For instance, for NL80211_BAND_2GHZ, bit 0
|
||||
* would be set. This attribute is used with
|
||||
* %NL80211_CMD_START_NAN and %NL80211_CMD_CHANGE_NAN_CONFIG, and
|
||||
* it is optional. If no bands are set, it means don't-care and
|
||||
* the device will decide what to use.
|
||||
* @NL80211_ATTR_NAN_FUNC: a function that can be added to NAN. See
|
||||
* &enum nl80211_nan_func_attributes for description of this nested
|
||||
* attribute.
|
||||
|
@ -2397,7 +2407,7 @@ enum nl80211_attrs {
|
|||
NL80211_ATTR_MESH_PEER_AID,
|
||||
|
||||
NL80211_ATTR_NAN_MASTER_PREF,
|
||||
NL80211_ATTR_NAN_DUAL,
|
||||
NL80211_ATTR_BANDS,
|
||||
NL80211_ATTR_NAN_FUNC,
|
||||
NL80211_ATTR_NAN_MATCH,
|
||||
|
||||
|
@ -3952,6 +3962,8 @@ enum nl80211_ps_state {
|
|||
* %NL80211_CMD_NOTIFY_CQM. Set to 0 to turn off TX error reporting.
|
||||
* @NL80211_ATTR_CQM_BEACON_LOSS_EVENT: flag attribute that's set in a beacon
|
||||
* loss event
|
||||
* @NL80211_ATTR_CQM_RSSI_LEVEL: the RSSI value in dBm that triggered the
|
||||
* RSSI threshold event.
|
||||
* @__NL80211_ATTR_CQM_AFTER_LAST: internal
|
||||
* @NL80211_ATTR_CQM_MAX: highest key attribute
|
||||
*/
|
||||
|
@ -3965,6 +3977,7 @@ enum nl80211_attr_cqm {
|
|||
NL80211_ATTR_CQM_TXE_PKTS,
|
||||
NL80211_ATTR_CQM_TXE_INTVL,
|
||||
NL80211_ATTR_CQM_BEACON_LOSS_EVENT,
|
||||
NL80211_ATTR_CQM_RSSI_LEVEL,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_ATTR_CQM_AFTER_LAST,
|
||||
|
@ -5067,21 +5080,6 @@ enum nl80211_bss_select_attr {
|
|||
NL80211_BSS_SELECT_ATTR_MAX = __NL80211_BSS_SELECT_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_nan_dual_band_conf - NAN dual band configuration
|
||||
*
|
||||
* Defines the NAN dual band mode of operation
|
||||
*
|
||||
* @NL80211_NAN_BAND_DEFAULT: device default mode
|
||||
* @NL80211_NAN_BAND_2GHZ: 2.4GHz mode
|
||||
* @NL80211_NAN_BAND_5GHZ: 5GHz mode
|
||||
*/
|
||||
enum nl80211_nan_dual_band_conf {
|
||||
NL80211_NAN_BAND_DEFAULT = 1 << 0,
|
||||
NL80211_NAN_BAND_2GHZ = 1 << 1,
|
||||
NL80211_NAN_BAND_5GHZ = 1 << 2,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_nan_function_type - NAN function type
|
||||
*
|
||||
|
|
|
@ -6,6 +6,7 @@ config MAC80211
|
|||
select CRYPTO_AES
|
||||
select CRYPTO_CCM
|
||||
select CRYPTO_GCM
|
||||
select CRYPTO_CMAC
|
||||
select CRC32
|
||||
---help---
|
||||
This option enables the hardware independent IEEE 802.11
|
||||
|
|
|
@ -22,126 +22,50 @@
|
|||
#define CMAC_TLEN_256 16 /* CMAC TLen = 128 bits (16 octets) */
|
||||
#define AAD_LEN 20
|
||||
|
||||
static const u8 zero[CMAC_TLEN_256];
|
||||
|
||||
void gf_mulx(u8 *pad)
|
||||
{
|
||||
int i, carry;
|
||||
|
||||
carry = pad[0] & 0x80;
|
||||
for (i = 0; i < AES_BLOCK_SIZE - 1; i++)
|
||||
pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7);
|
||||
pad[AES_BLOCK_SIZE - 1] <<= 1;
|
||||
if (carry)
|
||||
pad[AES_BLOCK_SIZE - 1] ^= 0x87;
|
||||
}
|
||||
|
||||
void aes_cmac_vector(struct crypto_cipher *tfm, size_t num_elem,
|
||||
const u8 *addr[], const size_t *len, u8 *mac,
|
||||
size_t mac_len)
|
||||
{
|
||||
u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE];
|
||||
const u8 *pos, *end;
|
||||
size_t i, e, left, total_len;
|
||||
|
||||
memset(cbc, 0, AES_BLOCK_SIZE);
|
||||
|
||||
total_len = 0;
|
||||
for (e = 0; e < num_elem; e++)
|
||||
total_len += len[e];
|
||||
left = total_len;
|
||||
|
||||
e = 0;
|
||||
pos = addr[0];
|
||||
end = pos + len[0];
|
||||
|
||||
while (left >= AES_BLOCK_SIZE) {
|
||||
for (i = 0; i < AES_BLOCK_SIZE; i++) {
|
||||
cbc[i] ^= *pos++;
|
||||
if (pos >= end) {
|
||||
e++;
|
||||
pos = addr[e];
|
||||
end = pos + len[e];
|
||||
}
|
||||
}
|
||||
if (left > AES_BLOCK_SIZE)
|
||||
crypto_cipher_encrypt_one(tfm, cbc, cbc);
|
||||
left -= AES_BLOCK_SIZE;
|
||||
}
|
||||
|
||||
memset(pad, 0, AES_BLOCK_SIZE);
|
||||
crypto_cipher_encrypt_one(tfm, pad, pad);
|
||||
gf_mulx(pad);
|
||||
|
||||
if (left || total_len == 0) {
|
||||
for (i = 0; i < left; i++) {
|
||||
cbc[i] ^= *pos++;
|
||||
if (pos >= end) {
|
||||
e++;
|
||||
pos = addr[e];
|
||||
end = pos + len[e];
|
||||
}
|
||||
}
|
||||
cbc[left] ^= 0x80;
|
||||
gf_mulx(pad);
|
||||
}
|
||||
|
||||
for (i = 0; i < AES_BLOCK_SIZE; i++)
|
||||
pad[i] ^= cbc[i];
|
||||
crypto_cipher_encrypt_one(tfm, pad, pad);
|
||||
memcpy(mac, pad, mac_len);
|
||||
}
|
||||
|
||||
|
||||
void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad,
|
||||
void ieee80211_aes_cmac(struct crypto_shash *tfm, const u8 *aad,
|
||||
const u8 *data, size_t data_len, u8 *mic)
|
||||
{
|
||||
const u8 *addr[3];
|
||||
size_t len[3];
|
||||
u8 zero[CMAC_TLEN];
|
||||
SHASH_DESC_ON_STACK(desc, tfm);
|
||||
u8 out[AES_BLOCK_SIZE];
|
||||
|
||||
memset(zero, 0, CMAC_TLEN);
|
||||
addr[0] = aad;
|
||||
len[0] = AAD_LEN;
|
||||
addr[1] = data;
|
||||
len[1] = data_len - CMAC_TLEN;
|
||||
addr[2] = zero;
|
||||
len[2] = CMAC_TLEN;
|
||||
desc->tfm = tfm;
|
||||
|
||||
aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN);
|
||||
crypto_shash_init(desc);
|
||||
crypto_shash_update(desc, aad, AAD_LEN);
|
||||
crypto_shash_update(desc, data, data_len - CMAC_TLEN);
|
||||
crypto_shash_finup(desc, zero, CMAC_TLEN, out);
|
||||
|
||||
memcpy(mic, out, CMAC_TLEN);
|
||||
}
|
||||
|
||||
void ieee80211_aes_cmac_256(struct crypto_cipher *tfm, const u8 *aad,
|
||||
void ieee80211_aes_cmac_256(struct crypto_shash *tfm, const u8 *aad,
|
||||
const u8 *data, size_t data_len, u8 *mic)
|
||||
{
|
||||
const u8 *addr[3];
|
||||
size_t len[3];
|
||||
u8 zero[CMAC_TLEN_256];
|
||||
SHASH_DESC_ON_STACK(desc, tfm);
|
||||
|
||||
memset(zero, 0, CMAC_TLEN_256);
|
||||
addr[0] = aad;
|
||||
len[0] = AAD_LEN;
|
||||
addr[1] = data;
|
||||
len[1] = data_len - CMAC_TLEN_256;
|
||||
addr[2] = zero;
|
||||
len[2] = CMAC_TLEN_256;
|
||||
desc->tfm = tfm;
|
||||
|
||||
aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN_256);
|
||||
crypto_shash_init(desc);
|
||||
crypto_shash_update(desc, aad, AAD_LEN);
|
||||
crypto_shash_update(desc, data, data_len - CMAC_TLEN_256);
|
||||
crypto_shash_finup(desc, zero, CMAC_TLEN_256, mic);
|
||||
}
|
||||
|
||||
struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[],
|
||||
size_t key_len)
|
||||
struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[],
|
||||
size_t key_len)
|
||||
{
|
||||
struct crypto_cipher *tfm;
|
||||
struct crypto_shash *tfm;
|
||||
|
||||
tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
|
||||
tfm = crypto_alloc_shash("cmac(aes)", 0, 0);
|
||||
if (!IS_ERR(tfm))
|
||||
crypto_cipher_setkey(tfm, key, key_len);
|
||||
crypto_shash_setkey(tfm, key, key_len);
|
||||
|
||||
return tfm;
|
||||
}
|
||||
|
||||
|
||||
void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm)
|
||||
void ieee80211_aes_cmac_key_free(struct crypto_shash *tfm)
|
||||
{
|
||||
crypto_free_cipher(tfm);
|
||||
crypto_free_shash(tfm);
|
||||
}
|
||||
|
|
|
@ -10,17 +10,14 @@
|
|||
#define AES_CMAC_H
|
||||
|
||||
#include <linux/crypto.h>
|
||||
#include <crypto/hash.h>
|
||||
|
||||
void gf_mulx(u8 *pad);
|
||||
void aes_cmac_vector(struct crypto_cipher *tfm, size_t num_elem,
|
||||
const u8 *addr[], const size_t *len, u8 *mac,
|
||||
size_t mac_len);
|
||||
struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[],
|
||||
size_t key_len);
|
||||
void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad,
|
||||
struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[],
|
||||
size_t key_len);
|
||||
void ieee80211_aes_cmac(struct crypto_shash *tfm, const u8 *aad,
|
||||
const u8 *data, size_t data_len, u8 *mic);
|
||||
void ieee80211_aes_cmac_256(struct crypto_cipher *tfm, const u8 *aad,
|
||||
void ieee80211_aes_cmac_256(struct crypto_shash *tfm, const u8 *aad,
|
||||
const u8 *data, size_t data_len, u8 *mic);
|
||||
void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm);
|
||||
void ieee80211_aes_cmac_key_free(struct crypto_shash *tfm);
|
||||
|
||||
#endif /* AES_CMAC_H */
|
||||
|
|
|
@ -208,8 +208,8 @@ static int ieee80211_nan_change_conf(struct wiphy *wiphy,
|
|||
if (changes & CFG80211_NAN_CONF_CHANGED_PREF)
|
||||
new_conf.master_pref = conf->master_pref;
|
||||
|
||||
if (changes & CFG80211_NAN_CONF_CHANGED_DUAL)
|
||||
new_conf.dual = conf->dual;
|
||||
if (changes & CFG80211_NAN_CONF_CHANGED_BANDS)
|
||||
new_conf.bands = conf->bands;
|
||||
|
||||
ret = drv_nan_change_conf(sdata->local, sdata, &new_conf, changes);
|
||||
if (!ret)
|
||||
|
|
|
@ -249,12 +249,19 @@ static ssize_t misc_read(struct file *file, char __user *user_buf,
|
|||
struct ieee80211_local *local = file->private_data;
|
||||
/* Max len of each line is 16 characters, plus 9 for 'pending:\n' */
|
||||
size_t bufsz = IEEE80211_MAX_QUEUES * 16 + 9;
|
||||
char *buf = kzalloc(bufsz, GFP_KERNEL);
|
||||
char *pos = buf, *end = buf + bufsz - 1;
|
||||
char *buf;
|
||||
char *pos, *end;
|
||||
ssize_t rv;
|
||||
int i;
|
||||
int ln;
|
||||
|
||||
buf = kzalloc(bufsz, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
pos = buf;
|
||||
end = buf + bufsz - 1;
|
||||
|
||||
pos += scnprintf(pos, end - pos, "pending:\n");
|
||||
|
||||
for (i = 0; i < IEEE80211_MAX_QUEUES; i++) {
|
||||
|
@ -356,6 +363,7 @@ void debugfs_hw_add(struct ieee80211_local *local)
|
|||
|
||||
DEBUGFS_ADD(total_ps_buffered);
|
||||
DEBUGFS_ADD(wep_iv);
|
||||
DEBUGFS_ADD(rate_ctrl_alg);
|
||||
DEBUGFS_ADD(queues);
|
||||
DEBUGFS_ADD(misc);
|
||||
#ifdef CONFIG_PM
|
||||
|
|
|
@ -522,6 +522,7 @@ void ieee80211_sta_debugfs_add(struct sta_info *sta)
|
|||
return;
|
||||
|
||||
DEBUGFS_ADD(flags);
|
||||
DEBUGFS_ADD(aid);
|
||||
DEBUGFS_ADD(num_ps_buf_frames);
|
||||
DEBUGFS_ADD(last_seq_ctrl);
|
||||
DEBUGFS_ADD(agg_status);
|
||||
|
|
|
@ -9,66 +9,58 @@
|
|||
|
||||
#include <crypto/aes.h>
|
||||
#include <crypto/algapi.h>
|
||||
#include <crypto/hash.h>
|
||||
#include <crypto/skcipher.h>
|
||||
|
||||
#include "ieee80211_i.h"
|
||||
#include "aes_cmac.h"
|
||||
#include "fils_aead.h"
|
||||
|
||||
static int aes_s2v(struct crypto_cipher *tfm,
|
||||
static void gf_mulx(u8 *pad)
|
||||
{
|
||||
u64 a = get_unaligned_be64(pad);
|
||||
u64 b = get_unaligned_be64(pad + 8);
|
||||
|
||||
put_unaligned_be64((a << 1) | (b >> 63), pad);
|
||||
put_unaligned_be64((b << 1) ^ ((a >> 63) ? 0x87 : 0), pad + 8);
|
||||
}
|
||||
|
||||
static int aes_s2v(struct crypto_shash *tfm,
|
||||
size_t num_elem, const u8 *addr[], size_t len[], u8 *v)
|
||||
{
|
||||
u8 d[AES_BLOCK_SIZE], tmp[AES_BLOCK_SIZE];
|
||||
u8 d[AES_BLOCK_SIZE], tmp[AES_BLOCK_SIZE] = {};
|
||||
SHASH_DESC_ON_STACK(desc, tfm);
|
||||
size_t i;
|
||||
const u8 *data[2];
|
||||
size_t data_len[2], data_elems;
|
||||
|
||||
desc->tfm = tfm;
|
||||
|
||||
/* D = AES-CMAC(K, <zero>) */
|
||||
memset(tmp, 0, AES_BLOCK_SIZE);
|
||||
data[0] = tmp;
|
||||
data_len[0] = AES_BLOCK_SIZE;
|
||||
aes_cmac_vector(tfm, 1, data, data_len, d, AES_BLOCK_SIZE);
|
||||
crypto_shash_digest(desc, tmp, AES_BLOCK_SIZE, d);
|
||||
|
||||
for (i = 0; i < num_elem - 1; i++) {
|
||||
/* D = dbl(D) xor AES_CMAC(K, Si) */
|
||||
gf_mulx(d); /* dbl */
|
||||
aes_cmac_vector(tfm, 1, &addr[i], &len[i], tmp,
|
||||
AES_BLOCK_SIZE);
|
||||
crypto_shash_digest(desc, addr[i], len[i], tmp);
|
||||
crypto_xor(d, tmp, AES_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
crypto_shash_init(desc);
|
||||
|
||||
if (len[i] >= AES_BLOCK_SIZE) {
|
||||
/* len(Sn) >= 128 */
|
||||
size_t j;
|
||||
const u8 *pos;
|
||||
|
||||
/* T = Sn xorend D */
|
||||
|
||||
/* Use a temporary buffer to perform xorend on Sn (addr[i]) to
|
||||
* avoid modifying the const input argument.
|
||||
*/
|
||||
data[0] = addr[i];
|
||||
data_len[0] = len[i] - AES_BLOCK_SIZE;
|
||||
pos = addr[i] + data_len[0];
|
||||
for (j = 0; j < AES_BLOCK_SIZE; j++)
|
||||
tmp[j] = pos[j] ^ d[j];
|
||||
data[1] = tmp;
|
||||
data_len[1] = AES_BLOCK_SIZE;
|
||||
data_elems = 2;
|
||||
crypto_shash_update(desc, addr[i], len[i] - AES_BLOCK_SIZE);
|
||||
crypto_xor(d, addr[i] + len[i] - AES_BLOCK_SIZE,
|
||||
AES_BLOCK_SIZE);
|
||||
} else {
|
||||
/* len(Sn) < 128 */
|
||||
/* T = dbl(D) xor pad(Sn) */
|
||||
gf_mulx(d); /* dbl */
|
||||
memset(tmp, 0, AES_BLOCK_SIZE);
|
||||
memcpy(tmp, addr[i], len[i]);
|
||||
tmp[len[i]] = 0x80;
|
||||
crypto_xor(d, tmp, AES_BLOCK_SIZE);
|
||||
data[0] = d;
|
||||
data_len[0] = sizeof(d);
|
||||
data_elems = 1;
|
||||
crypto_xor(d, addr[i], len[i]);
|
||||
d[len[i]] ^= 0x80;
|
||||
}
|
||||
/* V = AES-CMAC(K, T) */
|
||||
aes_cmac_vector(tfm, data_elems, data, data_len, v, AES_BLOCK_SIZE);
|
||||
crypto_shash_finup(desc, d, AES_BLOCK_SIZE, v);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -80,7 +72,7 @@ static int aes_siv_encrypt(const u8 *key, size_t key_len,
|
|||
size_t len[], u8 *out)
|
||||
{
|
||||
u8 v[AES_BLOCK_SIZE];
|
||||
struct crypto_cipher *tfm;
|
||||
struct crypto_shash *tfm;
|
||||
struct crypto_skcipher *tfm2;
|
||||
struct skcipher_request *req;
|
||||
int res;
|
||||
|
@ -95,14 +87,14 @@ static int aes_siv_encrypt(const u8 *key, size_t key_len,
|
|||
|
||||
/* S2V */
|
||||
|
||||
tfm = crypto_alloc_cipher("aes", 0, 0);
|
||||
tfm = crypto_alloc_shash("cmac(aes)", 0, 0);
|
||||
if (IS_ERR(tfm))
|
||||
return PTR_ERR(tfm);
|
||||
/* K1 for S2V */
|
||||
res = crypto_cipher_setkey(tfm, key, key_len);
|
||||
res = crypto_shash_setkey(tfm, key, key_len);
|
||||
if (!res)
|
||||
res = aes_s2v(tfm, num_elem, addr, len, v);
|
||||
crypto_free_cipher(tfm);
|
||||
crypto_free_shash(tfm);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
|
@ -157,7 +149,7 @@ static int aes_siv_decrypt(const u8 *key, size_t key_len,
|
|||
size_t num_elem, const u8 *addr[], size_t len[],
|
||||
u8 *out)
|
||||
{
|
||||
struct crypto_cipher *tfm;
|
||||
struct crypto_shash *tfm;
|
||||
struct crypto_skcipher *tfm2;
|
||||
struct skcipher_request *req;
|
||||
struct scatterlist src[1], dst[1];
|
||||
|
@ -210,14 +202,14 @@ static int aes_siv_decrypt(const u8 *key, size_t key_len,
|
|||
|
||||
/* S2V */
|
||||
|
||||
tfm = crypto_alloc_cipher("aes", 0, 0);
|
||||
tfm = crypto_alloc_shash("cmac(aes)", 0, 0);
|
||||
if (IS_ERR(tfm))
|
||||
return PTR_ERR(tfm);
|
||||
/* K1 for S2V */
|
||||
res = crypto_cipher_setkey(tfm, key, key_len);
|
||||
res = crypto_shash_setkey(tfm, key, key_len);
|
||||
if (!res)
|
||||
res = aes_s2v(tfm, num_elem, addr, len, check);
|
||||
crypto_free_cipher(tfm);
|
||||
crypto_free_shash(tfm);
|
||||
if (res)
|
||||
return res;
|
||||
if (memcmp(check, frame_iv, AES_BLOCK_SIZE) != 0)
|
||||
|
|
|
@ -487,14 +487,14 @@ int ieee80211_ibss_csa_beacon(struct ieee80211_sub_if_data *sdata,
|
|||
struct beacon_data *presp, *old_presp;
|
||||
struct cfg80211_bss *cbss;
|
||||
const struct cfg80211_bss_ies *ies;
|
||||
u16 capability = 0;
|
||||
u16 capability = WLAN_CAPABILITY_IBSS;
|
||||
u64 tsf;
|
||||
int ret = 0;
|
||||
|
||||
sdata_assert_lock(sdata);
|
||||
|
||||
if (ifibss->privacy)
|
||||
capability = WLAN_CAPABILITY_PRIVACY;
|
||||
capability |= WLAN_CAPABILITY_PRIVACY;
|
||||
|
||||
cbss = cfg80211_get_bss(sdata->local->hw.wiphy, ifibss->chandef.chan,
|
||||
ifibss->bssid, ifibss->ssid,
|
||||
|
|
|
@ -93,7 +93,7 @@ struct ieee80211_key {
|
|||
} ccmp;
|
||||
struct {
|
||||
u8 rx_pn[IEEE80211_CMAC_PN_LEN];
|
||||
struct crypto_cipher *tfm;
|
||||
struct crypto_shash *tfm;
|
||||
u32 replays; /* dot11RSNAStatsCMACReplays */
|
||||
u32 icverrors; /* dot11RSNAStatsCMACICVErrors */
|
||||
} aes_cmac;
|
||||
|
|
|
@ -3419,14 +3419,14 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
|||
ieee80211_cqm_rssi_notify(
|
||||
&sdata->vif,
|
||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
||||
GFP_KERNEL);
|
||||
sig, GFP_KERNEL);
|
||||
} else if (sig > thold &&
|
||||
(last_event == 0 || sig > last_event + hyst)) {
|
||||
ifmgd->last_cqm_event_signal = sig;
|
||||
ieee80211_cqm_rssi_notify(
|
||||
&sdata->vif,
|
||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
|
||||
GFP_KERNEL);
|
||||
sig, GFP_KERNEL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5041,13 +5041,14 @@ void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
|
|||
|
||||
void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
|
||||
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
||||
s32 rssi_level,
|
||||
gfp_t gfp)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
|
||||
|
||||
trace_api_cqm_rssi_notify(sdata, rssi_event);
|
||||
trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level);
|
||||
|
||||
cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, gfp);
|
||||
cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, rssi_level, gfp);
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_cqm_rssi_notify);
|
||||
|
||||
|
|
|
@ -1391,7 +1391,7 @@ EXPORT_SYMBOL(ieee80211_sta_pspoll);
|
|||
void ieee80211_sta_uapsd_trigger(struct ieee80211_sta *pubsta, u8 tid)
|
||||
{
|
||||
struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
||||
u8 ac = ieee802_1d_to_ac[tid & 7];
|
||||
int ac = ieee80211_ac_from_tid(tid);
|
||||
|
||||
/*
|
||||
* If this AC is not trigger-enabled do nothing unless the
|
||||
|
|
|
@ -95,7 +95,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
|
|||
*/
|
||||
if (*p & IEEE80211_QOS_CTL_EOSP)
|
||||
*p &= ~IEEE80211_QOS_CTL_EOSP;
|
||||
ac = ieee802_1d_to_ac[tid & 7];
|
||||
ac = ieee80211_ac_from_tid(tid);
|
||||
} else {
|
||||
ac = IEEE80211_AC_BE;
|
||||
}
|
||||
|
|
|
@ -1736,21 +1736,21 @@ TRACE_EVENT(drv_start_nan,
|
|||
LOCAL_ENTRY
|
||||
VIF_ENTRY
|
||||
__field(u8, master_pref)
|
||||
__field(u8, dual)
|
||||
__field(u8, bands)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
LOCAL_ASSIGN;
|
||||
VIF_ASSIGN;
|
||||
__entry->master_pref = conf->master_pref;
|
||||
__entry->dual = conf->dual;
|
||||
__entry->bands = conf->bands;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
LOCAL_PR_FMT VIF_PR_FMT
|
||||
", master preference: %u, dual: %d",
|
||||
", master preference: %u, bands: 0x%0x",
|
||||
LOCAL_PR_ARG, VIF_PR_ARG, __entry->master_pref,
|
||||
__entry->dual
|
||||
__entry->bands
|
||||
)
|
||||
);
|
||||
|
||||
|
@ -1787,7 +1787,7 @@ TRACE_EVENT(drv_nan_change_conf,
|
|||
LOCAL_ENTRY
|
||||
VIF_ENTRY
|
||||
__field(u8, master_pref)
|
||||
__field(u8, dual)
|
||||
__field(u8, bands)
|
||||
__field(u32, changes)
|
||||
),
|
||||
|
||||
|
@ -1795,15 +1795,15 @@ TRACE_EVENT(drv_nan_change_conf,
|
|||
LOCAL_ASSIGN;
|
||||
VIF_ASSIGN;
|
||||
__entry->master_pref = conf->master_pref;
|
||||
__entry->dual = conf->dual;
|
||||
__entry->bands = conf->bands;
|
||||
__entry->changes = changes;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
LOCAL_PR_FMT VIF_PR_FMT
|
||||
", master preference: %u, dual: %d, changes: 0x%x",
|
||||
", master preference: %u, bands: 0x%0x, changes: 0x%x",
|
||||
LOCAL_PR_ARG, VIF_PR_ARG, __entry->master_pref,
|
||||
__entry->dual, __entry->changes
|
||||
__entry->bands, __entry->changes
|
||||
)
|
||||
);
|
||||
|
||||
|
@ -1996,23 +1996,26 @@ TRACE_EVENT(api_connection_loss,
|
|||
|
||||
TRACE_EVENT(api_cqm_rssi_notify,
|
||||
TP_PROTO(struct ieee80211_sub_if_data *sdata,
|
||||
enum nl80211_cqm_rssi_threshold_event rssi_event),
|
||||
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
||||
s32 rssi_level),
|
||||
|
||||
TP_ARGS(sdata, rssi_event),
|
||||
TP_ARGS(sdata, rssi_event, rssi_level),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
VIF_ENTRY
|
||||
__field(u32, rssi_event)
|
||||
__field(s32, rssi_level)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
VIF_ASSIGN;
|
||||
__entry->rssi_event = rssi_event;
|
||||
__entry->rssi_level = rssi_level;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
VIF_PR_FMT " event:%d",
|
||||
VIF_PR_ARG, __entry->rssi_event
|
||||
VIF_PR_FMT " event:%d rssi:%d",
|
||||
VIF_PR_ARG, __entry->rssi_event, __entry->rssi_level
|
||||
)
|
||||
);
|
||||
|
||||
|
|
|
@ -1414,7 +1414,7 @@ void ieee80211_txq_init(struct ieee80211_sub_if_data *sdata,
|
|||
txqi->txq.sta = &sta->sta;
|
||||
sta->sta.txq[tid] = &txqi->txq;
|
||||
txqi->txq.tid = tid;
|
||||
txqi->txq.ac = ieee802_1d_to_ac[tid & 7];
|
||||
txqi->txq.ac = ieee80211_ac_from_tid(tid);
|
||||
} else {
|
||||
sdata->vif.txq = &txqi->txq;
|
||||
txqi->txq.tid = 0;
|
||||
|
@ -4659,7 +4659,7 @@ void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
|
|||
struct sk_buff *skb, int tid,
|
||||
enum nl80211_band band)
|
||||
{
|
||||
int ac = ieee802_1d_to_ac[tid & 7];
|
||||
int ac = ieee80211_ac_from_tid(tid);
|
||||
|
||||
skb_reset_mac_header(skb);
|
||||
skb_set_queue_mapping(skb, ac);
|
||||
|
|
|
@ -23,17 +23,6 @@ config RFKILL_INPUT
|
|||
depends on INPUT = y || RFKILL = INPUT
|
||||
default y if !EXPERT
|
||||
|
||||
config RFKILL_REGULATOR
|
||||
tristate "Generic rfkill regulator driver"
|
||||
depends on RFKILL || !RFKILL
|
||||
depends on REGULATOR
|
||||
help
|
||||
This options enable controlling radio transmitters connected to
|
||||
voltage regulator using the regulator framework.
|
||||
|
||||
To compile this driver as a module, choose M here: the module will
|
||||
be called rfkill-regulator.
|
||||
|
||||
config RFKILL_GPIO
|
||||
tristate "GPIO RFKILL driver"
|
||||
depends on RFKILL
|
||||
|
|
|
@ -5,5 +5,4 @@
|
|||
rfkill-y += core.o
|
||||
rfkill-$(CONFIG_RFKILL_INPUT) += input.o
|
||||
obj-$(CONFIG_RFKILL) += rfkill.o
|
||||
obj-$(CONFIG_RFKILL_REGULATOR) += rfkill-regulator.o
|
||||
obj-$(CONFIG_RFKILL_GPIO) += rfkill-gpio.o
|
||||
|
|
|
@ -1,154 +0,0 @@
|
|||
/*
|
||||
* rfkill-regulator.c - Regulator consumer driver for rfkill
|
||||
*
|
||||
* Copyright (C) 2009 Guiming Zhuo <gmzhuo@gmail.com>
|
||||
* Copyright (C) 2011 Antonio Ospite <ospite@studenti.unina.it>
|
||||
*
|
||||
* Implementation inspired by leds-regulator driver.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/rfkill.h>
|
||||
#include <linux/rfkill-regulator.h>
|
||||
|
||||
struct rfkill_regulator_data {
|
||||
struct rfkill *rf_kill;
|
||||
bool reg_enabled;
|
||||
|
||||
struct regulator *vcc;
|
||||
};
|
||||
|
||||
static int rfkill_regulator_set_block(void *data, bool blocked)
|
||||
{
|
||||
struct rfkill_regulator_data *rfkill_data = data;
|
||||
int ret = 0;
|
||||
|
||||
pr_debug("%s: blocked: %d\n", __func__, blocked);
|
||||
|
||||
if (blocked) {
|
||||
if (rfkill_data->reg_enabled) {
|
||||
regulator_disable(rfkill_data->vcc);
|
||||
rfkill_data->reg_enabled = false;
|
||||
}
|
||||
} else {
|
||||
if (!rfkill_data->reg_enabled) {
|
||||
ret = regulator_enable(rfkill_data->vcc);
|
||||
if (!ret)
|
||||
rfkill_data->reg_enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
pr_debug("%s: regulator_is_enabled after set_block: %d\n", __func__,
|
||||
regulator_is_enabled(rfkill_data->vcc));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct rfkill_ops rfkill_regulator_ops = {
|
||||
.set_block = rfkill_regulator_set_block,
|
||||
};
|
||||
|
||||
static int rfkill_regulator_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct rfkill_regulator_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct rfkill_regulator_data *rfkill_data;
|
||||
struct regulator *vcc;
|
||||
struct rfkill *rf_kill;
|
||||
int ret = 0;
|
||||
|
||||
if (pdata == NULL) {
|
||||
dev_err(&pdev->dev, "no platform data\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (pdata->name == NULL || pdata->type == 0) {
|
||||
dev_err(&pdev->dev, "invalid name or type in platform data\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vcc = regulator_get_exclusive(&pdev->dev, "vrfkill");
|
||||
if (IS_ERR(vcc)) {
|
||||
dev_err(&pdev->dev, "Cannot get vcc for %s\n", pdata->name);
|
||||
ret = PTR_ERR(vcc);
|
||||
goto out;
|
||||
}
|
||||
|
||||
rfkill_data = kzalloc(sizeof(*rfkill_data), GFP_KERNEL);
|
||||
if (rfkill_data == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto err_data_alloc;
|
||||
}
|
||||
|
||||
rf_kill = rfkill_alloc(pdata->name, &pdev->dev,
|
||||
pdata->type,
|
||||
&rfkill_regulator_ops, rfkill_data);
|
||||
if (rf_kill == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto err_rfkill_alloc;
|
||||
}
|
||||
|
||||
if (regulator_is_enabled(vcc)) {
|
||||
dev_dbg(&pdev->dev, "Regulator already enabled\n");
|
||||
rfkill_data->reg_enabled = true;
|
||||
}
|
||||
rfkill_data->vcc = vcc;
|
||||
rfkill_data->rf_kill = rf_kill;
|
||||
|
||||
ret = rfkill_register(rf_kill);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Cannot register rfkill device\n");
|
||||
goto err_rfkill_register;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, rfkill_data);
|
||||
dev_info(&pdev->dev, "%s initialized\n", pdata->name);
|
||||
|
||||
return 0;
|
||||
|
||||
err_rfkill_register:
|
||||
rfkill_destroy(rf_kill);
|
||||
err_rfkill_alloc:
|
||||
kfree(rfkill_data);
|
||||
err_data_alloc:
|
||||
regulator_put(vcc);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rfkill_regulator_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct rfkill_regulator_data *rfkill_data = platform_get_drvdata(pdev);
|
||||
struct rfkill *rf_kill = rfkill_data->rf_kill;
|
||||
|
||||
rfkill_unregister(rf_kill);
|
||||
rfkill_destroy(rf_kill);
|
||||
regulator_put(rfkill_data->vcc);
|
||||
kfree(rfkill_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver rfkill_regulator_driver = {
|
||||
.probe = rfkill_regulator_probe,
|
||||
.remove = rfkill_regulator_remove,
|
||||
.driver = {
|
||||
.name = "rfkill-regulator",
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(rfkill_regulator_driver);
|
||||
|
||||
MODULE_AUTHOR("Guiming Zhuo <gmzhuo@gmail.com>");
|
||||
MODULE_AUTHOR("Antonio Ospite <ospite@studenti.unina.it>");
|
||||
MODULE_DESCRIPTION("Regulator consumer driver for rfkill");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:rfkill-regulator");
|
|
@ -626,7 +626,8 @@ int wiphy_register(struct wiphy *wiphy)
|
|||
|
||||
if (WARN_ON((wiphy->interface_modes & BIT(NL80211_IFTYPE_NAN)) &&
|
||||
(!rdev->ops->start_nan || !rdev->ops->stop_nan ||
|
||||
!rdev->ops->add_nan_func || !rdev->ops->del_nan_func)))
|
||||
!rdev->ops->add_nan_func || !rdev->ops->del_nan_func ||
|
||||
!(wiphy->nan_supported_bands & BIT(NL80211_BAND_2GHZ)))))
|
||||
return -EINVAL;
|
||||
|
||||
#ifndef CONFIG_WIRELESS_WDS
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
static ssize_t name## _read(struct file *file, char __user *userbuf, \
|
||||
size_t count, loff_t *ppos) \
|
||||
{ \
|
||||
struct wiphy *wiphy= file->private_data; \
|
||||
struct wiphy *wiphy = file->private_data; \
|
||||
char buf[buflen]; \
|
||||
int res; \
|
||||
\
|
||||
|
@ -29,14 +29,14 @@ static const struct file_operations name## _ops = { \
|
|||
.read = name## _read, \
|
||||
.open = simple_open, \
|
||||
.llseek = generic_file_llseek, \
|
||||
};
|
||||
}
|
||||
|
||||
DEBUGFS_READONLY_FILE(rts_threshold, 20, "%d",
|
||||
wiphy->rts_threshold)
|
||||
wiphy->rts_threshold);
|
||||
DEBUGFS_READONLY_FILE(fragmentation_threshold, 20, "%d",
|
||||
wiphy->frag_threshold);
|
||||
DEBUGFS_READONLY_FILE(short_retry_limit, 20, "%d",
|
||||
wiphy->retry_short)
|
||||
wiphy->retry_short);
|
||||
DEBUGFS_READONLY_FILE(long_retry_limit, 20, "%d",
|
||||
wiphy->retry_long);
|
||||
|
||||
|
@ -103,7 +103,7 @@ static const struct file_operations ht40allow_map_ops = {
|
|||
};
|
||||
|
||||
#define DEBUGFS_ADD(name) \
|
||||
debugfs_create_file(#name, S_IRUGO, phyd, &rdev->wiphy, &name## _ops);
|
||||
debugfs_create_file(#name, 0444, phyd, &rdev->wiphy, &name## _ops)
|
||||
|
||||
void cfg80211_debugfs_rdev_add(struct cfg80211_registered_device *rdev)
|
||||
{
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||
* Copyright 2015-2016 Intel Deutschland GmbH
|
||||
* Copyright 2015-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
|
||||
#include <linux/if.h>
|
||||
|
@ -398,7 +398,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
|||
},
|
||||
[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = { .len = ETH_ALEN },
|
||||
[NL80211_ATTR_NAN_MASTER_PREF] = { .type = NLA_U8 },
|
||||
[NL80211_ATTR_NAN_DUAL] = { .type = NLA_U8 },
|
||||
[NL80211_ATTR_BANDS] = { .type = NLA_U32 },
|
||||
[NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED },
|
||||
[NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY,
|
||||
.len = FILS_MAX_KEK_LEN },
|
||||
|
@ -1886,6 +1886,10 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
|
|||
}
|
||||
}
|
||||
|
||||
if (nla_put_u32(msg, NL80211_ATTR_BANDS,
|
||||
rdev->wiphy.nan_supported_bands))
|
||||
goto nla_put_failure;
|
||||
|
||||
/* done */
|
||||
state->split_start = 0;
|
||||
break;
|
||||
|
@ -3743,6 +3747,49 @@ static int nl80211_parse_beacon(struct nlattr *attrs[],
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params,
|
||||
const u8 *rates)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!rates)
|
||||
return;
|
||||
|
||||
for (i = 0; i < rates[1]; i++) {
|
||||
if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
|
||||
params->ht_required = true;
|
||||
if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY)
|
||||
params->vht_required = true;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Since the nl80211 API didn't include, from the beginning, attributes about
|
||||
* HT/VHT requirements/capabilities, we parse them out of the IEs for the
|
||||
* benefit of drivers that rebuild IEs in the firmware.
|
||||
*/
|
||||
static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params)
|
||||
{
|
||||
const struct cfg80211_beacon_data *bcn = ¶ms->beacon;
|
||||
size_t ies_len = bcn->beacon_ies_len;
|
||||
const u8 *ies = bcn->beacon_ies;
|
||||
const u8 *rates;
|
||||
const u8 *cap;
|
||||
|
||||
rates = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies, ies_len);
|
||||
nl80211_check_ap_rate_selectors(params, rates);
|
||||
|
||||
rates = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, ies, ies_len);
|
||||
nl80211_check_ap_rate_selectors(params, rates);
|
||||
|
||||
cap = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies, ies_len);
|
||||
if (cap && cap[1] >= sizeof(*params->ht_cap))
|
||||
params->ht_cap = (void *)(cap + 2);
|
||||
cap = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, ies, ies_len);
|
||||
if (cap && cap[1] >= sizeof(*params->vht_cap))
|
||||
params->vht_cap = (void *)(cap + 2);
|
||||
}
|
||||
|
||||
static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
|
||||
struct cfg80211_ap_settings *params)
|
||||
{
|
||||
|
@ -3971,6 +4018,8 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
|
|||
return PTR_ERR(params.acl);
|
||||
}
|
||||
|
||||
nl80211_calculate_ap_params(¶ms);
|
||||
|
||||
wdev_lock(wdev);
|
||||
err = rdev_start_ap(rdev, dev, ¶ms);
|
||||
if (!err) {
|
||||
|
@ -6868,7 +6917,7 @@ nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans,
|
|||
|
||||
static struct cfg80211_sched_scan_request *
|
||||
nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct nlattr **attrs)
|
||||
struct nlattr **attrs, int max_match_sets)
|
||||
{
|
||||
struct cfg80211_sched_scan_request *request;
|
||||
struct nlattr *attr;
|
||||
|
@ -6933,7 +6982,7 @@ nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
|
|||
if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
|
||||
n_match_sets = 1;
|
||||
|
||||
if (n_match_sets > wiphy->max_match_sets)
|
||||
if (n_match_sets > max_match_sets)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (attrs[NL80211_ATTR_IE])
|
||||
|
@ -7233,7 +7282,8 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
|
|||
return -EINPROGRESS;
|
||||
|
||||
sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev,
|
||||
info->attrs);
|
||||
info->attrs,
|
||||
rdev->wiphy.max_match_sets);
|
||||
|
||||
err = PTR_ERR_OR_ZERO(sched_scan_req);
|
||||
if (err)
|
||||
|
@ -8586,6 +8636,12 @@ static int nl80211_testmode_dump(struct sk_buff *skb,
|
|||
* so we need to offset by 1.
|
||||
*/
|
||||
phy_idx = cb->args[0] - 1;
|
||||
|
||||
rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
|
||||
if (!rdev) {
|
||||
err = -ENOENT;
|
||||
goto out_err;
|
||||
}
|
||||
} else {
|
||||
struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
|
||||
|
||||
|
@ -8600,7 +8656,6 @@ static int nl80211_testmode_dump(struct sk_buff *skb,
|
|||
goto out_err;
|
||||
}
|
||||
phy_idx = rdev->wiphy_idx;
|
||||
rdev = NULL;
|
||||
|
||||
if (attrbuf[NL80211_ATTR_TESTDATA])
|
||||
cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
|
||||
|
@ -8611,12 +8666,6 @@ static int nl80211_testmode_dump(struct sk_buff *skb,
|
|||
data_len = nla_len((void *)cb->args[1]);
|
||||
}
|
||||
|
||||
rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
|
||||
if (!rdev) {
|
||||
err = -ENOENT;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (!rdev->ops->testmode_dump) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto out_err;
|
||||
|
@ -9430,6 +9479,7 @@ nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
|
|||
[NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
|
||||
[NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
|
||||
[NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
|
||||
[NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 },
|
||||
};
|
||||
|
||||
static int nl80211_set_cqm_txe(struct genl_info *info,
|
||||
|
@ -10046,7 +10096,8 @@ static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev,
|
|||
if (err)
|
||||
goto out;
|
||||
|
||||
trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb);
|
||||
trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb,
|
||||
wowlan->max_nd_match_sets);
|
||||
err = PTR_ERR_OR_ZERO(trig->nd_config);
|
||||
if (err)
|
||||
trig->nd_config = NULL;
|
||||
|
@ -10731,15 +10782,22 @@ static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
|
|||
if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
|
||||
return -EINVAL;
|
||||
|
||||
if (!info->attrs[NL80211_ATTR_NAN_DUAL])
|
||||
return -EINVAL;
|
||||
|
||||
conf.master_pref =
|
||||
nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
|
||||
if (!conf.master_pref)
|
||||
return -EINVAL;
|
||||
|
||||
conf.dual = nla_get_u8(info->attrs[NL80211_ATTR_NAN_DUAL]);
|
||||
if (info->attrs[NL80211_ATTR_BANDS]) {
|
||||
u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
|
||||
|
||||
if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
|
||||
return -EINVAL;
|
||||
|
||||
conf.bands = bands;
|
||||
}
|
||||
|
||||
err = rdev_start_nan(rdev, wdev, &conf);
|
||||
if (err)
|
||||
|
@ -11104,9 +11162,17 @@ static int nl80211_nan_change_config(struct sk_buff *skb,
|
|||
changed |= CFG80211_NAN_CONF_CHANGED_PREF;
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_NAN_DUAL]) {
|
||||
conf.dual = nla_get_u8(info->attrs[NL80211_ATTR_NAN_DUAL]);
|
||||
changed |= CFG80211_NAN_CONF_CHANGED_DUAL;
|
||||
if (info->attrs[NL80211_ATTR_BANDS]) {
|
||||
u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
|
||||
|
||||
if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
|
||||
return -EINVAL;
|
||||
|
||||
conf.bands = bands;
|
||||
changed |= CFG80211_NAN_CONF_CHANGED_BANDS;
|
||||
}
|
||||
|
||||
if (!changed)
|
||||
|
@ -13914,11 +13980,11 @@ static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp)
|
|||
|
||||
void cfg80211_cqm_rssi_notify(struct net_device *dev,
|
||||
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
||||
gfp_t gfp)
|
||||
s32 rssi_level, gfp_t gfp)
|
||||
{
|
||||
struct sk_buff *msg;
|
||||
|
||||
trace_cfg80211_cqm_rssi_notify(dev, rssi_event);
|
||||
trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level);
|
||||
|
||||
if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
|
||||
rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
|
||||
|
@ -13932,6 +13998,10 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev,
|
|||
rssi_event))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL,
|
||||
rssi_level))
|
||||
goto nla_put_failure;
|
||||
|
||||
cfg80211_send_cqm(msg, gfp);
|
||||
|
||||
return;
|
||||
|
|
|
@ -1915,18 +1915,18 @@ TRACE_EVENT(rdev_start_nan,
|
|||
WIPHY_ENTRY
|
||||
WDEV_ENTRY
|
||||
__field(u8, master_pref)
|
||||
__field(u8, dual);
|
||||
__field(u8, bands);
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
__entry->master_pref = conf->master_pref;
|
||||
__entry->dual = conf->dual;
|
||||
__entry->bands = conf->bands;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT
|
||||
", master preference: %u, dual: %d",
|
||||
", master preference: %u, bands: 0x%0x",
|
||||
WIPHY_PR_ARG, WDEV_PR_ARG, __entry->master_pref,
|
||||
__entry->dual)
|
||||
__entry->bands)
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_nan_change_conf,
|
||||
|
@ -1937,20 +1937,20 @@ TRACE_EVENT(rdev_nan_change_conf,
|
|||
WIPHY_ENTRY
|
||||
WDEV_ENTRY
|
||||
__field(u8, master_pref)
|
||||
__field(u8, dual);
|
||||
__field(u8, bands);
|
||||
__field(u32, changes);
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
__entry->master_pref = conf->master_pref;
|
||||
__entry->dual = conf->dual;
|
||||
__entry->bands = conf->bands;
|
||||
__entry->changes = changes;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT
|
||||
", master preference: %u, dual: %d, changes: %x",
|
||||
", master preference: %u, bands: 0x%0x, changes: %x",
|
||||
WIPHY_PR_ARG, WDEV_PR_ARG, __entry->master_pref,
|
||||
__entry->dual, __entry->changes)
|
||||
__entry->bands, __entry->changes)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(wiphy_wdev_evt, rdev_stop_nan,
|
||||
|
@ -2490,18 +2490,21 @@ TRACE_EVENT(cfg80211_mgmt_tx_status,
|
|||
|
||||
TRACE_EVENT(cfg80211_cqm_rssi_notify,
|
||||
TP_PROTO(struct net_device *netdev,
|
||||
enum nl80211_cqm_rssi_threshold_event rssi_event),
|
||||
TP_ARGS(netdev, rssi_event),
|
||||
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
||||
s32 rssi_level),
|
||||
TP_ARGS(netdev, rssi_event, rssi_level),
|
||||
TP_STRUCT__entry(
|
||||
NETDEV_ENTRY
|
||||
__field(enum nl80211_cqm_rssi_threshold_event, rssi_event)
|
||||
__field(s32, rssi_level)
|
||||
),
|
||||
TP_fast_assign(
|
||||
NETDEV_ASSIGN;
|
||||
__entry->rssi_event = rssi_event;
|
||||
__entry->rssi_level = rssi_level;
|
||||
),
|
||||
TP_printk(NETDEV_PR_FMT ", rssi event: %d",
|
||||
NETDEV_PR_ARG, __entry->rssi_event)
|
||||
TP_printk(NETDEV_PR_FMT ", rssi event: %d, level: %d",
|
||||
NETDEV_PR_ARG, __entry->rssi_event, __entry->rssi_level)
|
||||
);
|
||||
|
||||
TRACE_EVENT(cfg80211_reg_can_beacon,
|
||||
|
|
Loading…
Reference in New Issue