Loading...
1/************************************************************
2 * CMHOST.C
3 * This file contains the routines for handling Connection
4 * Management.
5 ************************************************************/
6
7#include "headers.h"
8
9enum E_CLASSIFIER_ACTION {
10 eInvalidClassifierAction,
11 eAddClassifier,
12 eReplaceClassifier,
13 eDeleteClassifier
14};
15
16static ULONG GetNextTargetBufferLocation(struct bcm_mini_adapter *Adapter, B_UINT16 tid);
17
18/************************************************************
19 * Function - SearchSfid
20 *
21 * Description - This routinue would search QOS queues having
22 * specified SFID as input parameter.
23 *
24 * Parameters - Adapter: Pointer to the Adapter structure
25 * uiSfid : Given SFID for matching
26 *
27 * Returns - Queue index for this SFID(If matched)
28 * Else Invalid Queue Index(If Not matched)
29 ************************************************************/
30int SearchSfid(struct bcm_mini_adapter *Adapter, UINT uiSfid)
31{
32 int i;
33
34 for (i = (NO_OF_QUEUES-1); i >= 0; i--)
35 if (Adapter->PackInfo[i].ulSFID == uiSfid)
36 return i;
37
38 return NO_OF_QUEUES+1;
39}
40
41/***************************************************************
42 * Function -SearchFreeSfid
43 *
44 * Description - This routinue would search Free available SFID.
45 *
46 * Parameter - Adapter: Pointer to the Adapter structure
47 *
48 * Returns - Queue index for the free SFID
49 * Else returns Invalid Index.
50 ****************************************************************/
51static int SearchFreeSfid(struct bcm_mini_adapter *Adapter)
52{
53 int i;
54
55 for (i = 0; i < (NO_OF_QUEUES-1); i++)
56 if (Adapter->PackInfo[i].ulSFID == 0)
57 return i;
58
59 return NO_OF_QUEUES+1;
60}
61
62/*
63 * Function: SearchClsid
64 * Description: This routinue would search Classifier having specified ClassifierID as input parameter
65 * Input parameters: struct bcm_mini_adapter *Adapter - Adapter Context
66 * unsigned int uiSfid - The SF in which the classifier is to searched
67 * B_UINT16 uiClassifierID - The classifier ID to be searched
68 * Return: int :Classifier table index of matching entry
69 */
70static int SearchClsid(struct bcm_mini_adapter *Adapter, ULONG ulSFID, B_UINT16 uiClassifierID)
71{
72 int i;
73
74 for (i = 0; i < MAX_CLASSIFIERS; i++) {
75 if ((Adapter->astClassifierTable[i].bUsed) &&
76 (Adapter->astClassifierTable[i].uiClassifierRuleIndex == uiClassifierID) &&
77 (Adapter->astClassifierTable[i].ulSFID == ulSFID))
78 return i;
79 }
80
81 return MAX_CLASSIFIERS+1;
82}
83
84/*
85 * @ingroup ctrl_pkt_functions
86 * This routinue would search Free available Classifier entry in classifier table.
87 * @return free Classifier Entry index in classifier table for specified SF
88 */
89static int SearchFreeClsid(struct bcm_mini_adapter *Adapter /**Adapter Context*/)
90{
91 int i;
92
93 for (i = 0; i < MAX_CLASSIFIERS; i++) {
94 if (!Adapter->astClassifierTable[i].bUsed)
95 return i;
96 }
97
98 return MAX_CLASSIFIERS+1;
99}
100
101static VOID deleteSFBySfid(struct bcm_mini_adapter *Adapter, UINT uiSearchRuleIndex)
102{
103 /* deleting all the packet held in the SF */
104 flush_queue(Adapter, uiSearchRuleIndex);
105
106 /* Deleting the all classifiers for this SF */
107 DeleteAllClassifiersForSF(Adapter, uiSearchRuleIndex);
108
109 /* Resetting only MIBS related entries in the SF */
110 memset((PVOID)&Adapter->PackInfo[uiSearchRuleIndex], 0, sizeof(struct bcm_mibs_table));
111}
112
113static inline VOID
114CopyIpAddrToClassifier(struct bcm_classifier_rule *pstClassifierEntry,
115 B_UINT8 u8IpAddressLen, B_UINT8 *pu8IpAddressMaskSrc,
116 bool bIpVersion6, enum bcm_ipaddr_context eIpAddrContext)
117{
118 int i = 0;
119 UINT nSizeOfIPAddressInBytes = IP_LENGTH_OF_ADDRESS;
120 UCHAR *ptrClassifierIpAddress = NULL;
121 UCHAR *ptrClassifierIpMask = NULL;
122 struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
123
124 if (bIpVersion6)
125 nSizeOfIPAddressInBytes = IPV6_ADDRESS_SIZEINBYTES;
126
127 /* Destination Ip Address */
128 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Ip Address Range Length:0x%X ", u8IpAddressLen);
129 if ((bIpVersion6 ? (IPV6_ADDRESS_SIZEINBYTES * MAX_IP_RANGE_LENGTH * 2) :
130 (TOTAL_MASKED_ADDRESS_IN_BYTES)) >= u8IpAddressLen) {
131 /*
132 * checking both the mask and address togethor in Classification.
133 * So length will be : TotalLengthInBytes/nSizeOfIPAddressInBytes * 2
134 * (nSizeOfIPAddressInBytes for address and nSizeOfIPAddressInBytes for mask)
135 */
136 if (eIpAddrContext == eDestIpAddress) {
137 pstClassifierEntry->ucIPDestinationAddressLength = u8IpAddressLen/(nSizeOfIPAddressInBytes * 2);
138 if (bIpVersion6) {
139 ptrClassifierIpAddress = pstClassifierEntry->stDestIpAddress.ucIpv6Address;
140 ptrClassifierIpMask = pstClassifierEntry->stDestIpAddress.ucIpv6Mask;
141 } else {
142 ptrClassifierIpAddress = pstClassifierEntry->stDestIpAddress.ucIpv4Address;
143 ptrClassifierIpMask = pstClassifierEntry->stDestIpAddress.ucIpv4Mask;
144 }
145 } else if (eIpAddrContext == eSrcIpAddress) {
146 pstClassifierEntry->ucIPSourceAddressLength = u8IpAddressLen/(nSizeOfIPAddressInBytes * 2);
147 if (bIpVersion6) {
148 ptrClassifierIpAddress = pstClassifierEntry->stSrcIpAddress.ucIpv6Address;
149 ptrClassifierIpMask = pstClassifierEntry->stSrcIpAddress.ucIpv6Mask;
150 } else {
151 ptrClassifierIpAddress = pstClassifierEntry->stSrcIpAddress.ucIpv4Address;
152 ptrClassifierIpMask = pstClassifierEntry->stSrcIpAddress.ucIpv4Mask;
153 }
154 }
155 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Address Length:0x%X\n", pstClassifierEntry->ucIPDestinationAddressLength);
156 while ((u8IpAddressLen >= nSizeOfIPAddressInBytes) && (i < MAX_IP_RANGE_LENGTH)) {
157 memcpy(ptrClassifierIpAddress +
158 (i * nSizeOfIPAddressInBytes),
159 (pu8IpAddressMaskSrc+(i*nSizeOfIPAddressInBytes*2)),
160 nSizeOfIPAddressInBytes);
161
162 if (!bIpVersion6) {
163 if (eIpAddrContext == eSrcIpAddress) {
164 pstClassifierEntry->stSrcIpAddress.ulIpv4Addr[i] = ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv4Addr[i]);
165 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Src Ip Address:0x%luX ",
166 pstClassifierEntry->stSrcIpAddress.ulIpv4Addr[i]);
167 } else if (eIpAddrContext == eDestIpAddress) {
168 pstClassifierEntry->stDestIpAddress.ulIpv4Addr[i] = ntohl(pstClassifierEntry->stDestIpAddress.ulIpv4Addr[i]);
169 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Dest Ip Address:0x%luX ",
170 pstClassifierEntry->stDestIpAddress.ulIpv4Addr[i]);
171 }
172 }
173 u8IpAddressLen -= nSizeOfIPAddressInBytes;
174 if (u8IpAddressLen >= nSizeOfIPAddressInBytes) {
175 memcpy(ptrClassifierIpMask +
176 (i * nSizeOfIPAddressInBytes),
177 (pu8IpAddressMaskSrc+nSizeOfIPAddressInBytes +
178 (i*nSizeOfIPAddressInBytes*2)),
179 nSizeOfIPAddressInBytes);
180
181 if (!bIpVersion6) {
182 if (eIpAddrContext == eSrcIpAddress) {
183 pstClassifierEntry->stSrcIpAddress.ulIpv4Mask[i] =
184 ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv4Mask[i]);
185 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Src Ip Mask Address:0x%luX ",
186 pstClassifierEntry->stSrcIpAddress.ulIpv4Mask[i]);
187 } else if (eIpAddrContext == eDestIpAddress) {
188 pstClassifierEntry->stDestIpAddress.ulIpv4Mask[i] =
189 ntohl(pstClassifierEntry->stDestIpAddress.ulIpv4Mask[i]);
190 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Dest Ip Mask Address:0x%luX ",
191 pstClassifierEntry->stDestIpAddress.ulIpv4Mask[i]);
192 }
193 }
194 u8IpAddressLen -= nSizeOfIPAddressInBytes;
195 }
196 if (u8IpAddressLen == 0)
197 pstClassifierEntry->bDestIpValid = TRUE;
198
199 i++;
200 }
201 if (bIpVersion6) {
202 /* Restore EndianNess of Struct */
203 for (i = 0; i < MAX_IP_RANGE_LENGTH * 4; i++) {
204 if (eIpAddrContext == eSrcIpAddress) {
205 pstClassifierEntry->stSrcIpAddress.ulIpv6Addr[i] = ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv6Addr[i]);
206 pstClassifierEntry->stSrcIpAddress.ulIpv6Mask[i] = ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv6Mask[i]);
207 } else if (eIpAddrContext == eDestIpAddress) {
208 pstClassifierEntry->stDestIpAddress.ulIpv6Addr[i] = ntohl(pstClassifierEntry->stDestIpAddress.ulIpv6Addr[i]);
209 pstClassifierEntry->stDestIpAddress.ulIpv6Mask[i] = ntohl(pstClassifierEntry->stDestIpAddress.ulIpv6Mask[i]);
210 }
211 }
212 }
213 }
214}
215
216void ClearTargetDSXBuffer(struct bcm_mini_adapter *Adapter, B_UINT16 TID, bool bFreeAll)
217{
218 int i;
219
220 for (i = 0; i < Adapter->ulTotalTargetBuffersAvailable; i++) {
221 if (Adapter->astTargetDsxBuffer[i].valid)
222 continue;
223
224 if ((bFreeAll) || (Adapter->astTargetDsxBuffer[i].tid == TID)) {
225 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "ClearTargetDSXBuffer: found tid %d buffer cleared %lx\n",
226 TID, Adapter->astTargetDsxBuffer[i].ulTargetDsxBuffer);
227 Adapter->astTargetDsxBuffer[i].valid = 1;
228 Adapter->astTargetDsxBuffer[i].tid = 0;
229 Adapter->ulFreeTargetBufferCnt++;
230 }
231 }
232}
233
234/*
235 * @ingroup ctrl_pkt_functions
236 * copy classifier rule into the specified SF index
237 */
238static inline VOID CopyClassifierRuleToSF(struct bcm_mini_adapter *Adapter, struct bcm_convergence_types *psfCSType, UINT uiSearchRuleIndex, UINT nClassifierIndex)
239{
240 struct bcm_classifier_rule *pstClassifierEntry = NULL;
241 /* VOID *pvPhsContext = NULL; */
242 int i;
243 /* UCHAR ucProtocolLength=0; */
244 /* ULONG ulPhsStatus; */
245
246 if (Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value == 0 ||
247 nClassifierIndex > (MAX_CLASSIFIERS-1))
248 return;
249
250 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Storing Classifier Rule Index : %X",
251 ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex));
252
253 if (nClassifierIndex > MAX_CLASSIFIERS-1)
254 return;
255
256 pstClassifierEntry = &Adapter->astClassifierTable[nClassifierIndex];
257 if (pstClassifierEntry) {
258 /* Store if Ipv6 */
259 pstClassifierEntry->bIpv6Protocol = (Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6) ? TRUE : false;
260
261 /* Destinaiton Port */
262 pstClassifierEntry->ucDestPortRangeLength = psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength / 4;
263 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Destination Port Range Length:0x%X ", pstClassifierEntry->ucDestPortRangeLength);
264
265 if (psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength <= MAX_PORT_RANGE) {
266 for (i = 0; i < (pstClassifierEntry->ucDestPortRangeLength); i++) {
267 pstClassifierEntry->usDestPortRangeLo[i] = *((PUSHORT)(psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange+i));
268 pstClassifierEntry->usDestPortRangeHi[i] =
269 *((PUSHORT)(psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange+2+i));
270 pstClassifierEntry->usDestPortRangeLo[i] = ntohs(pstClassifierEntry->usDestPortRangeLo[i]);
271 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Destination Port Range Lo:0x%X ",
272 pstClassifierEntry->usDestPortRangeLo[i]);
273 pstClassifierEntry->usDestPortRangeHi[i] = ntohs(pstClassifierEntry->usDestPortRangeHi[i]);
274 }
275 } else {
276 pstClassifierEntry->ucDestPortRangeLength = 0;
277 }
278
279 /* Source Port */
280 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Source Port Range Length:0x%X ",
281 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
282 if (psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength <= MAX_PORT_RANGE) {
283 pstClassifierEntry->ucSrcPortRangeLength = psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength/4;
284 for (i = 0; i < (pstClassifierEntry->ucSrcPortRangeLength); i++) {
285 pstClassifierEntry->usSrcPortRangeLo[i] =
286 *((PUSHORT)(psfCSType->cCPacketClassificationRule.
287 u8ProtocolSourcePortRange+i));
288 pstClassifierEntry->usSrcPortRangeHi[i] =
289 *((PUSHORT)(psfCSType->cCPacketClassificationRule.
290 u8ProtocolSourcePortRange+2+i));
291 pstClassifierEntry->usSrcPortRangeLo[i] =
292 ntohs(pstClassifierEntry->usSrcPortRangeLo[i]);
293 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Source Port Range Lo:0x%X ",
294 pstClassifierEntry->usSrcPortRangeLo[i]);
295 pstClassifierEntry->usSrcPortRangeHi[i] = ntohs(pstClassifierEntry->usSrcPortRangeHi[i]);
296 }
297 }
298 /* Destination Ip Address and Mask */
299 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Ip Destination Parameters : ");
300 CopyIpAddrToClassifier(pstClassifierEntry,
301 psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength,
302 psfCSType->cCPacketClassificationRule.u8IPDestinationAddress,
303 (Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6) ?
304 TRUE : false, eDestIpAddress);
305
306 /* Source Ip Address and Mask */
307 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Ip Source Parameters : ");
308
309 CopyIpAddrToClassifier(pstClassifierEntry,
310 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength,
311 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress,
312 (Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6) ? TRUE : false,
313 eSrcIpAddress);
314
315 /* TOS */
316 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "TOS Length:0x%X ", psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
317 if (psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength == 3) {
318 pstClassifierEntry->ucIPTypeOfServiceLength = psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength;
319 pstClassifierEntry->ucTosLow = psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0];
320 pstClassifierEntry->ucTosHigh = psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1];
321 pstClassifierEntry->ucTosMask = psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2];
322 pstClassifierEntry->bTOSValid = TRUE;
323 }
324 if (psfCSType->cCPacketClassificationRule.u8Protocol == 0) {
325 /* we didn't get protocol field filled in by the BS */
326 pstClassifierEntry->ucProtocolLength = 0;
327 } else {
328 pstClassifierEntry->ucProtocolLength = 1; /* 1 valid protocol */
329 }
330
331 pstClassifierEntry->ucProtocol[0] = psfCSType->cCPacketClassificationRule.u8Protocol;
332 pstClassifierEntry->u8ClassifierRulePriority = psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority;
333
334 /* store the classifier rule ID and set this classifier entry as valid */
335 pstClassifierEntry->ucDirection = Adapter->PackInfo[uiSearchRuleIndex].ucDirection;
336 pstClassifierEntry->uiClassifierRuleIndex = ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
337 pstClassifierEntry->usVCID_Value = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
338 pstClassifierEntry->ulSFID = Adapter->PackInfo[uiSearchRuleIndex].ulSFID;
339 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Search Index %d Dir: %d, Index: %d, Vcid: %d\n",
340 uiSearchRuleIndex, pstClassifierEntry->ucDirection,
341 pstClassifierEntry->uiClassifierRuleIndex,
342 pstClassifierEntry->usVCID_Value);
343
344 if (psfCSType->cCPacketClassificationRule.u8AssociatedPHSI)
345 pstClassifierEntry->u8AssociatedPHSI = psfCSType->cCPacketClassificationRule.u8AssociatedPHSI;
346
347 /* Copy ETH CS Parameters */
348 pstClassifierEntry->ucEthCSSrcMACLen = (psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddressLength);
349 memcpy(pstClassifierEntry->au8EThCSSrcMAC, psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress, MAC_ADDRESS_SIZE);
350 memcpy(pstClassifierEntry->au8EThCSSrcMACMask, psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress + MAC_ADDRESS_SIZE, MAC_ADDRESS_SIZE);
351 pstClassifierEntry->ucEthCSDestMACLen = (psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
352 memcpy(pstClassifierEntry->au8EThCSDestMAC, psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress, MAC_ADDRESS_SIZE);
353 memcpy(pstClassifierEntry->au8EThCSDestMACMask, psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress + MAC_ADDRESS_SIZE, MAC_ADDRESS_SIZE);
354 pstClassifierEntry->ucEtherTypeLen = (psfCSType->cCPacketClassificationRule.u8EthertypeLength);
355 memcpy(pstClassifierEntry->au8EthCSEtherType, psfCSType->cCPacketClassificationRule.u8Ethertype, NUM_ETHERTYPE_BYTES);
356 memcpy(pstClassifierEntry->usUserPriority, &psfCSType->cCPacketClassificationRule.u16UserPriority, 2);
357 pstClassifierEntry->usVLANID = ntohs(psfCSType->cCPacketClassificationRule.u16VLANID);
358 pstClassifierEntry->usValidityBitMap = ntohs(psfCSType->cCPacketClassificationRule.u16ValidityBitMap);
359
360 pstClassifierEntry->bUsed = TRUE;
361 }
362}
363
364/*
365 * @ingroup ctrl_pkt_functions
366 */
367static inline VOID DeleteClassifierRuleFromSF(struct bcm_mini_adapter *Adapter, UINT uiSearchRuleIndex, UINT nClassifierIndex)
368{
369 struct bcm_classifier_rule *pstClassifierEntry = NULL;
370 B_UINT16 u16PacketClassificationRuleIndex;
371 USHORT usVCID;
372 /* VOID *pvPhsContext = NULL; */
373 /*ULONG ulPhsStatus; */
374
375 usVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
376
377 if (nClassifierIndex > MAX_CLASSIFIERS-1)
378 return;
379
380 if (usVCID == 0)
381 return;
382
383 u16PacketClassificationRuleIndex = Adapter->astClassifierTable[nClassifierIndex].uiClassifierRuleIndex;
384 pstClassifierEntry = &Adapter->astClassifierTable[nClassifierIndex];
385 if (pstClassifierEntry) {
386 pstClassifierEntry->bUsed = false;
387 pstClassifierEntry->uiClassifierRuleIndex = 0;
388 memset(pstClassifierEntry, 0, sizeof(struct bcm_classifier_rule));
389
390 /* Delete the PHS Rule for this classifier */
391 PhsDeleteClassifierRule(&Adapter->stBCMPhsContext, usVCID, u16PacketClassificationRuleIndex);
392 }
393}
394
395/*
396 * @ingroup ctrl_pkt_functions
397 */
398VOID DeleteAllClassifiersForSF(struct bcm_mini_adapter *Adapter, UINT uiSearchRuleIndex)
399{
400 struct bcm_classifier_rule *pstClassifierEntry = NULL;
401 int i;
402 /* B_UINT16 u16PacketClassificationRuleIndex; */
403 USHORT ulVCID;
404 /* VOID *pvPhsContext = NULL; */
405 /* ULONG ulPhsStatus; */
406
407 ulVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
408
409 if (ulVCID == 0)
410 return;
411
412 for (i = 0; i < MAX_CLASSIFIERS; i++) {
413 if (Adapter->astClassifierTable[i].usVCID_Value == ulVCID) {
414 pstClassifierEntry = &Adapter->astClassifierTable[i];
415
416 if (pstClassifierEntry->bUsed)
417 DeleteClassifierRuleFromSF(Adapter, uiSearchRuleIndex, i);
418 }
419 }
420
421 /* Delete All Phs Rules Associated with this SF */
422 PhsDeleteSFRules(&Adapter->stBCMPhsContext, ulVCID);
423}
424
425/*
426 * This routinue copies the Connection Management
427 * related data into the Adapter structure.
428 * @ingroup ctrl_pkt_functions
429 */
430static VOID CopyToAdapter(register struct bcm_mini_adapter *Adapter, /* <Pointer to the Adapter structure */
431 register struct bcm_connect_mgr_params *psfLocalSet, /* Pointer to the connection manager parameters structure */
432 register UINT uiSearchRuleIndex, /* <Index of Queue, to which this data belongs */
433 register UCHAR ucDsxType,
434 struct bcm_add_indication_alt *pstAddIndication) {
435
436 /* UCHAR ucProtocolLength = 0; */
437 ULONG ulSFID;
438 UINT nClassifierIndex = 0;
439 enum E_CLASSIFIER_ACTION eClassifierAction = eInvalidClassifierAction;
440 B_UINT16 u16PacketClassificationRuleIndex = 0;
441 int i;
442 struct bcm_convergence_types *psfCSType = NULL;
443 struct bcm_phs_rule sPhsRule;
444 USHORT uVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
445 UINT UGIValue = 0;
446
447 Adapter->PackInfo[uiSearchRuleIndex].bValid = TRUE;
448 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Search Rule Index = %d\n", uiSearchRuleIndex);
449 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "%s: SFID= %x ", __func__, ntohl(psfLocalSet->u32SFID));
450 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Updating Queue %d", uiSearchRuleIndex);
451
452 ulSFID = ntohl(psfLocalSet->u32SFID);
453 /* Store IP Version used */
454 /* Get The Version Of IP used (IPv6 or IPv4) from CSSpecification field of SF */
455
456 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = 0;
457 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = 0;
458
459 /* Enable IP/ETh CS Support As Required */
460 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "CopyToAdapter : u8CSSpecification : %X\n", psfLocalSet->u8CSSpecification);
461 switch (psfLocalSet->u8CSSpecification) {
462 case eCSPacketIPV4:
463 {
464 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
465 break;
466 }
467 case eCSPacketIPV6:
468 {
469 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV6_CS;
470 break;
471 }
472 case eCS802_3PacketEthernet:
473 case eCS802_1QPacketVLAN:
474 {
475 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
476 break;
477 }
478 case eCSPacketIPV4Over802_1QVLAN:
479 case eCSPacketIPV4Over802_3Ethernet:
480 {
481 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
482 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
483 break;
484 }
485 case eCSPacketIPV6Over802_1QVLAN:
486 case eCSPacketIPV6Over802_3Ethernet:
487 {
488 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV6_CS;
489 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
490 break;
491 }
492 default:
493 {
494 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error in value of CS Classification.. setting default to IP CS\n");
495 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
496 break;
497 }
498 }
499
500 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "CopyToAdapter : Queue No : %X ETH CS Support : %X , IP CS Support : %X\n",
501 uiSearchRuleIndex,
502 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport,
503 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport);
504
505 /* Store IP Version used */
506 /* Get The Version Of IP used (IPv6 or IPv4) from CSSpecification field of SF */
507 if (Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport == IPV6_CS)
508 Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion = IPV6;
509 else
510 Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion = IPV4;
511
512 /* To ensure that the ETH CS code doesn't gets executed if the BS doesn't supports ETH CS */
513 if (!Adapter->bETHCSEnabled)
514 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = 0;
515
516 if (psfLocalSet->u8ServiceClassNameLength > 0 && psfLocalSet->u8ServiceClassNameLength < 32)
517 memcpy(Adapter->PackInfo[uiSearchRuleIndex].ucServiceClassName, psfLocalSet->u8ServiceClassName, psfLocalSet->u8ServiceClassNameLength);
518
519 Adapter->PackInfo[uiSearchRuleIndex].u8QueueType = psfLocalSet->u8ServiceFlowSchedulingType;
520
521 if (Adapter->PackInfo[uiSearchRuleIndex].u8QueueType == BE && Adapter->PackInfo[uiSearchRuleIndex].ucDirection)
522 Adapter->usBestEffortQueueIndex = uiSearchRuleIndex;
523
524 Adapter->PackInfo[uiSearchRuleIndex].ulSFID = ntohl(psfLocalSet->u32SFID);
525
526 Adapter->PackInfo[uiSearchRuleIndex].u8TrafficPriority = psfLocalSet->u8TrafficPriority;
527
528 /* copy all the classifier in the Service Flow param structure */
529 for (i = 0; i < psfLocalSet->u8TotalClassifiers; i++) {
530 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Classifier index =%d", i);
531 psfCSType = &psfLocalSet->cConvergenceSLTypes[i];
532 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Classifier index =%d", i);
533
534 if (psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority)
535 Adapter->PackInfo[uiSearchRuleIndex].bClassifierPriority = TRUE;
536
537 if (psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority)
538 Adapter->PackInfo[uiSearchRuleIndex].bClassifierPriority = TRUE;
539
540 if (ucDsxType == DSA_ACK) {
541 eClassifierAction = eAddClassifier;
542 } else if (ucDsxType == DSC_ACK) {
543 switch (psfCSType->u8ClassfierDSCAction) {
544 case 0: /* DSC Add Classifier */
545 {
546 eClassifierAction = eAddClassifier;
547 }
548 break;
549 case 1: /* DSC Replace Classifier */
550 {
551 eClassifierAction = eReplaceClassifier;
552 }
553 break;
554 case 2: /* DSC Delete Classifier */
555 {
556 eClassifierAction = eDeleteClassifier;
557 }
558 break;
559 default:
560 {
561 eClassifierAction = eInvalidClassifierAction;
562 }
563 }
564 }
565
566 u16PacketClassificationRuleIndex = ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
567
568 switch (eClassifierAction) {
569 case eAddClassifier:
570 {
571 /* Get a Free Classifier Index From Classifier table for this SF to add the Classifier */
572 /* Contained in this message */
573 nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
574
575 if (nClassifierIndex > MAX_CLASSIFIERS) {
576 nClassifierIndex = SearchFreeClsid(Adapter);
577 if (nClassifierIndex > MAX_CLASSIFIERS) {
578 /* Failed To get a free Entry */
579 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error Failed To get a free Classifier Entry");
580 break;
581 }
582 /* Copy the Classifier Rule for this service flow into our Classifier table maintained per SF. */
583 CopyClassifierRuleToSF(Adapter, psfCSType, uiSearchRuleIndex, nClassifierIndex);
584 } else {
585 /* This Classifier Already Exists and it is invalid to Add Classifier with existing PCRI */
586 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,
587 "CopyToAdapter: Error The Specified Classifier Already Exists and attempted To Add Classifier with Same PCRI : 0x%x\n",
588 u16PacketClassificationRuleIndex);
589 }
590 }
591 break;
592 case eReplaceClassifier:
593 {
594 /* Get the Classifier Index From Classifier table for this SF and replace existing Classifier */
595 /* with the new classifier Contained in this message */
596 nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
597 if (nClassifierIndex > MAX_CLASSIFIERS) {
598 /* Failed To search the classifier */
599 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error Search for Classifier To be replaced failed");
600 break;
601 }
602 /* Copy the Classifier Rule for this service flow into our Classifier table maintained per SF. */
603 CopyClassifierRuleToSF(Adapter, psfCSType, uiSearchRuleIndex, nClassifierIndex);
604 }
605 break;
606 case eDeleteClassifier:
607 {
608 /* Get the Classifier Index From Classifier table for this SF and replace existing Classifier */
609 /* with the new classifier Contained in this message */
610 nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
611 if (nClassifierIndex > MAX_CLASSIFIERS) {
612 /* Failed To search the classifier */
613 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error Search for Classifier To be deleted failed");
614 break;
615 }
616
617 /* Delete This classifier */
618 DeleteClassifierRuleFromSF(Adapter, uiSearchRuleIndex, nClassifierIndex);
619 }
620 break;
621 default:
622 {
623 /* Invalid Action for classifier */
624 break;
625 }
626 }
627 }
628
629 /* Repeat parsing Classification Entries to process PHS Rules */
630 for (i = 0; i < psfLocalSet->u8TotalClassifiers; i++) {
631 psfCSType = &psfLocalSet->cConvergenceSLTypes[i];
632 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "psfCSType->u8PhsDSCAction : 0x%x\n", psfCSType->u8PhsDSCAction);
633
634 switch (psfCSType->u8PhsDSCAction) {
635 case eDeleteAllPHSRules:
636 {
637 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Deleting All PHS Rules For VCID: 0x%X\n", uVCID);
638
639 /* Delete All the PHS rules for this Service flow */
640 PhsDeleteSFRules(&Adapter->stBCMPhsContext, uVCID);
641 break;
642 }
643 case eDeletePHSRule:
644 {
645 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "PHS DSC Action = Delete PHS Rule\n");
646
647 if (psfCSType->cPhsRule.u8PHSI)
648 PhsDeletePHSRule(&Adapter->stBCMPhsContext, uVCID, psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
649
650 break;
651 }
652 default:
653 {
654 if (ucDsxType == DSC_ACK) {
655 /* BCM_DEBUG_PRINT(CONN_MSG,("Invalid PHS DSC Action For DSC\n",psfCSType->cPhsRule.u8PHSI)); */
656 break; /* FOr DSC ACK Case PHS DSC Action must be in valid set */
657 }
658 }
659 /* Proceed To Add PHS rule for DSA_ACK case even if PHS DSC action is unspecified */
660 /* No Break Here . Intentionally! */
661
662 case eAddPHSRule:
663 case eSetPHSRule:
664 {
665 if (psfCSType->cPhsRule.u8PHSI) {
666 /* Apply This PHS Rule to all classifiers whose Associated PHSI Match */
667 unsigned int uiClassifierIndex = 0;
668 if (pstAddIndication->u8Direction == UPLINK_DIR) {
669 for (uiClassifierIndex = 0; uiClassifierIndex < MAX_CLASSIFIERS; uiClassifierIndex++) {
670 if ((Adapter->astClassifierTable[uiClassifierIndex].bUsed) &&
671 (Adapter->astClassifierTable[uiClassifierIndex].ulSFID == Adapter->PackInfo[uiSearchRuleIndex].ulSFID) &&
672 (Adapter->astClassifierTable[uiClassifierIndex].u8AssociatedPHSI == psfCSType->cPhsRule.u8PHSI)) {
673 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,
674 "Adding PHS Rule For Classifier: 0x%x cPhsRule.u8PHSI: 0x%x\n",
675 Adapter->astClassifierTable[uiClassifierIndex].uiClassifierRuleIndex,
676 psfCSType->cPhsRule.u8PHSI);
677 /* Update The PHS Rule for this classifier as Associated PHSI id defined */
678
679 /* Copy the PHS Rule */
680 sPhsRule.u8PHSI = psfCSType->cPhsRule.u8PHSI;
681 sPhsRule.u8PHSFLength = psfCSType->cPhsRule.u8PHSFLength;
682 sPhsRule.u8PHSMLength = psfCSType->cPhsRule.u8PHSMLength;
683 sPhsRule.u8PHSS = psfCSType->cPhsRule.u8PHSS;
684 sPhsRule.u8PHSV = psfCSType->cPhsRule.u8PHSV;
685 memcpy(sPhsRule.u8PHSF, psfCSType->cPhsRule.u8PHSF, MAX_PHS_LENGTHS);
686 memcpy(sPhsRule.u8PHSM, psfCSType->cPhsRule.u8PHSM, MAX_PHS_LENGTHS);
687 sPhsRule.u8RefCnt = 0;
688 sPhsRule.bUnclassifiedPHSRule = false;
689 sPhsRule.PHSModifiedBytes = 0;
690 sPhsRule.PHSModifiedNumPackets = 0;
691 sPhsRule.PHSErrorNumPackets = 0;
692
693 /* bPHSRuleAssociated = TRUE; */
694 /* Store The PHS Rule for this classifier */
695
696 PhsUpdateClassifierRule(
697 &Adapter->stBCMPhsContext,
698 uVCID,
699 Adapter->astClassifierTable[uiClassifierIndex].uiClassifierRuleIndex,
700 &sPhsRule,
701 Adapter->astClassifierTable[uiClassifierIndex].u8AssociatedPHSI);
702
703 /* Update PHS Rule For the Classifier */
704 if (sPhsRule.u8PHSI) {
705 Adapter->astClassifierTable[uiClassifierIndex].u32PHSRuleID = sPhsRule.u8PHSI;
706 memcpy(&Adapter->astClassifierTable[uiClassifierIndex].sPhsRule, &sPhsRule, sizeof(struct bcm_phs_rule));
707 }
708 }
709 }
710 } else {
711 /* Error PHS Rule specified in signaling could not be applied to any classifier */
712
713 /* Copy the PHS Rule */
714 sPhsRule.u8PHSI = psfCSType->cPhsRule.u8PHSI;
715 sPhsRule.u8PHSFLength = psfCSType->cPhsRule.u8PHSFLength;
716 sPhsRule.u8PHSMLength = psfCSType->cPhsRule.u8PHSMLength;
717 sPhsRule.u8PHSS = psfCSType->cPhsRule.u8PHSS;
718 sPhsRule.u8PHSV = psfCSType->cPhsRule.u8PHSV;
719 memcpy(sPhsRule.u8PHSF, psfCSType->cPhsRule.u8PHSF, MAX_PHS_LENGTHS);
720 memcpy(sPhsRule.u8PHSM, psfCSType->cPhsRule.u8PHSM, MAX_PHS_LENGTHS);
721 sPhsRule.u8RefCnt = 0;
722 sPhsRule.bUnclassifiedPHSRule = TRUE;
723 sPhsRule.PHSModifiedBytes = 0;
724 sPhsRule.PHSModifiedNumPackets = 0;
725 sPhsRule.PHSErrorNumPackets = 0;
726 /* Store The PHS Rule for this classifier */
727
728 /*
729 * Passing the argument u8PHSI instead of clsid. Because for DL with no classifier rule,
730 * clsid will be zero hence we can't have multiple PHS rules for the same SF.
731 * To support multiple PHS rule, passing u8PHSI.
732 */
733 PhsUpdateClassifierRule(
734 &Adapter->stBCMPhsContext,
735 uVCID,
736 sPhsRule.u8PHSI,
737 &sPhsRule,
738 sPhsRule.u8PHSI);
739 }
740 }
741 }
742 break;
743 }
744 }
745
746 if (psfLocalSet->u32MaxSustainedTrafficRate == 0) {
747 /* No Rate Limit . Set Max Sustained Traffic Rate to Maximum */
748 Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate = WIMAX_MAX_ALLOWED_RATE;
749 } else if (ntohl(psfLocalSet->u32MaxSustainedTrafficRate) > WIMAX_MAX_ALLOWED_RATE) {
750 /* Too large Allowed Rate specified. Limiting to Wi Max Allowed rate */
751 Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate = WIMAX_MAX_ALLOWED_RATE;
752 } else {
753 Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate = ntohl(psfLocalSet->u32MaxSustainedTrafficRate);
754 }
755
756 Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency = ntohl(psfLocalSet->u32MaximumLatency);
757 if (Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency == 0) /* 0 should be treated as infinite */
758 Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency = MAX_LATENCY_ALLOWED;
759
760 if ((Adapter->PackInfo[uiSearchRuleIndex].u8QueueType == ERTPS ||
761 Adapter->PackInfo[uiSearchRuleIndex].u8QueueType == UGS))
762 UGIValue = ntohs(psfLocalSet->u16UnsolicitedGrantInterval);
763
764 if (UGIValue == 0)
765 UGIValue = DEFAULT_UG_INTERVAL;
766
767 /*
768 * For UGI based connections...
769 * DEFAULT_UGI_FACTOR*UGIInterval worth of data is the max token count at host...
770 * The extra amount of token is to ensure that a large amount of jitter won't have loss in throughput...
771 * In case of non-UGI based connection, 200 frames worth of data is the max token count at host...
772 */
773 Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize =
774 (DEFAULT_UGI_FACTOR*Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate*UGIValue)/1000;
775
776 if (Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize < WIMAX_MAX_MTU*8) {
777 UINT UGIFactor = 0;
778 /* Special Handling to ensure the biggest size of packet can go out from host to FW as follows:
779 * 1. Any packet from Host to FW can go out in different packet size.
780 * 2. So in case the Bucket count is smaller than MTU, the packets of size (Size > TokenCount), will get dropped.
781 * 3. We can allow packets of MaxSize from Host->FW that can go out from FW in multiple SDUs by fragmentation at Wimax Layer
782 */
783 UGIFactor = (Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency/UGIValue + 1);
784
785 if (UGIFactor > DEFAULT_UGI_FACTOR)
786 Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize =
787 (UGIFactor*Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate*UGIValue)/1000;
788
789 if (Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize > WIMAX_MAX_MTU*8)
790 Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize = WIMAX_MAX_MTU*8;
791 }
792
793 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "LAT: %d, UGI: %d\n", Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency, UGIValue);
794 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "uiMaxAllowedRate: 0x%x, u32MaxSustainedTrafficRate: 0x%x ,uiMaxBucketSize: 0x%x",
795 Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate,
796 ntohl(psfLocalSet->u32MaxSustainedTrafficRate),
797 Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize);
798
799 /* copy the extended SF Parameters to Support MIBS */
800 CopyMIBSExtendedSFParameters(Adapter, psfLocalSet, uiSearchRuleIndex);
801
802 /* store header suppression enabled flag per SF */
803 Adapter->PackInfo[uiSearchRuleIndex].bHeaderSuppressionEnabled =
804 !(psfLocalSet->u8RequesttransmissionPolicy &
805 MASK_DISABLE_HEADER_SUPPRESSION);
806
807 kfree(Adapter->PackInfo[uiSearchRuleIndex].pstSFIndication);
808 Adapter->PackInfo[uiSearchRuleIndex].pstSFIndication = pstAddIndication;
809
810 /* Re Sort the SF list in PackInfo according to Traffic Priority */
811 SortPackInfo(Adapter);
812
813 /* Re Sort the Classifier Rules table and re - arrange
814 * according to Classifier Rule Priority
815 */
816 SortClassifiers(Adapter);
817 DumpPhsRules(&Adapter->stBCMPhsContext);
818 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "%s <=====", __func__);
819}
820
821/***********************************************************************
822 * Function - DumpCmControlPacket
823 *
824 * Description - This routinue Dumps the Contents of the AddIndication
825 * Structure in the Connection Management Control Packet
826 *
827 * Parameter - pvBuffer: Pointer to the buffer containing the
828 * AddIndication data.
829 *
830 * Returns - None
831 *************************************************************************/
832static VOID DumpCmControlPacket(PVOID pvBuffer)
833{
834 int uiLoopIndex;
835 int nIndex;
836 struct bcm_add_indication_alt *pstAddIndication;
837 UINT nCurClassifierCnt;
838 struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
839
840 pstAddIndication = pvBuffer;
841 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "======>");
842 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Type: 0x%X", pstAddIndication->u8Type);
843 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Direction: 0x%X", pstAddIndication->u8Direction);
844 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TID: 0x%X", ntohs(pstAddIndication->u16TID));
845 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", ntohs(pstAddIndication->u16CID));
846 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VCID: 0x%X", ntohs(pstAddIndication->u16VCID));
847 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " AuthorizedSet--->");
848 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID: 0x%X", htonl(pstAddIndication->sfAuthorizedSet.u32SFID));
849 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", htons(pstAddIndication->sfAuthorizedSet.u16CID));
850 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength: 0x%X",
851 pstAddIndication->sfAuthorizedSet.u8ServiceClassNameLength);
852
853 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassName: 0x%X ,0x%X , 0x%X, 0x%X, 0x%X, 0x%X",
854 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[0],
855 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[1],
856 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[2],
857 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[3],
858 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[4],
859 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[5]);
860
861 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService: 0x%X", pstAddIndication->sfAuthorizedSet.u8MBSService);
862 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet: 0x%X", pstAddIndication->sfAuthorizedSet.u8QosParamSet);
863 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority: 0x%X, %p",
864 pstAddIndication->sfAuthorizedSet.u8TrafficPriority, &pstAddIndication->sfAuthorizedSet.u8TrafficPriority);
865 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxSustainedTrafficRate: 0x%X 0x%p",
866 pstAddIndication->sfAuthorizedSet.u32MaxSustainedTrafficRate,
867 &pstAddIndication->sfAuthorizedSet.u32MaxSustainedTrafficRate);
868 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst: 0x%X", pstAddIndication->sfAuthorizedSet.u32MaxTrafficBurst);
869 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate : 0x%X",
870 pstAddIndication->sfAuthorizedSet.u32MinReservedTrafficRate);
871 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength: 0x%X",
872 pstAddIndication->sfAuthorizedSet.u8VendorSpecificQoSParamLength);
873 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam: 0x%X",
874 pstAddIndication->sfAuthorizedSet.u8VendorSpecificQoSParam[0]);
875 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType: 0x%X",
876 pstAddIndication->sfAuthorizedSet.u8ServiceFlowSchedulingType);
877 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter: 0x%X", pstAddIndication->sfAuthorizedSet.u32ToleratedJitter);
878 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency: 0x%X", pstAddIndication->sfAuthorizedSet.u32MaximumLatency);
879 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%X",
880 pstAddIndication->sfAuthorizedSet.u8FixedLengthVSVariableLengthSDUIndicator);
881 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize: 0x%X", pstAddIndication->sfAuthorizedSet.u8SDUSize);
882 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TargetSAID: 0x%X", pstAddIndication->sfAuthorizedSet.u16TargetSAID);
883 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQEnable: 0x%X", pstAddIndication->sfAuthorizedSet.u8ARQEnable);
884 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQWindowSize: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQWindowSize);
885 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryTxTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQRetryTxTimeOut);
886 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryRxTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQRetryRxTimeOut);
887 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockLifeTime: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQBlockLifeTime);
888 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQSyncLossTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQSyncLossTimeOut);
889 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQDeliverInOrder: 0x%X", pstAddIndication->sfAuthorizedSet.u8ARQDeliverInOrder);
890 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRxPurgeTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQRxPurgeTimeOut);
891 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockSize: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQBlockSize);
892 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8CSSpecification: 0x%X", pstAddIndication->sfAuthorizedSet.u8CSSpecification);
893 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TypeOfDataDeliveryService: 0x%X",
894 pstAddIndication->sfAuthorizedSet.u8TypeOfDataDeliveryService);
895 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16SDUInterArrivalTime: 0x%X", pstAddIndication->sfAuthorizedSet.u16SDUInterArrivalTime);
896 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TimeBase: 0x%X", pstAddIndication->sfAuthorizedSet.u16TimeBase);
897 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8PagingPreference: 0x%X", pstAddIndication->sfAuthorizedSet.u8PagingPreference);
898 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UnsolicitedPollingInterval: 0x%X",
899 pstAddIndication->sfAuthorizedSet.u16UnsolicitedPollingInterval);
900
901 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "sfAuthorizedSet.u8HARQChannelMapping %x %x %x ",
902 *(unsigned int *)pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping,
903 *(unsigned int *)&pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping[4],
904 *(USHORT *)&pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping[8]);
905 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficIndicationPreference: 0x%X",
906 pstAddIndication->sfAuthorizedSet.u8TrafficIndicationPreference);
907 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Received: 0x%X", pstAddIndication->sfAuthorizedSet.u8TotalClassifiers);
908
909 nCurClassifierCnt = pstAddIndication->sfAuthorizedSet.u8TotalClassifiers;
910 if (nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF)
911 nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF;
912
913 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "pstAddIndication->sfAuthorizedSet.bValid %d", pstAddIndication->sfAuthorizedSet.bValid);
914 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "pstAddIndication->sfAuthorizedSet.u16MacOverhead %x", pstAddIndication->sfAuthorizedSet.u16MacOverhead);
915 if (!pstAddIndication->sfAuthorizedSet.bValid)
916 pstAddIndication->sfAuthorizedSet.bValid = 1;
917 for (nIndex = 0; nIndex < nCurClassifierCnt; nIndex++) {
918 struct bcm_convergence_types *psfCSType = NULL;
919 psfCSType = &pstAddIndication->sfAuthorizedSet.cConvergenceSLTypes[nIndex];
920
921 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "psfCSType = %p", psfCSType);
922 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "CCPacketClassificationRuleSI====>");
923 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ClassifierRulePriority: 0x%X ",
924 psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority);
925 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfServiceLength: 0x%X ",
926 psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
927 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfService[3]: 0x%X ,0x%X ,0x%X ",
928 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0],
929 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1],
930 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2]);
931
932 for (uiLoopIndex = 0; uiLoopIndex < 1; uiLoopIndex++)
933 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Protocol: 0x%02X ",
934 psfCSType->cCPacketClassificationRule.u8Protocol);
935
936 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength: 0x%X ",
937 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength);
938
939 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
940 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32]: 0x%02X ",
941 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]);
942
943 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength: 0x%X ",
944 psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength);
945
946 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
947 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddress[32]: 0x%02X ",
948 psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]);
949
950 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRangeLength:0x%X ",
951 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
952 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRange[4]: 0x%02X ,0x%02X ,0x%02X ,0x%02X ",
953 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[0],
954 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[1],
955 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[2],
956 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[3]);
957
958 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRangeLength: 0x%02X ",
959 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength);
960 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRange[4]: 0x%02X ,0x%02X ,0x%02X ,0x%02X ",
961 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[0],
962 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[1],
963 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[2],
964 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[3]);
965
966 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddressLength: 0x%02X ",
967 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
968
969 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
970 DBG_LVL_ALL, "u8EthernetDestMacAddress[6]: %pM",
971 psfCSType->cCPacketClassificationRule.
972 u8EthernetDestMacAddress);
973
974 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddressLength: 0x%02X ",
975 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
976
977 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
978 DBG_LVL_ALL, "u8EthernetSourceMACAddress[6]: %pM",
979 psfCSType->cCPacketClassificationRule.
980 u8EthernetSourceMACAddress);
981
982 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthertypeLength: 0x%02X ",
983 psfCSType->cCPacketClassificationRule.u8EthertypeLength);
984 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Ethertype[3]: 0x%02X ,0x%02X ,0x%02X ",
985 psfCSType->cCPacketClassificationRule.u8Ethertype[0],
986 psfCSType->cCPacketClassificationRule.u8Ethertype[1],
987 psfCSType->cCPacketClassificationRule.u8Ethertype[2]);
988
989 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UserPriority: 0x%X ", psfCSType->cCPacketClassificationRule.u16UserPriority);
990 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VLANID: 0x%X ", psfCSType->cCPacketClassificationRule.u16VLANID);
991 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8AssociatedPHSI: 0x%02X ", psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
992 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16PacketClassificationRuleIndex: 0x%X ",
993 psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
994
995 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParamLength: 0x%X ",
996 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength);
997 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParam[1]: 0x%X ",
998 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]);
999#ifdef VERSION_D5
1000 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLableLength: 0x%X ",
1001 psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength);
1002 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1003 DBG_LVL_ALL, "u8IPv6FlowLable[6]: 0x%*ph ",
1004 6, psfCSType->cCPacketClassificationRule.
1005 u8IPv6FlowLable);
1006#endif
1007 }
1008
1009 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "bValid: 0x%02X", pstAddIndication->sfAuthorizedSet.bValid);
1010 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "AdmittedSet--->");
1011 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID: 0x%X", pstAddIndication->sfAdmittedSet.u32SFID);
1012 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", pstAddIndication->sfAdmittedSet.u16CID);
1013 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength: 0x%X",
1014 pstAddIndication->sfAdmittedSet.u8ServiceClassNameLength);
1015 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL,
1016 "u8ServiceClassName: 0x%*ph",
1017 6, pstAddIndication->sfAdmittedSet.u8ServiceClassName);
1018
1019 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService: 0x%02X", pstAddIndication->sfAdmittedSet.u8MBSService);
1020 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet: 0x%02X", pstAddIndication->sfAdmittedSet.u8QosParamSet);
1021 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority: 0x%02X", pstAddIndication->sfAdmittedSet.u8TrafficPriority);
1022 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst: 0x%X", pstAddIndication->sfAdmittedSet.u32MaxTrafficBurst);
1023 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate: 0x%X",
1024 pstAddIndication->sfAdmittedSet.u32MinReservedTrafficRate);
1025
1026 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength: 0x%02X",
1027 pstAddIndication->sfAdmittedSet.u8VendorSpecificQoSParamLength);
1028 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam: 0x%02X",
1029 pstAddIndication->sfAdmittedSet.u8VendorSpecificQoSParam[0]);
1030 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType: 0x%02X",
1031 pstAddIndication->sfAdmittedSet.u8ServiceFlowSchedulingType);
1032 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter: 0x%X", pstAddIndication->sfAdmittedSet.u32ToleratedJitter);
1033 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency: 0x%X", pstAddIndication->sfAdmittedSet.u32MaximumLatency);
1034 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%02X",
1035 pstAddIndication->sfAdmittedSet.u8FixedLengthVSVariableLengthSDUIndicator);
1036 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize: 0x%02X", pstAddIndication->sfAdmittedSet.u8SDUSize);
1037 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TargetSAID: 0x%02X", pstAddIndication->sfAdmittedSet.u16TargetSAID);
1038 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQEnable: 0x%02X", pstAddIndication->sfAdmittedSet.u8ARQEnable);
1039 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQWindowSize: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQWindowSize);
1040 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryTxTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQRetryTxTimeOut);
1041 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryRxTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQRetryRxTimeOut);
1042 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockLifeTime: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQBlockLifeTime);
1043 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQSyncLossTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQSyncLossTimeOut);
1044 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQDeliverInOrder: 0x%02X", pstAddIndication->sfAdmittedSet.u8ARQDeliverInOrder);
1045 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRxPurgeTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQRxPurgeTimeOut);
1046 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockSize: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQBlockSize);
1047 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8CSSpecification: 0x%02X", pstAddIndication->sfAdmittedSet.u8CSSpecification);
1048 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TypeOfDataDeliveryService: 0x%02X",
1049 pstAddIndication->sfAdmittedSet.u8TypeOfDataDeliveryService);
1050 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16SDUInterArrivalTime: 0x%X", pstAddIndication->sfAdmittedSet.u16SDUInterArrivalTime);
1051 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TimeBase: 0x%X", pstAddIndication->sfAdmittedSet.u16TimeBase);
1052 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8PagingPreference: 0x%X", pstAddIndication->sfAdmittedSet.u8PagingPreference);
1053 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficIndicationPreference: 0x%02X",
1054 pstAddIndication->sfAdmittedSet.u8TrafficIndicationPreference);
1055 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Received: 0x%X", pstAddIndication->sfAdmittedSet.u8TotalClassifiers);
1056
1057 nCurClassifierCnt = pstAddIndication->sfAdmittedSet.u8TotalClassifiers;
1058 if (nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF)
1059 nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF;
1060
1061 for (nIndex = 0; nIndex < nCurClassifierCnt; nIndex++) {
1062 struct bcm_convergence_types *psfCSType = NULL;
1063
1064 psfCSType = &pstAddIndication->sfAdmittedSet.cConvergenceSLTypes[nIndex];
1065 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " CCPacketClassificationRuleSI====>");
1066 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ClassifierRulePriority: 0x%02X ",
1067 psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority);
1068 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfServiceLength: 0x%02X",
1069 psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
1070 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1071 DBG_LVL_ALL, "u8IPTypeOfService[3]: 0x%*ph",
1072 3, psfCSType->cCPacketClassificationRule.
1073 u8IPTypeOfService);
1074 for (uiLoopIndex = 0; uiLoopIndex < 1; uiLoopIndex++)
1075 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Protocol: 0x%02X ", psfCSType->cCPacketClassificationRule.u8Protocol);
1076
1077 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength: 0x%02X ",
1078 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength);
1079
1080 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1081 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32]: 0x%02X ",
1082 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]);
1083
1084 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength: 0x%02X ",
1085 psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength);
1086
1087 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1088 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddress[32]: 0x%02X ",
1089 psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]);
1090
1091 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRangeLength: 0x%02X ",
1092 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
1093
1094 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1095 DBG_LVL_ALL, "u8ProtocolSourcePortRange[4]: 0x%*ph ",
1096 4, psfCSType->cCPacketClassificationRule.
1097 u8ProtocolSourcePortRange);
1098
1099 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRangeLength: 0x%02X ",
1100 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength);
1101
1102 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1103 DBG_LVL_ALL, "u8ProtocolDestPortRange[4]: 0x%*ph ",
1104 4, psfCSType->cCPacketClassificationRule.
1105 u8ProtocolDestPortRange);
1106
1107 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddressLength: 0x%02X ",
1108 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1109
1110 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1111 DBG_LVL_ALL, "u8EthernetDestMacAddress[6]: %pM",
1112 psfCSType->cCPacketClassificationRule.
1113 u8EthernetDestMacAddress);
1114
1115 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddressLength: 0x%02X ",
1116 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1117
1118 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1119 DBG_LVL_ALL, "u8EthernetSourceMACAddress[6]: %pM",
1120 psfCSType->cCPacketClassificationRule.
1121 u8EthernetSourceMACAddress);
1122
1123 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthertypeLength: 0x%02X ", psfCSType->cCPacketClassificationRule.u8EthertypeLength);
1124 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1125 DBG_LVL_ALL, "u8Ethertype[3]: 0x%*ph",
1126 3, psfCSType->cCPacketClassificationRule.
1127 u8Ethertype);
1128
1129 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UserPriority: 0x%X ", psfCSType->cCPacketClassificationRule.u16UserPriority);
1130 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VLANID: 0x%X ", psfCSType->cCPacketClassificationRule.u16VLANID);
1131 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8AssociatedPHSI: 0x%02X ", psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
1132 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16PacketClassificationRuleIndex: 0x%X ",
1133 psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
1134 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParamLength: 0x%02X",
1135 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength);
1136 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParam[1]: 0x%02X ",
1137 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]);
1138#ifdef VERSION_D5
1139 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLableLength: 0x%X ",
1140 psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength);
1141 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1142 DBG_LVL_ALL, "u8IPv6FlowLable[6]: 0x%*ph ",
1143 6, psfCSType->cCPacketClassificationRule.
1144 u8IPv6FlowLable);
1145#endif
1146 }
1147
1148 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "bValid: 0x%X", pstAddIndication->sfAdmittedSet.bValid);
1149 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " ActiveSet--->");
1150 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID: 0x%X", pstAddIndication->sfActiveSet.u32SFID);
1151 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", pstAddIndication->sfActiveSet.u16CID);
1152 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength: 0x%X", pstAddIndication->sfActiveSet.u8ServiceClassNameLength);
1153 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL,
1154 "u8ServiceClassName: 0x%*ph",
1155 6, pstAddIndication->sfActiveSet.u8ServiceClassName);
1156
1157 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService: 0x%02X", pstAddIndication->sfActiveSet.u8MBSService);
1158 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet: 0x%02X", pstAddIndication->sfActiveSet.u8QosParamSet);
1159 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority: 0x%02X", pstAddIndication->sfActiveSet.u8TrafficPriority);
1160 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst: 0x%X", pstAddIndication->sfActiveSet.u32MaxTrafficBurst);
1161 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate: 0x%X",
1162 pstAddIndication->sfActiveSet.u32MinReservedTrafficRate);
1163 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength: 0x%02X",
1164 pstAddIndication->sfActiveSet.u8VendorSpecificQoSParamLength);
1165 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam: 0x%02X",
1166 pstAddIndication->sfActiveSet.u8VendorSpecificQoSParam[0]);
1167 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType: 0x%02X",
1168 pstAddIndication->sfActiveSet.u8ServiceFlowSchedulingType);
1169 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter: 0x%X", pstAddIndication->sfActiveSet.u32ToleratedJitter);
1170 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency: 0x%X", pstAddIndication->sfActiveSet.u32MaximumLatency);
1171 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%02X",
1172 pstAddIndication->sfActiveSet.u8FixedLengthVSVariableLengthSDUIndicator);
1173 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize: 0x%X", pstAddIndication->sfActiveSet.u8SDUSize);
1174 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16TargetSAID: 0x%X", pstAddIndication->sfActiveSet.u16TargetSAID);
1175 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ARQEnable: 0x%X", pstAddIndication->sfActiveSet.u8ARQEnable);
1176 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQWindowSize: 0x%X", pstAddIndication->sfActiveSet.u16ARQWindowSize);
1177 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRetryTxTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQRetryTxTimeOut);
1178 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRetryRxTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQRetryRxTimeOut);
1179 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQBlockLifeTime: 0x%X", pstAddIndication->sfActiveSet.u16ARQBlockLifeTime);
1180 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQSyncLossTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQSyncLossTimeOut);
1181 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ARQDeliverInOrder: 0x%X", pstAddIndication->sfActiveSet.u8ARQDeliverInOrder);
1182 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRxPurgeTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQRxPurgeTimeOut);
1183 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQBlockSize: 0x%X", pstAddIndication->sfActiveSet.u16ARQBlockSize);
1184 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8CSSpecification: 0x%X", pstAddIndication->sfActiveSet.u8CSSpecification);
1185 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8TypeOfDataDeliveryService: 0x%X",
1186 pstAddIndication->sfActiveSet.u8TypeOfDataDeliveryService);
1187 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16SDUInterArrivalTime: 0x%X", pstAddIndication->sfActiveSet.u16SDUInterArrivalTime);
1188 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16TimeBase: 0x%X", pstAddIndication->sfActiveSet.u16TimeBase);
1189 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8PagingPreference: 0x%X", pstAddIndication->sfActiveSet.u8PagingPreference);
1190 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8TrafficIndicationPreference: 0x%X",
1191 pstAddIndication->sfActiveSet.u8TrafficIndicationPreference);
1192 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Received: 0x%X", pstAddIndication->sfActiveSet.u8TotalClassifiers);
1193
1194 nCurClassifierCnt = pstAddIndication->sfActiveSet.u8TotalClassifiers;
1195 if (nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF)
1196 nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF;
1197
1198 for (nIndex = 0; nIndex < nCurClassifierCnt; nIndex++) {
1199 struct bcm_convergence_types *psfCSType = NULL;
1200
1201 psfCSType = &pstAddIndication->sfActiveSet.cConvergenceSLTypes[nIndex];
1202 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " CCPacketClassificationRuleSI====>");
1203 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ClassifierRulePriority: 0x%X ",
1204 psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority);
1205 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPTypeOfServiceLength: 0x%X ",
1206 psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
1207 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPTypeOfService[3]: 0x%X ,0x%X ,0x%X ",
1208 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0],
1209 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1],
1210 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2]);
1211
1212 for (uiLoopIndex = 0; uiLoopIndex < 1; uiLoopIndex++)
1213 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8Protocol: 0x%X ", psfCSType->cCPacketClassificationRule.u8Protocol);
1214
1215 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength: 0x%X ",
1216 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength);
1217
1218 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1219 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32]: 0x%X ",
1220 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]);
1221
1222 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength: 0x%02X ",
1223 psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength);
1224
1225 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1226 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPDestinationAddress[32]:0x%X ",
1227 psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]);
1228
1229 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolSourcePortRangeLength: 0x%X ",
1230 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
1231
1232 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolSourcePortRange[4]: 0x%X ,0x%X ,0x%X ,0x%X ",
1233 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[0],
1234 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[1],
1235 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[2],
1236 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[3]);
1237
1238 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolDestPortRangeLength: 0x%X ",
1239 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength);
1240 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolDestPortRange[4]: 0x%X ,0x%X ,0x%X ,0x%X ",
1241 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[0],
1242 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[1],
1243 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[2],
1244 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[3]);
1245
1246 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthernetDestMacAddressLength: 0x%X ",
1247 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1248 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthernetDestMacAddress[6]: 0x%X ,0x%X ,0x%X ,0x%X ,0x%X ,0x%X",
1249 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[0],
1250 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[1],
1251 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[2],
1252 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[3],
1253 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[4],
1254 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[5]);
1255
1256 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthernetSourceMACAddressLength: 0x%X ",
1257 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1258 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddress[6]: 0x%X ,0x%X ,0x%X ,0x%X ,0x%X ,0x%X",
1259 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[0],
1260 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[1],
1261 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[2],
1262 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[3],
1263 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[4],
1264 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[5]);
1265
1266 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthertypeLength: 0x%X ",
1267 psfCSType->cCPacketClassificationRule.u8EthertypeLength);
1268 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8Ethertype[3]: 0x%X ,0x%X ,0x%X ",
1269 psfCSType->cCPacketClassificationRule.u8Ethertype[0],
1270 psfCSType->cCPacketClassificationRule.u8Ethertype[1],
1271 psfCSType->cCPacketClassificationRule.u8Ethertype[2]);
1272 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16UserPriority: 0x%X ",
1273 psfCSType->cCPacketClassificationRule.u16UserPriority);
1274 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16VLANID: 0x%X ", psfCSType->cCPacketClassificationRule.u16VLANID);
1275 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8AssociatedPHSI: 0x%X ", psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
1276 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16PacketClassificationRuleIndex:0x%X ",
1277 psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
1278
1279 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8VendorSpecificClassifierParamLength:0x%X ",
1280 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength);
1281 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8VendorSpecificClassifierParam[1]:0x%X ",
1282 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]);
1283#ifdef VERSION_D5
1284 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPv6FlowLableLength: 0x%X ",
1285 psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength);
1286 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPv6FlowLable[6]: 0x%X ,0x%X ,0x%X ,0x%X ,0x%X ,0x%X ",
1287 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[0],
1288 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[1],
1289 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[2],
1290 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[3],
1291 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[4],
1292 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[5]);
1293#endif
1294 }
1295
1296 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " bValid: 0x%X", pstAddIndication->sfActiveSet.bValid);
1297}
1298
1299static inline ULONG RestoreSFParam(struct bcm_mini_adapter *Adapter, ULONG ulAddrSFParamSet, PUCHAR pucDestBuffer)
1300{
1301 UINT nBytesToRead = sizeof(struct bcm_connect_mgr_params);
1302
1303 if (ulAddrSFParamSet == 0 || NULL == pucDestBuffer) {
1304 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Got Param address as 0!!");
1305 return 0;
1306 }
1307 ulAddrSFParamSet = ntohl(ulAddrSFParamSet);
1308
1309 /* Read out the SF Param Set At the indicated Location */
1310 if (rdm(Adapter, ulAddrSFParamSet, (PUCHAR)pucDestBuffer, nBytesToRead) < 0)
1311 return STATUS_FAILURE;
1312
1313 return 1;
1314}
1315
1316static ULONG StoreSFParam(struct bcm_mini_adapter *Adapter, PUCHAR pucSrcBuffer, ULONG ulAddrSFParamSet)
1317{
1318 UINT nBytesToWrite = sizeof(struct bcm_connect_mgr_params);
1319 int ret = 0;
1320
1321 if (ulAddrSFParamSet == 0 || NULL == pucSrcBuffer)
1322 return 0;
1323
1324 ret = wrm(Adapter, ulAddrSFParamSet, (u8 *)pucSrcBuffer, nBytesToWrite);
1325 if (ret < 0) {
1326 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "%s:%d WRM failed", __func__, __LINE__);
1327 return ret;
1328 }
1329 return 1;
1330}
1331
1332ULONG StoreCmControlResponseMessage(struct bcm_mini_adapter *Adapter, PVOID pvBuffer, UINT *puBufferLength)
1333{
1334 struct bcm_add_indication_alt *pstAddIndicationAlt = NULL;
1335 struct bcm_add_indication *pstAddIndication = NULL;
1336 struct bcm_del_request *pstDeletionRequest;
1337 UINT uiSearchRuleIndex;
1338 ULONG ulSFID;
1339
1340 pstAddIndicationAlt = pvBuffer;
1341
1342 /*
1343 * In case of DSD Req By MS, we should immediately delete this SF so that
1344 * we can stop the further classifying the pkt for this SF.
1345 */
1346 if (pstAddIndicationAlt->u8Type == DSD_REQ) {
1347 pstDeletionRequest = pvBuffer;
1348
1349 ulSFID = ntohl(pstDeletionRequest->u32SFID);
1350 uiSearchRuleIndex = SearchSfid(Adapter, ulSFID);
1351
1352 if (uiSearchRuleIndex < NO_OF_QUEUES) {
1353 deleteSFBySfid(Adapter, uiSearchRuleIndex);
1354 Adapter->u32TotalDSD++;
1355 }
1356 return 1;
1357 }
1358
1359 if ((pstAddIndicationAlt->u8Type == DSD_RSP) ||
1360 (pstAddIndicationAlt->u8Type == DSD_ACK)) {
1361 /* No Special handling send the message as it is */
1362 return 1;
1363 }
1364 /* For DSA_REQ, only up to "psfAuthorizedSet" parameter should be accessed by driver! */
1365
1366 pstAddIndication = kmalloc(sizeof(struct bcm_add_indication), GFP_KERNEL);
1367 if (pstAddIndication == NULL)
1368 return 0;
1369
1370 /* AUTHORIZED SET */
1371 pstAddIndication->psfAuthorizedSet = (struct bcm_connect_mgr_params *)
1372 GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID);
1373 if (!pstAddIndication->psfAuthorizedSet) {
1374 kfree(pstAddIndication);
1375 return 0;
1376 }
1377
1378 if (StoreSFParam(Adapter, (PUCHAR)&pstAddIndicationAlt->sfAuthorizedSet,
1379 (ULONG)pstAddIndication->psfAuthorizedSet) != 1) {
1380 kfree(pstAddIndication);
1381 return 0;
1382 }
1383
1384 /* this can't possibly be right */
1385 pstAddIndication->psfAuthorizedSet = (struct bcm_connect_mgr_params *)ntohl((ULONG)pstAddIndication->psfAuthorizedSet);
1386
1387 if (pstAddIndicationAlt->u8Type == DSA_REQ) {
1388 struct bcm_add_request AddRequest;
1389
1390 AddRequest.u8Type = pstAddIndicationAlt->u8Type;
1391 AddRequest.eConnectionDir = pstAddIndicationAlt->u8Direction;
1392 AddRequest.u16TID = pstAddIndicationAlt->u16TID;
1393 AddRequest.u16CID = pstAddIndicationAlt->u16CID;
1394 AddRequest.u16VCID = pstAddIndicationAlt->u16VCID;
1395 AddRequest.psfParameterSet = pstAddIndication->psfAuthorizedSet;
1396 (*puBufferLength) = sizeof(struct bcm_add_request);
1397 memcpy(pvBuffer, &AddRequest, sizeof(struct bcm_add_request));
1398 kfree(pstAddIndication);
1399 return 1;
1400 }
1401
1402 /* Since it's not DSA_REQ, we can access all field in pstAddIndicationAlt */
1403 /* We need to extract the structure from the buffer and pack it differently */
1404
1405 pstAddIndication->u8Type = pstAddIndicationAlt->u8Type;
1406 pstAddIndication->eConnectionDir = pstAddIndicationAlt->u8Direction;
1407 pstAddIndication->u16TID = pstAddIndicationAlt->u16TID;
1408 pstAddIndication->u16CID = pstAddIndicationAlt->u16CID;
1409 pstAddIndication->u16VCID = pstAddIndicationAlt->u16VCID;
1410 pstAddIndication->u8CC = pstAddIndicationAlt->u8CC;
1411
1412 /* ADMITTED SET */
1413 pstAddIndication->psfAdmittedSet = (struct bcm_connect_mgr_params *)
1414 GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID);
1415 if (!pstAddIndication->psfAdmittedSet) {
1416 kfree(pstAddIndication);
1417 return 0;
1418 }
1419 if (StoreSFParam(Adapter, (PUCHAR)&pstAddIndicationAlt->sfAdmittedSet, (ULONG)pstAddIndication->psfAdmittedSet) != 1) {
1420 kfree(pstAddIndication);
1421 return 0;
1422 }
1423
1424 pstAddIndication->psfAdmittedSet = (struct bcm_connect_mgr_params *)ntohl((ULONG)pstAddIndication->psfAdmittedSet);
1425
1426 /* ACTIVE SET */
1427 pstAddIndication->psfActiveSet = (struct bcm_connect_mgr_params *)
1428 GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID);
1429 if (!pstAddIndication->psfActiveSet) {
1430 kfree(pstAddIndication);
1431 return 0;
1432 }
1433 if (StoreSFParam(Adapter, (PUCHAR)&pstAddIndicationAlt->sfActiveSet, (ULONG)pstAddIndication->psfActiveSet) != 1) {
1434 kfree(pstAddIndication);
1435 return 0;
1436 }
1437
1438 pstAddIndication->psfActiveSet = (struct bcm_connect_mgr_params *)ntohl((ULONG)pstAddIndication->psfActiveSet);
1439
1440 (*puBufferLength) = sizeof(struct bcm_add_indication);
1441 *(struct bcm_add_indication *)pvBuffer = *pstAddIndication;
1442 kfree(pstAddIndication);
1443 return 1;
1444}
1445
1446static inline struct bcm_add_indication_alt
1447*RestoreCmControlResponseMessage(register struct bcm_mini_adapter *Adapter, register PVOID pvBuffer)
1448{
1449 ULONG ulStatus = 0;
1450 struct bcm_add_indication *pstAddIndication = NULL;
1451 struct bcm_add_indication_alt *pstAddIndicationDest = NULL;
1452
1453 pstAddIndication = pvBuffer;
1454 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "=====>");
1455 if ((pstAddIndication->u8Type == DSD_REQ) ||
1456 (pstAddIndication->u8Type == DSD_RSP) ||
1457 (pstAddIndication->u8Type == DSD_ACK))
1458 return pvBuffer;
1459
1460 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Inside RestoreCmControlResponseMessage ");
1461 /*
1462 * Need to Allocate memory to contain the SUPER Large structures
1463 * Our driver can't create these structures on Stack :(
1464 */
1465 pstAddIndicationDest = kmalloc(sizeof(struct bcm_add_indication_alt), GFP_KERNEL);
1466
1467 if (pstAddIndicationDest) {
1468 memset(pstAddIndicationDest, 0, sizeof(struct bcm_add_indication_alt));
1469 } else {
1470 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Failed to allocate memory for SF Add Indication Structure ");
1471 return NULL;
1472 }
1473 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8Type : 0x%X", pstAddIndication->u8Type);
1474 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8Direction : 0x%X", pstAddIndication->eConnectionDir);
1475 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8TID : 0x%X", ntohs(pstAddIndication->u16TID));
1476 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8CID : 0x%X", ntohs(pstAddIndication->u16CID));
1477 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u16VCID : 0x%X", ntohs(pstAddIndication->u16VCID));
1478 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-autorized set loc : %p", pstAddIndication->psfAuthorizedSet);
1479 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-admitted set loc : %p", pstAddIndication->psfAdmittedSet);
1480 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-Active set loc : %p", pstAddIndication->psfActiveSet);
1481
1482 pstAddIndicationDest->u8Type = pstAddIndication->u8Type;
1483 pstAddIndicationDest->u8Direction = pstAddIndication->eConnectionDir;
1484 pstAddIndicationDest->u16TID = pstAddIndication->u16TID;
1485 pstAddIndicationDest->u16CID = pstAddIndication->u16CID;
1486 pstAddIndicationDest->u16VCID = pstAddIndication->u16VCID;
1487 pstAddIndicationDest->u8CC = pstAddIndication->u8CC;
1488
1489 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Restoring Active Set ");
1490 ulStatus = RestoreSFParam(Adapter, (ULONG)pstAddIndication->psfActiveSet, (PUCHAR)&pstAddIndicationDest->sfActiveSet);
1491 if (ulStatus != 1)
1492 goto failed_restore_sf_param;
1493
1494 if (pstAddIndicationDest->sfActiveSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF)
1495 pstAddIndicationDest->sfActiveSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF;
1496
1497 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Restoring Admitted Set ");
1498 ulStatus = RestoreSFParam(Adapter, (ULONG)pstAddIndication->psfAdmittedSet, (PUCHAR)&pstAddIndicationDest->sfAdmittedSet);
1499 if (ulStatus != 1)
1500 goto failed_restore_sf_param;
1501
1502 if (pstAddIndicationDest->sfAdmittedSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF)
1503 pstAddIndicationDest->sfAdmittedSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF;
1504
1505 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Restoring Authorized Set ");
1506 ulStatus = RestoreSFParam(Adapter, (ULONG)pstAddIndication->psfAuthorizedSet, (PUCHAR)&pstAddIndicationDest->sfAuthorizedSet);
1507 if (ulStatus != 1)
1508 goto failed_restore_sf_param;
1509
1510 if (pstAddIndicationDest->sfAuthorizedSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF)
1511 pstAddIndicationDest->sfAuthorizedSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF;
1512
1513 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Dumping the whole raw packet");
1514 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "============================================================");
1515 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " pstAddIndicationDest->sfActiveSet size %zx %p", sizeof(*pstAddIndicationDest), pstAddIndicationDest);
1516 /* BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, (unsigned char *)pstAddIndicationDest, sizeof(*pstAddIndicationDest)); */
1517 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "============================================================");
1518 return pstAddIndicationDest;
1519failed_restore_sf_param:
1520 kfree(pstAddIndicationDest);
1521 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "<=====");
1522 return NULL;
1523}
1524
1525ULONG SetUpTargetDsxBuffers(struct bcm_mini_adapter *Adapter)
1526{
1527 ULONG ulTargetDsxBuffersBase = 0;
1528 ULONG ulCntTargetBuffers;
1529 ULONG i;
1530 int Status;
1531
1532 if (!Adapter) {
1533 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Adapter was NULL!!!");
1534 return 0;
1535 }
1536
1537 if (Adapter->astTargetDsxBuffer[0].ulTargetDsxBuffer)
1538 return 1;
1539
1540 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Size of Each DSX Buffer(Also size of connection manager parameters): %zx ", sizeof(struct bcm_connect_mgr_params));
1541 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Reading DSX buffer From Target location %x ", DSX_MESSAGE_EXCHANGE_BUFFER);
1542
1543 Status = rdmalt(Adapter, DSX_MESSAGE_EXCHANGE_BUFFER, (PUINT)&ulTargetDsxBuffersBase, sizeof(UINT));
1544 if (Status < 0) {
1545 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "RDM failed!!");
1546 return 0;
1547 }
1548
1549 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Base Address Of DSX Target Buffer : 0x%lx", ulTargetDsxBuffersBase);
1550 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Tgt Buffer is Now %lx :", ulTargetDsxBuffersBase);
1551 ulCntTargetBuffers = DSX_MESSAGE_EXCHANGE_BUFFER_SIZE / sizeof(struct bcm_connect_mgr_params);
1552
1553 Adapter->ulTotalTargetBuffersAvailable =
1554 ulCntTargetBuffers > MAX_TARGET_DSX_BUFFERS ?
1555 MAX_TARGET_DSX_BUFFERS : ulCntTargetBuffers;
1556
1557 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " Total Target DSX Buffer setup %lx ", Adapter->ulTotalTargetBuffersAvailable);
1558
1559 for (i = 0; i < Adapter->ulTotalTargetBuffersAvailable; i++) {
1560 Adapter->astTargetDsxBuffer[i].ulTargetDsxBuffer = ulTargetDsxBuffersBase;
1561 Adapter->astTargetDsxBuffer[i].valid = 1;
1562 Adapter->astTargetDsxBuffer[i].tid = 0;
1563 ulTargetDsxBuffersBase += sizeof(struct bcm_connect_mgr_params);
1564 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " Target DSX Buffer %lx setup at 0x%lx",
1565 i, Adapter->astTargetDsxBuffer[i].ulTargetDsxBuffer);
1566 }
1567 Adapter->ulCurrentTargetBuffer = 0;
1568 Adapter->ulFreeTargetBufferCnt = Adapter->ulTotalTargetBuffersAvailable;
1569 return 1;
1570}
1571
1572static ULONG GetNextTargetBufferLocation(struct bcm_mini_adapter *Adapter, B_UINT16 tid)
1573{
1574 ULONG dsx_buf;
1575 ULONG idx, max_try;
1576
1577 if ((Adapter->ulTotalTargetBuffersAvailable == 0) || (Adapter->ulFreeTargetBufferCnt == 0)) {
1578 ClearTargetDSXBuffer(Adapter, tid, false);
1579 return 0;
1580 }
1581
1582 idx = Adapter->ulCurrentTargetBuffer;
1583 max_try = Adapter->ulTotalTargetBuffersAvailable;
1584 while ((max_try) && (Adapter->astTargetDsxBuffer[idx].valid != 1)) {
1585 idx = (idx+1) % Adapter->ulTotalTargetBuffersAvailable;
1586 max_try--;
1587 }
1588
1589 if (max_try == 0) {
1590 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "\n GetNextTargetBufferLocation : Error No Free Target DSX Buffers FreeCnt : %lx ", Adapter->ulFreeTargetBufferCnt);
1591 ClearTargetDSXBuffer(Adapter, tid, false);
1592 return 0;
1593 }
1594
1595 dsx_buf = Adapter->astTargetDsxBuffer[idx].ulTargetDsxBuffer;
1596 Adapter->astTargetDsxBuffer[idx].valid = 0;
1597 Adapter->astTargetDsxBuffer[idx].tid = tid;
1598 Adapter->ulFreeTargetBufferCnt--;
1599 idx = (idx+1)%Adapter->ulTotalTargetBuffersAvailable;
1600 Adapter->ulCurrentTargetBuffer = idx;
1601 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "GetNextTargetBufferLocation :Returning address %lx tid %d\n", dsx_buf, tid);
1602
1603 return dsx_buf;
1604}
1605
1606int AllocAdapterDsxBuffer(struct bcm_mini_adapter *Adapter)
1607{
1608 /*
1609 * Need to Allocate memory to contain the SUPER Large structures
1610 * Our driver can't create these structures on Stack
1611 */
1612 Adapter->caDsxReqResp = kmalloc(sizeof(struct bcm_add_indication_alt)+LEADER_SIZE, GFP_KERNEL);
1613 if (!Adapter->caDsxReqResp)
1614 return -ENOMEM;
1615
1616 return 0;
1617}
1618
1619int FreeAdapterDsxBuffer(struct bcm_mini_adapter *Adapter)
1620{
1621 kfree(Adapter->caDsxReqResp);
1622 return 0;
1623}
1624
1625/*
1626 * @ingroup ctrl_pkt_functions
1627 * This routinue would process the Control responses
1628 * for the Connection Management.
1629 * @return - Queue index for the free SFID else returns Invalid Index.
1630 */
1631bool CmControlResponseMessage(struct bcm_mini_adapter *Adapter, /* <Pointer to the Adapter structure */
1632 PVOID pvBuffer /* Starting Address of the Buffer, that contains the AddIndication Data */)
1633{
1634 struct bcm_connect_mgr_params *psfLocalSet = NULL;
1635 struct bcm_add_indication_alt *pstAddIndication = NULL;
1636 struct bcm_change_indication *pstChangeIndication = NULL;
1637 struct bcm_leader *pLeader = NULL;
1638 INT uiSearchRuleIndex = 0;
1639 ULONG ulSFID;
1640
1641 /*
1642 * Otherwise the message contains a target address from where we need to
1643 * read out the rest of the service flow param structure
1644 */
1645 pstAddIndication = RestoreCmControlResponseMessage(Adapter, pvBuffer);
1646 if (pstAddIndication == NULL) {
1647 ClearTargetDSXBuffer(Adapter, ((struct bcm_add_indication *)pvBuffer)->u16TID, false);
1648 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Error in restoring Service Flow param structure from DSx message");
1649 return false;
1650 }
1651
1652 DumpCmControlPacket(pstAddIndication);
1653 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "====>");
1654 pLeader = (struct bcm_leader *)Adapter->caDsxReqResp;
1655
1656 pLeader->Status = CM_CONTROL_NEWDSX_MULTICLASSIFIER_REQ;
1657 pLeader->Vcid = 0;
1658
1659 ClearTargetDSXBuffer(Adapter, pstAddIndication->u16TID, false);
1660 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "### TID RECEIVED %d\n", pstAddIndication->u16TID);
1661 switch (pstAddIndication->u8Type) {
1662 case DSA_REQ:
1663 pLeader->PLength = sizeof(struct bcm_add_indication_alt);
1664 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Sending DSA Response....\n");
1665 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSA RESPONSE TO MAC %d", pLeader->PLength);
1666 *((struct bcm_add_indication_alt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))
1667 = *pstAddIndication;
1668 ((struct bcm_add_indication_alt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSA_RSP;
1669
1670 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " VCID = %x", ntohs(pstAddIndication->u16VCID));
1671 CopyBufferToControlPacket(Adapter, (PVOID)Adapter->caDsxReqResp);
1672 kfree(pstAddIndication);
1673 break;
1674 case DSA_RSP:
1675 pLeader->PLength = sizeof(struct bcm_add_indication_alt);
1676 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSA ACK TO MAC %d",
1677 pLeader->PLength);
1678 *((struct bcm_add_indication_alt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))
1679 = *pstAddIndication;
1680 ((struct bcm_add_indication_alt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSA_ACK;
1681 /* FALLTHROUGH */
1682 case DSA_ACK:
1683 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "VCID:0x%X",
1684 ntohs(pstAddIndication->u16VCID));
1685 uiSearchRuleIndex = SearchFreeSfid(Adapter);
1686 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "uiSearchRuleIndex:0x%X ",
1687 uiSearchRuleIndex);
1688 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Direction:0x%X ",
1689 pstAddIndication->u8Direction);
1690 if (uiSearchRuleIndex < NO_OF_QUEUES) {
1691 Adapter->PackInfo[uiSearchRuleIndex].ucDirection =
1692 pstAddIndication->u8Direction;
1693 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "bValid:0x%X ",
1694 pstAddIndication->sfActiveSet.bValid);
1695 if (pstAddIndication->sfActiveSet.bValid == TRUE)
1696 Adapter->PackInfo[uiSearchRuleIndex].bActiveSet = TRUE;
1697
1698 if (pstAddIndication->sfAuthorizedSet.bValid == TRUE)
1699 Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet = TRUE;
1700
1701 if (pstAddIndication->sfAdmittedSet.bValid == TRUE)
1702 Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet = TRUE;
1703
1704 if (pstAddIndication->sfActiveSet.bValid == false) {
1705 Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1706 Adapter->PackInfo[uiSearchRuleIndex].bActivateRequestSent = false;
1707 if (pstAddIndication->sfAdmittedSet.bValid)
1708 psfLocalSet = &pstAddIndication->sfAdmittedSet;
1709 else if (pstAddIndication->sfAuthorizedSet.bValid)
1710 psfLocalSet = &pstAddIndication->sfAuthorizedSet;
1711 } else {
1712 psfLocalSet = &pstAddIndication->sfActiveSet;
1713 Adapter->PackInfo[uiSearchRuleIndex].bActive = TRUE;
1714 }
1715
1716 if (!psfLocalSet) {
1717 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "No set is valid\n");
1718 Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1719 Adapter->PackInfo[uiSearchRuleIndex].bValid = false;
1720 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = 0;
1721 kfree(pstAddIndication);
1722 } else if (psfLocalSet->bValid && (pstAddIndication->u8CC == 0)) {
1723 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSA ACK");
1724 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = ntohs(pstAddIndication->u16VCID);
1725 Adapter->PackInfo[uiSearchRuleIndex].usCID = ntohs(pstAddIndication->u16CID);
1726
1727 if (UPLINK_DIR == pstAddIndication->u8Direction)
1728 atomic_set(&Adapter->PackInfo[uiSearchRuleIndex].uiPerSFTxResourceCount, DEFAULT_PERSFCOUNT);
1729
1730 CopyToAdapter(Adapter, psfLocalSet, uiSearchRuleIndex, DSA_ACK, pstAddIndication);
1731 /* don't free pstAddIndication */
1732
1733 /* Inside CopyToAdapter, Sorting of all the SFs take place.
1734 * Hence any access to the newly added SF through uiSearchRuleIndex is invalid.
1735 * SHOULD BE STRICTLY AVOIDED.
1736 */
1737 /* *(PULONG)(((PUCHAR)pvBuffer)+1)=psfLocalSet->u32SFID; */
1738 memcpy((((PUCHAR)pvBuffer)+1), &psfLocalSet->u32SFID, 4);
1739
1740 if (pstAddIndication->sfActiveSet.bValid == TRUE) {
1741 if (UPLINK_DIR == pstAddIndication->u8Direction) {
1742 if (!Adapter->LinkUpStatus) {
1743 netif_carrier_on(Adapter->dev);
1744 netif_start_queue(Adapter->dev);
1745 Adapter->LinkUpStatus = 1;
1746 if (netif_msg_link(Adapter))
1747 pr_info(PFX "%s: link up\n", Adapter->dev->name);
1748 atomic_set(&Adapter->TxPktAvail, 1);
1749 wake_up(&Adapter->tx_packet_wait_queue);
1750 Adapter->liTimeSinceLastNetEntry = get_seconds();
1751 }
1752 }
1753 }
1754 } else {
1755 Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1756 Adapter->PackInfo[uiSearchRuleIndex].bValid = false;
1757 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = 0;
1758 kfree(pstAddIndication);
1759 }
1760 } else {
1761 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "DSA ACK did not get valid SFID");
1762 kfree(pstAddIndication);
1763 return false;
1764 }
1765 break;
1766 case DSC_REQ:
1767 pLeader->PLength = sizeof(struct bcm_change_indication);
1768 pstChangeIndication = (struct bcm_change_indication *)pstAddIndication;
1769 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSC RESPONSE TO MAC %d", pLeader->PLength);
1770
1771 *((struct bcm_change_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *pstChangeIndication;
1772 ((struct bcm_change_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSC_RSP;
1773
1774 CopyBufferToControlPacket(Adapter, (PVOID)Adapter->caDsxReqResp);
1775 kfree(pstAddIndication);
1776 break;
1777 case DSC_RSP:
1778 pLeader->PLength = sizeof(struct bcm_change_indication);
1779 pstChangeIndication = (struct bcm_change_indication *)pstAddIndication;
1780 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSC ACK TO MAC %d", pLeader->PLength);
1781 *((struct bcm_change_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *pstChangeIndication;
1782 ((struct bcm_change_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSC_ACK;
1783 /* FALLTHROUGH */
1784 case DSC_ACK:
1785 pstChangeIndication = (struct bcm_change_indication *)pstAddIndication;
1786 uiSearchRuleIndex = SearchSfid(Adapter, ntohl(pstChangeIndication->sfActiveSet.u32SFID));
1787 if (uiSearchRuleIndex > NO_OF_QUEUES-1)
1788 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "SF doesn't exist for which DSC_ACK is received");
1789
1790 if (uiSearchRuleIndex < NO_OF_QUEUES) {
1791 Adapter->PackInfo[uiSearchRuleIndex].ucDirection = pstChangeIndication->u8Direction;
1792 if (pstChangeIndication->sfActiveSet.bValid == TRUE)
1793 Adapter->PackInfo[uiSearchRuleIndex].bActiveSet = TRUE;
1794
1795 if (pstChangeIndication->sfAuthorizedSet.bValid == TRUE)
1796 Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet = TRUE;
1797
1798 if (pstChangeIndication->sfAdmittedSet.bValid == TRUE)
1799 Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet = TRUE;
1800
1801 if (pstChangeIndication->sfActiveSet.bValid == false) {
1802 Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1803 Adapter->PackInfo[uiSearchRuleIndex].bActivateRequestSent = false;
1804
1805 if (pstChangeIndication->sfAdmittedSet.bValid)
1806 psfLocalSet = &pstChangeIndication->sfAdmittedSet;
1807 else if (pstChangeIndication->sfAuthorizedSet.bValid)
1808 psfLocalSet = &pstChangeIndication->sfAuthorizedSet;
1809 } else {
1810 psfLocalSet = &pstChangeIndication->sfActiveSet;
1811 Adapter->PackInfo[uiSearchRuleIndex].bActive = TRUE;
1812 }
1813
1814 if (!psfLocalSet) {
1815 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "No set is valid\n");
1816 Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1817 Adapter->PackInfo[uiSearchRuleIndex].bValid = false;
1818 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = 0;
1819 kfree(pstAddIndication);
1820 } else if (psfLocalSet->bValid && (pstChangeIndication->u8CC == 0)) {
1821 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = ntohs(pstChangeIndication->u16VCID);
1822 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "CC field is %d bvalid = %d\n",
1823 pstChangeIndication->u8CC, psfLocalSet->bValid);
1824 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "VCID= %d\n", ntohs(pstChangeIndication->u16VCID));
1825 Adapter->PackInfo[uiSearchRuleIndex].usCID = ntohs(pstChangeIndication->u16CID);
1826 CopyToAdapter(Adapter, psfLocalSet, uiSearchRuleIndex, DSC_ACK, pstAddIndication);
1827
1828 *(PULONG)(((PUCHAR)pvBuffer)+1) = psfLocalSet->u32SFID;
1829 } else if (pstChangeIndication->u8CC == 6) {
1830 deleteSFBySfid(Adapter, uiSearchRuleIndex);
1831 kfree(pstAddIndication);
1832 }
1833 } else {
1834 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "DSC ACK did not get valid SFID");
1835 kfree(pstAddIndication);
1836 return false;
1837 }
1838 break;
1839 case DSD_REQ:
1840 pLeader->PLength = sizeof(struct bcm_del_indication);
1841 *((struct bcm_del_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *((struct bcm_del_indication *)pstAddIndication);
1842
1843 ulSFID = ntohl(((struct bcm_del_indication *)pstAddIndication)->u32SFID);
1844 uiSearchRuleIndex = SearchSfid(Adapter, ulSFID);
1845 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSD - Removing connection %x", uiSearchRuleIndex);
1846
1847 if (uiSearchRuleIndex < NO_OF_QUEUES) {
1848 /* Delete All Classifiers Associated with this SFID */
1849 deleteSFBySfid(Adapter, uiSearchRuleIndex);
1850 Adapter->u32TotalDSD++;
1851 }
1852
1853 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSD RESPONSE TO MAC");
1854 ((struct bcm_del_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSD_RSP;
1855 CopyBufferToControlPacket(Adapter, (PVOID)Adapter->caDsxReqResp);
1856 /* FALLTHROUGH */
1857 case DSD_RSP:
1858 /* Do nothing as SF has already got Deleted */
1859 break;
1860 case DSD_ACK:
1861 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSD ACK Rcd, let App handle it\n");
1862 break;
1863 default:
1864 kfree(pstAddIndication);
1865 return false;
1866 }
1867 return TRUE;
1868}
1869
1870int get_dsx_sf_data_to_application(struct bcm_mini_adapter *Adapter, UINT uiSFId, void __user *user_buffer)
1871{
1872 int status = 0;
1873 struct bcm_packet_info *psSfInfo = NULL;
1874
1875 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "status =%d", status);
1876 status = SearchSfid(Adapter, uiSFId);
1877 if (status >= NO_OF_QUEUES) {
1878 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SFID %d not present in queue !!!", uiSFId);
1879 return -EINVAL;
1880 }
1881 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "status =%d", status);
1882 psSfInfo = &Adapter->PackInfo[status];
1883 if (psSfInfo->pstSFIndication && copy_to_user(user_buffer,
1884 psSfInfo->pstSFIndication, sizeof(struct bcm_add_indication_alt))) {
1885 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "copy to user failed SFID %d, present in queue !!!", uiSFId);
1886 status = -EFAULT;
1887 return status;
1888 }
1889 return STATUS_SUCCESS;
1890}
1891
1892VOID OverrideServiceFlowParams(struct bcm_mini_adapter *Adapter, PUINT puiBuffer)
1893{
1894 B_UINT32 u32NumofSFsinMsg = ntohl(*(puiBuffer + 1));
1895 struct bcm_stim_sfhostnotify *pHostInfo = NULL;
1896 UINT uiSearchRuleIndex = 0;
1897 ULONG ulSFID = 0;
1898
1899 puiBuffer += 2;
1900 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "u32NumofSFsinMsg: 0x%x\n", u32NumofSFsinMsg);
1901
1902 while (u32NumofSFsinMsg != 0 && u32NumofSFsinMsg < NO_OF_QUEUES) {
1903 u32NumofSFsinMsg--;
1904 pHostInfo = (struct bcm_stim_sfhostnotify *)puiBuffer;
1905 puiBuffer = (PUINT)(pHostInfo + 1);
1906
1907 ulSFID = ntohl(pHostInfo->SFID);
1908 uiSearchRuleIndex = SearchSfid(Adapter, ulSFID);
1909 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SFID: 0x%lx\n", ulSFID);
1910
1911 if (uiSearchRuleIndex >= NO_OF_QUEUES || uiSearchRuleIndex == HiPriority) {
1912 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "The SFID <%lx> doesn't exist in host entry or is Invalid\n", ulSFID);
1913 continue;
1914 }
1915
1916 if (pHostInfo->RetainSF == false) {
1917 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Going to Delete SF");
1918 deleteSFBySfid(Adapter, uiSearchRuleIndex);
1919 } else {
1920 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = ntohs(pHostInfo->VCID);
1921 Adapter->PackInfo[uiSearchRuleIndex].usCID = ntohs(pHostInfo->newCID);
1922 Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1923
1924 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "pHostInfo->QoSParamSet: 0x%x\n", pHostInfo->QoSParamSet);
1925
1926 if (pHostInfo->QoSParamSet & 0x1)
1927 Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet = TRUE;
1928 if (pHostInfo->QoSParamSet & 0x2)
1929 Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet = TRUE;
1930 if (pHostInfo->QoSParamSet & 0x4) {
1931 Adapter->PackInfo[uiSearchRuleIndex].bActiveSet = TRUE;
1932 Adapter->PackInfo[uiSearchRuleIndex].bActive = TRUE;
1933 }
1934 }
1935 }
1936}
1/************************************************************
2 * CMHOST.C
3 * This file contains the routines for handling Connection
4 * Management.
5 ************************************************************/
6
7/* #define CONN_MSG */
8#include "headers.h"
9
10enum E_CLASSIFIER_ACTION {
11 eInvalidClassifierAction,
12 eAddClassifier,
13 eReplaceClassifier,
14 eDeleteClassifier
15};
16
17static ULONG GetNextTargetBufferLocation(PMINI_ADAPTER Adapter, B_UINT16 tid);
18
19/************************************************************
20 * Function - SearchSfid
21 *
22 * Description - This routinue would search QOS queues having
23 * specified SFID as input parameter.
24 *
25 * Parameters - Adapter: Pointer to the Adapter structure
26 * uiSfid : Given SFID for matching
27 *
28 * Returns - Queue index for this SFID(If matched)
29 * Else Invalid Queue Index(If Not matched)
30 ************************************************************/
31int SearchSfid(PMINI_ADAPTER Adapter, UINT uiSfid)
32{
33 int i;
34
35 for (i = (NO_OF_QUEUES-1); i >= 0; i--)
36 if (Adapter->PackInfo[i].ulSFID == uiSfid)
37 return i;
38
39 return NO_OF_QUEUES+1;
40}
41
42/***************************************************************
43 * Function -SearchFreeSfid
44 *
45 * Description - This routinue would search Free available SFID.
46 *
47 * Parameter - Adapter: Pointer to the Adapter structure
48 *
49 * Returns - Queue index for the free SFID
50 * Else returns Invalid Index.
51 ****************************************************************/
52static int SearchFreeSfid(PMINI_ADAPTER Adapter)
53{
54 int i;
55
56 for (i = 0; i < (NO_OF_QUEUES-1); i++)
57 if (Adapter->PackInfo[i].ulSFID == 0)
58 return i;
59
60 return NO_OF_QUEUES+1;
61}
62
63/*
64 * Function: SearchClsid
65 * Description: This routinue would search Classifier having specified ClassifierID as input parameter
66 * Input parameters: PMINI_ADAPTER Adapter - Adapter Context
67 * unsigned int uiSfid - The SF in which the classifier is to searched
68 * B_UINT16 uiClassifierID - The classifier ID to be searched
69 * Return: int :Classifier table index of matching entry
70 */
71static int SearchClsid(PMINI_ADAPTER Adapter, ULONG ulSFID, B_UINT16 uiClassifierID)
72{
73 int i;
74
75 for (i = 0; i < MAX_CLASSIFIERS; i++) {
76 if ((Adapter->astClassifierTable[i].bUsed) &&
77 (Adapter->astClassifierTable[i].uiClassifierRuleIndex == uiClassifierID) &&
78 (Adapter->astClassifierTable[i].ulSFID == ulSFID))
79 return i;
80 }
81
82 return MAX_CLASSIFIERS+1;
83}
84
85/*
86 * @ingroup ctrl_pkt_functions
87 * This routinue would search Free available Classifier entry in classifier table.
88 * @return free Classifier Entry index in classifier table for specified SF
89 */
90static int SearchFreeClsid(PMINI_ADAPTER Adapter /**Adapter Context*/)
91{
92 int i;
93
94 for (i = 0; i < MAX_CLASSIFIERS; i++) {
95 if (!Adapter->astClassifierTable[i].bUsed)
96 return i;
97 }
98
99 return MAX_CLASSIFIERS+1;
100}
101
102static VOID deleteSFBySfid(PMINI_ADAPTER Adapter, UINT uiSearchRuleIndex)
103{
104 /* deleting all the packet held in the SF */
105 flush_queue(Adapter, uiSearchRuleIndex);
106
107 /* Deleting the all classifiers for this SF */
108 DeleteAllClassifiersForSF(Adapter, uiSearchRuleIndex);
109
110 /* Resetting only MIBS related entries in the SF */
111 memset((PVOID)&Adapter->PackInfo[uiSearchRuleIndex], 0, sizeof(S_MIBS_SERVICEFLOW_TABLE));
112}
113
114static inline VOID
115CopyIpAddrToClassifier(S_CLASSIFIER_RULE *pstClassifierEntry,
116 B_UINT8 u8IpAddressLen, B_UINT8 *pu8IpAddressMaskSrc,
117 BOOLEAN bIpVersion6, E_IPADDR_CONTEXT eIpAddrContext)
118{
119 int i = 0;
120 UINT nSizeOfIPAddressInBytes = IP_LENGTH_OF_ADDRESS;
121 UCHAR *ptrClassifierIpAddress = NULL;
122 UCHAR *ptrClassifierIpMask = NULL;
123 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
124
125 if (bIpVersion6)
126 nSizeOfIPAddressInBytes = IPV6_ADDRESS_SIZEINBYTES;
127
128 /* Destination Ip Address */
129 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Ip Address Range Length:0x%X ", u8IpAddressLen);
130 if ((bIpVersion6 ? (IPV6_ADDRESS_SIZEINBYTES * MAX_IP_RANGE_LENGTH * 2) :
131 (TOTAL_MASKED_ADDRESS_IN_BYTES)) >= u8IpAddressLen) {
132 /*
133 * checking both the mask and address togethor in Classification.
134 * So length will be : TotalLengthInBytes/nSizeOfIPAddressInBytes * 2
135 * (nSizeOfIPAddressInBytes for address and nSizeOfIPAddressInBytes for mask)
136 */
137 if (eIpAddrContext == eDestIpAddress) {
138 pstClassifierEntry->ucIPDestinationAddressLength = u8IpAddressLen/(nSizeOfIPAddressInBytes * 2);
139 if (bIpVersion6) {
140 ptrClassifierIpAddress = pstClassifierEntry->stDestIpAddress.ucIpv6Address;
141 ptrClassifierIpMask = pstClassifierEntry->stDestIpAddress.ucIpv6Mask;
142 } else {
143 ptrClassifierIpAddress = pstClassifierEntry->stDestIpAddress.ucIpv4Address;
144 ptrClassifierIpMask = pstClassifierEntry->stDestIpAddress.ucIpv4Mask;
145 }
146 } else if (eIpAddrContext == eSrcIpAddress) {
147 pstClassifierEntry->ucIPSourceAddressLength = u8IpAddressLen/(nSizeOfIPAddressInBytes * 2);
148 if (bIpVersion6) {
149 ptrClassifierIpAddress = pstClassifierEntry->stSrcIpAddress.ucIpv6Address;
150 ptrClassifierIpMask = pstClassifierEntry->stSrcIpAddress.ucIpv6Mask;
151 } else {
152 ptrClassifierIpAddress = pstClassifierEntry->stSrcIpAddress.ucIpv4Address;
153 ptrClassifierIpMask = pstClassifierEntry->stSrcIpAddress.ucIpv4Mask;
154 }
155 }
156 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Address Length:0x%X\n", pstClassifierEntry->ucIPDestinationAddressLength);
157 while ((u8IpAddressLen >= nSizeOfIPAddressInBytes) && (i < MAX_IP_RANGE_LENGTH)) {
158 memcpy(ptrClassifierIpAddress +
159 (i * nSizeOfIPAddressInBytes),
160 (pu8IpAddressMaskSrc+(i*nSizeOfIPAddressInBytes*2)),
161 nSizeOfIPAddressInBytes);
162
163 if (!bIpVersion6) {
164 if (eIpAddrContext == eSrcIpAddress) {
165 pstClassifierEntry->stSrcIpAddress.ulIpv4Addr[i] = ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv4Addr[i]);
166 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Src Ip Address:0x%luX ",
167 pstClassifierEntry->stSrcIpAddress.ulIpv4Addr[i]);
168 } else if (eIpAddrContext == eDestIpAddress) {
169 pstClassifierEntry->stDestIpAddress.ulIpv4Addr[i] = ntohl(pstClassifierEntry->stDestIpAddress.ulIpv4Addr[i]);
170 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Dest Ip Address:0x%luX ",
171 pstClassifierEntry->stDestIpAddress.ulIpv4Addr[i]);
172 }
173 }
174 u8IpAddressLen -= nSizeOfIPAddressInBytes;
175 if (u8IpAddressLen >= nSizeOfIPAddressInBytes) {
176 memcpy(ptrClassifierIpMask +
177 (i * nSizeOfIPAddressInBytes),
178 (pu8IpAddressMaskSrc+nSizeOfIPAddressInBytes +
179 (i*nSizeOfIPAddressInBytes*2)),
180 nSizeOfIPAddressInBytes);
181
182 if (!bIpVersion6) {
183 if (eIpAddrContext == eSrcIpAddress) {
184 pstClassifierEntry->stSrcIpAddress.ulIpv4Mask[i] =
185 ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv4Mask[i]);
186 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Src Ip Mask Address:0x%luX ",
187 pstClassifierEntry->stSrcIpAddress.ulIpv4Mask[i]);
188 } else if (eIpAddrContext == eDestIpAddress) {
189 pstClassifierEntry->stDestIpAddress.ulIpv4Mask[i] =
190 ntohl(pstClassifierEntry->stDestIpAddress.ulIpv4Mask[i]);
191 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Dest Ip Mask Address:0x%luX ",
192 pstClassifierEntry->stDestIpAddress.ulIpv4Mask[i]);
193 }
194 }
195 u8IpAddressLen -= nSizeOfIPAddressInBytes;
196 }
197 if (u8IpAddressLen == 0)
198 pstClassifierEntry->bDestIpValid = TRUE;
199
200 i++;
201 }
202 if (bIpVersion6) {
203 /* Restore EndianNess of Struct */
204 for (i = 0; i < MAX_IP_RANGE_LENGTH * 4; i++) {
205 if (eIpAddrContext == eSrcIpAddress) {
206 pstClassifierEntry->stSrcIpAddress.ulIpv6Addr[i] = ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv6Addr[i]);
207 pstClassifierEntry->stSrcIpAddress.ulIpv6Mask[i] = ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv6Mask[i]);
208 } else if (eIpAddrContext == eDestIpAddress) {
209 pstClassifierEntry->stDestIpAddress.ulIpv6Addr[i] = ntohl(pstClassifierEntry->stDestIpAddress.ulIpv6Addr[i]);
210 pstClassifierEntry->stDestIpAddress.ulIpv6Mask[i] = ntohl(pstClassifierEntry->stDestIpAddress.ulIpv6Mask[i]);
211 }
212 }
213 }
214 }
215}
216
217void ClearTargetDSXBuffer(PMINI_ADAPTER Adapter, B_UINT16 TID, BOOLEAN bFreeAll)
218{
219 int i;
220
221 for (i = 0; i < Adapter->ulTotalTargetBuffersAvailable; i++) {
222 if (Adapter->astTargetDsxBuffer[i].valid)
223 continue;
224
225 if ((bFreeAll) || (Adapter->astTargetDsxBuffer[i].tid == TID)) {
226 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "ClearTargetDSXBuffer: found tid %d buffer cleared %lx\n",
227 TID, Adapter->astTargetDsxBuffer[i].ulTargetDsxBuffer);
228 Adapter->astTargetDsxBuffer[i].valid = 1;
229 Adapter->astTargetDsxBuffer[i].tid = 0;
230 Adapter->ulFreeTargetBufferCnt++;
231 }
232 }
233}
234
235/*
236 * @ingroup ctrl_pkt_functions
237 * copy classifier rule into the specified SF index
238 */
239static inline VOID CopyClassifierRuleToSF(PMINI_ADAPTER Adapter, stConvergenceSLTypes *psfCSType, UINT uiSearchRuleIndex, UINT nClassifierIndex)
240{
241 S_CLASSIFIER_RULE *pstClassifierEntry = NULL;
242 /* VOID *pvPhsContext = NULL; */
243 int i;
244 /* UCHAR ucProtocolLength=0; */
245 /* ULONG ulPhsStatus; */
246
247 if (Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value == 0 ||
248 nClassifierIndex > (MAX_CLASSIFIERS-1))
249 return;
250
251 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Storing Classifier Rule Index : %X",
252 ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex));
253
254 if (nClassifierIndex > MAX_CLASSIFIERS-1)
255 return;
256
257 pstClassifierEntry = &Adapter->astClassifierTable[nClassifierIndex];
258 if (pstClassifierEntry) {
259 /* Store if Ipv6 */
260 pstClassifierEntry->bIpv6Protocol = (Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6) ? TRUE : FALSE;
261
262 /* Destinaiton Port */
263 pstClassifierEntry->ucDestPortRangeLength = psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength / 4;
264 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Destination Port Range Length:0x%X ", pstClassifierEntry->ucDestPortRangeLength);
265
266 if (psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength <= MAX_PORT_RANGE) {
267 for (i = 0; i < (pstClassifierEntry->ucDestPortRangeLength); i++) {
268 pstClassifierEntry->usDestPortRangeLo[i] = *((PUSHORT)(psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange+i));
269 pstClassifierEntry->usDestPortRangeHi[i] =
270 *((PUSHORT)(psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange+2+i));
271 pstClassifierEntry->usDestPortRangeLo[i] = ntohs(pstClassifierEntry->usDestPortRangeLo[i]);
272 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Destination Port Range Lo:0x%X ",
273 pstClassifierEntry->usDestPortRangeLo[i]);
274 pstClassifierEntry->usDestPortRangeHi[i] = ntohs(pstClassifierEntry->usDestPortRangeHi[i]);
275 }
276 } else {
277 pstClassifierEntry->ucDestPortRangeLength = 0;
278 }
279
280 /* Source Port */
281 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Source Port Range Length:0x%X ",
282 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
283 if (psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength <= MAX_PORT_RANGE) {
284 pstClassifierEntry->ucSrcPortRangeLength = psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength/4;
285 for (i = 0; i < (pstClassifierEntry->ucSrcPortRangeLength); i++) {
286 pstClassifierEntry->usSrcPortRangeLo[i] =
287 *((PUSHORT)(psfCSType->cCPacketClassificationRule.
288 u8ProtocolSourcePortRange+i));
289 pstClassifierEntry->usSrcPortRangeHi[i] =
290 *((PUSHORT)(psfCSType->cCPacketClassificationRule.
291 u8ProtocolSourcePortRange+2+i));
292 pstClassifierEntry->usSrcPortRangeLo[i] =
293 ntohs(pstClassifierEntry->usSrcPortRangeLo[i]);
294 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Source Port Range Lo:0x%X ",
295 pstClassifierEntry->usSrcPortRangeLo[i]);
296 pstClassifierEntry->usSrcPortRangeHi[i] = ntohs(pstClassifierEntry->usSrcPortRangeHi[i]);
297 }
298 }
299 /* Destination Ip Address and Mask */
300 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Ip Destination Parameters : ");
301 CopyIpAddrToClassifier(pstClassifierEntry,
302 psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength,
303 psfCSType->cCPacketClassificationRule.u8IPDestinationAddress,
304 (Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6) ?
305 TRUE : FALSE, eDestIpAddress);
306
307 /* Source Ip Address and Mask */
308 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Ip Source Parameters : ");
309
310 CopyIpAddrToClassifier(pstClassifierEntry,
311 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength,
312 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress,
313 (Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6) ? TRUE : FALSE,
314 eSrcIpAddress);
315
316 /* TOS */
317 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "TOS Length:0x%X ", psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
318 if (psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength == 3) {
319 pstClassifierEntry->ucIPTypeOfServiceLength = psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength;
320 pstClassifierEntry->ucTosLow = psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0];
321 pstClassifierEntry->ucTosHigh = psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1];
322 pstClassifierEntry->ucTosMask = psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2];
323 pstClassifierEntry->bTOSValid = TRUE;
324 }
325 if (psfCSType->cCPacketClassificationRule.u8Protocol == 0) {
326 /* we didn't get protocol field filled in by the BS */
327 pstClassifierEntry->ucProtocolLength = 0;
328 } else {
329 pstClassifierEntry->ucProtocolLength = 1; /* 1 valid protocol */
330 }
331
332 pstClassifierEntry->ucProtocol[0] = psfCSType->cCPacketClassificationRule.u8Protocol;
333 pstClassifierEntry->u8ClassifierRulePriority = psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority;
334
335 /* store the classifier rule ID and set this classifier entry as valid */
336 pstClassifierEntry->ucDirection = Adapter->PackInfo[uiSearchRuleIndex].ucDirection;
337 pstClassifierEntry->uiClassifierRuleIndex = ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
338 pstClassifierEntry->usVCID_Value = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
339 pstClassifierEntry->ulSFID = Adapter->PackInfo[uiSearchRuleIndex].ulSFID;
340 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Search Index %d Dir: %d, Index: %d, Vcid: %d\n",
341 uiSearchRuleIndex, pstClassifierEntry->ucDirection,
342 pstClassifierEntry->uiClassifierRuleIndex,
343 pstClassifierEntry->usVCID_Value);
344
345 if (psfCSType->cCPacketClassificationRule.u8AssociatedPHSI)
346 pstClassifierEntry->u8AssociatedPHSI = psfCSType->cCPacketClassificationRule.u8AssociatedPHSI;
347
348 /* Copy ETH CS Parameters */
349 pstClassifierEntry->ucEthCSSrcMACLen = (psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddressLength);
350 memcpy(pstClassifierEntry->au8EThCSSrcMAC, psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress, MAC_ADDRESS_SIZE);
351 memcpy(pstClassifierEntry->au8EThCSSrcMACMask, psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress + MAC_ADDRESS_SIZE, MAC_ADDRESS_SIZE);
352 pstClassifierEntry->ucEthCSDestMACLen = (psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
353 memcpy(pstClassifierEntry->au8EThCSDestMAC, psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress, MAC_ADDRESS_SIZE);
354 memcpy(pstClassifierEntry->au8EThCSDestMACMask, psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress + MAC_ADDRESS_SIZE, MAC_ADDRESS_SIZE);
355 pstClassifierEntry->ucEtherTypeLen = (psfCSType->cCPacketClassificationRule.u8EthertypeLength);
356 memcpy(pstClassifierEntry->au8EthCSEtherType, psfCSType->cCPacketClassificationRule.u8Ethertype, NUM_ETHERTYPE_BYTES);
357 memcpy(pstClassifierEntry->usUserPriority, &psfCSType->cCPacketClassificationRule.u16UserPriority, 2);
358 pstClassifierEntry->usVLANID = ntohs(psfCSType->cCPacketClassificationRule.u16VLANID);
359 pstClassifierEntry->usValidityBitMap = ntohs(psfCSType->cCPacketClassificationRule.u16ValidityBitMap);
360
361 pstClassifierEntry->bUsed = TRUE;
362 }
363}
364
365/*
366 * @ingroup ctrl_pkt_functions
367 */
368static inline VOID DeleteClassifierRuleFromSF(PMINI_ADAPTER Adapter, UINT uiSearchRuleIndex, UINT nClassifierIndex)
369{
370 S_CLASSIFIER_RULE *pstClassifierEntry = NULL;
371 B_UINT16 u16PacketClassificationRuleIndex;
372 USHORT usVCID;
373 /* VOID *pvPhsContext = NULL; */
374 /*ULONG ulPhsStatus; */
375
376 usVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
377
378 if (nClassifierIndex > MAX_CLASSIFIERS-1)
379 return;
380
381 if (usVCID == 0)
382 return;
383
384 u16PacketClassificationRuleIndex = Adapter->astClassifierTable[nClassifierIndex].uiClassifierRuleIndex;
385 pstClassifierEntry = &Adapter->astClassifierTable[nClassifierIndex];
386 if (pstClassifierEntry) {
387 pstClassifierEntry->bUsed = FALSE;
388 pstClassifierEntry->uiClassifierRuleIndex = 0;
389 memset(pstClassifierEntry, 0, sizeof(S_CLASSIFIER_RULE));
390
391 /* Delete the PHS Rule for this classifier */
392 PhsDeleteClassifierRule(&Adapter->stBCMPhsContext, usVCID, u16PacketClassificationRuleIndex);
393 }
394}
395
396/*
397 * @ingroup ctrl_pkt_functions
398 */
399VOID DeleteAllClassifiersForSF(PMINI_ADAPTER Adapter, UINT uiSearchRuleIndex)
400{
401 S_CLASSIFIER_RULE *pstClassifierEntry = NULL;
402 int i;
403 /* B_UINT16 u16PacketClassificationRuleIndex; */
404 USHORT ulVCID;
405 /* VOID *pvPhsContext = NULL; */
406 /* ULONG ulPhsStatus; */
407
408 ulVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
409
410 if (ulVCID == 0)
411 return;
412
413 for (i = 0; i < MAX_CLASSIFIERS; i++) {
414 if (Adapter->astClassifierTable[i].usVCID_Value == ulVCID) {
415 pstClassifierEntry = &Adapter->astClassifierTable[i];
416
417 if (pstClassifierEntry->bUsed)
418 DeleteClassifierRuleFromSF(Adapter, uiSearchRuleIndex, i);
419 }
420 }
421
422 /* Delete All Phs Rules Associated with this SF */
423 PhsDeleteSFRules(&Adapter->stBCMPhsContext, ulVCID);
424}
425
426/*
427 * This routinue copies the Connection Management
428 * related data into the Adapter structure.
429 * @ingroup ctrl_pkt_functions
430 */
431static VOID CopyToAdapter(register PMINI_ADAPTER Adapter, /* <Pointer to the Adapter structure */
432 register pstServiceFlowParamSI psfLocalSet, /* <Pointer to the ServiceFlowParamSI structure */
433 register UINT uiSearchRuleIndex, /* <Index of Queue, to which this data belongs */
434 register UCHAR ucDsxType,
435 stLocalSFAddIndicationAlt *pstAddIndication) {
436
437 /* UCHAR ucProtocolLength = 0; */
438 ULONG ulSFID;
439 UINT nClassifierIndex = 0;
440 enum E_CLASSIFIER_ACTION eClassifierAction = eInvalidClassifierAction;
441 B_UINT16 u16PacketClassificationRuleIndex = 0;
442 int i;
443 stConvergenceSLTypes *psfCSType = NULL;
444 S_PHS_RULE sPhsRule;
445 USHORT uVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
446 UINT UGIValue = 0;
447
448 Adapter->PackInfo[uiSearchRuleIndex].bValid = TRUE;
449 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Search Rule Index = %d\n", uiSearchRuleIndex);
450 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "%s: SFID= %x ", __func__, ntohl(psfLocalSet->u32SFID));
451 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Updating Queue %d", uiSearchRuleIndex);
452
453 ulSFID = ntohl(psfLocalSet->u32SFID);
454 /* Store IP Version used */
455 /* Get The Version Of IP used (IPv6 or IPv4) from CSSpecification field of SF */
456
457 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = 0;
458 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = 0;
459
460 /* Enable IP/ETh CS Support As Required */
461 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "CopyToAdapter : u8CSSpecification : %X\n", psfLocalSet->u8CSSpecification);
462 switch (psfLocalSet->u8CSSpecification) {
463 case eCSPacketIPV4:
464 {
465 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
466 break;
467 }
468 case eCSPacketIPV6:
469 {
470 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV6_CS;
471 break;
472 }
473 case eCS802_3PacketEthernet:
474 case eCS802_1QPacketVLAN:
475 {
476 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
477 break;
478 }
479 case eCSPacketIPV4Over802_1QVLAN:
480 case eCSPacketIPV4Over802_3Ethernet:
481 {
482 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
483 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
484 break;
485 }
486 case eCSPacketIPV6Over802_1QVLAN:
487 case eCSPacketIPV6Over802_3Ethernet:
488 {
489 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV6_CS;
490 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
491 break;
492 }
493 default:
494 {
495 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error in value of CS Classification.. setting default to IP CS\n");
496 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
497 break;
498 }
499 }
500
501 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "CopyToAdapter : Queue No : %X ETH CS Support : %X , IP CS Support : %X\n",
502 uiSearchRuleIndex,
503 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport,
504 Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport);
505
506 /* Store IP Version used */
507 /* Get The Version Of IP used (IPv6 or IPv4) from CSSpecification field of SF */
508 if (Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport == IPV6_CS)
509 Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion = IPV6;
510 else
511 Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion = IPV4;
512
513 /* To ensure that the ETH CS code doesn't gets executed if the BS doesn't supports ETH CS */
514 if (!Adapter->bETHCSEnabled)
515 Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = 0;
516
517 if (psfLocalSet->u8ServiceClassNameLength > 0 && psfLocalSet->u8ServiceClassNameLength < 32)
518 memcpy(Adapter->PackInfo[uiSearchRuleIndex].ucServiceClassName, psfLocalSet->u8ServiceClassName, psfLocalSet->u8ServiceClassNameLength);
519
520 Adapter->PackInfo[uiSearchRuleIndex].u8QueueType = psfLocalSet->u8ServiceFlowSchedulingType;
521
522 if (Adapter->PackInfo[uiSearchRuleIndex].u8QueueType == BE && Adapter->PackInfo[uiSearchRuleIndex].ucDirection)
523 Adapter->usBestEffortQueueIndex = uiSearchRuleIndex;
524
525 Adapter->PackInfo[uiSearchRuleIndex].ulSFID = ntohl(psfLocalSet->u32SFID);
526
527 Adapter->PackInfo[uiSearchRuleIndex].u8TrafficPriority = psfLocalSet->u8TrafficPriority;
528
529 /* copy all the classifier in the Service Flow param structure */
530 for (i = 0; i < psfLocalSet->u8TotalClassifiers; i++) {
531 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Classifier index =%d", i);
532 psfCSType = &psfLocalSet->cConvergenceSLTypes[i];
533 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Classifier index =%d", i);
534
535 if (psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority)
536 Adapter->PackInfo[uiSearchRuleIndex].bClassifierPriority = TRUE;
537
538 if (psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority)
539 Adapter->PackInfo[uiSearchRuleIndex].bClassifierPriority = TRUE;
540
541 if (ucDsxType == DSA_ACK) {
542 eClassifierAction = eAddClassifier;
543 } else if (ucDsxType == DSC_ACK) {
544 switch (psfCSType->u8ClassfierDSCAction) {
545 case 0: /* DSC Add Classifier */
546 {
547 eClassifierAction = eAddClassifier;
548 }
549 break;
550 case 1: /* DSC Replace Classifier */
551 {
552 eClassifierAction = eReplaceClassifier;
553 }
554 break;
555 case 2: /* DSC Delete Classifier */
556 {
557 eClassifierAction = eDeleteClassifier;
558 }
559 break;
560 default:
561 {
562 eClassifierAction = eInvalidClassifierAction;
563 }
564 }
565 }
566
567 u16PacketClassificationRuleIndex = ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
568
569 switch (eClassifierAction) {
570 case eAddClassifier:
571 {
572 /* Get a Free Classifier Index From Classifier table for this SF to add the Classifier */
573 /* Contained in this message */
574 nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
575
576 if (nClassifierIndex > MAX_CLASSIFIERS) {
577 nClassifierIndex = SearchFreeClsid(Adapter);
578 if (nClassifierIndex > MAX_CLASSIFIERS) {
579 /* Failed To get a free Entry */
580 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error Failed To get a free Classifier Entry");
581 break;
582 }
583 /* Copy the Classifier Rule for this service flow into our Classifier table maintained per SF. */
584 CopyClassifierRuleToSF(Adapter, psfCSType, uiSearchRuleIndex, nClassifierIndex);
585 } else {
586 /* This Classifier Already Exists and it is invalid to Add Classifier with existing PCRI */
587 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,
588 "CopyToAdapter: Error The Specified Classifier Already Exists and attempted To Add Classifier with Same PCRI : 0x%x\n",
589 u16PacketClassificationRuleIndex);
590 }
591 }
592 break;
593 case eReplaceClassifier:
594 {
595 /* Get the Classifier Index From Classifier table for this SF and replace existing Classifier */
596 /* with the new classifier Contained in this message */
597 nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
598 if (nClassifierIndex > MAX_CLASSIFIERS) {
599 /* Failed To search the classifier */
600 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error Search for Classifier To be replaced failed");
601 break;
602 }
603 /* Copy the Classifier Rule for this service flow into our Classifier table maintained per SF. */
604 CopyClassifierRuleToSF(Adapter, psfCSType, uiSearchRuleIndex, nClassifierIndex);
605 }
606 break;
607 case eDeleteClassifier:
608 {
609 /* Get the Classifier Index From Classifier table for this SF and replace existing Classifier */
610 /* with the new classifier Contained in this message */
611 nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
612 if (nClassifierIndex > MAX_CLASSIFIERS) {
613 /* Failed To search the classifier */
614 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error Search for Classifier To be deleted failed");
615 break;
616 }
617
618 /* Delete This classifier */
619 DeleteClassifierRuleFromSF(Adapter, uiSearchRuleIndex, nClassifierIndex);
620 }
621 break;
622 default:
623 {
624 /* Invalid Action for classifier */
625 break;
626 }
627 }
628 }
629
630 /* Repeat parsing Classification Entries to process PHS Rules */
631 for (i = 0; i < psfLocalSet->u8TotalClassifiers; i++) {
632 psfCSType = &psfLocalSet->cConvergenceSLTypes[i];
633 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "psfCSType->u8PhsDSCAction : 0x%x\n", psfCSType->u8PhsDSCAction);
634
635 switch (psfCSType->u8PhsDSCAction) {
636 case eDeleteAllPHSRules:
637 {
638 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Deleting All PHS Rules For VCID: 0x%X\n", uVCID);
639
640 /* Delete All the PHS rules for this Service flow */
641 PhsDeleteSFRules(&Adapter->stBCMPhsContext, uVCID);
642 break;
643 }
644 case eDeletePHSRule:
645 {
646 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "PHS DSC Action = Delete PHS Rule\n");
647
648 if (psfCSType->cPhsRule.u8PHSI)
649 PhsDeletePHSRule(&Adapter->stBCMPhsContext, uVCID, psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
650
651 break;
652 }
653 default:
654 {
655 if (ucDsxType == DSC_ACK) {
656 /* BCM_DEBUG_PRINT(CONN_MSG,("Invalid PHS DSC Action For DSC\n",psfCSType->cPhsRule.u8PHSI)); */
657 break; /* FOr DSC ACK Case PHS DSC Action must be in valid set */
658 }
659 }
660 /* Proceed To Add PHS rule for DSA_ACK case even if PHS DSC action is unspecified */
661 /* No Break Here . Intentionally! */
662
663 case eAddPHSRule:
664 case eSetPHSRule:
665 {
666 if (psfCSType->cPhsRule.u8PHSI) {
667 /* Apply This PHS Rule to all classifiers whose Associated PHSI Match */
668 unsigned int uiClassifierIndex = 0;
669 if (pstAddIndication->u8Direction == UPLINK_DIR) {
670 for (uiClassifierIndex = 0; uiClassifierIndex < MAX_CLASSIFIERS; uiClassifierIndex++) {
671 if ((Adapter->astClassifierTable[uiClassifierIndex].bUsed) &&
672 (Adapter->astClassifierTable[uiClassifierIndex].ulSFID == Adapter->PackInfo[uiSearchRuleIndex].ulSFID) &&
673 (Adapter->astClassifierTable[uiClassifierIndex].u8AssociatedPHSI == psfCSType->cPhsRule.u8PHSI)) {
674 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,
675 "Adding PHS Rule For Classifier: 0x%x cPhsRule.u8PHSI: 0x%x\n",
676 Adapter->astClassifierTable[uiClassifierIndex].uiClassifierRuleIndex,
677 psfCSType->cPhsRule.u8PHSI);
678 /* Update The PHS Rule for this classifier as Associated PHSI id defined */
679
680 /* Copy the PHS Rule */
681 sPhsRule.u8PHSI = psfCSType->cPhsRule.u8PHSI;
682 sPhsRule.u8PHSFLength = psfCSType->cPhsRule.u8PHSFLength;
683 sPhsRule.u8PHSMLength = psfCSType->cPhsRule.u8PHSMLength;
684 sPhsRule.u8PHSS = psfCSType->cPhsRule.u8PHSS;
685 sPhsRule.u8PHSV = psfCSType->cPhsRule.u8PHSV;
686 memcpy(sPhsRule.u8PHSF, psfCSType->cPhsRule.u8PHSF, MAX_PHS_LENGTHS);
687 memcpy(sPhsRule.u8PHSM, psfCSType->cPhsRule.u8PHSM, MAX_PHS_LENGTHS);
688 sPhsRule.u8RefCnt = 0;
689 sPhsRule.bUnclassifiedPHSRule = FALSE;
690 sPhsRule.PHSModifiedBytes = 0;
691 sPhsRule.PHSModifiedNumPackets = 0;
692 sPhsRule.PHSErrorNumPackets = 0;
693
694 /* bPHSRuleAssociated = TRUE; */
695 /* Store The PHS Rule for this classifier */
696
697 PhsUpdateClassifierRule(
698 &Adapter->stBCMPhsContext,
699 uVCID,
700 Adapter->astClassifierTable[uiClassifierIndex].uiClassifierRuleIndex,
701 &sPhsRule,
702 Adapter->astClassifierTable[uiClassifierIndex].u8AssociatedPHSI);
703
704 /* Update PHS Rule For the Classifier */
705 if (sPhsRule.u8PHSI) {
706 Adapter->astClassifierTable[uiClassifierIndex].u32PHSRuleID = sPhsRule.u8PHSI;
707 memcpy(&Adapter->astClassifierTable[uiClassifierIndex].sPhsRule, &sPhsRule, sizeof(S_PHS_RULE));
708 }
709 }
710 }
711 } else {
712 /* Error PHS Rule specified in signaling could not be applied to any classifier */
713
714 /* Copy the PHS Rule */
715 sPhsRule.u8PHSI = psfCSType->cPhsRule.u8PHSI;
716 sPhsRule.u8PHSFLength = psfCSType->cPhsRule.u8PHSFLength;
717 sPhsRule.u8PHSMLength = psfCSType->cPhsRule.u8PHSMLength;
718 sPhsRule.u8PHSS = psfCSType->cPhsRule.u8PHSS;
719 sPhsRule.u8PHSV = psfCSType->cPhsRule.u8PHSV;
720 memcpy(sPhsRule.u8PHSF, psfCSType->cPhsRule.u8PHSF, MAX_PHS_LENGTHS);
721 memcpy(sPhsRule.u8PHSM, psfCSType->cPhsRule.u8PHSM, MAX_PHS_LENGTHS);
722 sPhsRule.u8RefCnt = 0;
723 sPhsRule.bUnclassifiedPHSRule = TRUE;
724 sPhsRule.PHSModifiedBytes = 0;
725 sPhsRule.PHSModifiedNumPackets = 0;
726 sPhsRule.PHSErrorNumPackets = 0;
727 /* Store The PHS Rule for this classifier */
728
729 /*
730 * Passing the argument u8PHSI instead of clsid. Because for DL with no classifier rule,
731 * clsid will be zero hence we can't have multiple PHS rules for the same SF.
732 * To support multiple PHS rule, passing u8PHSI.
733 */
734 PhsUpdateClassifierRule(
735 &Adapter->stBCMPhsContext,
736 uVCID,
737 sPhsRule.u8PHSI,
738 &sPhsRule,
739 sPhsRule.u8PHSI);
740 }
741 }
742 }
743 break;
744 }
745 }
746
747 if (psfLocalSet->u32MaxSustainedTrafficRate == 0) {
748 /* No Rate Limit . Set Max Sustained Traffic Rate to Maximum */
749 Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate = WIMAX_MAX_ALLOWED_RATE;
750 } else if (ntohl(psfLocalSet->u32MaxSustainedTrafficRate) > WIMAX_MAX_ALLOWED_RATE) {
751 /* Too large Allowed Rate specified. Limiting to Wi Max Allowed rate */
752 Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate = WIMAX_MAX_ALLOWED_RATE;
753 } else {
754 Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate = ntohl(psfLocalSet->u32MaxSustainedTrafficRate);
755 }
756
757 Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency = ntohl(psfLocalSet->u32MaximumLatency);
758 if (Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency == 0) /* 0 should be treated as infinite */
759 Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency = MAX_LATENCY_ALLOWED;
760
761 if ((Adapter->PackInfo[uiSearchRuleIndex].u8QueueType == ERTPS ||
762 Adapter->PackInfo[uiSearchRuleIndex].u8QueueType == UGS))
763 UGIValue = ntohs(psfLocalSet->u16UnsolicitedGrantInterval);
764
765 if (UGIValue == 0)
766 UGIValue = DEFAULT_UG_INTERVAL;
767
768 /*
769 * For UGI based connections...
770 * DEFAULT_UGI_FACTOR*UGIInterval worth of data is the max token count at host...
771 * The extra amount of token is to ensure that a large amount of jitter won't have loss in throughput...
772 * In case of non-UGI based connection, 200 frames worth of data is the max token count at host...
773 */
774 Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize =
775 (DEFAULT_UGI_FACTOR*Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate*UGIValue)/1000;
776
777 if (Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize < WIMAX_MAX_MTU*8) {
778 UINT UGIFactor = 0;
779 /* Special Handling to ensure the biggest size of packet can go out from host to FW as follows:
780 * 1. Any packet from Host to FW can go out in different packet size.
781 * 2. So in case the Bucket count is smaller than MTU, the packets of size (Size > TokenCount), will get dropped.
782 * 3. We can allow packets of MaxSize from Host->FW that can go out from FW in multiple SDUs by fragmentation at Wimax Layer
783 */
784 UGIFactor = (Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency/UGIValue + 1);
785
786 if (UGIFactor > DEFAULT_UGI_FACTOR)
787 Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize =
788 (UGIFactor*Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate*UGIValue)/1000;
789
790 if (Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize > WIMAX_MAX_MTU*8)
791 Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize = WIMAX_MAX_MTU*8;
792 }
793
794 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "LAT: %d, UGI: %d\n", Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency, UGIValue);
795 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "uiMaxAllowedRate: 0x%x, u32MaxSustainedTrafficRate: 0x%x ,uiMaxBucketSize: 0x%x",
796 Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate,
797 ntohl(psfLocalSet->u32MaxSustainedTrafficRate),
798 Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize);
799
800 /* copy the extended SF Parameters to Support MIBS */
801 CopyMIBSExtendedSFParameters(Adapter, psfLocalSet, uiSearchRuleIndex);
802
803 /* store header suppression enabled flag per SF */
804 Adapter->PackInfo[uiSearchRuleIndex].bHeaderSuppressionEnabled =
805 !(psfLocalSet->u8RequesttransmissionPolicy &
806 MASK_DISABLE_HEADER_SUPPRESSION);
807
808 kfree(Adapter->PackInfo[uiSearchRuleIndex].pstSFIndication);
809 Adapter->PackInfo[uiSearchRuleIndex].pstSFIndication = pstAddIndication;
810
811 /* Re Sort the SF list in PackInfo according to Traffic Priority */
812 SortPackInfo(Adapter);
813
814 /* Re Sort the Classifier Rules table and re - arrange
815 * according to Classifier Rule Priority
816 */
817 SortClassifiers(Adapter);
818 DumpPhsRules(&Adapter->stBCMPhsContext);
819 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "%s <=====", __func__);
820}
821
822/***********************************************************************
823 * Function - DumpCmControlPacket
824 *
825 * Description - This routinue Dumps the Contents of the AddIndication
826 * Structure in the Connection Management Control Packet
827 *
828 * Parameter - pvBuffer: Pointer to the buffer containing the
829 * AddIndication data.
830 *
831 * Returns - None
832 *************************************************************************/
833static VOID DumpCmControlPacket(PVOID pvBuffer)
834{
835 int uiLoopIndex;
836 int nIndex;
837 stLocalSFAddIndicationAlt *pstAddIndication;
838 UINT nCurClassifierCnt;
839 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
840
841 pstAddIndication = (stLocalSFAddIndicationAlt *)pvBuffer;
842 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "======>");
843 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Type: 0x%X", pstAddIndication->u8Type);
844 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Direction: 0x%X", pstAddIndication->u8Direction);
845 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TID: 0x%X", ntohs(pstAddIndication->u16TID));
846 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", ntohs(pstAddIndication->u16CID));
847 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VCID: 0x%X", ntohs(pstAddIndication->u16VCID));
848 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " AuthorizedSet--->");
849 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID: 0x%X", htonl(pstAddIndication->sfAuthorizedSet.u32SFID));
850 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", htons(pstAddIndication->sfAuthorizedSet.u16CID));
851 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength: 0x%X",
852 pstAddIndication->sfAuthorizedSet.u8ServiceClassNameLength);
853
854 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassName: 0x%X ,0x%X , 0x%X, 0x%X, 0x%X, 0x%X",
855 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[0],
856 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[1],
857 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[2],
858 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[3],
859 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[4],
860 pstAddIndication->sfAuthorizedSet.u8ServiceClassName[5]);
861
862 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService: 0x%X", pstAddIndication->sfAuthorizedSet.u8MBSService);
863 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet: 0x%X", pstAddIndication->sfAuthorizedSet.u8QosParamSet);
864 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority: 0x%X, %p",
865 pstAddIndication->sfAuthorizedSet.u8TrafficPriority, &pstAddIndication->sfAuthorizedSet.u8TrafficPriority);
866 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxSustainedTrafficRate: 0x%X 0x%p",
867 pstAddIndication->sfAuthorizedSet.u32MaxSustainedTrafficRate,
868 &pstAddIndication->sfAuthorizedSet.u32MaxSustainedTrafficRate);
869 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst: 0x%X", pstAddIndication->sfAuthorizedSet.u32MaxTrafficBurst);
870 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate : 0x%X",
871 pstAddIndication->sfAuthorizedSet.u32MinReservedTrafficRate);
872 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength: 0x%X",
873 pstAddIndication->sfAuthorizedSet.u8VendorSpecificQoSParamLength);
874 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam: 0x%X",
875 pstAddIndication->sfAuthorizedSet.u8VendorSpecificQoSParam[0]);
876 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType: 0x%X",
877 pstAddIndication->sfAuthorizedSet.u8ServiceFlowSchedulingType);
878 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter: 0x%X", pstAddIndication->sfAuthorizedSet.u32ToleratedJitter);
879 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency: 0x%X", pstAddIndication->sfAuthorizedSet.u32MaximumLatency);
880 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%X",
881 pstAddIndication->sfAuthorizedSet.u8FixedLengthVSVariableLengthSDUIndicator);
882 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize: 0x%X", pstAddIndication->sfAuthorizedSet.u8SDUSize);
883 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TargetSAID: 0x%X", pstAddIndication->sfAuthorizedSet.u16TargetSAID);
884 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQEnable: 0x%X", pstAddIndication->sfAuthorizedSet.u8ARQEnable);
885 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQWindowSize: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQWindowSize);
886 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryTxTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQRetryTxTimeOut);
887 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryRxTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQRetryRxTimeOut);
888 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockLifeTime: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQBlockLifeTime);
889 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQSyncLossTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQSyncLossTimeOut);
890 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQDeliverInOrder: 0x%X", pstAddIndication->sfAuthorizedSet.u8ARQDeliverInOrder);
891 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRxPurgeTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQRxPurgeTimeOut);
892 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockSize: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQBlockSize);
893 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8CSSpecification: 0x%X", pstAddIndication->sfAuthorizedSet.u8CSSpecification);
894 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TypeOfDataDeliveryService: 0x%X",
895 pstAddIndication->sfAuthorizedSet.u8TypeOfDataDeliveryService);
896 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16SDUInterArrivalTime: 0x%X", pstAddIndication->sfAuthorizedSet.u16SDUInterArrivalTime);
897 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TimeBase: 0x%X", pstAddIndication->sfAuthorizedSet.u16TimeBase);
898 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8PagingPreference: 0x%X", pstAddIndication->sfAuthorizedSet.u8PagingPreference);
899 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UnsolicitedPollingInterval: 0x%X",
900 pstAddIndication->sfAuthorizedSet.u16UnsolicitedPollingInterval);
901
902 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "sfAuthorizedSet.u8HARQChannelMapping %x %x %x ",
903 *(unsigned int *)pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping,
904 *(unsigned int *)&pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping[4],
905 *(USHORT *)&pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping[8]);
906 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficIndicationPreference: 0x%X",
907 pstAddIndication->sfAuthorizedSet.u8TrafficIndicationPreference);
908 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Received: 0x%X", pstAddIndication->sfAuthorizedSet.u8TotalClassifiers);
909
910 nCurClassifierCnt = pstAddIndication->sfAuthorizedSet.u8TotalClassifiers;
911 if (nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF)
912 nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF;
913
914 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "pstAddIndication->sfAuthorizedSet.bValid %d", pstAddIndication->sfAuthorizedSet.bValid);
915 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "pstAddIndication->sfAuthorizedSet.u16MacOverhead %x", pstAddIndication->sfAuthorizedSet.u16MacOverhead);
916 if (!pstAddIndication->sfAuthorizedSet.bValid)
917 pstAddIndication->sfAuthorizedSet.bValid = 1;
918 for (nIndex = 0; nIndex < nCurClassifierCnt; nIndex++) {
919 stConvergenceSLTypes *psfCSType = NULL;
920 psfCSType = &pstAddIndication->sfAuthorizedSet.cConvergenceSLTypes[nIndex];
921
922 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "psfCSType = %p", psfCSType);
923 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "CCPacketClassificationRuleSI====>");
924 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ClassifierRulePriority: 0x%X ",
925 psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority);
926 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfServiceLength: 0x%X ",
927 psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
928 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfService[3]: 0x%X ,0x%X ,0x%X ",
929 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0],
930 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1],
931 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2]);
932
933 for (uiLoopIndex = 0; uiLoopIndex < 1; uiLoopIndex++)
934 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Protocol: 0x%02X ",
935 psfCSType->cCPacketClassificationRule.u8Protocol);
936
937 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength: 0x%X ",
938 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength);
939
940 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
941 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32]: 0x%02X ",
942 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]);
943
944 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength: 0x%X ",
945 psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength);
946
947 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
948 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddress[32]: 0x%02X ",
949 psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]);
950
951 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRangeLength:0x%X ",
952 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
953 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRange[4]: 0x%02X ,0x%02X ,0x%02X ,0x%02X ",
954 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[0],
955 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[1],
956 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[2],
957 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[3]);
958
959 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRangeLength: 0x%02X ",
960 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength);
961 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRange[4]: 0x%02X ,0x%02X ,0x%02X ,0x%02X ",
962 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[0],
963 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[1],
964 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[2],
965 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[3]);
966
967 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddressLength: 0x%02X ",
968 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
969
970 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddress[6]: 0x %02X %02X %02X %02X %02X %02X",
971 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[0],
972 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[1],
973 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[2],
974 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[3],
975 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[4],
976 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[5]);
977
978 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddressLength: 0x%02X ",
979 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
980
981 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddress[6]: 0x %02X %02X %02X %02X %02X %02X",
982 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[0],
983 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[1],
984 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[2],
985 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[3],
986 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[4],
987 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[5]);
988
989 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthertypeLength: 0x%02X ",
990 psfCSType->cCPacketClassificationRule.u8EthertypeLength);
991 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Ethertype[3]: 0x%02X ,0x%02X ,0x%02X ",
992 psfCSType->cCPacketClassificationRule.u8Ethertype[0],
993 psfCSType->cCPacketClassificationRule.u8Ethertype[1],
994 psfCSType->cCPacketClassificationRule.u8Ethertype[2]);
995
996 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UserPriority: 0x%X ", psfCSType->cCPacketClassificationRule.u16UserPriority);
997 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VLANID: 0x%X ", psfCSType->cCPacketClassificationRule.u16VLANID);
998 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8AssociatedPHSI: 0x%02X ", psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
999 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16PacketClassificationRuleIndex: 0x%X ",
1000 psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
1001
1002 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParamLength: 0x%X ",
1003 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength);
1004 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParam[1]: 0x%X ",
1005 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]);
1006#ifdef VERSION_D5
1007 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLableLength: 0x%X ",
1008 psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength);
1009 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLable[6]: 0x %02X %02X %02X %02X %02X %02X ",
1010 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[0],
1011 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[1],
1012 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[2],
1013 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[3],
1014 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[4],
1015 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[5]);
1016#endif
1017 }
1018
1019 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "bValid: 0x%02X", pstAddIndication->sfAuthorizedSet.bValid);
1020 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "AdmittedSet--->");
1021 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID: 0x%X", pstAddIndication->sfAdmittedSet.u32SFID);
1022 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", pstAddIndication->sfAdmittedSet.u16CID);
1023 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength: 0x%X",
1024 pstAddIndication->sfAdmittedSet.u8ServiceClassNameLength);
1025 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassName: 0x %02X %02X %02X %02X %02X %02X",
1026 pstAddIndication->sfAdmittedSet.u8ServiceClassName[0],
1027 pstAddIndication->sfAdmittedSet.u8ServiceClassName[1],
1028 pstAddIndication->sfAdmittedSet.u8ServiceClassName[2],
1029 pstAddIndication->sfAdmittedSet.u8ServiceClassName[3],
1030 pstAddIndication->sfAdmittedSet.u8ServiceClassName[4],
1031 pstAddIndication->sfAdmittedSet.u8ServiceClassName[5]);
1032
1033 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService: 0x%02X", pstAddIndication->sfAdmittedSet.u8MBSService);
1034 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet: 0x%02X", pstAddIndication->sfAdmittedSet.u8QosParamSet);
1035 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority: 0x%02X", pstAddIndication->sfAdmittedSet.u8TrafficPriority);
1036 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst: 0x%X", pstAddIndication->sfAdmittedSet.u32MaxTrafficBurst);
1037 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate: 0x%X",
1038 pstAddIndication->sfAdmittedSet.u32MinReservedTrafficRate);
1039
1040 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength: 0x%02X",
1041 pstAddIndication->sfAdmittedSet.u8VendorSpecificQoSParamLength);
1042 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam: 0x%02X",
1043 pstAddIndication->sfAdmittedSet.u8VendorSpecificQoSParam[0]);
1044 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType: 0x%02X",
1045 pstAddIndication->sfAdmittedSet.u8ServiceFlowSchedulingType);
1046 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter: 0x%X", pstAddIndication->sfAdmittedSet.u32ToleratedJitter);
1047 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency: 0x%X", pstAddIndication->sfAdmittedSet.u32MaximumLatency);
1048 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%02X",
1049 pstAddIndication->sfAdmittedSet.u8FixedLengthVSVariableLengthSDUIndicator);
1050 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize: 0x%02X", pstAddIndication->sfAdmittedSet.u8SDUSize);
1051 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TargetSAID: 0x%02X", pstAddIndication->sfAdmittedSet.u16TargetSAID);
1052 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQEnable: 0x%02X", pstAddIndication->sfAdmittedSet.u8ARQEnable);
1053 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQWindowSize: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQWindowSize);
1054 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryTxTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQRetryTxTimeOut);
1055 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryRxTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQRetryRxTimeOut);
1056 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockLifeTime: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQBlockLifeTime);
1057 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQSyncLossTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQSyncLossTimeOut);
1058 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQDeliverInOrder: 0x%02X", pstAddIndication->sfAdmittedSet.u8ARQDeliverInOrder);
1059 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRxPurgeTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQRxPurgeTimeOut);
1060 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockSize: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQBlockSize);
1061 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8CSSpecification: 0x%02X", pstAddIndication->sfAdmittedSet.u8CSSpecification);
1062 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TypeOfDataDeliveryService: 0x%02X",
1063 pstAddIndication->sfAdmittedSet.u8TypeOfDataDeliveryService);
1064 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16SDUInterArrivalTime: 0x%X", pstAddIndication->sfAdmittedSet.u16SDUInterArrivalTime);
1065 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TimeBase: 0x%X", pstAddIndication->sfAdmittedSet.u16TimeBase);
1066 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8PagingPreference: 0x%X", pstAddIndication->sfAdmittedSet.u8PagingPreference);
1067 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficIndicationPreference: 0x%02X",
1068 pstAddIndication->sfAdmittedSet.u8TrafficIndicationPreference);
1069 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Received: 0x%X", pstAddIndication->sfAdmittedSet.u8TotalClassifiers);
1070
1071 nCurClassifierCnt = pstAddIndication->sfAdmittedSet.u8TotalClassifiers;
1072 if (nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF)
1073 nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF;
1074
1075 for (nIndex = 0; nIndex < nCurClassifierCnt; nIndex++) {
1076 stConvergenceSLTypes *psfCSType = NULL;
1077
1078 psfCSType = &pstAddIndication->sfAdmittedSet.cConvergenceSLTypes[nIndex];
1079 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " CCPacketClassificationRuleSI====>");
1080 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ClassifierRulePriority: 0x%02X ",
1081 psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority);
1082 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfServiceLength: 0x%02X",
1083 psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
1084 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfService[3]: 0x%02X %02X %02X",
1085 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0],
1086 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1],
1087 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2]);
1088 for (uiLoopIndex = 0; uiLoopIndex < 1; uiLoopIndex++)
1089 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Protocol: 0x%02X ", psfCSType->cCPacketClassificationRule.u8Protocol);
1090
1091 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength: 0x%02X ",
1092 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength);
1093
1094 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1095 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32]: 0x%02X ",
1096 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]);
1097
1098 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength: 0x%02X ",
1099 psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength);
1100
1101 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1102 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddress[32]: 0x%02X ",
1103 psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]);
1104
1105 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRangeLength: 0x%02X ",
1106 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
1107
1108 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRange[4]: 0x %02X %02X %02X %02X ",
1109 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[0],
1110 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[1],
1111 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[2],
1112 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[3]);
1113
1114 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRangeLength: 0x%02X ",
1115 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength);
1116
1117 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRange[4]: 0x %02X %02X %02X %02X ",
1118 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[0],
1119 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[1],
1120 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[2],
1121 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[3]);
1122
1123 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddressLength: 0x%02X ",
1124 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1125
1126 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddress[6]: 0x %02X %02X %02X %02X %02X %02X",
1127 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[0],
1128 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[1],
1129 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[2],
1130 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[3],
1131 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[4],
1132 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[5]);
1133
1134 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddressLength: 0x%02X ",
1135 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1136
1137 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddress[6]: 0x %02X %02X %02X %02X %02X %02X",
1138 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[0],
1139 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[1],
1140 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[2],
1141 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[3],
1142 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[4],
1143 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[5]);
1144
1145 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthertypeLength: 0x%02X ", psfCSType->cCPacketClassificationRule.u8EthertypeLength);
1146 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Ethertype[3]: 0x%02X %02X %02X",
1147 psfCSType->cCPacketClassificationRule.u8Ethertype[0],
1148 psfCSType->cCPacketClassificationRule.u8Ethertype[1],
1149 psfCSType->cCPacketClassificationRule.u8Ethertype[2]);
1150
1151 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UserPriority: 0x%X ", psfCSType->cCPacketClassificationRule.u16UserPriority);
1152 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VLANID: 0x%X ", psfCSType->cCPacketClassificationRule.u16VLANID);
1153 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8AssociatedPHSI: 0x%02X ", psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
1154 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16PacketClassificationRuleIndex: 0x%X ",
1155 psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
1156 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParamLength: 0x%02X",
1157 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength);
1158 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParam[1]: 0x%02X ",
1159 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]);
1160#ifdef VERSION_D5
1161 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLableLength: 0x%X ",
1162 psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength);
1163 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLable[6]: 0x %02X %02X %02X %02X %02X %02X ",
1164 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[0],
1165 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[1],
1166 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[2],
1167 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[3],
1168 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[4],
1169 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[5]);
1170#endif
1171 }
1172
1173 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "bValid: 0x%X", pstAddIndication->sfAdmittedSet.bValid);
1174 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " ActiveSet--->");
1175 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID: 0x%X", pstAddIndication->sfActiveSet.u32SFID);
1176 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", pstAddIndication->sfActiveSet.u16CID);
1177 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength: 0x%X", pstAddIndication->sfActiveSet.u8ServiceClassNameLength);
1178 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassName: 0x %02X %02X %02X %02X %02X %02X",
1179 pstAddIndication->sfActiveSet.u8ServiceClassName[0],
1180 pstAddIndication->sfActiveSet.u8ServiceClassName[1],
1181 pstAddIndication->sfActiveSet.u8ServiceClassName[2],
1182 pstAddIndication->sfActiveSet.u8ServiceClassName[3],
1183 pstAddIndication->sfActiveSet.u8ServiceClassName[4],
1184 pstAddIndication->sfActiveSet.u8ServiceClassName[5]);
1185
1186 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService: 0x%02X", pstAddIndication->sfActiveSet.u8MBSService);
1187 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet: 0x%02X", pstAddIndication->sfActiveSet.u8QosParamSet);
1188 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority: 0x%02X", pstAddIndication->sfActiveSet.u8TrafficPriority);
1189 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst: 0x%X", pstAddIndication->sfActiveSet.u32MaxTrafficBurst);
1190 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate: 0x%X",
1191 pstAddIndication->sfActiveSet.u32MinReservedTrafficRate);
1192 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength: 0x%02X",
1193 pstAddIndication->sfActiveSet.u8VendorSpecificQoSParamLength);
1194 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam: 0x%02X",
1195 pstAddIndication->sfActiveSet.u8VendorSpecificQoSParam[0]);
1196 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType: 0x%02X",
1197 pstAddIndication->sfActiveSet.u8ServiceFlowSchedulingType);
1198 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter: 0x%X", pstAddIndication->sfActiveSet.u32ToleratedJitter);
1199 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency: 0x%X", pstAddIndication->sfActiveSet.u32MaximumLatency);
1200 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%02X",
1201 pstAddIndication->sfActiveSet.u8FixedLengthVSVariableLengthSDUIndicator);
1202 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize: 0x%X", pstAddIndication->sfActiveSet.u8SDUSize);
1203 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16TargetSAID: 0x%X", pstAddIndication->sfActiveSet.u16TargetSAID);
1204 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ARQEnable: 0x%X", pstAddIndication->sfActiveSet.u8ARQEnable);
1205 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQWindowSize: 0x%X", pstAddIndication->sfActiveSet.u16ARQWindowSize);
1206 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRetryTxTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQRetryTxTimeOut);
1207 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRetryRxTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQRetryRxTimeOut);
1208 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQBlockLifeTime: 0x%X", pstAddIndication->sfActiveSet.u16ARQBlockLifeTime);
1209 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQSyncLossTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQSyncLossTimeOut);
1210 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ARQDeliverInOrder: 0x%X", pstAddIndication->sfActiveSet.u8ARQDeliverInOrder);
1211 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRxPurgeTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQRxPurgeTimeOut);
1212 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQBlockSize: 0x%X", pstAddIndication->sfActiveSet.u16ARQBlockSize);
1213 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8CSSpecification: 0x%X", pstAddIndication->sfActiveSet.u8CSSpecification);
1214 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8TypeOfDataDeliveryService: 0x%X",
1215 pstAddIndication->sfActiveSet.u8TypeOfDataDeliveryService);
1216 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16SDUInterArrivalTime: 0x%X", pstAddIndication->sfActiveSet.u16SDUInterArrivalTime);
1217 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16TimeBase: 0x%X", pstAddIndication->sfActiveSet.u16TimeBase);
1218 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8PagingPreference: 0x%X", pstAddIndication->sfActiveSet.u8PagingPreference);
1219 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8TrafficIndicationPreference: 0x%X",
1220 pstAddIndication->sfActiveSet.u8TrafficIndicationPreference);
1221 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Received: 0x%X", pstAddIndication->sfActiveSet.u8TotalClassifiers);
1222
1223 nCurClassifierCnt = pstAddIndication->sfActiveSet.u8TotalClassifiers;
1224 if (nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF)
1225 nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF;
1226
1227 for (nIndex = 0; nIndex < nCurClassifierCnt; nIndex++) {
1228 stConvergenceSLTypes *psfCSType = NULL;
1229
1230 psfCSType = &pstAddIndication->sfActiveSet.cConvergenceSLTypes[nIndex];
1231 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " CCPacketClassificationRuleSI====>");
1232 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ClassifierRulePriority: 0x%X ",
1233 psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority);
1234 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPTypeOfServiceLength: 0x%X ",
1235 psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
1236 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPTypeOfService[3]: 0x%X ,0x%X ,0x%X ",
1237 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0],
1238 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1],
1239 psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2]);
1240
1241 for (uiLoopIndex = 0; uiLoopIndex < 1; uiLoopIndex++)
1242 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8Protocol: 0x%X ", psfCSType->cCPacketClassificationRule.u8Protocol);
1243
1244 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength: 0x%X ",
1245 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength);
1246
1247 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1248 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32]: 0x%X ",
1249 psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]);
1250
1251 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength: 0x%02X ",
1252 psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength);
1253
1254 for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1255 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPDestinationAddress[32]:0x%X ",
1256 psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]);
1257
1258 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolSourcePortRangeLength: 0x%X ",
1259 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
1260
1261 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolSourcePortRange[4]: 0x%X ,0x%X ,0x%X ,0x%X ",
1262 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[0],
1263 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[1],
1264 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[2],
1265 psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[3]);
1266
1267 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolDestPortRangeLength: 0x%X ",
1268 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength);
1269 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolDestPortRange[4]: 0x%X ,0x%X ,0x%X ,0x%X ",
1270 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[0],
1271 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[1],
1272 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[2],
1273 psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[3]);
1274
1275 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthernetDestMacAddressLength: 0x%X ",
1276 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1277 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthernetDestMacAddress[6]: 0x%X ,0x%X ,0x%X ,0x%X ,0x%X ,0x%X",
1278 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[0],
1279 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[1],
1280 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[2],
1281 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[3],
1282 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[4],
1283 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[5]);
1284
1285 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthernetSourceMACAddressLength: 0x%X ",
1286 psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1287 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddress[6]: 0x%X ,0x%X ,0x%X ,0x%X ,0x%X ,0x%X",
1288 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[0],
1289 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[1],
1290 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[2],
1291 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[3],
1292 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[4],
1293 psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[5]);
1294
1295 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthertypeLength: 0x%X ",
1296 psfCSType->cCPacketClassificationRule.u8EthertypeLength);
1297 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8Ethertype[3]: 0x%X ,0x%X ,0x%X ",
1298 psfCSType->cCPacketClassificationRule.u8Ethertype[0],
1299 psfCSType->cCPacketClassificationRule.u8Ethertype[1],
1300 psfCSType->cCPacketClassificationRule.u8Ethertype[2]);
1301 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16UserPriority: 0x%X ",
1302 psfCSType->cCPacketClassificationRule.u16UserPriority);
1303 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16VLANID: 0x%X ", psfCSType->cCPacketClassificationRule.u16VLANID);
1304 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8AssociatedPHSI: 0x%X ", psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
1305 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16PacketClassificationRuleIndex:0x%X ",
1306 psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
1307
1308 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8VendorSpecificClassifierParamLength:0x%X ",
1309 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength);
1310 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8VendorSpecificClassifierParam[1]:0x%X ",
1311 psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]);
1312#ifdef VERSION_D5
1313 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPv6FlowLableLength: 0x%X ",
1314 psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength);
1315 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPv6FlowLable[6]: 0x%X ,0x%X ,0x%X ,0x%X ,0x%X ,0x%X ",
1316 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[0],
1317 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[1],
1318 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[2],
1319 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[3],
1320 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[4],
1321 psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[5]);
1322#endif
1323 }
1324
1325 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " bValid: 0x%X", pstAddIndication->sfActiveSet.bValid);
1326}
1327
1328static inline ULONG RestoreSFParam(PMINI_ADAPTER Adapter, ULONG ulAddrSFParamSet, PUCHAR pucDestBuffer)
1329{
1330 UINT nBytesToRead = sizeof(stServiceFlowParamSI);
1331
1332 if (ulAddrSFParamSet == 0 || NULL == pucDestBuffer) {
1333 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Got Param address as 0!!");
1334 return 0;
1335 }
1336 ulAddrSFParamSet = ntohl(ulAddrSFParamSet);
1337
1338 /* Read out the SF Param Set At the indicated Location */
1339 if (rdm(Adapter, ulAddrSFParamSet, (PUCHAR)pucDestBuffer, nBytesToRead) < 0)
1340 return STATUS_FAILURE;
1341
1342 return 1;
1343}
1344
1345static ULONG StoreSFParam(PMINI_ADAPTER Adapter, PUCHAR pucSrcBuffer, ULONG ulAddrSFParamSet)
1346{
1347 UINT nBytesToWrite = sizeof(stServiceFlowParamSI);
1348 int ret = 0;
1349
1350 if (ulAddrSFParamSet == 0 || NULL == pucSrcBuffer)
1351 return 0;
1352
1353 ret = wrm(Adapter, ulAddrSFParamSet, (u8 *)pucSrcBuffer, nBytesToWrite);
1354 if (ret < 0) {
1355 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "%s:%d WRM failed", __func__, __LINE__);
1356 return ret;
1357 }
1358 return 1;
1359}
1360
1361ULONG StoreCmControlResponseMessage(PMINI_ADAPTER Adapter, PVOID pvBuffer, UINT *puBufferLength)
1362{
1363 stLocalSFAddIndicationAlt *pstAddIndicationAlt = NULL;
1364 stLocalSFAddIndication *pstAddIndication = NULL;
1365 stLocalSFDeleteRequest *pstDeletionRequest;
1366 UINT uiSearchRuleIndex;
1367 ULONG ulSFID;
1368
1369 pstAddIndicationAlt = (stLocalSFAddIndicationAlt *)(pvBuffer);
1370
1371 /*
1372 * In case of DSD Req By MS, we should immediately delete this SF so that
1373 * we can stop the further classifying the pkt for this SF.
1374 */
1375 if (pstAddIndicationAlt->u8Type == DSD_REQ) {
1376 pstDeletionRequest = (stLocalSFDeleteRequest *)pvBuffer;
1377
1378 ulSFID = ntohl(pstDeletionRequest->u32SFID);
1379 uiSearchRuleIndex = SearchSfid(Adapter, ulSFID);
1380
1381 if (uiSearchRuleIndex < NO_OF_QUEUES) {
1382 deleteSFBySfid(Adapter, uiSearchRuleIndex);
1383 Adapter->u32TotalDSD++;
1384 }
1385 return 1;
1386 }
1387
1388 if ((pstAddIndicationAlt->u8Type == DSD_RSP) ||
1389 (pstAddIndicationAlt->u8Type == DSD_ACK)) {
1390 /* No Special handling send the message as it is */
1391 return 1;
1392 }
1393 /* For DSA_REQ, only up to "psfAuthorizedSet" parameter should be accessed by driver! */
1394
1395 pstAddIndication = kmalloc(sizeof(*pstAddIndication), GFP_KERNEL);
1396 if (pstAddIndication == NULL)
1397 return 0;
1398
1399 /* AUTHORIZED SET */
1400 pstAddIndication->psfAuthorizedSet = (stServiceFlowParamSI *)
1401 GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID);
1402 if (!pstAddIndication->psfAuthorizedSet) {
1403 kfree(pstAddIndication);
1404 return 0;
1405 }
1406
1407 if (StoreSFParam(Adapter, (PUCHAR)&pstAddIndicationAlt->sfAuthorizedSet,
1408 (ULONG)pstAddIndication->psfAuthorizedSet) != 1) {
1409 kfree(pstAddIndication);
1410 return 0;
1411 }
1412
1413 /* this can't possibly be right */
1414 pstAddIndication->psfAuthorizedSet = (stServiceFlowParamSI *)ntohl((ULONG)pstAddIndication->psfAuthorizedSet);
1415
1416 if (pstAddIndicationAlt->u8Type == DSA_REQ) {
1417 stLocalSFAddRequest AddRequest;
1418
1419 AddRequest.u8Type = pstAddIndicationAlt->u8Type;
1420 AddRequest.eConnectionDir = pstAddIndicationAlt->u8Direction;
1421 AddRequest.u16TID = pstAddIndicationAlt->u16TID;
1422 AddRequest.u16CID = pstAddIndicationAlt->u16CID;
1423 AddRequest.u16VCID = pstAddIndicationAlt->u16VCID;
1424 AddRequest.psfParameterSet = pstAddIndication->psfAuthorizedSet;
1425 (*puBufferLength) = sizeof(stLocalSFAddRequest);
1426 memcpy(pvBuffer, &AddRequest, sizeof(stLocalSFAddRequest));
1427 kfree(pstAddIndication);
1428 return 1;
1429 }
1430
1431 /* Since it's not DSA_REQ, we can access all field in pstAddIndicationAlt */
1432 /* We need to extract the structure from the buffer and pack it differently */
1433
1434 pstAddIndication->u8Type = pstAddIndicationAlt->u8Type;
1435 pstAddIndication->eConnectionDir = pstAddIndicationAlt->u8Direction;
1436 pstAddIndication->u16TID = pstAddIndicationAlt->u16TID;
1437 pstAddIndication->u16CID = pstAddIndicationAlt->u16CID;
1438 pstAddIndication->u16VCID = pstAddIndicationAlt->u16VCID;
1439 pstAddIndication->u8CC = pstAddIndicationAlt->u8CC;
1440
1441 /* ADMITTED SET */
1442 pstAddIndication->psfAdmittedSet = (stServiceFlowParamSI *)
1443 GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID);
1444 if (!pstAddIndication->psfAdmittedSet) {
1445 kfree(pstAddIndication);
1446 return 0;
1447 }
1448 if (StoreSFParam(Adapter, (PUCHAR)&pstAddIndicationAlt->sfAdmittedSet, (ULONG)pstAddIndication->psfAdmittedSet) != 1) {
1449 kfree(pstAddIndication);
1450 return 0;
1451 }
1452
1453 pstAddIndication->psfAdmittedSet = (stServiceFlowParamSI *)ntohl((ULONG)pstAddIndication->psfAdmittedSet);
1454
1455 /* ACTIVE SET */
1456 pstAddIndication->psfActiveSet = (stServiceFlowParamSI *)
1457 GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID);
1458 if (!pstAddIndication->psfActiveSet) {
1459 kfree(pstAddIndication);
1460 return 0;
1461 }
1462 if (StoreSFParam(Adapter, (PUCHAR)&pstAddIndicationAlt->sfActiveSet, (ULONG)pstAddIndication->psfActiveSet) != 1) {
1463 kfree(pstAddIndication);
1464 return 0;
1465 }
1466
1467 pstAddIndication->psfActiveSet = (stServiceFlowParamSI *)ntohl((ULONG)pstAddIndication->psfActiveSet);
1468
1469 (*puBufferLength) = sizeof(stLocalSFAddIndication);
1470 *(stLocalSFAddIndication *)pvBuffer = *pstAddIndication;
1471 kfree(pstAddIndication);
1472 return 1;
1473}
1474
1475static inline stLocalSFAddIndicationAlt
1476*RestoreCmControlResponseMessage(register PMINI_ADAPTER Adapter, register PVOID pvBuffer)
1477{
1478 ULONG ulStatus = 0;
1479 stLocalSFAddIndication *pstAddIndication = NULL;
1480 stLocalSFAddIndicationAlt *pstAddIndicationDest = NULL;
1481
1482 pstAddIndication = (stLocalSFAddIndication *)(pvBuffer);
1483 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "=====>");
1484 if ((pstAddIndication->u8Type == DSD_REQ) ||
1485 (pstAddIndication->u8Type == DSD_RSP) ||
1486 (pstAddIndication->u8Type == DSD_ACK))
1487 return (stLocalSFAddIndicationAlt *)pvBuffer;
1488
1489 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Inside RestoreCmControlResponseMessage ");
1490 /*
1491 * Need to Allocate memory to contain the SUPER Large structures
1492 * Our driver can't create these structures on Stack :(
1493 */
1494 pstAddIndicationDest = kmalloc(sizeof(stLocalSFAddIndicationAlt), GFP_KERNEL);
1495
1496 if (pstAddIndicationDest) {
1497 memset(pstAddIndicationDest, 0, sizeof(stLocalSFAddIndicationAlt));
1498 } else {
1499 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Failed to allocate memory for SF Add Indication Structure ");
1500 return NULL;
1501 }
1502 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8Type : 0x%X", pstAddIndication->u8Type);
1503 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8Direction : 0x%X", pstAddIndication->eConnectionDir);
1504 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8TID : 0x%X", ntohs(pstAddIndication->u16TID));
1505 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8CID : 0x%X", ntohs(pstAddIndication->u16CID));
1506 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u16VCID : 0x%X", ntohs(pstAddIndication->u16VCID));
1507 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-autorized set loc : %p", pstAddIndication->psfAuthorizedSet);
1508 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-admitted set loc : %p", pstAddIndication->psfAdmittedSet);
1509 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-Active set loc : %p", pstAddIndication->psfActiveSet);
1510
1511 pstAddIndicationDest->u8Type = pstAddIndication->u8Type;
1512 pstAddIndicationDest->u8Direction = pstAddIndication->eConnectionDir;
1513 pstAddIndicationDest->u16TID = pstAddIndication->u16TID;
1514 pstAddIndicationDest->u16CID = pstAddIndication->u16CID;
1515 pstAddIndicationDest->u16VCID = pstAddIndication->u16VCID;
1516 pstAddIndicationDest->u8CC = pstAddIndication->u8CC;
1517
1518 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Restoring Active Set ");
1519 ulStatus = RestoreSFParam(Adapter, (ULONG)pstAddIndication->psfActiveSet, (PUCHAR)&pstAddIndicationDest->sfActiveSet);
1520 if (ulStatus != 1)
1521 goto failed_restore_sf_param;
1522
1523 if (pstAddIndicationDest->sfActiveSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF)
1524 pstAddIndicationDest->sfActiveSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF;
1525
1526 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Restoring Admitted Set ");
1527 ulStatus = RestoreSFParam(Adapter, (ULONG)pstAddIndication->psfAdmittedSet, (PUCHAR)&pstAddIndicationDest->sfAdmittedSet);
1528 if (ulStatus != 1)
1529 goto failed_restore_sf_param;
1530
1531 if (pstAddIndicationDest->sfAdmittedSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF)
1532 pstAddIndicationDest->sfAdmittedSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF;
1533
1534 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Restoring Authorized Set ");
1535 ulStatus = RestoreSFParam(Adapter, (ULONG)pstAddIndication->psfAuthorizedSet, (PUCHAR)&pstAddIndicationDest->sfAuthorizedSet);
1536 if (ulStatus != 1)
1537 goto failed_restore_sf_param;
1538
1539 if (pstAddIndicationDest->sfAuthorizedSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF)
1540 pstAddIndicationDest->sfAuthorizedSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF;
1541
1542 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Dumping the whole raw packet");
1543 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "============================================================");
1544 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " pstAddIndicationDest->sfActiveSet size %zx %p", sizeof(*pstAddIndicationDest), pstAddIndicationDest);
1545 /* BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, (unsigned char *)pstAddIndicationDest, sizeof(*pstAddIndicationDest)); */
1546 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "============================================================");
1547 return pstAddIndicationDest;
1548failed_restore_sf_param:
1549 kfree(pstAddIndicationDest);
1550 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "<=====");
1551 return NULL;
1552}
1553
1554ULONG SetUpTargetDsxBuffers(PMINI_ADAPTER Adapter)
1555{
1556 ULONG ulTargetDsxBuffersBase = 0;
1557 ULONG ulCntTargetBuffers;
1558 ULONG i;
1559 int Status;
1560
1561 if (!Adapter) {
1562 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Adapter was NULL!!!");
1563 return 0;
1564 }
1565
1566 if (Adapter->astTargetDsxBuffer[0].ulTargetDsxBuffer)
1567 return 1;
1568
1569 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Size of Each DSX Buffer(Also size of ServiceFlowParamSI): %zx ", sizeof(stServiceFlowParamSI));
1570 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Reading DSX buffer From Target location %x ", DSX_MESSAGE_EXCHANGE_BUFFER);
1571
1572 Status = rdmalt(Adapter, DSX_MESSAGE_EXCHANGE_BUFFER, (PUINT)&ulTargetDsxBuffersBase, sizeof(UINT));
1573 if (Status < 0) {
1574 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "RDM failed!!");
1575 return 0;
1576 }
1577
1578 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Base Address Of DSX Target Buffer : 0x%lx", ulTargetDsxBuffersBase);
1579 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Tgt Buffer is Now %lx :", ulTargetDsxBuffersBase);
1580 ulCntTargetBuffers = DSX_MESSAGE_EXCHANGE_BUFFER_SIZE / sizeof(stServiceFlowParamSI);
1581
1582 Adapter->ulTotalTargetBuffersAvailable =
1583 ulCntTargetBuffers > MAX_TARGET_DSX_BUFFERS ?
1584 MAX_TARGET_DSX_BUFFERS : ulCntTargetBuffers;
1585
1586 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " Total Target DSX Buffer setup %lx ", Adapter->ulTotalTargetBuffersAvailable);
1587
1588 for (i = 0; i < Adapter->ulTotalTargetBuffersAvailable; i++) {
1589 Adapter->astTargetDsxBuffer[i].ulTargetDsxBuffer = ulTargetDsxBuffersBase;
1590 Adapter->astTargetDsxBuffer[i].valid = 1;
1591 Adapter->astTargetDsxBuffer[i].tid = 0;
1592 ulTargetDsxBuffersBase += sizeof(stServiceFlowParamSI);
1593 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " Target DSX Buffer %lx setup at 0x%lx",
1594 i, Adapter->astTargetDsxBuffer[i].ulTargetDsxBuffer);
1595 }
1596 Adapter->ulCurrentTargetBuffer = 0;
1597 Adapter->ulFreeTargetBufferCnt = Adapter->ulTotalTargetBuffersAvailable;
1598 return 1;
1599}
1600
1601static ULONG GetNextTargetBufferLocation(PMINI_ADAPTER Adapter, B_UINT16 tid)
1602{
1603 ULONG ulTargetDSXBufferAddress;
1604 ULONG ulTargetDsxBufferIndexToUse, ulMaxTry;
1605
1606 if ((Adapter->ulTotalTargetBuffersAvailable == 0) || (Adapter->ulFreeTargetBufferCnt == 0)) {
1607 ClearTargetDSXBuffer(Adapter, tid, FALSE);
1608 return 0;
1609 }
1610
1611 ulTargetDsxBufferIndexToUse = Adapter->ulCurrentTargetBuffer;
1612 ulMaxTry = Adapter->ulTotalTargetBuffersAvailable;
1613 while ((ulMaxTry) && (Adapter->astTargetDsxBuffer[ulTargetDsxBufferIndexToUse].valid != 1)) {
1614 ulTargetDsxBufferIndexToUse = (ulTargetDsxBufferIndexToUse+1) % Adapter->ulTotalTargetBuffersAvailable;
1615 ulMaxTry--;
1616 }
1617
1618 if (ulMaxTry == 0) {
1619 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "\n GetNextTargetBufferLocation : Error No Free Target DSX Buffers FreeCnt : %lx ", Adapter->ulFreeTargetBufferCnt);
1620 ClearTargetDSXBuffer(Adapter, tid, FALSE);
1621 return 0;
1622 }
1623
1624 ulTargetDSXBufferAddress = Adapter->astTargetDsxBuffer[ulTargetDsxBufferIndexToUse].ulTargetDsxBuffer;
1625 Adapter->astTargetDsxBuffer[ulTargetDsxBufferIndexToUse].valid = 0;
1626 Adapter->astTargetDsxBuffer[ulTargetDsxBufferIndexToUse].tid = tid;
1627 Adapter->ulFreeTargetBufferCnt--;
1628 ulTargetDsxBufferIndexToUse = (ulTargetDsxBufferIndexToUse+1)%Adapter->ulTotalTargetBuffersAvailable;
1629 Adapter->ulCurrentTargetBuffer = ulTargetDsxBufferIndexToUse;
1630 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "GetNextTargetBufferLocation :Returning address %lx tid %d\n", ulTargetDSXBufferAddress, tid);
1631
1632 return ulTargetDSXBufferAddress;
1633}
1634
1635int AllocAdapterDsxBuffer(PMINI_ADAPTER Adapter)
1636{
1637 /*
1638 * Need to Allocate memory to contain the SUPER Large structures
1639 * Our driver can't create these structures on Stack
1640 */
1641 Adapter->caDsxReqResp = kmalloc(sizeof(stLocalSFAddIndicationAlt)+LEADER_SIZE, GFP_KERNEL);
1642 if (!Adapter->caDsxReqResp)
1643 return -ENOMEM;
1644
1645 return 0;
1646}
1647
1648int FreeAdapterDsxBuffer(PMINI_ADAPTER Adapter)
1649{
1650 kfree(Adapter->caDsxReqResp);
1651 return 0;
1652}
1653
1654/*
1655 * @ingroup ctrl_pkt_functions
1656 * This routinue would process the Control responses
1657 * for the Connection Management.
1658 * @return - Queue index for the free SFID else returns Invalid Index.
1659 */
1660BOOLEAN CmControlResponseMessage(PMINI_ADAPTER Adapter, /* <Pointer to the Adapter structure */
1661 PVOID pvBuffer /* Starting Address of the Buffer, that contains the AddIndication Data */)
1662{
1663 stServiceFlowParamSI *psfLocalSet = NULL;
1664 stLocalSFAddIndicationAlt *pstAddIndication = NULL;
1665 stLocalSFChangeIndicationAlt *pstChangeIndication = NULL;
1666 PLEADER pLeader = NULL;
1667
1668 /*
1669 * Otherwise the message contains a target address from where we need to
1670 * read out the rest of the service flow param structure
1671 */
1672 pstAddIndication = RestoreCmControlResponseMessage(Adapter, pvBuffer);
1673 if (pstAddIndication == NULL) {
1674 ClearTargetDSXBuffer(Adapter, ((stLocalSFAddIndication *)pvBuffer)->u16TID, FALSE);
1675 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Error in restoring Service Flow param structure from DSx message");
1676 return FALSE;
1677 }
1678
1679 DumpCmControlPacket(pstAddIndication);
1680 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "====>");
1681 pLeader = (PLEADER)Adapter->caDsxReqResp;
1682
1683 pLeader->Status = CM_CONTROL_NEWDSX_MULTICLASSIFIER_REQ;
1684 pLeader->Vcid = 0;
1685
1686 ClearTargetDSXBuffer(Adapter, pstAddIndication->u16TID, FALSE);
1687 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "### TID RECEIVED %d\n", pstAddIndication->u16TID);
1688 switch (pstAddIndication->u8Type) {
1689 case DSA_REQ:
1690 {
1691 pLeader->PLength = sizeof(stLocalSFAddIndicationAlt);
1692 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Sending DSA Response....\n");
1693 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSA RESPONSE TO MAC %d", pLeader->PLength);
1694 *((stLocalSFAddIndicationAlt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))
1695 = *pstAddIndication;
1696 ((stLocalSFAddIndicationAlt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSA_RSP;
1697
1698 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " VCID = %x", ntohs(pstAddIndication->u16VCID));
1699 CopyBufferToControlPacket(Adapter, (PVOID)Adapter->caDsxReqResp);
1700 kfree(pstAddIndication);
1701 }
1702 break;
1703 case DSA_RSP:
1704 {
1705 pLeader->PLength = sizeof(stLocalSFAddIndicationAlt);
1706 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSA ACK TO MAC %d",
1707 pLeader->PLength);
1708 *((stLocalSFAddIndicationAlt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))
1709 = *pstAddIndication;
1710 ((stLocalSFAddIndicationAlt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSA_ACK;
1711
1712 } /* no break here..we should go down. */
1713 case DSA_ACK:
1714 {
1715 UINT uiSearchRuleIndex = 0;
1716
1717 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "VCID:0x%X",
1718 ntohs(pstAddIndication->u16VCID));
1719 uiSearchRuleIndex = SearchFreeSfid(Adapter);
1720 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "uiSearchRuleIndex:0x%X ",
1721 uiSearchRuleIndex);
1722 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Direction:0x%X ",
1723 pstAddIndication->u8Direction);
1724 if ((uiSearchRuleIndex < NO_OF_QUEUES)) {
1725 Adapter->PackInfo[uiSearchRuleIndex].ucDirection =
1726 pstAddIndication->u8Direction;
1727 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "bValid:0x%X ",
1728 pstAddIndication->sfActiveSet.bValid);
1729 if (pstAddIndication->sfActiveSet.bValid == TRUE)
1730 Adapter->PackInfo[uiSearchRuleIndex].bActiveSet = TRUE;
1731
1732 if (pstAddIndication->sfAuthorizedSet.bValid == TRUE)
1733 Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet = TRUE;
1734
1735 if (pstAddIndication->sfAdmittedSet.bValid == TRUE)
1736 Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet = TRUE;
1737
1738 if (pstAddIndication->sfActiveSet.bValid == FALSE) {
1739 Adapter->PackInfo[uiSearchRuleIndex].bActive = FALSE;
1740 Adapter->PackInfo[uiSearchRuleIndex].bActivateRequestSent = FALSE;
1741 if (pstAddIndication->sfAdmittedSet.bValid)
1742 psfLocalSet = &pstAddIndication->sfAdmittedSet;
1743 else if (pstAddIndication->sfAuthorizedSet.bValid)
1744 psfLocalSet = &pstAddIndication->sfAuthorizedSet;
1745 } else {
1746 psfLocalSet = &pstAddIndication->sfActiveSet;
1747 Adapter->PackInfo[uiSearchRuleIndex].bActive = TRUE;
1748 }
1749
1750 if (!psfLocalSet) {
1751 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "No set is valid\n");
1752 Adapter->PackInfo[uiSearchRuleIndex].bActive = FALSE;
1753 Adapter->PackInfo[uiSearchRuleIndex].bValid = FALSE;
1754 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = 0;
1755 kfree(pstAddIndication);
1756 } else if (psfLocalSet->bValid && (pstAddIndication->u8CC == 0)) {
1757 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSA ACK");
1758 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = ntohs(pstAddIndication->u16VCID);
1759 Adapter->PackInfo[uiSearchRuleIndex].usCID = ntohs(pstAddIndication->u16CID);
1760
1761 if (UPLINK_DIR == pstAddIndication->u8Direction)
1762 atomic_set(&Adapter->PackInfo[uiSearchRuleIndex].uiPerSFTxResourceCount, DEFAULT_PERSFCOUNT);
1763
1764 CopyToAdapter(Adapter, psfLocalSet, uiSearchRuleIndex, DSA_ACK, pstAddIndication);
1765 /* don't free pstAddIndication */
1766
1767 /* Inside CopyToAdapter, Sorting of all the SFs take place.
1768 * Hence any access to the newly added SF through uiSearchRuleIndex is invalid.
1769 * SHOULD BE STRICTLY AVOIDED.
1770 */
1771 /* *(PULONG)(((PUCHAR)pvBuffer)+1)=psfLocalSet->u32SFID; */
1772 memcpy((((PUCHAR)pvBuffer)+1), &psfLocalSet->u32SFID, 4);
1773
1774 if (pstAddIndication->sfActiveSet.bValid == TRUE) {
1775 if (UPLINK_DIR == pstAddIndication->u8Direction) {
1776 if (!Adapter->LinkUpStatus) {
1777 netif_carrier_on(Adapter->dev);
1778 netif_start_queue(Adapter->dev);
1779 Adapter->LinkUpStatus = 1;
1780 if (netif_msg_link(Adapter))
1781 pr_info(PFX "%s: link up\n", Adapter->dev->name);
1782 atomic_set(&Adapter->TxPktAvail, 1);
1783 wake_up(&Adapter->tx_packet_wait_queue);
1784 Adapter->liTimeSinceLastNetEntry = get_seconds();
1785 }
1786 }
1787 }
1788 } else {
1789 Adapter->PackInfo[uiSearchRuleIndex].bActive = FALSE;
1790 Adapter->PackInfo[uiSearchRuleIndex].bValid = FALSE;
1791 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = 0;
1792 kfree(pstAddIndication);
1793 }
1794 } else {
1795 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "DSA ACK did not get valid SFID");
1796 kfree(pstAddIndication);
1797 return FALSE;
1798 }
1799 }
1800 break;
1801 case DSC_REQ:
1802 {
1803 pLeader->PLength = sizeof(stLocalSFChangeIndicationAlt);
1804 pstChangeIndication = (stLocalSFChangeIndicationAlt *)pstAddIndication;
1805 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSC RESPONSE TO MAC %d", pLeader->PLength);
1806
1807 *((stLocalSFChangeIndicationAlt *)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *pstChangeIndication;
1808 ((stLocalSFChangeIndicationAlt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSC_RSP;
1809
1810 CopyBufferToControlPacket(Adapter, (PVOID)Adapter->caDsxReqResp);
1811 kfree(pstAddIndication);
1812 }
1813 break;
1814 case DSC_RSP:
1815 {
1816 pLeader->PLength = sizeof(stLocalSFChangeIndicationAlt);
1817 pstChangeIndication = (stLocalSFChangeIndicationAlt *)pstAddIndication;
1818 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSC ACK TO MAC %d", pLeader->PLength);
1819 *((stLocalSFChangeIndicationAlt *)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *pstChangeIndication;
1820 ((stLocalSFChangeIndicationAlt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSC_ACK;
1821 }
1822 case DSC_ACK:
1823 {
1824 UINT uiSearchRuleIndex = 0;
1825
1826 pstChangeIndication = (stLocalSFChangeIndicationAlt *)pstAddIndication;
1827 uiSearchRuleIndex = SearchSfid(Adapter, ntohl(pstChangeIndication->sfActiveSet.u32SFID));
1828 if (uiSearchRuleIndex > NO_OF_QUEUES-1)
1829 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "SF doesn't exist for which DSC_ACK is received");
1830
1831 if ((uiSearchRuleIndex < NO_OF_QUEUES)) {
1832 Adapter->PackInfo[uiSearchRuleIndex].ucDirection = pstChangeIndication->u8Direction;
1833 if (pstChangeIndication->sfActiveSet.bValid == TRUE)
1834 Adapter->PackInfo[uiSearchRuleIndex].bActiveSet = TRUE;
1835
1836 if (pstChangeIndication->sfAuthorizedSet.bValid == TRUE)
1837 Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet = TRUE;
1838
1839 if (pstChangeIndication->sfAdmittedSet.bValid == TRUE)
1840 Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet = TRUE;
1841
1842 if (pstChangeIndication->sfActiveSet.bValid == FALSE) {
1843 Adapter->PackInfo[uiSearchRuleIndex].bActive = FALSE;
1844 Adapter->PackInfo[uiSearchRuleIndex].bActivateRequestSent = FALSE;
1845
1846 if (pstChangeIndication->sfAdmittedSet.bValid)
1847 psfLocalSet = &pstChangeIndication->sfAdmittedSet;
1848 else if (pstChangeIndication->sfAuthorizedSet.bValid)
1849 psfLocalSet = &pstChangeIndication->sfAuthorizedSet;
1850 } else {
1851 psfLocalSet = &pstChangeIndication->sfActiveSet;
1852 Adapter->PackInfo[uiSearchRuleIndex].bActive = TRUE;
1853 }
1854
1855 if (!psfLocalSet) {
1856 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "No set is valid\n");
1857 Adapter->PackInfo[uiSearchRuleIndex].bActive = FALSE;
1858 Adapter->PackInfo[uiSearchRuleIndex].bValid = FALSE;
1859 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = 0;
1860 kfree(pstAddIndication);
1861 } else if (psfLocalSet->bValid && (pstChangeIndication->u8CC == 0)) {
1862 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = ntohs(pstChangeIndication->u16VCID);
1863 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "CC field is %d bvalid = %d\n",
1864 pstChangeIndication->u8CC, psfLocalSet->bValid);
1865 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "VCID= %d\n", ntohs(pstChangeIndication->u16VCID));
1866 Adapter->PackInfo[uiSearchRuleIndex].usCID = ntohs(pstChangeIndication->u16CID);
1867 CopyToAdapter(Adapter, psfLocalSet, uiSearchRuleIndex, DSC_ACK, pstAddIndication);
1868
1869 *(PULONG)(((PUCHAR)pvBuffer)+1) = psfLocalSet->u32SFID;
1870 } else if (pstChangeIndication->u8CC == 6) {
1871 deleteSFBySfid(Adapter, uiSearchRuleIndex);
1872 kfree(pstAddIndication);
1873 }
1874 } else {
1875 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "DSC ACK did not get valid SFID");
1876 kfree(pstAddIndication);
1877 return FALSE;
1878 }
1879 }
1880 break;
1881 case DSD_REQ:
1882 {
1883 UINT uiSearchRuleIndex;
1884 ULONG ulSFID;
1885
1886 pLeader->PLength = sizeof(stLocalSFDeleteIndication);
1887 *((stLocalSFDeleteIndication *)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *((stLocalSFDeleteIndication *)pstAddIndication);
1888
1889 ulSFID = ntohl(((stLocalSFDeleteIndication *)pstAddIndication)->u32SFID);
1890 uiSearchRuleIndex = SearchSfid(Adapter, ulSFID);
1891 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSD - Removing connection %x", uiSearchRuleIndex);
1892
1893 if (uiSearchRuleIndex < NO_OF_QUEUES) {
1894 /* Delete All Classifiers Associated with this SFID */
1895 deleteSFBySfid(Adapter, uiSearchRuleIndex);
1896 Adapter->u32TotalDSD++;
1897 }
1898
1899 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSD RESPONSE TO MAC");
1900 ((stLocalSFDeleteIndication *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSD_RSP;
1901 CopyBufferToControlPacket(Adapter, (PVOID)Adapter->caDsxReqResp);
1902 }
1903 case DSD_RSP:
1904 {
1905 /* Do nothing as SF has already got Deleted */
1906 }
1907 break;
1908 case DSD_ACK:
1909 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSD ACK Rcd, let App handle it\n");
1910 break;
1911 default:
1912 kfree(pstAddIndication);
1913 return FALSE;
1914 }
1915 return TRUE;
1916}
1917
1918int get_dsx_sf_data_to_application(PMINI_ADAPTER Adapter, UINT uiSFId, void __user *user_buffer)
1919{
1920 int status = 0;
1921 struct _packet_info *psSfInfo = NULL;
1922
1923 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "status =%d", status);
1924 status = SearchSfid(Adapter, uiSFId);
1925 if (status >= NO_OF_QUEUES) {
1926 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SFID %d not present in queue !!!", uiSFId);
1927 return -EINVAL;
1928 }
1929 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "status =%d", status);
1930 psSfInfo = &Adapter->PackInfo[status];
1931 if (psSfInfo->pstSFIndication && copy_to_user(user_buffer,
1932 psSfInfo->pstSFIndication, sizeof(stLocalSFAddIndicationAlt))) {
1933 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "copy to user failed SFID %d, present in queue !!!", uiSFId);
1934 status = -EFAULT;
1935 return status;
1936 }
1937 return STATUS_SUCCESS;
1938}
1939
1940VOID OverrideServiceFlowParams(PMINI_ADAPTER Adapter, PUINT puiBuffer)
1941{
1942 B_UINT32 u32NumofSFsinMsg = ntohl(*(puiBuffer + 1));
1943 stIM_SFHostNotify *pHostInfo = NULL;
1944 UINT uiSearchRuleIndex = 0;
1945 ULONG ulSFID = 0;
1946
1947 puiBuffer += 2;
1948 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "u32NumofSFsinMsg: 0x%x\n", u32NumofSFsinMsg);
1949
1950 while (u32NumofSFsinMsg != 0 && u32NumofSFsinMsg < NO_OF_QUEUES) {
1951 u32NumofSFsinMsg--;
1952 pHostInfo = (stIM_SFHostNotify *)puiBuffer;
1953 puiBuffer = (PUINT)(pHostInfo + 1);
1954
1955 ulSFID = ntohl(pHostInfo->SFID);
1956 uiSearchRuleIndex = SearchSfid(Adapter, ulSFID);
1957 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SFID: 0x%lx\n", ulSFID);
1958
1959 if (uiSearchRuleIndex >= NO_OF_QUEUES || uiSearchRuleIndex == HiPriority) {
1960 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "The SFID <%lx> doesn't exist in host entry or is Invalid\n", ulSFID);
1961 continue;
1962 }
1963
1964 if (pHostInfo->RetainSF == FALSE) {
1965 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Going to Delete SF");
1966 deleteSFBySfid(Adapter, uiSearchRuleIndex);
1967 } else {
1968 Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = ntohs(pHostInfo->VCID);
1969 Adapter->PackInfo[uiSearchRuleIndex].usCID = ntohs(pHostInfo->newCID);
1970 Adapter->PackInfo[uiSearchRuleIndex].bActive = FALSE;
1971
1972 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "pHostInfo->QoSParamSet: 0x%x\n", pHostInfo->QoSParamSet);
1973
1974 if (pHostInfo->QoSParamSet & 0x1)
1975 Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet = TRUE;
1976 if (pHostInfo->QoSParamSet & 0x2)
1977 Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet = TRUE;
1978 if (pHostInfo->QoSParamSet & 0x4) {
1979 Adapter->PackInfo[uiSearchRuleIndex].bActiveSet = TRUE;
1980 Adapter->PackInfo[uiSearchRuleIndex].bActive = TRUE;
1981 }
1982 }
1983 }
1984}