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
1962 * multicast group.1962 * multicast group.
1963 * If set during %NL80211_CMD_ASSOCIATE or %NL80211_CMD_CONNECT the1963 * If set during %NL80211_CMD_ASSOCIATE or %NL80211_CMD_CONNECT the
1964 * station will deauthenticate when the socket is closed.1964 * 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.
1965 *1967 *
1966 * @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is1968 * @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is
1967 * the TDLS link initiator.1969 * 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
282 unsigned long age_secs);282 unsigned long age_secs);
283 283
284/* IBSS */284/* IBSS */
285int cfg80211_join_ibss(struct cfg80211_registered_device *rdev,285int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
286 struct net_device *dev,286 struct net_device *dev,
287 struct cfg80211_ibss_params *params,287 struct cfg80211_ibss_params *params,
288 struct cfg80211_cached_keys *connkeys);288 struct cfg80211_cached_keys *connkeys);
289void cfg80211_clear_ibss(struct net_device *dev, bool nowext);289void cfg80211_clear_ibss(struct net_device *dev, bool nowext);
290int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,290int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
291 struct net_device *dev, bool nowext);291 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
84}84}
85EXPORT_SYMBOL(cfg80211_ibss_joined);85EXPORT_SYMBOL(cfg80211_ibss_joined);
86 86
87static int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,87int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
88 struct net_device *dev,88 struct net_device *dev,
89 struct cfg80211_ibss_params *params,89 struct cfg80211_ibss_params *params,
90 struct cfg80211_cached_keys *connkeys)90 struct cfg80211_cached_keys *connkeys)
91{91{
92 struct wireless_dev *wdev = dev->ieee80211_ptr;92 struct wireless_dev *wdev = dev->ieee80211_ptr;
93 int err;93 int err;
94 94
95 ASSERT_RTNL();
95 ASSERT_WDEV_LOCK(wdev);96 ASSERT_WDEV_LOCK(wdev);
96 97
97 if (wdev->ssid_len)98 if (wdev->ssid_len)
@@ -146,23 +147,6 @@ static int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev, · 48 unmodified lines
146 return 0;147 return 0;
147}148}
148 149
149int 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
166static void __cfg80211_clear_ibss(struct net_device *dev, bool nowext)150static void __cfg80211_clear_ibss(struct net_device *dev, bool nowext)
167{151{
168 struct wireless_dev *wdev = dev->ieee80211_ptr;152 struct wireless_dev *wdev = dev->ieee80211_ptr;
@@ -224,6 +208,7 @@ int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, · 55 unmodified lines
224 if (err)208 if (err)
225 return err;209 return err;
226 210
211 wdev->conn_owner_nlportid = 0;
227 __cfg80211_clear_ibss(dev, nowext);212 __cfg80211_clear_ibss(dev, nowext);
228 213
229 return 0;214 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
8679 ibss.userspace_handles_dfs =8679 ibss.userspace_handles_dfs =
8680 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);8680 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
8681 8681
8682 err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);8682 wdev_lock(dev->ieee80211_ptr);
8683 err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
8683 if (err)8684 if (err)
8684 kzfree(connkeys);8685 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
8685 return err;8690 return err;
8686}8691}
8687 8692