Commit 00b3d840 authored by Avraham Stern's avatar Avraham Stern Committed by Johannes Berg

wifi: cfg80211/nl80211: move rx management data into a struct

The functions for reporting rx management take many arguments.
Collect all the arguments into a struct, which also make it easier
to add more arguments if needed.
Signed-off-by: default avatarAvraham Stern <avraham.stern@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent ea7d50c9
...@@ -7792,6 +7792,39 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, ...@@ -7792,6 +7792,39 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
enum nl80211_connect_failed_reason reason, enum nl80211_connect_failed_reason reason,
gfp_t gfp); gfp_t gfp);
/**
* struct cfg80211_rx_info - received management frame info
*
* @freq: Frequency on which the frame was received in kHz
* @sig_dbm: signal strength in dBm, or 0 if unknown
* @buf: Management frame (header + body)
* @len: length of the frame data
* @flags: flags, as defined in enum nl80211_rxmgmt_flags
*/
struct cfg80211_rx_info {
int freq;
int sig_dbm;
const u8 *buf;
size_t len;
u32 flags;
};
/**
* cfg80211_rx_mgmt_ext - management frame notification with extended info
* @wdev: wireless device receiving the frame
* @info: RX info as defined in struct cfg80211_rx_info
*
* This function is called whenever an Action frame is received for a station
* mode interface, but is not processed in kernel.
*
* Return: %true if a user space application has registered for this frame.
* For action frames, that makes it responsible for rejecting unrecognized
* action frames; %false otherwise, in which case for action frames the
* driver is responsible for rejecting the frame.
*/
bool cfg80211_rx_mgmt_ext(struct wireless_dev *wdev,
struct cfg80211_rx_info *info);
/** /**
* cfg80211_rx_mgmt_khz - notification of received, unprocessed management frame * cfg80211_rx_mgmt_khz - notification of received, unprocessed management frame
* @wdev: wireless device receiving the frame * @wdev: wireless device receiving the frame
...@@ -7809,8 +7842,20 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, ...@@ -7809,8 +7842,20 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
* action frames; %false otherwise, in which case for action frames the * action frames; %false otherwise, in which case for action frames the
* driver is responsible for rejecting the frame. * driver is responsible for rejecting the frame.
*/ */
bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm, static inline bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq,
const u8 *buf, size_t len, u32 flags); int sig_dbm, const u8 *buf, size_t len,
u32 flags)
{
struct cfg80211_rx_info info = {
.freq = freq,
.sig_dbm = sig_dbm,
.buf = buf,
.len = len,
.flags = flags
};
return cfg80211_rx_mgmt_ext(wdev, &info);
}
/** /**
* cfg80211_rx_mgmt - notification of received, unprocessed management frame * cfg80211_rx_mgmt - notification of received, unprocessed management frame
...@@ -7833,8 +7878,15 @@ static inline bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, ...@@ -7833,8 +7878,15 @@ static inline bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq,
int sig_dbm, const u8 *buf, size_t len, int sig_dbm, const u8 *buf, size_t len,
u32 flags) u32 flags)
{ {
return cfg80211_rx_mgmt_khz(wdev, MHZ_TO_KHZ(freq), sig_dbm, buf, len, struct cfg80211_rx_info info = {
flags); .freq = MHZ_TO_KHZ(freq),
.sig_dbm = sig_dbm,
.buf = buf,
.len = len,
.flags = flags
};
return cfg80211_rx_mgmt_ext(wdev, &info);
} }
/** /**
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* *
* Copyright (c) 2009, Jouni Malinen <j@w1.fi> * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
* Copyright (c) 2015 Intel Deutschland GmbH * Copyright (c) 2015 Intel Deutschland GmbH
* Copyright (C) 2019-2020 Intel Corporation * Copyright (C) 2019-2020, 2022 Intel Corporation
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -791,15 +791,15 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev, ...@@ -791,15 +791,15 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
return rdev_mgmt_tx(rdev, wdev, params, cookie); return rdev_mgmt_tx(rdev, wdev, params, cookie);
} }
bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm, bool cfg80211_rx_mgmt_ext(struct wireless_dev *wdev,
const u8 *buf, size_t len, u32 flags) struct cfg80211_rx_info *info)
{ {
struct wiphy *wiphy = wdev->wiphy; struct wiphy *wiphy = wdev->wiphy;
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
struct cfg80211_mgmt_registration *reg; struct cfg80211_mgmt_registration *reg;
const struct ieee80211_txrx_stypes *stypes = const struct ieee80211_txrx_stypes *stypes =
&wiphy->mgmt_stypes[wdev->iftype]; &wiphy->mgmt_stypes[wdev->iftype];
struct ieee80211_mgmt *mgmt = (void *)buf; struct ieee80211_mgmt *mgmt = (void *)info->buf;
const u8 *data; const u8 *data;
int data_len; int data_len;
bool result = false; bool result = false;
...@@ -807,7 +807,7 @@ bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm, ...@@ -807,7 +807,7 @@ bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm,
cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE); cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE);
u16 stype; u16 stype;
trace_cfg80211_rx_mgmt(wdev, freq, sig_dbm); trace_cfg80211_rx_mgmt(wdev, info);
stype = (le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE) >> 4; stype = (le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE) >> 4;
if (!(stypes->rx & BIT(stype))) { if (!(stypes->rx & BIT(stype))) {
...@@ -815,8 +815,8 @@ bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm, ...@@ -815,8 +815,8 @@ bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm,
return false; return false;
} }
data = buf + ieee80211_hdrlen(mgmt->frame_control); data = info->buf + ieee80211_hdrlen(mgmt->frame_control);
data_len = len - ieee80211_hdrlen(mgmt->frame_control); data_len = info->len - ieee80211_hdrlen(mgmt->frame_control);
spin_lock_bh(&rdev->mgmt_registrations_lock); spin_lock_bh(&rdev->mgmt_registrations_lock);
...@@ -833,9 +833,8 @@ bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm, ...@@ -833,9 +833,8 @@ bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm,
/* found match! */ /* found match! */
/* Indicate the received Action frame to user space */ /* Indicate the received Action frame to user space */
if (nl80211_send_mgmt(rdev, wdev, reg->nlportid, if (nl80211_send_mgmt(rdev, wdev, reg->nlportid, info,
freq, sig_dbm, GFP_ATOMIC))
buf, len, flags, GFP_ATOMIC))
continue; continue;
result = true; result = true;
...@@ -847,7 +846,7 @@ bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm, ...@@ -847,7 +846,7 @@ bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm,
trace_cfg80211_return_bool(result); trace_cfg80211_return_bool(result);
return result; return result;
} }
EXPORT_SYMBOL(cfg80211_rx_mgmt_khz); EXPORT_SYMBOL(cfg80211_rx_mgmt_ext);
void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev) void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev)
{ {
......
...@@ -18356,14 +18356,13 @@ EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame); ...@@ -18356,14 +18356,13 @@ EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
struct wireless_dev *wdev, u32 nlportid, struct wireless_dev *wdev, u32 nlportid,
int freq, int sig_dbm, struct cfg80211_rx_info *info, gfp_t gfp)
const u8 *buf, size_t len, u32 flags, gfp_t gfp)
{ {
struct net_device *netdev = wdev->netdev; struct net_device *netdev = wdev->netdev;
struct sk_buff *msg; struct sk_buff *msg;
void *hdr; void *hdr;
msg = nlmsg_new(100 + len, gfp); msg = nlmsg_new(100 + info->len, gfp);
if (!msg) if (!msg)
return -ENOMEM; return -ENOMEM;
...@@ -18378,13 +18377,13 @@ int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, ...@@ -18378,13 +18377,13 @@ int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
netdev->ifindex)) || netdev->ifindex)) ||
nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
NL80211_ATTR_PAD) || NL80211_ATTR_PAD) ||
nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(freq)) || nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) ||
nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, freq % 1000) || nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) ||
(sig_dbm && (info->sig_dbm &&
nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) ||
nla_put(msg, NL80211_ATTR_FRAME, len, buf) || nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) ||
(flags && (info->flags &&
nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags))) nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)))
goto nla_put_failure; goto nla_put_failure;
genlmsg_end(msg, hdr); genlmsg_end(msg, hdr);
......
/* SPDX-License-Identifier: GPL-2.0 */ /* SPDX-License-Identifier: GPL-2.0 */
/* /*
* Portions of this file * Portions of this file
* Copyright (C) 2018, 2020-2021 Intel Corporation * Copyright (C) 2018, 2020-2022 Intel Corporation
*/ */
#ifndef __NET_WIRELESS_NL80211_H #ifndef __NET_WIRELESS_NL80211_H
#define __NET_WIRELESS_NL80211_H #define __NET_WIRELESS_NL80211_H
...@@ -105,8 +105,7 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, ...@@ -105,8 +105,7 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
struct wireless_dev *wdev, u32 nlpid, struct wireless_dev *wdev, u32 nlpid,
int freq, int sig_dbm, struct cfg80211_rx_info *info, gfp_t gfp);
const u8 *buf, size_t len, u32 flags, gfp_t gfp);
void void
nl80211_radar_notify(struct cfg80211_registered_device *rdev, nl80211_radar_notify(struct cfg80211_registered_device *rdev,
......
...@@ -3096,8 +3096,8 @@ DEFINE_EVENT(cfg80211_netdev_mac_evt, cfg80211_del_sta, ...@@ -3096,8 +3096,8 @@ DEFINE_EVENT(cfg80211_netdev_mac_evt, cfg80211_del_sta,
); );
TRACE_EVENT(cfg80211_rx_mgmt, TRACE_EVENT(cfg80211_rx_mgmt,
TP_PROTO(struct wireless_dev *wdev, int freq, int sig_dbm), TP_PROTO(struct wireless_dev *wdev, struct cfg80211_rx_info *info),
TP_ARGS(wdev, freq, sig_dbm), TP_ARGS(wdev, info),
TP_STRUCT__entry( TP_STRUCT__entry(
WDEV_ENTRY WDEV_ENTRY
__field(int, freq) __field(int, freq)
...@@ -3105,8 +3105,8 @@ TRACE_EVENT(cfg80211_rx_mgmt, ...@@ -3105,8 +3105,8 @@ TRACE_EVENT(cfg80211_rx_mgmt,
), ),
TP_fast_assign( TP_fast_assign(
WDEV_ASSIGN; WDEV_ASSIGN;
__entry->freq = freq; __entry->freq = info->freq;
__entry->sig_dbm = sig_dbm; __entry->sig_dbm = info->sig_dbm;
), ),
TP_printk(WDEV_PR_FMT ", freq: "KHZ_F", sig dbm: %d", TP_printk(WDEV_PR_FMT ", freq: "KHZ_F", sig dbm: %d",
WDEV_PR_ARG, PR_KHZ(__entry->freq), __entry->sig_dbm) WDEV_PR_ARG, PR_KHZ(__entry->freq), __entry->sig_dbm)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment