*
  * released under the GPL
  */
-
-
 #include "ieee80211.h"
 
 #include <linux/random.h>
        *tag_p = tag;
 }
 
-
 static void ieee80211_WMM_Info(struct ieee80211_device *ieee, u8 **tag_p)
 {
        u8 *tag = *tag_p;
        return rate;
 }
 
-
 void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl);
 
 inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee)
 static inline void
 softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee)
 {
-
        short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE;
        struct rtl_80211_hdr_3addr  *header =
                (struct rtl_80211_hdr_3addr  *) skb->data;
 
-
        if(single){
-
                header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
 
                if (ieee->seq_ctrl[0] == 0xFFF)
                /* avoid watchdog triggers */
                netif_trans_update(ieee->dev);
                ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate);
-
        }else{
 
                header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
                        ieee->seq_ctrl[0]++;
 
                ieee->softmac_hard_start_xmit(skb, ieee->dev);
-
        }
        //dev_kfree_skb_any(skb);//edit by thomas
 }
        //spin_unlock_irqrestore(&ieee->beacon_lock,flags);
 }
 
-
 static void ieee80211_send_beacon_cb(struct timer_list *t)
 {
        struct ieee80211_device *ieee =
        spin_unlock_irqrestore(&ieee->beacon_lock, flags);
 }
 
-
 static void ieee80211_send_probe(struct ieee80211_device *ieee)
 {
        struct sk_buff *skb;
 
        while(1)
        {
-
                do{
                        ch++;
                        if (ch > MAX_CHANNEL_NUMBER)
                        goto out;
 
                msleep_interruptible(IEEE80211_SOFTMAC_SCAN_TIME);
-
        }
 out:
        if(ieee->state < IEEE80211_LINKED){
        if(channel_map[ieee->current_network.channel] == 1)
                ieee80211_send_probe_requests(ieee);
 
-
        schedule_delayed_work(&ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME);
 
        mutex_unlock(&ieee->scan_mutex);
        mutex_unlock(&ieee->scan_mutex);
 }
 
-
-
 static void ieee80211_beacons_start(struct ieee80211_device *ieee)
 {
        unsigned long flags;
        del_timer_sync(&ieee->beacon_timer);
 
        spin_unlock_irqrestore(&ieee->beacon_lock, flags);
-
 }
 
-
 void ieee80211_stop_send_beacons(struct ieee80211_device *ieee)
 {
        if(ieee->stop_send_beacons)
                }
        }else
                ieee->start_scan(ieee->dev);
-
 }
 
 /* called with wx_mutex held */
                ieee80211_softmac_scan_syncro(ieee);
        else
                ieee->scan_syncro(ieee->dev);
-
 }
 EXPORT_SYMBOL(ieee80211_start_scan_syncro);
 
        struct ieee80211_authentication *auth;
        int len = sizeof(struct ieee80211_authentication) + challengelen + ieee->tx_headroom;
 
-
        skb = dev_alloc_skb(len);
        if (!skb) return NULL;
 
        auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS);
 
        return skb;
-
 }
 
-
 static struct sk_buff *ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest)
 {
        u8 *tag;
        else
                erp_len = 0;
 
-
        crypt = ieee->crypt[ieee->tx_keyidx];
 
-
        encrypt = ieee->host_encrypt && crypt && crypt->ops &&
                ((0 == strcmp(crypt->ops->name, "WEP") || wpa_ie_len));
        /* HT ralated element */
        HTConstructCapabilityElement(ieee, tmp_ht_cap_buf, &tmp_ht_cap_len,encrypt);
        HTConstructInfoElement(ieee,tmp_ht_info_buf,&tmp_ht_info_len, encrypt);
 
-
        if (pHTInfo->bRegRT2RTAggregation)
        {
                tmp_generic_ie_buf = ieee->pHTInfo->szRT2RTAggBuffer;
        if (encrypt)
                beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
 
-
        beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP);
        beacon_buf->info_element[0].id = MFIE_TYPE_SSID;
        beacon_buf->info_element[0].len = ssid_len;
        return skb;
 }
 
-
 static struct sk_buff *ieee80211_assoc_resp(struct ieee80211_device *ieee,
                                            u8 *dest)
 {
        assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ?
                WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS);
 
-
        if(ieee->short_slot)
                assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT);
 
        memcpy(auth->header.addr1, dest, ETH_ALEN);
        auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH);
        return skb;
-
-
 }
 
 static struct sk_buff *ieee80211_null_func(struct ieee80211_device *ieee,
                (pwr ? IEEE80211_FCTL_PM:0));
 
        return skb;
-
-
 }
 
-
 static void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8 *dest)
 {
        struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest);
                softmac_mgmt_xmit(buf, ieee);
 }
 
-
 static void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s,
                                   u8 *dest)
 {
                softmac_mgmt_xmit(buf, ieee);
 }
 
-
 static void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest)
 {
-
-
        struct sk_buff *buf = ieee80211_probe_resp(ieee, dest);
        if (buf)
                softmac_mgmt_xmit(buf, ieee);
 }
 
