2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * Purpose: handle WMAC frame relay & filtering
28 * ROUTEbRelay - Relay packet
41 /*--------------------- Static Definitions -------------------------*/
43 /*--------------------- Static Classes ----------------------------*/
45 /*--------------------- Static Variables --------------------------*/
46 static int msglevel
= MSG_LEVEL_INFO
;
47 //static int msglevel =MSG_LEVEL_DEBUG;
48 /*--------------------- Static Functions --------------------------*/
50 /*--------------------- Export Variables --------------------------*/
54 * Relay packet. Return true if packet is copy to DMA1
59 * pbySkbData - rx packet skb data
63 * Return Value: true if packet duplicate; otherwise false
66 bool ROUTEbRelay(PSDevice pDevice
, unsigned char *pbySkbData
, unsigned int uDataLen
, unsigned int uNodeIndex
)
68 PSMgmtObject pMgmt
= pDevice
->pMgmt
;
69 PSTxDesc pHeadTD
, pLastTD
;
70 unsigned int cbFrameBodySize
;
71 unsigned int uMACfragNum
;
72 unsigned char byPktType
;
73 bool bNeedEncryption
= false;
75 PSKeyItem pTransmitKey
= NULL
;
76 unsigned int cbHeaderSize
;
78 unsigned char *pbyBSSID
;
80 if (AVAIL_TD(pDevice
, TYPE_AC0DMA
) <= 0) {
81 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Relay can't allocate TD1..\n");
85 pHeadTD
= pDevice
->apCurrTD
[TYPE_AC0DMA
];
87 pHeadTD
->m_td1TD1
.byTCR
= (TCR_EDP
| TCR_STP
);
89 memcpy(pDevice
->sTxEthHeader
.abyDstAddr
, (unsigned char *)pbySkbData
, ETH_HLEN
);
91 cbFrameBodySize
= uDataLen
- ETH_HLEN
;
93 if (ntohs(pDevice
->sTxEthHeader
.wType
) > ETH_DATA_LEN
) {
97 if (pDevice
->bEncryptionEnable
== true) {
98 bNeedEncryption
= true;
101 pbyBSSID
= pDevice
->abyBroadcastAddr
;
102 if (KeybGetTransmitKey(&(pDevice
->sKey
), pbyBSSID
, GROUP_KEY
, &pTransmitKey
) == false) {
104 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"KEY is NULL. [%d]\n", pDevice
->pMgmt
->eCurrMode
);
106 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_DEBUG
"Get GTK.\n");
110 if (pDevice
->bEnableHostWEP
) {
111 if (uNodeIndex
< MAX_NODE_NUM
+ 1) {
112 pTransmitKey
= &STempKey
;
113 pTransmitKey
->byCipherSuite
= pMgmt
->sNodeDBTable
[uNodeIndex
].byCipherSuite
;
114 pTransmitKey
->dwKeyIndex
= pMgmt
->sNodeDBTable
[uNodeIndex
].dwKeyIndex
;
115 pTransmitKey
->uKeyLength
= pMgmt
->sNodeDBTable
[uNodeIndex
].uWepKeyLength
;
116 pTransmitKey
->dwTSC47_16
= pMgmt
->sNodeDBTable
[uNodeIndex
].dwTSC47_16
;
117 pTransmitKey
->wTSC15_0
= pMgmt
->sNodeDBTable
[uNodeIndex
].wTSC15_0
;
118 memcpy(pTransmitKey
->abyKey
,
119 &pMgmt
->sNodeDBTable
[uNodeIndex
].abyWepKey
[0],
120 pTransmitKey
->uKeyLength
125 uMACfragNum
= cbGetFragCount(pDevice
, pTransmitKey
, cbFrameBodySize
, &pDevice
->sTxEthHeader
);
127 if (uMACfragNum
> AVAIL_TD(pDevice
, TYPE_AC0DMA
)) {
130 byPktType
= (unsigned char)pDevice
->byPacketType
;
132 if (pDevice
->bFixRate
) {
133 if (pDevice
->eCurrentPHYType
== PHY_TYPE_11B
) {
134 if (pDevice
->uConnectionRate
>= RATE_11M
) {
135 pDevice
->wCurrentRate
= RATE_11M
;
137 pDevice
->wCurrentRate
= (unsigned short)pDevice
->uConnectionRate
;
140 if ((pDevice
->eCurrentPHYType
== PHY_TYPE_11A
) &&
141 (pDevice
->uConnectionRate
<= RATE_6M
)) {
142 pDevice
->wCurrentRate
= RATE_6M
;
144 if (pDevice
->uConnectionRate
>= RATE_54M
)
145 pDevice
->wCurrentRate
= RATE_54M
;
147 pDevice
->wCurrentRate
= (unsigned short)pDevice
->uConnectionRate
;
151 pDevice
->wCurrentRate
= pDevice
->pMgmt
->sNodeDBTable
[uNodeIndex
].wTxDataRate
;
154 if (pDevice
->wCurrentRate
<= RATE_11M
)
155 byPktType
= PK_TYPE_11B
;
157 vGenerateFIFOHeader(pDevice
, byPktType
, pDevice
->pbyTmpBuff
, bNeedEncryption
,
158 cbFrameBodySize
, TYPE_AC0DMA
, pHeadTD
,
159 &pDevice
->sTxEthHeader
, pbySkbData
, pTransmitKey
, uNodeIndex
,
164 if (MACbIsRegBitsOn(pDevice
->PortOffset
, MAC_REG_PSCTL
, PSCTL_PS
)) {
166 MACbPSWakeup(pDevice
->PortOffset
);
169 pDevice
->bPWBitOn
= false;
172 for (ii
= 0; ii
< uMACfragNum
; ii
++) {
173 // Poll Transmit the adapter
175 pHeadTD
->m_td0TD0
.f1Owner
= OWNED_BY_NIC
;
177 if (ii
== (uMACfragNum
- 1))
179 pHeadTD
= pHeadTD
->next
;
182 pLastTD
->pTDInfo
->skb
= 0;
183 pLastTD
->pTDInfo
->byFlags
= 0;
185 pDevice
->apCurrTD
[TYPE_AC0DMA
] = pHeadTD
;
187 MACvTransmitAC0(pDevice
->PortOffset
);