aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
authorDavid Spinadel <david.spinadel@intel.com>2013-07-31 11:04:15 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-08-12 08:11:37 -0400
commitfc73f11f5fa230f8c687d51b0fddb00433092ce0 (patch)
treef1c2e5c855a97dd4039b3df2a0b8cde96744898f /net/wireless
parentaf61a165187bb94b1dc7628ef815c23d0eacf40b (diff)
cfg80211: add wdev to testmode cmd
To allow drivers to implement per-interface testmode operations more easily, pass a wdev pointer if any identification for one was given from userspace. Clean up the code a bit while at it. Signed-off-by: David Spinadel <david.spinadel@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/nl80211.c23
-rw-r--r--net/wireless/rdev-ops.h5
-rw-r--r--net/wireless/trace.h8
3 files changed, 25 insertions, 11 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index c2a40a2e56bd..334697de5cc0 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -6591,19 +6591,30 @@ static struct genl_multicast_group nl80211_testmode_mcgrp = {
6591static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 6591static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
6592{ 6592{
6593 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6593 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6594 struct wireless_dev *wdev =
6595 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
6594 int err; 6596 int err;
6595 6597
6598 if (!rdev->ops->testmode_cmd)
6599 return -EOPNOTSUPP;
6600
6601 if (IS_ERR(wdev)) {
6602 err = PTR_ERR(wdev);
6603 if (err != -EINVAL)
6604 return err;
6605 wdev = NULL;
6606 } else if (wdev->wiphy != &rdev->wiphy) {
6607 return -EINVAL;
6608 }
6609
6596 if (!info->attrs[NL80211_ATTR_TESTDATA]) 6610 if (!info->attrs[NL80211_ATTR_TESTDATA])
6597 return -EINVAL; 6611 return -EINVAL;
6598 6612
6599 err = -EOPNOTSUPP; 6613 rdev->testmode_info = info;
6600 if (rdev->ops->testmode_cmd) { 6614 err = rdev_testmode_cmd(rdev, wdev,
6601 rdev->testmode_info = info;
6602 err = rdev_testmode_cmd(rdev,
6603 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 6615 nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
6604 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 6616 nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
6605 rdev->testmode_info = NULL; 6617 rdev->testmode_info = NULL;
6606 }
6607 6618
6608 return err; 6619 return err;
6609} 6620}
diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h
index de870d4d0bcc..37ce9fdfe934 100644
--- a/net/wireless/rdev-ops.h
+++ b/net/wireless/rdev-ops.h
@@ -516,11 +516,12 @@ static inline void rdev_rfkill_poll(struct cfg80211_registered_device *rdev)
516 516
517#ifdef CONFIG_NL80211_TESTMODE 517#ifdef CONFIG_NL80211_TESTMODE
518static inline int rdev_testmode_cmd(struct cfg80211_registered_device *rdev, 518static inline int rdev_testmode_cmd(struct cfg80211_registered_device *rdev,
519 struct wireless_dev *wdev,
519 void *data, int len) 520 void *data, int len)
520{ 521{
521 int ret; 522 int ret;
522 trace_rdev_testmode_cmd(&rdev->wiphy); 523 trace_rdev_testmode_cmd(&rdev->wiphy, wdev);
523 ret = rdev->ops->testmode_cmd(&rdev->wiphy, data, len); 524 ret = rdev->ops->testmode_cmd(&rdev->wiphy, wdev, data, len);
524 trace_rdev_return_int(&rdev->wiphy, ret); 525 trace_rdev_return_int(&rdev->wiphy, ret);
525 return ret; 526 return ret;
526} 527}
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index f0ebdcd394ef..ba5f0d6614d5 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -1293,15 +1293,17 @@ TRACE_EVENT(rdev_return_int_int,
1293 1293
1294#ifdef CONFIG_NL80211_TESTMODE 1294#ifdef CONFIG_NL80211_TESTMODE
1295TRACE_EVENT(rdev_testmode_cmd, 1295TRACE_EVENT(rdev_testmode_cmd,
1296 TP_PROTO(struct wiphy *wiphy), 1296 TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev),
1297 TP_ARGS(wiphy), 1297 TP_ARGS(wiphy, wdev),
1298 TP_STRUCT__entry( 1298 TP_STRUCT__entry(
1299 WIPHY_ENTRY 1299 WIPHY_ENTRY
1300 WDEV_ENTRY
1300 ), 1301 ),
1301 TP_fast_assign( 1302 TP_fast_assign(
1302 WIPHY_ASSIGN; 1303 WIPHY_ASSIGN;
1304 WDEV_ASSIGN;
1303 ), 1305 ),
1304 TP_printk(WIPHY_PR_FMT, WIPHY_PR_ARG) 1306 TP_printk(WIPHY_PR_FMT WDEV_PR_FMT, WIPHY_PR_ARG, WDEV_PR_ARG)
1305); 1307);
1306 1308
1307TRACE_EVENT(rdev_testmode_dump, 1309TRACE_EVENT(rdev_testmode_dump,