-
 static inline struct sk_buff *
 ieee80211_association_req(struct ieee80211_network *beacon,
                          struct ieee80211_device *ieee)
                        realtek_ie_buf = ieee->pHTInfo->szRT2RTAggBuffer;
                        realtek_ie_len = sizeof( ieee->pHTInfo->szRT2RTAggBuffer);
                        HTConstructRT2RTAggElement(ieee, realtek_ie_buf, &realtek_ie_len);
-
                }
        }
        if (ieee->qos_support) {
                wmm_info_len = beacon->qos_data.supported?9:0;
        }
 
-
        if (beacon->bCkipSupported)
        {
                ckip_ie_len = 30+2;
                + cxvernum_ie_len
                + ieee->tx_headroom;
 #endif
-
        skb = dev_alloc_skb(len);
 
        if (!skb)
 
        hdr = skb_put(skb, sizeof(struct ieee80211_assoc_request_frame) + 2);
 
-
        hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ;
        hdr->header.duration_id = cpu_to_le16(37);
        memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN);
                }
        }
 
-
        //choose what wpa_supplicant gives to associate.
        if (wpa_ie_len) {
                skb_put_data(skb, ieee->wpa_ie, wpa_ie_len);
 
 void ieee80211_associate_abort(struct ieee80211_device *ieee)
 {
-
        unsigned long flags;
        spin_lock_irqsave(&ieee->lock, flags);
 
        ieee80211_associate_abort(dev);
 }
 
-
 static void ieee80211_associate_step1(struct ieee80211_device *ieee)
 {
        struct ieee80211_network *beacon = &ieee->current_network;
        if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS))
                return;
 
-
        if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC) {
                /* if the user specified the AP MAC, we need also the essid
                 * This could be obtained by beacons or, if the network does not
                ssidmatch = (ieee->current_network.ssid_len == net->ssid_len)&&\
                                (!strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len));
 
-
                if (    /* if the user set the AP check if match.
                         * if the network does not broadcast essid we check the user supplyed ANY essid
                         * if the network does broadcast and the user does not set essid it is OK
                                        //HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
                                        ieee->state = IEEE80211_LINKED;
                                }
-
                }
        }
-
 }
 
 void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee)
        }
 
        spin_unlock_irqrestore(&ieee->lock, flags);
-
 }
 
-
 static inline u16 auth_parse(struct sk_buff *skb, u8 **challenge, int *chlen)
 {
        struct ieee80211_authentication *a;
        }
 
        return le16_to_cpu(a->status);
-
 }
 
-
 static int auth_rq_parse(struct sk_buff *skb, u8 *dest)
 {
        struct ieee80211_authentication *a;
 
        if (!ssid) return 1; /* ssid not found in tagged param */
        return (!strncmp(ssid, ieee->current_network.ssid, ssidlen));
-
 }
 
 static int assoc_rq_parse(struct sk_buff *skb, u8 *dest)
 static inline void
 ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb)
 {
-
        u8 dest[ETH_ALEN];
        //unsigned long flags;
 
 static void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee,
                                             short pwr)
 {
-
        struct sk_buff *buf = ieee80211_null_func(ieee, pwr);
 
        if (buf)
        }
 
        return 1;
-
-
 }
 
 static inline void ieee80211_sta_ps(struct ieee80211_device *ieee)
 {
-
        u32 th, tl;
        short sleep;
 
                goto out;
 
        if(sleep == 1){
-
                if(ieee->sta_sleep == 1)
                        ieee->enter_sleep_state(ieee->dev, th, tl);
 
                        spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2);
 
                        if(ieee->ps_is_queue_empty(ieee->dev)){
-
-
                                ieee->sta_sleep = 2;
 
                                ieee->ps_request_tx_ack(ieee->dev);
                                ieee->ps_tl = tl;
                        }
                        spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2);
-
                }
-
-
        }else if(sleep == 2){
 //#warning CHECK_LOCK_HERE
                spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2);
 
                spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2);
        }
-
 out:
        spin_unlock_irqrestore(&ieee->lock, flags);
-
 }
 
 void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl)
                        ieee80211_sta_ps_send_null_frame(ieee, 0);
                }
                return;
-
        }
 
        if(ieee->sta_sleep == 1)
        }
        /* 21112005 - tx again null without PS bit if lost */
        else {
-
                if ((ieee->sta_sleep == 0) && !success) {
                        spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2);
                        ieee80211_sta_ps_send_null_frame(ieee, 0);
                break;
        }
        return;
-
 }
 
 static void ieee80211_check_auth_response(struct ieee80211_device *ieee,
                ieee->last_rx_ps_time = jiffies;
 
        switch (WLAN_FC_GET_STYPE(header->frame_ctl)) {
-
        case IEEE80211_STYPE_ASSOC_RESP:
        case IEEE80211_STYPE_REASSOC_RESP:
-
                IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n",
                                WLAN_FC_GET_STYPE(header->frame_ctl));
                if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) &&
 
        case IEEE80211_STYPE_ASSOC_REQ:
        case IEEE80211_STYPE_REASSOC_REQ:
