From: Bernhard Schmidt <bernhard.schmidt@saxnet.de>
To: linux-wireless@vger.kernel.org
Cc: lrodriguez@atheros.com, nbd@openwrt.org, dubowoj@neratec.com,
zefir.kurtisi@neratec.com, simon.wunderlich@saxnet.de
Subject: [PATCH 8/9] [{cfg|nl}80211] announce flag changes to userspace
Date: Mon, 28 Feb 2011 17:51:19 +0100 [thread overview]
Message-ID: <201102281751.19488.bernhard.schmidt@saxnet.de> (raw)
In-Reply-To: <201102281740.37036.bernhard.schmidt@saxnet.de>
Signed-off-by: Bernhard Schmidt <bernhard.schmidt@saxnet.de>
---
include/linux/nl80211.h | 3 ++
net/wireless/nl80211.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++
net/wireless/nl80211.h | 2 +
net/wireless/radar.c | 4 +++
4 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h
index e14b2dd..1355865 100644
--- a/include/linux/nl80211.h
+++ b/include/linux/nl80211.h
@@ -413,6 +413,8 @@
* @NL80211_CMD_RADAR_CAC_START: Request a CAC.
* @NL80211_CMD_RADAR_CAC_STOP: Stop a CAC early.
* @NL80211_CMD_RADAR_CAC_DONE: Notification sent if a CAC has completed.
+ * @NL80211_CMD_RADAR_FLAGS_CHANGED: Notification sent if channel flags
+ * have changed.
*
* @NL80211_CMD_MAX: highest used command number
* @__NL80211_CMD_AFTER_LAST: internal use
@@ -529,6 +531,7 @@ enum nl80211_commands {
NL80211_CMD_RADAR_CAC_START,
NL80211_CMD_RADAR_CAC_STOP,
NL80211_CMD_RADAR_CAC_DONE,
+ NL80211_CMD_RADAR_FLAGS_CHANGED,
/* add new commands above here */
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 20a24f4..4d6d2ad 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -6205,6 +6205,57 @@ void nl80211_radar_cac_done(struct cfg80211_registered_device *rdev)
rcu_read_unlock();
}
+static void radar_flags_changed_wdev(struct cfg80211_registered_device *rdev,
+ struct wireless_dev *wdev,
+ struct ieee80211_channel *chan)
+{
+ struct sk_buff *msg;
+ void *hdr;
+
+ msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+ if (!msg)
+ return;
+
+ hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_FLAGS_CHANGED);
+ if (!hdr) {
+ nlmsg_free(msg);
+ return;
+ }
+
+ NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex);
+ NLA_PUT_U32(msg, NL80211_FREQUENCY_ATTR_FREQ, chan->center_freq);
+ if ((chan->flags & IEEE80211_CHAN_RADAR_CLEAR))
+ NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_RADAR_CLEAR);
+ if ((chan->flags & IEEE80211_CHAN_RADAR_INTERFERENCE))
+ NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_RADAR_INTERFERENCE);
+
+ if (genlmsg_end(msg, hdr) < 0) {
+ nlmsg_free(msg);
+ return;
+ }
+
+ genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
+ nl80211_mlme_mcgrp.id, GFP_KERNEL);
+ return;
+
+ nla_put_failure:
+ genlmsg_cancel(msg, hdr);
+ nlmsg_free(msg);
+}
+
+void nl80211_radar_flags_changed(struct cfg80211_registered_device *rdev,
+ struct ieee80211_channel *chan)
+{
+ struct wireless_dev *wdev;
+
+ rcu_read_lock();
+
+ list_for_each_entry_rcu(wdev, &rdev->netdev_list, list)
+ radar_flags_changed_wdev(rdev, wdev, chan);
+
+ rcu_read_unlock();
+}
+
static int nl80211_netlink_notify(struct notifier_block * nb,
unsigned long state,
void *_notify)
diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h
index aa3c926..e7f84d8 100644
--- a/net/wireless/nl80211.h
+++ b/net/wireless/nl80211.h
@@ -99,5 +99,7 @@ nl80211_send_cqm_pktloss_notify(struct cfg80211_registered_device *rdev,
u32 num_packets, gfp_t gfp);
void nl80211_radar_cac_done(struct cfg80211_registered_device *rdev);
+void nl80211_radar_flags_changed(struct cfg80211_registered_device *rdev,
+ struct ieee80211_channel *chan);
#endif /* __NET_WIRELESS_NL80211_H */
diff --git a/net/wireless/radar.c b/net/wireless/radar.c
index df2d03b..d8911d3 100644
--- a/net/wireless/radar.c
+++ b/net/wireless/radar.c
@@ -62,6 +62,7 @@ int radar_cac_start(struct cfg80211_registered_device *rdev)
}
chan->flags &= ~IEEE80211_CHAN_RADAR_CLEAR;
mutex_unlock(&radar.lock);
+ nl80211_radar_flags_changed(rdev, chan);
printk(KERN_INFO "DFS: starting CAC (%p)\n", rdev);
@@ -121,6 +122,7 @@ static void radar_cac(struct work_struct *work)
mutex_unlock(&radar.lock);
kfree(cac);
+ nl80211_radar_flags_changed(rdev, chan);
nl80211_radar_cac_done(rdev);
return;
}
@@ -168,6 +170,7 @@ static void close_channel(u16 freq)
if (chan == NULL)
continue;
chan->flags &= ~IEEE80211_CHAN_RADAR_CLEAR;
+ nl80211_radar_flags_changed(rdev, chan);
c = rdev->ops->get_channel(&rdev->wiphy);
if (c->center_freq != chan->center_freq)
@@ -224,6 +227,7 @@ static void update_all_interference_flags(u16 freq, bool set)
chan->flags &= ~IEEE80211_CHAN_RADAR_INTERFERENCE;
if (set)
chan->flags |= IEEE80211_CHAN_RADAR_INTERFERENCE;
+ nl80211_radar_flags_changed(rdev, chan);
}
}
--
1.7.2.3
next prev parent reply other threads:[~2011-02-28 16:51 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-28 16:40 [RFC 0/9 v2] DFS/radar state/userspace handling Bernhard Schmidt
2011-02-28 16:46 ` [PATCH 1/9] [mac80211] add method to access oper chan Bernhard Schmidt
2011-03-01 12:11 ` Johannes Berg
2011-02-28 16:47 ` [PATCH 2/9] [{mac|nl}80211] Add 2 new radar channel flags Bernhard Schmidt
2011-03-01 21:54 ` Luis R. Rodriguez
2011-03-02 8:25 ` Johannes Berg
2011-03-02 9:37 ` Bernhard Schmidt
2011-02-28 16:47 ` [PATCH 3/9] [mac80211] enable radar detection Bernhard Schmidt
2011-03-01 21:56 ` Luis R. Rodriguez
2011-02-28 16:48 ` [PATCH 4/9] [cfg80211] add preliminary radar processing code Bernhard Schmidt
2011-03-01 12:17 ` Johannes Berg
2011-03-01 21:58 ` Luis R. Rodriguez
2011-03-02 7:32 ` Bernhard Schmidt
2011-03-02 16:26 ` Luis R. Rodriguez
2011-02-28 16:49 ` [PATCH 5/9] [cfg80211] channel availability check (CAC) support Bernhard Schmidt
2011-02-28 16:49 ` [PATCH 6/9] [cfg80211] no operation list (NOL) support Bernhard Schmidt
2011-03-01 12:19 ` Johannes Berg
2011-02-28 16:50 ` [PATCH 7/9] [cfg80211] abide channel closing time Bernhard Schmidt
2011-02-28 16:51 ` Bernhard Schmidt [this message]
2011-02-28 16:51 ` [PATCH 9/9] [cfg80211] interference reporting Bernhard Schmidt
2011-03-01 12:28 ` [RFC 0/9 v2] DFS/radar state/userspace handling Johannes Berg
2011-03-01 13:07 ` Bernhard Schmidt
2011-03-01 13:15 ` Johannes Berg
2011-03-01 13:26 ` Bernhard Schmidt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201102281751.19488.bernhard.schmidt@saxnet.de \
--to=bernhard.schmidt@saxnet.de \
--cc=dubowoj@neratec.com \
--cc=linux-wireless@vger.kernel.org \
--cc=lrodriguez@atheros.com \
--cc=nbd@openwrt.org \
--cc=simon.wunderlich@saxnet.de \
--cc=zefir.kurtisi@neratec.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.