Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem
Conflicts: drivers/net/wireless/iwlwifi/iwl-core.c drivers/net/wireless/rt2x00/rt2x00queue.c drivers/net/wireless/rt2x00/rt2x00queue.h
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include <linux/ieee80211.h>
|
||||
#include <net/cfg80211.h>
|
||||
#include "nl80211.h"
|
||||
#include "core.h"
|
||||
|
||||
/* Default values, timeouts in ms */
|
||||
@@ -53,8 +54,9 @@ const struct mesh_config default_mesh_config = {
|
||||
const struct mesh_setup default_mesh_setup = {
|
||||
.path_sel_proto = IEEE80211_PATH_PROTOCOL_HWMP,
|
||||
.path_metric = IEEE80211_PATH_METRIC_AIRTIME,
|
||||
.vendor_ie = NULL,
|
||||
.vendor_ie_len = 0,
|
||||
.ie = NULL,
|
||||
.ie_len = 0,
|
||||
.is_secure = false,
|
||||
};
|
||||
|
||||
int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
|
||||
@@ -72,6 +74,10 @@ int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
|
||||
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!(rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
|
||||
setup->is_secure)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (wdev->mesh_id_len)
|
||||
return -EALREADY;
|
||||
|
||||
@@ -105,6 +111,19 @@ int cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
|
||||
return err;
|
||||
}
|
||||
|
||||
void cfg80211_notify_new_peer_candidate(struct net_device *dev,
|
||||
const u8 *macaddr, const u8* ie, u8 ie_len, gfp_t gfp)
|
||||
{
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
|
||||
if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
|
||||
return;
|
||||
|
||||
nl80211_send_new_peer_candidate(wiphy_to_dev(wdev->wiphy), dev,
|
||||
macaddr, ie, ie_len, gfp);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
|
||||
|
||||
static int __cfg80211_leave_mesh(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev)
|
||||
{
|
||||
|
@@ -124,6 +124,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
|
||||
[NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 },
|
||||
|
||||
[NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED },
|
||||
[NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG },
|
||||
|
||||
[NL80211_ATTR_HT_CAPABILITY] = { .type = NLA_BINARY,
|
||||
.len = NL80211_HT_CAPABILITY_LEN },
|
||||
@@ -594,6 +595,8 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
|
||||
|
||||
if (dev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)
|
||||
NLA_PUT_FLAG(msg, NL80211_ATTR_SUPPORT_IBSS_RSN);
|
||||
if (dev->wiphy.flags & WIPHY_FLAG_MESH_AUTH)
|
||||
NLA_PUT_FLAG(msg, NL80211_ATTR_SUPPORT_MESH_AUTH);
|
||||
|
||||
NLA_PUT(msg, NL80211_ATTR_CIPHER_SUITES,
|
||||
sizeof(u32) * dev->wiphy.n_cipher_suites,
|
||||
@@ -1922,6 +1925,7 @@ static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
|
||||
[NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
|
||||
[NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
|
||||
[NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
|
||||
[NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG },
|
||||
};
|
||||
|
||||
static int parse_station_flags(struct genl_info *info,
|
||||
@@ -2016,6 +2020,9 @@ static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
|
||||
sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO);
|
||||
if (!sinfoattr)
|
||||
goto nla_put_failure;
|
||||
if (sinfo->filled & STATION_INFO_CONNECTED_TIME)
|
||||
NLA_PUT_U32(msg, NL80211_STA_INFO_CONNECTED_TIME,
|
||||
sinfo->connected_time);
|
||||
if (sinfo->filled & STATION_INFO_INACTIVE_TIME)
|
||||
NLA_PUT_U32(msg, NL80211_STA_INFO_INACTIVE_TIME,
|
||||
sinfo->inactive_time);
|
||||
@@ -2281,7 +2288,9 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
|
||||
err = -EINVAL;
|
||||
if (params.supported_rates)
|
||||
err = -EINVAL;
|
||||
if (params.sta_flags_mask)
|
||||
if (params.sta_flags_mask &
|
||||
~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
|
||||
BIT(NL80211_STA_FLAG_AUTHORIZED)))
|
||||
err = -EINVAL;
|
||||
break;
|
||||
default:
|
||||
@@ -2343,11 +2352,16 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
|
||||
params.ht_capa =
|
||||
nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
|
||||
|
||||
if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
|
||||
params.plink_action =
|
||||
nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
|
||||
|
||||
if (parse_station_flags(info, ¶ms))
|
||||
return -EINVAL;
|
||||
|
||||
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
|
||||
dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
|
||||
dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
|
||||
dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -2823,7 +2837,8 @@ static const struct nla_policy
|
||||
nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
|
||||
[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
|
||||
[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
|
||||
[NL80211_MESH_SETUP_VENDOR_PATH_SEL_IE] = { .type = NLA_BINARY,
|
||||
[NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
|
||||
[NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY,
|
||||
.len = IEEE80211_MAX_DATA_LEN },
|
||||
};
|
||||
|
||||
@@ -2925,14 +2940,16 @@ static int nl80211_parse_mesh_setup(struct genl_info *info,
|
||||
IEEE80211_PATH_METRIC_VENDOR :
|
||||
IEEE80211_PATH_METRIC_AIRTIME;
|
||||
|
||||
if (tb[NL80211_MESH_SETUP_VENDOR_PATH_SEL_IE]) {
|
||||
|
||||
if (tb[NL80211_MESH_SETUP_IE]) {
|
||||
struct nlattr *ieattr =
|
||||
tb[NL80211_MESH_SETUP_VENDOR_PATH_SEL_IE];
|
||||
tb[NL80211_MESH_SETUP_IE];
|
||||
if (!is_valid_ie_attr(ieattr))
|
||||
return -EINVAL;
|
||||
setup->vendor_ie = nla_data(ieattr);
|
||||
setup->vendor_ie_len = nla_len(ieattr);
|
||||
setup->ie = nla_data(ieattr);
|
||||
setup->ie_len = nla_len(ieattr);
|
||||
}
|
||||
setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -5804,6 +5821,44 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
|
||||
nlmsg_free(msg);
|
||||
}
|
||||
|
||||
void nl80211_send_new_peer_candidate(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev,
|
||||
const u8 *macaddr, const u8* ie, u8 ie_len,
|
||||
gfp_t gfp)
|
||||
{
|
||||
struct sk_buff *msg;
|
||||
void *hdr;
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
|
||||
if (!msg)
|
||||
return;
|
||||
|
||||
hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
|
||||
if (!hdr) {
|
||||
nlmsg_free(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
|
||||
NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
|
||||
NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, macaddr);
|
||||
if (ie_len && ie)
|
||||
NLA_PUT(msg, NL80211_ATTR_IE, ie_len , ie);
|
||||
|
||||
if (genlmsg_end(msg, hdr) < 0) {
|
||||
nlmsg_free(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
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_michael_mic_failure(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, const u8 *addr,
|
||||
enum nl80211_key_type key_type, int key_id,
|
||||
|
@@ -50,6 +50,10 @@ 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);
|
||||
|
||||
void nl80211_send_new_peer_candidate(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev,
|
||||
const u8 *macaddr, const u8* ie, u8 ie_len,
|
||||
gfp_t gfp);
|
||||
void
|
||||
nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, const u8 *addr,
|
||||
|
Reference in New Issue
Block a user