mirror of https://gitee.com/openkylin/linux.git
Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
This commit is contained in:
commit
5419575e83
|
@ -1488,7 +1488,7 @@ static int ath6kl_cfg80211_set_power_mgmt(struct wiphy *wiphy,
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct wireless_dev *ath6kl_cfg80211_add_iface(struct wiphy *wiphy,
|
static struct wireless_dev *ath6kl_cfg80211_add_iface(struct wiphy *wiphy,
|
||||||
char *name,
|
const char *name,
|
||||||
enum nl80211_iftype type,
|
enum nl80211_iftype type,
|
||||||
u32 *flags,
|
u32 *flags,
|
||||||
struct vif_params *params)
|
struct vif_params *params)
|
||||||
|
@ -3477,7 +3477,7 @@ void ath6kl_cfg80211_vif_cleanup(struct ath6kl_vif *vif)
|
||||||
ar->num_vif--;
|
ar->num_vif--;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, char *name,
|
struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, const char *name,
|
||||||
enum nl80211_iftype type,
|
enum nl80211_iftype type,
|
||||||
u8 fw_vif_idx, u8 nw_type)
|
u8 fw_vif_idx, u8 nw_type)
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,7 +25,7 @@ enum ath6kl_cfg_suspend_mode {
|
||||||
ATH6KL_CFG_SUSPEND_SCHED_SCAN,
|
ATH6KL_CFG_SUSPEND_SCHED_SCAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, char *name,
|
struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, const char *name,
|
||||||
enum nl80211_iftype type,
|
enum nl80211_iftype type,
|
||||||
u8 fw_vif_idx, u8 nw_type);
|
u8 fw_vif_idx, u8 nw_type);
|
||||||
void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq,
|
void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq,
|
||||||
|
|
|
@ -1636,7 +1636,7 @@ mwifiex_setup_ht_caps(struct ieee80211_sta_ht_cap *ht_info,
|
||||||
* create a new virtual interface with the given name
|
* create a new virtual interface with the given name
|
||||||
*/
|
*/
|
||||||
struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
||||||
char *name,
|
const char *name,
|
||||||
enum nl80211_iftype type,
|
enum nl80211_iftype type,
|
||||||
u32 *flags,
|
u32 *flags,
|
||||||
struct vif_params *params)
|
struct vif_params *params)
|
||||||
|
|
|
@ -1033,7 +1033,7 @@ int mwifiex_check_network_compatibility(struct mwifiex_private *priv,
|
||||||
struct mwifiex_bssdescriptor *bss_desc);
|
struct mwifiex_bssdescriptor *bss_desc);
|
||||||
|
|
||||||
struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
|
||||||
char *name,
|
const char *name,
|
||||||
enum nl80211_iftype type,
|
enum nl80211_iftype type,
|
||||||
u32 *flags,
|
u32 *flags,
|
||||||
struct vif_params *params);
|
struct vif_params *params);
|
||||||
|
|
|
@ -573,6 +573,11 @@
|
||||||
* @NL80211_CMD_STOP_P2P_DEVICE: Stop the given P2P Device, identified by
|
* @NL80211_CMD_STOP_P2P_DEVICE: Stop the given P2P Device, identified by
|
||||||
* its %NL80211_ATTR_WDEV identifier.
|
* its %NL80211_ATTR_WDEV identifier.
|
||||||
*
|
*
|
||||||
|
* @NL80211_CMD_CONN_FAILED: connection request to an AP failed; used to
|
||||||
|
* notify userspace that AP has rejected the connection request from a
|
||||||
|
* station, due to particular reason. %NL80211_ATTR_CONN_FAILED_REASON
|
||||||
|
* is used for this.
|
||||||
|
*
|
||||||
* @NL80211_CMD_MAX: highest used command number
|
* @NL80211_CMD_MAX: highest used command number
|
||||||
* @__NL80211_CMD_AFTER_LAST: internal use
|
* @__NL80211_CMD_AFTER_LAST: internal use
|
||||||
*/
|
*/
|
||||||
|
@ -719,6 +724,8 @@ enum nl80211_commands {
|
||||||
NL80211_CMD_START_P2P_DEVICE,
|
NL80211_CMD_START_P2P_DEVICE,
|
||||||
NL80211_CMD_STOP_P2P_DEVICE,
|
NL80211_CMD_STOP_P2P_DEVICE,
|
||||||
|
|
||||||
|
NL80211_CMD_CONN_FAILED,
|
||||||
|
|
||||||
/* add new commands above here */
|
/* add new commands above here */
|
||||||
|
|
||||||
/* used to define NL80211_CMD_MAX below */
|
/* used to define NL80211_CMD_MAX below */
|
||||||
|
@ -1262,6 +1269,10 @@ enum nl80211_commands {
|
||||||
* was used to provide the hint. For the different types of
|
* was used to provide the hint. For the different types of
|
||||||
* allowed user regulatory hints see nl80211_user_reg_hint_type.
|
* allowed user regulatory hints see nl80211_user_reg_hint_type.
|
||||||
*
|
*
|
||||||
|
* @NL80211_ATTR_CONN_FAILED_REASON: The reason for which AP has rejected
|
||||||
|
* the connection request from a station. nl80211_connect_failed_reason
|
||||||
|
* enum has different reasons of connection failure.
|
||||||
|
*
|
||||||
* @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
|
||||||
*/
|
*/
|
||||||
|
@ -1517,6 +1528,8 @@ enum nl80211_attrs {
|
||||||
|
|
||||||
NL80211_ATTR_USER_REG_HINT_TYPE,
|
NL80211_ATTR_USER_REG_HINT_TYPE,
|
||||||
|
|
||||||
|
NL80211_ATTR_CONN_FAILED_REASON,
|
||||||
|
|
||||||
/* 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,
|
||||||
|
@ -3045,4 +3058,15 @@ enum nl80211_probe_resp_offload_support_attr {
|
||||||
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U = 1<<3,
|
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U = 1<<3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum nl80211_connect_failed_reason - connection request failed reasons
|
||||||
|
* @NL80211_CONN_FAIL_MAX_CLIENTS: Maximum number of clients that can be
|
||||||
|
* handled by the AP is reached.
|
||||||
|
* @NL80211_CONN_FAIL_BLOCKED_CLIENT: Client's MAC is in the AP's blocklist.
|
||||||
|
*/
|
||||||
|
enum nl80211_connect_failed_reason {
|
||||||
|
NL80211_CONN_FAIL_MAX_CLIENTS,
|
||||||
|
NL80211_CONN_FAIL_BLOCKED_CLIENT,
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* __LINUX_NL80211_H */
|
#endif /* __LINUX_NL80211_H */
|
||||||
|
|
|
@ -1580,9 +1580,7 @@ struct cfg80211_gtk_rekey_data {
|
||||||
* @set_cqm_txe_config: Configure connection quality monitor TX error
|
* @set_cqm_txe_config: Configure connection quality monitor TX error
|
||||||
* thresholds.
|
* thresholds.
|
||||||
* @sched_scan_start: Tell the driver to start a scheduled scan.
|
* @sched_scan_start: Tell the driver to start a scheduled scan.
|
||||||
* @sched_scan_stop: Tell the driver to stop an ongoing scheduled
|
* @sched_scan_stop: Tell the driver to stop an ongoing scheduled scan.
|
||||||
* scan. The driver_initiated flag specifies whether the driver
|
|
||||||
* itself has informed that the scan has stopped.
|
|
||||||
*
|
*
|
||||||
* @mgmt_frame_register: Notify driver that a management frame type was
|
* @mgmt_frame_register: Notify driver that a management frame type was
|
||||||
* registered. Note that this callback may not sleep, and cannot run
|
* registered. Note that this callback may not sleep, and cannot run
|
||||||
|
@ -1630,7 +1628,7 @@ struct cfg80211_ops {
|
||||||
void (*set_wakeup)(struct wiphy *wiphy, bool enabled);
|
void (*set_wakeup)(struct wiphy *wiphy, bool enabled);
|
||||||
|
|
||||||
struct wireless_dev * (*add_virtual_intf)(struct wiphy *wiphy,
|
struct wireless_dev * (*add_virtual_intf)(struct wiphy *wiphy,
|
||||||
char *name,
|
const char *name,
|
||||||
enum nl80211_iftype type,
|
enum nl80211_iftype type,
|
||||||
u32 *flags,
|
u32 *flags,
|
||||||
struct vif_params *params);
|
struct vif_params *params);
|
||||||
|
@ -3362,6 +3360,25 @@ void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
|
||||||
*/
|
*/
|
||||||
void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp);
|
void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cfg80211_conn_failed - connection request failed notification
|
||||||
|
*
|
||||||
|
* @dev: the netdev
|
||||||
|
* @mac_addr: the station's address
|
||||||
|
* @reason: the reason for connection failure
|
||||||
|
* @gfp: allocation flags
|
||||||
|
*
|
||||||
|
* Whenever a station tries to connect to an AP and if the station
|
||||||
|
* could not connect to the AP as the AP has rejected the connection
|
||||||
|
* for some reasons, this function is called.
|
||||||
|
*
|
||||||
|
* The reason for connection failure can be any of the value from
|
||||||
|
* nl80211_connect_failed_reason enum
|
||||||
|
*/
|
||||||
|
void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
|
||||||
|
enum nl80211_connect_failed_reason reason,
|
||||||
|
gfp_t gfp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cfg80211_rx_mgmt - notification of received, unprocessed management frame
|
* cfg80211_rx_mgmt - notification of received, unprocessed management frame
|
||||||
* @wdev: wireless device receiving the frame
|
* @wdev: wireless device receiving the frame
|
||||||
|
|
|
@ -869,7 +869,7 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR,
|
___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR,
|
||||||
true);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
|
@ -20,7 +20,8 @@
|
||||||
#include "rate.h"
|
#include "rate.h"
|
||||||
#include "mesh.h"
|
#include "mesh.h"
|
||||||
|
|
||||||
static struct wireless_dev *ieee80211_add_iface(struct wiphy *wiphy, char *name,
|
static struct wireless_dev *ieee80211_add_iface(struct wiphy *wiphy,
|
||||||
|
const char *name,
|
||||||
enum nl80211_iftype type,
|
enum nl80211_iftype type,
|
||||||
u32 *flags,
|
u32 *flags,
|
||||||
struct vif_params *params)
|
struct vif_params *params)
|
||||||
|
|
|
@ -70,6 +70,7 @@ DEBUGFS_READONLY_FILE(wep_iv, "%#08x",
|
||||||
DEBUGFS_READONLY_FILE(rate_ctrl_alg, "%s",
|
DEBUGFS_READONLY_FILE(rate_ctrl_alg, "%s",
|
||||||
local->rate_ctrl ? local->rate_ctrl->ops->name : "hw/driver");
|
local->rate_ctrl ? local->rate_ctrl->ops->name : "hw/driver");
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
static ssize_t reset_write(struct file *file, const char __user *user_buf,
|
static ssize_t reset_write(struct file *file, const char __user *user_buf,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
|
@ -88,6 +89,7 @@ static const struct file_operations reset_ops = {
|
||||||
.open = simple_open,
|
.open = simple_open,
|
||||||
.llseek = noop_llseek,
|
.llseek = noop_llseek,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static ssize_t hwflags_read(struct file *file, char __user *user_buf,
|
static ssize_t hwflags_read(struct file *file, char __user *user_buf,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
|
@ -245,7 +247,9 @@ 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(queues);
|
DEBUGFS_ADD(queues);
|
||||||
|
#ifdef CONFIG_PM
|
||||||
DEBUGFS_ADD_MODE(reset, 0200);
|
DEBUGFS_ADD_MODE(reset, 0200);
|
||||||
|
#endif
|
||||||
DEBUGFS_ADD(hwflags);
|
DEBUGFS_ADD(hwflags);
|
||||||
DEBUGFS_ADD(user_power);
|
DEBUGFS_ADD(user_power);
|
||||||
DEBUGFS_ADD(power);
|
DEBUGFS_ADD(power);
|
||||||
|
|
|
@ -278,7 +278,7 @@ static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta,
|
||||||
if (auth && !sdata->u.ibss.auth_frame_registrations) {
|
if (auth && !sdata->u.ibss.auth_frame_registrations) {
|
||||||
ibss_dbg(sdata,
|
ibss_dbg(sdata,
|
||||||
"TX Auth SA=%pM DA=%pM BSSID=%pM (auth_transaction=1)\n",
|
"TX Auth SA=%pM DA=%pM BSSID=%pM (auth_transaction=1)\n",
|
||||||
sdata->vif.addr, sdata->u.ibss.bssid, addr);
|
sdata->vif.addr, addr, sdata->u.ibss.bssid);
|
||||||
ieee80211_send_auth(sdata, 1, WLAN_AUTH_OPEN, NULL, 0,
|
ieee80211_send_auth(sdata, 1, WLAN_AUTH_OPEN, NULL, 0,
|
||||||
addr, sdata->u.ibss.bssid, NULL, 0, 0);
|
addr, sdata->u.ibss.bssid, NULL, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1399,7 +1399,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||||
sta = sta_info_get(sdata, ifmgd->bssid);
|
sta = sta_info_get(sdata, ifmgd->bssid);
|
||||||
if (sta) {
|
if (sta) {
|
||||||
set_sta_flag(sta, WLAN_STA_BLOCK_BA);
|
set_sta_flag(sta, WLAN_STA_BLOCK_BA);
|
||||||
ieee80211_sta_tear_down_BA_sessions(sta, tx);
|
ieee80211_sta_tear_down_BA_sessions(sta, false);
|
||||||
}
|
}
|
||||||
mutex_unlock(&local->sta_mtx);
|
mutex_unlock(&local->sta_mtx);
|
||||||
|
|
||||||
|
|
|
@ -738,7 +738,7 @@ int __must_check __sta_info_destroy(struct sta_info *sta)
|
||||||
* will be sufficient.
|
* will be sufficient.
|
||||||
*/
|
*/
|
||||||
set_sta_flag(sta, WLAN_STA_BLOCK_BA);
|
set_sta_flag(sta, WLAN_STA_BLOCK_BA);
|
||||||
ieee80211_sta_tear_down_BA_sessions(sta, true);
|
ieee80211_sta_tear_down_BA_sessions(sta, false);
|
||||||
|
|
||||||
ret = sta_info_hash_del(local, sta);
|
ret = sta_info_hash_del(local, sta);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -270,6 +270,7 @@ static bool __rfkill_set_hw_state(struct rfkill *rfkill,
|
||||||
static void rfkill_set_block(struct rfkill *rfkill, bool blocked)
|
static void rfkill_set_block(struct rfkill *rfkill, bool blocked)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
bool prev, curr;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (unlikely(rfkill->dev.power.power_state.event & PM_EVENT_SLEEP))
|
if (unlikely(rfkill->dev.power.power_state.event & PM_EVENT_SLEEP))
|
||||||
|
@ -284,6 +285,8 @@ static void rfkill_set_block(struct rfkill *rfkill, bool blocked)
|
||||||
rfkill->ops->query(rfkill, rfkill->data);
|
rfkill->ops->query(rfkill, rfkill->data);
|
||||||
|
|
||||||
spin_lock_irqsave(&rfkill->lock, flags);
|
spin_lock_irqsave(&rfkill->lock, flags);
|
||||||
|
prev = rfkill->state & RFKILL_BLOCK_SW;
|
||||||
|
|
||||||
if (rfkill->state & RFKILL_BLOCK_SW)
|
if (rfkill->state & RFKILL_BLOCK_SW)
|
||||||
rfkill->state |= RFKILL_BLOCK_SW_PREV;
|
rfkill->state |= RFKILL_BLOCK_SW_PREV;
|
||||||
else
|
else
|
||||||
|
@ -313,10 +316,13 @@ static void rfkill_set_block(struct rfkill *rfkill, bool blocked)
|
||||||
}
|
}
|
||||||
rfkill->state &= ~RFKILL_BLOCK_SW_SETCALL;
|
rfkill->state &= ~RFKILL_BLOCK_SW_SETCALL;
|
||||||
rfkill->state &= ~RFKILL_BLOCK_SW_PREV;
|
rfkill->state &= ~RFKILL_BLOCK_SW_PREV;
|
||||||
|
curr = rfkill->state & RFKILL_BLOCK_SW;
|
||||||
spin_unlock_irqrestore(&rfkill->lock, flags);
|
spin_unlock_irqrestore(&rfkill->lock, flags);
|
||||||
|
|
||||||
rfkill_led_trigger_event(rfkill);
|
rfkill_led_trigger_event(rfkill);
|
||||||
rfkill_event(rfkill);
|
|
||||||
|
if (prev != curr)
|
||||||
|
rfkill_event(rfkill);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_RFKILL_INPUT
|
#ifdef CONFIG_RFKILL_INPUT
|
||||||
|
|
|
@ -612,6 +612,17 @@ void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cfg80211_del_sta);
|
EXPORT_SYMBOL(cfg80211_del_sta);
|
||||||
|
|
||||||
|
void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
|
||||||
|
enum nl80211_connect_failed_reason reason,
|
||||||
|
gfp_t gfp)
|
||||||
|
{
|
||||||
|
struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
|
||||||
|
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
||||||
|
|
||||||
|
nl80211_send_conn_failed_event(rdev, dev, mac_addr, reason, gfp);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(cfg80211_conn_failed);
|
||||||
|
|
||||||
struct cfg80211_mgmt_registration {
|
struct cfg80211_mgmt_registration {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
|
||||||
|
|
|
@ -8364,6 +8364,40 @@ void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev,
|
||||||
nlmsg_free(msg);
|
nlmsg_free(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nl80211_send_conn_failed_event(struct cfg80211_registered_device *rdev,
|
||||||
|
struct net_device *dev, const u8 *mac_addr,
|
||||||
|
enum nl80211_connect_failed_reason reason,
|
||||||
|
gfp_t gfp)
|
||||||
|
{
|
||||||
|
struct sk_buff *msg;
|
||||||
|
void *hdr;
|
||||||
|
|
||||||
|
msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
|
||||||
|
if (!msg)
|
||||||
|
return;
|
||||||
|
|
||||||
|
hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
|
||||||
|
if (!hdr) {
|
||||||
|
nlmsg_free(msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
|
||||||
|
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
|
||||||
|
nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
|
||||||
|
goto nla_put_failure;
|
||||||
|
|
||||||
|
genlmsg_end(msg, hdr);
|
||||||
|
|
||||||
|
genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
|
||||||
|
nl80211_mlme_mcgrp.id, gfp);
|
||||||
|
return;
|
||||||
|
|
||||||
|
nla_put_failure:
|
||||||
|
genlmsg_cancel(msg, hdr);
|
||||||
|
nlmsg_free(msg);
|
||||||
|
}
|
||||||
|
|
||||||
static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
|
static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
|
||||||
const u8 *addr, gfp_t gfp)
|
const u8 *addr, gfp_t gfp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -91,6 +91,11 @@ void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev,
|
||||||
struct net_device *dev, const u8 *mac_addr,
|
struct net_device *dev, const u8 *mac_addr,
|
||||||
gfp_t gfp);
|
gfp_t gfp);
|
||||||
|
|
||||||
|
void nl80211_send_conn_failed_event(struct cfg80211_registered_device *rdev,
|
||||||
|
struct net_device *dev, const u8 *mac_addr,
|
||||||
|
enum nl80211_connect_failed_reason reason,
|
||||||
|
gfp_t gfp);
|
||||||
|
|
||||||
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,
|
||||||
|
|
|
@ -504,9 +504,11 @@ static bool reg_does_bw_fit(const struct ieee80211_freq_range *freq_range,
|
||||||
*
|
*
|
||||||
* This lets us know if a specific frequency rule is or is not relevant to
|
* This lets us know if a specific frequency rule is or is not relevant to
|
||||||
* a specific frequency's band. Bands are device specific and artificial
|
* a specific frequency's band. Bands are device specific and artificial
|
||||||
* definitions (the "2.4 GHz band" and the "5 GHz band"), however it is
|
* definitions (the "2.4 GHz band", the "5 GHz band" and the "60GHz band"),
|
||||||
* safe for now to assume that a frequency rule should not be part of a
|
* however it is safe for now to assume that a frequency rule should not be
|
||||||
* frequency's band if the start freq or end freq are off by more than 2 GHz.
|
* part of a frequency's band if the start freq or end freq are off by more
|
||||||
|
* than 2 GHz for the 2.4 and 5 GHz bands, and by more than 10 GHz for the
|
||||||
|
* 60 GHz band.
|
||||||
* This resolution can be lowered and should be considered as we add
|
* This resolution can be lowered and should be considered as we add
|
||||||
* regulatory rule support for other "bands".
|
* regulatory rule support for other "bands".
|
||||||
**/
|
**/
|
||||||
|
@ -514,9 +516,16 @@ static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range,
|
||||||
u32 freq_khz)
|
u32 freq_khz)
|
||||||
{
|
{
|
||||||
#define ONE_GHZ_IN_KHZ 1000000
|
#define ONE_GHZ_IN_KHZ 1000000
|
||||||
if (abs(freq_khz - freq_range->start_freq_khz) <= (2 * ONE_GHZ_IN_KHZ))
|
/*
|
||||||
|
* From 802.11ad: directional multi-gigabit (DMG):
|
||||||
|
* Pertaining to operation in a frequency band containing a channel
|
||||||
|
* with the Channel starting frequency above 45 GHz.
|
||||||
|
*/
|
||||||
|
u32 limit = freq_khz > 45 * ONE_GHZ_IN_KHZ ?
|
||||||
|
10 * ONE_GHZ_IN_KHZ : 2 * ONE_GHZ_IN_KHZ;
|
||||||
|
if (abs(freq_khz - freq_range->start_freq_khz) <= limit)
|
||||||
return true;
|
return true;
|
||||||
if (abs(freq_khz - freq_range->end_freq_khz) <= (2 * ONE_GHZ_IN_KHZ))
|
if (abs(freq_khz - freq_range->end_freq_khz) <= limit)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
#undef ONE_GHZ_IN_KHZ
|
#undef ONE_GHZ_IN_KHZ
|
||||||
|
@ -2193,7 +2202,6 @@ static void print_regdomain_info(const struct ieee80211_regdomain *rd)
|
||||||
static int __set_regdom(const struct ieee80211_regdomain *rd)
|
static int __set_regdom(const struct ieee80211_regdomain *rd)
|
||||||
{
|
{
|
||||||
const struct ieee80211_regdomain *intersected_rd = NULL;
|
const struct ieee80211_regdomain *intersected_rd = NULL;
|
||||||
struct cfg80211_registered_device *rdev = NULL;
|
|
||||||
struct wiphy *request_wiphy;
|
struct wiphy *request_wiphy;
|
||||||
/* Some basic sanity checks first */
|
/* Some basic sanity checks first */
|
||||||
|
|
||||||
|
@ -2305,24 +2313,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!intersected_rd)
|
return -EINVAL;
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
rdev = wiphy_to_dev(request_wiphy);
|
|
||||||
|
|
||||||
rdev->country_ie_alpha2[0] = rd->alpha2[0];
|
|
||||||
rdev->country_ie_alpha2[1] = rd->alpha2[1];
|
|
||||||
rdev->env = last_request->country_ie_env;
|
|
||||||
|
|
||||||
BUG_ON(intersected_rd == rd);
|
|
||||||
|
|
||||||
kfree(rd);
|
|
||||||
rd = NULL;
|
|
||||||
|
|
||||||
reset_regdomains(false);
|
|
||||||
cfg80211_regdomain = intersected_rd;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue