Commit | Line | Data |
---|---|---|
5449c685 FB |
1 | /* |
2 | * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. | |
3 | * All rights reserved. | |
4 | * | |
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. | |
9 | * | |
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. | |
14 | * | |
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. | |
18 | * | |
19 | * File: wroute.c | |
20 | * | |
21 | * Purpose: handle WMAC frame relay & filterring | |
22 | * | |
23 | * Author: Lyndon Chen | |
24 | * | |
25 | * Date: May 20, 2003 | |
26 | * | |
27 | * Functions: | |
28 | * ROUTEbRelay - Relay packet | |
29 | * | |
30 | * Revision History: | |
31 | * | |
32 | */ | |
33 | ||
5449c685 | 34 | #include "mac.h" |
5449c685 | 35 | #include "tcrc.h" |
5449c685 | 36 | #include "rxtx.h" |
5449c685 | 37 | #include "wroute.h" |
5449c685 | 38 | #include "card.h" |
5449c685 | 39 | #include "baseband.h" |
a7ad322a | 40 | |
5449c685 FB |
41 | /*--------------------- Static Definitions -------------------------*/ |
42 | ||
43 | /*--------------------- Static Classes ----------------------------*/ | |
44 | ||
45 | /*--------------------- Static Variables --------------------------*/ | |
46 | static int msglevel =MSG_LEVEL_INFO; | |
47 | //static int msglevel =MSG_LEVEL_DEBUG; | |
48 | /*--------------------- Static Functions --------------------------*/ | |
49 | ||
50 | /*--------------------- Export Variables --------------------------*/ | |
51 | ||
52 | ||
53 | ||
54 | /* | |
55 | * Description: | |
1b12068a | 56 | * Relay packet. Return true if packet is copy to DMA1 |
5449c685 FB |
57 | * |
58 | * Parameters: | |
59 | * In: | |
60 | * pDevice - | |
61 | * pbySkbData - rx packet skb data | |
62 | * Out: | |
5a5a2a6a | 63 | * true, false |
5449c685 | 64 | * |
5a5a2a6a | 65 | * Return Value: true if packet duplicate; otherwise false |
5449c685 FB |
66 | * |
67 | */ | |
7b6a0013 | 68 | bool ROUTEbRelay (PSDevice pDevice, unsigned char *pbySkbData, unsigned int uDataLen, unsigned int uNodeIndex) |
5449c685 FB |
69 | { |
70 | PSMgmtObject pMgmt = pDevice->pMgmt; | |
71 | PSTxDesc pHeadTD, pLastTD; | |
b6e95cd5 CC |
72 | unsigned int cbFrameBodySize; |
73 | unsigned int uMACfragNum; | |
3fc9b584 | 74 | unsigned char byPktType; |
7b6a0013 | 75 | bool bNeedEncryption = false; |
5449c685 FB |
76 | SKeyItem STempKey; |
77 | PSKeyItem pTransmitKey = NULL; | |
b6e95cd5 CC |
78 | unsigned int cbHeaderSize; |
79 | unsigned int ii; | |
2989e96f | 80 | unsigned char *pbyBSSID; |
5449c685 FB |
81 | |
82 | ||
83 | ||
84 | ||
85 | if (AVAIL_TD(pDevice, TYPE_AC0DMA)<=0) { | |
7e809a9b | 86 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Relay can't allocate TD1..\n"); |
5a5a2a6a | 87 | return false; |
5449c685 FB |
88 | } |
89 | ||
90 | pHeadTD = pDevice->apCurrTD[TYPE_AC0DMA]; | |
91 | ||
92 | pHeadTD->m_td1TD1.byTCR = (TCR_EDP|TCR_STP); | |
93 | ||
2989e96f | 94 | memcpy(pDevice->sTxEthHeader.abyDstAddr, (unsigned char *)pbySkbData, ETH_HLEN); |
5449c685 | 95 | |
96fe9ee2 | 96 | cbFrameBodySize = uDataLen - ETH_HLEN; |
5449c685 | 97 | |
31c21b77 | 98 | if (ntohs(pDevice->sTxEthHeader.wType) > ETH_DATA_LEN) { |
5449c685 FB |
99 | cbFrameBodySize += 8; |
100 | } | |
101 | ||
1b12068a CC |
102 | if (pDevice->bEncryptionEnable == true) { |
103 | bNeedEncryption = true; | |
5449c685 FB |
104 | |
105 | // get group key | |
106 | pbyBSSID = pDevice->abyBroadcastAddr; | |
5a5a2a6a | 107 | if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) { |
5449c685 | 108 | pTransmitKey = NULL; |
7e809a9b | 109 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"KEY is NULL. [%d]\n", pDevice->pMgmt->eCurrMode); |
5449c685 | 110 | } else { |
7e809a9b | 111 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n"); |
5449c685 FB |
112 | } |
113 | } | |
114 | ||
115 | if (pDevice->bEnableHostWEP) { | |
ee93e197 | 116 | if (uNodeIndex < MAX_NODE_NUM + 1) { |
5449c685 FB |
117 | pTransmitKey = &STempKey; |
118 | pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite; | |
119 | pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex; | |
120 | pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength; | |
121 | pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16; | |
122 | pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0; | |
123 | memcpy(pTransmitKey->abyKey, | |
124 | &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0], | |
125 | pTransmitKey->uKeyLength | |
126 | ); | |
127 | } | |
128 | } | |
129 | ||
130 | uMACfragNum = cbGetFragCount(pDevice, pTransmitKey, cbFrameBodySize, &pDevice->sTxEthHeader); | |
131 | ||
132 | if (uMACfragNum > AVAIL_TD(pDevice,TYPE_AC0DMA)) { | |
5a5a2a6a | 133 | return false; |
5449c685 | 134 | } |
3fc9b584 | 135 | byPktType = (unsigned char)pDevice->byPacketType; |
5449c685 FB |
136 | |
137 | if (pDevice->bFixRate) { | |
138 | if (pDevice->eCurrentPHYType == PHY_TYPE_11B) { | |
139 | if (pDevice->uConnectionRate >= RATE_11M) { | |
140 | pDevice->wCurrentRate = RATE_11M; | |
141 | } else { | |
2986db5f | 142 | pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate; |
5449c685 FB |
143 | } |
144 | } else { | |
145 | if ((pDevice->eCurrentPHYType == PHY_TYPE_11A) && | |
146 | (pDevice->uConnectionRate <= RATE_6M)) { | |
147 | pDevice->wCurrentRate = RATE_6M; | |
148 | } else { | |
149 | if (pDevice->uConnectionRate >= RATE_54M) | |
150 | pDevice->wCurrentRate = RATE_54M; | |
151 | else | |
2986db5f | 152 | pDevice->wCurrentRate = (unsigned short)pDevice->uConnectionRate; |
5449c685 FB |
153 | } |
154 | } | |
155 | } | |
156 | else { | |
157 | pDevice->wCurrentRate = pDevice->pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate; | |
158 | } | |
159 | ||
160 | if (pDevice->wCurrentRate <= RATE_11M) | |
7e809a9b | 161 | byPktType = PK_TYPE_11B; |
5449c685 | 162 | |
7e809a9b | 163 | vGenerateFIFOHeader(pDevice, byPktType, pDevice->pbyTmpBuff, bNeedEncryption, |
5449c685 FB |
164 | cbFrameBodySize, TYPE_AC0DMA, pHeadTD, |
165 | &pDevice->sTxEthHeader, pbySkbData, pTransmitKey, uNodeIndex, | |
166 | &uMACfragNum, | |
167 | &cbHeaderSize | |
168 | ); | |
169 | ||
170 | if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS)) { | |
171 | // Disable PS | |
172 | MACbPSWakeup(pDevice->PortOffset); | |
173 | } | |
174 | ||
5a5a2a6a | 175 | pDevice->bPWBitOn = false; |
5449c685 FB |
176 | |
177 | pLastTD = pHeadTD; | |
178 | for (ii = 0; ii < uMACfragNum; ii++) { | |
179 | // Poll Transmit the adapter | |
180 | wmb(); | |
181 | pHeadTD->m_td0TD0.f1Owner=OWNED_BY_NIC; | |
182 | wmb(); | |
183 | if (ii == (uMACfragNum - 1)) | |
184 | pLastTD = pHeadTD; | |
185 | pHeadTD = pHeadTD->next; | |
186 | } | |
187 | ||
188 | pLastTD->pTDInfo->skb = 0; | |
189 | pLastTD->pTDInfo->byFlags = 0; | |
190 | ||
191 | pDevice->apCurrTD[TYPE_AC0DMA] = pHeadTD; | |
192 | ||
193 | MACvTransmitAC0(pDevice->PortOffset); | |
194 | ||
1b12068a | 195 | return true; |
5449c685 FB |
196 | } |
197 | ||
198 | ||
199 |