@@ -3001,6 +3001,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
static int nl80211_start_periodic(struct sk_buff *skb,
struct genl_info *info)
{
+ struct cfg80211_periodic_request *request;
struct cfg80211_registered_device *rdev;
struct net_device *dev;
int err;
@@ -3018,6 +3019,22 @@ static int nl80211_start_periodic(struct sk_buff *skb,
goto out;
}
+ if (rdev->periodic_req) {
+ err = -EINPROGRESS;
+ goto out;
+ }
+
+ request = kzalloc(sizeof(*request), GFP_KERNEL);
+ if (!request) {
+ err = -ENOMEM;
+ goto out;
+ }
+
+ request->dev = dev;
+ request->wiphy = &rdev->wiphy;
+
+ rdev->periodic_req = request;
+
/* add actual calls here */
if (!err) {
@@ -3055,7 +3072,9 @@ static int nl80211_stop_periodic(struct sk_buff *skb,
goto out;
}
- /* add actual calls here */
+ if (rdev->periodic_req) {
+ /* add actual calls here */
+ }
if (!err) {
nl80211_send_periodic(rdev, dev,
@@ -3063,6 +3082,13 @@ static int nl80211_stop_periodic(struct sk_buff *skb,
dev_hold(dev);
}
+ /*
+ * FIXME: Can this stay here? How will the auto-complete and other
+ * cleanup cases work?
+ */
+ kfree(rdev->periodic_req);
+ rdev->periodic_req = NULL;
+
out:
cfg80211_unlock_rdev(rdev);
dev_put(dev);