Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
This commit is contained in:
@@ -568,8 +568,8 @@ static int ath6kl_wmi_rx_probe_req_event_rx(struct wmi *wmi, u8 *datap, int len,
|
|||||||
dlen, freq, vif->probe_req_report);
|
dlen, freq, vif->probe_req_report);
|
||||||
|
|
||||||
if (vif->probe_req_report || vif->nw_type == AP_NETWORK)
|
if (vif->probe_req_report || vif->nw_type == AP_NETWORK)
|
||||||
cfg80211_rx_mgmt(&vif->wdev, freq, 0,
|
cfg80211_rx_mgmt(&vif->wdev, freq, 0, ev->data, dlen, 0,
|
||||||
ev->data, dlen, GFP_ATOMIC);
|
GFP_ATOMIC);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -608,8 +608,7 @@ static int ath6kl_wmi_rx_action_event_rx(struct wmi *wmi, u8 *datap, int len,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
ath6kl_dbg(ATH6KL_DBG_WMI, "rx_action: len=%u freq=%u\n", dlen, freq);
|
ath6kl_dbg(ATH6KL_DBG_WMI, "rx_action: len=%u freq=%u\n", dlen, freq);
|
||||||
cfg80211_rx_mgmt(&vif->wdev, freq, 0,
|
cfg80211_rx_mgmt(&vif->wdev, freq, 0, ev->data, dlen, 0, GFP_ATOMIC);
|
||||||
ev->data, dlen, GFP_ATOMIC);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -339,7 +339,7 @@ static void wmi_evt_rx_mgmt(struct wil6210_priv *wil, int id, void *d, int len)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
cfg80211_rx_mgmt(wil->wdev, freq, signal,
|
cfg80211_rx_mgmt(wil->wdev, freq, signal,
|
||||||
(void *)rx_mgmt_frame, d_len, GFP_KERNEL);
|
(void *)rx_mgmt_frame, d_len, 0, GFP_KERNEL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1430,7 +1430,7 @@ int brcmf_p2p_notify_action_frame_rx(struct brcmf_if *ifp,
|
|||||||
IEEE80211_BAND_5GHZ);
|
IEEE80211_BAND_5GHZ);
|
||||||
|
|
||||||
wdev = &ifp->vif->wdev;
|
wdev = &ifp->vif->wdev;
|
||||||
cfg80211_rx_mgmt(wdev, freq, 0, (u8 *)mgmt_frame, mgmt_frame_len,
|
cfg80211_rx_mgmt(wdev, freq, 0, (u8 *)mgmt_frame, mgmt_frame_len, 0,
|
||||||
GFP_ATOMIC);
|
GFP_ATOMIC);
|
||||||
|
|
||||||
kfree(mgmt_frame);
|
kfree(mgmt_frame);
|
||||||
@@ -1895,7 +1895,7 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probereq(struct brcmf_if *ifp,
|
|||||||
IEEE80211_BAND_2GHZ :
|
IEEE80211_BAND_2GHZ :
|
||||||
IEEE80211_BAND_5GHZ);
|
IEEE80211_BAND_5GHZ);
|
||||||
|
|
||||||
cfg80211_rx_mgmt(&vif->wdev, freq, 0, mgmt_frame, mgmt_frame_len,
|
cfg80211_rx_mgmt(&vif->wdev, freq, 0, mgmt_frame, mgmt_frame_len, 0,
|
||||||
GFP_ATOMIC);
|
GFP_ATOMIC);
|
||||||
|
|
||||||
brcmf_dbg(INFO, "mgmt_frame_len (%d) , e->datalen (%d), chanspec (%04x), freq (%d)\n",
|
brcmf_dbg(INFO, "mgmt_frame_len (%d) , e->datalen (%d), chanspec (%04x), freq (%d)\n",
|
||||||
|
@@ -2528,8 +2528,10 @@ static int __init init_mac80211_hwsim(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
hwsim_mon = alloc_netdev(0, "hwsim%d", hwsim_mon_setup);
|
hwsim_mon = alloc_netdev(0, "hwsim%d", hwsim_mon_setup);
|
||||||
if (hwsim_mon == NULL)
|
if (hwsim_mon == NULL) {
|
||||||
|
err = -ENOMEM;
|
||||||
goto failed;
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
|
|
||||||
|
@@ -171,8 +171,8 @@ mwifiex_process_mgmt_packet(struct mwifiex_private *priv,
|
|||||||
rx_pd->rx_pkt_length = cpu_to_le16(pkt_len);
|
rx_pd->rx_pkt_length = cpu_to_le16(pkt_len);
|
||||||
|
|
||||||
cfg80211_rx_mgmt(priv->wdev, priv->roc_cfg.chan.center_freq,
|
cfg80211_rx_mgmt(priv->wdev, priv->roc_cfg.chan.center_freq,
|
||||||
CAL_RSSI(rx_pd->snr, rx_pd->nf),
|
CAL_RSSI(rx_pd->snr, rx_pd->nf), skb->data, pkt_len,
|
||||||
skb->data, pkt_len, GFP_ATOMIC);
|
0, GFP_ATOMIC);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -5623,7 +5623,8 @@ static int wl1271_init_ieee80211(struct wl1271 *wl)
|
|||||||
wl->hw->wiphy->max_remain_on_channel_duration = 5000;
|
wl->hw->wiphy->max_remain_on_channel_duration = 5000;
|
||||||
|
|
||||||
wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD |
|
wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD |
|
||||||
WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
|
WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
|
||||||
|
WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
|
||||||
|
|
||||||
/* make sure all our channels fit in the scanned_ch bitmask */
|
/* make sure all our channels fit in the scanned_ch bitmask */
|
||||||
BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) +
|
BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) +
|
||||||
|
@@ -4056,6 +4056,7 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
|
|||||||
* @sig_dbm: signal strength in mBm, or 0 if unknown
|
* @sig_dbm: signal strength in mBm, or 0 if unknown
|
||||||
* @buf: Management frame (header + body)
|
* @buf: Management frame (header + body)
|
||||||
* @len: length of the frame data
|
* @len: length of the frame data
|
||||||
|
* @flags: flags, as defined in enum nl80211_rxmgmt_flags
|
||||||
* @gfp: context flags
|
* @gfp: context flags
|
||||||
*
|
*
|
||||||
* This function is called whenever an Action frame is received for a station
|
* This function is called whenever an Action frame is received for a station
|
||||||
@@ -4067,7 +4068,7 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
|
|||||||
* driver is responsible for rejecting the frame.
|
* driver is responsible for rejecting the frame.
|
||||||
*/
|
*/
|
||||||
bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm,
|
bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm,
|
||||||
const u8 *buf, size_t len, gfp_t gfp);
|
const u8 *buf, size_t len, u32 flags, gfp_t gfp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cfg80211_mgmt_tx_status - notification of TX status for management frame
|
* cfg80211_mgmt_tx_status - notification of TX status for management frame
|
||||||
|
@@ -1493,6 +1493,9 @@ enum nl80211_commands {
|
|||||||
* @NL80211_ATTR_CSA_C_OFF_PRESP: Offset of the channel switch counter
|
* @NL80211_ATTR_CSA_C_OFF_PRESP: Offset of the channel switch counter
|
||||||
* field in the probe response (%NL80211_ATTR_PROBE_RESP).
|
* field in the probe response (%NL80211_ATTR_PROBE_RESP).
|
||||||
*
|
*
|
||||||
|
* @NL80211_ATTR_RXMGMT_FLAGS: flags for nl80211_send_mgmt(), u32.
|
||||||
|
* As specified in the &enum nl80211_rxmgmt_flags.
|
||||||
|
*
|
||||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||||
*/
|
*/
|
||||||
@@ -1801,6 +1804,8 @@ enum nl80211_attrs {
|
|||||||
NL80211_ATTR_CSA_C_OFF_BEACON,
|
NL80211_ATTR_CSA_C_OFF_BEACON,
|
||||||
NL80211_ATTR_CSA_C_OFF_PRESP,
|
NL80211_ATTR_CSA_C_OFF_PRESP,
|
||||||
|
|
||||||
|
NL80211_ATTR_RXMGMT_FLAGS,
|
||||||
|
|
||||||
/* add attributes here, update the policy in nl80211.c */
|
/* add attributes here, update the policy in nl80211.c */
|
||||||
|
|
||||||
__NL80211_ATTR_AFTER_LAST,
|
__NL80211_ATTR_AFTER_LAST,
|
||||||
@@ -3901,4 +3906,15 @@ enum nl80211_crit_proto_id {
|
|||||||
/* maximum duration for critical protocol measures */
|
/* maximum duration for critical protocol measures */
|
||||||
#define NL80211_CRIT_PROTO_MAX_DURATION 5000 /* msec */
|
#define NL80211_CRIT_PROTO_MAX_DURATION 5000 /* msec */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum nl80211_rxmgmt_flags - flags for received management frame.
|
||||||
|
*
|
||||||
|
* Used by cfg80211_rx_mgmt()
|
||||||
|
*
|
||||||
|
* @NL80211_RXMGMT_FLAG_ANSWERED: frame was answered by device/driver.
|
||||||
|
*/
|
||||||
|
enum nl80211_rxmgmt_flags {
|
||||||
|
NL80211_RXMGMT_FLAG_ANSWERED = 1 << 0,
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* __LINUX_NL80211_H */
|
#endif /* __LINUX_NL80211_H */
|
||||||
|
@@ -308,12 +308,13 @@ static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata)
|
static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata,
|
||||||
|
enum nl80211_iftype iftype)
|
||||||
{
|
{
|
||||||
int n_queues = sdata->local->hw.queues;
|
int n_queues = sdata->local->hw.queues;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) {
|
if (iftype != NL80211_IFTYPE_P2P_DEVICE) {
|
||||||
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
|
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
|
||||||
if (WARN_ON_ONCE(sdata->vif.hw_queue[i] ==
|
if (WARN_ON_ONCE(sdata->vif.hw_queue[i] ==
|
||||||
IEEE80211_INVAL_HW_QUEUE))
|
IEEE80211_INVAL_HW_QUEUE))
|
||||||
@@ -324,8 +325,9 @@ static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sdata->vif.type != NL80211_IFTYPE_AP &&
|
if ((iftype != NL80211_IFTYPE_AP &&
|
||||||
sdata->vif.type != NL80211_IFTYPE_MESH_POINT) ||
|
iftype != NL80211_IFTYPE_P2P_GO &&
|
||||||
|
iftype != NL80211_IFTYPE_MESH_POINT) ||
|
||||||
!(sdata->local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)) {
|
!(sdata->local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)) {
|
||||||
sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE;
|
sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -408,7 +410,7 @@ int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ieee80211_check_queues(sdata);
|
ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kfree(sdata);
|
kfree(sdata);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -592,7 +594,8 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
|
|||||||
res = drv_add_interface(local, sdata);
|
res = drv_add_interface(local, sdata);
|
||||||
if (res)
|
if (res)
|
||||||
goto err_stop;
|
goto err_stop;
|
||||||
res = ieee80211_check_queues(sdata);
|
res = ieee80211_check_queues(sdata,
|
||||||
|
ieee80211_vif_type_p2p(&sdata->vif));
|
||||||
if (res)
|
if (res)
|
||||||
goto err_del_interface;
|
goto err_del_interface;
|
||||||
}
|
}
|
||||||
@@ -1389,14 +1392,14 @@ static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
ret = drv_change_interface(local, sdata, internal_type, p2p);
|
ret = drv_change_interface(local, sdata, internal_type, p2p);
|
||||||
if (ret)
|
if (ret)
|
||||||
type = sdata->vif.type;
|
type = ieee80211_vif_type_p2p(&sdata->vif);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ignore return value here, there's not much we can do since
|
* Ignore return value here, there's not much we can do since
|
||||||
* the driver changed the interface type internally already.
|
* the driver changed the interface type internally already.
|
||||||
* The warnings will hopefully make driver authors fix it :-)
|
* The warnings will hopefully make driver authors fix it :-)
|
||||||
*/
|
*/
|
||||||
ieee80211_check_queues(sdata);
|
ieee80211_check_queues(sdata, type);
|
||||||
|
|
||||||
ieee80211_setup_sdata(sdata, type);
|
ieee80211_setup_sdata(sdata, type);
|
||||||
|
|
||||||
|
@@ -892,9 +892,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
|||||||
if (!local->ops->remain_on_channel)
|
if (!local->ops->remain_on_channel)
|
||||||
local->hw.wiphy->max_remain_on_channel_duration = 5000;
|
local->hw.wiphy->max_remain_on_channel_duration = 5000;
|
||||||
|
|
||||||
if (local->ops->sched_scan_start)
|
|
||||||
local->hw.wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
|
|
||||||
|
|
||||||
/* mac80211 based drivers don't support internal TDLS setup */
|
/* mac80211 based drivers don't support internal TDLS setup */
|
||||||
if (local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS)
|
if (local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS)
|
||||||
local->hw.wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP;
|
local->hw.wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP;
|
||||||
|
@@ -832,6 +832,9 @@ ieee80211_mesh_rx_probe_req(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
ieee802_11_parse_elems(pos, len - baselen, false, &elems);
|
ieee802_11_parse_elems(pos, len - baselen, false, &elems);
|
||||||
|
|
||||||
|
if (!elems.mesh_id)
|
||||||
|
return;
|
||||||
|
|
||||||
/* 802.11-2012 10.1.4.3.2 */
|
/* 802.11-2012 10.1.4.3.2 */
|
||||||
if ((!ether_addr_equal(mgmt->da, sdata->vif.addr) &&
|
if ((!ether_addr_equal(mgmt->da, sdata->vif.addr) &&
|
||||||
!is_broadcast_ether_addr(mgmt->da)) ||
|
!is_broadcast_ether_addr(mgmt->da)) ||
|
||||||
|
@@ -439,13 +439,12 @@ minstrel_aggr_check(struct ieee80211_sta *pubsta, struct sk_buff *skb)
|
|||||||
{
|
{
|
||||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
|
||||||
struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
||||||
u16 tid;
|
u16 tid;
|
||||||
|
|
||||||
if (unlikely(!ieee80211_is_data_qos(hdr->frame_control)))
|
if (unlikely(!ieee80211_is_data_qos(hdr->frame_control)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (unlikely(info->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO))
|
if (unlikely(skb->protocol == cpu_to_be16(ETH_P_PAE)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
|
tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
|
||||||
|
@@ -2684,8 +2684,7 @@ ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx)
|
|||||||
sig = status->signal;
|
sig = status->signal;
|
||||||
|
|
||||||
if (cfg80211_rx_mgmt(&rx->sdata->wdev, status->freq, sig,
|
if (cfg80211_rx_mgmt(&rx->sdata->wdev, status->freq, sig,
|
||||||
rx->skb->data, rx->skb->len,
|
rx->skb->data, rx->skb->len, 0, GFP_ATOMIC)) {
|
||||||
GFP_ATOMIC)) {
|
|
||||||
if (rx->sta)
|
if (rx->sta)
|
||||||
rx->sta->rx_packets++;
|
rx->sta->rx_packets++;
|
||||||
dev_kfree_skb(rx->skb);
|
dev_kfree_skb(rx->skb);
|
||||||
|
@@ -781,9 +781,11 @@ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx)
|
|||||||
/*
|
/*
|
||||||
* Anything but QoS data that has a sequence number field
|
* Anything but QoS data that has a sequence number field
|
||||||
* (is long enough) gets a sequence number from the global
|
* (is long enough) gets a sequence number from the global
|
||||||
* counter.
|
* counter. QoS data frames with a multicast destination
|
||||||
|
* also use the global counter (802.11-2012 9.3.2.10).
|
||||||
*/
|
*/
|
||||||
if (!ieee80211_is_data_qos(hdr->frame_control)) {
|
if (!ieee80211_is_data_qos(hdr->frame_control) ||
|
||||||
|
is_multicast_ether_addr(hdr->addr1)) {
|
||||||
/* driver should assign sequence number */
|
/* driver should assign sequence number */
|
||||||
info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ;
|
info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ;
|
||||||
/* for pure STA mode without beacons, we can do it */
|
/* for pure STA mode without beacons, we can do it */
|
||||||
|
@@ -621,7 +621,7 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
|
bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
|
||||||
const u8 *buf, size_t len, gfp_t gfp)
|
const u8 *buf, size_t len, u32 flags, gfp_t gfp)
|
||||||
{
|
{
|
||||||
struct wiphy *wiphy = wdev->wiphy;
|
struct wiphy *wiphy = wdev->wiphy;
|
||||||
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
||||||
@@ -664,7 +664,7 @@ bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
|
|||||||
/* 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,
|
||||||
freq, sig_mbm,
|
freq, sig_mbm,
|
||||||
buf, len, gfp))
|
buf, len, flags, gfp))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
result = true;
|
result = true;
|
||||||
|
@@ -10450,7 +10450,7 @@ 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,
|
int freq, int sig_dbm,
|
||||||
const u8 *buf, size_t len, 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;
|
||||||
@@ -10473,7 +10473,9 @@ int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
|
|||||||
nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
|
nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
|
||||||
(sig_dbm &&
|
(sig_dbm &&
|
||||||
nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
|
nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
|
||||||
nla_put(msg, NL80211_ATTR_FRAME, len, buf))
|
nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
|
||||||
|
(flags &&
|
||||||
|
nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
genlmsg_end(msg, hdr);
|
genlmsg_end(msg, hdr);
|
||||||
|
@@ -66,7 +66,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,
|
int freq, int sig_dbm,
|
||||||
const u8 *buf, size_t len, 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,
|
||||||
|
Reference in New Issue
Block a user