blob: 0f87119b452afe47be11ed3fe5becae4a7135e04 [file] [log] [blame]
Stephen Hemmingerf8942e02010-09-08 14:46:36 -07001#include "headers.h"
2
Max Tottenham07ed6b72012-04-03 12:35:26 +01003static BOOLEAN MatchSrcIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule, IPV6Header *pstIpv6Header);
4static BOOLEAN MatchDestIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule, IPV6Header *pstIpv6Header);
Stephen Hemminger9dd47ee2010-11-01 12:24:00 -04005static VOID DumpIpv6Header(IPV6Header *pstIpv6Header);
6
Max Tottenhamaadb4ec2012-04-03 12:35:28 +01007static UCHAR *GetNextIPV6ChainedHeader(UCHAR **ppucPayload, UCHAR *pucNextHeader, BOOLEAN *bParseDone, USHORT *pusPayloadLength)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -07008{
9 UCHAR *pucRetHeaderPtr = NULL;
10 UCHAR *pucPayloadPtr = NULL;
11 USHORT usNextHeaderOffset = 0 ;
Max Tottenham26908c92012-04-03 12:35:24 +010012 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070013
Max Tottenham6d147062012-04-03 12:35:29 +010014 if ((ppucPayload == NULL) || (*pusPayloadLength == 0) ||
Max Tottenham26908c92012-04-03 12:35:24 +010015 (*bParseDone)) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070016 *bParseDone = TRUE;
17 return NULL;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070018 }
19
20 pucRetHeaderPtr = *ppucPayload;
21 pucPayloadPtr = *ppucPayload;
22
Max Tottenham26908c92012-04-03 12:35:24 +010023 if (!pucRetHeaderPtr || !pucPayloadPtr) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070024 *bParseDone = TRUE;
25 return NULL;
26 }
27
Max Tottenhamac8c1002012-04-03 12:35:25 +010028 /* Get the Nextt Header Type */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070029 *bParseDone = FALSE;
30
31
Max Tottenham26908c92012-04-03 12:35:24 +010032 switch (*pucNextHeader) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070033 case IPV6HDR_TYPE_HOPBYHOP:
34 {
35
Max Tottenham07ed6b72012-04-03 12:35:26 +010036 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 HopByHop Header");
Max Tottenhamfac290a2012-04-03 12:35:27 +010037 usNextHeaderOffset += sizeof(IPV6HopByHopOptionsHeader);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070038 }
39 break;
40
41 case IPV6HDR_TYPE_ROUTING:
42 {
43 IPV6RoutingHeader *pstIpv6RoutingHeader;
Max Tottenham07ed6b72012-04-03 12:35:26 +010044 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Routing Header");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070045 pstIpv6RoutingHeader = (IPV6RoutingHeader *)pucPayloadPtr;
46 usNextHeaderOffset += sizeof(IPV6RoutingHeader);
47 usNextHeaderOffset += pstIpv6RoutingHeader->ucNumAddresses * IPV6_ADDRESS_SIZEINBYTES;
48
49 }
50 break;
51 case IPV6HDR_TYPE_FRAGMENTATION:
52 {
Max Tottenham07ed6b72012-04-03 12:35:26 +010053 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Fragmentation Header");
Max Tottenhamfac290a2012-04-03 12:35:27 +010054 usNextHeaderOffset += sizeof(IPV6FragmentHeader);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070055
56 }
57 break;
58 case IPV6HDR_TYPE_DESTOPTS:
59 {
60 IPV6DestOptionsHeader *pstIpv6DestOptsHdr = (IPV6DestOptionsHeader *)pucPayloadPtr;
61 int nTotalOptions = pstIpv6DestOptsHdr->ucHdrExtLen;
Max Tottenham07ed6b72012-04-03 12:35:26 +010062 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 DestOpts Header Header");
Max Tottenhamfac290a2012-04-03 12:35:27 +010063 usNextHeaderOffset += sizeof(IPV6DestOptionsHeader);
64 usNextHeaderOffset += nTotalOptions * IPV6_DESTOPTS_HDR_OPTIONSIZE ;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070065
66 }
67 break;
68 case IPV6HDR_TYPE_AUTHENTICATION:
69 {
70 IPV6AuthenticationHeader *pstIpv6AuthHdr = (IPV6AuthenticationHeader *)pucPayloadPtr;
71 int nHdrLen = pstIpv6AuthHdr->ucLength;
Max Tottenham07ed6b72012-04-03 12:35:26 +010072 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Authentication Header");
Max Tottenhamfac290a2012-04-03 12:35:27 +010073 usNextHeaderOffset += nHdrLen * 4;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070074 }
75 break;
76 case IPV6HDR_TYPE_ENCRYPTEDSECURITYPAYLOAD:
77 {
Max Tottenham07ed6b72012-04-03 12:35:26 +010078 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Encrypted Security Payload Header");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070079 *bParseDone = TRUE;
80
81 }
82 break;
83 case IPV6_ICMP_HDR_TYPE:
84 {
Max Tottenham07ed6b72012-04-03 12:35:26 +010085 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, " ICMP Header");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070086 *bParseDone = TRUE;
87 }
88 break;
89 case TCP_HEADER_TYPE:
90 {
Max Tottenham07ed6b72012-04-03 12:35:26 +010091 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, " \nTCP Header");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070092 *bParseDone = TRUE;
93 }
94 break;
95 case UDP_HEADER_TYPE:
96 {
Max Tottenham07ed6b72012-04-03 12:35:26 +010097 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, " \nUDP Header");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070098 *bParseDone = TRUE;
99 }
100 break;
Max Tottenham26908c92012-04-03 12:35:24 +0100101 default:
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700102 {
103 *bParseDone = TRUE;
104
105 }
106 break;
107
108
109 }
110
Max Tottenham26908c92012-04-03 12:35:24 +0100111 if (*bParseDone == FALSE) {
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100112 if (*pusPayloadLength <= usNextHeaderOffset) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700113 *bParseDone = TRUE;
Max Tottenham26908c92012-04-03 12:35:24 +0100114 } else {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700115 *pucNextHeader = *pucPayloadPtr;
Max Tottenham26908c92012-04-03 12:35:24 +0100116 pucPayloadPtr += usNextHeaderOffset;
117 (*pusPayloadLength) -= usNextHeaderOffset;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700118 }
119
120 }
121
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700122 *ppucPayload = pucPayloadPtr;
123 return pucRetHeaderPtr;
124}
125
126
Max Tottenham07ed6b72012-04-03 12:35:26 +0100127static UCHAR GetIpv6ProtocolPorts(UCHAR *pucPayload, USHORT *pusSrcPort, USHORT *pusDestPort, USHORT usPayloadLength, UCHAR ucNextHeader)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700128{
129 UCHAR *pIpv6HdrScanContext = pucPayload;
130 BOOLEAN bDone = FALSE;
Max Tottenhamfac290a2012-04-03 12:35:27 +0100131 UCHAR ucHeaderType = 0;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700132 UCHAR *pucNextHeader = NULL;
Max Tottenham26908c92012-04-03 12:35:24 +0100133 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700134
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100135 if (!pucPayload || (usPayloadLength == 0)) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700136 return 0;
137 }
138
139 *pusSrcPort = *pusDestPort = 0;
140 ucHeaderType = ucNextHeader;
Max Tottenham26908c92012-04-03 12:35:24 +0100141 while (!bDone) {
Max Tottenham07ed6b72012-04-03 12:35:26 +0100142 pucNextHeader = GetNextIPV6ChainedHeader(&pIpv6HdrScanContext, &ucHeaderType, &bDone, &usPayloadLength);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100143 if (bDone) {
144 if ((ucHeaderType == TCP_HEADER_TYPE) || (ucHeaderType == UDP_HEADER_TYPE)) {
Max Tottenhamfac290a2012-04-03 12:35:27 +0100145 *pusSrcPort = *((PUSHORT)(pucNextHeader));
146 *pusDestPort = *((PUSHORT)(pucNextHeader+2));
Max Tottenham07ed6b72012-04-03 12:35:26 +0100147 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, " \nProtocol Ports - Src Port :0x%x Dest Port : 0x%x", ntohs(*pusSrcPort), ntohs(*pusDestPort));
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700148 }
149 break;
150
151 }
152 }
153 return ucHeaderType;
154}
155
156
Max Tottenhamac8c1002012-04-03 12:35:25 +0100157/*
158 * Arg 1 PMINI_ADAPTER Adapter is a pointer ot the driver contorl structure
159 * Arg 2 PVOID pcIpHeader is a pointer to the IP header of the packet
160 */
161USHORT IpVersion6(PMINI_ADAPTER Adapter, PVOID pcIpHeader,
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100162 S_CLASSIFIER_RULE *pstClassifierRule)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700163{
164 USHORT ushDestPort = 0;
165 USHORT ushSrcPort = 0;
Max Tottenhamfac290a2012-04-03 12:35:27 +0100166 UCHAR ucNextProtocolAboveIP = 0;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700167 IPV6Header *pstIpv6Header = NULL;
168 BOOLEAN bClassificationSucceed = FALSE;
169
Max Tottenham07ed6b72012-04-03 12:35:26 +0100170 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "IpVersion6 ==========>\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700171
172 pstIpv6Header = (IPV6Header *)pcIpHeader;
173
174 DumpIpv6Header(pstIpv6Header);
175
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100176 /*
177 * Try to get the next higher layer protocol
Max Tottenhamac8c1002012-04-03 12:35:25 +0100178 * and the Ports Nos if TCP or UDP
179 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700180 ucNextProtocolAboveIP = GetIpv6ProtocolPorts((UCHAR *)(pcIpHeader + sizeof(IPV6Header)),
181 &ushSrcPort,
182 &ushDestPort,
183 pstIpv6Header->usPayloadLength,
184 pstIpv6Header->ucNextHeader);
185
Max Tottenham26908c92012-04-03 12:35:24 +0100186 do {
Max Tottenham6d147062012-04-03 12:35:29 +0100187 if (pstClassifierRule->ucDirection == 0) {
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100188 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100189 * cannot be processed for classification.
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100190 * it is a down link connection
Max Tottenhamac8c1002012-04-03 12:35:25 +0100191 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700192 break;
193 }
194
Max Tottenham26908c92012-04-03 12:35:24 +0100195 if (!pstClassifierRule->bIpv6Protocol) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100196 /*
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100197 * We are looking for Ipv6 Classifiers
Max Tottenhamac8c1002012-04-03 12:35:25 +0100198 * Lets ignore this classifier and try the next one
199 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700200 break;
201 }
202
Max Tottenhamfac290a2012-04-03 12:35:27 +0100203 bClassificationSucceed = MatchSrcIpv6Address(pstClassifierRule, pstIpv6Header);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100204 if (!bClassificationSucceed)
205 break;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700206
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100207 bClassificationSucceed = MatchDestIpv6Address(pstClassifierRule, pstIpv6Header);
208 if (!bClassificationSucceed)
209 break;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700210
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100211 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100212 * Match the protocol type.
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100213 * For IPv6 the next protocol at end of
Max Tottenhamac8c1002012-04-03 12:35:25 +0100214 * Chain of IPv6 prot headers
215 */
Max Tottenhamfac290a2012-04-03 12:35:27 +0100216 bClassificationSucceed = MatchProtocol(pstClassifierRule, ucNextProtocolAboveIP);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100217 if (!bClassificationSucceed)
218 break;
219
220 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Protocol Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700221
Max Tottenham26908c92012-04-03 12:35:24 +0100222 if ((ucNextProtocolAboveIP == TCP_HEADER_TYPE) || (ucNextProtocolAboveIP == UDP_HEADER_TYPE)) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100223 /* Match Src Port */
Max Tottenham07ed6b72012-04-03 12:35:26 +0100224 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Source Port:%x\n", ntohs(ushSrcPort));
Max Tottenhamfac290a2012-04-03 12:35:27 +0100225 bClassificationSucceed = MatchSrcPort(pstClassifierRule, ntohs(ushSrcPort));
Max Tottenham26908c92012-04-03 12:35:24 +0100226 if (!bClassificationSucceed)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700227 break;
228
Max Tottenham07ed6b72012-04-03 12:35:26 +0100229 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Src Port Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700230
Max Tottenhamac8c1002012-04-03 12:35:25 +0100231 /* Match Dest Port */
Max Tottenhamfac290a2012-04-03 12:35:27 +0100232 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Destination Port:%x\n", ntohs(ushDestPort));
233 bClassificationSucceed = MatchDestPort(pstClassifierRule, ntohs(ushDestPort));
Max Tottenham26908c92012-04-03 12:35:24 +0100234 if (!bClassificationSucceed)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700235 break;
Max Tottenham07ed6b72012-04-03 12:35:26 +0100236 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Dest Port Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700237 }
Max Tottenham26908c92012-04-03 12:35:24 +0100238 } while (0);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700239
Max Tottenham6d147062012-04-03 12:35:29 +0100240 if (bClassificationSucceed == TRUE) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700241 INT iMatchedSFQueueIndex = 0;
Max Tottenhamfac290a2012-04-03 12:35:27 +0100242 iMatchedSFQueueIndex = SearchSfid(Adapter, pstClassifierRule->ulSFID);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100243 if (iMatchedSFQueueIndex >= NO_OF_QUEUES) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700244 bClassificationSucceed = FALSE;
Max Tottenham26908c92012-04-03 12:35:24 +0100245 } else {
Max Tottenham6d147062012-04-03 12:35:29 +0100246 if (Adapter->PackInfo[iMatchedSFQueueIndex].bActive == FALSE) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700247 bClassificationSucceed = FALSE;
248 }
249 }
250 }
251
252 return bClassificationSucceed;
253}
254
255
Max Tottenham07ed6b72012-04-03 12:35:26 +0100256static BOOLEAN MatchSrcIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule, IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700257{
Max Tottenham26908c92012-04-03 12:35:24 +0100258 UINT uiLoopIndex = 0;
259 UINT uiIpv6AddIndex = 0;
260 UINT uiIpv6AddrNoLongWords = 4;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700261 ULONG aulSrcIP[4];
Max Tottenham26908c92012-04-03 12:35:24 +0100262 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700263 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100264 * This is the no. of Src Addresses ie Range of IP Addresses contained
265 * in the classifier rule for which we need to match
266 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700267 UINT uiCountIPSrcAddresses = (UINT)pstClassifierRule->ucIPSourceAddressLength;
268
269
Max Tottenham6d147062012-04-03 12:35:29 +0100270 if (uiCountIPSrcAddresses == 0)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700271 return TRUE;
272
273
Max Tottenhamac8c1002012-04-03 12:35:25 +0100274 /* First Convert the Ip Address in the packet to Host Endian order */
Max Tottenhamfac290a2012-04-03 12:35:27 +0100275 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
276 aulSrcIP[uiIpv6AddIndex] = ntohl(pstIpv6Header->ulSrcIpAddress[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700277 }
278
Max Tottenhamfac290a2012-04-03 12:35:27 +0100279 for (uiLoopIndex = 0; uiLoopIndex < uiCountIPSrcAddresses; uiLoopIndex += uiIpv6AddrNoLongWords) {
Max Tottenham07ed6b72012-04-03 12:35:26 +0100280 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Src Ipv6 Address In Received Packet : \n ");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700281 DumpIpv6Address(aulSrcIP);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100282 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Src Ipv6 Mask In Classifier Rule: \n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700283 DumpIpv6Address(&pstClassifierRule->stSrcIpAddress.ulIpv6Mask[uiLoopIndex]);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100284 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Src Ipv6 Address In Classifier Rule : \n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700285 DumpIpv6Address(&pstClassifierRule->stSrcIpAddress.ulIpv6Addr[uiLoopIndex]);
286
Max Tottenham26908c92012-04-03 12:35:24 +0100287 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
288 if ((pstClassifierRule->stSrcIpAddress.ulIpv6Mask[uiLoopIndex+uiIpv6AddIndex] & aulSrcIP[uiIpv6AddIndex])
289 != pstClassifierRule->stSrcIpAddress.ulIpv6Addr[uiLoopIndex+uiIpv6AddIndex]) {
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100290 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100291 * Match failed for current Ipv6 Address
292 * Try next Ipv6 Address
293 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700294 break;
295 }
296
Max Tottenham26908c92012-04-03 12:35:24 +0100297 if (uiIpv6AddIndex == uiIpv6AddrNoLongWords-1) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100298 /* Match Found */
Max Tottenham07ed6b72012-04-03 12:35:26 +0100299 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Ipv6 Src Ip Address Matched\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700300 return TRUE;
301 }
302 }
303 }
304 return FALSE;
305}
306
Max Tottenham07ed6b72012-04-03 12:35:26 +0100307static BOOLEAN MatchDestIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule, IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700308{
Max Tottenham26908c92012-04-03 12:35:24 +0100309 UINT uiLoopIndex = 0;
310 UINT uiIpv6AddIndex = 0;
311 UINT uiIpv6AddrNoLongWords = 4;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700312 ULONG aulDestIP[4];
Max Tottenham26908c92012-04-03 12:35:24 +0100313 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100314 /*
315 * This is the no. of Destination Addresses
316 * ie Range of IP Addresses contained in the classifier rule
Max Tottenhamac8c1002012-04-03 12:35:25 +0100317 * for which we need to match
318 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700319 UINT uiCountIPDestinationAddresses = (UINT)pstClassifierRule->ucIPDestinationAddressLength;
320
321
Max Tottenham6d147062012-04-03 12:35:29 +0100322 if (uiCountIPDestinationAddresses == 0)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700323 return TRUE;
324
325
Max Tottenhamac8c1002012-04-03 12:35:25 +0100326 /* First Convert the Ip Address in the packet to Host Endian order */
Max Tottenhamfac290a2012-04-03 12:35:27 +0100327 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
328 aulDestIP[uiIpv6AddIndex] = ntohl(pstIpv6Header->ulDestIpAddress[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700329 }
330
Max Tottenhamfac290a2012-04-03 12:35:27 +0100331 for (uiLoopIndex = 0; uiLoopIndex < uiCountIPDestinationAddresses; uiLoopIndex += uiIpv6AddrNoLongWords) {
Max Tottenham07ed6b72012-04-03 12:35:26 +0100332 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Destination Ipv6 Address In Received Packet : \n ");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700333 DumpIpv6Address(aulDestIP);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100334 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Destination Ipv6 Mask In Classifier Rule: \n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700335 DumpIpv6Address(&pstClassifierRule->stDestIpAddress.ulIpv6Mask[uiLoopIndex]);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100336 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Destination Ipv6 Address In Classifier Rule : \n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700337 DumpIpv6Address(&pstClassifierRule->stDestIpAddress.ulIpv6Addr[uiLoopIndex]);
338
Max Tottenham26908c92012-04-03 12:35:24 +0100339 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
340 if ((pstClassifierRule->stDestIpAddress.ulIpv6Mask[uiLoopIndex+uiIpv6AddIndex] & aulDestIP[uiIpv6AddIndex])
341 != pstClassifierRule->stDestIpAddress.ulIpv6Addr[uiLoopIndex+uiIpv6AddIndex]) {
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100342 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100343 * Match failed for current Ipv6 Address.
344 * Try next Ipv6 Address
345 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700346 break;
347 }
348
Max Tottenham26908c92012-04-03 12:35:24 +0100349 if (uiIpv6AddIndex == uiIpv6AddrNoLongWords-1) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100350 /* Match Found */
Max Tottenham07ed6b72012-04-03 12:35:26 +0100351 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Ipv6 Destination Ip Address Matched\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700352 return TRUE;
353 }
354 }
355 }
356 return FALSE;
357
358}
359
360VOID DumpIpv6Address(ULONG *puIpv6Address)
361{
362 UINT uiIpv6AddrNoLongWords = 4;
Max Tottenham26908c92012-04-03 12:35:24 +0100363 UINT uiIpv6AddIndex = 0;
364 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
365 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
Max Tottenham07ed6b72012-04-03 12:35:26 +0100366 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, ":%lx", puIpv6Address[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700367 }
368
369}
370
Stephen Hemminger9dd47ee2010-11-01 12:24:00 -0400371static VOID DumpIpv6Header(IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700372{
373 UCHAR ucVersion;
Max Tottenham26908c92012-04-03 12:35:24 +0100374 UCHAR ucPrio;
375 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100376 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "----Ipv6 Header---");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700377 ucVersion = pstIpv6Header->ucVersionPrio & 0xf0;
Max Tottenham07ed6b72012-04-03 12:35:26 +0100378 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Version : %x \n", ucVersion);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700379 ucPrio = pstIpv6Header->ucVersionPrio & 0x0f;
Max Tottenham07ed6b72012-04-03 12:35:26 +0100380 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Priority : %x \n", ucPrio);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100381 /*
382 * BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
Max Tottenhamac8c1002012-04-03 12:35:25 +0100383 * "Flow Label : %x \n",(pstIpv6Header->ucVersionPrio &0xf0);
384 */
Max Tottenham07ed6b72012-04-03 12:35:26 +0100385 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Payload Length : %x \n", ntohs(pstIpv6Header->usPayloadLength));
386 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Next Header : %x \n", pstIpv6Header->ucNextHeader);
387 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Hop Limit : %x \n", pstIpv6Header->ucHopLimit);
388 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Src Address :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700389 DumpIpv6Address(pstIpv6Header->ulSrcIpAddress);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100390 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Dest Address :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700391 DumpIpv6Address(pstIpv6Header->ulDestIpAddress);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100392 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "----Ipv6 Header End---");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700393
394
395}