Merge branch 'master' into for-davem
Conflicts: drivers/net/wireless/iwlwifi/iwl-testmode.c net/wireless/nl80211.c
This commit is contained in:
@@ -708,6 +708,10 @@ void wiphy_unregister(struct wiphy *wiphy)
|
||||
flush_work(&rdev->scan_done_wk);
|
||||
cancel_work_sync(&rdev->conn_work);
|
||||
flush_work(&rdev->event_work);
|
||||
|
||||
if (rdev->wowlan && rdev->ops->set_wakeup)
|
||||
rdev->ops->set_wakeup(&rdev->wiphy, false);
|
||||
cfg80211_rdev_free_wowlan(rdev);
|
||||
}
|
||||
EXPORT_SYMBOL(wiphy_unregister);
|
||||
|
||||
@@ -720,7 +724,6 @@ void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
|
||||
mutex_destroy(&rdev->sched_scan_mtx);
|
||||
list_for_each_entry_safe(scan, tmp, &rdev->bss_list, list)
|
||||
cfg80211_put_bss(&scan->pub);
|
||||
cfg80211_rdev_free_wowlan(rdev);
|
||||
kfree(rdev);
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
#define MESH_MAX_PREQ_RETRIES 4
|
||||
|
||||
#define MESH_SYNC_NEIGHBOR_OFFSET_MAX 50
|
||||
|
||||
const struct mesh_config default_mesh_config = {
|
||||
.dot11MeshRetryTimeout = MESH_RET_T,
|
||||
@@ -48,6 +49,7 @@ const struct mesh_config default_mesh_config = {
|
||||
.element_ttl = MESH_DEFAULT_ELEMENT_TTL,
|
||||
.auto_open_plinks = true,
|
||||
.dot11MeshMaxPeerLinks = MESH_MAX_ESTAB_PLINKS,
|
||||
.dot11MeshNbrOffsetMaxNeighbor = MESH_SYNC_NEIGHBOR_OFFSET_MAX,
|
||||
.dot11MeshHWMPactivePathTimeout = MESH_PATH_TIMEOUT,
|
||||
.dot11MeshHWMPpreqMinInterval = MESH_PREQ_MIN_INT,
|
||||
.dot11MeshHWMPperrMinInterval = MESH_PERR_MIN_INT,
|
||||
@@ -62,6 +64,7 @@ const struct mesh_config default_mesh_config = {
|
||||
};
|
||||
|
||||
const struct mesh_setup default_mesh_setup = {
|
||||
.sync_method = IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET,
|
||||
.path_sel_proto = IEEE80211_PATH_PROTOCOL_HWMP,
|
||||
.path_metric = IEEE80211_PATH_METRIC_AIRTIME,
|
||||
.ie = NULL,
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/nl80211.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -100,7 +101,7 @@ void __cfg80211_send_deauth(struct net_device *dev,
|
||||
ASSERT_WDEV_LOCK(wdev);
|
||||
|
||||
if (wdev->current_bss &&
|
||||
memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) {
|
||||
compare_ether_addr(wdev->current_bss->pub.bssid, bssid) == 0) {
|
||||
cfg80211_unhold_bss(wdev->current_bss);
|
||||
cfg80211_put_bss(&wdev->current_bss->pub);
|
||||
wdev->current_bss = NULL;
|
||||
@@ -115,7 +116,7 @@ void __cfg80211_send_deauth(struct net_device *dev,
|
||||
|
||||
reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
|
||||
|
||||
from_ap = memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 0;
|
||||
from_ap = compare_ether_addr(mgmt->sa, dev->dev_addr) != 0;
|
||||
__cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap);
|
||||
} else if (wdev->sme_state == CFG80211_SME_CONNECTING) {
|
||||
__cfg80211_connect_result(dev, mgmt->bssid, NULL, 0, NULL, 0,
|
||||
@@ -154,7 +155,7 @@ void __cfg80211_send_disassoc(struct net_device *dev,
|
||||
return;
|
||||
|
||||
if (wdev->current_bss &&
|
||||
memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) {
|
||||
compare_ether_addr(wdev->current_bss->pub.bssid, bssid) == 0) {
|
||||
cfg80211_sme_disassoc(dev, wdev->current_bss);
|
||||
cfg80211_unhold_bss(wdev->current_bss);
|
||||
cfg80211_put_bss(&wdev->current_bss->pub);
|
||||
@@ -165,7 +166,7 @@ void __cfg80211_send_disassoc(struct net_device *dev,
|
||||
|
||||
reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
|
||||
|
||||
from_ap = memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 0;
|
||||
from_ap = compare_ether_addr(mgmt->sa, dev->dev_addr) != 0;
|
||||
__cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap);
|
||||
}
|
||||
EXPORT_SYMBOL(__cfg80211_send_disassoc);
|
||||
@@ -285,7 +286,7 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
|
||||
return -EINVAL;
|
||||
|
||||
if (wdev->current_bss &&
|
||||
memcmp(bssid, wdev->current_bss->pub.bssid, ETH_ALEN) == 0)
|
||||
compare_ether_addr(bssid, wdev->current_bss->pub.bssid) == 0)
|
||||
return -EALREADY;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
@@ -362,7 +363,7 @@ int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
if (wdev->current_bss && prev_bssid &&
|
||||
memcmp(wdev->current_bss->pub.bssid, prev_bssid, ETH_ALEN) == 0) {
|
||||
compare_ether_addr(wdev->current_bss->pub.bssid, prev_bssid) == 0) {
|
||||
/*
|
||||
* Trying to reassociate: Allow this to proceed and let the old
|
||||
* association to be dropped when the new one is completed.
|
||||
@@ -446,7 +447,8 @@ int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
|
||||
|
||||
if (local_state_change) {
|
||||
if (wdev->current_bss &&
|
||||
memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) {
|
||||
compare_ether_addr(wdev->current_bss->pub.bssid, bssid)
|
||||
== 0) {
|
||||
cfg80211_unhold_bss(wdev->current_bss);
|
||||
cfg80211_put_bss(&wdev->current_bss->pub);
|
||||
wdev->current_bss = NULL;
|
||||
@@ -495,7 +497,7 @@ static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
|
||||
req.local_state_change = local_state_change;
|
||||
req.ie = ie;
|
||||
req.ie_len = ie_len;
|
||||
if (memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0)
|
||||
if (compare_ether_addr(wdev->current_bss->pub.bssid, bssid) == 0)
|
||||
req.bss = &wdev->current_bss->pub;
|
||||
else
|
||||
return -ENOTCONN;
|
||||
@@ -758,8 +760,8 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
|
||||
break;
|
||||
}
|
||||
|
||||
if (memcmp(wdev->current_bss->pub.bssid,
|
||||
mgmt->bssid, ETH_ALEN)) {
|
||||
if (compare_ether_addr(wdev->current_bss->pub.bssid,
|
||||
mgmt->bssid)) {
|
||||
err = -ENOTCONN;
|
||||
break;
|
||||
}
|
||||
@@ -772,8 +774,8 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
|
||||
break;
|
||||
|
||||
/* for station, check that DA is the AP */
|
||||
if (memcmp(wdev->current_bss->pub.bssid,
|
||||
mgmt->da, ETH_ALEN)) {
|
||||
if (compare_ether_addr(wdev->current_bss->pub.bssid,
|
||||
mgmt->da)) {
|
||||
err = -ENOTCONN;
|
||||
break;
|
||||
}
|
||||
@@ -781,11 +783,11 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
|
||||
case NL80211_IFTYPE_AP:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
if (memcmp(mgmt->bssid, dev->dev_addr, ETH_ALEN))
|
||||
if (compare_ether_addr(mgmt->bssid, dev->dev_addr))
|
||||
err = -EINVAL;
|
||||
break;
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
if (memcmp(mgmt->sa, mgmt->bssid, ETH_ALEN)) {
|
||||
if (compare_ether_addr(mgmt->sa, mgmt->bssid)) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
||||
@@ -804,7 +806,7 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
|
||||
return err;
|
||||
}
|
||||
|
||||
if (memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 0)
|
||||
if (compare_ether_addr(mgmt->sa, dev->dev_addr) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
/* Transmit the Action frame as requested by user space */
|
||||
@@ -928,6 +930,33 @@ void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
|
||||
|
||||
void cfg80211_ch_switch_notify(struct net_device *dev, int freq,
|
||||
enum nl80211_channel_type type)
|
||||
{
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
struct wiphy *wiphy = wdev->wiphy;
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
||||
struct ieee80211_channel *chan;
|
||||
|
||||
wdev_lock(wdev);
|
||||
|
||||
if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
|
||||
wdev->iftype != NL80211_IFTYPE_P2P_GO))
|
||||
goto out;
|
||||
|
||||
chan = rdev_freq_to_chan(rdev, freq, type);
|
||||
if (WARN_ON(!chan))
|
||||
goto out;
|
||||
|
||||
wdev->channel = chan;
|
||||
|
||||
nl80211_ch_switch_notify(rdev, dev, freq, type, GFP_KERNEL);
|
||||
out:
|
||||
wdev_unlock(wdev);
|
||||
return;
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_ch_switch_notify);
|
||||
|
||||
bool cfg80211_rx_spurious_frame(struct net_device *dev,
|
||||
const u8 *addr, gfp_t gfp)
|
||||
{
|
||||
|
||||
@@ -1142,17 +1142,20 @@ static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
|
||||
static int parse_txq_params(struct nlattr *tb[],
|
||||
struct ieee80211_txq_params *txq_params)
|
||||
{
|
||||
if (!tb[NL80211_TXQ_ATTR_QUEUE] || !tb[NL80211_TXQ_ATTR_TXOP] ||
|
||||
if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] ||
|
||||
!tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
|
||||
!tb[NL80211_TXQ_ATTR_AIFS])
|
||||
return -EINVAL;
|
||||
|
||||
txq_params->queue = nla_get_u8(tb[NL80211_TXQ_ATTR_QUEUE]);
|
||||
txq_params->ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]);
|
||||
txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
|
||||
txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
|
||||
txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
|
||||
txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
|
||||
|
||||
if (txq_params->ac >= NL80211_NUM_ACS)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1332,6 +1335,11 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
|
||||
goto bad_res;
|
||||
}
|
||||
|
||||
if (!netif_running(netdev)) {
|
||||
result = -ENETDOWN;
|
||||
goto bad_res;
|
||||
}
|
||||
|
||||
nla_for_each_nested(nl_txq_params,
|
||||
info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
|
||||
rem_txq_params) {
|
||||
@@ -2540,6 +2548,10 @@ static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
|
||||
sizeof(struct nl80211_sta_flag_update),
|
||||
&sinfo->sta_flags))
|
||||
goto nla_put_failure;
|
||||
if ((sinfo->filled & STATION_INFO_T_OFFSET) &&
|
||||
nla_put_u64(msg, NL80211_STA_INFO_T_OFFSET,
|
||||
sinfo->t_offset))
|
||||
goto nla_put_failure;
|
||||
nla_nest_end(msg, sinfoattr);
|
||||
|
||||
if ((sinfo->filled & STATION_INFO_ASSOC_REQ_IES) &&
|
||||
@@ -3340,6 +3352,8 @@ static int nl80211_get_mesh_config(struct sk_buff *skb,
|
||||
cur_params.element_ttl) ||
|
||||
nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
|
||||
cur_params.auto_open_plinks) ||
|
||||
nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
|
||||
cur_params.dot11MeshNbrOffsetMaxNeighbor) ||
|
||||
nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
|
||||
cur_params.dot11MeshHWMPmaxPREQretries) ||
|
||||
nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
|
||||
@@ -3385,6 +3399,7 @@ static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_A
|
||||
[NL80211_MESHCONF_TTL] = { .type = NLA_U8 },
|
||||
[NL80211_MESHCONF_ELEMENT_TTL] = { .type = NLA_U8 },
|
||||
[NL80211_MESHCONF_AUTO_OPEN_PLINKS] = { .type = NLA_U8 },
|
||||
[NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = { .type = NLA_U32 },
|
||||
|
||||
[NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
|
||||
[NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
|
||||
@@ -3402,6 +3417,7 @@ static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_A
|
||||
|
||||
static const struct nla_policy
|
||||
nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
|
||||
[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 },
|
||||
[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
|
||||
[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
|
||||
[NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
|
||||
@@ -3454,6 +3470,9 @@ do {\
|
||||
mask, NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8);
|
||||
FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks,
|
||||
mask, NL80211_MESHCONF_AUTO_OPEN_PLINKS, nla_get_u8);
|
||||
FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor,
|
||||
mask, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
|
||||
nla_get_u32);
|
||||
FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries,
|
||||
mask, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
|
||||
nla_get_u8);
|
||||
@@ -3511,6 +3530,12 @@ static int nl80211_parse_mesh_setup(struct genl_info *info,
|
||||
nl80211_mesh_setup_params_policy))
|
||||
return -EINVAL;
|
||||
|
||||
if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])
|
||||
setup->sync_method =
|
||||
(nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ?
|
||||
IEEE80211_SYNC_METHOD_VENDOR :
|
||||
IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET;
|
||||
|
||||
if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])
|
||||
setup->path_sel_proto =
|
||||
(nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ?
|
||||
@@ -6077,6 +6102,7 @@ static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
|
||||
struct cfg80211_wowlan new_triggers = {};
|
||||
struct wiphy_wowlan_support *wowlan = &rdev->wiphy.wowlan;
|
||||
int err, i;
|
||||
bool prev_enabled = rdev->wowlan;
|
||||
|
||||
if (!rdev->wiphy.wowlan.flags && !rdev->wiphy.wowlan.n_patterns)
|
||||
return -EOPNOTSUPP;
|
||||
@@ -6209,6 +6235,9 @@ static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
|
||||
rdev->wowlan = NULL;
|
||||
}
|
||||
|
||||
if (rdev->ops->set_wakeup && prev_enabled != !!rdev->wowlan)
|
||||
rdev->ops->set_wakeup(&rdev->wiphy, rdev->wowlan);
|
||||
|
||||
return 0;
|
||||
error:
|
||||
for (i = 0; i < new_triggers.n_patterns; i++)
|
||||
@@ -6467,7 +6496,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.doit = nl80211_get_key,
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6499,7 +6528,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.doit = nl80211_set_beacon,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6507,7 +6536,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.doit = nl80211_start_ap,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6515,7 +6544,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.doit = nl80211_stop_ap,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6531,7 +6560,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.doit = nl80211_set_station,
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6547,7 +6576,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.doit = nl80211_del_station,
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6580,7 +6609,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.doit = nl80211_del_mpath,
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6588,7 +6617,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.doit = nl80211_set_bss,
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6614,7 +6643,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.doit = nl80211_get_mesh_config,
|
||||
.policy = nl80211_policy,
|
||||
/* can be retrieved by unprivileged users */
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6747,7 +6776,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.doit = nl80211_setdel_pmksa,
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6755,7 +6784,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.doit = nl80211_setdel_pmksa,
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6763,7 +6792,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.doit = nl80211_flush_pmksa,
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -6923,7 +6952,7 @@ static struct genl_ops nl80211_ops[] = {
|
||||
.doit = nl80211_probe_client,
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
@@ -8012,6 +8041,39 @@ void nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
|
||||
nlmsg_free(msg);
|
||||
}
|
||||
|
||||
void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, int freq,
|
||||
enum nl80211_channel_type type, 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_CH_SWITCH_NOTIFY);
|
||||
if (!hdr) {
|
||||
nlmsg_free(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
|
||||
nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
|
||||
nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, type))
|
||||
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);
|
||||
}
|
||||
|
||||
void
|
||||
nl80211_send_cqm_pktloss_notify(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, const u8 *peer,
|
||||
|
||||
@@ -118,6 +118,10 @@ void nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, int index,
|
||||
const u8 *bssid, bool preauth, gfp_t gfp);
|
||||
|
||||
void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev, int freq,
|
||||
enum nl80211_channel_type type, gfp_t gfp);
|
||||
|
||||
bool nl80211_unexpected_frame(struct net_device *dev,
|
||||
const u8 *addr, gfp_t gfp);
|
||||
bool nl80211_unexpected_4addr_frame(struct net_device *dev,
|
||||
|
||||
@@ -388,7 +388,15 @@ static void reg_regdb_query(const char *alpha2)
|
||||
|
||||
schedule_work(®_regdb_work);
|
||||
}
|
||||
|
||||
/* Feel free to add any other sanity checks here */
|
||||
static void reg_regdb_size_check(void)
|
||||
{
|
||||
/* We should ideally BUILD_BUG_ON() but then random builds would fail */
|
||||
WARN_ONCE(!reg_regdb_size, "db.txt is empty, you should update it...");
|
||||
}
|
||||
#else
|
||||
static inline void reg_regdb_size_check(void) {}
|
||||
static inline void reg_regdb_query(const char *alpha2) {}
|
||||
#endif /* CONFIG_CFG80211_INTERNAL_REGDB */
|
||||
|
||||
@@ -2322,6 +2330,8 @@ int __init regulatory_init(void)
|
||||
spin_lock_init(®_requests_lock);
|
||||
spin_lock_init(®_pending_beacons_lock);
|
||||
|
||||
reg_regdb_size_check();
|
||||
|
||||
cfg80211_regdomain = cfg80211_world_regdom;
|
||||
|
||||
user_alpha2[0] = '9';
|
||||
|
||||
@@ -378,7 +378,7 @@ static int cmp_bss_core(struct cfg80211_bss *a,
|
||||
b->len_information_elements);
|
||||
}
|
||||
|
||||
return memcmp(a->bssid, b->bssid, ETH_ALEN);
|
||||
return compare_ether_addr(a->bssid, b->bssid);
|
||||
}
|
||||
|
||||
static int cmp_bss(struct cfg80211_bss *a,
|
||||
|
||||
@@ -781,8 +781,10 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd,
|
||||
if (cmd == SIOCSIWENCODEEXT) {
|
||||
struct iw_encode_ext *ee = (void *) extra;
|
||||
|
||||
if (iwp->length < sizeof(*ee) + ee->key_len)
|
||||
return -EFAULT;
|
||||
if (iwp->length < sizeof(*ee) + ee->key_len) {
|
||||
err = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user