-
                if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) &&
                        ieee->iw_mode == IW_MODE_MASTER)
 
                break;
 
        case IEEE80211_STYPE_AUTH:
-
                if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) {
                        if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING
                                && ieee->iw_mode == IW_MODE_INFRA) {
                break;
 
        case IEEE80211_STYPE_PROBE_REQ:
-
                if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) &&
                        ((ieee->iw_mode == IW_MODE_ADHOC ||
                        ieee->iw_mode == IW_MODE_MASTER) &&
  */
 void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee)
 {
-
        unsigned int queue_index = txb->queue_index;
        unsigned long flags;
        int  i;
                }
        }
 
-
        ieee80211_txb_free(ieee->tx_pending.txb);
        ieee->tx_pending.txb = NULL;
 }
 
-
 void ieee80211_reset_queue(struct ieee80211_device *ieee)
 {
        unsigned long flags;
        }
        ieee->queue_stop = 0;
        spin_unlock_irqrestore(&ieee->lock, flags);
-
 }
 EXPORT_SYMBOL(ieee80211_reset_queue);
 
 void ieee80211_wake_queue(struct ieee80211_device *ieee)
 {
-
        unsigned long flags;
        struct sk_buff *skb;
        struct rtl_80211_hdr_3addr  *header;
                ieee->softmac_stats.swtxawake++;
                netif_wake_queue(ieee->dev);
        }
-
 exit :
        spin_unlock_irqrestore(&ieee->lock, flags);
 }
        }
        ieee->queue_stop = 1;
        //spin_unlock_irqrestore(&ieee->lock,flags);
-
 }
 EXPORT_SYMBOL(ieee80211_stop_queue);
 
 }
 static void ieee80211_start_ibss_wq(struct work_struct *work)
 {
-
        struct delayed_work *dwork = to_delayed_work(work);
        struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, start_ibss_wq);
        /* iwconfig mode ad-hoc will schedule this and return
        /* check if we have this cell in our network list */
        ieee80211_softmac_check_all_nets(ieee);
 
-
 //     if((IS_DOT11D_ENABLE(ieee)) && (ieee->state == IEEE80211_NOLINK))
        if (ieee->state == IEEE80211_NOLINK)
                ieee->current_network.channel = 6;
                        ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB;
                        ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB;
                        ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB;
-
                }else
                        ieee->current_network.rates_len = 0;
 
 /* called only in userspace context */
 void ieee80211_disassociate(struct ieee80211_device *ieee)
 {
-
-
        netif_carrier_off(ieee->dev);
        if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE)
                        ieee80211_reset_queue(ieee);
        ieee->link_change(ieee->dev);
        //HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
        notify_wx_assoc_event(ieee);
-
 }
 EXPORT_SYMBOL(ieee80211_disassociate);
 
        b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON);
 
        return skb;
-
 }
 
 struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee)
 
        ieee->init_wmmparam_flag = 0;//reinitialize AC_xx_PARAM registers.
 
-
        /* if the user set the MAC of the ad-hoc cell and then
         * switch to managed mode, shall we  make sure that association
         * attempts does not fail just because the user provide the essid
                ieee80211_start_monitor_mode(ieee);
 }
 
-
 #define DRV_NAME  "Ieee80211"
 void ieee80211_softmac_init(struct ieee80211_device *ieee)
 {
 
        timer_setup(&ieee->beacon_timer, ieee80211_send_beacon_cb, 0);
 
-
        INIT_DELAYED_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq);
        INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq);
        INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq);
        INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq);
        INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq);
 
-
        mutex_init(&ieee->wx_mutex);
        mutex_init(&ieee->scan_mutex);
 
        tasklet_init(&ieee->ps_task,
             (void(*)(unsigned long)) ieee80211_sta_ps,
             (unsigned long)ieee);
-
 }
 
 void ieee80211_softmac_free(struct ieee80211_device *ieee)
  * Start of WPA code.                                   *
  * this is stolen from the ipw2200 driver               *
  ********************************************************/
-
-
 static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value)
 {
        /* This is called when wpa_supplicant loads and closes the driver
        return 0;
 }
 
-
 static void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee,
                                      char *wpa_ie, int wpa_ie_len)
 {
        ieee80211_disassociate(ieee);
 }
 
-
 static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason)
 {
-
        int ret = 0;
 
        switch (command) {
        return ret;
 }
 
-
 static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee,
                              struct ieee_param *param, int plen)
 {
 
 static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value)
 {
-
        struct ieee80211_security sec = {
                .flags = SEC_AUTH_MODE,
        };
                ieee->auth_mode = 2;
        }
 
-
        if (ieee->set_security)
                ieee->set_security(ieee->dev, &sec);
        //else
 }
 
 /* implementation borrowed from hostap driver */
-
 static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee,
                                  struct ieee_param *param, int param_len)
 {
        return skb;
 }
 
-
 void
 SendDisassociation(
                struct ieee80211_device *ieee,