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
34 changed files with 556 additions and 840 deletions
|
@ -586,6 +586,7 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
|
||||||
ieee80211_cqm_rssi_notify(
|
ieee80211_cqm_rssi_notify(
|
||||||
vif,
|
vif,
|
||||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
||||||
|
sig,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
} else if (sig > thold &&
|
} else if (sig > thold &&
|
||||||
(last_event == 0 || sig > last_event + hyst)) {
|
(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(
|
ieee80211_cqm_rssi_notify(
|
||||||
vif,
|
vif,
|
||||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
|
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
|
||||||
|
sig,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -824,7 +824,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
|
||||||
case EVENT_RSSI_LOW:
|
case EVENT_RSSI_LOW:
|
||||||
cfg80211_cqm_rssi_notify(priv->netdev,
|
cfg80211_cqm_rssi_notify(priv->netdev,
|
||||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
||||||
GFP_KERNEL);
|
0, GFP_KERNEL);
|
||||||
mwifiex_send_cmd(priv, HostCmd_CMD_RSSI_INFO,
|
mwifiex_send_cmd(priv, HostCmd_CMD_RSSI_INFO,
|
||||||
HostCmd_ACT_GEN_GET, 0, NULL, false);
|
HostCmd_ACT_GEN_GET, 0, NULL, false);
|
||||||
priv->subsc_evt_rssi_state = RSSI_LOW_RECVD;
|
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:
|
case EVENT_RSSI_HIGH:
|
||||||
cfg80211_cqm_rssi_notify(priv->netdev,
|
cfg80211_cqm_rssi_notify(priv->netdev,
|
||||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
|
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
|
||||||
GFP_KERNEL);
|
0, GFP_KERNEL);
|
||||||
mwifiex_send_cmd(priv, HostCmd_CMD_RSSI_INFO,
|
mwifiex_send_cmd(priv, HostCmd_CMD_RSSI_INFO,
|
||||||
HostCmd_ACT_GEN_GET, 0, NULL, false);
|
HostCmd_ACT_GEN_GET, 0, NULL, false);
|
||||||
priv->subsc_evt_rssi_state = RSSI_HIGH_RECVD;
|
priv->subsc_evt_rssi_state = RSSI_HIGH_RECVD;
|
||||||
|
|
|
@ -3187,7 +3187,7 @@ static void rndis_do_cqm(struct usbnet *usbdev, s32 rssi)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
priv->last_cqm_event_rssi = rssi;
|
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)
|
#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;
|
common->cqm_info.last_cqm_event_rssi = rssi;
|
||||||
rsi_dbg(INFO_ZONE, "CQM: Notifying event: %d\n", event);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1019,7 +1019,7 @@ void cw1200_event_handler(struct work_struct *work)
|
||||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW :
|
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW :
|
||||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH;
|
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH;
|
||||||
pr_debug("[CQM] RSSI event: %d.\n", rcpi_rssi);
|
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);
|
GFP_KERNEL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,7 +150,7 @@ static int wl1251_event_process(struct wl1251 *wl, struct event_mailbox *mbox)
|
||||||
"ROAMING_TRIGGER_LOW_RSSI_EVENT");
|
"ROAMING_TRIGGER_LOW_RSSI_EVENT");
|
||||||
ieee80211_cqm_rssi_notify(wl->vif,
|
ieee80211_cqm_rssi_notify(wl->vif,
|
||||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
||||||
GFP_KERNEL);
|
0, GFP_KERNEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vector & ROAMING_TRIGGER_REGAINED_RSSI_EVENT_ID) {
|
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");
|
"ROAMING_TRIGGER_REGAINED_RSSI_EVENT");
|
||||||
ieee80211_cqm_rssi_notify(wl->vif,
|
ieee80211_cqm_rssi_notify(wl->vif,
|
||||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
|
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);
|
vif = wl12xx_wlvif_to_vif(wlvif);
|
||||||
if (event != wlvif->last_rssi_event)
|
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;
|
wlvif->last_rssi_event = event;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1043,8 +1043,9 @@ struct ieee80211_mgmt {
|
||||||
} u;
|
} u;
|
||||||
} __packed __aligned(2);
|
} __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_HT_PHY 127
|
||||||
|
#define BSS_MEMBERSHIP_SELECTOR_VHT_PHY 126
|
||||||
|
|
||||||
/* mgmt header + 1 byte category code */
|
/* mgmt header + 1 byte category code */
|
||||||
#define IEEE80211_MIN_ACTION_SIZE offsetof(struct ieee80211_mgmt, u.action.u)
|
#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 SUITE(oui, id) (((oui) << 8) | (id))
|
||||||
#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 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 */
|
/* AKM suite selectors */
|
||||||
#define WLAN_AKM_SUITE_8021X 0x000FAC01
|
#define WLAN_AKM_SUITE_8021X SUITE(0x000FAC, 1)
|
||||||
#define WLAN_AKM_SUITE_PSK 0x000FAC02
|
#define WLAN_AKM_SUITE_PSK SUITE(0x000FAC, 2)
|
||||||
#define WLAN_AKM_SUITE_8021X_SHA256 0x000FAC05
|
#define WLAN_AKM_SUITE_8021X_SHA256 SUITE(0x000FAC, 5)
|
||||||
#define WLAN_AKM_SUITE_PSK_SHA256 0x000FAC06
|
#define WLAN_AKM_SUITE_PSK_SHA256 SUITE(0x000FAC, 6)
|
||||||
#define WLAN_AKM_SUITE_TDLS 0x000FAC07
|
#define WLAN_AKM_SUITE_TDLS SUITE(0x000FAC, 7)
|
||||||
#define WLAN_AKM_SUITE_SAE 0x000FAC08
|
#define WLAN_AKM_SUITE_SAE SUITE(0x000FAC, 8)
|
||||||
#define WLAN_AKM_SUITE_FT_OVER_SAE 0x000FAC09
|
#define WLAN_AKM_SUITE_FT_OVER_SAE SUITE(0x000FAC, 9)
|
||||||
|
|
||||||
#define WLAN_MAX_KEY_LEN 32
|
#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 2006-2010 Johannes Berg <johannes@sipsolutions.net>
|
||||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
* 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
|
* 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
|
* 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
|
* @pbss: If set, start as a PCP instead of AP. Relevant for DMG
|
||||||
* networks.
|
* networks.
|
||||||
* @beacon_rate: bitrate to be used for beacons
|
* @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_ap_settings {
|
||||||
struct cfg80211_chan_def chandef;
|
struct cfg80211_chan_def chandef;
|
||||||
|
@ -768,6 +772,10 @@ struct cfg80211_ap_settings {
|
||||||
const struct cfg80211_acl_data *acl;
|
const struct cfg80211_acl_data *acl;
|
||||||
bool pbss;
|
bool pbss;
|
||||||
struct cfg80211_bitrate_mask beacon_rate;
|
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
|
* This struct defines NAN configuration parameters
|
||||||
*
|
*
|
||||||
* @master_pref: master preference (1 - 255)
|
* @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 {
|
struct cfg80211_nan_conf {
|
||||||
u8 master_pref;
|
u8 master_pref;
|
||||||
u8 dual;
|
u8 bands;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2420,11 +2430,11 @@ struct cfg80211_nan_conf {
|
||||||
* configuration
|
* configuration
|
||||||
*
|
*
|
||||||
* @CFG80211_NAN_CONF_CHANGED_PREF: master preference
|
* @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 {
|
enum cfg80211_nan_conf_changes {
|
||||||
CFG80211_NAN_CONF_CHANGED_PREF = BIT(0),
|
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
|
* 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
|
* With this structure the driver can describe which interface
|
||||||
* combinations it supports concurrently.
|
* combinations it supports concurrently.
|
||||||
|
@ -3252,13 +3246,60 @@ struct ieee80211_iface_limit {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
struct ieee80211_iface_combination {
|
struct ieee80211_iface_combination {
|
||||||
|
/**
|
||||||
|
* @limits:
|
||||||
|
* limits for the given interface types
|
||||||
|
*/
|
||||||
const struct ieee80211_iface_limit *limits;
|
const struct ieee80211_iface_limit *limits;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @num_different_channels:
|
||||||
|
* can use up to this many different channels
|
||||||
|
*/
|
||||||
u32 num_different_channels;
|
u32 num_different_channels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @max_interfaces:
|
||||||
|
* maximum number of interfaces in total allowed in this group
|
||||||
|
*/
|
||||||
u16 max_interfaces;
|
u16 max_interfaces;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @n_limits:
|
||||||
|
* number of limitations
|
||||||
|
*/
|
||||||
u8 n_limits;
|
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;
|
bool beacon_int_infra_match;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @radar_detect_widths:
|
||||||
|
* bitmap of channel widths supported for radar detection
|
||||||
|
*/
|
||||||
u8 radar_detect_widths;
|
u8 radar_detect_widths;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @radar_detect_regions:
|
||||||
|
* bitmap of regions supported for radar detection
|
||||||
|
*/
|
||||||
u8 radar_detect_regions;
|
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;
|
u32 beacon_int_min_gcd;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3557,6 +3598,10 @@ struct wiphy_iftype_ext_capab {
|
||||||
* attribute indices defined in &enum nl80211_bss_select_attr.
|
* attribute indices defined in &enum nl80211_bss_select_attr.
|
||||||
*
|
*
|
||||||
* @cookie_counter: unique generic cookie counter, used to identify objects.
|
* @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 {
|
struct wiphy {
|
||||||
/* assign these fields before you register the wiphy */
|
/* assign these fields before you register the wiphy */
|
||||||
|
@ -3688,6 +3733,8 @@ struct wiphy {
|
||||||
|
|
||||||
u64 cookie_counter;
|
u64 cookie_counter;
|
||||||
|
|
||||||
|
u8 nan_supported_bands;
|
||||||
|
|
||||||
char priv[0] __aligned(NETDEV_ALIGN);
|
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
|
* cfg80211_cqm_rssi_notify - connection quality monitoring rssi event
|
||||||
* @dev: network device
|
* @dev: network device
|
||||||
* @rssi_event: the triggered RSSI event
|
* @rssi_event: the triggered RSSI event
|
||||||
|
* @rssi_level: new RSSI level value or 0 if not available
|
||||||
* @gfp: context flags
|
* @gfp: context flags
|
||||||
*
|
*
|
||||||
* This function is called when a configured connection quality monitoring
|
* 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,
|
void cfg80211_cqm_rssi_notify(struct net_device *dev,
|
||||||
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
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
|
* 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
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* modification, are permitted provided that the following conditions
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
* are met:
|
* copyright notice and this permission notice appear in all copies.
|
||||||
* 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.
|
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``AS IS'' AND ANY
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DAVID
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
* YOUNG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
* 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.
|
|
||||||
*/
|
*/
|
||||||
|
#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 <linux/kernel.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
|
||||||
/* Base version of the radiotap packet header data */
|
/**
|
||||||
#define PKTHDR_RADIOTAP_VERSION 0
|
* struct ieee82011_radiotap_header - base radiotap header
|
||||||
|
|
||||||
/* 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 ieee80211_radiotap_header {
|
struct ieee80211_radiotap_header {
|
||||||
u8 it_version; /* Version 0. Only increases
|
/**
|
||||||
* for drastic changes,
|
* @it_version: radiotap version, always 0
|
||||||
* introduction of compatible
|
*/
|
||||||
* new fields does not count.
|
uint8_t it_version;
|
||||||
*/
|
|
||||||
u8 it_pad;
|
/**
|
||||||
__le16 it_len; /* length of the whole
|
* @it_pad: padding (or alignment)
|
||||||
* header in bytes, including
|
*/
|
||||||
* it_version, it_pad,
|
uint8_t it_pad;
|
||||||
* it_len, and data fields.
|
|
||||||
*/
|
/**
|
||||||
__le32 it_present; /* A bitmap telling which
|
* @it_len: overall radiotap header length
|
||||||
* fields are present. Set bit 31
|
*/
|
||||||
* (0x80000000) to extend the
|
__le16 it_len;
|
||||||
* bitmap by another 32 bits.
|
|
||||||
* Additional extensions are made
|
/**
|
||||||
* by setting bit 31.
|
* @it_present: (first) present word
|
||||||
*/
|
*/
|
||||||
|
__le32 it_present;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
/* Name Data type Units
|
/* version is always 0 */
|
||||||
* ---- --------- -----
|
#define PKTHDR_RADIOTAP_VERSION 0
|
||||||
*
|
|
||||||
* IEEE80211_RADIOTAP_TSFT __le64 microseconds
|
/* see the radiotap website for the descriptions */
|
||||||
*
|
enum ieee80211_radiotap_presence {
|
||||||
* 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 {
|
|
||||||
IEEE80211_RADIOTAP_TSFT = 0,
|
IEEE80211_RADIOTAP_TSFT = 0,
|
||||||
IEEE80211_RADIOTAP_FLAGS = 1,
|
IEEE80211_RADIOTAP_FLAGS = 1,
|
||||||
IEEE80211_RADIOTAP_RATE = 2,
|
IEEE80211_RADIOTAP_RATE = 2,
|
||||||
|
@ -214,7 +67,7 @@ enum ieee80211_radiotap_type {
|
||||||
IEEE80211_RADIOTAP_TX_FLAGS = 15,
|
IEEE80211_RADIOTAP_TX_FLAGS = 15,
|
||||||
IEEE80211_RADIOTAP_RTS_RETRIES = 16,
|
IEEE80211_RADIOTAP_RTS_RETRIES = 16,
|
||||||
IEEE80211_RADIOTAP_DATA_RETRIES = 17,
|
IEEE80211_RADIOTAP_DATA_RETRIES = 17,
|
||||||
|
/* 18 is XChannel, but it's not defined yet */
|
||||||
IEEE80211_RADIOTAP_MCS = 19,
|
IEEE80211_RADIOTAP_MCS = 19,
|
||||||
IEEE80211_RADIOTAP_AMPDU_STATUS = 20,
|
IEEE80211_RADIOTAP_AMPDU_STATUS = 20,
|
||||||
IEEE80211_RADIOTAP_VHT = 21,
|
IEEE80211_RADIOTAP_VHT = 21,
|
||||||
|
@ -226,129 +79,135 @@ enum ieee80211_radiotap_type {
|
||||||
IEEE80211_RADIOTAP_EXT = 31
|
IEEE80211_RADIOTAP_EXT = 31
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Channel flags. */
|
/* for IEEE80211_RADIOTAP_FLAGS */
|
||||||
#define IEEE80211_CHAN_TURBO 0x0010 /* Turbo channel */
|
enum ieee80211_radiotap_flags {
|
||||||
#define IEEE80211_CHAN_CCK 0x0020 /* CCK channel */
|
IEEE80211_RADIOTAP_F_CFP = 0x01,
|
||||||
#define IEEE80211_CHAN_OFDM 0x0040 /* OFDM channel */
|
IEEE80211_RADIOTAP_F_SHORTPRE = 0x02,
|
||||||
#define IEEE80211_CHAN_2GHZ 0x0080 /* 2 GHz spectrum channel. */
|
IEEE80211_RADIOTAP_F_WEP = 0x04,
|
||||||
#define IEEE80211_CHAN_5GHZ 0x0100 /* 5 GHz spectrum channel */
|
IEEE80211_RADIOTAP_F_FRAG = 0x08,
|
||||||
#define IEEE80211_CHAN_PASSIVE 0x0200 /* Only passive scan allowed */
|
IEEE80211_RADIOTAP_F_FCS = 0x10,
|
||||||
#define IEEE80211_CHAN_DYN 0x0400 /* Dynamic CCK-OFDM channel */
|
IEEE80211_RADIOTAP_F_DATAPAD = 0x20,
|
||||||
#define IEEE80211_CHAN_GFSK 0x0800 /* GFSK channel (FHSS PHY) */
|
IEEE80211_RADIOTAP_F_BADFCS = 0x40,
|
||||||
#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 */
|
/* for IEEE80211_RADIOTAP_CHANNEL */
|
||||||
#define IEEE80211_RADIOTAP_F_CFP 0x01 /* sent/received
|
enum ieee80211_radiotap_channel_flags {
|
||||||
* during CFP
|
IEEE80211_CHAN_CCK = 0x0020,
|
||||||
*/
|
IEEE80211_CHAN_OFDM = 0x0040,
|
||||||
#define IEEE80211_RADIOTAP_F_SHORTPRE 0x02 /* sent/received
|
IEEE80211_CHAN_2GHZ = 0x0080,
|
||||||
* with short
|
IEEE80211_CHAN_5GHZ = 0x0100,
|
||||||
* preamble
|
IEEE80211_CHAN_DYN = 0x0400,
|
||||||
*/
|
IEEE80211_CHAN_HALF = 0x4000,
|
||||||
#define IEEE80211_RADIOTAP_F_WEP 0x04 /* sent/received
|
IEEE80211_CHAN_QUARTER = 0x8000,
|
||||||
* 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_RX_FLAGS */
|
/* for IEEE80211_RADIOTAP_RX_FLAGS */
|
||||||
#define IEEE80211_RADIOTAP_F_RX_BADPLCP 0x0002 /* frame has bad PLCP */
|
enum ieee80211_radiotap_rx_flags {
|
||||||
|
IEEE80211_RADIOTAP_F_RX_BADPLCP = 0x0002,
|
||||||
|
};
|
||||||
|
|
||||||
/* For IEEE80211_RADIOTAP_TX_FLAGS */
|
/* for IEEE80211_RADIOTAP_TX_FLAGS */
|
||||||
#define IEEE80211_RADIOTAP_F_TX_FAIL 0x0001 /* failed due to excessive
|
enum ieee80211_radiotap_tx_flags {
|
||||||
* retries */
|
IEEE80211_RADIOTAP_F_TX_FAIL = 0x0001,
|
||||||
#define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */
|
IEEE80211_RADIOTAP_F_TX_CTS = 0x0002,
|
||||||
#define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */
|
IEEE80211_RADIOTAP_F_TX_RTS = 0x0004,
|
||||||
#define IEEE80211_RADIOTAP_F_TX_NOACK 0x0008 /* don't expect an ack */
|
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 */
|
enum ieee80211_radiotap_mcs_flags {
|
||||||
#define IEEE80211_RADIOTAP_MCS_HAVE_BW 0x01
|
IEEE80211_RADIOTAP_MCS_BW_MASK = 0x03,
|
||||||
#define IEEE80211_RADIOTAP_MCS_HAVE_MCS 0x02
|
IEEE80211_RADIOTAP_MCS_BW_20 = 0,
|
||||||
#define IEEE80211_RADIOTAP_MCS_HAVE_GI 0x04
|
IEEE80211_RADIOTAP_MCS_BW_40 = 1,
|
||||||
#define IEEE80211_RADIOTAP_MCS_HAVE_FMT 0x08
|
IEEE80211_RADIOTAP_MCS_BW_20L = 2,
|
||||||
#define IEEE80211_RADIOTAP_MCS_HAVE_FEC 0x10
|
IEEE80211_RADIOTAP_MCS_BW_20U = 3,
|
||||||
#define IEEE80211_RADIOTAP_MCS_HAVE_STBC 0x20
|
|
||||||
|
|
||||||
#define IEEE80211_RADIOTAP_MCS_BW_MASK 0x03
|
IEEE80211_RADIOTAP_MCS_SGI = 0x04,
|
||||||
#define IEEE80211_RADIOTAP_MCS_BW_20 0
|
IEEE80211_RADIOTAP_MCS_FMT_GF = 0x08,
|
||||||
#define IEEE80211_RADIOTAP_MCS_BW_40 1
|
IEEE80211_RADIOTAP_MCS_FEC_LDPC = 0x10,
|
||||||
#define IEEE80211_RADIOTAP_MCS_BW_20L 2
|
IEEE80211_RADIOTAP_MCS_STBC_MASK = 0x60,
|
||||||
#define IEEE80211_RADIOTAP_MCS_BW_20U 3
|
IEEE80211_RADIOTAP_MCS_STBC_1 = 1,
|
||||||
#define IEEE80211_RADIOTAP_MCS_SGI 0x04
|
IEEE80211_RADIOTAP_MCS_STBC_2 = 2,
|
||||||
#define IEEE80211_RADIOTAP_MCS_FMT_GF 0x08
|
IEEE80211_RADIOTAP_MCS_STBC_3 = 3,
|
||||||
#define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10
|
IEEE80211_RADIOTAP_MCS_STBC_SHIFT = 5,
|
||||||
#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
|
|
||||||
|
|
||||||
#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 */
|
/* for IEEE80211_RADIOTAP_VHT */
|
||||||
#define IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN 0x0001
|
enum ieee80211_radiotap_vht_known {
|
||||||
#define IEEE80211_RADIOTAP_AMPDU_IS_ZEROLEN 0x0002
|
IEEE80211_RADIOTAP_VHT_KNOWN_STBC = 0x0001,
|
||||||
#define IEEE80211_RADIOTAP_AMPDU_LAST_KNOWN 0x0004
|
IEEE80211_RADIOTAP_VHT_KNOWN_TXOP_PS_NA = 0x0002,
|
||||||
#define IEEE80211_RADIOTAP_AMPDU_IS_LAST 0x0008
|
IEEE80211_RADIOTAP_VHT_KNOWN_GI = 0x0004,
|
||||||
#define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR 0x0010
|
IEEE80211_RADIOTAP_VHT_KNOWN_SGI_NSYM_DIS = 0x0008,
|
||||||
#define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN 0x0020
|
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 */
|
enum ieee80211_radiotap_vht_flags {
|
||||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_STBC 0x0001
|
IEEE80211_RADIOTAP_VHT_FLAG_STBC = 0x01,
|
||||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_TXOP_PS_NA 0x0002
|
IEEE80211_RADIOTAP_VHT_FLAG_TXOP_PS_NA = 0x02,
|
||||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_GI 0x0004
|
IEEE80211_RADIOTAP_VHT_FLAG_SGI = 0x04,
|
||||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_SGI_NSYM_DIS 0x0008
|
IEEE80211_RADIOTAP_VHT_FLAG_SGI_NSYM_M10_9 = 0x08,
|
||||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_LDPC_EXTRA_OFDM_SYM 0x0010
|
IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM = 0x10,
|
||||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED 0x0020
|
IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED = 0x20,
|
||||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH 0x0040
|
};
|
||||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_GROUP_ID 0x0080
|
|
||||||
#define IEEE80211_RADIOTAP_VHT_KNOWN_PARTIAL_AID 0x0100
|
|
||||||
|
|
||||||
#define IEEE80211_RADIOTAP_VHT_FLAG_STBC 0x01
|
enum ieee80211_radiotap_vht_coding {
|
||||||
#define IEEE80211_RADIOTAP_VHT_FLAG_TXOP_PS_NA 0x02
|
IEEE80211_RADIOTAP_CODING_LDPC_USER0 = 0x01,
|
||||||
#define IEEE80211_RADIOTAP_VHT_FLAG_SGI 0x04
|
IEEE80211_RADIOTAP_CODING_LDPC_USER1 = 0x02,
|
||||||
#define IEEE80211_RADIOTAP_VHT_FLAG_SGI_NSYM_M10_9 0x08
|
IEEE80211_RADIOTAP_CODING_LDPC_USER2 = 0x04,
|
||||||
#define IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM 0x10
|
IEEE80211_RADIOTAP_CODING_LDPC_USER3 = 0x08,
|
||||||
#define IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED 0x20
|
};
|
||||||
|
|
||||||
#define IEEE80211_RADIOTAP_CODING_LDPC_USER0 0x01
|
/* for IEEE80211_RADIOTAP_TIMESTAMP */
|
||||||
#define IEEE80211_RADIOTAP_CODING_LDPC_USER1 0x02
|
enum ieee80211_radiotap_timestamp_unit_spos {
|
||||||
#define IEEE80211_RADIOTAP_CODING_LDPC_USER2 0x04
|
IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MASK = 0x000F,
|
||||||
#define IEEE80211_RADIOTAP_CODING_LDPC_USER3 0x08
|
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 */
|
enum ieee80211_radiotap_timestamp_flags {
|
||||||
#define IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MASK 0x000F
|
IEEE80211_RADIOTAP_TIMESTAMP_FLAG_64BIT = 0x00,
|
||||||
#define IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MS 0x0000
|
IEEE80211_RADIOTAP_TIMESTAMP_FLAG_32BIT = 0x01,
|
||||||
#define IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US 0x0001
|
IEEE80211_RADIOTAP_TIMESTAMP_FLAG_ACCURACY = 0x02,
|
||||||
#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
|
|
||||||
|
|
||||||
#define IEEE80211_RADIOTAP_TIMESTAMP_FLAG_64BIT 0x00
|
/**
|
||||||
#define IEEE80211_RADIOTAP_TIMESTAMP_FLAG_32BIT 0x01
|
* ieee80211_get_radiotap_len - get radiotap header length
|
||||||
#define IEEE80211_RADIOTAP_TIMESTAMP_FLAG_ACCURACY 0x02
|
*/
|
||||||
|
static inline u16 ieee80211_get_radiotap_len(const char *data)
|
||||||
/* helpers */
|
|
||||||
static inline int ieee80211_get_radiotap_len(unsigned char *data)
|
|
||||||
{
|
{
|
||||||
struct ieee80211_radiotap_header *hdr =
|
struct ieee80211_radiotap_header *hdr = (void *)data;
|
||||||
(struct ieee80211_radiotap_header *)data;
|
|
||||||
|
|
||||||
return get_unaligned_le16(&hdr->it_len);
|
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
|
* @max_amsdu_subframes: indicates the maximal number of MSDUs in a single
|
||||||
* A-MSDU. Taken from the Extended Capabilities element. 0 means
|
* A-MSDU. Taken from the Extended Capabilities element. 0 means
|
||||||
* unlimited.
|
* 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.
|
* @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.
|
* @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)
|
* @txq: per-TID data TX queues (if driver uses the TXQ abstraction)
|
||||||
|
@ -1799,6 +1790,22 @@ struct ieee80211_sta {
|
||||||
bool tdls_initiator;
|
bool tdls_initiator;
|
||||||
bool mfp;
|
bool mfp;
|
||||||
u8 max_amsdu_subframes;
|
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;
|
u16 max_amsdu_len;
|
||||||
bool support_p2p_ps;
|
bool support_p2p_ps;
|
||||||
u16 max_rc_amsdu_len;
|
u16 max_rc_amsdu_len;
|
||||||
|
@ -3203,26 +3210,6 @@ enum ieee80211_reconfig_type {
|
||||||
* Returns non-zero if this device sent the last beacon.
|
* Returns non-zero if this device sent the last beacon.
|
||||||
* The callback can sleep.
|
* 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
|
* @get_survey: Return per-channel survey information
|
||||||
*
|
*
|
||||||
* @rfkill_poll: Poll rfkill hardware state. If you need this, you also
|
* @rfkill_poll: Poll rfkill hardware state. If you need this, you also
|
||||||
|
@ -3575,6 +3562,35 @@ struct ieee80211_ops {
|
||||||
s64 offset);
|
s64 offset);
|
||||||
void (*reset_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
|
void (*reset_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
|
||||||
int (*tx_last_beacon)(struct ieee80211_hw *hw);
|
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,
|
int (*ampdu_action)(struct ieee80211_hw *hw,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
struct ieee80211_ampdu_params *params);
|
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.
|
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||||
* @rssi_event: the RSSI trigger event type
|
* @rssi_event: the RSSI trigger event type
|
||||||
|
* @rssi_level: new RSSI level value or 0 if not available
|
||||||
* @gfp: context flags
|
* @gfp: context flags
|
||||||
*
|
*
|
||||||
* When the %IEEE80211_VIF_SUPPORTS_CQM_RSSI is set, and a connection quality
|
* 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,
|
void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
|
||||||
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
||||||
|
s32 rssi_level,
|
||||||
gfp_t gfp);
|
gfp_t gfp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
* Copyright 2008, 2009 Luis R. Rodriguez <lrodriguez@atheros.com>
|
* Copyright 2008, 2009 Luis R. Rodriguez <lrodriguez@atheros.com>
|
||||||
* Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
|
* Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
|
||||||
* Copyright 2008 Colin McCabe <colin@cozybit.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
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -854,12 +854,15 @@
|
||||||
* cfg80211_scan_done().
|
* cfg80211_scan_done().
|
||||||
*
|
*
|
||||||
* @NL80211_CMD_START_NAN: Start NAN operation, identified by its
|
* @NL80211_CMD_START_NAN: Start NAN operation, identified by its
|
||||||
* %NL80211_ATTR_WDEV interface. This interface must have been previously
|
* %NL80211_ATTR_WDEV interface. This interface must have been
|
||||||
* created with %NL80211_CMD_NEW_INTERFACE. After it has been started, the
|
* previously created with %NL80211_CMD_NEW_INTERFACE. After it
|
||||||
* NAN interface will create or join a cluster. This command must have a
|
* has been started, the NAN interface will create or join a
|
||||||
* valid %NL80211_ATTR_NAN_MASTER_PREF attribute and optional
|
* cluster. This command must have a valid
|
||||||
* %NL80211_ATTR_NAN_DUAL attributes.
|
* %NL80211_ATTR_NAN_MASTER_PREF attribute and optional
|
||||||
* After this command NAN functions can be added.
|
* %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
|
* @NL80211_CMD_STOP_NAN: Stop the NAN operation, identified by
|
||||||
* its %NL80211_ATTR_WDEV interface.
|
* its %NL80211_ATTR_WDEV interface.
|
||||||
* @NL80211_CMD_ADD_NAN_FUNCTION: Add a NAN function. The function is defined
|
* @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
|
* 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
|
* terminated. This will contain a %NL80211_ATTR_NAN_FUNC_INST_ID
|
||||||
* and %NL80211_ATTR_COOKIE attributes.
|
* and %NL80211_ATTR_COOKIE attributes.
|
||||||
* @NL80211_CMD_CHANGE_NAN_CONFIG: Change current NAN configuration. NAN
|
* @NL80211_CMD_CHANGE_NAN_CONFIG: Change current NAN
|
||||||
* must be operational (%NL80211_CMD_START_NAN was executed).
|
* configuration. NAN must be operational (%NL80211_CMD_START_NAN
|
||||||
* It must contain at least one of the following attributes:
|
* was executed). It must contain at least one of the following
|
||||||
* %NL80211_ATTR_NAN_MASTER_PREF, %NL80211_ATTR_NAN_DUAL.
|
* 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.
|
* @NL80211_CMD_NAN_FUNC_MATCH: Notification sent when a match is reported.
|
||||||
* This will contain a %NL80211_ATTR_NAN_MATCH nested attribute and
|
* This will contain a %NL80211_ATTR_NAN_MATCH nested attribute and
|
||||||
* %NL80211_ATTR_COOKIE.
|
* %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.
|
* %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
|
* Also, values 1 and 255 are reserved for certification purposes and
|
||||||
* should not be used during a normal device operation.
|
* should not be used during a normal device operation.
|
||||||
* @NL80211_ATTR_NAN_DUAL: NAN dual band operation config (see
|
* @NL80211_ATTR_BANDS: operating bands configuration. This is a u32
|
||||||
* &enum nl80211_nan_dual_band_conf). This attribute is used with
|
* bitmask of BIT(NL80211_BAND_*) as described in %enum
|
||||||
* %NL80211_CMD_START_NAN and optionally with
|
* nl80211_band. For instance, for NL80211_BAND_2GHZ, bit 0
|
||||||
* %NL80211_CMD_CHANGE_NAN_CONFIG.
|
* 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
|
* @NL80211_ATTR_NAN_FUNC: a function that can be added to NAN. See
|
||||||
* &enum nl80211_nan_func_attributes for description of this nested
|
* &enum nl80211_nan_func_attributes for description of this nested
|
||||||
* attribute.
|
* attribute.
|
||||||
|
@ -2397,7 +2407,7 @@ enum nl80211_attrs {
|
||||||
NL80211_ATTR_MESH_PEER_AID,
|
NL80211_ATTR_MESH_PEER_AID,
|
||||||
|
|
||||||
NL80211_ATTR_NAN_MASTER_PREF,
|
NL80211_ATTR_NAN_MASTER_PREF,
|
||||||
NL80211_ATTR_NAN_DUAL,
|
NL80211_ATTR_BANDS,
|
||||||
NL80211_ATTR_NAN_FUNC,
|
NL80211_ATTR_NAN_FUNC,
|
||||||
NL80211_ATTR_NAN_MATCH,
|
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_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
|
* @NL80211_ATTR_CQM_BEACON_LOSS_EVENT: flag attribute that's set in a beacon
|
||||||
* loss event
|
* 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_AFTER_LAST: internal
|
||||||
* @NL80211_ATTR_CQM_MAX: highest key attribute
|
* @NL80211_ATTR_CQM_MAX: highest key attribute
|
||||||
*/
|
*/
|
||||||
|
@ -3965,6 +3977,7 @@ enum nl80211_attr_cqm {
|
||||||
NL80211_ATTR_CQM_TXE_PKTS,
|
NL80211_ATTR_CQM_TXE_PKTS,
|
||||||
NL80211_ATTR_CQM_TXE_INTVL,
|
NL80211_ATTR_CQM_TXE_INTVL,
|
||||||
NL80211_ATTR_CQM_BEACON_LOSS_EVENT,
|
NL80211_ATTR_CQM_BEACON_LOSS_EVENT,
|
||||||
|
NL80211_ATTR_CQM_RSSI_LEVEL,
|
||||||
|
|
||||||
/* keep last */
|
/* keep last */
|
||||||
__NL80211_ATTR_CQM_AFTER_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
|
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
|
* enum nl80211_nan_function_type - NAN function type
|
||||||
*
|
*
|
||||||
|
|
|
@ -6,6 +6,7 @@ config MAC80211
|
||||||
select CRYPTO_AES
|
select CRYPTO_AES
|
||||||
select CRYPTO_CCM
|
select CRYPTO_CCM
|
||||||
select CRYPTO_GCM
|
select CRYPTO_GCM
|
||||||
|
select CRYPTO_CMAC
|
||||||
select CRC32
|
select CRC32
|
||||||
---help---
|
---help---
|
||||||
This option enables the hardware independent IEEE 802.11
|
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 CMAC_TLEN_256 16 /* CMAC TLen = 128 bits (16 octets) */
|
||||||
#define AAD_LEN 20
|
#define AAD_LEN 20
|
||||||
|
|
||||||
|
static const u8 zero[CMAC_TLEN_256];
|
||||||
|
|
||||||
void gf_mulx(u8 *pad)
|
void ieee80211_aes_cmac(struct crypto_shash *tfm, const u8 *aad,
|
||||||
{
|
|
||||||
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,
|
|
||||||
const u8 *data, size_t data_len, u8 *mic)
|
const u8 *data, size_t data_len, u8 *mic)
|
||||||
{
|
{
|
||||||
const u8 *addr[3];
|
SHASH_DESC_ON_STACK(desc, tfm);
|
||||||
size_t len[3];
|
u8 out[AES_BLOCK_SIZE];
|
||||||
u8 zero[CMAC_TLEN];
|
|
||||||
|
|
||||||
memset(zero, 0, CMAC_TLEN);
|
desc->tfm = tfm;
|
||||||
addr[0] = aad;
|
|
||||||
len[0] = AAD_LEN;
|
|
||||||
addr[1] = data;
|
|
||||||
len[1] = data_len - CMAC_TLEN;
|
|
||||||
addr[2] = zero;
|
|
||||||
len[2] = CMAC_TLEN;
|
|
||||||
|
|
||||||
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 *data, size_t data_len, u8 *mic)
|
||||||
{
|
{
|
||||||
const u8 *addr[3];
|
SHASH_DESC_ON_STACK(desc, tfm);
|
||||||
size_t len[3];
|
|
||||||
u8 zero[CMAC_TLEN_256];
|
|
||||||
|
|
||||||
memset(zero, 0, CMAC_TLEN_256);
|
desc->tfm = tfm;
|
||||||
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;
|
|
||||||
|
|
||||||
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[],
|
struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[],
|
||||||
size_t key_len)
|
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))
|
if (!IS_ERR(tfm))
|
||||||
crypto_cipher_setkey(tfm, key, key_len);
|
crypto_shash_setkey(tfm, key, key_len);
|
||||||
|
|
||||||
return tfm;
|
return tfm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ieee80211_aes_cmac_key_free(struct crypto_shash *tfm)
|
||||||
void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm)
|
|
||||||
{
|
{
|
||||||
crypto_free_cipher(tfm);
|
crypto_free_shash(tfm);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,17 +10,14 @@
|
||||||
#define AES_CMAC_H
|
#define AES_CMAC_H
|
||||||
|
|
||||||
#include <linux/crypto.h>
|
#include <linux/crypto.h>
|
||||||
|
#include <crypto/hash.h>
|
||||||
|
|
||||||
void gf_mulx(u8 *pad);
|
struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[],
|
||||||
void aes_cmac_vector(struct crypto_cipher *tfm, size_t num_elem,
|
size_t key_len);
|
||||||
const u8 *addr[], const size_t *len, u8 *mac,
|
void ieee80211_aes_cmac(struct crypto_shash *tfm, const u8 *aad,
|
||||||
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,
|
|
||||||
const u8 *data, size_t data_len, u8 *mic);
|
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);
|
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 */
|
#endif /* AES_CMAC_H */
|
||||||
|
|
|
@ -208,8 +208,8 @@ static int ieee80211_nan_change_conf(struct wiphy *wiphy,
|
||||||
if (changes & CFG80211_NAN_CONF_CHANGED_PREF)
|
if (changes & CFG80211_NAN_CONF_CHANGED_PREF)
|
||||||
new_conf.master_pref = conf->master_pref;
|
new_conf.master_pref = conf->master_pref;
|
||||||
|
|
||||||
if (changes & CFG80211_NAN_CONF_CHANGED_DUAL)
|
if (changes & CFG80211_NAN_CONF_CHANGED_BANDS)
|
||||||
new_conf.dual = conf->dual;
|
new_conf.bands = conf->bands;
|
||||||
|
|
||||||
ret = drv_nan_change_conf(sdata->local, sdata, &new_conf, changes);
|
ret = drv_nan_change_conf(sdata->local, sdata, &new_conf, changes);
|
||||||
if (!ret)
|
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;
|
struct ieee80211_local *local = file->private_data;
|
||||||
/* Max len of each line is 16 characters, plus 9 for 'pending:\n' */
|
/* Max len of each line is 16 characters, plus 9 for 'pending:\n' */
|
||||||
size_t bufsz = IEEE80211_MAX_QUEUES * 16 + 9;
|
size_t bufsz = IEEE80211_MAX_QUEUES * 16 + 9;
|
||||||
char *buf = kzalloc(bufsz, GFP_KERNEL);
|
char *buf;
|
||||||
char *pos = buf, *end = buf + bufsz - 1;
|
char *pos, *end;
|
||||||
ssize_t rv;
|
ssize_t rv;
|
||||||
int i;
|
int i;
|
||||||
int ln;
|
int ln;
|
||||||
|
|
||||||
|
buf = kzalloc(bufsz, GFP_KERNEL);
|
||||||
|
if (!buf)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
pos = buf;
|
||||||
|
end = buf + bufsz - 1;
|
||||||
|
|
||||||
pos += scnprintf(pos, end - pos, "pending:\n");
|
pos += scnprintf(pos, end - pos, "pending:\n");
|
||||||
|
|
||||||
for (i = 0; i < IEEE80211_MAX_QUEUES; i++) {
|
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(total_ps_buffered);
|
||||||
DEBUGFS_ADD(wep_iv);
|
DEBUGFS_ADD(wep_iv);
|
||||||
|
DEBUGFS_ADD(rate_ctrl_alg);
|
||||||
DEBUGFS_ADD(queues);
|
DEBUGFS_ADD(queues);
|
||||||
DEBUGFS_ADD(misc);
|
DEBUGFS_ADD(misc);
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
|
|
|
@ -522,6 +522,7 @@ void ieee80211_sta_debugfs_add(struct sta_info *sta)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DEBUGFS_ADD(flags);
|
DEBUGFS_ADD(flags);
|
||||||
|
DEBUGFS_ADD(aid);
|
||||||
DEBUGFS_ADD(num_ps_buf_frames);
|
DEBUGFS_ADD(num_ps_buf_frames);
|
||||||
DEBUGFS_ADD(last_seq_ctrl);
|
DEBUGFS_ADD(last_seq_ctrl);
|
||||||
DEBUGFS_ADD(agg_status);
|
DEBUGFS_ADD(agg_status);
|
||||||
|
|
|
@ -9,66 +9,58 @@
|
||||||
|
|
||||||
#include <crypto/aes.h>
|
#include <crypto/aes.h>
|
||||||
#include <crypto/algapi.h>
|
#include <crypto/algapi.h>
|
||||||
|
#include <crypto/hash.h>
|
||||||
#include <crypto/skcipher.h>
|
#include <crypto/skcipher.h>
|
||||||
|
|
||||||
#include "ieee80211_i.h"
|
#include "ieee80211_i.h"
|
||||||
#include "aes_cmac.h"
|
#include "aes_cmac.h"
|
||||||
#include "fils_aead.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)
|
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;
|
size_t i;
|
||||||
const u8 *data[2];
|
|
||||||
size_t data_len[2], data_elems;
|
desc->tfm = tfm;
|
||||||
|
|
||||||
/* D = AES-CMAC(K, <zero>) */
|
/* D = AES-CMAC(K, <zero>) */
|
||||||
memset(tmp, 0, AES_BLOCK_SIZE);
|
crypto_shash_digest(desc, tmp, AES_BLOCK_SIZE, d);
|
||||||
data[0] = tmp;
|
|
||||||
data_len[0] = AES_BLOCK_SIZE;
|
|
||||||
aes_cmac_vector(tfm, 1, data, data_len, d, AES_BLOCK_SIZE);
|
|
||||||
|
|
||||||
for (i = 0; i < num_elem - 1; i++) {
|
for (i = 0; i < num_elem - 1; i++) {
|
||||||
/* D = dbl(D) xor AES_CMAC(K, Si) */
|
/* D = dbl(D) xor AES_CMAC(K, Si) */
|
||||||
gf_mulx(d); /* dbl */
|
gf_mulx(d); /* dbl */
|
||||||
aes_cmac_vector(tfm, 1, &addr[i], &len[i], tmp,
|
crypto_shash_digest(desc, addr[i], len[i], tmp);
|
||||||
AES_BLOCK_SIZE);
|
|
||||||
crypto_xor(d, tmp, AES_BLOCK_SIZE);
|
crypto_xor(d, tmp, AES_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
crypto_shash_init(desc);
|
||||||
|
|
||||||
if (len[i] >= AES_BLOCK_SIZE) {
|
if (len[i] >= AES_BLOCK_SIZE) {
|
||||||
/* len(Sn) >= 128 */
|
/* len(Sn) >= 128 */
|
||||||
size_t j;
|
|
||||||
const u8 *pos;
|
|
||||||
|
|
||||||
/* T = Sn xorend D */
|
/* T = Sn xorend D */
|
||||||
|
crypto_shash_update(desc, addr[i], len[i] - AES_BLOCK_SIZE);
|
||||||
/* Use a temporary buffer to perform xorend on Sn (addr[i]) to
|
crypto_xor(d, addr[i] + len[i] - AES_BLOCK_SIZE,
|
||||||
* avoid modifying the const input argument.
|
AES_BLOCK_SIZE);
|
||||||
*/
|
|
||||||
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;
|
|
||||||
} else {
|
} else {
|
||||||
/* len(Sn) < 128 */
|
/* len(Sn) < 128 */
|
||||||
/* T = dbl(D) xor pad(Sn) */
|
/* T = dbl(D) xor pad(Sn) */
|
||||||
gf_mulx(d); /* dbl */
|
gf_mulx(d); /* dbl */
|
||||||
memset(tmp, 0, AES_BLOCK_SIZE);
|
crypto_xor(d, addr[i], len[i]);
|
||||||
memcpy(tmp, addr[i], len[i]);
|
d[len[i]] ^= 0x80;
|
||||||
tmp[len[i]] = 0x80;
|
|
||||||
crypto_xor(d, tmp, AES_BLOCK_SIZE);
|
|
||||||
data[0] = d;
|
|
||||||
data_len[0] = sizeof(d);
|
|
||||||
data_elems = 1;
|
|
||||||
}
|
}
|
||||||
/* V = AES-CMAC(K, T) */
|
/* 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -80,7 +72,7 @@ static int aes_siv_encrypt(const u8 *key, size_t key_len,
|
||||||
size_t len[], u8 *out)
|
size_t len[], u8 *out)
|
||||||
{
|
{
|
||||||
u8 v[AES_BLOCK_SIZE];
|
u8 v[AES_BLOCK_SIZE];
|
||||||
struct crypto_cipher *tfm;
|
struct crypto_shash *tfm;
|
||||||
struct crypto_skcipher *tfm2;
|
struct crypto_skcipher *tfm2;
|
||||||
struct skcipher_request *req;
|
struct skcipher_request *req;
|
||||||
int res;
|
int res;
|
||||||
|
@ -95,14 +87,14 @@ static int aes_siv_encrypt(const u8 *key, size_t key_len,
|
||||||
|
|
||||||
/* S2V */
|
/* S2V */
|
||||||
|
|
||||||
tfm = crypto_alloc_cipher("aes", 0, 0);
|
tfm = crypto_alloc_shash("cmac(aes)", 0, 0);
|
||||||
if (IS_ERR(tfm))
|
if (IS_ERR(tfm))
|
||||||
return PTR_ERR(tfm);
|
return PTR_ERR(tfm);
|
||||||
/* K1 for S2V */
|
/* K1 for S2V */
|
||||||
res = crypto_cipher_setkey(tfm, key, key_len);
|
res = crypto_shash_setkey(tfm, key, key_len);
|
||||||
if (!res)
|
if (!res)
|
||||||
res = aes_s2v(tfm, num_elem, addr, len, v);
|
res = aes_s2v(tfm, num_elem, addr, len, v);
|
||||||
crypto_free_cipher(tfm);
|
crypto_free_shash(tfm);
|
||||||
if (res)
|
if (res)
|
||||||
return 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[],
|
size_t num_elem, const u8 *addr[], size_t len[],
|
||||||
u8 *out)
|
u8 *out)
|
||||||
{
|
{
|
||||||
struct crypto_cipher *tfm;
|
struct crypto_shash *tfm;
|
||||||
struct crypto_skcipher *tfm2;
|
struct crypto_skcipher *tfm2;
|
||||||
struct skcipher_request *req;
|
struct skcipher_request *req;
|
||||||
struct scatterlist src[1], dst[1];
|
struct scatterlist src[1], dst[1];
|
||||||
|
@ -210,14 +202,14 @@ static int aes_siv_decrypt(const u8 *key, size_t key_len,
|
||||||
|
|
||||||
/* S2V */
|
/* S2V */
|
||||||
|
|
||||||
tfm = crypto_alloc_cipher("aes", 0, 0);
|
tfm = crypto_alloc_shash("cmac(aes)", 0, 0);
|
||||||
if (IS_ERR(tfm))
|
if (IS_ERR(tfm))
|
||||||
return PTR_ERR(tfm);
|
return PTR_ERR(tfm);
|
||||||
/* K1 for S2V */
|
/* K1 for S2V */
|
||||||
res = crypto_cipher_setkey(tfm, key, key_len);
|
res = crypto_shash_setkey(tfm, key, key_len);
|
||||||
if (!res)
|
if (!res)
|
||||||
res = aes_s2v(tfm, num_elem, addr, len, check);
|
res = aes_s2v(tfm, num_elem, addr, len, check);
|
||||||
crypto_free_cipher(tfm);
|
crypto_free_shash(tfm);
|
||||||
if (res)
|
if (res)
|
||||||
return res;
|
return res;
|
||||||
if (memcmp(check, frame_iv, AES_BLOCK_SIZE) != 0)
|
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 beacon_data *presp, *old_presp;
|
||||||
struct cfg80211_bss *cbss;
|
struct cfg80211_bss *cbss;
|
||||||
const struct cfg80211_bss_ies *ies;
|
const struct cfg80211_bss_ies *ies;
|
||||||
u16 capability = 0;
|
u16 capability = WLAN_CAPABILITY_IBSS;
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
sdata_assert_lock(sdata);
|
sdata_assert_lock(sdata);
|
||||||
|
|
||||||
if (ifibss->privacy)
|
if (ifibss->privacy)
|
||||||
capability = WLAN_CAPABILITY_PRIVACY;
|
capability |= WLAN_CAPABILITY_PRIVACY;
|
||||||
|
|
||||||
cbss = cfg80211_get_bss(sdata->local->hw.wiphy, ifibss->chandef.chan,
|
cbss = cfg80211_get_bss(sdata->local->hw.wiphy, ifibss->chandef.chan,
|
||||||
ifibss->bssid, ifibss->ssid,
|
ifibss->bssid, ifibss->ssid,
|
||||||
|
|
|
@ -93,7 +93,7 @@ struct ieee80211_key {
|
||||||
} ccmp;
|
} ccmp;
|
||||||
struct {
|
struct {
|
||||||
u8 rx_pn[IEEE80211_CMAC_PN_LEN];
|
u8 rx_pn[IEEE80211_CMAC_PN_LEN];
|
||||||
struct crypto_cipher *tfm;
|
struct crypto_shash *tfm;
|
||||||
u32 replays; /* dot11RSNAStatsCMACReplays */
|
u32 replays; /* dot11RSNAStatsCMACReplays */
|
||||||
u32 icverrors; /* dot11RSNAStatsCMACICVErrors */
|
u32 icverrors; /* dot11RSNAStatsCMACICVErrors */
|
||||||
} aes_cmac;
|
} aes_cmac;
|
||||||
|
|
|
@ -3419,14 +3419,14 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||||
ieee80211_cqm_rssi_notify(
|
ieee80211_cqm_rssi_notify(
|
||||||
&sdata->vif,
|
&sdata->vif,
|
||||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
|
||||||
GFP_KERNEL);
|
sig, GFP_KERNEL);
|
||||||
} else if (sig > thold &&
|
} else if (sig > thold &&
|
||||||
(last_event == 0 || sig > last_event + hyst)) {
|
(last_event == 0 || sig > last_event + hyst)) {
|
||||||
ifmgd->last_cqm_event_signal = sig;
|
ifmgd->last_cqm_event_signal = sig;
|
||||||
ieee80211_cqm_rssi_notify(
|
ieee80211_cqm_rssi_notify(
|
||||||
&sdata->vif,
|
&sdata->vif,
|
||||||
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
|
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,
|
void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
|
||||||
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
||||||
|
s32 rssi_level,
|
||||||
gfp_t gfp)
|
gfp_t gfp)
|
||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
|
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);
|
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)
|
void ieee80211_sta_uapsd_trigger(struct ieee80211_sta *pubsta, u8 tid)
|
||||||
{
|
{
|
||||||
struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
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
|
* 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)
|
if (*p & IEEE80211_QOS_CTL_EOSP)
|
||||||
*p &= ~IEEE80211_QOS_CTL_EOSP;
|
*p &= ~IEEE80211_QOS_CTL_EOSP;
|
||||||
ac = ieee802_1d_to_ac[tid & 7];
|
ac = ieee80211_ac_from_tid(tid);
|
||||||
} else {
|
} else {
|
||||||
ac = IEEE80211_AC_BE;
|
ac = IEEE80211_AC_BE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1736,21 +1736,21 @@ TRACE_EVENT(drv_start_nan,
|
||||||
LOCAL_ENTRY
|
LOCAL_ENTRY
|
||||||
VIF_ENTRY
|
VIF_ENTRY
|
||||||
__field(u8, master_pref)
|
__field(u8, master_pref)
|
||||||
__field(u8, dual)
|
__field(u8, bands)
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
LOCAL_ASSIGN;
|
LOCAL_ASSIGN;
|
||||||
VIF_ASSIGN;
|
VIF_ASSIGN;
|
||||||
__entry->master_pref = conf->master_pref;
|
__entry->master_pref = conf->master_pref;
|
||||||
__entry->dual = conf->dual;
|
__entry->bands = conf->bands;
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk(
|
TP_printk(
|
||||||
LOCAL_PR_FMT VIF_PR_FMT
|
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,
|
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
|
LOCAL_ENTRY
|
||||||
VIF_ENTRY
|
VIF_ENTRY
|
||||||
__field(u8, master_pref)
|
__field(u8, master_pref)
|
||||||
__field(u8, dual)
|
__field(u8, bands)
|
||||||
__field(u32, changes)
|
__field(u32, changes)
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -1795,15 +1795,15 @@ TRACE_EVENT(drv_nan_change_conf,
|
||||||
LOCAL_ASSIGN;
|
LOCAL_ASSIGN;
|
||||||
VIF_ASSIGN;
|
VIF_ASSIGN;
|
||||||
__entry->master_pref = conf->master_pref;
|
__entry->master_pref = conf->master_pref;
|
||||||
__entry->dual = conf->dual;
|
__entry->bands = conf->bands;
|
||||||
__entry->changes = changes;
|
__entry->changes = changes;
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk(
|
TP_printk(
|
||||||
LOCAL_PR_FMT VIF_PR_FMT
|
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,
|
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,
|
TRACE_EVENT(api_cqm_rssi_notify,
|
||||||
TP_PROTO(struct ieee80211_sub_if_data *sdata,
|
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(
|
TP_STRUCT__entry(
|
||||||
VIF_ENTRY
|
VIF_ENTRY
|
||||||
__field(u32, rssi_event)
|
__field(u32, rssi_event)
|
||||||
|
__field(s32, rssi_level)
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
VIF_ASSIGN;
|
VIF_ASSIGN;
|
||||||
__entry->rssi_event = rssi_event;
|
__entry->rssi_event = rssi_event;
|
||||||
|
__entry->rssi_level = rssi_level;
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk(
|
TP_printk(
|
||||||
VIF_PR_FMT " event:%d",
|
VIF_PR_FMT " event:%d rssi:%d",
|
||||||
VIF_PR_ARG, __entry->rssi_event
|
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;
|
txqi->txq.sta = &sta->sta;
|
||||||
sta->sta.txq[tid] = &txqi->txq;
|
sta->sta.txq[tid] = &txqi->txq;
|
||||||
txqi->txq.tid = tid;
|
txqi->txq.tid = tid;
|
||||||
txqi->txq.ac = ieee802_1d_to_ac[tid & 7];
|
txqi->txq.ac = ieee80211_ac_from_tid(tid);
|
||||||
} else {
|
} else {
|
||||||
sdata->vif.txq = &txqi->txq;
|
sdata->vif.txq = &txqi->txq;
|
||||||
txqi->txq.tid = 0;
|
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,
|
struct sk_buff *skb, int tid,
|
||||||
enum nl80211_band band)
|
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_reset_mac_header(skb);
|
||||||
skb_set_queue_mapping(skb, ac);
|
skb_set_queue_mapping(skb, ac);
|
||||||
|
|
|
@ -23,17 +23,6 @@ config RFKILL_INPUT
|
||||||
depends on INPUT = y || RFKILL = INPUT
|
depends on INPUT = y || RFKILL = INPUT
|
||||||
default y if !EXPERT
|
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
|
config RFKILL_GPIO
|
||||||
tristate "GPIO RFKILL driver"
|
tristate "GPIO RFKILL driver"
|
||||||
depends on RFKILL
|
depends on RFKILL
|
||||||
|
|
|
@ -5,5 +5,4 @@
|
||||||
rfkill-y += core.o
|
rfkill-y += core.o
|
||||||
rfkill-$(CONFIG_RFKILL_INPUT) += input.o
|
rfkill-$(CONFIG_RFKILL_INPUT) += input.o
|
||||||
obj-$(CONFIG_RFKILL) += rfkill.o
|
obj-$(CONFIG_RFKILL) += rfkill.o
|
||||||
obj-$(CONFIG_RFKILL_REGULATOR) += rfkill-regulator.o
|
|
||||||
obj-$(CONFIG_RFKILL_GPIO) += rfkill-gpio.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)) &&
|
if (WARN_ON((wiphy->interface_modes & BIT(NL80211_IFTYPE_NAN)) &&
|
||||||
(!rdev->ops->start_nan || !rdev->ops->stop_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;
|
return -EINVAL;
|
||||||
|
|
||||||
#ifndef CONFIG_WIRELESS_WDS
|
#ifndef CONFIG_WIRELESS_WDS
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
static ssize_t name## _read(struct file *file, char __user *userbuf, \
|
static ssize_t name## _read(struct file *file, char __user *userbuf, \
|
||||||
size_t count, loff_t *ppos) \
|
size_t count, loff_t *ppos) \
|
||||||
{ \
|
{ \
|
||||||
struct wiphy *wiphy= file->private_data; \
|
struct wiphy *wiphy = file->private_data; \
|
||||||
char buf[buflen]; \
|
char buf[buflen]; \
|
||||||
int res; \
|
int res; \
|
||||||
\
|
\
|
||||||
|
@ -29,14 +29,14 @@ static const struct file_operations name## _ops = { \
|
||||||
.read = name## _read, \
|
.read = name## _read, \
|
||||||
.open = simple_open, \
|
.open = simple_open, \
|
||||||
.llseek = generic_file_llseek, \
|
.llseek = generic_file_llseek, \
|
||||||
};
|
}
|
||||||
|
|
||||||
DEBUGFS_READONLY_FILE(rts_threshold, 20, "%d",
|
DEBUGFS_READONLY_FILE(rts_threshold, 20, "%d",
|
||||||
wiphy->rts_threshold)
|
wiphy->rts_threshold);
|
||||||
DEBUGFS_READONLY_FILE(fragmentation_threshold, 20, "%d",
|
DEBUGFS_READONLY_FILE(fragmentation_threshold, 20, "%d",
|
||||||
wiphy->frag_threshold);
|
wiphy->frag_threshold);
|
||||||
DEBUGFS_READONLY_FILE(short_retry_limit, 20, "%d",
|
DEBUGFS_READONLY_FILE(short_retry_limit, 20, "%d",
|
||||||
wiphy->retry_short)
|
wiphy->retry_short);
|
||||||
DEBUGFS_READONLY_FILE(long_retry_limit, 20, "%d",
|
DEBUGFS_READONLY_FILE(long_retry_limit, 20, "%d",
|
||||||
wiphy->retry_long);
|
wiphy->retry_long);
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ static const struct file_operations ht40allow_map_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEBUGFS_ADD(name) \
|
#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)
|
void cfg80211_debugfs_rdev_add(struct cfg80211_registered_device *rdev)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
|
* Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
|
||||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||||
* Copyright 2015-2016 Intel Deutschland GmbH
|
* Copyright 2015-2017 Intel Deutschland GmbH
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/if.h>
|
#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_MU_MIMO_FOLLOW_MAC_ADDR] = { .len = ETH_ALEN },
|
||||||
[NL80211_ATTR_NAN_MASTER_PREF] = { .type = NLA_U8 },
|
[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_NAN_FUNC] = { .type = NLA_NESTED },
|
||||||
[NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY,
|
[NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY,
|
||||||
.len = FILS_MAX_KEK_LEN },
|
.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 */
|
/* done */
|
||||||
state->split_start = 0;
|
state->split_start = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -3743,6 +3747,49 @@ static int nl80211_parse_beacon(struct nlattr *attrs[],
|
||||||
return 0;
|
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,
|
static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
|
||||||
struct cfg80211_ap_settings *params)
|
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);
|
return PTR_ERR(params.acl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nl80211_calculate_ap_params(¶ms);
|
||||||
|
|
||||||
wdev_lock(wdev);
|
wdev_lock(wdev);
|
||||||
err = rdev_start_ap(rdev, dev, ¶ms);
|
err = rdev_start_ap(rdev, dev, ¶ms);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
|
@ -6868,7 +6917,7 @@ nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans,
|
||||||
|
|
||||||
static struct cfg80211_sched_scan_request *
|
static struct cfg80211_sched_scan_request *
|
||||||
nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
|
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 cfg80211_sched_scan_request *request;
|
||||||
struct nlattr *attr;
|
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)
|
if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
|
||||||
n_match_sets = 1;
|
n_match_sets = 1;
|
||||||
|
|
||||||
if (n_match_sets > wiphy->max_match_sets)
|
if (n_match_sets > max_match_sets)
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
if (attrs[NL80211_ATTR_IE])
|
if (attrs[NL80211_ATTR_IE])
|
||||||
|
@ -7233,7 +7282,8 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
|
||||||
return -EINPROGRESS;
|
return -EINPROGRESS;
|
||||||
|
|
||||||
sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev,
|
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);
|
err = PTR_ERR_OR_ZERO(sched_scan_req);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -8586,6 +8636,12 @@ static int nl80211_testmode_dump(struct sk_buff *skb,
|
||||||
* so we need to offset by 1.
|
* so we need to offset by 1.
|
||||||
*/
|
*/
|
||||||
phy_idx = cb->args[0] - 1;
|
phy_idx = cb->args[0] - 1;
|
||||||
|
|
||||||
|
rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
|
||||||
|
if (!rdev) {
|
||||||
|
err = -ENOENT;
|
||||||
|
goto out_err;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
|
struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
|
||||||
|
|
||||||
|
@ -8600,7 +8656,6 @@ static int nl80211_testmode_dump(struct sk_buff *skb,
|
||||||
goto out_err;
|
goto out_err;
|
||||||
}
|
}
|
||||||
phy_idx = rdev->wiphy_idx;
|
phy_idx = rdev->wiphy_idx;
|
||||||
rdev = NULL;
|
|
||||||
|
|
||||||
if (attrbuf[NL80211_ATTR_TESTDATA])
|
if (attrbuf[NL80211_ATTR_TESTDATA])
|
||||||
cb->args[1] = (long)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]);
|
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) {
|
if (!rdev->ops->testmode_dump) {
|
||||||
err = -EOPNOTSUPP;
|
err = -EOPNOTSUPP;
|
||||||
goto out_err;
|
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_RATE] = { .type = NLA_U32 },
|
||||||
[NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
|
[NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
|
||||||
[NL80211_ATTR_CQM_TXE_INTVL] = { .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,
|
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)
|
if (err)
|
||||||
goto out;
|
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);
|
err = PTR_ERR_OR_ZERO(trig->nd_config);
|
||||||
if (err)
|
if (err)
|
||||||
trig->nd_config = NULL;
|
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])
|
if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!info->attrs[NL80211_ATTR_NAN_DUAL])
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
conf.master_pref =
|
conf.master_pref =
|
||||||
nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
|
nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
|
||||||
if (!conf.master_pref)
|
if (!conf.master_pref)
|
||||||
return -EINVAL;
|
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);
|
err = rdev_start_nan(rdev, wdev, &conf);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -11104,9 +11162,17 @@ static int nl80211_nan_change_config(struct sk_buff *skb,
|
||||||
changed |= CFG80211_NAN_CONF_CHANGED_PREF;
|
changed |= CFG80211_NAN_CONF_CHANGED_PREF;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info->attrs[NL80211_ATTR_NAN_DUAL]) {
|
if (info->attrs[NL80211_ATTR_BANDS]) {
|
||||||
conf.dual = nla_get_u8(info->attrs[NL80211_ATTR_NAN_DUAL]);
|
u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
|
||||||
changed |= CFG80211_NAN_CONF_CHANGED_DUAL;
|
|
||||||
|
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)
|
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,
|
void cfg80211_cqm_rssi_notify(struct net_device *dev,
|
||||||
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
||||||
gfp_t gfp)
|
s32 rssi_level, gfp_t gfp)
|
||||||
{
|
{
|
||||||
struct sk_buff *msg;
|
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 &&
|
if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
|
||||||
rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
|
rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
|
||||||
|
@ -13932,6 +13998,10 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev,
|
||||||
rssi_event))
|
rssi_event))
|
||||||
goto nla_put_failure;
|
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);
|
cfg80211_send_cqm(msg, gfp);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1915,18 +1915,18 @@ TRACE_EVENT(rdev_start_nan,
|
||||||
WIPHY_ENTRY
|
WIPHY_ENTRY
|
||||||
WDEV_ENTRY
|
WDEV_ENTRY
|
||||||
__field(u8, master_pref)
|
__field(u8, master_pref)
|
||||||
__field(u8, dual);
|
__field(u8, bands);
|
||||||
),
|
),
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
WIPHY_ASSIGN;
|
WIPHY_ASSIGN;
|
||||||
WDEV_ASSIGN;
|
WDEV_ASSIGN;
|
||||||
__entry->master_pref = conf->master_pref;
|
__entry->master_pref = conf->master_pref;
|
||||||
__entry->dual = conf->dual;
|
__entry->bands = conf->bands;
|
||||||
),
|
),
|
||||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT
|
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,
|
WIPHY_PR_ARG, WDEV_PR_ARG, __entry->master_pref,
|
||||||
__entry->dual)
|
__entry->bands)
|
||||||
);
|
);
|
||||||
|
|
||||||
TRACE_EVENT(rdev_nan_change_conf,
|
TRACE_EVENT(rdev_nan_change_conf,
|
||||||
|
@ -1937,20 +1937,20 @@ TRACE_EVENT(rdev_nan_change_conf,
|
||||||
WIPHY_ENTRY
|
WIPHY_ENTRY
|
||||||
WDEV_ENTRY
|
WDEV_ENTRY
|
||||||
__field(u8, master_pref)
|
__field(u8, master_pref)
|
||||||
__field(u8, dual);
|
__field(u8, bands);
|
||||||
__field(u32, changes);
|
__field(u32, changes);
|
||||||
),
|
),
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
WIPHY_ASSIGN;
|
WIPHY_ASSIGN;
|
||||||
WDEV_ASSIGN;
|
WDEV_ASSIGN;
|
||||||
__entry->master_pref = conf->master_pref;
|
__entry->master_pref = conf->master_pref;
|
||||||
__entry->dual = conf->dual;
|
__entry->bands = conf->bands;
|
||||||
__entry->changes = changes;
|
__entry->changes = changes;
|
||||||
),
|
),
|
||||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT
|
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,
|
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,
|
DEFINE_EVENT(wiphy_wdev_evt, rdev_stop_nan,
|
||||||
|
@ -2490,18 +2490,21 @@ TRACE_EVENT(cfg80211_mgmt_tx_status,
|
||||||
|
|
||||||
TRACE_EVENT(cfg80211_cqm_rssi_notify,
|
TRACE_EVENT(cfg80211_cqm_rssi_notify,
|
||||||
TP_PROTO(struct net_device *netdev,
|
TP_PROTO(struct net_device *netdev,
|
||||||
enum nl80211_cqm_rssi_threshold_event rssi_event),
|
enum nl80211_cqm_rssi_threshold_event rssi_event,
|
||||||
TP_ARGS(netdev, rssi_event),
|
s32 rssi_level),
|
||||||
|
TP_ARGS(netdev, rssi_event, rssi_level),
|
||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
NETDEV_ENTRY
|
NETDEV_ENTRY
|
||||||
__field(enum nl80211_cqm_rssi_threshold_event, rssi_event)
|
__field(enum nl80211_cqm_rssi_threshold_event, rssi_event)
|
||||||
|
__field(s32, rssi_level)
|
||||||
),
|
),
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
NETDEV_ASSIGN;
|
NETDEV_ASSIGN;
|
||||||
__entry->rssi_event = rssi_event;
|
__entry->rssi_event = rssi_event;
|
||||||
|
__entry->rssi_level = rssi_level;
|
||||||
),
|
),
|
||||||
TP_printk(NETDEV_PR_FMT ", rssi event: %d",
|
TP_printk(NETDEV_PR_FMT ", rssi event: %d, level: %d",
|
||||||
NETDEV_PR_ARG, __entry->rssi_event)
|
NETDEV_PR_ARG, __entry->rssi_event, __entry->rssi_level)
|
||||||
);
|
);
|
||||||
|
|
||||||
TRACE_EVENT(cfg80211_reg_can_beacon,
|
TRACE_EVENT(cfg80211_reg_can_beacon,
|
||||||
|
|
Loading…
Add table
Reference in a new issue