Unified · Split
| @@ -1962,6 +1962,8 @@ enum nl80211_commands { · 1961 unmodified lines | ||
| 1962 | 1962 | * multicast group. |
| 1963 | 1963 | * If set during %NL80211_CMD_ASSOCIATE or %NL80211_CMD_CONNECT the |
| 1964 | 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 | 1968 | * @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is |
| 1967 | 1969 | * the TDLS link initiator. |
| @@ -282,10 +282,10 @@ void cfg80211_bss_age(struct cfg80211_registered_device *rdev, · 281 unmodified lines | ||
| 282 | 282 | unsigned long age_secs); |
| 283 | 283 | |
| 284 | 284 | /* 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); | |
| 289 | 289 | void cfg80211_clear_ibss(struct net_device *dev, bool nowext); |
| 290 | 290 | int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, |
| 291 | 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 | 85 | EXPORT_SYMBOL(cfg80211_ibss_joined); |
| 86 | 86 | |
| 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) | |
| 91 | 91 | { |
| 92 | 92 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
| 93 | 93 | int err; |
| 94 | 94 | |
| 95 | + ASSERT_RTNL(); | |
| 95 | 96 | ASSERT_WDEV_LOCK(wdev); |
| 96 | 97 | |
| 97 | 98 | if (wdev->ssid_len) |
| @@ -146,23 +147,6 @@ static int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev, · 48 unmodified lines | ||
| 146 | 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 | 150 | static void __cfg80211_clear_ibss(struct net_device *dev, bool nowext) |
| 167 | 151 | { |
| 168 | 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 | 208 | if (err) |
| 225 | 209 | return err; |
| 226 | 210 | |
| 211 | + wdev->conn_owner_nlportid = 0; | |
| 227 | 212 | __cfg80211_clear_ibss(dev, nowext); |
| 228 | 213 | |
| 229 | 214 | return 0; |
| @@ -8679,9 +8679,14 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) · 8678 unmodified lines | ||
| 8679 | 8679 | ibss.userspace_handles_dfs = |
| 8680 | 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 | 8684 | if (err) |
| 8684 | 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 | 8690 | return err; |
| 8686 | 8691 | } |
| 8687 | 8692 | |