| /************************************************************ |
| * CMHOST.C |
| * This file contains the routines for handling Connection |
| * Management. |
| ************************************************************/ |
| |
| //#define CONN_MSG |
| #include "headers.h" |
| |
| typedef enum _E_CLASSIFIER_ACTION |
| { |
| eInvalidClassifierAction, |
| eAddClassifier, |
| eReplaceClassifier, |
| eDeleteClassifier |
| }E_CLASSIFIER_ACTION; |
| |
| static ULONG GetNextTargetBufferLocation(PMINI_ADAPTER Adapter,B_UINT16 tid); |
| |
| /************************************************************ |
| * Function - SearchSfid |
| * |
| * Description - This routinue would search QOS queues having |
| * specified SFID as input parameter. |
| * |
| * Parameters - Adapter: Pointer to the Adapter structure |
| * uiSfid : Given SFID for matching |
| * |
| * Returns - Queue index for this SFID(If matched) |
| Else Invalid Queue Index(If Not matched) |
| ************************************************************/ |
| INT SearchSfid(PMINI_ADAPTER Adapter,UINT uiSfid) |
| { |
| INT iIndex=0; |
| for(iIndex=(NO_OF_QUEUES-1); iIndex>=0; iIndex--) |
| if(Adapter->PackInfo[iIndex].ulSFID==uiSfid) |
| return iIndex; |
| return NO_OF_QUEUES+1; |
| } |
| |
| /*************************************************************** |
| * Function - SearchFreeSfid |
| * |
| * Description - This routinue would search Free available SFID. |
| * |
| * Parameter - Adapter: Pointer to the Adapter structure |
| * |
| * Returns - Queue index for the free SFID |
| * Else returns Invalid Index. |
| ****************************************************************/ |
| static INT SearchFreeSfid(PMINI_ADAPTER Adapter) |
| { |
| UINT uiIndex=0; |
| |
| for(uiIndex=0; uiIndex < (NO_OF_QUEUES-1); uiIndex++) |
| if(Adapter->PackInfo[uiIndex].ulSFID==0) |
| return uiIndex; |
| return NO_OF_QUEUES+1; |
| } |
| |
| /* |
| Function: SearchClsid |
| Description: This routinue would search Classifier having specified ClassifierID as input parameter |
| Input parameters: PMINI_ADAPTER Adapter - Adapter Context |
| unsigned int uiSfid - The SF in which the classifier is to searched |
| B_UINT16 uiClassifierID - The classifier ID to be searched |
| Return: int :Classifier table index of matching entry |
| */ |
| |
| static int SearchClsid(PMINI_ADAPTER Adapter,ULONG ulSFID,B_UINT16 uiClassifierID) |
| { |
| unsigned int uiClassifierIndex = 0; |
| for(uiClassifierIndex=0;uiClassifierIndex<MAX_CLASSIFIERS;uiClassifierIndex++) |
| { |
| if((Adapter->astClassifierTable[uiClassifierIndex].bUsed) && |
| (Adapter->astClassifierTable[uiClassifierIndex].uiClassifierRuleIndex == uiClassifierID)&& |
| (Adapter->astClassifierTable[uiClassifierIndex].ulSFID == ulSFID)) |
| return uiClassifierIndex; |
| } |
| return MAX_CLASSIFIERS+1; |
| } |
| |
| /** |
| @ingroup ctrl_pkt_functions |
| This routinue would search Free available Classifier entry in classifier table. |
| @return free Classifier Entry index in classifier table for specified SF |
| */ |
| static int SearchFreeClsid(PMINI_ADAPTER Adapter /**Adapter Context*/ |
| ) |
| { |
| unsigned int uiClassifierIndex = 0; |
| for(uiClassifierIndex=0;uiClassifierIndex<MAX_CLASSIFIERS;uiClassifierIndex++) |
| { |
| if(!Adapter->astClassifierTable[uiClassifierIndex].bUsed) |
| return uiClassifierIndex; |
| } |
| return MAX_CLASSIFIERS+1; |
| } |
| |
| static VOID deleteSFBySfid(PMINI_ADAPTER Adapter, UINT uiSearchRuleIndex) |
| { |
| //deleting all the packet held in the SF |
| flush_queue(Adapter,uiSearchRuleIndex); |
| |
| //Deleting the all classifiers for this SF |
| DeleteAllClassifiersForSF(Adapter,uiSearchRuleIndex); |
| |
| //Resetting only MIBS related entries in the SF |
| memset((PVOID)&Adapter->PackInfo[uiSearchRuleIndex], 0, sizeof(S_MIBS_SERVICEFLOW_TABLE)); |
| } |
| |
| static inline VOID |
| CopyIpAddrToClassifier(S_CLASSIFIER_RULE *pstClassifierEntry , |
| B_UINT8 u8IpAddressLen , B_UINT8 *pu8IpAddressMaskSrc , |
| BOOLEAN bIpVersion6 , E_IPADDR_CONTEXT eIpAddrContext) |
| { |
| UINT ucLoopIndex=0; |
| UINT nSizeOfIPAddressInBytes = IP_LENGTH_OF_ADDRESS; |
| UCHAR *ptrClassifierIpAddress = NULL; |
| UCHAR *ptrClassifierIpMask = NULL; |
| PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev); |
| |
| if(bIpVersion6) |
| { |
| nSizeOfIPAddressInBytes = IPV6_ADDRESS_SIZEINBYTES; |
| } |
| //Destination Ip Address |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Ip Address Range Length:0x%X ", |
| u8IpAddressLen); |
| if((bIpVersion6?(IPV6_ADDRESS_SIZEINBYTES * MAX_IP_RANGE_LENGTH * 2): |
| (TOTAL_MASKED_ADDRESS_IN_BYTES)) >= u8IpAddressLen) |
| { |
| /* |
| //checking both the mask and address togethor in Classification. |
| //So length will be : TotalLengthInBytes/nSizeOfIPAddressInBytes * 2 |
| //(nSizeOfIPAddressInBytes for address and nSizeOfIPAddressInBytes for mask) |
| */ |
| if(eIpAddrContext == eDestIpAddress) |
| { |
| pstClassifierEntry->ucIPDestinationAddressLength = |
| u8IpAddressLen/(nSizeOfIPAddressInBytes * 2); |
| if(bIpVersion6) |
| { |
| ptrClassifierIpAddress = |
| pstClassifierEntry->stDestIpAddress.ucIpv6Address; |
| ptrClassifierIpMask = |
| pstClassifierEntry->stDestIpAddress.ucIpv6Mask; |
| } |
| else |
| { |
| ptrClassifierIpAddress = |
| pstClassifierEntry->stDestIpAddress.ucIpv4Address; |
| ptrClassifierIpMask = |
| pstClassifierEntry->stDestIpAddress.ucIpv4Mask; |
| } |
| } |
| else if(eIpAddrContext == eSrcIpAddress) |
| { |
| pstClassifierEntry->ucIPSourceAddressLength = |
| u8IpAddressLen/(nSizeOfIPAddressInBytes * 2); |
| if(bIpVersion6) |
| { |
| ptrClassifierIpAddress = |
| pstClassifierEntry->stSrcIpAddress.ucIpv6Address; |
| ptrClassifierIpMask = |
| pstClassifierEntry->stSrcIpAddress.ucIpv6Mask; |
| } |
| else |
| { |
| ptrClassifierIpAddress = |
| pstClassifierEntry->stSrcIpAddress.ucIpv4Address; |
| ptrClassifierIpMask = |
| pstClassifierEntry->stSrcIpAddress.ucIpv4Mask; |
| } |
| } |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Address Length:0x%X \n", |
| pstClassifierEntry->ucIPDestinationAddressLength); |
| while((u8IpAddressLen>= nSizeOfIPAddressInBytes) && |
| (ucLoopIndex < MAX_IP_RANGE_LENGTH)) |
| { |
| memcpy(ptrClassifierIpAddress + |
| (ucLoopIndex * nSizeOfIPAddressInBytes), |
| (pu8IpAddressMaskSrc+(ucLoopIndex*nSizeOfIPAddressInBytes*2)), |
| nSizeOfIPAddressInBytes); |
| if(!bIpVersion6) |
| { |
| if(eIpAddrContext == eSrcIpAddress) |
| { |
| pstClassifierEntry->stSrcIpAddress.ulIpv4Addr[ucLoopIndex]= |
| ntohl(pstClassifierEntry->stSrcIpAddress. |
| ulIpv4Addr[ucLoopIndex]); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Src Ip Address:0x%luX ",pstClassifierEntry->stSrcIpAddress.ulIpv4Addr[ucLoopIndex]); |
| } |
| else if(eIpAddrContext == eDestIpAddress) |
| { |
| pstClassifierEntry->stDestIpAddress.ulIpv4Addr[ucLoopIndex]= ntohl(pstClassifierEntry->stDestIpAddress. |
| ulIpv4Addr[ucLoopIndex]); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Dest Ip Address:0x%luX ",pstClassifierEntry->stDestIpAddress.ulIpv4Addr[ucLoopIndex]); |
| } |
| } |
| u8IpAddressLen-=nSizeOfIPAddressInBytes; |
| if(u8IpAddressLen >= nSizeOfIPAddressInBytes) |
| { |
| memcpy(ptrClassifierIpMask + |
| (ucLoopIndex * nSizeOfIPAddressInBytes), |
| (pu8IpAddressMaskSrc+nSizeOfIPAddressInBytes + |
| (ucLoopIndex*nSizeOfIPAddressInBytes*2)), |
| nSizeOfIPAddressInBytes); |
| if(!bIpVersion6) |
| { |
| if(eIpAddrContext == eSrcIpAddress) |
| { |
| pstClassifierEntry->stSrcIpAddress. |
| ulIpv4Mask[ucLoopIndex]= |
| ntohl(pstClassifierEntry->stSrcIpAddress. |
| ulIpv4Mask[ucLoopIndex]); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Src Ip Mask Address:0x%luX ",pstClassifierEntry->stSrcIpAddress.ulIpv4Mask[ucLoopIndex]); |
| } |
| else if(eIpAddrContext == eDestIpAddress) |
| { |
| pstClassifierEntry->stDestIpAddress. |
| ulIpv4Mask[ucLoopIndex] = |
| ntohl(pstClassifierEntry->stDestIpAddress. |
| ulIpv4Mask[ucLoopIndex]); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Dest Ip Mask Address:0x%luX ",pstClassifierEntry->stDestIpAddress.ulIpv4Mask[ucLoopIndex]); |
| } |
| } |
| u8IpAddressLen-=nSizeOfIPAddressInBytes; |
| } |
| if(0==u8IpAddressLen) |
| { |
| pstClassifierEntry->bDestIpValid=TRUE; |
| } |
| ucLoopIndex++; |
| } |
| if(bIpVersion6) |
| { |
| //Restore EndianNess of Struct |
| for(ucLoopIndex =0 ; ucLoopIndex < MAX_IP_RANGE_LENGTH * 4 ; |
| ucLoopIndex++) |
| { |
| if(eIpAddrContext == eSrcIpAddress) |
| { |
| pstClassifierEntry->stSrcIpAddress.ulIpv6Addr[ucLoopIndex]= |
| ntohl(pstClassifierEntry->stSrcIpAddress. |
| ulIpv6Addr[ucLoopIndex]); |
| pstClassifierEntry->stSrcIpAddress.ulIpv6Mask[ucLoopIndex]= ntohl(pstClassifierEntry->stSrcIpAddress. |
| ulIpv6Mask[ucLoopIndex]); |
| } |
| else if(eIpAddrContext == eDestIpAddress) |
| { |
| pstClassifierEntry->stDestIpAddress.ulIpv6Addr[ucLoopIndex]= ntohl(pstClassifierEntry->stDestIpAddress. |
| ulIpv6Addr[ucLoopIndex]); |
| pstClassifierEntry->stDestIpAddress.ulIpv6Mask[ucLoopIndex]= ntohl(pstClassifierEntry->stDestIpAddress. |
| ulIpv6Mask[ucLoopIndex]); |
| } |
| } |
| } |
| } |
| } |
| |
| |
| void ClearTargetDSXBuffer(PMINI_ADAPTER Adapter,B_UINT16 TID,BOOLEAN bFreeAll) |
| { |
| ULONG ulIndex; |
| for(ulIndex=0; ulIndex < Adapter->ulTotalTargetBuffersAvailable; ulIndex++) |
| { |
| if(Adapter->astTargetDsxBuffer[ulIndex].valid) |
| continue; |
| if ((bFreeAll) || (Adapter->astTargetDsxBuffer[ulIndex].tid == TID)){ |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "ClearTargetDSXBuffer: found tid %d buffer cleared %lx\n", |
| TID, Adapter->astTargetDsxBuffer[ulIndex].ulTargetDsxBuffer); |
| Adapter->astTargetDsxBuffer[ulIndex].valid=1; |
| Adapter->astTargetDsxBuffer[ulIndex].tid=0; |
| Adapter->ulFreeTargetBufferCnt++; |
| } |
| } |
| } |
| |
| /** |
| @ingroup ctrl_pkt_functions |
| copy classifier rule into the specified SF index |
| */ |
| static inline VOID CopyClassifierRuleToSF(PMINI_ADAPTER Adapter,stConvergenceSLTypes *psfCSType,UINT uiSearchRuleIndex,UINT nClassifierIndex) |
| { |
| S_CLASSIFIER_RULE *pstClassifierEntry = NULL; |
| //VOID *pvPhsContext = NULL; |
| UINT ucLoopIndex=0; |
| //UCHAR ucProtocolLength=0; |
| //ULONG ulPhsStatus; |
| |
| |
| if(Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value == 0 || |
| nClassifierIndex > (MAX_CLASSIFIERS-1)) |
| return; |
| |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Storing Classifier Rule Index : %X",ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex)); |
| |
| if(nClassifierIndex > MAX_CLASSIFIERS-1) |
| return; |
| |
| pstClassifierEntry = &Adapter->astClassifierTable[nClassifierIndex]; |
| if(pstClassifierEntry) |
| { |
| //Store if Ipv6 |
| pstClassifierEntry->bIpv6Protocol = |
| (Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6)?TRUE:FALSE; |
| |
| //Destinaiton Port |
| pstClassifierEntry->ucDestPortRangeLength=psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength/4; |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Destination Port Range Length:0x%X ",pstClassifierEntry->ucDestPortRangeLength); |
| if( MAX_PORT_RANGE >= psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength) |
| { |
| for(ucLoopIndex=0;ucLoopIndex<(pstClassifierEntry->ucDestPortRangeLength);ucLoopIndex++) |
| { |
| pstClassifierEntry->usDestPortRangeLo[ucLoopIndex] = |
| *((PUSHORT)(psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange+ucLoopIndex)); |
| pstClassifierEntry->usDestPortRangeHi[ucLoopIndex] = |
| *((PUSHORT)(psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange+2+ucLoopIndex)); |
| pstClassifierEntry->usDestPortRangeLo[ucLoopIndex]=ntohs(pstClassifierEntry->usDestPortRangeLo[ucLoopIndex]); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Destination Port Range Lo:0x%X ",pstClassifierEntry->usDestPortRangeLo[ucLoopIndex]); |
| pstClassifierEntry->usDestPortRangeHi[ucLoopIndex]=ntohs(pstClassifierEntry->usDestPortRangeHi[ucLoopIndex]); |
| } |
| } |
| else |
| { |
| pstClassifierEntry->ucDestPortRangeLength=0; |
| } |
| //Source Port |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Source Port Range Length:0x%X ",psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength); |
| if(MAX_PORT_RANGE >= |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength) |
| { |
| pstClassifierEntry->ucSrcPortRangeLength = |
| psfCSType->cCPacketClassificationRule. |
| u8ProtocolSourcePortRangeLength/4; |
| for(ucLoopIndex = 0; ucLoopIndex < |
| (pstClassifierEntry->ucSrcPortRangeLength); ucLoopIndex++) |
| { |
| pstClassifierEntry->usSrcPortRangeLo[ucLoopIndex] = |
| *((PUSHORT)(psfCSType->cCPacketClassificationRule. |
| u8ProtocolSourcePortRange+ucLoopIndex)); |
| pstClassifierEntry->usSrcPortRangeHi[ucLoopIndex] = |
| *((PUSHORT)(psfCSType->cCPacketClassificationRule. |
| u8ProtocolSourcePortRange+2+ucLoopIndex)); |
| pstClassifierEntry->usSrcPortRangeLo[ucLoopIndex] = |
| ntohs(pstClassifierEntry->usSrcPortRangeLo[ucLoopIndex]); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Source Port Range Lo:0x%X ",pstClassifierEntry->usSrcPortRangeLo[ucLoopIndex]); |
| pstClassifierEntry->usSrcPortRangeHi[ucLoopIndex]=ntohs(pstClassifierEntry->usSrcPortRangeHi[ucLoopIndex]); |
| } |
| } |
| //Destination Ip Address and Mask |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Ip Destination Parameters : "); |
| |
| CopyIpAddrToClassifier(pstClassifierEntry, |
| psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength, |
| psfCSType->cCPacketClassificationRule.u8IPDestinationAddress, |
| (Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6)? |
| TRUE:FALSE, eDestIpAddress); |
| |
| //Source Ip Address and Mask |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Ip Source Parameters : "); |
| |
| CopyIpAddrToClassifier(pstClassifierEntry, |
| psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength, |
| psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress, |
| (Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6)?TRUE:FALSE, |
| eSrcIpAddress); |
| |
| //TOS |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"TOS Length:0x%X ",psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength); |
| if(3 == psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength) |
| { |
| pstClassifierEntry->ucIPTypeOfServiceLength = |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength; |
| pstClassifierEntry->ucTosLow = |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0]; |
| pstClassifierEntry->ucTosHigh = |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1]; |
| pstClassifierEntry->ucTosMask = |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2]; |
| pstClassifierEntry->bTOSValid = TRUE; |
| } |
| if(psfCSType->cCPacketClassificationRule.u8Protocol == 0) |
| { |
| //we didnt get protocol field filled in by the BS |
| pstClassifierEntry->ucProtocolLength=0; |
| } |
| else |
| { |
| pstClassifierEntry->ucProtocolLength=1;// 1 valid protocol |
| } |
| |
| pstClassifierEntry->ucProtocol[0] = |
| psfCSType->cCPacketClassificationRule.u8Protocol; |
| |
| pstClassifierEntry->u8ClassifierRulePriority = |
| psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority; |
| |
| //store the classifier rule ID and set this classifier entry as valid |
| pstClassifierEntry->ucDirection = |
| Adapter->PackInfo[uiSearchRuleIndex].ucDirection; |
| pstClassifierEntry->uiClassifierRuleIndex = ntohs(psfCSType-> |
| cCPacketClassificationRule.u16PacketClassificationRuleIndex); |
| pstClassifierEntry->usVCID_Value = |
| Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value; |
| pstClassifierEntry->ulSFID = |
| Adapter->PackInfo[uiSearchRuleIndex].ulSFID; |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Search Index %d Dir: %d, Index: %d, Vcid: %d\n", |
| uiSearchRuleIndex, pstClassifierEntry->ucDirection, |
| pstClassifierEntry->uiClassifierRuleIndex, |
| pstClassifierEntry->usVCID_Value); |
| |
| if(psfCSType->cCPacketClassificationRule.u8AssociatedPHSI) |
| { |
| pstClassifierEntry->u8AssociatedPHSI = psfCSType->cCPacketClassificationRule.u8AssociatedPHSI; |
| } |
| |
| //Copy ETH CS Parameters |
| pstClassifierEntry->ucEthCSSrcMACLen = (psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddressLength); |
| memcpy(pstClassifierEntry->au8EThCSSrcMAC,psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress,MAC_ADDRESS_SIZE); |
| memcpy(pstClassifierEntry->au8EThCSSrcMACMask,psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress+MAC_ADDRESS_SIZE,MAC_ADDRESS_SIZE); |
| pstClassifierEntry->ucEthCSDestMACLen = (psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength); |
| memcpy(pstClassifierEntry->au8EThCSDestMAC,psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress,MAC_ADDRESS_SIZE); |
| memcpy(pstClassifierEntry->au8EThCSDestMACMask,psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress+MAC_ADDRESS_SIZE,MAC_ADDRESS_SIZE); |
| pstClassifierEntry->ucEtherTypeLen = (psfCSType->cCPacketClassificationRule.u8EthertypeLength); |
| memcpy(pstClassifierEntry->au8EthCSEtherType,psfCSType->cCPacketClassificationRule.u8Ethertype,NUM_ETHERTYPE_BYTES); |
| memcpy(pstClassifierEntry->usUserPriority, &psfCSType->cCPacketClassificationRule.u16UserPriority, 2); |
| pstClassifierEntry->usVLANID = ntohs(psfCSType->cCPacketClassificationRule.u16VLANID); |
| pstClassifierEntry->usValidityBitMap = ntohs(psfCSType->cCPacketClassificationRule.u16ValidityBitMap); |
| |
| pstClassifierEntry->bUsed = TRUE; |
| } |
| } |
| |
| |
| /** |
| @ingroup ctrl_pkt_functions |
| */ |
| static inline VOID DeleteClassifierRuleFromSF(PMINI_ADAPTER Adapter,UINT uiSearchRuleIndex,UINT nClassifierIndex) |
| { |
| S_CLASSIFIER_RULE *pstClassifierEntry = NULL; |
| B_UINT16 u16PacketClassificationRuleIndex; |
| USHORT usVCID; |
| //VOID *pvPhsContext = NULL; |
| //ULONG ulPhsStatus; |
| |
| usVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value; |
| |
| if(nClassifierIndex > MAX_CLASSIFIERS-1) |
| return; |
| |
| if(usVCID == 0) |
| return; |
| |
| u16PacketClassificationRuleIndex = Adapter->astClassifierTable[nClassifierIndex].uiClassifierRuleIndex; |
| |
| |
| pstClassifierEntry = &Adapter->astClassifierTable[nClassifierIndex]; |
| if(pstClassifierEntry) |
| { |
| pstClassifierEntry->bUsed = FALSE; |
| pstClassifierEntry->uiClassifierRuleIndex = 0; |
| memset(pstClassifierEntry,0,sizeof(S_CLASSIFIER_RULE)); |
| |
| //Delete the PHS Rule for this classifier |
| PhsDeleteClassifierRule( |
| &Adapter->stBCMPhsContext, |
| usVCID, |
| u16PacketClassificationRuleIndex); |
| } |
| } |
| |
| /** |
| @ingroup ctrl_pkt_functions |
| */ |
| VOID DeleteAllClassifiersForSF(PMINI_ADAPTER Adapter,UINT uiSearchRuleIndex) |
| { |
| S_CLASSIFIER_RULE *pstClassifierEntry = NULL; |
| UINT nClassifierIndex; |
| //B_UINT16 u16PacketClassificationRuleIndex; |
| USHORT ulVCID; |
| //VOID *pvPhsContext = NULL; |
| //ULONG ulPhsStatus; |
| |
| ulVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value; |
| |
| if(ulVCID == 0) |
| return; |
| |
| |
| for(nClassifierIndex =0 ; nClassifierIndex < MAX_CLASSIFIERS ; nClassifierIndex++) |
| { |
| if(Adapter->astClassifierTable[nClassifierIndex].usVCID_Value == ulVCID) |
| { |
| pstClassifierEntry = &Adapter->astClassifierTable[nClassifierIndex]; |
| if(pstClassifierEntry->bUsed) |
| { |
| DeleteClassifierRuleFromSF(Adapter,uiSearchRuleIndex,nClassifierIndex); |
| } |
| } |
| } |
| |
| //Delete All Phs Rules Associated with this SF |
| PhsDeleteSFRules( |
| &Adapter->stBCMPhsContext, |
| ulVCID); |
| |
| } |
| |
| |
| /** |
| This routinue copies the Connection Management |
| related data into the Adapter structure. |
| @ingroup ctrl_pkt_functions |
| */ |
| |
| static VOID CopyToAdapter( register PMINI_ADAPTER Adapter, /**<Pointer to the Adapter structure*/ |
| register pstServiceFlowParamSI psfLocalSet, /**<Pointer to the ServiceFlowParamSI structure*/ |
| register UINT uiSearchRuleIndex, /**<Index of Queue, to which this data belongs*/ |
| register UCHAR ucDsxType, |
| stLocalSFAddIndicationAlt *pstAddIndication) |
| { |
| //UCHAR ucProtocolLength=0; |
| ULONG ulSFID; |
| UINT nClassifierIndex = 0; |
| E_CLASSIFIER_ACTION eClassifierAction = eInvalidClassifierAction; |
| B_UINT16 u16PacketClassificationRuleIndex=0; |
| UINT nIndex=0; |
| stConvergenceSLTypes *psfCSType = NULL; |
| S_PHS_RULE sPhsRule; |
| USHORT uVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value; |
| UINT UGIValue = 0; |
| |
| |
| Adapter->PackInfo[uiSearchRuleIndex].bValid=TRUE; |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Search Rule Index = %d\n", uiSearchRuleIndex); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"%s: SFID= %x ",__FUNCTION__, ntohl(psfLocalSet->u32SFID)); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Updating Queue %d",uiSearchRuleIndex); |
| |
| ulSFID = ntohl(psfLocalSet->u32SFID); |
| //Store IP Version used |
| //Get The Version Of IP used (IPv6 or IPv4) from CSSpecification field of SF |
| |
| Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = 0; |
| Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = 0; |
| |
| /*Enable IP/ETh CS Support As Required*/ |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"CopyToAdapter : u8CSSpecification : %X\n",psfLocalSet->u8CSSpecification); |
| switch(psfLocalSet->u8CSSpecification) |
| { |
| case eCSPacketIPV4: |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS; |
| break; |
| } |
| case eCSPacketIPV6: |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV6_CS; |
| break; |
| } |
| |
| case eCS802_3PacketEthernet: |
| case eCS802_1QPacketVLAN: |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3; |
| break; |
| } |
| |
| case eCSPacketIPV4Over802_1QVLAN: |
| case eCSPacketIPV4Over802_3Ethernet: |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS; |
| Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3; |
| break; |
| } |
| |
| case eCSPacketIPV6Over802_1QVLAN: |
| case eCSPacketIPV6Over802_3Ethernet: |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV6_CS; |
| Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3; |
| break; |
| } |
| |
| default: |
| { |
| BCM_DEBUG_PRINT (Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Error in value of CS Classification.. setting default to IP CS\n"); |
| Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS; |
| break; |
| } |
| } |
| |
| 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", |
| uiSearchRuleIndex, |
| Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport, |
| Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport); |
| |
| //Store IP Version used |
| //Get The Version Of IP used (IPv6 or IPv4) from CSSpecification field of SF |
| if(Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport == IPV6_CS) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion = IPV6; |
| } |
| else |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion = IPV4; |
| } |
| |
| /* To ensure that the ETH CS code doesn't gets executed if the BS doesn't supports ETH CS */ |
| if(!Adapter->bETHCSEnabled) |
| Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = 0; |
| |
| if(psfLocalSet->u8ServiceClassNameLength > 0 && |
| psfLocalSet->u8ServiceClassNameLength < 32) |
| { |
| memcpy(Adapter->PackInfo[uiSearchRuleIndex].ucServiceClassName, |
| psfLocalSet->u8ServiceClassName, |
| psfLocalSet->u8ServiceClassNameLength); |
| } |
| Adapter->PackInfo[uiSearchRuleIndex].u8QueueType = |
| psfLocalSet->u8ServiceFlowSchedulingType; |
| |
| if(Adapter->PackInfo[uiSearchRuleIndex].u8QueueType==BE && |
| Adapter->PackInfo[uiSearchRuleIndex].ucDirection) |
| { |
| Adapter->usBestEffortQueueIndex=uiSearchRuleIndex; |
| } |
| |
| Adapter->PackInfo[uiSearchRuleIndex].ulSFID = ntohl(psfLocalSet->u32SFID); |
| |
| Adapter->PackInfo[uiSearchRuleIndex].u8TrafficPriority = psfLocalSet->u8TrafficPriority; |
| |
| //copy all the classifier in the Service Flow param structure |
| for(nIndex=0; nIndex<psfLocalSet->u8TotalClassifiers; nIndex++) |
| { |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Classifier index =%d",nIndex); |
| psfCSType = &psfLocalSet->cConvergenceSLTypes[nIndex]; |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Classifier index =%d",nIndex); |
| |
| if(psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bClassifierPriority=TRUE; |
| } |
| |
| if(psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bClassifierPriority=TRUE; |
| } |
| |
| |
| if(ucDsxType== DSA_ACK) |
| { |
| eClassifierAction = eAddClassifier; |
| } |
| else if(ucDsxType == DSC_ACK) |
| { |
| switch(psfCSType->u8ClassfierDSCAction) |
| { |
| case 0://DSC Add Classifier |
| { |
| eClassifierAction = eAddClassifier; |
| } |
| break; |
| case 1://DSC Replace Classifier |
| { |
| eClassifierAction = eReplaceClassifier; |
| } |
| break; |
| case 2://DSC Delete Classifier |
| { |
| eClassifierAction = eDeleteClassifier; |
| |
| } |
| break; |
| default: |
| { |
| eClassifierAction = eInvalidClassifierAction; |
| } |
| } |
| } |
| |
| u16PacketClassificationRuleIndex = ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex); |
| |
| switch(eClassifierAction) |
| { |
| case eAddClassifier: |
| { |
| //Get a Free Classifier Index From Classifier table for this SF to add the Classifier |
| //Contained in this message |
| nClassifierIndex = SearchClsid(Adapter,ulSFID,u16PacketClassificationRuleIndex); |
| |
| if(nClassifierIndex > MAX_CLASSIFIERS) |
| { |
| nClassifierIndex = SearchFreeClsid(Adapter); |
| if(nClassifierIndex > MAX_CLASSIFIERS) |
| { |
| //Failed To get a free Entry |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Error Failed To get a free Classifier Entry"); |
| break; |
| } |
| //Copy the Classifier Rule for this service flow into our Classifier table maintained per SF. |
| CopyClassifierRuleToSF(Adapter,psfCSType,uiSearchRuleIndex,nClassifierIndex); |
| } |
| |
| else |
| { |
| //This Classifier Already Exists and it is invalid to Add Classifier with existing PCRI |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"CopyToAdapter : Error The Specified Classifier Already Exists \ |
| and attempted To Add Classifier with Same PCRI : 0x%x\n", u16PacketClassificationRuleIndex); |
| } |
| } |
| break; |
| |
| case eReplaceClassifier: |
| { |
| //Get the Classifier Index From Classifier table for this SF and replace existing Classifier |
| //with the new classifier Contained in this message |
| nClassifierIndex = SearchClsid(Adapter,ulSFID,u16PacketClassificationRuleIndex); |
| if(nClassifierIndex > MAX_CLASSIFIERS) |
| { |
| //Failed To search the classifier |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Error Search for Classifier To be replaced failed"); |
| break; |
| } |
| //Copy the Classifier Rule for this service flow into our Classifier table maintained per SF. |
| CopyClassifierRuleToSF(Adapter,psfCSType,uiSearchRuleIndex,nClassifierIndex); |
| } |
| break; |
| |
| case eDeleteClassifier: |
| { |
| //Get the Classifier Index From Classifier table for this SF and replace existing Classifier |
| //with the new classifier Contained in this message |
| nClassifierIndex = SearchClsid(Adapter,ulSFID,u16PacketClassificationRuleIndex); |
| if(nClassifierIndex > MAX_CLASSIFIERS) |
| { |
| //Failed To search the classifier |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Error Search for Classifier To be deleted failed"); |
| break; |
| } |
| |
| //Delete This classifier |
| DeleteClassifierRuleFromSF(Adapter,uiSearchRuleIndex,nClassifierIndex); |
| } |
| break; |
| |
| default: |
| { |
| //Invalid Action for classifier |
| break; |
| } |
| } |
| } |
| |
| //Repeat parsing Classification Entries to process PHS Rules |
| for(nIndex=0; nIndex < psfLocalSet->u8TotalClassifiers; nIndex++) |
| { |
| psfCSType = &psfLocalSet->cConvergenceSLTypes[nIndex]; |
| |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "psfCSType->u8PhsDSCAction : 0x%x\n", |
| psfCSType->u8PhsDSCAction ); |
| |
| switch (psfCSType->u8PhsDSCAction) |
| { |
| case eDeleteAllPHSRules: |
| { |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Deleting All PHS Rules For VCID: 0x%X\n",uVCID); |
| |
| //Delete All the PHS rules for this Service flow |
| |
| PhsDeleteSFRules( |
| &Adapter->stBCMPhsContext, |
| uVCID); |
| |
| break; |
| } |
| case eDeletePHSRule: |
| { |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"PHS DSC Action = Delete PHS Rule \n"); |
| |
| if(psfCSType->cPhsRule.u8PHSI) |
| { |
| PhsDeletePHSRule( |
| &Adapter->stBCMPhsContext, |
| uVCID, |
| psfCSType->cCPacketClassificationRule.u8AssociatedPHSI); |
| } |
| else |
| { |
| //BCM_DEBUG_PRINT(CONN_MSG,("Error CPHSRule.PHSI is ZERO \n")); |
| } |
| break; |
| } |
| default : |
| { |
| if(ucDsxType == DSC_ACK) |
| { |
| //BCM_DEBUG_PRINT(CONN_MSG,("Invalid PHS DSC Action For DSC \n",psfCSType->cPhsRule.u8PHSI)); |
| break; //FOr DSC ACK Case PHS DSC Action must be in valid set |
| } |
| } |
| //Proceed To Add PHS rule for DSA_ACK case even if PHS DSC action is unspecified |
| //No Break Here . Intentionally! |
| |
| case eAddPHSRule: |
| case eSetPHSRule: |
| { |
| if(psfCSType->cPhsRule.u8PHSI) |
| { |
| //Apply This PHS Rule to all classifiers whose Associated PHSI Match |
| unsigned int uiClassifierIndex = 0; |
| if(pstAddIndication->u8Direction == UPLINK_DIR ) |
| { |
| for(uiClassifierIndex=0;uiClassifierIndex<MAX_CLASSIFIERS;uiClassifierIndex++) |
| { |
| if((Adapter->astClassifierTable[uiClassifierIndex].bUsed) && |
| (Adapter->astClassifierTable[uiClassifierIndex].ulSFID == Adapter->PackInfo[uiSearchRuleIndex].ulSFID) && |
| (Adapter->astClassifierTable[uiClassifierIndex].u8AssociatedPHSI == psfCSType->cPhsRule.u8PHSI)) |
| { |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Adding PHS Rule For Classifier : 0x%x cPhsRule.u8PHSI : 0x%x\n", |
| Adapter->astClassifierTable[uiClassifierIndex].uiClassifierRuleIndex, |
| psfCSType->cPhsRule.u8PHSI); |
| //Update The PHS Rule for this classifier as Associated PHSI id defined |
| |
| //Copy the PHS Rule |
| sPhsRule.u8PHSI = psfCSType->cPhsRule.u8PHSI; |
| sPhsRule.u8PHSFLength = psfCSType->cPhsRule.u8PHSFLength; |
| sPhsRule.u8PHSMLength = psfCSType->cPhsRule.u8PHSMLength; |
| sPhsRule.u8PHSS = psfCSType->cPhsRule.u8PHSS; |
| sPhsRule.u8PHSV = psfCSType->cPhsRule.u8PHSV; |
| memcpy(sPhsRule.u8PHSF,psfCSType->cPhsRule.u8PHSF,MAX_PHS_LENGTHS); |
| memcpy(sPhsRule.u8PHSM,psfCSType->cPhsRule.u8PHSM,MAX_PHS_LENGTHS); |
| sPhsRule.u8RefCnt = 0; |
| sPhsRule.bUnclassifiedPHSRule = FALSE; |
| sPhsRule.PHSModifiedBytes = 0; |
| sPhsRule.PHSModifiedNumPackets = 0; |
| sPhsRule.PHSErrorNumPackets = 0; |
| |
| //bPHSRuleAssociated = TRUE; |
| //Store The PHS Rule for this classifier |
| |
| PhsUpdateClassifierRule( |
| &Adapter->stBCMPhsContext, |
| uVCID, |
| Adapter->astClassifierTable[uiClassifierIndex].uiClassifierRuleIndex, |
| &sPhsRule, |
| Adapter->astClassifierTable[uiClassifierIndex].u8AssociatedPHSI); |
| |
| //Update PHS Rule For the Classifier |
| if(sPhsRule.u8PHSI) |
| { |
| Adapter->astClassifierTable[uiClassifierIndex].u32PHSRuleID = sPhsRule.u8PHSI; |
| memcpy(&Adapter->astClassifierTable[uiClassifierIndex].sPhsRule,&sPhsRule,sizeof(S_PHS_RULE)); |
| } |
| |
| } |
| } |
| } |
| else |
| { |
| //Error PHS Rule specified in signaling could not be applied to any classifier |
| |
| //Copy the PHS Rule |
| sPhsRule.u8PHSI = psfCSType->cPhsRule.u8PHSI; |
| sPhsRule.u8PHSFLength = psfCSType->cPhsRule.u8PHSFLength; |
| sPhsRule.u8PHSMLength = psfCSType->cPhsRule.u8PHSMLength; |
| sPhsRule.u8PHSS = psfCSType->cPhsRule.u8PHSS; |
| sPhsRule.u8PHSV = psfCSType->cPhsRule.u8PHSV; |
| memcpy(sPhsRule.u8PHSF,psfCSType->cPhsRule.u8PHSF,MAX_PHS_LENGTHS); |
| memcpy(sPhsRule.u8PHSM,psfCSType->cPhsRule.u8PHSM,MAX_PHS_LENGTHS); |
| sPhsRule.u8RefCnt = 0; |
| sPhsRule.bUnclassifiedPHSRule = TRUE; |
| sPhsRule.PHSModifiedBytes = 0; |
| sPhsRule.PHSModifiedNumPackets = 0; |
| sPhsRule.PHSErrorNumPackets = 0; |
| //Store The PHS Rule for this classifier |
| |
| /* |
| Passing the argument u8PHSI instead of clsid. Because for DL with no classifier rule, |
| clsid will be zero hence we cant have multiple PHS rules for the same SF. |
| To support multiple PHS rule, passing u8PHSI. |
| */ |
| |
| PhsUpdateClassifierRule( |
| &Adapter->stBCMPhsContext, |
| uVCID, |
| sPhsRule.u8PHSI, |
| &sPhsRule, |
| sPhsRule.u8PHSI); |
| |
| } |
| |
| } |
| } |
| break; |
| } |
| } |
| |
| if(psfLocalSet->u32MaxSustainedTrafficRate == 0 ) |
| { |
| //No Rate Limit . Set Max Sustained Traffic Rate to Maximum |
| Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate = |
| WIMAX_MAX_ALLOWED_RATE; |
| |
| } |
| else if (ntohl(psfLocalSet->u32MaxSustainedTrafficRate) > |
| WIMAX_MAX_ALLOWED_RATE) |
| { |
| //Too large Allowed Rate specified. Limiting to Wi Max Allowed rate |
| Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate = |
| WIMAX_MAX_ALLOWED_RATE; |
| } |
| else |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate = |
| ntohl(psfLocalSet->u32MaxSustainedTrafficRate); |
| } |
| |
| Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency = ntohl(psfLocalSet->u32MaximumLatency); |
| |
| if(Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency == 0) /* 0 should be treated as infinite */ |
| Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency = MAX_LATENCY_ALLOWED; |
| |
| |
| if(( Adapter->PackInfo[uiSearchRuleIndex].u8QueueType == ERTPS || |
| Adapter->PackInfo[uiSearchRuleIndex].u8QueueType == UGS ) ) |
| UGIValue = ntohs(psfLocalSet->u16UnsolicitedGrantInterval); |
| |
| if(UGIValue == 0) |
| UGIValue = DEFAULT_UG_INTERVAL; |
| |
| /* |
| For UGI based connections... |
| DEFAULT_UGI_FACTOR*UGIInterval worth of data is the max token count at host... |
| The extra amount of token is to ensure that a large amount of jitter won't have loss in throughput... |
| In case of non-UGI based connection, 200 frames worth of data is the max token count at host... |
| */ |
| |
| Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize = |
| (DEFAULT_UGI_FACTOR*Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate*UGIValue)/1000; |
| |
| if(Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize < WIMAX_MAX_MTU*8) |
| { |
| UINT UGIFactor = 0; |
| /* Special Handling to ensure the biggest size of packet can go out from host to FW as follows: |
| 1. Any packet from Host to FW can go out in different packet size. |
| 2. So in case the Bucket count is smaller than MTU, the packets of size (Size > TokenCount), will get dropped. |
| 3. We can allow packets of MaxSize from Host->FW that can go out from FW in multiple SDUs by fragmentation at Wimax Layer |
| */ |
| UGIFactor = (Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency/UGIValue + 1); |
| |
| if(UGIFactor > DEFAULT_UGI_FACTOR) |
| Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize = |
| (UGIFactor*Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate*UGIValue)/1000; |
| |
| if(Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize > WIMAX_MAX_MTU*8) |
| Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize = WIMAX_MAX_MTU*8; |
| } |
| |
| |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"LAT: %d, UGI: %d \n", Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency, UGIValue); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"uiMaxAllowedRate: 0x%x, u32MaxSustainedTrafficRate: 0x%x ,uiMaxBucketSize: 0x%x", |
| Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate, |
| ntohl(psfLocalSet->u32MaxSustainedTrafficRate), |
| Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize); |
| |
| //copy the extended SF Parameters to Support MIBS |
| CopyMIBSExtendedSFParameters(Adapter,psfLocalSet,uiSearchRuleIndex); |
| |
| //store header suppression enabled flag per SF |
| Adapter->PackInfo[uiSearchRuleIndex].bHeaderSuppressionEnabled = |
| !(psfLocalSet->u8RequesttransmissionPolicy & |
| MASK_DISABLE_HEADER_SUPPRESSION); |
| |
| kfree(Adapter->PackInfo[uiSearchRuleIndex].pstSFIndication); |
| Adapter->PackInfo[uiSearchRuleIndex].pstSFIndication = pstAddIndication; |
| |
| //Re Sort the SF list in PackInfo according to Traffic Priority |
| SortPackInfo(Adapter); |
| |
| /* Re Sort the Classifier Rules table and re - arrange |
| according to Classifier Rule Priority */ |
| SortClassifiers(Adapter); |
| |
| DumpPhsRules(&Adapter->stBCMPhsContext); |
| |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"%s <=====", __FUNCTION__); |
| } |
| |
| |
| /*********************************************************************** |
| * Function - DumpCmControlPacket |
| * |
| * Description - This routinue Dumps the Contents of the AddIndication |
| * Structure in the Connection Management Control Packet |
| * |
| * Parameter - pvBuffer: Pointer to the buffer containing the |
| * AddIndication data. |
| * |
| * Returns - None |
| *************************************************************************/ |
| static VOID DumpCmControlPacket(PVOID pvBuffer) |
| { |
| UINT uiLoopIndex; |
| UINT nIndex; |
| stLocalSFAddIndicationAlt *pstAddIndication; |
| UINT nCurClassifierCnt; |
| PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev); |
| |
| pstAddIndication = (stLocalSFAddIndicationAlt *)pvBuffer; |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "======>"); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Type : 0x%X",pstAddIndication->u8Type); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Direction : 0x%X",pstAddIndication->u8Direction); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TID: 0x%X", ntohs(pstAddIndication->u16TID)); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID : 0x%X",ntohs(pstAddIndication->u16CID)); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VCID : 0x%X",ntohs(pstAddIndication->u16VCID)); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " AuthorizedSet--->"); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID : 0x%X",htonl(pstAddIndication->sfAuthorizedSet.u32SFID)); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID : 0x%X",htons(pstAddIndication->sfAuthorizedSet.u16CID)); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8ServiceClassNameLength); |
| |
| 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", |
| pstAddIndication->sfAuthorizedSet.u8ServiceClassName[0], |
| pstAddIndication->sfAuthorizedSet.u8ServiceClassName[1], |
| pstAddIndication->sfAuthorizedSet.u8ServiceClassName[2], |
| pstAddIndication->sfAuthorizedSet.u8ServiceClassName[3], |
| pstAddIndication->sfAuthorizedSet.u8ServiceClassName[4], |
| pstAddIndication->sfAuthorizedSet.u8ServiceClassName[5]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8MBSService); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8QosParamSet); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority : 0x%X, %p", |
| pstAddIndication->sfAuthorizedSet.u8TrafficPriority, &pstAddIndication->sfAuthorizedSet.u8TrafficPriority); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxSustainedTrafficRate : 0x%X 0x%p", |
| pstAddIndication->sfAuthorizedSet.u32MaxSustainedTrafficRate, |
| &pstAddIndication->sfAuthorizedSet.u32MaxSustainedTrafficRate); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u32MaxTrafficBurst); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u32MinReservedTrafficRate); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8VendorSpecificQoSParamLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8VendorSpecificQoSParam[0]); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8ServiceFlowSchedulingType); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u32ToleratedJitter); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u32MaximumLatency); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8FixedLengthVSVariableLengthSDUIndicator); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8SDUSize); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TargetSAID : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u16TargetSAID); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQEnable : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8ARQEnable); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQWindowSize : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u16ARQWindowSize); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryTxTimeOut : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u16ARQRetryTxTimeOut); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryRxTimeOut : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u16ARQRetryRxTimeOut); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockLifeTime : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u16ARQBlockLifeTime); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQSyncLossTimeOut : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u16ARQSyncLossTimeOut); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQDeliverInOrder : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8ARQDeliverInOrder); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRxPurgeTimeOut : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u16ARQRxPurgeTimeOut); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockSize : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u16ARQBlockSize); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8CSSpecification : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8CSSpecification); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TypeOfDataDeliveryService : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8TypeOfDataDeliveryService); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16SDUInterArrivalTime : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u16SDUInterArrivalTime); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TimeBase : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u16TimeBase); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8PagingPreference : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8PagingPreference); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UnsolicitedPollingInterval : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u16UnsolicitedPollingInterval); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "sfAuthorizedSet.u8HARQChannelMapping %x %x %x ", |
| *(unsigned int*)pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping, |
| *(unsigned int*)&pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping[4], |
| *(USHORT*) &pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping[8]); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficIndicationPreference : 0x%X", |
| pstAddIndication->sfAuthorizedSet.u8TrafficIndicationPreference); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Recieved : 0x%X",pstAddIndication->sfAuthorizedSet.u8TotalClassifiers); |
| |
| nCurClassifierCnt = pstAddIndication->sfAuthorizedSet.u8TotalClassifiers; |
| |
| if(nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF) |
| { |
| nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF; |
| } |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "pstAddIndication->sfAuthorizedSet.bValid %d", pstAddIndication->sfAuthorizedSet.bValid); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "pstAddIndication->sfAuthorizedSet.u16MacOverhead %x", pstAddIndication->sfAuthorizedSet.u16MacOverhead); |
| if(!pstAddIndication->sfAuthorizedSet.bValid) |
| pstAddIndication->sfAuthorizedSet.bValid=1; |
| for(nIndex = 0 ; nIndex < nCurClassifierCnt ; nIndex++) |
| { |
| stConvergenceSLTypes *psfCSType = NULL; |
| psfCSType = &pstAddIndication->sfAuthorizedSet.cConvergenceSLTypes[nIndex]; |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "psfCSType = %p", psfCSType); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "CCPacketClassificationRuleSI====>"); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ClassifierRulePriority :0x%X ", |
| psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfServiceLength :0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfService[3] :0x%X ,0x%X ,0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0], |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1], |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2]); |
| |
| for(uiLoopIndex=0; uiLoopIndex < 1; uiLoopIndex++) |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Protocol : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8Protocol); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength :0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength); |
| |
| for(uiLoopIndex=0; uiLoopIndex < 32; uiLoopIndex++) |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32] : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength : 0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength); |
| |
| for(uiLoopIndex=0; uiLoopIndex < 32; uiLoopIndex++) |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddress[32] : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRangeLength:0x%X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRange[4]: 0x%02X ,0x%02X ,0x%02X ,0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[0], |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[1], |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[2], |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[3]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRangeLength : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRange[4]: 0x%02X ,0x%02X ,0x%02X ,0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[0], |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[1], |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[2], |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[3]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddressLength : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddress[6] : 0x %02X %02X %02X %02X %02X %02X", |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[0], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[1], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[2], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[3], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[4], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[5]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddressLength : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddress[6] : 0x %02X %02X %02X %02X %02X %02X", |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[0], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[1], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[2], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[3], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[4], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[5]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthertypeLength : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8EthertypeLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Ethertype[3] : 0x%02X ,0x%02X ,0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8Ethertype[0], |
| psfCSType->cCPacketClassificationRule.u8Ethertype[1], |
| psfCSType->cCPacketClassificationRule.u8Ethertype[2]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UserPriority : 0x%X ", |
| psfCSType->cCPacketClassificationRule.u16UserPriority); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VLANID : 0x%X ", |
| psfCSType->cCPacketClassificationRule.u16VLANID); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8AssociatedPHSI : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8AssociatedPHSI); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16PacketClassificationRuleIndex : 0x%X ", |
| psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParamLength : 0x%X ", |
| psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParam[1] : 0x%X ", |
| psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]); |
| #ifdef VERSION_D5 |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLableLength :0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLable[6] : 0x %02X %02X %02X %02X %02X %02X ", |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[0], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[1], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[2], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[3], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[4], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[5]); |
| #endif |
| } |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "bValid : 0x%02X",pstAddIndication->sfAuthorizedSet.bValid); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "AdmittedSet--->"); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID : 0x%X",pstAddIndication->sfAdmittedSet.u32SFID); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID : 0x%X",pstAddIndication->sfAdmittedSet.u16CID); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength : 0x%X", |
| pstAddIndication->sfAdmittedSet.u8ServiceClassNameLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassName : 0x %02X %02X %02X %02X %02X %02X", |
| pstAddIndication->sfAdmittedSet.u8ServiceClassName[0], |
| pstAddIndication->sfAdmittedSet.u8ServiceClassName[1], |
| pstAddIndication->sfAdmittedSet.u8ServiceClassName[2], |
| pstAddIndication->sfAdmittedSet.u8ServiceClassName[3], |
| pstAddIndication->sfAdmittedSet.u8ServiceClassName[4], |
| pstAddIndication->sfAdmittedSet.u8ServiceClassName[5]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8MBSService); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8QosParamSet); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8TrafficPriority); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst : 0x%X", |
| pstAddIndication->sfAdmittedSet.u32MaxTrafficBurst); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate : 0x%X", |
| pstAddIndication->sfAdmittedSet.u32MinReservedTrafficRate); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8VendorSpecificQoSParamLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8VendorSpecificQoSParam[0]); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8ServiceFlowSchedulingType); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter : 0x%X", |
| pstAddIndication->sfAdmittedSet.u32ToleratedJitter); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency : 0x%X", |
| pstAddIndication->sfAdmittedSet.u32MaximumLatency); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8FixedLengthVSVariableLengthSDUIndicator); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8SDUSize); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TargetSAID : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u16TargetSAID); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQEnable : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8ARQEnable); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQWindowSize : 0x%X", |
| pstAddIndication->sfAdmittedSet.u16ARQWindowSize); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryTxTimeOut : 0x%X", |
| pstAddIndication->sfAdmittedSet.u16ARQRetryTxTimeOut); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryRxTimeOut : 0x%X", |
| pstAddIndication->sfAdmittedSet.u16ARQRetryRxTimeOut); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockLifeTime : 0x%X", |
| pstAddIndication->sfAdmittedSet.u16ARQBlockLifeTime); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQSyncLossTimeOut : 0x%X", |
| pstAddIndication->sfAdmittedSet.u16ARQSyncLossTimeOut); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQDeliverInOrder : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8ARQDeliverInOrder); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRxPurgeTimeOut : 0x%X", |
| pstAddIndication->sfAdmittedSet.u16ARQRxPurgeTimeOut); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockSize : 0x%X", |
| pstAddIndication->sfAdmittedSet.u16ARQBlockSize); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8CSSpecification : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8CSSpecification); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TypeOfDataDeliveryService : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8TypeOfDataDeliveryService); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16SDUInterArrivalTime : 0x%X", |
| pstAddIndication->sfAdmittedSet.u16SDUInterArrivalTime); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TimeBase : 0x%X", |
| pstAddIndication->sfAdmittedSet.u16TimeBase); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8PagingPreference : 0x%X", |
| pstAddIndication->sfAdmittedSet.u8PagingPreference); |
| |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficIndicationPreference : 0x%02X", |
| pstAddIndication->sfAdmittedSet.u8TrafficIndicationPreference); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Recieved : 0x%X",pstAddIndication->sfAdmittedSet.u8TotalClassifiers); |
| |
| nCurClassifierCnt = pstAddIndication->sfAdmittedSet.u8TotalClassifiers; |
| |
| if(nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF) |
| { |
| nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF; |
| } |
| |
| |
| for(nIndex = 0 ; nIndex < nCurClassifierCnt ; nIndex++) |
| { |
| |
| stConvergenceSLTypes *psfCSType = NULL; |
| psfCSType = &pstAddIndication->sfAdmittedSet.cConvergenceSLTypes[nIndex]; |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " CCPacketClassificationRuleSI====>"); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ClassifierRulePriority :0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfServiceLength :0x%02X", |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfService[3] :0x%02X %02X %02X", |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0], |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1], |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2]); |
| for(uiLoopIndex=0; uiLoopIndex < 1; uiLoopIndex++) |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Protocol: 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8Protocol); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength :0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength); |
| |
| for(uiLoopIndex=0; uiLoopIndex < 32; uiLoopIndex++) |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32] : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength); |
| |
| for(uiLoopIndex=0; uiLoopIndex < 32; uiLoopIndex++) |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddress[32] : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRangeLength : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRange[4] : 0x %02X %02X %02X %02X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[0], |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[1], |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[2], |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[3]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRangeLength : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRange[4] : 0x %02X %02X %02X %02X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[0], |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[1], |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[2], |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[3]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddressLength : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddress[6] : 0x %02X %02X %02X %02X %02X %02X", |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[0], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[1], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[2], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[3], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[4], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[5]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddressLength : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddress[6] : 0x %02X %02X %02X %02X %02X %02X", |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[0], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[1], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[2], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[3], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[4], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[5]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthertypeLength : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8EthertypeLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Ethertype[3] : 0x%02X %02X %02X", |
| psfCSType->cCPacketClassificationRule.u8Ethertype[0], |
| psfCSType->cCPacketClassificationRule.u8Ethertype[1], |
| psfCSType->cCPacketClassificationRule.u8Ethertype[2]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UserPriority : 0x%X ", |
| psfCSType->cCPacketClassificationRule.u16UserPriority); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VLANID : 0x%X ", |
| psfCSType->cCPacketClassificationRule.u16VLANID); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8AssociatedPHSI : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8AssociatedPHSI); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16PacketClassificationRuleIndex : 0x%X ", |
| psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParamLength : 0x%02X", |
| psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParam[1] : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]); |
| #ifdef VERSION_D5 |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLableLength : 0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLable[6] : 0x %02X %02X %02X %02X %02X %02X ", |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[0], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[1], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[2], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[3], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[4], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[5]); |
| #endif |
| } |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "bValid : 0x%X",pstAddIndication->sfAdmittedSet.bValid); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " ActiveSet--->"); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID : 0x%X",pstAddIndication->sfActiveSet.u32SFID); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID : 0x%X",pstAddIndication->sfActiveSet.u16CID); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength : 0x%X", |
| pstAddIndication->sfActiveSet.u8ServiceClassNameLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassName : 0x %02X %02X %02X %02X %02X %02X", |
| pstAddIndication->sfActiveSet.u8ServiceClassName[0], |
| pstAddIndication->sfActiveSet.u8ServiceClassName[1], |
| pstAddIndication->sfActiveSet.u8ServiceClassName[2], |
| pstAddIndication->sfActiveSet.u8ServiceClassName[3], |
| pstAddIndication->sfActiveSet.u8ServiceClassName[4], |
| pstAddIndication->sfActiveSet.u8ServiceClassName[5]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService : 0x%02X", |
| pstAddIndication->sfActiveSet.u8MBSService); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet : 0x%02X", |
| pstAddIndication->sfActiveSet.u8QosParamSet); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority : 0x%02X", |
| pstAddIndication->sfActiveSet.u8TrafficPriority); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst : 0x%X", |
| pstAddIndication->sfActiveSet.u32MaxTrafficBurst); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate : 0x%X", |
| pstAddIndication->sfActiveSet.u32MinReservedTrafficRate); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength : 0x%02X", |
| pstAddIndication->sfActiveSet.u8VendorSpecificQoSParamLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam : 0x%02X", |
| pstAddIndication->sfActiveSet.u8VendorSpecificQoSParam[0]); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType : 0x%02X", |
| pstAddIndication->sfActiveSet.u8ServiceFlowSchedulingType); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter : 0x%X", |
| pstAddIndication->sfActiveSet.u32ToleratedJitter); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency : 0x%X", |
| pstAddIndication->sfActiveSet.u32MaximumLatency); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%02X", |
| pstAddIndication->sfActiveSet.u8FixedLengthVSVariableLengthSDUIndicator); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize : 0x%X", |
| pstAddIndication->sfActiveSet.u8SDUSize); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16TargetSAID : 0x%X", |
| pstAddIndication->sfActiveSet.u16TargetSAID); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ARQEnable : 0x%X", |
| pstAddIndication->sfActiveSet.u8ARQEnable); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQWindowSize : 0x%X", |
| pstAddIndication->sfActiveSet.u16ARQWindowSize); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRetryTxTimeOut : 0x%X", |
| pstAddIndication->sfActiveSet.u16ARQRetryTxTimeOut); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRetryRxTimeOut : 0x%X", |
| pstAddIndication->sfActiveSet.u16ARQRetryRxTimeOut); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQBlockLifeTime : 0x%X", |
| pstAddIndication->sfActiveSet.u16ARQBlockLifeTime); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQSyncLossTimeOut : 0x%X", |
| pstAddIndication->sfActiveSet.u16ARQSyncLossTimeOut); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ARQDeliverInOrder : 0x%X", |
| pstAddIndication->sfActiveSet.u8ARQDeliverInOrder); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRxPurgeTimeOut : 0x%X", |
| pstAddIndication->sfActiveSet.u16ARQRxPurgeTimeOut); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQBlockSize : 0x%X", |
| pstAddIndication->sfActiveSet.u16ARQBlockSize); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8CSSpecification : 0x%X", |
| pstAddIndication->sfActiveSet.u8CSSpecification); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8TypeOfDataDeliveryService : 0x%X", |
| pstAddIndication->sfActiveSet.u8TypeOfDataDeliveryService); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16SDUInterArrivalTime : 0x%X", |
| pstAddIndication->sfActiveSet.u16SDUInterArrivalTime); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16TimeBase : 0x%X", |
| pstAddIndication->sfActiveSet.u16TimeBase); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8PagingPreference : 0x%X", |
| pstAddIndication->sfActiveSet.u8PagingPreference); |
| |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8TrafficIndicationPreference : 0x%X", |
| pstAddIndication->sfActiveSet.u8TrafficIndicationPreference); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Recieved : 0x%X",pstAddIndication->sfActiveSet.u8TotalClassifiers); |
| |
| nCurClassifierCnt = pstAddIndication->sfActiveSet.u8TotalClassifiers; |
| |
| if(nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF) |
| { |
| nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF; |
| } |
| |
| for(nIndex = 0 ; nIndex < nCurClassifierCnt ; nIndex++) |
| { |
| |
| stConvergenceSLTypes *psfCSType = NULL; |
| psfCSType = &pstAddIndication->sfActiveSet.cConvergenceSLTypes[nIndex]; |
| |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " CCPacketClassificationRuleSI====>"); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ClassifierRulePriority :0x%X ", |
| psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPTypeOfServiceLength :0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPTypeOfService[3] :0x%X ,0x%X ,0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0], |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1], |
| psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2]); |
| for(uiLoopIndex=0; uiLoopIndex < 1; uiLoopIndex++) |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8Protocol : 0x%X ", |
| psfCSType->cCPacketClassificationRule.u8Protocol); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength :0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength); |
| |
| for(uiLoopIndex=0; uiLoopIndex < 32; uiLoopIndex++) |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32]:0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength : 0x%02X ", |
| psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength); |
| |
| for(uiLoopIndex=0;uiLoopIndex<32;uiLoopIndex++) |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPDestinationAddress[32]:0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolSourcePortRangeLength:0x%X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolSourcePortRange[4]:0x%X ,0x%X ,0x%X ,0x%X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[0], |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[1], |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[2], |
| psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[3]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolDestPortRangeLength:0x%X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolDestPortRange[4]:0x%X ,0x%X ,0x%X ,0x%X ", |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[0], |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[1], |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[2], |
| psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[3]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthernetDestMacAddressLength:0x%X ", |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength); |
| |
| 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", |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[0], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[1], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[2], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[3], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[4], |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[5]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthernetSourceMACAddressLength:0x%X ", |
| psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength); |
| |
| 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", |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[0], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[1], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[2], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[3], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[4], |
| psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[5]); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthertypeLength :0x%X ", |
| psfCSType->cCPacketClassificationRule.u8EthertypeLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8Ethertype[3] :0x%X ,0x%X ,0x%X ", |
| psfCSType->cCPacketClassificationRule.u8Ethertype[0], |
| psfCSType->cCPacketClassificationRule.u8Ethertype[1], |
| psfCSType->cCPacketClassificationRule.u8Ethertype[2]); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16UserPriority :0x%X ", |
| psfCSType->cCPacketClassificationRule.u16UserPriority); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16VLANID :0x%X ", |
| psfCSType->cCPacketClassificationRule.u16VLANID); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8AssociatedPHSI :0x%X ", |
| psfCSType->cCPacketClassificationRule.u8AssociatedPHSI); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16PacketClassificationRuleIndex:0x%X ", |
| psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8VendorSpecificClassifierParamLength:0x%X ", |
| psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8VendorSpecificClassifierParam[1]:0x%X ", |
| psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]); |
| #ifdef VERSION_D5 |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPv6FlowLableLength :0x%X ", |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength); |
| 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 ", |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[0], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[1], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[2], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[3], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[4], |
| psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[5]); |
| #endif |
| } |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " bValid : 0x%X",pstAddIndication->sfActiveSet.bValid); |
| |
| } |
| |
| static inline ULONG RestoreSFParam(PMINI_ADAPTER Adapter, ULONG ulAddrSFParamSet,PUCHAR pucDestBuffer) |
| { |
| UINT nBytesToRead = sizeof(stServiceFlowParamSI); |
| |
| if(ulAddrSFParamSet == 0 || NULL == pucDestBuffer) |
| { |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Got Param address as 0!!"); |
| return 0; |
| } |
| ulAddrSFParamSet = ntohl(ulAddrSFParamSet); |
| |
| //Read out the SF Param Set At the indicated Location |
| if(rdm(Adapter, ulAddrSFParamSet, (PUCHAR)pucDestBuffer, nBytesToRead) < 0) |
| return STATUS_FAILURE; |
| |
| return 1; |
| } |
| |
| |
| static ULONG StoreSFParam(PMINI_ADAPTER Adapter,PUCHAR pucSrcBuffer,ULONG ulAddrSFParamSet) |
| { |
| UINT nBytesToWrite = sizeof(stServiceFlowParamSI); |
| int ret = 0; |
| |
| if(ulAddrSFParamSet == 0 || NULL == pucSrcBuffer) |
| { |
| return 0; |
| } |
| |
| ret = wrm(Adapter, ulAddrSFParamSet, (u8 *)pucSrcBuffer, nBytesToWrite); |
| if (ret < 0) { |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "%s:%d WRM failed",__FUNCTION__, __LINE__); |
| return ret; |
| } |
| return 1; |
| } |
| |
| ULONG StoreCmControlResponseMessage(PMINI_ADAPTER Adapter,PVOID pvBuffer,UINT *puBufferLength) |
| { |
| stLocalSFAddIndicationAlt *pstAddIndicationAlt = NULL; |
| stLocalSFAddIndication * pstAddIndication = NULL; |
| stLocalSFDeleteRequest *pstDeletionRequest; |
| UINT uiSearchRuleIndex; |
| ULONG ulSFID; |
| |
| pstAddIndicationAlt = (stLocalSFAddIndicationAlt *)(pvBuffer); |
| |
| /* |
| * In case of DSD Req By MS, we should immediately delete this SF so that |
| * we can stop the further classifying the pkt for this SF. |
| */ |
| if(pstAddIndicationAlt->u8Type == DSD_REQ) |
| { |
| pstDeletionRequest = (stLocalSFDeleteRequest *)pvBuffer; |
| |
| ulSFID = ntohl(pstDeletionRequest->u32SFID); |
| uiSearchRuleIndex=SearchSfid(Adapter,ulSFID); |
| |
| if(uiSearchRuleIndex < NO_OF_QUEUES) |
| { |
| deleteSFBySfid(Adapter,uiSearchRuleIndex); |
| Adapter->u32TotalDSD++; |
| } |
| return 1; |
| } |
| |
| |
| if( (pstAddIndicationAlt->u8Type == DSD_RSP) || |
| (pstAddIndicationAlt->u8Type == DSD_ACK)) |
| { |
| //No Special handling send the message as it is |
| return 1; |
| } |
| // For DSA_REQ, only upto "psfAuthorizedSet" parameter should be accessed by driver! |
| |
| pstAddIndication=kmalloc(sizeof(*pstAddIndication), GFP_KERNEL); |
| if(NULL==pstAddIndication) |
| return 0; |
| |
| /* AUTHORIZED SET */ |
| pstAddIndication->psfAuthorizedSet = (stServiceFlowParamSI *) |
| GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID); |
| if(!pstAddIndication->psfAuthorizedSet) |
| return 0; |
| |
| if(StoreSFParam(Adapter,(PUCHAR)&pstAddIndicationAlt->sfAuthorizedSet, |
| (ULONG)pstAddIndication->psfAuthorizedSet)!= 1) |
| return 0; |
| |
| /* this can't possibly be right */ |
| pstAddIndication->psfAuthorizedSet = (stServiceFlowParamSI *)ntohl((ULONG)pstAddIndication->psfAuthorizedSet); |
| |
| if(pstAddIndicationAlt->u8Type == DSA_REQ) |
| { |
| stLocalSFAddRequest AddRequest; |
| |
| AddRequest.u8Type = pstAddIndicationAlt->u8Type; |
| AddRequest.eConnectionDir = pstAddIndicationAlt->u8Direction; |
| AddRequest.u16TID = pstAddIndicationAlt->u16TID; |
| AddRequest.u16CID = pstAddIndicationAlt->u16CID; |
| AddRequest.u16VCID = pstAddIndicationAlt->u16VCID; |
| AddRequest.psfParameterSet =pstAddIndication->psfAuthorizedSet ; |
| (*puBufferLength) = sizeof(stLocalSFAddRequest); |
| memcpy(pvBuffer,&AddRequest,sizeof(stLocalSFAddRequest)); |
| return 1; |
| } |
| |
| // Since it's not DSA_REQ, we can access all field in pstAddIndicationAlt |
| |
| //We need to extract the structure from the buffer and pack it differently |
| |
| pstAddIndication->u8Type = pstAddIndicationAlt->u8Type; |
| pstAddIndication->eConnectionDir= pstAddIndicationAlt->u8Direction ; |
| pstAddIndication->u16TID = pstAddIndicationAlt->u16TID; |
| pstAddIndication->u16CID = pstAddIndicationAlt->u16CID; |
| pstAddIndication->u16VCID = pstAddIndicationAlt->u16VCID; |
| pstAddIndication->u8CC = pstAddIndicationAlt->u8CC; |
| |
| /* ADMITTED SET */ |
| pstAddIndication->psfAdmittedSet = (stServiceFlowParamSI *) |
| GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID); |
| if(!pstAddIndication->psfAdmittedSet) |
| return 0; |
| if(StoreSFParam(Adapter,(PUCHAR)&pstAddIndicationAlt->sfAdmittedSet,(ULONG)pstAddIndication->psfAdmittedSet) != 1) |
| return 0; |
| |
| pstAddIndication->psfAdmittedSet = (stServiceFlowParamSI *)ntohl((ULONG)pstAddIndication->psfAdmittedSet); |
| |
| |
| /* ACTIVE SET */ |
| pstAddIndication->psfActiveSet = (stServiceFlowParamSI *) |
| GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID); |
| if(!pstAddIndication->psfActiveSet) |
| return 0; |
| if(StoreSFParam(Adapter,(PUCHAR)&pstAddIndicationAlt->sfActiveSet,(ULONG)pstAddIndication->psfActiveSet) != 1) |
| return 0; |
| |
| pstAddIndication->psfActiveSet = (stServiceFlowParamSI *)ntohl((ULONG)pstAddIndication->psfActiveSet); |
| |
| (*puBufferLength) = sizeof(stLocalSFAddIndication); |
| *(stLocalSFAddIndication *)pvBuffer = *pstAddIndication; |
| kfree(pstAddIndication); |
| return 1; |
| } |
| |
| |
| static inline stLocalSFAddIndicationAlt |
| *RestoreCmControlResponseMessage(register PMINI_ADAPTER Adapter,register PVOID pvBuffer) |
| { |
| ULONG ulStatus=0; |
| stLocalSFAddIndication *pstAddIndication = NULL; |
| stLocalSFAddIndicationAlt *pstAddIndicationDest = NULL; |
| pstAddIndication = (stLocalSFAddIndication *)(pvBuffer); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "=====>" ); |
| if ((pstAddIndication->u8Type == DSD_REQ) || |
| (pstAddIndication->u8Type == DSD_RSP) || |
| (pstAddIndication->u8Type == DSD_ACK)) |
| { |
| return (stLocalSFAddIndicationAlt *)pvBuffer; |
| } |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Inside RestoreCmControlResponseMessage "); |
| /* |
| //Need to Allocate memory to contain the SUPER Large structures |
| //Our driver cant create these structures on Stack :( |
| */ |
| pstAddIndicationDest=kmalloc(sizeof(stLocalSFAddIndicationAlt), GFP_KERNEL); |
| |
| if(pstAddIndicationDest) |
| { |
| memset(pstAddIndicationDest,0,sizeof(stLocalSFAddIndicationAlt)); |
| } |
| else |
| { |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Failed to allocate memory for SF Add Indication Structure "); |
| return NULL; |
| } |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8Type : 0x%X",pstAddIndication->u8Type); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8Direction : 0x%X",pstAddIndication->eConnectionDir); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8TID : 0x%X",ntohs(pstAddIndication->u16TID)); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8CID : 0x%X",ntohs(pstAddIndication->u16CID)); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u16VCID : 0x%X",ntohs(pstAddIndication->u16VCID)); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-autorized set loc : %p",pstAddIndication->psfAuthorizedSet); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-admitted set loc : %p",pstAddIndication->psfAdmittedSet); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-Active set loc : %p",pstAddIndication->psfActiveSet); |
| |
| pstAddIndicationDest->u8Type = pstAddIndication->u8Type; |
| pstAddIndicationDest->u8Direction = pstAddIndication->eConnectionDir; |
| pstAddIndicationDest->u16TID = pstAddIndication->u16TID; |
| pstAddIndicationDest->u16CID = pstAddIndication->u16CID; |
| pstAddIndicationDest->u16VCID = pstAddIndication->u16VCID; |
| pstAddIndicationDest->u8CC = pstAddIndication->u8CC; |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Restoring Active Set "); |
| ulStatus=RestoreSFParam(Adapter,(ULONG)pstAddIndication->psfActiveSet, (PUCHAR)&pstAddIndicationDest->sfActiveSet); |
| if(ulStatus != 1) |
| { |
| goto failed_restore_sf_param; |
| } |
| if(pstAddIndicationDest->sfActiveSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF) |
| pstAddIndicationDest->sfActiveSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF; |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Restoring Admitted Set "); |
| ulStatus=RestoreSFParam(Adapter,(ULONG)pstAddIndication->psfAdmittedSet,(PUCHAR)&pstAddIndicationDest->sfAdmittedSet); |
| if(ulStatus != 1) |
| { |
| goto failed_restore_sf_param; |
| } |
| if(pstAddIndicationDest->sfAdmittedSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF) |
| pstAddIndicationDest->sfAdmittedSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF; |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Restoring Authorized Set "); |
| ulStatus=RestoreSFParam(Adapter,(ULONG)pstAddIndication->psfAuthorizedSet,(PUCHAR)&pstAddIndicationDest->sfAuthorizedSet); |
| if(ulStatus != 1) |
| { |
| goto failed_restore_sf_param; |
| } |
| if(pstAddIndicationDest->sfAuthorizedSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF) |
| pstAddIndicationDest->sfAuthorizedSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF; |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Dumping the whole raw packet"); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "============================================================"); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " pstAddIndicationDest->sfActiveSet size %zx %p", sizeof(*pstAddIndicationDest), pstAddIndicationDest); |
| //BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, (unsigned char *)pstAddIndicationDest, sizeof(*pstAddIndicationDest)); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "============================================================"); |
| return pstAddIndicationDest; |
| failed_restore_sf_param: |
| kfree(pstAddIndicationDest); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "<=====" ); |
| return NULL; |
| } |
| |
| ULONG SetUpTargetDsxBuffers(PMINI_ADAPTER Adapter) |
| { |
| ULONG ulTargetDsxBuffersBase = 0; |
| ULONG ulCntTargetBuffers; |
| ULONG ulIndex=0; |
| int Status; |
| |
| if (!Adapter) { |
| BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Adapter was NULL!!!"); |
| return 0; |
| } |
| |
| if(Adapter->astTargetDsxBuffer[0].ulTargetDsxBuffer) |
| return 1; |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Size of Each DSX Buffer(Also size of ServiceFlowParamSI): %zx ",sizeof(stServiceFlowParamSI)); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Reading DSX buffer From Target location %x ",DSX_MESSAGE_EXCHANGE_BUFFER); |
| |
| Status = rdmalt(Adapter, DSX_MESSAGE_EXCHANGE_BUFFER, |
| (PUINT)&ulTargetDsxBuffersBase, sizeof(UINT)); |
| if(Status < 0) |
| { |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "RDM failed!!"); |
| return 0; |
| } |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Base Address Of DSX Target Buffer : 0x%lx",ulTargetDsxBuffersBase); |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Tgt Buffer is Now %lx :",ulTargetDsxBuffersBase); |
| |
| ulCntTargetBuffers = DSX_MESSAGE_EXCHANGE_BUFFER_SIZE/sizeof(stServiceFlowParamSI); |
| |
| Adapter->ulTotalTargetBuffersAvailable = |
| ulCntTargetBuffers > MAX_TARGET_DSX_BUFFERS ? |
| MAX_TARGET_DSX_BUFFERS : ulCntTargetBuffers; |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " Total Target DSX Buffer setup %lx ",Adapter->ulTotalTargetBuffersAvailable); |
| |
| for(ulIndex=0; ulIndex < Adapter->ulTotalTargetBuffersAvailable ; ulIndex++) |
| { |
| Adapter->astTargetDsxBuffer[ulIndex].ulTargetDsxBuffer = ulTargetDsxBuffersBase; |
| Adapter->astTargetDsxBuffer[ulIndex].valid=1; |
| Adapter->astTargetDsxBuffer[ulIndex].tid=0; |
| ulTargetDsxBuffersBase+=sizeof(stServiceFlowParamSI); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " Target DSX Buffer %lx setup at 0x%lx", |
| ulIndex, Adapter->astTargetDsxBuffer[ulIndex].ulTargetDsxBuffer); |
| } |
| Adapter->ulCurrentTargetBuffer = 0; |
| Adapter->ulFreeTargetBufferCnt = Adapter->ulTotalTargetBuffersAvailable; |
| return 1; |
| } |
| |
| static ULONG GetNextTargetBufferLocation(PMINI_ADAPTER Adapter,B_UINT16 tid) |
| { |
| ULONG ulTargetDSXBufferAddress; |
| ULONG ulTargetDsxBufferIndexToUse,ulMaxTry; |
| |
| if((Adapter->ulTotalTargetBuffersAvailable == 0)|| |
| (Adapter->ulFreeTargetBufferCnt == 0)) |
| { |
| ClearTargetDSXBuffer(Adapter,tid,FALSE); |
| return 0; |
| } |
| |
| ulTargetDsxBufferIndexToUse = Adapter->ulCurrentTargetBuffer; |
| ulMaxTry = Adapter->ulTotalTargetBuffersAvailable; |
| while((ulMaxTry)&&(Adapter->astTargetDsxBuffer[ulTargetDsxBufferIndexToUse].valid != 1)) |
| { |
| ulTargetDsxBufferIndexToUse = (ulTargetDsxBufferIndexToUse+1)% |
| Adapter->ulTotalTargetBuffersAvailable; |
| ulMaxTry--; |
| } |
| |
| if(ulMaxTry==0) |
| { |
| BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "\n GetNextTargetBufferLocation : Error No Free Target DSX Buffers FreeCnt : %lx ",Adapter->ulFreeTargetBufferCnt); |
| ClearTargetDSXBuffer(Adapter,tid,FALSE); |
| return 0; |
| } |
| |
| |
| ulTargetDSXBufferAddress = |
| Adapter->astTargetDsxBuffer[ulTargetDsxBufferIndexToUse].ulTargetDsxBuffer; |
| Adapter->astTargetDsxBuffer[ulTargetDsxBufferIndexToUse].valid=0; |
| Adapter->astTargetDsxBuffer[ulTargetDsxBufferIndexToUse].tid=tid; |
| Adapter->ulFreeTargetBufferCnt--; |
| |
| |
| ulTargetDsxBufferIndexToUse = |
| (ulTargetDsxBufferIndexToUse+1)%Adapter->ulTotalTargetBuffersAvailable; |
| Adapter->ulCurrentTargetBuffer = ulTargetDsxBufferIndexToUse; |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "GetNextTargetBufferLocation :Returning address %lx tid %d\n", |
| ulTargetDSXBufferAddress,tid); |
| return ulTargetDSXBufferAddress; |
| } |
| |
| |
| INT AllocAdapterDsxBuffer(PMINI_ADAPTER Adapter) |
| { |
| /* |
| //Need to Allocate memory to contain the SUPER Large structures |
| //Our driver cant create these structures on Stack |
| */ |
| Adapter->caDsxReqResp=kmalloc(sizeof(stLocalSFAddIndicationAlt)+LEADER_SIZE, GFP_KERNEL); |
| if(!Adapter->caDsxReqResp) |
| return -ENOMEM; |
| return 0; |
| } |
| |
| INT FreeAdapterDsxBuffer(PMINI_ADAPTER Adapter) |
| { |
| kfree(Adapter->caDsxReqResp); |
| return 0; |
| |
| } |
| /** |
| @ingroup ctrl_pkt_functions |
| This routinue would process the Control responses |
| for the Connection Management. |
| @return - Queue index for the free SFID else returns Invalid Index. |
| */ |
| BOOLEAN CmControlResponseMessage(PMINI_ADAPTER Adapter, /**<Pointer to the Adapter structure*/ |
| PVOID pvBuffer /**Starting Address of the Buffer, that contains the AddIndication Data*/ |
| ) |
| { |
| stServiceFlowParamSI *psfLocalSet=NULL; |
| stLocalSFAddIndicationAlt *pstAddIndication = NULL; |
| stLocalSFChangeIndicationAlt *pstChangeIndication = NULL; |
| PLEADER pLeader=NULL; |
| /* |
| //Otherwise the message contains a target address from where we need to |
| //read out the rest of the service flow param structure |
| */ |
| if((pstAddIndication = RestoreCmControlResponseMessage(Adapter,pvBuffer)) |
| == NULL) |
| { |
| ClearTargetDSXBuffer(Adapter,((stLocalSFAddIndication *)pvBuffer)->u16TID, FALSE); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0, "Error in restoring Service Flow param structure from DSx message"); |
| return FALSE; |
| } |
| |
| DumpCmControlPacket(pstAddIndication); |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "====>"); |
| pLeader = (PLEADER)Adapter->caDsxReqResp; |
| |
| pLeader->Status =CM_CONTROL_NEWDSX_MULTICLASSIFIER_REQ; |
| pLeader->Vcid = 0; |
| |
| ClearTargetDSXBuffer(Adapter,pstAddIndication->u16TID,FALSE); |
| BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "### TID RECEIVED %d\n",pstAddIndication->u16TID); |
| switch(pstAddIndication->u8Type) |
| { |
| case DSA_REQ: |
| { |
| pLeader->PLength = sizeof(stLocalSFAddIndicationAlt); |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Sending DSA Response....\n"); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSA RESPONSE TO MAC %d", pLeader->PLength ); |
| *((stLocalSFAddIndicationAlt*)&(Adapter->caDsxReqResp[LEADER_SIZE])) |
| = *pstAddIndication; |
| ((stLocalSFAddIndicationAlt*)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSA_RSP; |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " VCID = %x", ntohs(pstAddIndication->u16VCID)); |
| CopyBufferToControlPacket(Adapter,(PVOID)Adapter->caDsxReqResp); |
| kfree(pstAddIndication); |
| } |
| break; |
| case DSA_RSP: |
| { |
| pLeader->PLength = sizeof(stLocalSFAddIndicationAlt); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSA ACK TO MAC %d", |
| pLeader->PLength); |
| *((stLocalSFAddIndicationAlt*)&(Adapter->caDsxReqResp[LEADER_SIZE])) |
| = *pstAddIndication; |
| ((stLocalSFAddIndicationAlt*)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSA_ACK; |
| |
| }//no break here..we should go down. |
| case DSA_ACK: |
| { |
| UINT uiSearchRuleIndex=0; |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "VCID:0x%X", |
| ntohs(pstAddIndication->u16VCID)); |
| uiSearchRuleIndex=SearchFreeSfid(Adapter); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"uiSearchRuleIndex:0x%X ", |
| uiSearchRuleIndex); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Direction:0x%X ", |
| pstAddIndication->u8Direction); |
| if((uiSearchRuleIndex< NO_OF_QUEUES) ) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].ucDirection = |
| pstAddIndication->u8Direction; |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "bValid:0x%X ", |
| pstAddIndication->sfActiveSet.bValid); |
| if(pstAddIndication->sfActiveSet.bValid==TRUE) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bActiveSet=TRUE; |
| } |
| if(pstAddIndication->sfAuthorizedSet.bValid==TRUE) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet=TRUE; |
| } |
| if(pstAddIndication->sfAdmittedSet.bValid==TRUE) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet=TRUE; |
| } |
| if(FALSE == pstAddIndication->sfActiveSet.bValid) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bActive = FALSE; |
| Adapter->PackInfo[uiSearchRuleIndex].bActivateRequestSent = FALSE; |
| if(pstAddIndication->sfAdmittedSet.bValid) |
| { |
| psfLocalSet = &pstAddIndication->sfAdmittedSet; |
| } |
| else if(pstAddIndication->sfAuthorizedSet.bValid) |
| { |
| psfLocalSet = &pstAddIndication->sfAuthorizedSet; |
| } |
| } |
| else |
| { |
| psfLocalSet = &pstAddIndication->sfActiveSet; |
| Adapter->PackInfo[uiSearchRuleIndex].bActive=TRUE; |
| } |
| |
| if(!psfLocalSet) |
| { |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "No set is valid\n"); |
| Adapter->PackInfo[uiSearchRuleIndex].bActive=FALSE; |
| Adapter->PackInfo[uiSearchRuleIndex].bValid=FALSE; |
| Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value=0; |
| kfree(pstAddIndication); |
| } |
| |
| else if(psfLocalSet->bValid && (pstAddIndication->u8CC == 0)) |
| { |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSA ACK"); |
| Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = |
| ntohs(pstAddIndication->u16VCID); |
| Adapter->PackInfo[uiSearchRuleIndex].usCID = |
| ntohs(pstAddIndication->u16CID); |
| |
| if(UPLINK_DIR == pstAddIndication->u8Direction) |
| atomic_set(&Adapter->PackInfo[uiSearchRuleIndex].uiPerSFTxResourceCount, DEFAULT_PERSFCOUNT); |
| CopyToAdapter(Adapter,psfLocalSet,uiSearchRuleIndex, |
| DSA_ACK, pstAddIndication); |
| // don't free pstAddIndication |
| |
| /* Inside CopyToAdapter, Sorting of all the SFs take place. |
| Hence any access to the newly added SF through uiSearchRuleIndex is invalid. |
| SHOULD BE STRICTLY AVOIDED. |
| */ |
| // *(PULONG)(((PUCHAR)pvBuffer)+1)=psfLocalSet->u32SFID; |
| memcpy((((PUCHAR)pvBuffer)+1), &psfLocalSet->u32SFID, 4); |
| |
| if(pstAddIndication->sfActiveSet.bValid == TRUE) |
| { |
| if(UPLINK_DIR == pstAddIndication->u8Direction) |
| { |
| if(!Adapter->LinkUpStatus) |
| { |
| netif_carrier_on(Adapter->dev); |
| netif_start_queue(Adapter->dev); |
| Adapter->LinkUpStatus = 1; |
| if (netif_msg_link(Adapter)) |
| pr_info(PFX "%s: link up\n", Adapter->dev->name); |
| atomic_set(&Adapter->TxPktAvail, 1); |
| wake_up(&Adapter->tx_packet_wait_queue); |
| Adapter->liTimeSinceLastNetEntry = get_seconds(); |
| } |
| } |
| } |
| } |
| |
| else |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bActive=FALSE; |
| Adapter->PackInfo[uiSearchRuleIndex].bValid=FALSE; |
| Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value=0; |
| kfree(pstAddIndication); |
| } |
| } |
| else |
| { |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0, "DSA ACK did not get valid SFID"); |
| kfree(pstAddIndication); |
| return FALSE; |
| } |
| } |
| break; |
| case DSC_REQ: |
| { |
| pLeader->PLength = sizeof(stLocalSFChangeIndicationAlt); |
| pstChangeIndication = (stLocalSFChangeIndicationAlt*)pstAddIndication; |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSC RESPONSE TO MAC %d", pLeader->PLength); |
| |
| *((stLocalSFChangeIndicationAlt*)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *pstChangeIndication; |
| ((stLocalSFChangeIndicationAlt*)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSC_RSP; |
| |
| CopyBufferToControlPacket(Adapter,(PVOID)Adapter->caDsxReqResp); |
| kfree(pstAddIndication); |
| } |
| break; |
| case DSC_RSP: |
| { |
| pLeader->PLength = sizeof(stLocalSFChangeIndicationAlt); |
| pstChangeIndication = (stLocalSFChangeIndicationAlt*)pstAddIndication; |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSC ACK TO MAC %d", pLeader->PLength); |
| *((stLocalSFChangeIndicationAlt*)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *pstChangeIndication; |
| ((stLocalSFChangeIndicationAlt*)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSC_ACK; |
| } |
| case DSC_ACK: |
| { |
| UINT uiSearchRuleIndex=0; |
| |
| pstChangeIndication = (stLocalSFChangeIndicationAlt *)pstAddIndication; |
| uiSearchRuleIndex=SearchSfid(Adapter,ntohl(pstChangeIndication->sfActiveSet.u32SFID)); |
| if(uiSearchRuleIndex > NO_OF_QUEUES-1) |
| { |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0, "SF doesn't exist for which DSC_ACK is received"); |
| } |
| if((uiSearchRuleIndex < NO_OF_QUEUES)) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].ucDirection = pstChangeIndication->u8Direction; |
| if(pstChangeIndication->sfActiveSet.bValid==TRUE) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bActiveSet=TRUE; |
| } |
| if(pstChangeIndication->sfAuthorizedSet.bValid==TRUE) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet=TRUE; |
| } |
| if(pstChangeIndication->sfAdmittedSet.bValid==TRUE) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet=TRUE; |
| } |
| |
| if(FALSE==pstChangeIndication->sfActiveSet.bValid) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bActive = FALSE; |
| Adapter->PackInfo[uiSearchRuleIndex].bActivateRequestSent = FALSE; |
| if(pstChangeIndication->sfAdmittedSet.bValid) |
| { |
| psfLocalSet = &pstChangeIndication->sfAdmittedSet; |
| } |
| else if(pstChangeIndication->sfAuthorizedSet.bValid) |
| { |
| psfLocalSet = &pstChangeIndication->sfAuthorizedSet; |
| } |
| } |
| |
| else |
| { |
| psfLocalSet = &pstChangeIndication->sfActiveSet; |
| Adapter->PackInfo[uiSearchRuleIndex].bActive=TRUE; |
| } |
| if(psfLocalSet->bValid && (pstChangeIndication->u8CC == 0)) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = |
| ntohs(pstChangeIndication->u16VCID); |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "CC field is %d bvalid = %d\n", |
| pstChangeIndication->u8CC, psfLocalSet->bValid); |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "VCID= %d\n", ntohs(pstChangeIndication->u16VCID)); |
| Adapter->PackInfo[uiSearchRuleIndex].usCID = |
| ntohs(pstChangeIndication->u16CID); |
| CopyToAdapter(Adapter,psfLocalSet,uiSearchRuleIndex, |
| DSC_ACK, pstAddIndication); |
| |
| *(PULONG)(((PUCHAR)pvBuffer)+1)=psfLocalSet->u32SFID; |
| } |
| else if(pstChangeIndication->u8CC == 6) |
| { |
| deleteSFBySfid(Adapter,uiSearchRuleIndex); |
| kfree(pstAddIndication); |
| } |
| } |
| else |
| { |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_PRINTK, 0, 0, "DSC ACK did not get valid SFID"); |
| kfree(pstAddIndication); |
| return FALSE; |
| } |
| } |
| break; |
| case DSD_REQ: |
| { |
| UINT uiSearchRuleIndex; |
| ULONG ulSFID; |
| |
| pLeader->PLength = sizeof(stLocalSFDeleteIndication); |
| *((stLocalSFDeleteIndication*)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *((stLocalSFDeleteIndication*)pstAddIndication); |
| |
| ulSFID = ntohl(((stLocalSFDeleteIndication*)pstAddIndication)->u32SFID); |
| uiSearchRuleIndex=SearchSfid(Adapter,ulSFID); |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSD - Removing connection %x",uiSearchRuleIndex); |
| |
| if(uiSearchRuleIndex < NO_OF_QUEUES) |
| { |
| //Delete All Classifiers Associated with this SFID |
| deleteSFBySfid(Adapter,uiSearchRuleIndex); |
| Adapter->u32TotalDSD++; |
| } |
| |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSD RESPONSE TO MAC"); |
| ((stLocalSFDeleteIndication*)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSD_RSP; |
| CopyBufferToControlPacket(Adapter,(PVOID)Adapter->caDsxReqResp); |
| } |
| case DSD_RSP: |
| { |
| //Do nothing as SF has already got Deleted |
| } |
| break; |
| case DSD_ACK: |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSD ACK Rcd, let App handle it\n"); |
| break; |
| default: |
| kfree(pstAddIndication); |
| return FALSE ; |
| } |
| return TRUE; |
| } |
| |
| int get_dsx_sf_data_to_application(PMINI_ADAPTER Adapter, UINT uiSFId, void __user *user_buffer) |
| { |
| int status = 0; |
| struct _packet_info *psSfInfo=NULL; |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "status =%d",status); |
| status = SearchSfid(Adapter, uiSFId); |
| if (status >= NO_OF_QUEUES) { |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SFID %d not present in queue !!!", uiSFId ); |
| return -EINVAL; |
| } |
| BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "status =%d",status); |
| psSfInfo=&Adapter->PackInfo[status]; |
| if(psSfInfo->pstSFIndication && copy_to_user(user_buffer, |
| psSfInfo->pstSFIndication, sizeof(stLocalSFAddIndicationAlt))) |
| { |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "copy to user failed SFID %d, present in queue !!!", uiSFId ); |
| status = -EFAULT; |
| return status; |
| } |
| return STATUS_SUCCESS; |
| } |
| |
| VOID OverrideServiceFlowParams(PMINI_ADAPTER Adapter,PUINT puiBuffer) |
| { |
| B_UINT32 u32NumofSFsinMsg = ntohl(*(puiBuffer + 1)); |
| stIM_SFHostNotify *pHostInfo = NULL; |
| UINT uiSearchRuleIndex = 0; |
| ULONG ulSFID = 0; |
| |
| puiBuffer+=2; |
| |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "u32NumofSFsinMsg: 0x%x\n",u32NumofSFsinMsg); |
| |
| while(u32NumofSFsinMsg != 0 && u32NumofSFsinMsg < NO_OF_QUEUES) |
| { |
| u32NumofSFsinMsg--; |
| pHostInfo = (stIM_SFHostNotify *)puiBuffer; |
| puiBuffer = (PUINT)(pHostInfo + 1); |
| |
| ulSFID = ntohl(pHostInfo->SFID); |
| uiSearchRuleIndex=SearchSfid(Adapter,ulSFID); |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"SFID: 0x%lx\n",ulSFID); |
| |
| if(uiSearchRuleIndex >= NO_OF_QUEUES || uiSearchRuleIndex == HiPriority) |
| { |
| 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); |
| continue; |
| } |
| |
| if(pHostInfo->RetainSF == FALSE) |
| { |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"Going to Delete SF"); |
| deleteSFBySfid(Adapter,uiSearchRuleIndex); |
| } |
| else |
| { |
| |
| Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = ntohs(pHostInfo->VCID); |
| Adapter->PackInfo[uiSearchRuleIndex].usCID = ntohs(pHostInfo->newCID); |
| Adapter->PackInfo[uiSearchRuleIndex].bActive=FALSE; |
| |
| BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,"pHostInfo->QoSParamSet: 0x%x\n",pHostInfo->QoSParamSet); |
| |
| if(pHostInfo->QoSParamSet & 0x1) |
| Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet =TRUE; |
| if(pHostInfo->QoSParamSet & 0x2) |
| Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet =TRUE; |
| if(pHostInfo->QoSParamSet & 0x4) |
| { |
| Adapter->PackInfo[uiSearchRuleIndex].bActiveSet =TRUE; |
| Adapter->PackInfo[uiSearchRuleIndex].bActive=TRUE; |
| } |
| } |
| } |
| } |
| |
| |
| |