1 /******************************************************************************
3 Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved.
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of version 2 of the GNU General Public License as
7 published by the Free Software Foundation.
9 This program is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 You should have received a copy of the GNU General Public License along with
15 this program; if not, write to the Free Software Foundation, Inc., 59
16 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 The full GNU General Public License is included in this distribution in the
22 James P. Ketrenos <ipw2100-admin@linux.intel.com>
23 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
25 ******************************************************************************
27 Few modifications for Realtek's Wi-Fi drivers by
28 Andrea Merello <andreamrl@tiscali.it>
30 A special thanks goes to Realtek for their support !
32 ******************************************************************************/
34 #include <linux/compiler.h>
35 //#include <linux/config.h>
36 #include <linux/errno.h>
37 #include <linux/if_arp.h>
38 #include <linux/in6.h>
41 #include <linux/kernel.h>
42 #include <linux/module.h>
43 #include <linux/netdevice.h>
44 #include <linux/pci.h>
45 #include <linux/proc_fs.h>
46 #include <linux/skbuff.h>
47 #include <linux/slab.h>
48 #include <linux/tcp.h>
49 #include <linux/types.h>
50 #include <linux/version.h>
51 #include <linux/wireless.h>
52 #include <linux/etherdevice.h>
53 #include <asm/uaccess.h>
54 #include <linux/if_vlan.h>
56 #include "ieee80211.h"
65 802.11 frame_contorl for data frames - 2 bytes
66 ,-----------------------------------------------------------------------------------------.
67 bits | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e |
68 |----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|------|
69 val | 0 | 0 | 0 | 1 | x | 0 | 0 | 0 | 1 | 0 | x | x | x | x | x |
70 |----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|------|
71 desc | ^-ver-^ | ^type-^ | ^-----subtype-----^ | to |from |more |retry| pwr |more |wep |
72 | | | x=0 data,x=1 data+ack | DS | DS |frag | | mgm |data | |
73 '-----------------------------------------------------------------------------------------'
77 ,--------- 'ctrl' expands to >-----------'
79 ,--'---,-------------------------------------------------------------.
80 Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 |
81 |------|------|---------|---------|---------|------|---------|------|
82 Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | Frame | fcs |
83 | | tion | (BSSID) | | | ence | data | |
84 `--------------------------------------------------| |------'
85 Total: 28 non-data bytes `----.----'
87 .- 'Frame data' expands to <---------------------------'
90 ,---------------------------------------------------.
91 Bytes | 1 | 1 | 1 | 3 | 2 | 0-2304 |
92 |------|------|---------|----------|------|---------|
93 Desc. | SNAP | SNAP | Control |Eth Tunnel| Type | IP |
94 | DSAP | SSAP | | | | Packet |
95 | 0xAA | 0xAA |0x03 (UI)|0x00-00-F8| | |
96 `-----------------------------------------| |
97 Total: 8 non-data bytes `----.----'
99 .- 'IP Packet' expands, if WEP enabled, to <--'
102 ,-----------------------.
103 Bytes | 4 | 0-2296 | 4 |
104 |-----|-----------|-----|
105 Desc. | IV | Encrypted | ICV |
107 `-----------------------'
108 Total: 8 non-data bytes
111 802.3 Ethernet Data Frame
113 ,-----------------------------------------.
114 Bytes | 6 | 6 | 2 | Variable | 4 |
115 |-------|-------|------|-----------|------|
116 Desc. | Dest. | Source| Type | IP Packet | fcs |
118 `-----------------------------------------'
119 Total: 18 non-data bytes
121 In the event that fragmentation is required, the incoming payload is split into
122 N parts of size ieee->fts. The first fragment contains the SNAP header and the
123 remaining packets are just data.
125 If encryption is enabled, each fragment payload size is reduced by enough space
126 to add the prefix and postfix (IV and ICV totalling 8 bytes in the case of WEP)
127 So if you have 1500 bytes of payload with ieee->fts set to 500 without
128 encryption it will take 3 frames. With WEP it will take 4 frames as the
129 payload of each frame is reduced to 492 bytes.
135 * | ETHERNET HEADER ,-<-- PAYLOAD
136 * | | 14 bytes from skb->data
137 * | 2 bytes for Type --> ,T. | (sizeof ethhdr)
139 * |,-Dest.--. ,--Src.---. | | |
140 * | 6 bytes| | 6 bytes | | | |
143 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
146 * | | | | `T' <---- 2 bytes for Type
148 * | | '---SNAP--' <-------- 6 bytes for SNAP
150 * `-IV--' <-------------------- 4 bytes for IV (WEP)
156 static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
157 static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
159 static inline int ieee80211_put_snap(u8 *data, u16 h_proto)
161 struct ieee80211_snap_hdr *snap;
164 snap = (struct ieee80211_snap_hdr *)data;
169 if (h_proto == 0x8137 || h_proto == 0x80f3)
173 snap->oui[0] = oui[0];
174 snap->oui[1] = oui[1];
175 snap->oui[2] = oui[2];
177 *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
179 return SNAP_SIZE + sizeof(u16);
182 int ieee80211_encrypt_fragment(
183 struct ieee80211_device *ieee,
184 struct sk_buff *frag,
187 struct ieee80211_crypt_data* crypt = ieee->crypt[ieee->tx_keyidx];
190 if (!(crypt && crypt->ops))
192 printk("=========>%s(), crypt is null\n", __FUNCTION__);
195 #ifdef CONFIG_IEEE80211_CRYPT_TKIP
196 struct ieee80211_hdr *header;
198 if (ieee->tkip_countermeasures &&
199 crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) {
200 header = (struct ieee80211_hdr *) frag->data;
201 if (net_ratelimit()) {
202 printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
203 "TX packet to " MAC_FMT "\n",
204 ieee->dev->name, MAC_ARG(header->addr1));
209 /* To encrypt, frame format is:
210 * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */
212 // PR: FIXME: Copied from hostap. Check fragmentation/MSDU/MPDU encryption.
213 /* Host-based IEEE 802.11 fragmentation for TX is not yet supported, so
214 * call both MSDU and MPDU encryption functions from here. */
215 atomic_inc(&crypt->refcnt);
217 if (crypt->ops->encrypt_msdu)
218 res = crypt->ops->encrypt_msdu(frag, hdr_len, crypt->priv);
219 if (res == 0 && crypt->ops->encrypt_mpdu)
220 res = crypt->ops->encrypt_mpdu(frag, hdr_len, crypt->priv);
222 atomic_dec(&crypt->refcnt);
224 printk(KERN_INFO "%s: Encryption failed: len=%d.\n",
225 ieee->dev->name, frag->len);
226 ieee->ieee_stats.tx_discards++;
234 void ieee80211_txb_free(struct ieee80211_txb *txb) {
239 for (i = 0; i < txb->nr_frags; i++)
240 if (txb->fragments[i])
241 dev_kfree_skb_any(txb->fragments[i]);
246 struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size,
249 struct ieee80211_txb *txb;
252 sizeof(struct ieee80211_txb) + (sizeof(u8*) * nr_frags),
257 memset(txb, 0, sizeof(struct ieee80211_txb));
258 txb->nr_frags = nr_frags;
259 txb->frag_size = txb_size;
261 for (i = 0; i < nr_frags; i++) {
262 txb->fragments[i] = dev_alloc_skb(txb_size);
263 if (unlikely(!txb->fragments[i])) {
267 memset(txb->fragments[i]->cb, 0, sizeof(txb->fragments[i]->cb));
269 if (unlikely(i != nr_frags)) {
271 dev_kfree_skb_any(txb->fragments[i--]);
278 // Classify the to-be send data packet
279 // Need to acquire the sent queue index.
281 ieee80211_classify(struct sk_buff *skb, struct ieee80211_network *network)
285 eth = (struct ethhdr *)skb->data;
286 if (eth->h_proto != htons(ETH_P_IP))
289 // IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA, skb->data, skb->len);
290 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22))
293 ip = (struct iphdr*)(skb->data + sizeof(struct ether_header));
295 switch (ip->tos & 0xfc) {
315 #define SN_LESS(a, b) (((a-b)&0x800)!=0)
316 void ieee80211_tx_query_agg_cap(struct ieee80211_device* ieee, struct sk_buff* skb, cb_desc* tcb_desc)
318 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
319 PTX_TS_RECORD pTxTs = NULL;
320 struct ieee80211_hdr_1addr* hdr = (struct ieee80211_hdr_1addr*)skb->data;
322 if (!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT)
324 if (!IsQoSDataFrame(skb->data))
327 if (is_multicast_ether_addr(hdr->addr1) || is_broadcast_ether_addr(hdr->addr1))
329 //check packet and mode later
331 if(pTcb->PacketLength >= 4096)
333 // For RTL819X, if pairwisekey = wep/tkip, we don't aggrregation.
334 if(!Adapter->HalFunc.GetNmodeSupportBySecCfgHandler(Adapter))
338 if(pHTInfo->IOTAction & HT_IOT_ACT_TX_NO_AGGREGATION)
342 if(!ieee->GetNmodeSupportBySecCfg(ieee->dev))
347 if(pHTInfo->bCurrentAMPDUEnable)
349 if (!GetTs(ieee, (PTS_COMMON_INFO*)(&pTxTs), hdr->addr1, skb->priority, TX_DIR, true))
351 printk("===>can't get TS\n");
354 if (pTxTs->TxAdmittedBARecord.bValid == false)
356 //as some AP will refuse our action frame until key handshake has been finished. WB
357 if (ieee->wpa_ie_len && (ieee->pairwise_key_type == KEY_TYPE_NA))
360 TsStartAddBaProcess(ieee, pTxTs);
361 goto FORCED_AGG_SETTING;
363 else if (pTxTs->bUsingBa == false)
365 if (SN_LESS(pTxTs->TxAdmittedBARecord.BaStartSeqCtrl.field.SeqNum, (pTxTs->TxCurSeq+1)%4096))
366 pTxTs->bUsingBa = true;
368 goto FORCED_AGG_SETTING;
371 if (ieee->iw_mode == IW_MODE_INFRA)
373 tcb_desc->bAMPDUEnable = true;
374 tcb_desc->ampdu_factor = pHTInfo->CurrentAMPDUFactor;
375 tcb_desc->ampdu_density = pHTInfo->CurrentMPDUDensity;
379 switch(pHTInfo->ForcedAMPDUMode )
384 case HT_AGG_FORCE_ENABLE:
385 tcb_desc->bAMPDUEnable = true;
386 tcb_desc->ampdu_density = pHTInfo->ForcedMPDUDensity;
387 tcb_desc->ampdu_factor = pHTInfo->ForcedAMPDUFactor;
390 case HT_AGG_FORCE_DISABLE:
391 tcb_desc->bAMPDUEnable = false;
392 tcb_desc->ampdu_density = 0;
393 tcb_desc->ampdu_factor = 0;
400 extern void ieee80211_qurey_ShortPreambleMode(struct ieee80211_device* ieee, cb_desc* tcb_desc)
402 tcb_desc->bUseShortPreamble = false;
403 if (tcb_desc->data_rate == 2)
404 {//// 1M can only use Long Preamble. 11B spec
407 else if (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
409 tcb_desc->bUseShortPreamble = true;
414 ieee80211_query_HTCapShortGI(struct ieee80211_device *ieee, cb_desc *tcb_desc)
416 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
418 tcb_desc->bUseShortGI = false;
420 if(!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT)
423 if(pHTInfo->bForcedShortGI)
425 tcb_desc->bUseShortGI = true;
429 if((pHTInfo->bCurBW40MHz==true) && pHTInfo->bCurShortGI40MHz)
430 tcb_desc->bUseShortGI = true;
431 else if((pHTInfo->bCurBW40MHz==false) && pHTInfo->bCurShortGI20MHz)
432 tcb_desc->bUseShortGI = true;
435 void ieee80211_query_BandwidthMode(struct ieee80211_device* ieee, cb_desc *tcb_desc)
437 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
439 tcb_desc->bPacketBW = false;
441 if(!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT)
444 if(tcb_desc->bMulticast || tcb_desc->bBroadcast)
447 if((tcb_desc->data_rate & 0x80)==0) // If using legacy rate, it shall use 20MHz channel.
449 //BandWidthAutoSwitch is for auto switch to 20 or 40 in long distance
450 if(pHTInfo->bCurBW40MHz && pHTInfo->bCurTxBW40MHz && !ieee->bandwidth_auto_switch.bforced_tx20Mhz)
451 tcb_desc->bPacketBW = true;
455 void ieee80211_query_protectionmode(struct ieee80211_device* ieee, cb_desc* tcb_desc, struct sk_buff* skb)
458 tcb_desc->bRTSSTBC = false;
459 tcb_desc->bRTSUseShortGI = false; // Since protection frames are always sent by legacy rate, ShortGI will never be used.
460 tcb_desc->bCTSEnable = false; // Most of protection using RTS/CTS
461 tcb_desc->RTSSC = 0; // 20MHz: Don't care; 40MHz: Duplicate.
462 tcb_desc->bRTSBW = false; // RTS frame bandwidth is always 20MHz
464 if(tcb_desc->bBroadcast || tcb_desc->bMulticast)//only unicast frame will use rts/cts
467 if (is_broadcast_ether_addr(skb->data+16)) //check addr3 as infrastructure add3 is DA.
470 if (ieee->mode < IEEE_N_24G) //b, g mode
472 // (1) RTS_Threshold is compared to the MPDU, not MSDU.
473 // (2) If there are more than one frag in this MSDU, only the first frag uses protection frame.
474 // Other fragments are protected by previous fragment.
475 // So we only need to check the length of first fragment.
476 if (skb->len > ieee->rts)
478 tcb_desc->bRTSEnable = true;
479 tcb_desc->rts_rate = MGN_24M;
481 else if (ieee->current_network.buseprotection)
483 // Use CTS-to-SELF in protection mode.
484 tcb_desc->bRTSEnable = true;
485 tcb_desc->bCTSEnable = true;
486 tcb_desc->rts_rate = MGN_24M;
492 {// 11n High throughput case.
493 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
497 if(pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF)
499 tcb_desc->bCTSEnable = true;
500 tcb_desc->rts_rate = MGN_24M;
501 #if defined(RTL8192SE) || defined(RTL8192SU)
502 tcb_desc->bRTSEnable = false;
504 tcb_desc->bRTSEnable = true;
508 else if(pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS|HT_IOT_ACT_PURE_N_MODE))
510 tcb_desc->bRTSEnable = true;
511 tcb_desc->rts_rate = MGN_24M;
514 //check ERP protection
515 if (ieee->current_network.buseprotection)
517 tcb_desc->bRTSEnable = true;
518 tcb_desc->bCTSEnable = true;
519 tcb_desc->rts_rate = MGN_24M;
523 if(pHTInfo->bCurrentHTSupport && pHTInfo->bEnableHT)
525 u8 HTOpMode = pHTInfo->CurrentOpMode;
526 if((pHTInfo->bCurBW40MHz && (HTOpMode == 2 || HTOpMode == 3)) ||
527 (!pHTInfo->bCurBW40MHz && HTOpMode == 3) )
529 tcb_desc->rts_rate = MGN_24M; // Rate is 24Mbps.
530 tcb_desc->bRTSEnable = true;
535 if (skb->len > ieee->rts)
537 tcb_desc->rts_rate = MGN_24M; // Rate is 24Mbps.
538 tcb_desc->bRTSEnable = true;
541 //to do list: check MIMO power save condition.
542 //check AMPDU aggregation for TXOP
543 if(tcb_desc->bAMPDUEnable)
545 tcb_desc->rts_rate = MGN_24M; // Rate is 24Mbps.
546 // According to 8190 design, firmware sends CF-End only if RTS/CTS is enabled. However, it degrads
547 // throughput around 10M, so we disable of this mechanism. 2007.08.03 by Emily
548 tcb_desc->bRTSEnable = false;
551 // Totally no protection case!!
555 // For test , CTS replace with RTS
558 tcb_desc->bCTSEnable = true;
559 tcb_desc->rts_rate = MGN_24M;
560 tcb_desc->bRTSEnable = true;
562 if (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
563 tcb_desc->bUseShortPreamble = true;
564 if (ieee->mode == IW_MODE_MASTER)
568 tcb_desc->bRTSEnable = false;
569 tcb_desc->bCTSEnable = false;
570 tcb_desc->rts_rate = 0;
572 tcb_desc->bRTSBW = false;
576 void ieee80211_txrate_selectmode(struct ieee80211_device* ieee, cb_desc* tcb_desc)
579 if(!IsDataFrame(pFrame))
581 pTcb->bTxDisableRateFallBack = TRUE;
582 pTcb->bTxUseDriverAssingedRate = TRUE;
587 if(pMgntInfo->ForcedDataRate!= 0)
589 pTcb->bTxDisableRateFallBack = TRUE;
590 pTcb->bTxUseDriverAssingedRate = TRUE;
594 if(ieee->bTxDisableRateFallBack)
595 tcb_desc->bTxDisableRateFallBack = true;
597 if(ieee->bTxUseDriverAssingedRate)
598 tcb_desc->bTxUseDriverAssingedRate = true;
599 if(!tcb_desc->bTxDisableRateFallBack || !tcb_desc->bTxUseDriverAssingedRate)
601 if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC)
602 tcb_desc->RATRIndex = 0;
606 void ieee80211_query_seqnum(struct ieee80211_device*ieee, struct sk_buff* skb, u8* dst)
608 if (is_multicast_ether_addr(dst) || is_broadcast_ether_addr(dst))
610 if (IsQoSDataFrame(skb->data)) //we deal qos data only
612 PTX_TS_RECORD pTS = NULL;
613 if (!GetTs(ieee, (PTS_COMMON_INFO*)(&pTS), dst, skb->priority, TX_DIR, true))
617 pTS->TxCurSeq = (pTS->TxCurSeq+1)%4096;
621 int rtl8192_ieee80211_xmit(struct sk_buff *skb, struct net_device *dev)
623 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
624 struct ieee80211_device *ieee = netdev_priv(dev);
626 struct ieee80211_device *ieee = (struct ieee80211_device *)dev->priv;
628 struct ieee80211_txb *txb = NULL;
629 struct ieee80211_hdr_3addrqos *frag_hdr;
630 int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size;
632 struct net_device_stats *stats = &ieee->stats;
633 int ether_type = 0, encrypt;
634 int bytes, fc, qos_ctl = 0, hdr_len;
635 struct sk_buff *skb_frag;
636 struct ieee80211_hdr_3addrqos header = { /* Ensure zero initialized */
641 u8 dest[ETH_ALEN], src[ETH_ALEN];
642 int qos_actived = ieee->current_network.qos_data.active;
644 struct ieee80211_crypt_data* crypt;
648 spin_lock_irqsave(&ieee->lock, flags);
650 /* If there is no driver handler to take the TXB, dont' bother
652 if ((!ieee->hard_start_xmit && !(ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE))||
653 ((!ieee->softmac_data_hard_start_xmit && (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE)))) {
654 printk(KERN_WARNING "%s: No xmit handler.\n",
660 if(likely(ieee->raw_tx == 0)){
661 if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) {
662 printk(KERN_WARNING "%s: skb too small (%d).\n",
663 ieee->dev->name, skb->len);
667 memset(skb->cb, 0, sizeof(skb->cb));
668 ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto);
670 crypt = ieee->crypt[ieee->tx_keyidx];
672 encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) &&
673 ieee->host_encrypt && crypt && crypt->ops;
675 if (!encrypt && ieee->ieee802_1x &&
676 ieee->drop_unencrypted && ether_type != ETH_P_PAE) {
680 #ifdef CONFIG_IEEE80211_DEBUG
681 if (crypt && !encrypt && ether_type == ETH_P_PAE) {
682 struct eapol *eap = (struct eapol *)(skb->data +
683 sizeof(struct ethhdr) - SNAP_SIZE - sizeof(u16));
684 IEEE80211_DEBUG_EAP("TX: IEEE 802.11 EAPOL frame: %s\n",
685 eap_get_type(eap->type));
689 /* Save source and destination addresses */
690 memcpy(&dest, skb->data, ETH_ALEN);
691 memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN);
693 /* Advance the SKB to the start of the payload */
694 skb_pull(skb, sizeof(struct ethhdr));
696 /* Determine total amount of storage required for TXB packets */
697 bytes = skb->len + SNAP_SIZE + sizeof(u16);
700 fc = IEEE80211_FTYPE_DATA | IEEE80211_FCTL_WEP;
703 fc = IEEE80211_FTYPE_DATA;
705 //if(ieee->current_network.QoS_Enable)
707 fc |= IEEE80211_STYPE_QOS_DATA;
709 fc |= IEEE80211_STYPE_DATA;
711 if (ieee->iw_mode == IW_MODE_INFRA) {
712 fc |= IEEE80211_FCTL_TODS;
713 /* To DS: Addr1 = BSSID, Addr2 = SA,
715 memcpy(&header.addr1, ieee->current_network.bssid, ETH_ALEN);
716 memcpy(&header.addr2, &src, ETH_ALEN);
717 memcpy(&header.addr3, &dest, ETH_ALEN);
718 } else if (ieee->iw_mode == IW_MODE_ADHOC) {
719 /* not From/To DS: Addr1 = DA, Addr2 = SA,
721 memcpy(&header.addr1, dest, ETH_ALEN);
722 memcpy(&header.addr2, src, ETH_ALEN);
723 memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN);
726 header.frame_ctl = cpu_to_le16(fc);
728 /* Determine fragmentation size based on destination (multicast
729 * and broadcast are not fragmented) */
730 if (is_multicast_ether_addr(header.addr1) ||
731 is_broadcast_ether_addr(header.addr1)) {
732 frag_size = MAX_FRAG_THRESHOLD;
733 qos_ctl |= QOS_CTL_NOTCONTAIN_ACK;
736 frag_size = ieee->fts;//default:392
740 //if (ieee->current_network.QoS_Enable)
743 hdr_len = IEEE80211_3ADDR_LEN + 2;
745 skb->priority = ieee80211_classify(skb, &ieee->current_network);
746 qos_ctl |= skb->priority; //set in the ieee80211_classify
747 header.qos_ctl = cpu_to_le16(qos_ctl & IEEE80211_QOS_TID);
749 hdr_len = IEEE80211_3ADDR_LEN;
751 /* Determine amount of payload per fragment. Regardless of if
752 * this stack is providing the full 802.11 header, one will
753 * eventually be affixed to this fragment -- so we must account for
754 * it when determining the amount of payload space. */
755 bytes_per_frag = frag_size - hdr_len;
757 (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
758 bytes_per_frag -= IEEE80211_FCS_LEN;
760 /* Each fragment may need to have room for encryptiong pre/postfix */
762 bytes_per_frag -= crypt->ops->extra_prefix_len +
763 crypt->ops->extra_postfix_len;
765 /* Number of fragments is the total bytes_per_frag /
766 * payload_per_fragment */
767 nr_frags = bytes / bytes_per_frag;
768 bytes_last_frag = bytes % bytes_per_frag;
772 bytes_last_frag = bytes_per_frag;
774 /* When we allocate the TXB we allocate enough space for the reserve
775 * and full fragment bytes (bytes_per_frag doesn't include prefix,
776 * postfix, header, FCS, etc.) */
777 txb = ieee80211_alloc_txb(nr_frags, frag_size + ieee->tx_headroom, GFP_ATOMIC);
778 if (unlikely(!txb)) {
779 printk(KERN_WARNING "%s: Could not allocate TXB\n",
783 txb->encrypted = encrypt;
784 txb->payload_size = bytes;
786 //if (ieee->current_network.QoS_Enable)
789 txb->queue_index = UP2AC(skb->priority);
791 txb->queue_index = WME_AC_BK;;
796 for (i = 0; i < nr_frags; i++) {
797 skb_frag = txb->fragments[i];
798 tcb_desc = (cb_desc *)(skb_frag->cb + MAX_DEV_ADDR_SIZE);
800 skb_frag->priority = skb->priority;//UP2AC(skb->priority);
801 tcb_desc->queue_index = UP2AC(skb->priority);
803 skb_frag->priority = WME_AC_BK;
804 tcb_desc->queue_index = WME_AC_BK;
806 skb_reserve(skb_frag, ieee->tx_headroom);
809 if (ieee->hwsec_active)
810 tcb_desc->bHwSec = 1;
812 tcb_desc->bHwSec = 0;
813 skb_reserve(skb_frag, crypt->ops->extra_prefix_len);
817 tcb_desc->bHwSec = 0;
819 frag_hdr = (struct ieee80211_hdr_3addrqos *)skb_put(skb_frag, hdr_len);
820 memcpy(frag_hdr, &header, hdr_len);
822 /* If this is not the last fragment, then add the MOREFRAGS
823 * bit to the frame control */
824 if (i != nr_frags - 1) {
825 frag_hdr->frame_ctl = cpu_to_le16(
826 fc | IEEE80211_FCTL_MOREFRAGS);
827 bytes = bytes_per_frag;
830 /* The last fragment takes the remaining length */
831 bytes = bytes_last_frag;
833 //if(ieee->current_network.QoS_Enable)
836 // add 1 only indicate to corresponding seq number control 2006/7/12
837 frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl[UP2AC(skb->priority)+1]<<4 | i);
839 frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0]<<4 | i);
842 /* Put a SNAP header on the first fragment */
845 skb_put(skb_frag, SNAP_SIZE + sizeof(u16)),
847 bytes -= SNAP_SIZE + sizeof(u16);
850 memcpy(skb_put(skb_frag, bytes), skb->data, bytes);
852 /* Advance the SKB... */
853 skb_pull(skb, bytes);
855 /* Encryption routine will move the header forward in order
856 * to insert the IV between the header and the payload */
858 ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len);
860 (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
861 skb_put(skb_frag, 4);
866 if (ieee->seq_ctrl[UP2AC(skb->priority) + 1] == 0xFFF)
867 ieee->seq_ctrl[UP2AC(skb->priority) + 1] = 0;
869 ieee->seq_ctrl[UP2AC(skb->priority) + 1]++;
871 if (ieee->seq_ctrl[0] == 0xFFF)
872 ieee->seq_ctrl[0] = 0;
877 if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) {
878 printk(KERN_WARNING "%s: skb too small (%d).\n",
879 ieee->dev->name, skb->len);
883 txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC);
885 printk(KERN_WARNING "%s: Could not allocate TXB\n",
891 txb->payload_size = skb->len;
892 memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len);
896 //WB add to fill data tcb_desc here. only first fragment is considered, need to change, and you may remove to other place.
900 cb_desc *tcb_desc = (cb_desc *)(txb->fragments[0]->cb + MAX_DEV_ADDR_SIZE);
901 tcb_desc->bTxEnableFwCalcDur = 1;
902 if (is_multicast_ether_addr(header.addr1))
903 tcb_desc->bMulticast = 1;
904 if (is_broadcast_ether_addr(header.addr1))
905 tcb_desc->bBroadcast = 1;
906 ieee80211_txrate_selectmode(ieee, tcb_desc);
907 if ( tcb_desc->bMulticast || tcb_desc->bBroadcast)
908 tcb_desc->data_rate = ieee->basic_rate;
910 //tcb_desc->data_rate = CURRENT_RATE(ieee->current_network.mode, ieee->rate, ieee->HTCurrentOperaRate);
911 tcb_desc->data_rate = CURRENT_RATE(ieee->mode, ieee->rate, ieee->HTCurrentOperaRate);
912 ieee80211_qurey_ShortPreambleMode(ieee, tcb_desc);
913 ieee80211_tx_query_agg_cap(ieee, txb->fragments[0], tcb_desc);
914 ieee80211_query_HTCapShortGI(ieee, tcb_desc);
915 ieee80211_query_BandwidthMode(ieee, tcb_desc);
916 ieee80211_query_protectionmode(ieee, tcb_desc, txb->fragments[0]);
917 ieee80211_query_seqnum(ieee, txb->fragments[0], header.addr1);
918 // IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA, txb->fragments[0]->data, txb->fragments[0]->len);
919 //IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA, tcb_desc, sizeof(cb_desc));
922 spin_unlock_irqrestore(&ieee->lock, flags);
923 dev_kfree_skb_any(skb);
925 if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){
926 ieee80211_softmac_xmit(txb, ieee);
928 if ((*ieee->hard_start_xmit)(txb, dev) == 0) {
930 stats->tx_bytes += txb->payload_size;
933 ieee80211_txb_free(txb);
940 spin_unlock_irqrestore(&ieee->lock, flags);
941 netif_stop_queue(dev);
946 EXPORT_SYMBOL(rtl8192_ieee80211_xmit);
948 EXPORT_SYMBOL(ieee80211_txb_free);