aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
authorAndrei Otcheretianski <andrei.otcheretianski@intel.com>2013-11-18 12:06:49 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-12-02 05:51:52 -0500
commitb176e629402f41f2b984d3aa842ddae23ed5562e (patch)
treed7bf11ae06d568756a3394ec3127f65e4f973eac /net/wireless
parent017b45bb5c5b40d9da1ea671aa8bc2eaec73675f (diff)
cfg80211: aggregate mgmt_tx parameters into a struct
Change cfg80211 and mac80211 to use cfg80211_mgmt_tx_params struct to aggregate parameters for mgmt_tx functions. This makes the functions' signatures less clumsy and allows less painful parameters extension. Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com> [fix all other drivers] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/core.h5
-rw-r--r--net/wireless/mlme.c12
-rw-r--r--net/wireless/nl80211.c32
-rw-r--r--net/wireless/rdev-ops.h12
-rw-r--r--net/wireless/trace.h15
5 files changed, 33 insertions, 43 deletions
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 2888867ee7c5..6716c5c3f748 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -317,9 +317,8 @@ void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlpid);
317void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev); 317void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev);
318int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev, 318int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
319 struct wireless_dev *wdev, 319 struct wireless_dev *wdev,
320 struct ieee80211_channel *chan, bool offchan, 320 struct cfg80211_mgmt_tx_params *params,
321 unsigned int wait, const u8 *buf, size_t len, 321 u64 *cookie);
322 bool no_cck, bool dont_wait_for_ack, u64 *cookie);
323void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap *ht_capa, 322void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap *ht_capa,
324 const struct ieee80211_ht_cap *ht_capa_mask); 323 const struct ieee80211_ht_cap *ht_capa_mask);
325void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa, 324void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa,
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index 31f541f7e4ea..52cca05044a8 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -520,9 +520,7 @@ void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev)
520 520
521int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev, 521int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
522 struct wireless_dev *wdev, 522 struct wireless_dev *wdev,
523 struct ieee80211_channel *chan, bool offchan, 523 struct cfg80211_mgmt_tx_params *params, u64 *cookie)
524 unsigned int wait, const u8 *buf, size_t len,
525 bool no_cck, bool dont_wait_for_ack, u64 *cookie)
526{ 524{
527 const struct ieee80211_mgmt *mgmt; 525 const struct ieee80211_mgmt *mgmt;
528 u16 stype; 526 u16 stype;
@@ -533,10 +531,10 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
533 if (!rdev->ops->mgmt_tx) 531 if (!rdev->ops->mgmt_tx)
534 return -EOPNOTSUPP; 532 return -EOPNOTSUPP;
535 533
536 if (len < 24 + 1) 534 if (params->len < 24 + 1)
537 return -EINVAL; 535 return -EINVAL;
538 536
539 mgmt = (const struct ieee80211_mgmt *) buf; 537 mgmt = (const struct ieee80211_mgmt *)params->buf;
540 538
541 if (!ieee80211_is_mgmt(mgmt->frame_control)) 539 if (!ieee80211_is_mgmt(mgmt->frame_control))
542 return -EINVAL; 540 return -EINVAL;
@@ -615,9 +613,7 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
615 return -EINVAL; 613 return -EINVAL;
616 614
617 /* Transmit the Action frame as requested by user space */ 615 /* Transmit the Action frame as requested by user space */
618 return rdev_mgmt_tx(rdev, wdev, chan, offchan, 616 return rdev_mgmt_tx(rdev, wdev, params, cookie);
619 wait, buf, len, no_cck, dont_wait_for_ack,
620 cookie);
621} 617}
622 618
623bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm, 619bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 8c83fbb3824f..703155b1aa7a 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -7428,10 +7428,10 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
7428 void *hdr = NULL; 7428 void *hdr = NULL;
7429 u64 cookie; 7429 u64 cookie;
7430 struct sk_buff *msg = NULL; 7430 struct sk_buff *msg = NULL;
7431 unsigned int wait = 0; 7431 struct cfg80211_mgmt_tx_params params = {
7432 bool offchan, no_cck, dont_wait_for_ack; 7432 .dont_wait_for_ack =
7433 7433 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
7434 dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; 7434 };
7435 7435
7436 if (!info->attrs[NL80211_ATTR_FRAME]) 7436 if (!info->attrs[NL80211_ATTR_FRAME])
7437 return -EINVAL; 7437 return -EINVAL;
@@ -7458,24 +7458,24 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
7458 if (info->attrs[NL80211_ATTR_DURATION]) { 7458 if (info->attrs[NL80211_ATTR_DURATION]) {
7459 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 7459 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
7460 return -EINVAL; 7460 return -EINVAL;
7461 wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 7461 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
7462 7462
7463 /* 7463 /*
7464 * We should wait on the channel for at least a minimum amount 7464 * We should wait on the channel for at least a minimum amount
7465 * of time (10ms) but no longer than the driver supports. 7465 * of time (10ms) but no longer than the driver supports.
7466 */ 7466 */
7467 if (wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 7467 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
7468 wait > rdev->wiphy.max_remain_on_channel_duration) 7468 params.wait > rdev->wiphy.max_remain_on_channel_duration)
7469 return -EINVAL; 7469 return -EINVAL;
7470 7470
7471 } 7471 }
7472 7472
7473 offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 7473 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
7474 7474
7475 if (offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 7475 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
7476 return -EINVAL; 7476 return -EINVAL;
7477 7477
7478 no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 7478 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
7479 7479
7480 /* get the channel if any has been specified, otherwise pass NULL to 7480 /* get the channel if any has been specified, otherwise pass NULL to
7481 * the driver. The latter will use the current one 7481 * the driver. The latter will use the current one
@@ -7487,10 +7487,10 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
7487 return err; 7487 return err;
7488 } 7488 }
7489 7489
7490 if (!chandef.chan && offchan) 7490 if (!chandef.chan && params.offchan)
7491 return -EINVAL; 7491 return -EINVAL;
7492 7492
7493 if (!dont_wait_for_ack) { 7493 if (!params.dont_wait_for_ack) {
7494 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 7494 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7495 if (!msg) 7495 if (!msg)
7496 return -ENOMEM; 7496 return -ENOMEM;
@@ -7503,10 +7503,10 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
7503 } 7503 }
7504 } 7504 }
7505 7505
7506 err = cfg80211_mlme_mgmt_tx(rdev, wdev, chandef.chan, offchan, wait, 7506 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
7507 nla_data(info->attrs[NL80211_ATTR_FRAME]), 7507 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
7508 nla_len(info->attrs[NL80211_ATTR_FRAME]), 7508 params.chan = chandef.chan;
7509 no_cck, dont_wait_for_ack, &cookie); 7509 err = cfg80211_mlme_mgmt_tx(rdev, wdev, &params, &cookie);
7510 if (err) 7510 if (err)
7511 goto free_msg; 7511 goto free_msg;
7512 7512
diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h
index 37ce9fdfe934..a6c03ab14a0d 100644
--- a/net/wireless/rdev-ops.h
+++ b/net/wireless/rdev-ops.h
@@ -624,16 +624,12 @@ rdev_cancel_remain_on_channel(struct cfg80211_registered_device *rdev,
624 624
625static inline int rdev_mgmt_tx(struct cfg80211_registered_device *rdev, 625static inline int rdev_mgmt_tx(struct cfg80211_registered_device *rdev,
626 struct wireless_dev *wdev, 626 struct wireless_dev *wdev,
627 struct ieee80211_channel *chan, bool offchan, 627 struct cfg80211_mgmt_tx_params *params,
628 unsigned int wait, const u8 *buf, size_t len, 628 u64 *cookie)
629 bool no_cck, bool dont_wait_for_ack, u64 *cookie)
630{ 629{
631 int ret; 630 int ret;
632 trace_rdev_mgmt_tx(&rdev->wiphy, wdev, chan, offchan, 631 trace_rdev_mgmt_tx(&rdev->wiphy, wdev, params);
633 wait, no_cck, dont_wait_for_ack); 632 ret = rdev->ops->mgmt_tx(&rdev->wiphy, wdev, params, cookie);
634 ret = rdev->ops->mgmt_tx(&rdev->wiphy, wdev, chan, offchan,
635 wait, buf, len, no_cck,
636 dont_wait_for_ack, cookie);
637 trace_rdev_return_int_cookie(&rdev->wiphy, ret, *cookie); 633 trace_rdev_return_int_cookie(&rdev->wiphy, ret, *cookie);
638 return ret; 634 return ret;
639} 635}
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index ba5f0d6614d5..f7aa7a72d9bc 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -1653,9 +1653,8 @@ TRACE_EVENT(rdev_cancel_remain_on_channel,
1653 1653
1654TRACE_EVENT(rdev_mgmt_tx, 1654TRACE_EVENT(rdev_mgmt_tx,
1655 TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, 1655 TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev,
1656 struct ieee80211_channel *chan, bool offchan, 1656 struct cfg80211_mgmt_tx_params *params),
1657 unsigned int wait, bool no_cck, bool dont_wait_for_ack), 1657 TP_ARGS(wiphy, wdev, params),
1658 TP_ARGS(wiphy, wdev, chan, offchan, wait, no_cck, dont_wait_for_ack),
1659 TP_STRUCT__entry( 1658 TP_STRUCT__entry(
1660 WIPHY_ENTRY 1659 WIPHY_ENTRY
1661 WDEV_ENTRY 1660 WDEV_ENTRY
@@ -1668,11 +1667,11 @@ TRACE_EVENT(rdev_mgmt_tx,
1668 TP_fast_assign( 1667 TP_fast_assign(
1669 WIPHY_ASSIGN; 1668 WIPHY_ASSIGN;
1670 WDEV_ASSIGN; 1669 WDEV_ASSIGN;
1671 CHAN_ASSIGN(chan); 1670 CHAN_ASSIGN(params->chan);
1672 __entry->offchan = offchan; 1671 __entry->offchan = params->offchan;
1673 __entry->wait = wait; 1672 __entry->wait = params->wait;
1674 __entry->no_cck = no_cck; 1673 __entry->no_cck = params->no_cck;
1675 __entry->dont_wait_for_ack = dont_wait_for_ack; 1674 __entry->dont_wait_for_ack = params->dont_wait_for_ack;
1676 ), 1675 ),
1677 TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", " CHAN_PR_FMT ", offchan: %s," 1676 TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", " CHAN_PR_FMT ", offchan: %s,"
1678 " wait: %u, no cck: %s, dont wait for ack: %s", 1677 " wait: %u, no cck: %s, dont wait for ack: %s",