Signed-off-by: Matthias Beyer <[email protected]>
---
drivers/staging/bcm/Qos.c | 193 +++++++++++++++++++++++++++++++++++-----------
1 file changed, 148 insertions(+), 45 deletions(-)
diff --git a/drivers/staging/bcm/Qos.c b/drivers/staging/bcm/Qos.c
index 1608ba4f..2176d28 100644
--- a/drivers/staging/bcm/Qos.c
+++ b/drivers/staging/bcm/Qos.c
@@ -607,26 +607,51 @@ USHORT ClassifyPacket(struct bcm_mini_adapter *Adapter,
struct sk_buff *skb)
EThCSGetPktInfo(Adapter, pvEThPayload, &stEthCsPktInfo);
switch (stEthCsPktInfo.eNwpktEthFrameType) {
- case eEth802LLCFrame:
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,
"ClassifyPacket : 802LLCFrame\n");
- pIpHeader = pvEThPayload + sizeof(struct bcm_eth_llc_frame);
- break;
- case eEth802LLCSNAPFrame:
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,
"ClassifyPacket : 802LLC SNAP Frame\n");
- pIpHeader = pvEThPayload + sizeof(struct
bcm_eth_llc_snap_frame);
- break;
- case eEth802QVLANFrame:
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,
"ClassifyPacket : 802.1Q VLANFrame\n");
- pIpHeader = pvEThPayload + sizeof(struct bcm_eth_q_frame);
- break;
- case eEthOtherFrame:
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,
"ClassifyPacket : ETH Other Frame\n");
- pIpHeader = pvEThPayload + sizeof(struct bcm_ethernet2_frame);
- break;
- default:
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,
"ClassifyPacket : Unrecognized ETH Frame\n");
- pIpHeader = pvEThPayload + sizeof(struct bcm_ethernet2_frame);
- break;
+ case eEth802LLCFrame:
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "ClassifyPacket : 802LLCFrame\n");
+ pIpHeader = pvEThPayload +
+ sizeof(struct bcm_eth_llc_frame);
+ break;
+ case eEth802LLCSNAPFrame:
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "ClassifyPacket : 802LLC SNAP Frame\n");
+ pIpHeader = pvEThPayload +
+ sizeof(struct bcm_eth_llc_snap_frame);
+ break;
+ case eEth802QVLANFrame:
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "ClassifyPacket : 802.1Q VLANFrame\n");
+ pIpHeader = pvEThPayload +
+ sizeof(struct bcm_eth_q_frame);
+ break;
+ case eEthOtherFrame:
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "ClassifyPacket : ETH Other Frame\n");
+ pIpHeader = pvEThPayload +
+ sizeof(struct bcm_ethernet2_frame);
+ break;
+ default:
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "ClassifyPacket : Unrecognized ETH
Frame\n");
+ pIpHeader = pvEThPayload +
+ sizeof(struct bcm_ethernet2_frame);
+ break;
}
if (stEthCsPktInfo.eNwpktIPFrameType == eIPv4Packet) {
@@ -636,15 +661,27 @@ USHORT ClassifyPacket(struct bcm_mini_adapter *Adapter,
struct sk_buff *skb)
if (bFragmentedPkt) {
/* Fragmented Packet. Get Frag Classifier Entry. */
- pstClassifierRule = GetFragIPClsEntry(Adapter,
pIpHeader->id, pIpHeader->saddr);
+ pstClassifierRule = GetFragIPClsEntry(Adapter,
+ pIpHeader->id,
+ pIpHeader->saddr);
if (pstClassifierRule) {
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX,
IPV4_DBG, DBG_LVL_ALL, "It is next Fragmented pkt");
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "It is next Fragmented
pkt");
bClassificationSucceed = TRUE;
}
if (!(ntohs(pIpHeader->frag_off) & IP_MF)) {
/* Fragmented Last packet . Remove Frag
Classifier Entry */
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG,
DBG_LVL_ALL, "This is the last fragmented Pkt");
- DelFragIPClsEntry(Adapter, pIpHeader->id,
pIpHeader->saddr);
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "This is the last fragmented
Pkt");
+ DelFragIPClsEntry(Adapter,
+ pIpHeader->id,
+ pIpHeader->saddr);
}
}
}
@@ -660,7 +697,12 @@ USHORT ClassifyPacket(struct bcm_mini_adapter *Adapter,
struct sk_buff *skb)
bClassificationSucceed = false;
continue;
}
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,
"Adapter->PackInfo[%d].bvalid=True\n", uiLoopIndex);
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "Adapter->PackInfo[%d].bvalid=True\n",
+ uiLoopIndex);
if (0 == Adapter->astClassifierTable[uiLoopIndex].ucDirection) {
bClassificationSucceed = false; /* cannot be processed
for classification. */
@@ -671,71 +713,131 @@ USHORT ClassifyPacket(struct bcm_mini_adapter *Adapter,
struct sk_buff *skb)
uiSfIndex = SearchSfid(Adapter, pstClassifierRule->ulSFID);
if (uiSfIndex >= NO_OF_QUEUES) {
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG,
DBG_LVL_ALL, "Queue Not Valid. SearchSfid for this classifier Failed\n");
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "Queue Not Valid. SearchSfid for this
classifier Failed\n");
continue;
}
if (Adapter->PackInfo[uiSfIndex].bEthCSSupport) {
if (eEthUnsupportedFrame ==
stEthCsPktInfo.eNwpktEthFrameType) {
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG,
DBG_LVL_ALL, " ClassifyPacket : Packet Not a Valid Supported Ethernet Frame\n");
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ " ClassifyPacket : Packet Not a
Valid Supported Ethernet Frame\n");
bClassificationSucceed = false;
continue;
}
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG,
DBG_LVL_ALL, "Performing ETH CS Classification on Classifier Rule ID : %x
Service Flow ID : %lx\n", pstClassifierRule->uiClassifierRuleIndex,
Adapter->PackInfo[uiSfIndex].ulSFID);
- bClassificationSucceed = EThCSClassifyPkt(Adapter, skb,
&stEthCsPktInfo, pstClassifierRule, Adapter->PackInfo[uiSfIndex].bEthCSSupport);
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "Performing ETH CS Classification on
Classifier Rule ID : %x Service Flow ID : %lx\n",
+
pstClassifierRule->uiClassifierRuleIndex,
+ Adapter->PackInfo[uiSfIndex].ulSFID);
+ bClassificationSucceed = EThCSClassifyPkt(Adapter,
+ skb,
+
&stEthCsPktInfo,
+
pstClassifierRule,
+
Adapter->PackInfo[uiSfIndex].bEthCSSupport);
if (!bClassificationSucceed) {
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG,
DBG_LVL_ALL, "ClassifyPacket : Ethernet CS Classification Failed\n");
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "ClassifyPacket : Ethernet CS
Classification Failed\n");
continue;
}
} else { /* No ETH Supported on this SF */
if (eEthOtherFrame !=
stEthCsPktInfo.eNwpktEthFrameType) {
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG,
DBG_LVL_ALL, " ClassifyPacket : Packet Not a 802.3 Ethernet Frame... hence not
allowed over non-ETH CS SF\n");
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ " ClassifyPacket : Packet Not a
802.3 Ethernet Frame... hence not allowed over non-ETH CS SF\n");
bClassificationSucceed = false;
continue;
}
}
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,
"Proceeding to IP CS Clasification");
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "Proceeding to IP CS Clasification");
if (Adapter->PackInfo[uiSfIndex].bIPCSSupport) {
if (stEthCsPktInfo.eNwpktIPFrameType == eNonIPPacket) {
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG,
DBG_LVL_ALL, " ClassifyPacket : Packet is Not an IP Packet\n");
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ " ClassifyPacket : Packet is
Not an IP Packet\n");
bClassificationSucceed = false;
continue;
}
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG,
DBG_LVL_ALL, "Dump IP Header :\n");
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "Dump IP Header :\n");
DumpFullPacket((PUCHAR)pIpHeader, 20);
if (stEthCsPktInfo.eNwpktIPFrameType == eIPv4Packet)
- bClassificationSucceed = IpVersion4(Adapter,
pIpHeader, pstClassifierRule);
+ bClassificationSucceed = IpVersion4(Adapter,
+ pIpHeader,
+
pstClassifierRule);
else if (stEthCsPktInfo.eNwpktIPFrameType ==
eIPv6Packet)
- bClassificationSucceed = IpVersion6(Adapter,
pIpHeader, pstClassifierRule);
+ bClassificationSucceed = IpVersion6(Adapter,
+ pIpHeader,
+
pstClassifierRule);
}
}
if (bClassificationSucceed == TRUE) {
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,
"CF id : %d, SF ID is =%lu", pstClassifierRule->uiClassifierRuleIndex,
pstClassifierRule->ulSFID);
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "CF id : %d, SF ID is =%lu",
+ pstClassifierRule->uiClassifierRuleIndex,
+ pstClassifierRule->ulSFID);
/* Store The matched Classifier in SKB */
- *((UINT32 *)(skb->cb)+SKB_CB_CLASSIFICATION_OFFSET) =
pstClassifierRule->uiClassifierRuleIndex;
- if ((TCP == pIpHeader->protocol) && !bFragmentedPkt &&
(ETH_AND_IP_HEADER_LEN + TCP_HEADER_LEN <= skb->len)) {
+ *((UINT32 *)(skb->cb)+SKB_CB_CLASSIFICATION_OFFSET) =
+ pstClassifierRule->uiClassifierRuleIndex;
+ if ((TCP == pIpHeader->protocol) && !bFragmentedPkt &&
+ (ETH_AND_IP_HEADER_LEN + TCP_HEADER_LEN <=
+ skb->len)) {
IpHeaderLength = pIpHeader->ihl;
- pTcpHeader = (struct bcm_tcp_header
*)(((PUCHAR)pIpHeader)+(IpHeaderLength*4));
- TcpHeaderLength =
GET_TCP_HEADER_LEN(pTcpHeader->HeaderLength);
+ pTcpHeader =
+ (struct bcm_tcp_header *)(((PUCHAR)pIpHeader) +
+ (IpHeaderLength*4));
+ TcpHeaderLength =
GET_TCP_HEADER_LEN(pTcpHeader->HeaderLength);
if ((pTcpHeader->ucFlags & TCP_ACK) &&
- (ntohs(pIpHeader->tot_len) ==
(IpHeaderLength*4)+(TcpHeaderLength*4)))
- *((UINT32 *) (skb->cb) + SKB_CB_TCPACK_OFFSET)
= TCP_ACK;
+ (ntohs(pIpHeader->tot_len) ==
+ (IpHeaderLength*4)+(TcpHeaderLength*4)))
+ *((UINT32 *) (skb->cb) + SKB_CB_TCPACK_OFFSET) =
+ TCP_ACK;
}
usIndex = SearchSfid(Adapter, pstClassifierRule->ulSFID);
- BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV4_DBG, DBG_LVL_ALL,
"index is =%d", usIndex);
+ BCM_DEBUG_PRINT(Adapter,
+ DBG_TYPE_TX,
+ IPV4_DBG,
+ DBG_LVL_ALL,
+ "index is =%d",
+ usIndex);
/*
* If this is the first fragment of a Fragmented pkt,
@@ -752,7 +854,8 @@ USHORT ClassifyPacket(struct bcm_mini_adapter *Adapter,
struct sk_buff *skb)
stFragPktInfo.bUsed = TRUE;
stFragPktInfo.ulSrcIpAddress = pIpHeader->saddr;
stFragPktInfo.usIpIdentification = pIpHeader->id;
- stFragPktInfo.pstMatchedClassifierEntry =
pstClassifierRule;
+ stFragPktInfo.pstMatchedClassifierEntry =
+ pstClassifierRule;
stFragPktInfo.bOutOfOrderFragment = false;
AddFragIPClsEntry(Adapter, &stFragPktInfo);
}
--
2.0.3
_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel