|
@@ -1731,21 +1731,25 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
|
|
|
|
|
|
static int nl80211_send_iface(struct sk_buff *msg, u32 pid, u32 seq, int flags,
|
|
|
struct cfg80211_registered_device *rdev,
|
|
|
- struct net_device *dev)
|
|
|
+ struct wireless_dev *wdev)
|
|
|
{
|
|
|
+ struct net_device *dev = wdev->netdev;
|
|
|
void *hdr;
|
|
|
- u64 wdev_id = (u64)dev->ieee80211_ptr->identifier |
|
|
|
+ u64 wdev_id = (u64)wdev->identifier |
|
|
|
((u64)rdev->wiphy_idx << 32);
|
|
|
|
|
|
hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_INTERFACE);
|
|
|
if (!hdr)
|
|
|
return -1;
|
|
|
|
|
|
- if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
|
|
|
- nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
|
|
|
- nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name) ||
|
|
|
- nla_put_u32(msg, NL80211_ATTR_IFTYPE,
|
|
|
- dev->ieee80211_ptr->iftype) ||
|
|
|
+ if (dev &&
|
|
|
+ (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
|
|
|
+ nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name) ||
|
|
|
+ nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dev->dev_addr)))
|
|
|
+ goto nla_put_failure;
|
|
|
+
|
|
|
+ if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
|
|
|
+ nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) ||
|
|
|
nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id) ||
|
|
|
nla_put_u32(msg, NL80211_ATTR_GENERATION,
|
|
|
rdev->devlist_generation ^
|
|
@@ -1794,7 +1798,7 @@ static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *
|
|
|
}
|
|
|
if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).pid,
|
|
|
cb->nlh->nlmsg_seq, NLM_F_MULTI,
|
|
|
- rdev, wdev->netdev) < 0) {
|
|
|
+ rdev, wdev) < 0) {
|
|
|
mutex_unlock(&rdev->devlist_mtx);
|
|
|
goto out;
|
|
|
}
|
|
@@ -1817,14 +1821,14 @@ static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
|
|
|
{
|
|
|
struct sk_buff *msg;
|
|
|
struct cfg80211_registered_device *dev = info->user_ptr[0];
|
|
|
- struct net_device *netdev = info->user_ptr[1];
|
|
|
+ struct wireless_dev *wdev = info->user_ptr[1];
|
|
|
|
|
|
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
|
|
if (!msg)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
if (nl80211_send_iface(msg, info->snd_pid, info->snd_seq, 0,
|
|
|
- dev, netdev) < 0) {
|
|
|
+ dev, wdev) < 0) {
|
|
|
nlmsg_free(msg);
|
|
|
return -ENOBUFS;
|
|
|
}
|
|
@@ -6833,7 +6837,7 @@ static struct genl_ops nl80211_ops[] = {
|
|
|
.dumpit = nl80211_dump_interface,
|
|
|
.policy = nl80211_policy,
|
|
|
/* can be retrieved by unprivileged users */
|
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV,
|
|
|
},
|
|
|
{
|
|
|
.cmd = NL80211_CMD_SET_INTERFACE,
|