Merge tag 'mac80211-next-for-davem-2017-10-11' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Johannes Berg says: ==================== Work continues in various areas: * port authorized event for 4-way-HS offload (Avi) * enable MFP optional for such devices (Emmanuel) * Kees's timer setup patch for mac80211 mesh (the part that isn't trivially scripted) * improve VLAN vs. TXQ handling (myself) * load regulatory database as firmware file (myself) * with various other small improvements and cleanups I merged net-next once in the meantime to allow Kees's timer setup patch to go in. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -2130,6 +2130,15 @@ static int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
|
||||
case NL80211_CHAN_HT40MINUS:
|
||||
cfg80211_chandef_create(chandef, chandef->chan,
|
||||
chantype);
|
||||
/* user input for center_freq is incorrect */
|
||||
if (info->attrs[NL80211_ATTR_CENTER_FREQ1] &&
|
||||
chandef->center_freq1 != nla_get_u32(
|
||||
info->attrs[NL80211_ATTR_CENTER_FREQ1]))
|
||||
return -EINVAL;
|
||||
/* center_freq2 must be zero */
|
||||
if (info->attrs[NL80211_ATTR_CENTER_FREQ2] &&
|
||||
nla_get_u32(info->attrs[NL80211_ATTR_CENTER_FREQ2]))
|
||||
return -EINVAL;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -5677,6 +5686,11 @@ static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
return reg_reload_regdb();
|
||||
}
|
||||
|
||||
static int nl80211_get_mesh_config(struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
{
|
||||
@@ -6618,6 +6632,77 @@ static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev)
|
||||
return regulatory_pre_cac_allowed(wdev->wiphy);
|
||||
}
|
||||
|
||||
static int
|
||||
nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
void *request, struct nlattr **attrs,
|
||||
bool is_sched_scan)
|
||||
{
|
||||
u8 *mac_addr, *mac_addr_mask;
|
||||
u32 *flags;
|
||||
enum nl80211_feature_flags randomness_flag;
|
||||
|
||||
if (!attrs[NL80211_ATTR_SCAN_FLAGS])
|
||||
return 0;
|
||||
|
||||
if (is_sched_scan) {
|
||||
struct cfg80211_sched_scan_request *req = request;
|
||||
|
||||
randomness_flag = wdev ?
|
||||
NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR :
|
||||
NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
|
||||
flags = &req->flags;
|
||||
mac_addr = req->mac_addr;
|
||||
mac_addr_mask = req->mac_addr_mask;
|
||||
} else {
|
||||
struct cfg80211_scan_request *req = request;
|
||||
|
||||
randomness_flag = NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
|
||||
flags = &req->flags;
|
||||
mac_addr = req->mac_addr;
|
||||
mac_addr_mask = req->mac_addr_mask;
|
||||
}
|
||||
|
||||
*flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]);
|
||||
|
||||
if ((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
|
||||
!(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
|
||||
int err;
|
||||
|
||||
if (!(wiphy->features & randomness_flag) ||
|
||||
(wdev && wdev->current_bss))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if ((*flags & NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME) &&
|
||||
!wiphy_ext_feature_isset(wiphy,
|
||||
NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if ((*flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP) &&
|
||||
!wiphy_ext_feature_isset(wiphy,
|
||||
NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if ((*flags & NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) &&
|
||||
!wiphy_ext_feature_isset(wiphy,
|
||||
NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if ((*flags & NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE) &&
|
||||
!wiphy_ext_feature_isset(wiphy,
|
||||
NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
@@ -6823,34 +6908,10 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
|
||||
nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]);
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_SCAN_FLAGS]) {
|
||||
request->flags = nla_get_u32(
|
||||
info->attrs[NL80211_ATTR_SCAN_FLAGS]);
|
||||
if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
|
||||
!(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
|
||||
if (!(wiphy->features &
|
||||
NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR)) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (wdev->current_bss) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
err = nl80211_parse_random_mac(info->attrs,
|
||||
request->mac_addr,
|
||||
request->mac_addr_mask);
|
||||
if (err)
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs,
|
||||
false);
|
||||
if (err)
|
||||
goto out_free;
|
||||
|
||||
request->no_cck =
|
||||
nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
|
||||
@@ -7298,37 +7359,9 @@ nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
request->ie_len);
|
||||
}
|
||||
|
||||
if (attrs[NL80211_ATTR_SCAN_FLAGS]) {
|
||||
request->flags = nla_get_u32(
|
||||
attrs[NL80211_ATTR_SCAN_FLAGS]);
|
||||
if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
|
||||
!(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
|
||||
u32 flg = NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR;
|
||||
|
||||
if (!wdev) /* must be net-detect */
|
||||
flg = NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
|
||||
|
||||
if (!(wiphy->features & flg)) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (wdev && wdev->current_bss) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
err = nl80211_parse_random_mac(attrs, request->mac_addr,
|
||||
request->mac_addr_mask);
|
||||
if (err)
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
err = nl80211_check_scan_flags(wiphy, wdev, request, attrs, true);
|
||||
if (err)
|
||||
goto out_free;
|
||||
|
||||
if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY])
|
||||
request->delay =
|
||||
@@ -8932,8 +8965,14 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
if (info->attrs[NL80211_ATTR_USE_MFP]) {
|
||||
connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
|
||||
if (connect.mfp == NL80211_MFP_OPTIONAL &&
|
||||
!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_MFP_OPTIONAL))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (connect.mfp != NL80211_MFP_REQUIRED &&
|
||||
connect.mfp != NL80211_MFP_NO)
|
||||
connect.mfp != NL80211_MFP_NO &&
|
||||
connect.mfp != NL80211_MFP_OPTIONAL)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
connect.mfp = NL80211_MFP_NO;
|
||||
@@ -12684,6 +12723,12 @@ static const struct genl_ops nl80211_ops[] = {
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
},
|
||||
{
|
||||
.cmd = NL80211_CMD_RELOAD_REGDB,
|
||||
.doit = nl80211_reload_regdb,
|
||||
.policy = nl80211_policy,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
},
|
||||
{
|
||||
.cmd = NL80211_CMD_GET_MESH_CONFIG,
|
||||
.doit = nl80211_get_mesh_config,
|
||||
@@ -13812,9 +13857,7 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
|
||||
info->req_ie)) ||
|
||||
(info->resp_ie &&
|
||||
nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len,
|
||||
info->resp_ie)) ||
|
||||
(info->authorized &&
|
||||
nla_put_flag(msg, NL80211_ATTR_PORT_AUTHORIZED)))
|
||||
info->resp_ie)))
|
||||
goto nla_put_failure;
|
||||
|
||||
genlmsg_end(msg, hdr);
|
||||
@@ -13828,6 +13871,36 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
|
||||
nlmsg_free(msg);
|
||||
}
|
||||
|
||||
void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, const u8 *bssid)
|
||||
{
|
||||
struct sk_buff *msg;
|
||||
void *hdr;
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
||||
if (!msg)
|
||||
return;
|
||||
|
||||
hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED);
|
||||
if (!hdr) {
|
||||
nlmsg_free(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
|
||||
goto nla_put_failure;
|
||||
|
||||
genlmsg_end(msg, hdr);
|
||||
|
||||
genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
|
||||
NL80211_MCGRP_MLME, GFP_KERNEL);
|
||||
return;
|
||||
|
||||
nla_put_failure:
|
||||
genlmsg_cancel(msg, hdr);
|
||||
nlmsg_free(msg);
|
||||
}
|
||||
|
||||
void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, u16 reason,
|
||||
const u8 *ie, size_t ie_len, bool from_ap)
|
||||
|
Reference in New Issue
Block a user