|
@@ -1575,6 +1575,26 @@ enum cfg80211_signal_type {
|
|
|
CFG80211_SIGNAL_TYPE_UNSPEC,
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * struct cfg80211_inform_bss - BSS inform data
|
|
|
+ * @chan: channel the frame was received on
|
|
|
+ * @scan_width: scan width that was used
|
|
|
+ * @signal: signal strength value, according to the wiphy's
|
|
|
+ * signal type
|
|
|
+ * @boottime_ns: timestamp (CLOCK_BOOTTIME) when the information was
|
|
|
+ * received; should match the time when the frame was actually
|
|
|
+ * received by the device (not just by the host, in case it was
|
|
|
+ * buffered on the device) and be accurate to about 10ms.
|
|
|
+ * If the frame isn't buffered, just passing the return value of
|
|
|
+ * ktime_get_boot_ns() is likely appropriate.
|
|
|
+ */
|
|
|
+struct cfg80211_inform_bss {
|
|
|
+ struct ieee80211_channel *chan;
|
|
|
+ enum nl80211_bss_scan_width scan_width;
|
|
|
+ s32 signal;
|
|
|
+ u64 boottime_ns;
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* struct cfg80211_bss_ie_data - BSS entry IE data
|
|
|
* @tsf: TSF contained in the frame that carried these IEs
|
|
@@ -3958,14 +3978,11 @@ void cfg80211_sched_scan_stopped(struct wiphy *wiphy);
|
|
|
void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy);
|
|
|
|
|
|
/**
|
|
|
- * cfg80211_inform_bss_width_frame - inform cfg80211 of a received BSS frame
|
|
|
- *
|
|
|
+ * cfg80211_inform_bss_frame_data - inform cfg80211 of a received BSS frame
|
|
|
* @wiphy: the wiphy reporting the BSS
|
|
|
- * @rx_channel: The channel the frame was received on
|
|
|
- * @scan_width: width of the control channel
|
|
|
+ * @data: the BSS metadata
|
|
|
* @mgmt: the management frame (probe response or beacon)
|
|
|
* @len: length of the management frame
|
|
|
- * @signal: the signal strength, type depends on the wiphy's signal_type
|
|
|
* @gfp: context flags
|
|
|
*
|
|
|
* This informs cfg80211 that BSS information was found and
|
|
@@ -3975,11 +3992,26 @@ void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy);
|
|
|
* Or %NULL on error.
|
|
|
*/
|
|
|
struct cfg80211_bss * __must_check
|
|
|
+cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
|
|
|
+ struct cfg80211_inform_bss *data,
|
|
|
+ struct ieee80211_mgmt *mgmt, size_t len,
|
|
|
+ gfp_t gfp);
|
|
|
+
|
|
|
+static inline struct cfg80211_bss * __must_check
|
|
|
cfg80211_inform_bss_width_frame(struct wiphy *wiphy,
|
|
|
struct ieee80211_channel *rx_channel,
|
|
|
enum nl80211_bss_scan_width scan_width,
|
|
|
struct ieee80211_mgmt *mgmt, size_t len,
|
|
|
- s32 signal, gfp_t gfp);
|
|
|
+ s32 signal, gfp_t gfp)
|
|
|
+{
|
|
|
+ struct cfg80211_inform_bss data = {
|
|
|
+ .chan = rx_channel,
|
|
|
+ .scan_width = scan_width,
|
|
|
+ .signal = signal,
|
|
|
+ };
|
|
|
+
|
|
|
+ return cfg80211_inform_bss_frame_data(wiphy, &data, mgmt, len, gfp);
|
|
|
+}
|
|
|
|
|
|
static inline struct cfg80211_bss * __must_check
|
|
|
cfg80211_inform_bss_frame(struct wiphy *wiphy,
|
|
@@ -3987,9 +4019,13 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy,
|
|
|
struct ieee80211_mgmt *mgmt, size_t len,
|
|
|
s32 signal, gfp_t gfp)
|
|
|
{
|
|
|
- return cfg80211_inform_bss_width_frame(wiphy, rx_channel,
|
|
|
- NL80211_BSS_CHAN_WIDTH_20,
|
|
|
- mgmt, len, signal, gfp);
|
|
|
+ struct cfg80211_inform_bss data = {
|
|
|
+ .chan = rx_channel,
|
|
|
+ .scan_width = NL80211_BSS_CHAN_WIDTH_20,
|
|
|
+ .signal = signal,
|
|
|
+ };
|
|
|
+
|
|
|
+ return cfg80211_inform_bss_frame_data(wiphy, &data, mgmt, len, gfp);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -4006,11 +4042,10 @@ enum cfg80211_bss_frame_type {
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
- * cfg80211_inform_bss_width - inform cfg80211 of a new BSS
|
|
|
+ * cfg80211_inform_bss_data - inform cfg80211 of a new BSS
|
|
|
*
|
|
|
* @wiphy: the wiphy reporting the BSS
|
|
|
- * @rx_channel: The channel the frame was received on
|
|
|
- * @scan_width: width of the control channel
|
|
|
+ * @data: the BSS metadata
|
|
|
* @ftype: frame type (if known)
|
|
|
* @bssid: the BSSID of the BSS
|
|
|
* @tsf: the TSF sent by the peer in the beacon/probe response (or 0)
|
|
@@ -4018,7 +4053,6 @@ enum cfg80211_bss_frame_type {
|
|
|
* @beacon_interval: the beacon interval announced by the peer
|
|
|
* @ie: additional IEs sent by the peer
|
|
|
* @ielen: length of the additional IEs
|
|
|
- * @signal: the signal strength, type depends on the wiphy's signal_type
|
|
|
* @gfp: context flags
|
|
|
*
|
|
|
* This informs cfg80211 that BSS information was found and
|
|
@@ -4028,13 +4062,32 @@ enum cfg80211_bss_frame_type {
|
|
|
* Or %NULL on error.
|
|
|
*/
|
|
|
struct cfg80211_bss * __must_check
|
|
|
+cfg80211_inform_bss_data(struct wiphy *wiphy,
|
|
|
+ struct cfg80211_inform_bss *data,
|
|
|
+ enum cfg80211_bss_frame_type ftype,
|
|
|
+ const u8 *bssid, u64 tsf, u16 capability,
|
|
|
+ u16 beacon_interval, const u8 *ie, size_t ielen,
|
|
|
+ gfp_t gfp);
|
|
|
+
|
|
|
+static inline struct cfg80211_bss * __must_check
|
|
|
cfg80211_inform_bss_width(struct wiphy *wiphy,
|
|
|
struct ieee80211_channel *rx_channel,
|
|
|
enum nl80211_bss_scan_width scan_width,
|
|
|
enum cfg80211_bss_frame_type ftype,
|
|
|
const u8 *bssid, u64 tsf, u16 capability,
|
|
|
u16 beacon_interval, const u8 *ie, size_t ielen,
|
|
|
- s32 signal, gfp_t gfp);
|
|
|
+ s32 signal, gfp_t gfp)
|
|
|
+{
|
|
|
+ struct cfg80211_inform_bss data = {
|
|
|
+ .chan = rx_channel,
|
|
|
+ .scan_width = scan_width,
|
|
|
+ .signal = signal,
|
|
|
+ };
|
|
|
+
|
|
|
+ return cfg80211_inform_bss_data(wiphy, &data, ftype, bssid, tsf,
|
|
|
+ capability, beacon_interval, ie, ielen,
|
|
|
+ gfp);
|
|
|
+}
|
|
|
|
|
|
static inline struct cfg80211_bss * __must_check
|
|
|
cfg80211_inform_bss(struct wiphy *wiphy,
|
|
@@ -4044,11 +4097,15 @@ cfg80211_inform_bss(struct wiphy *wiphy,
|
|
|
u16 beacon_interval, const u8 *ie, size_t ielen,
|
|
|
s32 signal, gfp_t gfp)
|
|
|
{
|
|
|
- return cfg80211_inform_bss_width(wiphy, rx_channel,
|
|
|
- NL80211_BSS_CHAN_WIDTH_20, ftype,
|
|
|
- bssid, tsf, capability,
|
|
|
- beacon_interval, ie, ielen, signal,
|
|
|
- gfp);
|
|
|
+ struct cfg80211_inform_bss data = {
|
|
|
+ .chan = rx_channel,
|
|
|
+ .scan_width = NL80211_BSS_CHAN_WIDTH_20,
|
|
|
+ .signal = signal,
|
|
|
+ };
|
|
|
+
|
|
|
+ return cfg80211_inform_bss_data(wiphy, &data, ftype, bssid, tsf,
|
|
|
+ capability, beacon_interval, ie, ielen,
|
|
|
+ gfp);
|
|
|
}
|
|
|
|
|
|
struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
|