Ignore:
Timestamp:
2015-04-23T23:40:14Z (10 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
dcba819
Parents:
09044cb
Message:

pre-merge coding style cleanup and code review

File:
1 edited

Legend:

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

    r09044cb r8a64320e  
    3232
    3333/** @file ieee80211.c
    34  * 
     34 *
    3535 * IEEE 802.11 interface implementation.
    3636 */
     
    4141#include <macros.h>
    4242#include <errno.h>
    43 
    4443#include <ieee80211.h>
    4544#include <ieee80211_impl.h>
     
    4847#include <ops/ieee80211.h>
    4948
    50 #define IEEE80211_DATA_RATES_SIZE 8
    51 #define IEEE80211_EXT_DATA_RATES_SIZE 4
     49#define IEEE80211_DATA_RATES_SIZE      8
     50#define IEEE80211_EXT_DATA_RATES_SIZE  4
    5251
    5352#define ATOMIC_GET(state)
    5453
    5554/** Frame encapsulation used in IEEE 802.11. */
    56 static const uint8_t rfc1042_header[] = { 
    57         0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00
     55static const uint8_t rfc1042_header[] = {
     56        0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00
    5857};
    5958
    6059/** Broadcast MAC address. */
    6160static const uint8_t ieee80211_broadcast_mac_addr[] = {
    62         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
     61        0xff, 0xff, 0xff, 0xff, 0xff, 0xff
    6362};
    6463
    65 /**
    66  * Check data frame.
    67  *
     64/** Check data frame.
     65 *
    6866 * @param frame_ctrl Frame control field in little endian (!).
    69  * 
     67 *
    7068 * @return True if it is data frame, otherwise false.
     69 *
    7170 */
    7271inline bool ieee80211_is_data_frame(uint16_t frame_ctrl)
     
    7473        frame_ctrl = uint16_t_le2host(frame_ctrl);
    7574       
    76         return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_TYPE)
    77                 == IEEE80211_DATA_FRAME;
    78 }
    79 
    80 /**
    81  * Check management frame.
    82  *
     75        return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_TYPE) ==
     76            IEEE80211_DATA_FRAME;
     77}
     78
     79/** Check management frame.
     80 *
    8381 * @param frame_ctrl Frame control field in little endian (!).
    84  * 
     82 *
    8583 * @return True if it is management frame, otherwise false.
     84 *
    8685 */
    8786inline bool ieee80211_is_mgmt_frame(uint16_t frame_ctrl)
     
    8988        frame_ctrl = uint16_t_le2host(frame_ctrl);
    9089       
    91         return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_TYPE)
    92                 == IEEE80211_MGMT_FRAME;
    93 }
    94 
    95 /**
    96  * Check management beacon frame.
    97  *
     90        return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_TYPE) ==
     91            IEEE80211_MGMT_FRAME;
     92}
     93
     94/** Check management beacon frame.
     95 *
    9896 * @param frame_ctrl Frame control field in little endian (!).
    99  * 
     97 *
    10098 * @return True if it is beacon frame, otherwise false.
     99 *
    101100 */
    102101inline bool ieee80211_is_beacon_frame(uint16_t frame_ctrl)
     
    104103        frame_ctrl = uint16_t_le2host(frame_ctrl);
    105104       
    106         return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_SUBTYPE)
    107                 == IEEE80211_MGMT_BEACON_FRAME;
    108 }
    109 
    110 /**
    111  * Check management probe response frame.
    112  *
     105        return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_SUBTYPE) ==
     106            IEEE80211_MGMT_BEACON_FRAME;
     107}
     108
     109/** Check management probe response frame.
     110 *
    113111 * @param frame_ctrl Frame control field in little endian (!).
    114  * 
     112 *
    115113 * @return True if it is probe resp frame, otherwise false.
     114 *
    116115 */
    117116inline bool ieee80211_is_probe_response_frame(uint16_t frame_ctrl)
     
    119118        frame_ctrl = uint16_t_le2host(frame_ctrl);
    120119       
    121         return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_SUBTYPE)
    122                 == IEEE80211_MGMT_PROBE_RESP_FRAME;
    123 }
    124 
    125 /**
    126  * Check management authentication frame.
    127  *
     120        return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_SUBTYPE) ==
     121            IEEE80211_MGMT_PROBE_RESP_FRAME;
     122}
     123
     124/** Check management authentication frame.
     125 *
    128126 * @param frame_ctrl Frame control field in little endian (!).
    129  * 
     127 *
    130128 * @return True if it is auth frame, otherwise false.
     129 *
    131130 */
    132131inline bool ieee80211_is_auth_frame(uint16_t frame_ctrl)
     
    134133        frame_ctrl = uint16_t_le2host(frame_ctrl);
    135134       
    136         return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_SUBTYPE)
    137                 == IEEE80211_MGMT_AUTH_FRAME;
    138 }
    139 
    140 /**
    141  * Check management association response frame.
    142  *
     135        return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_SUBTYPE) ==
     136            IEEE80211_MGMT_AUTH_FRAME;
     137}
     138
     139/** Check management association response frame.
     140 *
    143141 * @param frame_ctrl Frame control field in little endian (!).
    144  * 
     142 *
    145143 * @return True if it is assoc resp frame, otherwise false.
     144 *
    146145 */
    147146inline bool ieee80211_is_assoc_response_frame(uint16_t frame_ctrl)
     
    149148        frame_ctrl = uint16_t_le2host(frame_ctrl);
    150149       
    151         return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_SUBTYPE)
    152                 == IEEE80211_MGMT_ASSOC_RESP_FRAME;
    153 }
    154 
    155 /**
    156  * Check data frame "to distribution system" direction.
    157  *
     150        return (frame_ctrl & IEEE80211_FRAME_CTRL_FRAME_SUBTYPE) ==
     151            IEEE80211_MGMT_ASSOC_RESP_FRAME;
     152}
     153
     154/** Check data frame "to distribution system" direction.
     155 *
    158156 * @param frame_ctrl Frame control field in little endian (!).
    159  * 
     157 *
    160158 * @return True if it is TODS frame, otherwise false.
     159 *
    161160 */
    162161inline bool ieee80211_is_tods_frame(uint16_t frame_ctrl)
     
    167166}
    168167
    169 /**
    170  * Check data frame "from distribution system" direction.
    171  *
     168/** Check data frame "from distribution system" direction.
     169 *
    172170 * @param frame_ctrl Frame control field in little endian (!).
    173  * 
     171 *
    174172 * @return True if it is FROMDS frame, otherwise false.
     173 *
    175174 */
    176175inline bool ieee80211_is_fromds_frame(uint16_t frame_ctrl)
     
    181180}
    182181
    183 /**
    184  * Check if it is data frame containing payload data.
    185  *
     182/** Check if it is data frame containing payload data.
     183 *
    186184 * @param frame_ctrl Frame control field in little endian (!).
    187  * 
     185 *
    188186 * @return True if it has payload data, otherwise false.
     187 *
    189188 */
    190189static inline bool ieee80211_has_data_frame(uint16_t frame_ctrl)
     
    192191        frame_ctrl = uint16_t_le2host(frame_ctrl);
    193192       
    194         return (frame_ctrl & (IEEE80211_FRAME_CTRL_FRAME_TYPE | 0x40))
    195                 == IEEE80211_DATA_FRAME;
    196 }
    197 
    198 /**
    199  * Check if it is encrypted frame.
    200  *
     193        return (frame_ctrl & (IEEE80211_FRAME_CTRL_FRAME_TYPE | 0x40)) ==
     194            IEEE80211_DATA_FRAME;
     195}
     196
     197/** Check if it is encrypted frame.
     198 *
    201199 * @param frame_ctrl Frame control field in little endian (!).
    202  * 
     200 *
    203201 * @return True if the frame is encrypted, otherwise false.
     202 *
    204203 */
    205204static inline bool ieee80211_is_encrypted_frame(uint16_t frame_ctrl)
     
    210209}
    211210
    212 /**
    213  * Check if PAE packet is EAPOL-Key frame.
    214  *
     211/** Check if PAE packet is EAPOL-Key frame.
     212 *
    215213 * @param key_frame Pointer to start of EAPOL frame.
    216  * 
     214 *
    217215 * @return True if it is EAPOL-Key frame, otherwise false.
    218  */
    219 static inline bool ieee80211_is_eapol_key_frame(ieee80211_eapol_key_frame_t
    220         *key_frame)
     216 *
     217 */
     218static inline bool
     219    ieee80211_is_eapol_key_frame(ieee80211_eapol_key_frame_t *key_frame)
    221220{
    222221        return (key_frame->packet_type == IEEE80211_EAPOL_KEY);
    223222}
    224223
    225 
    226 /**
    227  * Generate packet sequence number.
    228  *
     224/** Generate packet sequence number.
     225 *
    229226 * @param ieee80211_dev IEEE 802.11 device.
    230  * 
     227 *
    231228 * @return True if it has payload data, otherwise false.
     229 *
    232230 */
    233231static uint16_t ieee80211_get_sequence_number(ieee80211_dev_t *ieee80211_dev)
     
    235233        uint16_t ret_val = ieee80211_dev->sequence_number;
    236234        ieee80211_dev->sequence_number += (1 << 4);
     235       
    237236        return ret_val;
    238237}
    239238
    240 /**
    241  * Get driver-specific structure for IEEE 802.11 device.
    242  *
     239/** Get driver-specific structure for IEEE 802.11 device.
     240 *
    243241 * @param ieee80211_dev IEEE 802.11 device.
    244  * 
     242 *
    245243 * @return Driver-specific structure.
    246  */
    247 void *ieee80211_get_specific(ieee80211_dev_t* ieee80211_dev)
     244 *
     245 */
     246void *ieee80211_get_specific(ieee80211_dev_t *ieee80211_dev)
    248247{
    249248        return ieee80211_dev->specific;
    250249}
    251250
    252 /**
    253  * Set driver-specific structure for IEEE 802.11 device.
    254  *
     251/** Set driver-specific structure for IEEE 802.11 device.
     252 *
    255253 * @param ieee80211_dev IEEE 802.11 device.
    256  * @param specific Driver-specific structure.
    257  */
    258 void ieee80211_set_specific(ieee80211_dev_t* ieee80211_dev,
    259         void *specific)
     254 * @param specific      Driver-specific structure.
     255 *
     256 */
     257void ieee80211_set_specific(ieee80211_dev_t *ieee80211_dev,
     258    void *specific)
    260259{
    261260        ieee80211_dev->specific = specific;
    262261}
    263262
    264 /**
    265  * Get related DDF device.
    266  *
     263/** Get related DDF device.
     264 *
    267265 * @param ieee80211_dev IEEE 802.11 device.
    268  * 
     266 *
    269267 * @return DDF device.
    270  */
    271 ddf_dev_t *ieee80211_get_ddf_dev(ieee80211_dev_t* ieee80211_dev)
     268 *
     269 */
     270ddf_dev_t *ieee80211_get_ddf_dev(ieee80211_dev_t *ieee80211_dev)
    272271{
    273272        return ieee80211_dev->ddf_dev;
    274273}
    275274
    276 /**
    277  * Query current operating mode of IEEE 802.11 device.
    278  *
     275/** Query current operating mode of IEEE 802.11 device.
     276 *
    279277 * @param ieee80211_dev IEEE 802.11 device.
    280  * 
     278 *
    281279 * @return Current IEEE 802.11 operating mode.
    282  */
    283 ieee80211_operating_mode_t ieee80211_query_current_op_mode(ieee80211_dev_t*
    284         ieee80211_dev)
     280 *
     281 */
     282ieee80211_operating_mode_t
     283    ieee80211_query_current_op_mode(ieee80211_dev_t *ieee80211_dev)
    285284{
    286285        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     
    291290}
    292291
    293 /**
    294  * Query current frequency of IEEE 802.11 device.
    295  *
     292/** Query current frequency of IEEE 802.11 device.
     293 *
    296294 * @param ieee80211_dev IEEE 802.11 device.
    297  * 
     295 *
    298296 * @return Current device operating frequency.
    299  */
    300 uint16_t ieee80211_query_current_freq(ieee80211_dev_t* ieee80211_dev)
     297 *
     298 */
     299uint16_t ieee80211_query_current_freq(ieee80211_dev_t *ieee80211_dev)
    301300{
    302301        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     
    307306}
    308307
    309 /**
    310  * Query BSSID the device is connected to.
    311  *
     308/** Query BSSID the device is connected to.
     309 *
    312310 * Note: Expecting locked results_mutex.
    313  * 
     311 *
    314312 * @param ieee80211_dev IEEE 802.11 device.
    315  * @param bssid Pointer to structure where should be stored BSSID.
    316  */
    317 void ieee80211_query_bssid(ieee80211_dev_t* ieee80211_dev,
    318         nic_address_t *bssid)
     313 * @param bssid         Pointer to structure where should be stored BSSID.
     314 *
     315 */
     316void ieee80211_query_bssid(ieee80211_dev_t *ieee80211_dev,
     317    nic_address_t *bssid)
    319318{
    320319        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    321320       
    322         if(bssid) {
    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));
     321        if (bssid) {
     322                ieee80211_scan_result_link_t *res_link =
     323                    ieee80211_dev->bssid_info.res_link;
     324               
     325                if (res_link) {
     326                        memcpy(bssid, &res_link->scan_result.bssid,
     327                            sizeof(nic_address_t));
    329328                } else {
    330329                        nic_address_t broadcast_addr;
    331330                        memcpy(broadcast_addr.address,
    332                                 ieee80211_broadcast_mac_addr,
    333                                 ETH_ADDR);
     331                            ieee80211_broadcast_mac_addr, ETH_ADDR);
    334332                        memcpy(bssid, &broadcast_addr, sizeof(nic_address_t));
    335333                }
     
    339337}
    340338
    341 /**
    342  * Get AID of network we are connected to.
    343  *
     339/** Get AID of network we are connected to.
     340 *
    344341 * @param ieee80211_dev IEEE 802.11 device.
    345  * 
     342 *
    346343 * @return AID.
    347  */
    348 uint16_t ieee80211_get_aid(ieee80211_dev_t* ieee80211_dev)
     344 *
     345 */
     346uint16_t ieee80211_get_aid(ieee80211_dev_t *ieee80211_dev)
    349347{
    350348        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     
    355353}
    356354
    357 /**
    358  * Get pairwise security suite used for HW encryption.
    359  *
     355/** Get pairwise security suite used for HW encryption.
     356 *
    360357 * @param ieee80211_dev IEEE 802.11 device.
    361  * 
     358 *
    362359 * @return Security suite indicator.
    363  */
    364 int ieee80211_get_pairwise_security(ieee80211_dev_t* ieee80211_dev)
     360 *
     361 */
     362int ieee80211_get_pairwise_security(ieee80211_dev_t *ieee80211_dev)
    365363{
    366364        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    367         ieee80211_scan_result_link_t *auth_link = 
    368                 ieee80211_dev->bssid_info.res_link;
     365        ieee80211_scan_result_link_t *auth_link =
     366            ieee80211_dev->bssid_info.res_link;
    369367        int suite = auth_link->scan_result.security.pair_alg;
    370368        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     
    373371}
    374372
    375 /**
    376  * Check if IEEE 802.11 device is connected to network.
    377  *
     373/** Check if IEEE 802.11 device is connected to network.
     374 *
    378375 * @param ieee80211_dev IEEE 802.11 device.
    379  * 
     376 *
    380377 * @return True if device is connected to network, otherwise false.
    381  */
    382 bool ieee80211_is_connected(ieee80211_dev_t* ieee80211_dev)
     378 *
     379 */
     380bool ieee80211_is_connected(ieee80211_dev_t *ieee80211_dev)
    383381{
    384382        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    385         bool conn_state = 
    386                 ieee80211_dev->current_auth_phase == IEEE80211_AUTH_CONNECTED;
     383        bool conn_state =
     384            ieee80211_dev->current_auth_phase == IEEE80211_AUTH_CONNECTED;
    387385        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     386       
    388387        return conn_state;
    389388}
    390389
    391390void ieee80211_set_auth_phase(ieee80211_dev_t *ieee80211_dev,
    392         ieee80211_auth_phase_t auth_phase)
     391    ieee80211_auth_phase_t auth_phase)
    393392{
    394393        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     
    397396}
    398397
    399 ieee80211_auth_phase_t ieee80211_get_auth_phase(ieee80211_dev_t
    400         *ieee80211_dev)
     398ieee80211_auth_phase_t ieee80211_get_auth_phase(ieee80211_dev_t *ieee80211_dev)
    401399{
    402400        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    403401        ieee80211_auth_phase_t conn_state = ieee80211_dev->current_auth_phase;
    404402        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     403       
    405404        return conn_state;
    406405}
     
    419418        ieee80211_dev->pending_conn_req = false;
    420419        fibril_mutex_unlock(&ieee80211_dev->gen_mutex);
     420       
    421421        return conn_request;
    422422}
    423423
    424 /**
    425  * Report current operating mode for IEEE 802.11 device.
    426  *
     424/** Report current operating mode for IEEE 802.11 device.
     425 *
    427426 * @param ieee80211_dev IEEE 802.11 device.
    428  * @param op_mode Current IEEE 802.11 operating mode.
    429  */
    430 void ieee80211_report_current_op_mode(ieee80211_dev_t* ieee80211_dev,
    431         ieee80211_operating_mode_t op_mode)
     427 * @param op_mode       Current IEEE 802.11 operating mode.
     428 *
     429 */
     430void ieee80211_report_current_op_mode(ieee80211_dev_t *ieee80211_dev,
     431    ieee80211_operating_mode_t op_mode)
    432432{
    433433        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     
    436436}
    437437
    438 /**
    439  * Report current frequency for IEEE 802.11 device.
    440  *
     438/** Report current frequency for IEEE 802.11 device.
     439 *
    441440 * @param ieee80211_dev IEEE 802.11 device.
    442  * @param freq Current device operating frequency.
    443  */
    444 void ieee80211_report_current_freq(ieee80211_dev_t* ieee80211_dev,
    445         uint16_t freq)
     441 * @param freq          Current device operating frequency.
     442 *
     443 */
     444void ieee80211_report_current_freq(ieee80211_dev_t *ieee80211_dev,
     445    uint16_t freq)
    446446{
    447447        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     
    450450}
    451451
    452 /**
    453  * Check if IEEE 802.11 device is ready (fully initialized).
    454  *
     452/** Check if IEEE 802.11 device is ready (fully initialized).
     453 *
    455454 * @param ieee80211_dev IEEE 802.11 device.
    456  * 
     455 *
    457456 * @return True if device is ready to work, otherwise false.
    458  */
    459 bool ieee80211_is_ready(ieee80211_dev_t* ieee80211_dev)
     457 *
     458 */
     459bool ieee80211_is_ready(ieee80211_dev_t *ieee80211_dev)
    460460{
    461461        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     
    466466}
    467467
    468 /**
    469  * Set IEEE 802.11 device to ready state.
    470  *
     468/** Set IEEE 802.11 device to ready state.
     469 *
    471470 * @param ieee80211_dev IEEE 802.11 device.
    472  * @param ready Ready state to be set.
    473  */
    474 void ieee80211_set_ready(ieee80211_dev_t* ieee80211_dev, bool ready)
     471 * @param ready         Ready state to be set.
     472 *
     473 */
     474void ieee80211_set_ready(ieee80211_dev_t *ieee80211_dev, bool ready)
    475475{
    476476        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     
    479479}
    480480
    481 extern bool ieee80211_query_using_key(ieee80211_dev_t* ieee80211_dev)
     481extern bool ieee80211_query_using_key(ieee80211_dev_t *ieee80211_dev)
    482482{
    483483        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     
    488488}
    489489
    490 void ieee80211_setup_key_confirm(ieee80211_dev_t* ieee80211_dev,
    491         bool using_key)
     490void ieee80211_setup_key_confirm(ieee80211_dev_t *ieee80211_dev,
     491    bool using_key)
    492492{
    493493        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     
    502502        ieee80211_dev_t *ieee80211_dev = (ieee80211_dev_t *) arg;
    503503       
    504         while(true) {
     504        while (true) {
    505505                ieee80211_dev->ops->scan(ieee80211_dev);
    506506                async_usleep(SCAN_PERIOD_USEC);
     
    510510}
    511511
    512 /**
    513  * Implementation of NIC open callback for IEEE 802.11 devices.
    514  *
     512/** Implementation of NIC open callback for IEEE 802.11 devices.
     513 *
    515514 * @param fun NIC function.
    516  * 
     515 *
    517516 * @return EOK if succeed, negative error code otherwise.
     517 *
    518518 */
    519519static int ieee80211_open(ddf_fun_t *fun)
     
    522522        ieee80211_dev_t *ieee80211_dev = nic_get_specific(nic_data);
    523523       
    524         if(ieee80211_dev->started) {
     524        if (ieee80211_dev->started)
    525525                return EOK;
    526         } else {
    527                 ieee80211_dev->started = true;
    528         }
     526       
     527        ieee80211_dev->started = true;
    529528       
    530529        int rc = ieee80211_dev->ops->start(ieee80211_dev);
    531         if(rc != EOK)
     530        if (rc != EOK)
    532531                return rc;
    533532       
    534533        /* Add scanning fibril. */
    535534        fid_t fibril = fibril_create(ieee80211_scan, ieee80211_dev);
    536         if (fibril == 0) {
     535        if (fibril == 0)
    537536                return ENOMEM;
    538         }
     537       
    539538        fibril_add_ready(fibril);
    540539       
     
    542541}
    543542
    544 /**
    545  * Send frame handler.
    546  *
    547  * @param nic Pointer to NIC device.
     543/** Send frame handler.
     544 *
     545 * @param nic  Pointer to NIC device.
    548546 * @param data Data buffer.
    549547 * @param size Data buffer size.
     548 *
    550549 */
    551550static void ieee80211_send_frame(nic_t *nic, void *data, size_t size)
    552551{
    553         ieee80211_dev_t *ieee80211_dev = (ieee80211_dev_t *) 
    554                 nic_get_specific(nic);
    555        
    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) {
     552        ieee80211_dev_t *ieee80211_dev = (ieee80211_dev_t *)
     553            nic_get_specific(nic);
     554       
     555        ieee80211_auth_phase_t auth_phase =
     556            ieee80211_get_auth_phase(ieee80211_dev);
     557        if ((auth_phase != IEEE80211_AUTH_ASSOCIATED) &&
     558            (auth_phase != IEEE80211_AUTH_CONNECTED))
    560559                return;
    561         }
    562560       
    563561        ieee80211_scan_result_t *auth_data =
    564                         &ieee80211_dev->bssid_info.res_link->scan_result;
     562            &ieee80211_dev->bssid_info.res_link->scan_result;
    565563       
    566564        /* We drop part of IEEE 802.3 ethernet header. */
    567565        size_t drop_bytes = sizeof(eth_header_t) - 2;
    568566       
    569         size_t complete_size = (size - drop_bytes) + 
    570                 sizeof(ieee80211_data_header_t) +
    571                 ARRAY_SIZE(rfc1042_header);
     567        size_t complete_size = (size - drop_bytes) +
     568            sizeof(ieee80211_data_header_t) +
     569            ARRAY_SIZE(rfc1042_header);
    572570       
    573571        /* Init crypto data. */
     
    579577       
    580578        // TODO: Distinguish used key (pair/group) by dest address ?
    581         if(ieee80211_query_using_key(ieee80211_dev)) {
     579        if (ieee80211_query_using_key(ieee80211_dev)) {
    582580                int sec_suite = auth_data->security.pair_alg;
    583                 switch(sec_suite) {
    584                         case IEEE80211_SECURITY_SUITE_TKIP:
    585                                 head_space = IEEE80211_TKIP_HEADER_LENGTH;
    586                                 mic_space = MIC_LENGTH;
    587                                 add_mic = true;
    588                                 break;
    589                         case IEEE80211_SECURITY_SUITE_CCMP:
    590                                 head_space = IEEE80211_CCMP_HEADER_LENGTH;
    591                                 head_data[3] = 0x20;
    592                                 break;
    593                         default:
    594                                 break;
     581                switch (sec_suite) {
     582                case IEEE80211_SECURITY_SUITE_TKIP:
     583                        head_space = IEEE80211_TKIP_HEADER_LENGTH;
     584                        mic_space = MIC_LENGTH;
     585                        add_mic = true;
     586                        break;
     587                case IEEE80211_SECURITY_SUITE_CCMP:
     588                        head_space = IEEE80211_CCMP_HEADER_LENGTH;
     589                        head_data[3] = 0x20;
     590                        break;
     591                default:
     592                        break;
    595593                }
    596 
     594               
    597595                crypto = uint16_t_le2host(IEEE80211_FRAME_CTRL_PROTECTED);
    598596        }
     
    601599       
    602600        void *complete_buffer = malloc(complete_size);
     601        if (!complete_buffer)
     602                return;
     603       
    603604        memset(complete_buffer, 0, complete_size);
    604605       
    605         if(head_space) {
     606        if (head_space)
    606607                memcpy(complete_buffer + sizeof(ieee80211_data_header_t),
    607                         head_data, head_space);
    608         }
     608                    head_data, head_space);
    609609       
    610610        memcpy(complete_buffer + sizeof(ieee80211_data_header_t) + head_space,
    611                 rfc1042_header,
    612                 ARRAY_SIZE(rfc1042_header));
    613        
    614         memcpy(complete_buffer +
    615                 sizeof(ieee80211_data_header_t) +
    616                 ARRAY_SIZE(rfc1042_header) + head_space,
    617                 data + drop_bytes, size - drop_bytes);
     611            rfc1042_header, ARRAY_SIZE(rfc1042_header));
     612       
     613        memcpy(complete_buffer + sizeof(ieee80211_data_header_t) +
     614            ARRAY_SIZE(rfc1042_header) + head_space,
     615            data + drop_bytes, size - drop_bytes);
    618616       
    619617        ieee80211_data_header_t *data_header =
    620                 (ieee80211_data_header_t *) complete_buffer;
    621         data_header->frame_ctrl = 
    622                 uint16_t_le2host(IEEE80211_DATA_FRAME) |
    623                 uint16_t_le2host(IEEE80211_DATA_DATA_FRAME) |
    624                 uint16_t_le2host(IEEE80211_FRAME_CTRL_TODS) |
    625                 crypto;
     618            (ieee80211_data_header_t *) complete_buffer;
     619        data_header->frame_ctrl =
     620            uint16_t_le2host(IEEE80211_DATA_FRAME) |
     621            uint16_t_le2host(IEEE80211_DATA_DATA_FRAME) |
     622            uint16_t_le2host(IEEE80211_FRAME_CTRL_TODS) |
     623            crypto;
    626624        data_header->seq_ctrl = ieee80211_get_sequence_number(ieee80211_dev);
    627625       
    628626        /* BSSID, SA, DA. */
    629         memcpy(data_header->address1, auth_data->bssid.address, ETH_ADDR);
     627        memcpy(data_header->address1, auth_data->bssid.address, ETH_ADDR);
    630628        memcpy(data_header->address2, data + ETH_ADDR, ETH_ADDR);
    631629        memcpy(data_header->address3, data, ETH_ADDR);
    632630       
    633         if(add_mic) {
     631        if (add_mic) {
    634632                size_t size_wo_mic = complete_size - MIC_LENGTH;
    635633                uint8_t *tx_mic = ieee80211_dev->bssid_info.ptk +
    636                         TK_OFFSET +
    637                         IEEE80211_TKIP_TX_MIC_OFFSET;
     634                    TK_OFFSET + IEEE80211_TKIP_TX_MIC_OFFSET;
    638635                ieee80211_michael_mic(tx_mic, complete_buffer, size_wo_mic,
    639                         complete_buffer + size_wo_mic);
    640         }
    641        
    642         ieee80211_dev->ops->tx_handler(ieee80211_dev,
    643                 complete_buffer,
    644                 complete_size);
     636                    complete_buffer + size_wo_mic);
     637        }
     638       
     639        ieee80211_dev->ops->tx_handler(ieee80211_dev,
     640            complete_buffer, complete_size);
    645641       
    646642        free(complete_buffer);
    647643}
    648644
    649 /**
    650  * Fill out IEEE 802.11 device functions implementations.
    651  *
    652  * @param ieee80211_dev IEEE 802.11 device.
    653  * @param ieee80211_ops Callbacks implementation.
     645/** Fill out IEEE 802.11 device functions implementations.
     646 *
     647 * @param ieee80211_dev   IEEE 802.11 device.
     648 * @param ieee80211_ops   Callbacks implementation.
    654649 * @param ieee80211_iface Interface functions implementation.
    655  * @param nic_iface NIC interface functions implementation.
    656  * @param nic_dev_ops NIC device functions implementation.
    657  *
    658  * @return EINVAL when missing pointer to ieee80211_ops or ieee80211_iface,
    659  * otherwise EOK.
    660  */
    661 static int ieee80211_implement(ieee80211_dev_t *ieee80211_dev,
    662         ieee80211_ops_t *ieee80211_ops, ieee80211_iface_t *ieee80211_iface,
    663         nic_iface_t *nic_iface, ddf_dev_ops_t *nic_dev_ops)
    664 {
    665         if(ieee80211_ops) {
    666                 if(!ieee80211_ops->start)
     650 * @param nic_iface       NIC interface functions implementation.
     651 * @param nic_dev_ops     NIC device functions implementation.
     652 *
     653 * @return EINVAL when missing pointer to ieee80211_ops
     654 *         or ieee80211_iface, otherwise EOK.
     655 *
     656 */
     657static int ieee80211_implement(ieee80211_dev_t *ieee80211_dev,
     658    ieee80211_ops_t *ieee80211_ops, ieee80211_iface_t *ieee80211_iface,
     659    nic_iface_t *nic_iface, ddf_dev_ops_t *nic_dev_ops)
     660{
     661        if (ieee80211_ops) {
     662                if (!ieee80211_ops->start)
    667663                        ieee80211_ops->start = ieee80211_start_impl;
    668 
    669                 if(!ieee80211_ops->tx_handler)
     664               
     665                if (!ieee80211_ops->tx_handler)
    670666                        ieee80211_ops->tx_handler = ieee80211_tx_handler_impl;
    671 
    672                 if(!ieee80211_ops->set_freq)
     667               
     668                if (!ieee80211_ops->set_freq)
    673669                        ieee80211_ops->set_freq = ieee80211_set_freq_impl;
    674670               
    675                 if(!ieee80211_ops->bssid_change)
    676                         ieee80211_ops->bssid_change =
    677                                 ieee80211_bssid_change_impl;
    678                
    679                 if(!ieee80211_ops->key_config)
     671                if (!ieee80211_ops->bssid_change)
     672                        ieee80211_ops->bssid_change = ieee80211_bssid_change_impl;
     673               
     674                if (!ieee80211_ops->key_config)
    680675                        ieee80211_ops->key_config = ieee80211_key_config_impl;
    681676               
    682                 if(!ieee80211_ops->scan)
     677                if (!ieee80211_ops->scan)
    683678                        ieee80211_ops->scan = ieee80211_scan_impl;
    684         } else {
     679        } else
    685680                return EINVAL;
    686         }
    687681       
    688682        ieee80211_dev->ops = ieee80211_ops;
    689683       
    690         if(ieee80211_iface) {
    691                 if(nic_dev_ops)
     684        if (ieee80211_iface) {
     685                if (nic_dev_ops)
    692686                        if (!nic_dev_ops->interfaces[IEEE80211_DEV_IFACE])
    693                                 nic_dev_ops->interfaces[IEEE80211_DEV_IFACE] = 
    694                                         ieee80211_iface;
    695                
    696                 if(!ieee80211_iface->get_scan_results)
    697                         ieee80211_iface->get_scan_results = 
    698                                 ieee80211_get_scan_results_impl;
    699                
    700                 if(!ieee80211_iface->connect)
     687                                nic_dev_ops->interfaces[IEEE80211_DEV_IFACE] =
     688                                    ieee80211_iface;
     689               
     690                if (!ieee80211_iface->get_scan_results)
     691                        ieee80211_iface->get_scan_results =
     692                            ieee80211_get_scan_results_impl;
     693               
     694                if (!ieee80211_iface->connect)
    701695                        ieee80211_iface->connect = ieee80211_connect_impl;
    702696               
    703                 if(!ieee80211_iface->disconnect)
     697                if (!ieee80211_iface->disconnect)
    704698                        ieee80211_iface->disconnect = ieee80211_disconnect_impl;
    705         } else {
     699        } else
    706700                return EINVAL;
    707         }
    708        
    709         if(nic_dev_ops) {
    710                 if(!nic_dev_ops->open)
     701       
     702        if (nic_dev_ops) {
     703                if (!nic_dev_ops->open)
    711704                        nic_dev_ops->open = ieee80211_open;
    712         } else {
     705        } else
    713706                return EINVAL;
    714         }
    715707       
    716708        ieee80211_dev->iface = ieee80211_iface;
     
    721713}
    722714
    723 /**
    724  * Allocate IEEE802.11 device structure.
    725  *
     715/** Allocate IEEE802.11 device structure.
     716 *
    726717 * @return Pointer to allocated IEEE802.11 device structure.
     718 *
    727719 */
    728720ieee80211_dev_t *ieee80211_device_create()
     
    731723}
    732724
    733 /**
    734  * Initialize an IEEE802.11 framework structure.
    735  *
     725/** Initialize an IEEE802.11 framework structure.
     726 *
    736727 * @param ieee80211_dev Device structure to initialize.
    737  * @param ddf_dev Pointer to backing DDF device structure.
    738  * 
     728 * @param ddf_dev       Pointer to backing DDF device structure.
     729 *
    739730 * @return EOK if succeed, negative error code otherwise.
     731 *
    740732 */
    741733int ieee80211_device_init(ieee80211_dev_t *ieee80211_dev, ddf_dev_t *ddf_dev)
     
    748740        ieee80211_dev->current_op_mode = IEEE80211_OPMODE_STATION;
    749741        ieee80211_dev->current_auth_phase = IEEE80211_AUTH_DISCONNECTED;
    750         memcpy(ieee80211_dev->bssid_mask.address, ieee80211_broadcast_mac_addr,
    751                 ETH_ADDR);
     742       
     743        memcpy(ieee80211_dev->bssid_mask.address, ieee80211_broadcast_mac_addr,
     744            ETH_ADDR);
    752745       
    753746        ieee80211_scan_result_list_init(&ieee80211_dev->ap_list);
     
    759752        /* Bind NIC to device */
    760753        nic_t *nic = nic_create_and_bind(ddf_dev);
    761         if (!nic) {
     754        if (!nic)
    762755                return ENOMEM;
    763         }
    764756       
    765757        nic_set_specific(nic, ieee80211_dev);
     
    768760}
    769761
    770 /**
    771  * IEEE802.11 WiFi framework initialization.
    772  *
    773  * @param ieee80211_dev Device structure to initialize.
    774  * @param ieee80211_ops Structure with implemented IEEE802.11 device operations.
    775  * @param ieee80211_iface Structure with implemented IEEE802.11 interface
    776  * operations.
    777  * 
     762/** IEEE802.11 WiFi framework initialization.
     763 *
     764 * @param ieee80211_dev   Device structure to initialize.
     765 * @param ieee80211_ops   Structure with implemented IEEE802.11
     766 *                       device operations.
     767 * @param ieee80211_iface Structure with implemented IEEE802.11
     768 *                        interface operations.
     769 *
    778770 * @return EOK if succeed, negative error code otherwise.
    779  */
    780 int ieee80211_init(ieee80211_dev_t *ieee80211_dev,
    781         ieee80211_ops_t *ieee80211_ops, ieee80211_iface_t *ieee80211_iface,
    782         nic_iface_t *ieee80211_nic_iface, ddf_dev_ops_t *ieee80211_nic_dev_ops)
    783 {
    784         int rc = ieee80211_implement(ieee80211_dev,
    785                 ieee80211_ops, ieee80211_iface,
    786                 ieee80211_nic_iface, ieee80211_nic_dev_ops);
    787         if(rc != EOK) {
     771 *
     772 */
     773int ieee80211_init(ieee80211_dev_t *ieee80211_dev,
     774    ieee80211_ops_t *ieee80211_ops, ieee80211_iface_t *ieee80211_iface,
     775    nic_iface_t *ieee80211_nic_iface, ddf_dev_ops_t *ieee80211_nic_dev_ops)
     776{
     777        int rc = ieee80211_implement(ieee80211_dev,
     778            ieee80211_ops, ieee80211_iface,
     779            ieee80211_nic_iface, ieee80211_nic_dev_ops);
     780        if (rc != EOK)
    788781                return rc;
    789         }
    790782       
    791783        nic_t *nic = nic_get_from_ddf_dev(ieee80211_dev->ddf_dev);
    792784       
    793         /** TODO: Set NIC handlers here. */
     785        /* TODO: Set NIC handlers here. */
    794786        nic_set_send_frame_handler(nic, ieee80211_send_frame);
    795787       
    796         ddf_fun_t *fun = ddf_fun_create(ieee80211_dev->ddf_dev, fun_exposed, 
    797                 "port0");
    798         if (fun == NULL) {
     788        ddf_fun_t *fun = ddf_fun_create(ieee80211_dev->ddf_dev, fun_exposed,
     789            "port0");
     790        if (fun == NULL)
    799791                return EINVAL;
    800         }
    801792       
    802793        nic_set_ddf_fun(nic, fun);
     
    808799                return rc;
    809800        }
     801       
    810802        rc = ddf_fun_add_to_category(fun, DEVICE_CATEGORY_NIC);
    811803        if (rc != EOK) {
     
    813805                return rc;
    814806        }
     807       
    815808        rc = ddf_fun_add_to_category(fun, DEVICE_CATEGORY_IEEE80211);
    816809        if (rc != EOK) {
     
    822815}
    823816
    824 /**
    825  * Convert frequency value to channel number.
    826  *
     817/** Convert frequency value to channel number.
     818 *
    827819 * @param freq IEEE 802.11 operating frequency.
    828  * 
     820 *
    829821 * @return Operating channel number.
     822 *
    830823 */
    831824static uint8_t ieee80211_freq_to_channel(uint16_t freq)
     
    835828
    836829static void ieee80211_prepare_ie_header(void **ie_header,
    837         uint8_t id, uint8_t length, void *data)
     830    uint8_t id, uint8_t length, void *data)
    838831{
    839832        ieee80211_ie_header_t *header =
    840                 (ieee80211_ie_header_t *) *ie_header;
     833            (ieee80211_ie_header_t *) *ie_header;
    841834       
    842835        header->element_id = id;
     
    845838        memcpy(*ie_header + sizeof(ieee80211_ie_header_t), data, length);
    846839       
    847         *ie_header = (void *) ((void *) header +
    848                 sizeof(ieee80211_ie_header_t) + length);
    849 }
    850 
    851 /**
    852  * Probe request implementation.
    853  *
     840        *ie_header = (void *) ((void *) header +
     841            sizeof(ieee80211_ie_header_t) + length);
     842}
     843
     844/** Probe request implementation.
     845 *
    854846 * @param ieee80211_dev Pointer to IEEE 802.11 device structure.
    855  * @param ssid Probing SSID or NULL if broadcast.
    856  * 
     847 * @param ssid          Probing SSID or NULL if broadcast.
     848 *
    857849 * @return EOK if succeed, negative error code otherwise.
     850 *
    858851 */
    859852int ieee80211_probe_request(ieee80211_dev_t *ieee80211_dev, char *ssid)
     
    866859        size_t channel_data_size = 1;
    867860       
    868         uint8_t channel =
    869                 ieee80211_freq_to_channel(ieee80211_dev->current_freq);
    870        
    871         /* 4 headers - (ssid, rates, ext rates, current channel) and their data
    872          * lengths.
     861        uint8_t channel =
     862            ieee80211_freq_to_channel(ieee80211_dev->current_freq);
     863       
     864        /*
     865         * 4 headers - (ssid, rates, ext rates, current channel)
     866         * and their data lengths.
    873867         */
    874         size_t payload_size = 
    875                 sizeof(ieee80211_ie_header_t) * 4 +
    876                 ssid_data_size +
    877                 IEEE80211_DATA_RATES_SIZE + IEEE80211_EXT_DATA_RATES_SIZE +
    878                 channel_data_size;
     868        size_t payload_size =
     869            sizeof(ieee80211_ie_header_t) * 4 +
     870            ssid_data_size +
     871            IEEE80211_DATA_RATES_SIZE + IEEE80211_EXT_DATA_RATES_SIZE +
     872            channel_data_size;
    879873       
    880874        size_t buffer_size = sizeof(ieee80211_mgmt_header_t) + payload_size;
    881875        void *buffer = malloc(buffer_size);
     876        if (!buffer)
     877                return ENOMEM;
     878       
    882879        memset(buffer, 0, buffer_size);
    883880       
    884         ieee80211_mgmt_header_t *mgmt_header =
    885                 (ieee80211_mgmt_header_t *) buffer;
    886        
    887         mgmt_header->frame_ctrl = host2uint16_t_le(
    888                 IEEE80211_MGMT_FRAME |
    889                 IEEE80211_MGMT_PROBE_REQ_FRAME
    890                 );
     881        ieee80211_mgmt_header_t *mgmt_header =
     882            (ieee80211_mgmt_header_t *) buffer;
     883       
     884        mgmt_header->frame_ctrl =
     885            host2uint16_t_le(IEEE80211_MGMT_FRAME |
     886            IEEE80211_MGMT_PROBE_REQ_FRAME);
    891887        memcpy(mgmt_header->dest_addr, ieee80211_broadcast_mac_addr, ETH_ADDR);
    892888        memcpy(mgmt_header->src_addr, nic_address.address, ETH_ADDR);
    893889        memcpy(mgmt_header->bssid, ieee80211_broadcast_mac_addr, ETH_ADDR);
    894         mgmt_header->seq_ctrl = 
    895                 host2uint16_t_le(ieee80211_get_sequence_number(ieee80211_dev));
     890        mgmt_header->seq_ctrl =
     891            host2uint16_t_le(ieee80211_get_sequence_number(ieee80211_dev));
    896892       
    897893        /* Jump to payload. */
    898894        void *it = (void *) buffer + sizeof(ieee80211_mgmt_header_t);
    899         ieee80211_prepare_ie_header(&it, IEEE80211_SSID_IE, ssid_data_size,
    900                 (void *) ssid);
    901         ieee80211_prepare_ie_header(&it, IEEE80211_RATES_IE,
    902                 IEEE80211_DATA_RATES_SIZE,
    903                 (void *) &ieee80211bg_data_rates);
    904         ieee80211_prepare_ie_header(&it, IEEE80211_EXT_RATES_IE,
    905                 IEEE80211_EXT_DATA_RATES_SIZE,
    906                 (void *) &ieee80211bg_data_rates[IEEE80211_DATA_RATES_SIZE]);
    907         ieee80211_prepare_ie_header(&it, IEEE80211_CHANNEL_IE,
    908                 channel_data_size, (void *) &channel);
     895        ieee80211_prepare_ie_header(&it, IEEE80211_SSID_IE, ssid_data_size,
     896            (void *) ssid);
     897        ieee80211_prepare_ie_header(&it, IEEE80211_RATES_IE,
     898            IEEE80211_DATA_RATES_SIZE, (void *) &ieee80211bg_data_rates);
     899        ieee80211_prepare_ie_header(&it, IEEE80211_EXT_RATES_IE,
     900            IEEE80211_EXT_DATA_RATES_SIZE,
     901            (void *) &ieee80211bg_data_rates[IEEE80211_DATA_RATES_SIZE]);
     902        ieee80211_prepare_ie_header(&it, IEEE80211_CHANNEL_IE,
     903            channel_data_size, (void *) &channel);
    909904       
    910905        ieee80211_dev->ops->tx_handler(ieee80211_dev, buffer, buffer_size);
     
    915910}
    916911
    917 /**
    918  * IEEE 802.11 authentication implementation.
    919  *
     912/** IEEE 802.11 authentication implementation.
     913 *
    920914 * @param ieee80211_dev Pointer to IEEE 802.11 device structure.
    921  * 
     915 *
    922916 * @return EOK if succeed, negative error code otherwise.
     917 *
    923918 */
    924919int ieee80211_authenticate(ieee80211_dev_t *ieee80211_dev)
     
    929924       
    930925        ieee80211_scan_result_t *auth_data =
    931                 &ieee80211_dev->bssid_info.res_link->scan_result;
    932        
    933         size_t buffer_size = sizeof(ieee80211_mgmt_header_t) + 
    934                 sizeof(ieee80211_auth_body_t);
     926            &ieee80211_dev->bssid_info.res_link->scan_result;
     927       
     928        size_t buffer_size = sizeof(ieee80211_mgmt_header_t) +
     929            sizeof(ieee80211_auth_body_t);
    935930       
    936931        void *buffer = malloc(buffer_size);
     932        if (!buffer)
     933                return ENOMEM;
     934       
    937935        memset(buffer, 0, buffer_size);
    938936       
    939         ieee80211_mgmt_header_t *mgmt_header =
    940                 (ieee80211_mgmt_header_t *) buffer;
    941        
    942         mgmt_header->frame_ctrl = host2uint16_t_le(
    943                 IEEE80211_MGMT_FRAME |
    944                 IEEE80211_MGMT_AUTH_FRAME
    945                 );
     937        ieee80211_mgmt_header_t *mgmt_header =
     938            (ieee80211_mgmt_header_t *) buffer;
     939       
     940        mgmt_header->frame_ctrl =
     941            host2uint16_t_le(IEEE80211_MGMT_FRAME |
     942            IEEE80211_MGMT_AUTH_FRAME);
    946943        memcpy(mgmt_header->dest_addr, auth_data->bssid.address, ETH_ADDR);
    947944        memcpy(mgmt_header->src_addr, nic_address.address, ETH_ADDR);
     
    949946       
    950947        ieee80211_auth_body_t *auth_body =
    951                 (ieee80211_auth_body_t *)
    952                 (buffer + sizeof(ieee80211_mgmt_header_t));
     948            (ieee80211_auth_body_t *)
     949            (buffer + sizeof(ieee80211_mgmt_header_t));
    953950        auth_body->auth_alg = host2uint16_t_le(0);
    954951        auth_body->auth_trans_no = host2uint16_t_le(1);
     
    961958}
    962959
    963 /**
    964  * IEEE 802.11 association implementation.
    965  *
     960/** IEEE 802.11 association implementation.
     961 *
    966962 * @param ieee80211_dev Pointer to IEEE 802.11 device structure.
    967  * @param password Passphrase to be used in encrypted communication or NULL
    968  * for open networks.
    969  * 
     963 * @param password      Passphrase to be used in encrypted communication
     964 *                      or NULL for open networks.
     965 *
    970966 * @return EOK if succeed, negative error code otherwise.
    971  */
    972 int ieee80211_associate(ieee80211_dev_t *ieee80211_dev, char *password)
     967 *
     968 */
     969int ieee80211_associate(ieee80211_dev_t *ieee80211_dev, char *password)
    973970{
    974971        nic_t *nic = nic_get_from_ddf_dev(ieee80211_dev->ddf_dev);
     
    977974       
    978975        ieee80211_scan_result_link_t *auth_link =
    979                 ieee80211_dev->bssid_info.res_link;
     976            ieee80211_dev->bssid_info.res_link;
    980977       
    981978        ieee80211_scan_result_t *auth_data = &auth_link->scan_result;
     
    983980        size_t ssid_data_size = str_size(auth_data->ssid);
    984981       
    985         size_t payload_size = 
    986                 sizeof(ieee80211_ie_header_t) * 3 +
    987                 ssid_data_size +
    988                 IEEE80211_DATA_RATES_SIZE +
    989                 IEEE80211_EXT_DATA_RATES_SIZE;
    990        
    991         size_t buffer_size = 
    992                 sizeof(ieee80211_mgmt_header_t) +
    993                 sizeof(ieee80211_assoc_req_body_t) +
    994                 payload_size;
    995        
    996         if(auth_data->security.type == IEEE80211_SECURITY_WPA ||
    997                 auth_data->security.type == IEEE80211_SECURITY_WPA2) {
     982        size_t payload_size =
     983            sizeof(ieee80211_ie_header_t) * 3 +
     984            ssid_data_size +
     985            IEEE80211_DATA_RATES_SIZE +
     986            IEEE80211_EXT_DATA_RATES_SIZE;
     987       
     988        size_t buffer_size =
     989            sizeof(ieee80211_mgmt_header_t) +
     990            sizeof(ieee80211_assoc_req_body_t) +
     991            payload_size;
     992       
     993        if ((auth_data->security.type == IEEE80211_SECURITY_WPA) ||
     994            (auth_data->security.type == IEEE80211_SECURITY_WPA2))
    998995                buffer_size += auth_link->auth_ie_len;
    999         }
    1000996       
    1001997        void *buffer = malloc(buffer_size);
     998        if (!buffer)
     999                return ENOMEM;
     1000       
    10021001        memset(buffer, 0, buffer_size);
    10031002       
    1004         ieee80211_mgmt_header_t *mgmt_header =
    1005                 (ieee80211_mgmt_header_t *) buffer;
    1006        
    1007         mgmt_header->frame_ctrl = host2uint16_t_le(
    1008                 IEEE80211_MGMT_FRAME |
    1009                 IEEE80211_MGMT_ASSOC_REQ_FRAME
    1010                 );
     1003        ieee80211_mgmt_header_t *mgmt_header =
     1004            (ieee80211_mgmt_header_t *) buffer;
     1005       
     1006        mgmt_header->frame_ctrl =
     1007            host2uint16_t_le(IEEE80211_MGMT_FRAME |
     1008            IEEE80211_MGMT_ASSOC_REQ_FRAME);
    10111009        memcpy(mgmt_header->dest_addr, auth_data->bssid.address, ETH_ADDR);
    10121010        memcpy(mgmt_header->src_addr, nic_address.address, ETH_ADDR);
     
    10141012       
    10151013        ieee80211_assoc_req_body_t *assoc_body =
    1016                 (ieee80211_assoc_req_body_t *)
    1017                 (buffer + sizeof(ieee80211_mgmt_header_t));
     1014            (ieee80211_assoc_req_body_t *)
     1015            (buffer + sizeof(ieee80211_mgmt_header_t));
    10181016        assoc_body->listen_interval = host2uint16_t_le(1);
    10191017       
    10201018        /* Jump to payload. */
    10211019        void *it = buffer + sizeof(ieee80211_mgmt_header_t) +
    1022                 sizeof(ieee80211_assoc_req_body_t);
    1023         ieee80211_prepare_ie_header(&it, IEEE80211_SSID_IE,
    1024                 ssid_data_size, (void *) auth_data->ssid);
    1025         ieee80211_prepare_ie_header(&it, IEEE80211_RATES_IE,
    1026                 IEEE80211_DATA_RATES_SIZE,
    1027                 (void *) &ieee80211bg_data_rates);
    1028         ieee80211_prepare_ie_header(&it, IEEE80211_EXT_RATES_IE,
    1029                 IEEE80211_EXT_DATA_RATES_SIZE,
    1030                 (void *) &ieee80211bg_data_rates[IEEE80211_DATA_RATES_SIZE]);
    1031        
    1032         if(auth_data->security.type != IEEE80211_SECURITY_OPEN) {
     1020            sizeof(ieee80211_assoc_req_body_t);
     1021        ieee80211_prepare_ie_header(&it, IEEE80211_SSID_IE,
     1022            ssid_data_size, (void *) auth_data->ssid);
     1023        ieee80211_prepare_ie_header(&it, IEEE80211_RATES_IE,
     1024            IEEE80211_DATA_RATES_SIZE, (void *) &ieee80211bg_data_rates);
     1025        ieee80211_prepare_ie_header(&it, IEEE80211_EXT_RATES_IE,
     1026            IEEE80211_EXT_DATA_RATES_SIZE,
     1027            (void *) &ieee80211bg_data_rates[IEEE80211_DATA_RATES_SIZE]);
     1028       
     1029        if (auth_data->security.type != IEEE80211_SECURITY_OPEN)
    10331030                assoc_body->capability |= host2uint16_t_le(CAP_SECURITY);
    1034         }
    1035        
    1036         if(auth_data->security.type == IEEE80211_SECURITY_WPA ||
    1037                 auth_data->security.type == IEEE80211_SECURITY_WPA2) {
    1038                 memcpy(it, auth_link->auth_ie,  auth_link->auth_ie_len);
    1039         }
     1031       
     1032        if ((auth_data->security.type == IEEE80211_SECURITY_WPA) ||
     1033            (auth_data->security.type == IEEE80211_SECURITY_WPA2))
     1034                memcpy(it, auth_link->auth_ie, auth_link->auth_ie_len);
    10401035       
    10411036        ieee80211_dev->ops->tx_handler(ieee80211_dev, buffer, buffer_size);
    10421037       
    1043         /* 
    1044          * Save password to be used in eventual authentication handshake. 
     1038        /*
     1039         * Save password to be used in eventual authentication handshake.
    10451040         */
    10461041        memset(ieee80211_dev->bssid_info.password, 0, IEEE80211_MAX_PASSW_LEN);
    1047         memcpy(ieee80211_dev->bssid_info.password, password, 
    1048                 str_size(password));
     1042        memcpy(ieee80211_dev->bssid_info.password, password,
     1043            str_size(password));
    10491044       
    10501045        free(buffer);
     
    10531048}
    10541049
    1055 /**
    1056  * IEEE 802.11 deauthentication implementation.
    1057  *
     1050/** IEEE 802.11 deauthentication implementation.
     1051 *
    10581052 * Note: Expecting locked results_mutex or scan_mutex.
    1059  * 
     1053 *
    10601054 * @param ieee80211_dev Pointer to IEEE 802.11 device structure.
    1061  * 
     1055 *
    10621056 * @return EOK if succeed, negative error code otherwise.
     1057 *
    10631058 */
    10641059int ieee80211_deauthenticate(ieee80211_dev_t *ieee80211_dev)
    10651060{
    10661061        ieee80211_scan_result_t *auth_data =
    1067                 &ieee80211_dev->bssid_info.res_link->scan_result;
     1062            &ieee80211_dev->bssid_info.res_link->scan_result;
    10681063       
    10691064        nic_t *nic = nic_get_from_ddf_dev(ieee80211_dev->ddf_dev);
     
    10711066        nic_query_address(nic, &nic_address);
    10721067       
    1073         size_t buffer_size = sizeof(ieee80211_mgmt_header_t) +
    1074                 sizeof(ieee80211_deauth_body_t);
     1068        size_t buffer_size = sizeof(ieee80211_mgmt_header_t) +
     1069            sizeof(ieee80211_deauth_body_t);
     1070       
    10751071        void *buffer = malloc(buffer_size);
     1072        if (!buffer)
     1073                return ENOMEM;
     1074       
    10761075        memset(buffer, 0, buffer_size);
    10771076       
    1078         ieee80211_mgmt_header_t *mgmt_header =
    1079                 (ieee80211_mgmt_header_t *) buffer;
    1080        
    1081         mgmt_header->frame_ctrl = host2uint16_t_le(
    1082                 IEEE80211_MGMT_FRAME |
    1083                 IEEE80211_MGMT_DEAUTH_FRAME
    1084                 );
     1077        ieee80211_mgmt_header_t *mgmt_header =
     1078            (ieee80211_mgmt_header_t *) buffer;
     1079       
     1080        mgmt_header->frame_ctrl =
     1081            host2uint16_t_le(IEEE80211_MGMT_FRAME |
     1082            IEEE80211_MGMT_DEAUTH_FRAME);
    10851083        memcpy(mgmt_header->dest_addr, auth_data->bssid.address, ETH_ADDR);
    10861084        memcpy(mgmt_header->src_addr, nic_address.address, ETH_ADDR);
     
    10941092        ieee80211_dev->ops->bssid_change(ieee80211_dev, false);
    10951093       
    1096         if(ieee80211_query_using_key(ieee80211_dev))
     1094        if (ieee80211_query_using_key(ieee80211_dev))
    10971095                ieee80211_dev->ops->key_config(ieee80211_dev, NULL, false);
    10981096       
     
    11031101
    11041102static void ieee80211_process_auth_info(ieee80211_scan_result_link_t *ap_data,
    1105         void *buffer)
     1103    void *buffer)
    11061104{
    11071105        uint8_t *it = (uint8_t *) buffer;
    11081106       
    11091107        uint16_t *version = (uint16_t *) it;
    1110         if(uint16_t_le2host(*version) != 0x1) {
     1108        if (uint16_t_le2host(*version) != 0x1) {
    11111109                ap_data->scan_result.security.type = -1;
    11121110                return;
     
    11151113        it += sizeof(uint16_t);
    11161114       
    1117         uint32_t group_cipher = *(it+3);
    1118         switch(group_cipher) {
    1119                 case IEEE80211_AUTH_CIPHER_TKIP:
    1120                         ap_data->scan_result.security.group_alg =
    1121                                 IEEE80211_SECURITY_SUITE_TKIP;
    1122                         break;
    1123                 case IEEE80211_AUTH_CIPHER_CCMP:
    1124                         ap_data->scan_result.security.group_alg =
    1125                                 IEEE80211_SECURITY_SUITE_CCMP;
    1126                         break;
    1127                 default:
    1128                         ap_data->scan_result.security.group_alg = -1;
    1129         }
    1130        
    1131         it += 4*sizeof(uint8_t);
     1115        uint32_t group_cipher = *(it + 3);
     1116        switch (group_cipher) {
     1117        case IEEE80211_AUTH_CIPHER_TKIP:
     1118                ap_data->scan_result.security.group_alg =
     1119                    IEEE80211_SECURITY_SUITE_TKIP;
     1120                break;
     1121        case IEEE80211_AUTH_CIPHER_CCMP:
     1122                ap_data->scan_result.security.group_alg =
     1123                    IEEE80211_SECURITY_SUITE_CCMP;
     1124                break;
     1125        default:
     1126                ap_data->scan_result.security.group_alg = -1;
     1127        }
     1128       
     1129        it += 4 * sizeof(uint8_t);
    11321130       
    11331131        uint16_t *pairwise_count = (uint16_t *) it;
    1134         uint32_t pairwise_cipher = *(it+sizeof(uint16_t)+3);
    1135         switch(pairwise_cipher) {
    1136                 case IEEE80211_AUTH_CIPHER_TKIP:
    1137                         ap_data->scan_result.security.pair_alg =
    1138                                 IEEE80211_SECURITY_SUITE_TKIP;
    1139                         break;
    1140                 case IEEE80211_AUTH_CIPHER_CCMP:
    1141                         ap_data->scan_result.security.pair_alg =
    1142                                 IEEE80211_SECURITY_SUITE_CCMP;
    1143                         break;
    1144                 default:
    1145                         ap_data->scan_result.security.pair_alg = -1;
    1146         }
    1147        
    1148         it += 2*sizeof(uint16_t) +
    1149                 uint16_t_le2host(*pairwise_count)*sizeof(uint32_t);
    1150        
    1151         uint32_t auth_suite = *(it+3);
    1152         switch(auth_suite) {
    1153                 case IEEE80211_AUTH_AKM_PSK:
    1154                         ap_data->scan_result.security.auth =
    1155                                 IEEE80211_SECURITY_AUTH_PSK;
    1156                         break;
    1157                 case IEEE80211_AUTH_AKM_8021X:
    1158                         ap_data->scan_result.security.auth =
    1159                                 IEEE80211_SECURITY_AUTH_8021X;
    1160                         break;
    1161                 default:
    1162                         ap_data->scan_result.security.auth = -1;
     1132        uint32_t pairwise_cipher = *(it + sizeof(uint16_t) + 3);
     1133        switch (pairwise_cipher) {
     1134        case IEEE80211_AUTH_CIPHER_TKIP:
     1135                ap_data->scan_result.security.pair_alg =
     1136                    IEEE80211_SECURITY_SUITE_TKIP;
     1137                break;
     1138        case IEEE80211_AUTH_CIPHER_CCMP:
     1139                ap_data->scan_result.security.pair_alg =
     1140                    IEEE80211_SECURITY_SUITE_CCMP;
     1141                break;
     1142        default:
     1143                ap_data->scan_result.security.pair_alg = -1;
     1144        }
     1145       
     1146        it += 2 * sizeof(uint16_t) +
     1147            uint16_t_le2host(*pairwise_count) * sizeof(uint32_t);
     1148       
     1149        uint32_t auth_suite = *(it + 3);
     1150        switch (auth_suite) {
     1151        case IEEE80211_AUTH_AKM_PSK:
     1152                ap_data->scan_result.security.auth =
     1153                    IEEE80211_SECURITY_AUTH_PSK;
     1154                break;
     1155        case IEEE80211_AUTH_AKM_8021X:
     1156                ap_data->scan_result.security.auth =
     1157                    IEEE80211_SECURITY_AUTH_8021X;
     1158                break;
     1159        default:
     1160                ap_data->scan_result.security.auth = -1;
    11631161        }
    11641162}
    11651163
    11661164static void copy_auth_ie(ieee80211_ie_header_t *ie_header,
    1167         ieee80211_scan_result_link_t *ap_data, void *it)
    1168 {
    1169         ap_data->auth_ie_len = ie_header->length + 
    1170                 sizeof(ieee80211_ie_header_t);
     1165    ieee80211_scan_result_link_t *ap_data, void *it)
     1166{
     1167        ap_data->auth_ie_len = ie_header->length +
     1168            sizeof(ieee80211_ie_header_t);
    11711169       
    11721170        memcpy(ap_data->auth_ie, it, ap_data->auth_ie_len);
     
    11741172
    11751173static uint8_t *ieee80211_process_ies(ieee80211_dev_t *ieee80211_dev,
    1176         ieee80211_scan_result_link_t *ap_data, void *buffer, size_t buffer_size)
     1174    ieee80211_scan_result_link_t *ap_data, void *buffer, size_t buffer_size)
    11771175{
    11781176        void *it = buffer;
    1179         while((it + sizeof(ieee80211_ie_header_t)) < buffer + buffer_size) {
    1180                 ieee80211_ie_header_t *ie_header = 
    1181                         (ieee80211_ie_header_t *) it;
     1177        while ((it + sizeof(ieee80211_ie_header_t)) < buffer + buffer_size) {
     1178                ieee80211_ie_header_t *ie_header =
     1179                    (ieee80211_ie_header_t *) it;
    11821180                uint8_t *channel;
    11831181                uint32_t oui;
    1184                 switch(ie_header->element_id) {
    1185                         case IEEE80211_CHANNEL_IE:
    1186                                 if(!ap_data)
     1182               
     1183                switch (ie_header->element_id) {
     1184                case IEEE80211_CHANNEL_IE:
     1185                        if (!ap_data)
     1186                                break;
     1187                       
     1188                        channel = (uint8_t *)
     1189                            (it + sizeof(ieee80211_ie_header_t));
     1190                        ap_data->scan_result.channel = *channel;
     1191                        break;
     1192                case IEEE80211_RSN_IE:
     1193                        if (!ap_data)
     1194                                break;
     1195                       
     1196                        ap_data->scan_result.security.type =
     1197                            IEEE80211_SECURITY_WPA2;
     1198                        ieee80211_process_auth_info(ap_data,
     1199                            it + sizeof(ieee80211_ie_header_t));
     1200                        copy_auth_ie(ie_header, ap_data, it);
     1201                        break;
     1202                case IEEE80211_VENDOR_IE:
     1203                        oui = uint32be_from_seq(it +
     1204                            sizeof(ieee80211_ie_header_t));
     1205                       
     1206                        if (oui == WPA_OUI) {
     1207                                if (!ap_data)
    11871208                                        break;
    1188                                 channel = (uint8_t *)
    1189                                         (it + sizeof(ieee80211_ie_header_t));
    1190                                 ap_data->scan_result.channel = *channel;
    1191                                 break;
    1192                         case IEEE80211_RSN_IE:
    1193                                 if(!ap_data)
     1209                               
     1210                                /* Prefering WPA2. */
     1211                                if (ap_data->scan_result.security.type ==
     1212                                    IEEE80211_SECURITY_WPA2)
    11941213                                        break;
     1214                               
    11951215                                ap_data->scan_result.security.type =
    1196                                         IEEE80211_SECURITY_WPA2;
    1197                                 ieee80211_process_auth_info(ap_data,
    1198                                         it + sizeof(ieee80211_ie_header_t));
     1216                                    IEEE80211_SECURITY_WPA;
     1217                               
     1218                                ieee80211_process_auth_info(ap_data,
     1219                                    it + sizeof(ieee80211_ie_header_t) +
     1220                                    sizeof(uint32_t));
    11991221                                copy_auth_ie(ie_header, ap_data, it);
    1200                                 break;
    1201                         case IEEE80211_VENDOR_IE:
    1202                                 oui = uint32be_from_seq(it +
    1203                                         sizeof(ieee80211_ie_header_t));
    1204                                 if(oui == WPA_OUI) {
    1205                                         if(!ap_data)
    1206                                                 break;
    1207                                         /* Prefering WPA2. */
    1208                                         if(ap_data->scan_result.security.type ==
    1209                                                 IEEE80211_SECURITY_WPA2) {
    1210                                                 break;
    1211                                         }
    1212                                         ap_data->scan_result.security.type =
    1213                                                 IEEE80211_SECURITY_WPA;
    1214                                         ieee80211_process_auth_info(ap_data,
    1215                                                 it +
    1216                                                 sizeof(ieee80211_ie_header_t) +
    1217                                                 sizeof(uint32_t));
    1218                                         copy_auth_ie(ie_header, ap_data, it);
    1219                                 } else if(oui == GTK_OUI) {
    1220                                         return it +
    1221                                                 sizeof(ieee80211_ie_header_t) +
    1222                                                 sizeof(uint32_t);
    1223                                 }
     1222                        } else if (oui == GTK_OUI) {
     1223                                return it +
     1224                                    sizeof(ieee80211_ie_header_t) +
     1225                                    sizeof(uint32_t);
     1226                        }
    12241227                }
     1228               
    12251229                it += sizeof(ieee80211_ie_header_t) + ie_header->length;
    12261230        }
     
    12291233}
    12301234
    1231 /**
    1232  * Process probe response and store results.
    1233  *
     1235/** Process probe response and store results.
     1236 *
    12341237 * @param ieee80211_dev Pointer to IEEE 802.11 device structure.
    1235  * @param mgmt_header Pointer to start of management frame header.
    1236  * 
     1238 * @param mgmt_header   Pointer to start of management frame header.
     1239 *
    12371240 * @return EOK if succeed, negative error code otherwise.
    1238  */
    1239 static int ieee80211_process_probe_response(ieee80211_dev_t *ieee80211_dev,
    1240         ieee80211_mgmt_header_t *mgmt_header, size_t buffer_size)
    1241 {
    1242         ieee80211_beacon_start_t *beacon_body = (ieee80211_beacon_start_t *)
    1243                 ((void *)mgmt_header + sizeof(ieee80211_mgmt_header_t));
    1244        
    1245         ieee80211_ie_header_t *ssid_ie_header = (ieee80211_ie_header_t *)
    1246                 ((void *)beacon_body + sizeof(ieee80211_beacon_start_t));
     1241 *
     1242 */
     1243static int ieee80211_process_probe_response(ieee80211_dev_t *ieee80211_dev,
     1244    ieee80211_mgmt_header_t *mgmt_header, size_t buffer_size)
     1245{
     1246        ieee80211_beacon_start_t *beacon_body = (ieee80211_beacon_start_t *)
     1247            ((void *) mgmt_header + sizeof(ieee80211_mgmt_header_t));
     1248       
     1249        ieee80211_ie_header_t *ssid_ie_header = (ieee80211_ie_header_t *)
     1250            ((void *) beacon_body + sizeof(ieee80211_beacon_start_t));
    12471251       
    12481252        /* Not empty SSID. */
    1249         if(ssid_ie_header->length > 0) {
     1253        if (ssid_ie_header->length > 0) {
    12501254                ieee80211_scan_result_list_t *result_list =
    1251                         &ieee80211_dev->ap_list;
    1252                
    1253                 uint8_t *ssid_start = (uint8_t *) ((void *)ssid_ie_header +
    1254                         sizeof(ieee80211_ie_header_t));
     1255                    &ieee80211_dev->ap_list;
     1256               
     1257                uint8_t *ssid_start = (uint8_t *) ((void *) ssid_ie_header +
     1258                    sizeof(ieee80211_ie_header_t));
    12551259                char ssid[IEEE80211_MAX_SSID_LENGTH];
     1260               
    12561261                memcpy(ssid, ssid_start, ssid_ie_header->length);
    12571262                ssid[ssid_ie_header->length] = '\0';
     
    12591264                /* Check whether SSID is already in results. */
    12601265                ieee80211_scan_result_list_foreach(*result_list, result) {
    1261                         if(!str_cmp(ssid, result->scan_result.ssid)) {
     1266                        if (!str_cmp(ssid, result->scan_result.ssid)) {
    12621267                                result->last_beacon = time(NULL);
    12631268                                return EOK;
     
    12661271               
    12671272                /* Results are full. */
    1268                 if(result_list->size == IEEE80211_MAX_RESULTS_LENGTH - 1) {
     1273                if (result_list->size == IEEE80211_MAX_RESULTS_LENGTH - 1)
    12691274                        return EOK;
    1270                 }
    1271                
    1272                 ieee80211_scan_result_link_t *ap_data =
    1273                         malloc(sizeof(ieee80211_scan_result_link_t));
     1275               
     1276                ieee80211_scan_result_link_t *ap_data =
     1277                    malloc(sizeof(ieee80211_scan_result_link_t));
     1278                if (!ap_data)
     1279                        return ENOMEM;
     1280               
    12741281                memset(ap_data, 0, sizeof(ieee80211_scan_result_link_t));
    12751282                link_initialize(&ap_data->link);
    12761283               
    1277                 memcpy(ap_data->scan_result.bssid.address, 
    1278                         mgmt_header->bssid, ETH_ADDR);
    1279                 memcpy(ap_data->scan_result.ssid, ssid, 
    1280                         ssid_ie_header->length + 1);
    1281                
    1282                 if(uint16_t_le2host(beacon_body->capability) & CAP_SECURITY) {
    1283                         ap_data->scan_result.security.type = 
    1284                                 IEEE80211_SECURITY_WEP;
     1284                memcpy(ap_data->scan_result.bssid.address,
     1285                    mgmt_header->bssid, ETH_ADDR);
     1286                memcpy(ap_data->scan_result.ssid, ssid,
     1287                    ssid_ie_header->length + 1);
     1288               
     1289                if (uint16_t_le2host(beacon_body->capability) & CAP_SECURITY) {
     1290                        ap_data->scan_result.security.type =
     1291                            IEEE80211_SECURITY_WEP;
    12851292                } else {
    1286                         ap_data->scan_result.security.type = 
    1287                                 IEEE80211_SECURITY_OPEN;
     1293                        ap_data->scan_result.security.type =
     1294                            IEEE80211_SECURITY_OPEN;
    12881295                        ap_data->scan_result.security.auth = -1;
    12891296                        ap_data->scan_result.security.pair_alg = -1;
     
    12921299               
    12931300                void *rest_ies_start = ssid_start + ssid_ie_header->length;
    1294                 size_t rest_buffer_size = 
    1295                         buffer_size -
    1296                         sizeof(ieee80211_mgmt_header_t) -
    1297                         sizeof(ieee80211_beacon_start_t) -
    1298                         sizeof(ieee80211_ie_header_t) -
    1299                         ssid_ie_header->length;
    1300                
    1301                 ieee80211_process_ies(ieee80211_dev, ap_data, rest_ies_start, 
    1302                         rest_buffer_size);
     1301                size_t rest_buffer_size =
     1302                    buffer_size -
     1303                    sizeof(ieee80211_mgmt_header_t) -
     1304                    sizeof(ieee80211_beacon_start_t) -
     1305                    sizeof(ieee80211_ie_header_t) -
     1306                    ssid_ie_header->length;
     1307               
     1308                ieee80211_process_ies(ieee80211_dev, ap_data, rest_ies_start,
     1309                    rest_buffer_size);
    13031310               
    13041311                ap_data->last_beacon = time(NULL);
     
    13121319}
    13131320
    1314 /**
    1315  * Process authentication response.
    1316  *
     1321/** Process authentication response.
     1322 *
    13171323 * @param ieee80211_dev Pointer to IEEE 802.11 device structure.
    1318  * @param mgmt_header Pointer to start of management frame header.
    1319  * 
     1324 * @param mgmt_header   Pointer to start of management frame header.
     1325 *
    13201326 * @return EOK if succeed, negative error code otherwise.
     1327 *
    13211328 */
    13221329static int ieee80211_process_auth_response(ieee80211_dev_t *ieee80211_dev,
    1323         ieee80211_mgmt_header_t *mgmt_header)
     1330    ieee80211_mgmt_header_t *mgmt_header)
    13241331{
    13251332        ieee80211_auth_body_t *auth_body =
    1326                 (ieee80211_auth_body_t *)
    1327                 ((void *)mgmt_header + sizeof(ieee80211_mgmt_header_t));
    1328        
    1329         if(auth_body->status != 0) {
    1330                 ieee80211_set_auth_phase(ieee80211_dev,
    1331                         IEEE80211_AUTH_DISCONNECTED);
    1332         } else {
    1333                 ieee80211_set_auth_phase(ieee80211_dev,
    1334                         IEEE80211_AUTH_AUTHENTICATED);
    1335         }
     1333            (ieee80211_auth_body_t *)
     1334            ((void *) mgmt_header + sizeof(ieee80211_mgmt_header_t));
     1335       
     1336        if (auth_body->status != 0)
     1337                ieee80211_set_auth_phase(ieee80211_dev,
     1338                    IEEE80211_AUTH_DISCONNECTED);
     1339        else
     1340                ieee80211_set_auth_phase(ieee80211_dev,
     1341                    IEEE80211_AUTH_AUTHENTICATED);
    13361342       
    13371343        fibril_mutex_lock(&ieee80211_dev->gen_mutex);
     
    13421348}
    13431349
    1344 /**
    1345  * Process association response.
    1346  *
     1350/** Process association response.
     1351 *
    13471352 * @param ieee80211_dev Pointer to IEEE 802.11 device structure.
    1348  * @param mgmt_header Pointer to start of management frame header.
    1349  * 
     1353 * @param mgmt_header   Pointer to start of management frame header.
     1354 *
    13501355 * @return EOK if succeed, negative error code otherwise.
     1356 *
    13511357 */
    13521358static int ieee80211_process_assoc_response(ieee80211_dev_t *ieee80211_dev,
    1353         ieee80211_mgmt_header_t *mgmt_header)
     1359    ieee80211_mgmt_header_t *mgmt_header)
    13541360{
    13551361        ieee80211_assoc_resp_body_t *assoc_resp =
    1356                 (ieee80211_assoc_resp_body_t *) ((void *)mgmt_header +
    1357                 sizeof(ieee80211_mgmt_header_t));
    1358        
    1359         if(assoc_resp->status != 0) {
    1360                 ieee80211_set_auth_phase(ieee80211_dev, 
    1361                         IEEE80211_AUTH_DISCONNECTED);
    1362         } else {
    1363                 ieee80211_dev->bssid_info.aid = 
    1364                         uint16_t_le2host(assoc_resp->aid);
    1365                 ieee80211_set_auth_phase(ieee80211_dev, 
    1366                         IEEE80211_AUTH_ASSOCIATED);
     1362            (ieee80211_assoc_resp_body_t *) ((void *) mgmt_header +
     1363            sizeof(ieee80211_mgmt_header_t));
     1364       
     1365        if (assoc_resp->status != 0)
     1366                ieee80211_set_auth_phase(ieee80211_dev,
     1367                    IEEE80211_AUTH_DISCONNECTED);
     1368        else {
     1369                ieee80211_dev->bssid_info.aid =
     1370                    uint16_t_le2host(assoc_resp->aid);
     1371                ieee80211_set_auth_phase(ieee80211_dev,
     1372                    IEEE80211_AUTH_ASSOCIATED);
    13671373                ieee80211_dev->ops->bssid_change(ieee80211_dev, true);
    13681374        }
     
    13761382
    13771383static int ieee80211_process_4way_handshake(ieee80211_dev_t *ieee80211_dev,
    1378         void *buffer, size_t buffer_size)
    1379 {
    1380         ieee80211_eapol_key_frame_t *key_frame = 
    1381                 (ieee80211_eapol_key_frame_t *) buffer;
    1382        
    1383         ieee80211_scan_result_link_t *auth_link = 
    1384                 ieee80211_dev->bssid_info.res_link;
    1385 
     1384    void *buffer, size_t buffer_size)
     1385{
     1386        ieee80211_eapol_key_frame_t *key_frame =
     1387            (ieee80211_eapol_key_frame_t *) buffer;
     1388       
     1389        ieee80211_scan_result_link_t *auth_link =
     1390            ieee80211_dev->bssid_info.res_link;
     1391       
    13861392        ieee80211_scan_result_t *auth_data = &auth_link->scan_result;
    13871393       
    13881394        /* We don't support 802.1X authentication yet. */
    1389         if(auth_data->security.auth == IEEE80211_AUTH_AKM_8021X) {
     1395        if (auth_data->security.auth == IEEE80211_AUTH_AKM_8021X)
    13901396                return ENOTSUP;
    1391         }
    13921397       
    13931398        uint8_t *ptk = ieee80211_dev->bssid_info.ptk;
    13941399        uint8_t *gtk = ieee80211_dev->bssid_info.gtk;
    13951400        uint8_t gtk_id = 1;
    1396 
     1401       
    13971402        bool handshake_done = false;
    13981403       
    1399         bool old_wpa = 
    1400                 auth_data->security.type == IEEE80211_SECURITY_WPA;
     1404        bool old_wpa =
     1405            auth_data->security.type == IEEE80211_SECURITY_WPA;
    14011406       
    14021407        bool key_phase =
    1403                 uint16_t_be2host(key_frame->key_info) &
    1404                 IEEE80211_EAPOL_KEY_KEYINFO_MIC;
    1405        
    1406         bool final_phase = 
    1407                 uint16_t_be2host(key_frame->key_info) &
    1408                 IEEE80211_EAPOL_KEY_KEYINFO_SECURE;
    1409        
    1410         bool ccmp_used = 
    1411                 auth_data->security.pair_alg == IEEE80211_SECURITY_SUITE_CCMP ||
    1412                 auth_data->security.group_alg == IEEE80211_SECURITY_SUITE_CCMP;
     1408            uint16_t_be2host(key_frame->key_info) &
     1409            IEEE80211_EAPOL_KEY_KEYINFO_MIC;
     1410       
     1411        bool final_phase =
     1412            uint16_t_be2host(key_frame->key_info) &
     1413            IEEE80211_EAPOL_KEY_KEYINFO_SECURE;
     1414       
     1415        bool ccmp_used =
     1416            (auth_data->security.pair_alg == IEEE80211_SECURITY_SUITE_CCMP) ||
     1417            (auth_data->security.group_alg == IEEE80211_SECURITY_SUITE_CCMP);
    14131418       
    14141419        size_t ptk_key_length, gtk_key_length;
    14151420        hash_func_t mic_hash;
    1416         if(ccmp_used) {
     1421        if (ccmp_used)
    14171422                mic_hash = HASH_SHA1;
    1418         } else {
     1423        else
    14191424                mic_hash = HASH_MD5;
    1420         }
    1421        
    1422         if(auth_data->security.pair_alg == IEEE80211_SECURITY_SUITE_CCMP) {
     1425       
     1426        if (auth_data->security.pair_alg == IEEE80211_SECURITY_SUITE_CCMP)
    14231427                ptk_key_length = IEEE80211_PTK_CCMP_LENGTH;
    1424         } else {
     1428        else
    14251429                ptk_key_length = IEEE80211_PTK_TKIP_LENGTH;
    1426         }
    1427        
    1428         if(auth_data->security.group_alg == IEEE80211_SECURITY_SUITE_CCMP) {
     1430       
     1431        if (auth_data->security.group_alg == IEEE80211_SECURITY_SUITE_CCMP)
    14291432                gtk_key_length = IEEE80211_GTK_CCMP_LENGTH;
    1430         } else {
     1433        else
    14311434                gtk_key_length = IEEE80211_GTK_TKIP_LENGTH;
    1432         }
    1433        
    1434         size_t output_size =
    1435                 sizeof(eth_header_t) +
    1436                 sizeof(ieee80211_eapol_key_frame_t);
    1437 
    1438         if(!(uint16_t_be2host(key_frame->key_info) &
    1439                 IEEE80211_EAPOL_KEY_KEYINFO_MIC)) {
     1435       
     1436        size_t output_size =
     1437            sizeof(eth_header_t) +
     1438            sizeof(ieee80211_eapol_key_frame_t);
     1439       
     1440        if (!(uint16_t_be2host(key_frame->key_info) &
     1441            IEEE80211_EAPOL_KEY_KEYINFO_MIC))
    14401442                output_size += auth_link->auth_ie_len;
    1441         }
    1442 
     1443       
    14431444        nic_t *nic = nic_get_from_ddf_dev(ieee80211_dev->ddf_dev);
    14441445        nic_address_t nic_address;
    14451446        nic_query_address(nic, &nic_address);
    1446 
     1447       
    14471448        void *output_buffer = malloc(output_size);
     1449        if (!output_buffer)
     1450                return ENOMEM;
     1451       
    14481452        memset(output_buffer, 0, output_size);
    1449 
     1453       
    14501454        /* Setup ethernet header. */
    14511455        eth_header_t *eth_header = (eth_header_t *) output_buffer;
    1452         memcpy(eth_header->dest_addr, auth_data->bssid.address, ETH_ADDR);
     1456        memcpy(eth_header->dest_addr, auth_data->bssid.address, ETH_ADDR);
    14531457        memcpy(eth_header->src_addr, nic_address.address, ETH_ADDR);
    14541458        eth_header->proto = host2uint16_t_be(ETH_TYPE_PAE);
    1455 
     1459       
    14561460        ieee80211_eapol_key_frame_t *output_key_frame =
    1457                 (ieee80211_eapol_key_frame_t *)
    1458                 (output_buffer + sizeof(eth_header_t));
    1459 
     1461            (ieee80211_eapol_key_frame_t *)
     1462            (output_buffer + sizeof(eth_header_t));
     1463       
    14601464        /* Copy content of incoming EAPOL-Key frame. */
    1461         memcpy((void *) output_key_frame, buffer, 
    1462                 sizeof(ieee80211_eapol_key_frame_t));
    1463 
     1465        memcpy((void *) output_key_frame, buffer,
     1466            sizeof(ieee80211_eapol_key_frame_t));
     1467       
    14641468        output_key_frame->proto_version = 0x1;
    14651469        output_key_frame->body_length =
    1466                 host2uint16_t_be(output_size - sizeof(eth_header_t) - 4);
    1467         output_key_frame->key_info &=
    1468                 ~host2uint16_t_be(
    1469                         IEEE80211_EAPOL_KEY_KEYINFO_ACK
    1470                 );
    1471 
    1472         if(key_phase) {
    1473                 output_key_frame->key_info &=
    1474                         ~host2uint16_t_be(
    1475                                 IEEE80211_EAPOL_KEY_KEYINFO_ENCDATA
    1476                         );
    1477                 output_key_frame->key_info &=
    1478                         ~host2uint16_t_be(
    1479                                 IEEE80211_EAPOL_KEY_KEYINFO_INSTALL
    1480                         );
     1470            host2uint16_t_be(output_size - sizeof(eth_header_t) - 4);
     1471        output_key_frame->key_info &=
     1472            ~host2uint16_t_be(IEEE80211_EAPOL_KEY_KEYINFO_ACK);
     1473       
     1474        if (key_phase) {
     1475                output_key_frame->key_info &=
     1476                    ~host2uint16_t_be(IEEE80211_EAPOL_KEY_KEYINFO_ENCDATA);
     1477                output_key_frame->key_info &=
     1478                    ~host2uint16_t_be(IEEE80211_EAPOL_KEY_KEYINFO_INSTALL);
    14811479                output_key_frame->key_data_length = 0;
    14821480                memset(output_key_frame->key_nonce, 0, 32);
     
    14841482                memset(output_key_frame->key_rsc, 0, 8);
    14851483                memset(output_key_frame->eapol_key_iv, 0, 16);
    1486 
     1484               
    14871485                /* Derive GTK and save it. */
    1488                 if(final_phase) {
    1489                         uint16_t key_data_length = 
    1490                                 uint16_t_be2host(key_frame->key_data_length);
     1486                if (final_phase) {
     1487                        uint16_t key_data_length =
     1488                            uint16_t_be2host(key_frame->key_data_length);
    14911489                        uint8_t key_data[key_data_length];
    1492                         uint8_t *data_ptr = (uint8_t *) (buffer +
    1493                                 sizeof(ieee80211_eapol_key_frame_t));
    1494 
     1490                        uint8_t *data_ptr = (uint8_t *)
     1491                            (buffer + sizeof(ieee80211_eapol_key_frame_t));
     1492                       
    14951493                        int rc;
    14961494                        uint8_t work_key[32];
    1497                
    1498                         if(ccmp_used) {
    1499                                 rc = ieee80211_aes_key_unwrap(ptk + KEK_OFFSET, 
    1500                                         data_ptr, key_data_length, key_data);
     1495                       
     1496                        if (ccmp_used) {
     1497                                rc = ieee80211_aes_key_unwrap(ptk + KEK_OFFSET,
     1498                                    data_ptr, key_data_length, key_data);
    15011499                        } else {
    15021500                                memcpy(work_key, key_frame->eapol_key_iv, 16);
    15031501                                memcpy(work_key + 16, ptk + KEK_OFFSET, 16);
    1504                                 rc = ieee80211_rc4_key_unwrap(work_key, 
    1505                                         data_ptr, key_data_length, key_data);
     1502                                rc = ieee80211_rc4_key_unwrap(work_key,
     1503                                    data_ptr, key_data_length, key_data);
    15061504                        }
    15071505                       
    1508                         if(rc == EOK) {
     1506                        if (rc == EOK) {
    15091507                                uint8_t *key_data_ptr = old_wpa ? key_data :
    1510                                         ieee80211_process_ies(ieee80211_dev,
    1511                                         NULL, key_data, key_data_length);
    1512 
    1513                                 if(key_data_ptr) {
     1508                                    ieee80211_process_ies(ieee80211_dev,
     1509                                    NULL, key_data, key_data_length);
     1510                               
     1511                                if (key_data_ptr) {
    15141512                                        uint8_t *key_ptr;
    1515                                         if(old_wpa) {
     1513                                       
     1514                                        if (old_wpa)
    15161515                                                key_ptr = key_data_ptr;
    1517                                         } else {
     1516                                        else {
    15181517                                                gtk_id = *key_data_ptr & 0x3;
    15191518                                                key_ptr = key_data_ptr + 2;
    15201519                                        }
    1521                                                
     1520                                       
    15221521                                        memcpy(gtk, key_ptr, gtk_key_length);
    15231522                                        handshake_done = true;
     
    15261525                }
    15271526        } else {
    1528                 output_key_frame->key_info |=
    1529                         host2uint16_t_be(
    1530                                 IEEE80211_EAPOL_KEY_KEYINFO_MIC
    1531                         );
     1527                output_key_frame->key_info |=
     1528                    host2uint16_t_be(IEEE80211_EAPOL_KEY_KEYINFO_MIC);
    15321529                output_key_frame->key_data_length =
    1533                         host2uint16_t_be(auth_link->auth_ie_len);
    1534                 memcpy((void *)output_key_frame +
    1535                         sizeof(ieee80211_eapol_key_frame_t),
    1536                         auth_link->auth_ie,
    1537                         auth_link->auth_ie_len);
    1538 
     1530                    host2uint16_t_be(auth_link->auth_ie_len);
     1531                memcpy((void *) output_key_frame +
     1532                    sizeof(ieee80211_eapol_key_frame_t),
     1533                    auth_link->auth_ie, auth_link->auth_ie_len);
     1534               
    15391535                /* Compute PMK. */
    15401536                uint8_t pmk[PBKDF2_KEY_LENGTH];
    15411537                pbkdf2((uint8_t *) ieee80211_dev->bssid_info.password,
    1542                         str_size(ieee80211_dev->bssid_info.password),
    1543                         (uint8_t *) auth_data->ssid,
    1544                         str_size(auth_data->ssid), pmk);
    1545 
     1538                    str_size(ieee80211_dev->bssid_info.password),
     1539                    (uint8_t *) auth_data->ssid,
     1540                    str_size(auth_data->ssid), pmk);
     1541               
    15461542                uint8_t *anonce = key_frame->key_nonce;
    1547 
     1543               
    15481544                /* Generate SNONCE. */
    15491545                uint8_t snonce[32];
    15501546                rnd_sequence(snonce, 32);
    1551 
     1547               
    15521548                memcpy(output_key_frame->key_nonce, snonce, 32);
    1553 
     1549               
    15541550                uint8_t *dest_addr = eth_header->dest_addr;
    15551551                uint8_t *src_addr = eth_header->src_addr;
    1556 
     1552               
    15571553                /* Derive PTK and save it. */
    15581554                uint8_t crypt_data[PRF_CRYPT_DATA_LENGTH];
    1559                 memcpy(crypt_data,
    1560                         min_sequence(dest_addr, src_addr, ETH_ADDR),
    1561                         ETH_ADDR);
    1562                 memcpy(crypt_data + ETH_ADDR,
    1563                         max_sequence(dest_addr, src_addr, ETH_ADDR),
    1564                         ETH_ADDR);
    1565                 memcpy(crypt_data + 2*ETH_ADDR,
    1566                         min_sequence(anonce, snonce, 32),
    1567                         32);
    1568                 memcpy(crypt_data + 2*ETH_ADDR + 32,
    1569                         max_sequence(anonce, snonce, 32),
    1570                         32);
     1555                memcpy(crypt_data,
     1556                    min_sequence(dest_addr, src_addr, ETH_ADDR), ETH_ADDR);
     1557                memcpy(crypt_data + ETH_ADDR,
     1558                    max_sequence(dest_addr, src_addr, ETH_ADDR), ETH_ADDR);
     1559                memcpy(crypt_data + 2*ETH_ADDR,
     1560                    min_sequence(anonce, snonce, 32), 32);
     1561                memcpy(crypt_data + 2*ETH_ADDR + 32,
     1562                    max_sequence(anonce, snonce, 32), 32);
    15711563                ieee80211_prf(pmk, crypt_data, ptk, ptk_key_length);
    15721564        }
    1573 
     1565       
    15741566        /* Compute MIC of key frame data from KCK part of PTK. */
    15751567        uint8_t mic[mic_hash];
    1576         hmac(ptk, 16, (uint8_t *) output_key_frame, 
    1577                 output_size - sizeof(eth_header_t), mic, mic_hash);
    1578 
     1568        hmac(ptk, 16, (uint8_t *) output_key_frame,
     1569            output_size - sizeof(eth_header_t), mic, mic_hash);
     1570       
    15791571        memcpy(output_key_frame->key_mic, mic, 16);
    1580 
     1572       
    15811573        ieee80211_send_frame(nic, output_buffer, output_size);
    1582 
     1574       
    15831575        free(output_buffer);
    1584 
     1576       
    15851577        ieee80211_key_config_t key_config;
    15861578       
    15871579        /* Insert Pairwise key. */
    1588         if((key_phase && old_wpa) || (final_phase && !old_wpa)) {
     1580        if ((key_phase && old_wpa) || (final_phase && !old_wpa)) {
    15891581                key_config.suite = auth_data->security.pair_alg;
    15901582                key_config.flags =
    1591                         IEEE80211_KEY_FLAG_TYPE_PAIRWISE;
    1592                 memcpy(key_config.data,
    1593                         ptk + TK_OFFSET,
    1594                         ptk_key_length - TK_OFFSET);
    1595 
     1583                    IEEE80211_KEY_FLAG_TYPE_PAIRWISE;
     1584                memcpy(key_config.data,
     1585                    ptk + TK_OFFSET, ptk_key_length - TK_OFFSET);
     1586               
    15961587                ieee80211_dev->ops->key_config(ieee80211_dev,
    1597                         &key_config, true);
     1588                    &key_config, true);
    15981589        }
    15991590       
    16001591        /* Insert Group key. */
    1601         if(final_phase) {
     1592        if (final_phase) {
    16021593                key_config.id = gtk_id;
    16031594                key_config.suite = auth_data->security.group_alg;
    1604                 key_config.flags =
    1605                         IEEE80211_KEY_FLAG_TYPE_GROUP;
     1595                key_config.flags = IEEE80211_KEY_FLAG_TYPE_GROUP;
    16061596                memcpy(key_config.data, gtk, gtk_key_length);
    1607 
     1597               
    16081598                ieee80211_dev->ops->key_config(ieee80211_dev,
    1609                         &key_config, true);
    1610         }
    1611 
     1599                    &key_config, true);
     1600        }
     1601       
    16121602        /* Signal successful handshake completion. */
    1613         if(handshake_done) {
     1603        if (handshake_done) {
    16141604                fibril_mutex_lock(&ieee80211_dev->gen_mutex);
    16151605                fibril_condvar_signal(&ieee80211_dev->gen_cond);
     
    16211611
    16221612static int ieee80211_process_eapol_frame(ieee80211_dev_t *ieee80211_dev,
    1623         void *buffer, size_t buffer_size)
    1624 {
    1625         ieee80211_eapol_key_frame_t *key_frame =
    1626                 (ieee80211_eapol_key_frame_t *) buffer;
    1627         if(ieee80211_is_eapol_key_frame(key_frame)) {
     1613    void *buffer, size_t buffer_size)
     1614{
     1615        ieee80211_eapol_key_frame_t *key_frame =
     1616            (ieee80211_eapol_key_frame_t *) buffer;
     1617       
     1618        if (ieee80211_is_eapol_key_frame(key_frame))
    16281619                return ieee80211_process_4way_handshake(ieee80211_dev, buffer,
    1629                         buffer_size);
    1630         }
     1620                    buffer_size);
    16311621       
    16321622        return EOK;
    16331623}
    16341624
    1635 /**
    1636  * Process data frame.
    1637  *
     1625/** Process data frame.
     1626 *
    16381627 * @param ieee80211_dev Pointer to IEEE 802.11 device structure.
    1639  * @param buffer Data buffer starting with IEEE 802.11 data header.
    1640  * @param buffer_size Size of buffer.
    1641  * 
     1628 * @param buffer        Data buffer starting with IEEE 802.11 data header.
     1629 * @param buffer_size   Size of buffer.
     1630 *
    16421631 * @return EOK if succeed, negative error code otherwise.
    1643  */
    1644 static int ieee80211_process_data(ieee80211_dev_t *ieee80211_dev,
    1645         void *buffer, size_t buffer_size)
    1646 {
    1647         ieee80211_data_header_t *data_header =
    1648                 (ieee80211_data_header_t *) buffer;
    1649        
    1650         if(ieee80211_has_data_frame(data_header->frame_ctrl)) {
     1632 *
     1633 */
     1634static int ieee80211_process_data(ieee80211_dev_t *ieee80211_dev,
     1635    void *buffer, size_t buffer_size)
     1636{
     1637        ieee80211_data_header_t *data_header =
     1638            (ieee80211_data_header_t *) buffer;
     1639       
     1640        if (ieee80211_has_data_frame(data_header->frame_ctrl)) {
    16511641                nic_t *nic = nic_get_from_ddf_dev(ieee80211_dev->ddf_dev);
    1652                 size_t strip_length = sizeof(ieee80211_data_header_t) + 
    1653                         ARRAY_SIZE(rfc1042_header);
     1642                size_t strip_length = sizeof(ieee80211_data_header_t) +
     1643                    ARRAY_SIZE(rfc1042_header);
    16541644               
    16551645                /* TODO: Different by used security alg. */
    16561646                /* TODO: Trim frame by used security alg. */
    16571647                // TODO: Distinguish used key (pair/group) by dest address ?
    1658                 if(ieee80211_is_encrypted_frame(data_header->frame_ctrl)) {
     1648                if (ieee80211_is_encrypted_frame(data_header->frame_ctrl))
    16591649                        strip_length += 8;
    1660                 }
    16611650               
    16621651                /* Process 4-way authentication handshake. */
    16631652                uint16_t *proto = (uint16_t *) (buffer + strip_length);
    1664                 if(uint16_t_be2host(*proto) == ETH_TYPE_PAE) {
     1653                if (uint16_t_be2host(*proto) == ETH_TYPE_PAE)
    16651654                        return ieee80211_process_eapol_frame(ieee80211_dev,
    1666                                 buffer + strip_length + sizeof(uint16_t),
    1667                                 buffer_size - strip_length - sizeof(uint16_t));
    1668                 }
    1669                
    1670                 /* Note: ETH protocol ID is already there, so we don't create
    1671                  * whole ETH header. */
    1672                 size_t frame_size =
    1673                         buffer_size - strip_length + sizeof(eth_header_t)-2;
     1655                            buffer + strip_length + sizeof(uint16_t),
     1656                            buffer_size - strip_length - sizeof(uint16_t));
     1657               
     1658                /*
     1659                 * Note: ETH protocol ID is already there, so we don't create
     1660                 * whole ETH header.
     1661                 */
     1662                size_t frame_size =
     1663                    buffer_size - strip_length + sizeof(eth_header_t) - 2;
    16741664                nic_frame_t *frame = nic_alloc_frame(nic, frame_size);
    1675 
    1676                 if(frame == NULL) {
     1665               
     1666                if(frame == NULL)
    16771667                        return ENOMEM;
    1678                 }
    1679 
    1680                 uint8_t *src_addr =
    1681                         ieee80211_is_fromds_frame(data_header->frame_ctrl) ?
    1682                                 data_header->address3 : data_header->address2;
    1683                 uint8_t *dest_addr =
    1684                         ieee80211_is_tods_frame(data_header->frame_ctrl) ?
    1685                                 data_header->address3 : data_header->address1;
    1686 
    1687                 eth_header_t *eth_header =
    1688                         (eth_header_t *) frame->data;
     1668               
     1669                uint8_t *src_addr =
     1670                    ieee80211_is_fromds_frame(data_header->frame_ctrl) ?
     1671                    data_header->address3 : data_header->address2;
     1672                uint8_t *dest_addr =
     1673                    ieee80211_is_tods_frame(data_header->frame_ctrl) ?
     1674                    data_header->address3 : data_header->address1;
     1675               
     1676                eth_header_t *eth_header = (eth_header_t *) frame->data;
    16891677                memcpy(eth_header->src_addr, src_addr, ETH_ADDR);
    16901678                memcpy(eth_header->dest_addr, dest_addr, ETH_ADDR);
    1691 
    1692                 memcpy(frame->data + sizeof(eth_header_t)-2,
    1693                         buffer + strip_length,
    1694                         buffer_size - strip_length);
    1695 
     1679               
     1680                memcpy(frame->data + sizeof(eth_header_t) - 2,
     1681                    buffer + strip_length, buffer_size - strip_length);
     1682               
    16961683                nic_received_frame(nic, frame);
    16971684        }
     
    17001687}
    17011688
    1702 /**
    1703  * IEEE 802.11 RX frames handler.
    1704  *
     1689/** IEEE 802.11 RX frames handler.
     1690 *
    17051691 * @param ieee80211_dev Pointer to IEEE 802.11 device structure.
    1706  * @param buffer Buffer with data.
    1707  * @param buffer_size Size of buffer.
    1708  * 
     1692 * @param buffer        Buffer with data.
     1693 * @param buffer_size   Size of buffer.
     1694 *
    17091695 * @return EOK if succeed, negative error code otherwise.
     1696 *
    17101697 */
    17111698int ieee80211_rx_handler(ieee80211_dev_t *ieee80211_dev, void *buffer,
    1712         size_t buffer_size)
     1699    size_t buffer_size)
    17131700{
    17141701        uint16_t frame_ctrl = *((uint16_t *) buffer);
    1715         if(ieee80211_is_mgmt_frame(frame_ctrl)) {
     1702       
     1703        if (ieee80211_is_mgmt_frame(frame_ctrl)) {
    17161704                ieee80211_mgmt_header_t *mgmt_header =
    1717                         (ieee80211_mgmt_header_t *) buffer;
    1718                
    1719                 if(ieee80211_is_probe_response_frame(mgmt_header->frame_ctrl) ||
    1720                         ieee80211_is_beacon_frame(mgmt_header->frame_ctrl)) {
     1705                    (ieee80211_mgmt_header_t *) buffer;
     1706               
     1707                if ((ieee80211_is_probe_response_frame(mgmt_header->frame_ctrl)) ||
     1708                    (ieee80211_is_beacon_frame(mgmt_header->frame_ctrl)))
    17211709                        return ieee80211_process_probe_response(ieee80211_dev,
    1722                                 mgmt_header, buffer_size);
    1723                 }
    1724                
    1725                 if(ieee80211_is_auth_frame(mgmt_header->frame_ctrl)) {
     1710                            mgmt_header, buffer_size);
     1711               
     1712                if (ieee80211_is_auth_frame(mgmt_header->frame_ctrl))
    17261713                        return ieee80211_process_auth_response(ieee80211_dev,
    1727                                 mgmt_header);
    1728                 }
    1729                
    1730                 if(ieee80211_is_assoc_response_frame(mgmt_header->frame_ctrl)) {
     1714                            mgmt_header);
     1715               
     1716                if (ieee80211_is_assoc_response_frame(mgmt_header->frame_ctrl))
    17311717                        return ieee80211_process_assoc_response(ieee80211_dev,
    1732                                 mgmt_header);
    1733                 }
    1734         } else if(ieee80211_is_data_frame(frame_ctrl)) {
    1735                 return ieee80211_process_data(ieee80211_dev, buffer,
    1736                         buffer_size);
    1737         }
     1718                            mgmt_header);
     1719        } else if (ieee80211_is_data_frame(frame_ctrl))
     1720                return ieee80211_process_data(ieee80211_dev, buffer,
     1721                    buffer_size);
    17381722       
    17391723        return EOK;
Note: See TracChangeset for help on using the changeset viewer.