Ignore:
Timestamp:
2015-04-10T13:52:11Z (9 years ago)
Author:
Jan Kolarik <kolarik@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a931b7b
Parents:
d7dadcb4
Message:

Locking, correctly disconnecting device, sending DHCP address discover after connecting to WiFi network

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ieee80211/src/ieee80211_iface_impl.c

    rd7dadcb4 r053fc2b  
    4848 * @param results Structure where should be stored scan results.
    4949 *
    50  * @return EOK.
     50 * @return EOK if everything went OK, EREFUSED when device is not ready yet.
    5151 */
    5252int ieee80211_get_scan_results_impl(ddf_fun_t *fun,
     
    5959                return EREFUSED;
    6060       
    61         fibril_mutex_lock(&ieee80211_dev->ap_list.scan_mutex);
    62         time_t scan_span = time(NULL) - ieee80211_dev->ap_list.last_scan;
    63         fibril_mutex_unlock(&ieee80211_dev->ap_list.scan_mutex);
    64        
    65         if(now || scan_span > MAX_SCAN_SPAN_SEC) {
     61        if(now) {
    6662                ieee80211_dev->ops->scan(ieee80211_dev);
    6763        }
    6864       
    69         fibril_mutex_lock(&ieee80211_dev->ap_list.scan_mutex);
     65        fibril_mutex_lock(&ieee80211_dev->ap_list.results_mutex);
    7066        if(results) {
    7167                ieee80211_scan_result_list_t *result_list =
     
    8278                results->length = i;
    8379        }
    84         fibril_mutex_unlock(&ieee80211_dev->ap_list.scan_mutex);
     80        fibril_mutex_unlock(&ieee80211_dev->ap_list.results_mutex);
    8581       
    8682        return EOK;
     
    10399        ieee80211_scan_result_link_t *auth_data, char *password)
    104100{
    105         int rc;
    106        
    107101        ieee80211_dev->bssid_info.res_link = auth_data;
    108102       
    109103        /* Set channel. */
    110         rc = ieee80211_dev->ops->set_freq(ieee80211_dev,
     104        int rc = ieee80211_dev->ops->set_freq(ieee80211_dev,
    111105                ieee80211_channel_to_freq(auth_data->scan_result.channel));
    112106        if(rc != EOK)
     
    122116        if(rc != EOK)
    123117                return rc;
    124         if(ieee80211_dev->current_auth_phase != IEEE80211_AUTH_AUTHENTICATED)
     118        if(ieee80211_get_auth_phase(ieee80211_dev) !=
     119                IEEE80211_AUTH_AUTHENTICATED) {
     120                ieee80211_set_auth_phase(ieee80211_dev,
     121                        IEEE80211_AUTH_DISCONNECTED);
    125122                return EINVAL;
     123        }
    126124       
    127125        /* Try to associate. */
     
    134132        if(rc != EOK)
    135133                return rc;
    136         if(ieee80211_dev->current_auth_phase != IEEE80211_AUTH_ASSOCIATED)
     134        if(ieee80211_get_auth_phase(ieee80211_dev) !=
     135                IEEE80211_AUTH_ASSOCIATED) {
     136                ieee80211_set_auth_phase(ieee80211_dev,
     137                        IEEE80211_AUTH_DISCONNECTED);
    137138                return EINVAL;
     139        }
    138140       
    139141        /* On open network, we are finished. */
    140         if(auth_data->scan_result.security.type == IEEE80211_SECURITY_OPEN)
    141                 return EOK;
    142        
    143         /* Otherwise wait for 4-way handshake to complete. */
    144         fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    145         rc = fibril_condvar_wait_timeout(&ieee80211_dev->gen_cond,
    146                         &ieee80211_dev->gen_mutex,
    147                         HANDSHAKE_TIMEOUT);
    148         fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
    149         if(rc != EOK)
    150                 return rc;
    151         if(ieee80211_dev->current_auth_phase != IEEE80211_AUTH_ASSOCIATED)
    152                 return EINVAL;
     142        if(auth_data->scan_result.security.type != IEEE80211_SECURITY_OPEN) {
     143                /* Otherwise wait for 4-way handshake to complete. */
     144                fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     145                rc = fibril_condvar_wait_timeout(&ieee80211_dev->gen_cond,
     146                                &ieee80211_dev->gen_mutex,
     147                                HANDSHAKE_TIMEOUT);
     148                fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     149                if(rc != EOK) {
     150                        ieee80211_deauthenticate(ieee80211_dev);
     151                        return rc;
     152                }
     153        }
     154       
     155        ieee80211_set_auth_phase(ieee80211_dev, IEEE80211_AUTH_CONNECTED);
    153156       
    154157        return EOK;
     
    163166 * @return EOK if everything OK, ETIMEOUT when timeout during authenticating,
    164167 * EINVAL when SSID not in scan results list, EPERM when incorrect password
    165  * passed.
     168 * passed, EREFUSED when device is not ready yet.
    166169 */
    167170int ieee80211_connect_impl(ddf_fun_t *fun, char *ssid_start, char *password)
     
    170173        assert(password);
    171174       
     175        int rc;
     176       
    172177        nic_t *nic_data = nic_get_from_ddf_fun(fun);
    173178        ieee80211_dev_t *ieee80211_dev = nic_get_specific(nic_data);
     
    177182       
    178183        if(ieee80211_is_connected(ieee80211_dev)) {
    179                 int rc = ieee80211_dev->iface->disconnect(fun);
     184                rc = ieee80211_dev->iface->disconnect(fun);
    180185                if(rc != EOK)
    181186                        return rc;
    182187        }
    183188       
    184         fibril_mutex_lock(&ieee80211_dev->ap_list.scan_mutex);
     189        ieee80211_set_connect_request(ieee80211_dev);
     190       
     191        rc = ENOENT;
     192        fibril_mutex_lock(&ieee80211_dev->scan_mutex);
     193       
     194        ieee80211_dev->pending_conn_req = false;
    185195
    186196        ieee80211_scan_result_list_foreach(ieee80211_dev->ap_list, result) {
     
    188198                        result->scan_result.ssid,
    189199                        str_size(ssid_start))) {
    190                         fibril_mutex_unlock(&ieee80211_dev->ap_list.scan_mutex);
    191                         return ieee80211_connect_proc(ieee80211_dev, result,
     200                        rc = ieee80211_connect_proc(ieee80211_dev, result,
    192201                                password);
     202                        break;
    193203                }
    194204        }
    195205       
    196         fibril_mutex_unlock(&ieee80211_dev->ap_list.scan_mutex);
    197        
    198         return EINVAL;
     206        fibril_mutex_unlock(&ieee80211_dev->scan_mutex);
     207       
     208        return rc;
    199209}
    200210
     
    204214 * @param fun Device function.
    205215 *
    206  * @return EOK if everything OK, EINVAL when not connected to any network.
     216 * @return EOK if everything OK, EREFUSED if device is not ready yet.
    207217 */
    208218int ieee80211_disconnect_impl(ddf_fun_t *fun)
     
    215225       
    216226        if(!ieee80211_is_connected(ieee80211_dev)) {
    217                 return EINVAL;
     227                return EOK;
    218228        } else {
    219                 return ieee80211_deauthenticate(ieee80211_dev);
     229                fibril_mutex_lock(&ieee80211_dev->ap_list.results_mutex);
     230                int rc = ieee80211_deauthenticate(ieee80211_dev);
     231                fibril_mutex_unlock(&ieee80211_dev->ap_list.results_mutex);
     232                return rc;
    220233        }
    221234}
Note: See TracChangeset for help on using the changeset viewer.