Unified · Split
| @@ -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 the | 1963 | * 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 is | 1968 | * @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is |
| 1967 | * the TDLS link initiator. | 1969 | * the TDLS link initiator. |
| @@ -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 */ |
| 285 | int cfg80211_join_ibss(struct cfg80211_registered_device *rdev, | 285 | int __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); |
| 289 | void cfg80211_clear_ibss(struct net_device *dev, bool nowext); | 289 | void cfg80211_clear_ibss(struct net_device *dev, bool nowext); |
| 290 | int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, | 290 | int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, |
| 291 | struct net_device *dev, bool nowext); | 291 | struct net_device *dev, bool nowext); |
| @@ -84,14 +84,15 @@ void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, · 83 unmodified lines | |||
| 84 | } | 84 | } |
| 85 | EXPORT_SYMBOL(cfg80211_ibss_joined); | 85 | EXPORT_SYMBOL(cfg80211_ibss_joined); |
| 86 | 86 | ||
| 87 | static int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev, | 87 | int __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 | ||
| 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 | |||
| 166 | static void __cfg80211_clear_ibss(struct net_device *dev, bool nowext) | 150 | static 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; |
| @@ -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 | ||