History

nl80211: Add SOCKET_OWNER support to JOIN_IBSS

Denis Kenzior committed 8 years ago

Commit f8d16d31 parent 37b1c004 files · +18 −26Browse files

Unified · Split

4 files
  1. include/uapi/linux/nl80211.h +2 −0
  2. net/wireless/core.h +4 −4
  3. net/wireless/ibss.c +6 −21
  4. net/wireless/nl80211.c +6 −1
include/uapi/linux/nl80211.h+2−0
@@ -1962,6 +1962,8 @@ enum nl80211_commands { · 1961 unmodified lines
19621962 * multicast group.
19631963 * If set during %NL80211_CMD_ASSOCIATE or %NL80211_CMD_CONNECT the
19641964 * station will deauthenticate when the socket is closed.
1965+ * If set during %NL80211_CMD_JOIN_IBSS the IBSS will be automatically
1966+ * torn down when the socket is closed.
19651967 *
19661968 * @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is
19671969 * the TDLS link initiator.
net/wireless/core.h+4−4
@@ -282,10 +282,10 @@ void cfg80211_bss_age(struct cfg80211_registered_device *rdev, · 281 unmodified lines
282282 unsigned long age_secs);
283283
284284 /* IBSS */
285−int cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
286− struct net_device *dev,
287− struct cfg80211_ibss_params *params,
288− struct cfg80211_cached_keys *connkeys);
285+int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
286+ struct net_device *dev,
287+ struct cfg80211_ibss_params *params,
288+ struct cfg80211_cached_keys *connkeys);
289289 void cfg80211_clear_ibss(struct net_device *dev, bool nowext);
290290 int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
291291 struct net_device *dev, bool nowext);
net/wireless/ibss.c+6−21
@@ -84,14 +84,15 @@ void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, · 83 unmodified lines
8484 }
8585 EXPORT_SYMBOL(cfg80211_ibss_joined);
8686
87−static int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
88− struct net_device *dev,
89− struct cfg80211_ibss_params *params,
90− struct cfg80211_cached_keys *connkeys)
87+int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
88+ struct net_device *dev,
89+ struct cfg80211_ibss_params *params,
90+ struct cfg80211_cached_keys *connkeys)
9191 {
9292 struct wireless_dev *wdev = dev->ieee80211_ptr;
9393 int err;
9494
95+ ASSERT_RTNL();
9596 ASSERT_WDEV_LOCK(wdev);
9697
9798 if (wdev->ssid_len)
@@ -146,23 +147,6 @@ static int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev, · 48 unmodified lines
146147 return 0;
147148 }
148149
149−int cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
150− struct net_device *dev,
151− struct cfg80211_ibss_params *params,
152− struct cfg80211_cached_keys *connkeys)
153−{
154− struct wireless_dev *wdev = dev->ieee80211_ptr;
155− int err;
156−
157− ASSERT_RTNL();
158−
159− wdev_lock(wdev);
160− err = __cfg80211_join_ibss(rdev, dev, params, connkeys);
161− wdev_unlock(wdev);
162−
163− return err;
164−}
165−
166150 static void __cfg80211_clear_ibss(struct net_device *dev, bool nowext)
167151 {
168152 struct wireless_dev *wdev = dev->ieee80211_ptr;
@@ -224,6 +208,7 @@ int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, · 55 unmodified lines
224208 if (err)
225209 return err;
226210
211+ wdev->conn_owner_nlportid = 0;
227212 __cfg80211_clear_ibss(dev, nowext);
228213
229214 return 0;
net/wireless/nl80211.c+6−1
@@ -8679,9 +8679,14 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) · 8678 unmodified lines
86798679 ibss.userspace_handles_dfs =
86808680 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
86818681
8682− err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
8682+ wdev_lock(dev->ieee80211_ptr);
8683+ err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
86838684 if (err)
86848685 kzfree(connkeys);
8686+ else if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
8687+ dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
8688+ wdev_unlock(dev->ieee80211_ptr);
8689+
86858690 return err;
86868691 }
86878692