Changeset 053fc2b in mainline for uspace/lib/ieee80211/src/ieee80211.c


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

    rd7dadcb4 r053fc2b  
    5151#define IEEE80211_EXT_DATA_RATES_SIZE 4
    5252
     53#define ATOMIC_GET(state)
     54
    5355/** Frame encapsulation used in IEEE 802.11. */
    5456static const uint8_t rfc1042_header[] = {
     
    282284        ieee80211_dev)
    283285{
    284         return ieee80211_dev->current_op_mode;
     286        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     287        ieee80211_operating_mode_t op_mode = ieee80211_dev->current_op_mode;
     288        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     289       
     290        return op_mode;
    285291}
    286292
     
    294300uint16_t ieee80211_query_current_freq(ieee80211_dev_t* ieee80211_dev)
    295301{
    296         return ieee80211_dev->current_freq;
     302        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     303        uint16_t current_freq = ieee80211_dev->current_freq;
     304        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     305       
     306        return current_freq;
    297307}
    298308
    299309/**
    300310 * Query BSSID the device is connected to.
     311 *
     312 * Note: Expecting locked results_mutex.
    301313 *
    302314 * @param ieee80211_dev IEEE 802.11 device.
     
    306318        nic_address_t *bssid)
    307319{
     320        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     321       
    308322        if(bssid) {
    309                 ieee80211_scan_result_t *auth_data =
    310                         &ieee80211_dev->bssid_info.res_link->scan_result;
    311                
    312                 memcpy(bssid, (void *)&auth_data->bssid, sizeof(nic_address_t));
    313         }
     323                ieee80211_scan_result_link_t *res_link =
     324                        ieee80211_dev->bssid_info.res_link;
     325               
     326                if(res_link) {
     327                        memcpy(bssid, &res_link->scan_result.bssid,
     328                                sizeof(nic_address_t));
     329                } else {
     330                        nic_address_t broadcast_addr;
     331                        memcpy(broadcast_addr.address,
     332                                ieee80211_broadcast_mac_addr,
     333                                ETH_ADDR);
     334                        memcpy(bssid, &broadcast_addr, sizeof(nic_address_t));
     335                }
     336        }
     337       
     338        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
    314339}
    315340
     
    323348uint16_t ieee80211_get_aid(ieee80211_dev_t* ieee80211_dev)
    324349{
    325         return ieee80211_dev->bssid_info.aid;
    326 }
    327 
    328 /**
    329  * Get security suite used for HW encryption.
     350        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     351        uint16_t aid = ieee80211_dev->bssid_info.aid;
     352        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     353       
     354        return aid;
     355}
     356
     357/**
     358 * Get pairwise security suite used for HW encryption.
    330359 *
    331360 * @param ieee80211_dev IEEE 802.11 device.
     
    333362 * @return Security suite indicator.
    334363 */
    335 int ieee80211_get_security_suite(ieee80211_dev_t* ieee80211_dev)
    336 {
     364int ieee80211_get_pairwise_security(ieee80211_dev_t* ieee80211_dev)
     365{
     366        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    337367        ieee80211_scan_result_link_t *auth_link =
    338368                ieee80211_dev->bssid_info.res_link;
    339        
    340         return auth_link->scan_result.security.pair_alg;
     369        int suite = auth_link->scan_result.security.pair_alg;
     370        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     371       
     372        return suite;
    341373}
    342374
     
    350382bool ieee80211_is_connected(ieee80211_dev_t* ieee80211_dev)
    351383{
    352         return ieee80211_dev->current_auth_phase == IEEE80211_AUTH_ASSOCIATED;
     384        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     385        bool conn_state =
     386                ieee80211_dev->current_auth_phase == IEEE80211_AUTH_CONNECTED;
     387        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     388        return conn_state;
     389}
     390
     391void ieee80211_set_auth_phase(ieee80211_dev_t *ieee80211_dev,
     392        ieee80211_auth_phase_t auth_phase)
     393{
     394        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     395        ieee80211_dev->current_auth_phase = auth_phase;
     396        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     397}
     398
     399ieee80211_auth_phase_t ieee80211_get_auth_phase(ieee80211_dev_t
     400        *ieee80211_dev)
     401{
     402        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     403        ieee80211_auth_phase_t conn_state = ieee80211_dev->current_auth_phase;
     404        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     405        return conn_state;
     406}
     407
     408void ieee80211_set_connect_request(ieee80211_dev_t *ieee80211_dev)
     409{
     410        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     411        ieee80211_dev->pending_conn_req = true;
     412        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     413}
     414
     415bool ieee80211_pending_connect_request(ieee80211_dev_t *ieee80211_dev)
     416{
     417        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     418        bool conn_request = ieee80211_dev->pending_conn_req;
     419        ieee80211_dev->pending_conn_req = false;
     420        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     421        return conn_request;
    353422}
    354423
     
    362431        ieee80211_operating_mode_t op_mode)
    363432{
     433        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    364434        ieee80211_dev->current_op_mode = op_mode;
     435        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
    365436}
    366437
     
    374445        uint16_t freq)
    375446{
     447        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    376448        ieee80211_dev->current_freq = freq;
     449        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
    377450}
    378451
     
    408481extern bool ieee80211_query_using_key(ieee80211_dev_t* ieee80211_dev)
    409482{
    410         return ieee80211_dev->using_hw_key;
     483        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     484        bool using_key = ieee80211_dev->using_hw_key;
     485        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     486       
     487        return using_key;
    411488}
    412489
     
    414491        bool using_key)
    415492{
     493        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    416494        ieee80211_dev->using_hw_key = using_key;
     495        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     496}
     497
     498static int ieee80211_scan(void *arg)
     499{
     500        assert(arg);
     501       
     502        ieee80211_dev_t *ieee80211_dev = (ieee80211_dev_t *) arg;
     503       
     504        while(true) {
     505                ieee80211_dev->ops->scan(ieee80211_dev);
     506                async_usleep(35000000);
     507        }
     508       
     509        return EOK;
    417510}
    418511
     
    439532                return rc;
    440533       
    441         rc = ieee80211_dev->ops->scan(ieee80211_dev);
    442         if(rc != EOK)
    443                 return rc;
     534        /* Add scanning fibril. */
     535        fid_t fibril = fibril_create(ieee80211_scan, ieee80211_dev);
     536        if (fibril == 0) {
     537                return ENOMEM;
     538        }
     539        fibril_add_ready(fibril);
    444540       
    445541        return EOK;
     
    458554                nic_get_specific(nic);
    459555       
    460         if(!ieee80211_is_connected(ieee80211_dev)) {
     556        ieee80211_auth_phase_t auth_phase =
     557                ieee80211_get_auth_phase(ieee80211_dev);
     558        if(auth_phase != IEEE80211_AUTH_ASSOCIATED &&
     559                auth_phase != IEEE80211_AUTH_CONNECTED) {
    461560                return;
    462561        }
     
    478577        memset(add_data, 0, 8);
    479578       
    480         if(ieee80211_dev->using_hw_key) {
     579        if(ieee80211_query_using_key(ieee80211_dev)) {
    481580                int sec_suite = auth_data->security.pair_alg;
    482581                switch(sec_suite) {
     
    630729        ieee80211_dev->ready = false;
    631730        ieee80211_dev->using_hw_key = false;
     731        ieee80211_dev->pending_conn_req = false;
    632732        ieee80211_dev->current_op_mode = IEEE80211_OPMODE_STATION;
    633733        ieee80211_dev->current_auth_phase = IEEE80211_AUTH_DISCONNECTED;
     
    637737        ieee80211_scan_result_list_init(&ieee80211_dev->ap_list);
    638738       
     739        fibril_mutex_initialize(&ieee80211_dev->scan_mutex);
    639740        fibril_mutex_initialize(&ieee80211_dev->gen_mutex);
    640741        fibril_condvar_initialize(&ieee80211_dev->gen_cond);
     
    9231024       
    9241025        /*
    925          * Save password and SSID to be used in eventual authentication
    926          * handshake.
     1026         * Save password to be used in eventual authentication handshake.
    9271027         */
     1028        memset(ieee80211_dev->bssid_info.password, 0, IEEE80211_MAX_PASSW_LEN);
    9281029        memcpy(ieee80211_dev->bssid_info.password, password,
    9291030                str_size(password));
     
    9451046        ieee80211_scan_result_t *auth_data =
    9461047                &ieee80211_dev->bssid_info.res_link->scan_result;
    947        
    948         ieee80211_dev->current_auth_phase = IEEE80211_AUTH_DISCONNECTED;
    949         ieee80211_dev->bssid_info.aid = (uint16_t) -1;
    950         memcpy(auth_data->bssid.address, ieee80211_broadcast_mac_addr,
    951                 ETH_ADDR);
    9521048       
    9531049        nic_t *nic = nic_get_from_ddf_dev(ieee80211_dev->ddf_dev);
     
    9751071        free(buffer);
    9761072       
    977         ieee80211_dev->ops->bssid_change(ieee80211_dev);
     1073        ieee80211_dev->bssid_info.res_link = NULL;
     1074        ieee80211_dev->ops->bssid_change(ieee80211_dev, false);
     1075       
     1076        if(ieee80211_query_using_key(ieee80211_dev))
     1077                ieee80211_dev->ops->key_config(ieee80211_dev, NULL, false);
     1078       
     1079        ieee80211_set_auth_phase(ieee80211_dev, IEEE80211_AUTH_DISCONNECTED);
    9781080       
    9791081        return EOK;
     
    11211223        /* Not empty SSID. */
    11221224        if(ssid_ie_header->length > 0) {
    1123                 fibril_mutex_t *scan_mutex = &ieee80211_dev->ap_list.scan_mutex;
    1124                
    1125                 fibril_mutex_lock(scan_mutex);
    1126                
    11271225                ieee80211_scan_result_list_t *result_list =
    11281226                        &ieee80211_dev->ap_list;
     
    11381236                        if(!str_cmp(ssid, result->scan_result.ssid)) {
    11391237                                result->last_beacon = time(NULL);
    1140                                 fibril_mutex_unlock(scan_mutex);
    11411238                                return EOK;
    11421239                        }
     
    11451242                /* Results are full. */
    11461243                if(result_list->size == IEEE80211_MAX_RESULTS_LENGTH - 1) {
    1147                         fibril_mutex_unlock(scan_mutex);
    11481244                        return EOK;
    11491245                }
     
    11831279                ap_data->last_beacon = time(NULL);
    11841280               
     1281                fibril_mutex_lock(&ieee80211_dev->ap_list.results_mutex);
    11851282                ieee80211_scan_result_list_append(result_list, ap_data);
    1186                
    1187                 fibril_mutex_unlock(scan_mutex);
     1283                fibril_mutex_unlock(&ieee80211_dev->ap_list.results_mutex);
    11881284        }
    11891285       
     
    12021298        ieee80211_mgmt_header_t *mgmt_header)
    12031299{
    1204         fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    1205        
    1206         ieee80211_dev->current_auth_phase = IEEE80211_AUTH_AUTHENTICATED;
    1207        
     1300        ieee80211_auth_body_t *auth_body =
     1301                (ieee80211_auth_body_t *)
     1302                ((void *)mgmt_header + sizeof(ieee80211_mgmt_header_t));
     1303       
     1304        if(auth_body->status != 0) {
     1305                ieee80211_set_auth_phase(ieee80211_dev,
     1306                        IEEE80211_AUTH_DISCONNECTED);
     1307        } else {
     1308                ieee80211_set_auth_phase(ieee80211_dev,
     1309                        IEEE80211_AUTH_AUTHENTICATED);
     1310        }
     1311       
     1312        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    12081313        fibril_condvar_signal(&ieee80211_dev->gen_cond);
    12091314        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     
    12231328        ieee80211_mgmt_header_t *mgmt_header)
    12241329{
    1225         ieee80211_scan_result_t *auth_data =
    1226                 &ieee80211_dev->bssid_info.res_link->scan_result;
    1227        
    1228         fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    1229        
    12301330        ieee80211_assoc_resp_body_t *assoc_resp =
    12311331                (ieee80211_assoc_resp_body_t *) ((void *)mgmt_header +
    12321332                sizeof(ieee80211_mgmt_header_t));
    12331333       
    1234         ieee80211_dev->bssid_info.aid = uint16_t_le2host(assoc_resp->aid);
    1235         memcpy(auth_data->bssid.address, mgmt_header->bssid, ETH_ADDR);
    1236        
    1237         ieee80211_dev->current_auth_phase = IEEE80211_AUTH_ASSOCIATED;
    1238        
    1239         ieee80211_dev->ops->bssid_change(ieee80211_dev);
    1240        
     1334        if(assoc_resp->status != 0) {
     1335                ieee80211_set_auth_phase(ieee80211_dev,
     1336                        IEEE80211_AUTH_DISCONNECTED);
     1337        } else {
     1338                ieee80211_dev->bssid_info.aid =
     1339                        uint16_t_le2host(assoc_resp->aid);
     1340                ieee80211_set_auth_phase(ieee80211_dev,
     1341                        IEEE80211_AUTH_ASSOCIATED);
     1342                ieee80211_dev->ops->bssid_change(ieee80211_dev, true);
     1343        }
     1344       
     1345        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    12411346        fibril_condvar_signal(&ieee80211_dev->gen_cond);
    12421347        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     
    14181523
    14191524        if(handshake_done) {
    1420                 /* Insert keys into device. */
    1421                
    1422                 /* Pairwise key. */
     1525                /* Insert Pairwise key. */
    14231526                ieee80211_key_config_t key_config;
    14241527                key_config.suite = auth_data->security.pair_alg;
     
    14321535                        &key_config, true);
    14331536               
    1434                 /* Group key. */
     1537                /* Insert Group key. */
    14351538                key_config.suite = auth_data->security.group_alg;
    14361539                key_config.flags =
Note: See TracChangeset for help on using the changeset viewer.