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_impl.c

    rd7dadcb4 r053fc2b  
    9090 * @return EOK.
    9191 */
    92 int ieee80211_bssid_change_impl(ieee80211_dev_t *ieee80211_dev)
     92int ieee80211_bssid_change_impl(ieee80211_dev_t *ieee80211_dev,
     93        bool connected)
    9394{
    9495        return EOK;
     
    118119int ieee80211_scan_impl(ieee80211_dev_t *ieee80211_dev)
    119120{
    120         if(ieee80211_is_connected(ieee80211_dev))
    121                 return EOK;
    122        
    123         fibril_mutex_lock(&ieee80211_dev->ap_list.scan_mutex);
    124        
    125         /* Remove old entries we don't receive beacons from. */
    126         ieee80211_scan_result_list_t *result_list =
    127                 &ieee80211_dev->ap_list;
    128         list_foreach_safe(result_list->list, cur_link, next_link) {
    129                 ieee80211_scan_result_link_t *cur_result =
    130                         list_get_instance(cur_link,
    131                         ieee80211_scan_result_link_t,
    132                         link);
    133                 if((time(NULL) - cur_result->last_beacon) >
    134                         MAX_KEEP_SCAN_SPAN_SEC) {
    135                         ieee80211_scan_result_list_remove(result_list,
    136                                 cur_result);
     121        fibril_mutex_lock(&ieee80211_dev->scan_mutex);
     122       
     123        if(ieee80211_get_auth_phase(ieee80211_dev) ==
     124                IEEE80211_AUTH_DISCONNECTED) {
     125                fibril_mutex_lock(&ieee80211_dev->ap_list.results_mutex);
     126                /* Remove old entries we don't receive beacons from. */
     127                ieee80211_scan_result_list_t *result_list =
     128                        &ieee80211_dev->ap_list;
     129                list_foreach_safe(result_list->list, cur_link, next_link) {
     130                        ieee80211_scan_result_link_t *cur_result =
     131                                list_get_instance(cur_link,
     132                                ieee80211_scan_result_link_t,
     133                                link);
     134                        if((time(NULL) - cur_result->last_beacon) >
     135                                MAX_KEEP_SCAN_SPAN_SEC) {
     136                                ieee80211_scan_result_list_remove(result_list,
     137                                        cur_result);
     138                        }
    137139                }
    138         }
    139        
    140         fibril_mutex_unlock(&ieee80211_dev->ap_list.scan_mutex);
    141        
    142         uint16_t orig_freq = ieee80211_dev->current_freq;
    143        
    144         for(uint16_t freq = IEEE80211_FIRST_FREQ;
    145                 freq <= IEEE80211_MAX_FREQ;
    146                 freq += IEEE80211_CHANNEL_GAP) {
    147                 ieee80211_dev->ops->set_freq(ieee80211_dev, freq);
    148                 ieee80211_probe_request(ieee80211_dev, NULL);
    149                
    150                 /* Wait for probe responses. */
    151                 usleep(100000);
    152         }
    153        
    154         ieee80211_dev->ops->set_freq(ieee80211_dev, orig_freq);
    155        
    156         fibril_mutex_lock(&ieee80211_dev->ap_list.scan_mutex);
    157         time(&ieee80211_dev->ap_list.last_scan);
    158         fibril_mutex_unlock(&ieee80211_dev->ap_list.scan_mutex);
     140                fibril_mutex_unlock(&ieee80211_dev->ap_list.results_mutex);
     141
     142                uint16_t orig_freq = ieee80211_dev->current_freq;
     143
     144                for(uint16_t freq = IEEE80211_FIRST_FREQ;
     145                        freq <= IEEE80211_MAX_FREQ;
     146                        freq += IEEE80211_CHANNEL_GAP) {
     147                        if(ieee80211_pending_connect_request(ieee80211_dev)) {
     148                                break;
     149                        }
     150                       
     151                        ieee80211_dev->ops->set_freq(ieee80211_dev, freq);
     152                        ieee80211_probe_request(ieee80211_dev, NULL);
     153
     154                        /* Wait for probe responses. */
     155                        async_usleep(SCAN_CHANNEL_WAIT_USEC);
     156                }
     157
     158                ieee80211_dev->ops->set_freq(ieee80211_dev, orig_freq);
     159        }
     160       
     161        fibril_mutex_unlock(&ieee80211_dev->scan_mutex);
    159162       
    160163        return EOK;
Note: See TracChangeset for help on using the changeset viewer.