diff options
author | John W. Linville <linville@tuxdriver.com> | 2013-08-16 14:24:51 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-08-16 14:24:51 -0400 |
commit | d0746663667f37e7be5646bf68cb452c8375a23d (patch) | |
tree | 85ae5a3d5e5bae53815baba5dba372e4d53a9745 /net/wireless | |
parent | 41caa760d6acaf47cbd44c3d78307fb9be089111 (diff) | |
parent | 27b3eb9c06a7193bdc9800cd00764a130343bc8a (diff) |
Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/nl80211.c | 74 | ||||
-rw-r--r-- | net/wireless/rdev-ops.h | 5 | ||||
-rw-r--r-- | net/wireless/trace.h | 8 |
3 files changed, 49 insertions, 38 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index adf1e98f4c3e..c6164da1c133 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -6593,19 +6593,30 @@ static struct genl_multicast_group nl80211_testmode_mcgrp = { | |||
6593 | static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) | 6593 | static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) |
6594 | { | 6594 | { |
6595 | struct cfg80211_registered_device *rdev = info->user_ptr[0]; | 6595 | struct cfg80211_registered_device *rdev = info->user_ptr[0]; |
6596 | struct wireless_dev *wdev = | ||
6597 | __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); | ||
6596 | int err; | 6598 | int err; |
6597 | 6599 | ||
6600 | if (!rdev->ops->testmode_cmd) | ||
6601 | return -EOPNOTSUPP; | ||
6602 | |||
6603 | if (IS_ERR(wdev)) { | ||
6604 | err = PTR_ERR(wdev); | ||
6605 | if (err != -EINVAL) | ||
6606 | return err; | ||
6607 | wdev = NULL; | ||
6608 | } else if (wdev->wiphy != &rdev->wiphy) { | ||
6609 | return -EINVAL; | ||
6610 | } | ||
6611 | |||
6598 | if (!info->attrs[NL80211_ATTR_TESTDATA]) | 6612 | if (!info->attrs[NL80211_ATTR_TESTDATA]) |
6599 | return -EINVAL; | 6613 | return -EINVAL; |
6600 | 6614 | ||
6601 | err = -EOPNOTSUPP; | 6615 | rdev->testmode_info = info; |
6602 | if (rdev->ops->testmode_cmd) { | 6616 | err = rdev_testmode_cmd(rdev, wdev, |
6603 | rdev->testmode_info = info; | ||
6604 | err = rdev_testmode_cmd(rdev, | ||
6605 | nla_data(info->attrs[NL80211_ATTR_TESTDATA]), | 6617 | nla_data(info->attrs[NL80211_ATTR_TESTDATA]), |
6606 | nla_len(info->attrs[NL80211_ATTR_TESTDATA])); | 6618 | nla_len(info->attrs[NL80211_ATTR_TESTDATA])); |
6607 | rdev->testmode_info = NULL; | 6619 | rdev->testmode_info = NULL; |
6608 | } | ||
6609 | 6620 | ||
6610 | return err; | 6621 | return err; |
6611 | } | 6622 | } |
@@ -7566,14 +7577,12 @@ static int nl80211_set_cqm_txe(struct genl_info *info, | |||
7566 | u32 rate, u32 pkts, u32 intvl) | 7577 | u32 rate, u32 pkts, u32 intvl) |
7567 | { | 7578 | { |
7568 | struct cfg80211_registered_device *rdev = info->user_ptr[0]; | 7579 | struct cfg80211_registered_device *rdev = info->user_ptr[0]; |
7569 | struct wireless_dev *wdev; | ||
7570 | struct net_device *dev = info->user_ptr[1]; | 7580 | struct net_device *dev = info->user_ptr[1]; |
7581 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
7571 | 7582 | ||
7572 | if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) | 7583 | if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) |
7573 | return -EINVAL; | 7584 | return -EINVAL; |
7574 | 7585 | ||
7575 | wdev = dev->ieee80211_ptr; | ||
7576 | |||
7577 | if (!rdev->ops->set_cqm_txe_config) | 7586 | if (!rdev->ops->set_cqm_txe_config) |
7578 | return -EOPNOTSUPP; | 7587 | return -EOPNOTSUPP; |
7579 | 7588 | ||
@@ -7588,13 +7597,15 @@ static int nl80211_set_cqm_rssi(struct genl_info *info, | |||
7588 | s32 threshold, u32 hysteresis) | 7597 | s32 threshold, u32 hysteresis) |
7589 | { | 7598 | { |
7590 | struct cfg80211_registered_device *rdev = info->user_ptr[0]; | 7599 | struct cfg80211_registered_device *rdev = info->user_ptr[0]; |
7591 | struct wireless_dev *wdev; | ||
7592 | struct net_device *dev = info->user_ptr[1]; | 7600 | struct net_device *dev = info->user_ptr[1]; |
7601 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
7593 | 7602 | ||
7594 | if (threshold > 0) | 7603 | if (threshold > 0) |
7595 | return -EINVAL; | 7604 | return -EINVAL; |
7596 | 7605 | ||
7597 | wdev = dev->ieee80211_ptr; | 7606 | /* disabling - hysteresis should also be zero then */ |
7607 | if (threshold == 0) | ||
7608 | hysteresis = 0; | ||
7598 | 7609 | ||
7599 | if (!rdev->ops->set_cqm_rssi_config) | 7610 | if (!rdev->ops->set_cqm_rssi_config) |
7600 | return -EOPNOTSUPP; | 7611 | return -EOPNOTSUPP; |
@@ -7613,36 +7624,33 @@ static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) | |||
7613 | int err; | 7624 | int err; |
7614 | 7625 | ||
7615 | cqm = info->attrs[NL80211_ATTR_CQM]; | 7626 | cqm = info->attrs[NL80211_ATTR_CQM]; |
7616 | if (!cqm) { | 7627 | if (!cqm) |
7617 | err = -EINVAL; | 7628 | return -EINVAL; |
7618 | goto out; | ||
7619 | } | ||
7620 | 7629 | ||
7621 | err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm, | 7630 | err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm, |
7622 | nl80211_attr_cqm_policy); | 7631 | nl80211_attr_cqm_policy); |
7623 | if (err) | 7632 | if (err) |
7624 | goto out; | 7633 | return err; |
7625 | 7634 | ||
7626 | if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && | 7635 | if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && |
7627 | attrs[NL80211_ATTR_CQM_RSSI_HYST]) { | 7636 | attrs[NL80211_ATTR_CQM_RSSI_HYST]) { |
7628 | s32 threshold; | 7637 | s32 threshold = nla_get_s32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); |
7629 | u32 hysteresis; | 7638 | u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); |
7630 | threshold = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); | ||
7631 | hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); | ||
7632 | err = nl80211_set_cqm_rssi(info, threshold, hysteresis); | ||
7633 | } else if (attrs[NL80211_ATTR_CQM_TXE_RATE] && | ||
7634 | attrs[NL80211_ATTR_CQM_TXE_PKTS] && | ||
7635 | attrs[NL80211_ATTR_CQM_TXE_INTVL]) { | ||
7636 | u32 rate, pkts, intvl; | ||
7637 | rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); | ||
7638 | pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); | ||
7639 | intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); | ||
7640 | err = nl80211_set_cqm_txe(info, rate, pkts, intvl); | ||
7641 | } else | ||
7642 | err = -EINVAL; | ||
7643 | 7639 | ||
7644 | out: | 7640 | return nl80211_set_cqm_rssi(info, threshold, hysteresis); |
7645 | return err; | 7641 | } |
7642 | |||
7643 | if (attrs[NL80211_ATTR_CQM_TXE_RATE] && | ||
7644 | attrs[NL80211_ATTR_CQM_TXE_PKTS] && | ||
7645 | attrs[NL80211_ATTR_CQM_TXE_INTVL]) { | ||
7646 | u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); | ||
7647 | u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); | ||
7648 | u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); | ||
7649 | |||
7650 | return nl80211_set_cqm_txe(info, rate, pkts, intvl); | ||
7651 | } | ||
7652 | |||
7653 | return -EINVAL; | ||
7646 | } | 7654 | } |
7647 | 7655 | ||
7648 | static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) | 7656 | static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) |
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 |
518 | static inline int rdev_testmode_cmd(struct cfg80211_registered_device *rdev, | 518 | static 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 |
1295 | TRACE_EVENT(rdev_testmode_cmd, | 1295 | TRACE_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 | ||
1307 | TRACE_EVENT(rdev_testmode_dump, | 1309 | TRACE_EVENT(rdev_testmode_dump, |