| .. | .. |
|---|
| 269 | 269 | rtnl_unlock(); |
|---|
| 270 | 270 | } |
|---|
| 271 | 271 | |
|---|
| 272 | +static void cfg80211_step_auth_next(struct cfg80211_conn *conn, |
|---|
| 273 | + struct cfg80211_bss *bss) |
|---|
| 274 | +{ |
|---|
| 275 | + memcpy(conn->bssid, bss->bssid, ETH_ALEN); |
|---|
| 276 | + conn->params.bssid = conn->bssid; |
|---|
| 277 | + conn->params.channel = bss->channel; |
|---|
| 278 | + conn->state = CFG80211_CONN_AUTHENTICATE_NEXT; |
|---|
| 279 | +} |
|---|
| 280 | + |
|---|
| 272 | 281 | /* Returned bss is reference counted and must be cleaned up appropriately. */ |
|---|
| 273 | 282 | static struct cfg80211_bss *cfg80211_get_conn_bss(struct wireless_dev *wdev) |
|---|
| 274 | 283 | { |
|---|
| .. | .. |
|---|
| 286 | 295 | if (!bss) |
|---|
| 287 | 296 | return NULL; |
|---|
| 288 | 297 | |
|---|
| 289 | | - memcpy(wdev->conn->bssid, bss->bssid, ETH_ALEN); |
|---|
| 290 | | - wdev->conn->params.bssid = wdev->conn->bssid; |
|---|
| 291 | | - wdev->conn->params.channel = bss->channel; |
|---|
| 292 | | - wdev->conn->state = CFG80211_CONN_AUTHENTICATE_NEXT; |
|---|
| 298 | + cfg80211_step_auth_next(wdev->conn, bss); |
|---|
| 293 | 299 | schedule_work(&rdev->conn_work); |
|---|
| 294 | 300 | |
|---|
| 295 | 301 | return bss; |
|---|
| .. | .. |
|---|
| 568 | 574 | wdev->conn->params.ssid_len = wdev->ssid_len; |
|---|
| 569 | 575 | |
|---|
| 570 | 576 | /* see if we have the bss already */ |
|---|
| 571 | | - bss = cfg80211_get_conn_bss(wdev); |
|---|
| 577 | + bss = cfg80211_get_bss(wdev->wiphy, wdev->conn->params.channel, |
|---|
| 578 | + wdev->conn->params.bssid, |
|---|
| 579 | + wdev->conn->params.ssid, |
|---|
| 580 | + wdev->conn->params.ssid_len, |
|---|
| 581 | + wdev->conn_bss_type, |
|---|
| 582 | + IEEE80211_PRIVACY(wdev->conn->params.privacy)); |
|---|
| 572 | 583 | |
|---|
| 573 | 584 | if (prev_bssid) { |
|---|
| 574 | 585 | memcpy(wdev->conn->prev_bssid, prev_bssid, ETH_ALEN); |
|---|
| .. | .. |
|---|
| 579 | 590 | if (bss) { |
|---|
| 580 | 591 | enum nl80211_timeout_reason treason; |
|---|
| 581 | 592 | |
|---|
| 593 | + cfg80211_step_auth_next(wdev->conn, bss); |
|---|
| 582 | 594 | err = cfg80211_conn_do_work(wdev, &treason); |
|---|
| 583 | 595 | cfg80211_put_bss(wdev->wiphy, bss); |
|---|
| 584 | 596 | } else { |
|---|
| .. | .. |
|---|
| 1245 | 1257 | } else { |
|---|
| 1246 | 1258 | if (WARN_ON(connkeys)) |
|---|
| 1247 | 1259 | return -EINVAL; |
|---|
| 1260 | + |
|---|
| 1261 | + /* connect can point to wdev->wext.connect which |
|---|
| 1262 | + * can hold key data from a previous connection |
|---|
| 1263 | + */ |
|---|
| 1264 | + connect->key = NULL; |
|---|
| 1265 | + connect->key_len = 0; |
|---|
| 1266 | + connect->key_idx = 0; |
|---|
| 1248 | 1267 | } |
|---|
| 1249 | 1268 | |
|---|
| 1250 | 1269 | wdev->connect_keys = connkeys; |
|---|