blob: 7bc1dc29e8ed461098b3d7c643c4a4e745e95b7a [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 Tottenham07ed6b72012-04-03 12:35:26 +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 Tottenham26908c92012-04-03 12:35:24 +010014 if ((NULL == ppucPayload) || (*pusPayloadLength == 0) ||
15 (*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) {
112 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 Tottenham26908c92012-04-03 12:35:24 +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 Tottenham26908c92012-04-03 12:35:24 +0100143 if(bDone) {
Max Tottenhamfac290a2012-04-03 12:35:27 +0100144 if((ucHeaderType == TCP_HEADER_TYPE) || (ucHeaderType == UDP_HEADER_TYPE)) {
145 *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,
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700162 S_CLASSIFIER_RULE *pstClassifierRule )
163{
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 Tottenhamac8c1002012-04-03 12:35:25 +0100176 /*
177 * Try to get the next higher layer protocol
178 * 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 {
187 if (0 == pstClassifierRule->ucDirection) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100188 /*
189 * cannot be processed for classification.
190 * it is a down link connection
191 */
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 /*
197 * We are looking for Ipv6 Classifiers
198 * 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 Tottenham26908c92012-04-03 12:35:24 +0100204 if (!bClassificationSucceed)
205 break;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700206
Max Tottenhamfac290a2012-04-03 12:35:27 +0100207 bClassificationSucceed = MatchDestIpv6Address(pstClassifierRule, pstIpv6Header);
Max Tottenham26908c92012-04-03 12:35:24 +0100208 if (!bClassificationSucceed)
209 break;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700210
Max Tottenhamac8c1002012-04-03 12:35:25 +0100211 /*
212 * Match the protocol type.
213 * For IPv6 the next protocol at end of
214 * Chain of IPv6 prot headers
215 */
Max Tottenhamfac290a2012-04-03 12:35:27 +0100216 bClassificationSucceed = MatchProtocol(pstClassifierRule, ucNextProtocolAboveIP);
Max Tottenham26908c92012-04-03 12:35:24 +0100217 if (!bClassificationSucceed)
218 break;
Max Tottenham07ed6b72012-04-03 12:35:26 +0100219 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Protocol Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700220
Max Tottenham26908c92012-04-03 12:35:24 +0100221 if ((ucNextProtocolAboveIP == TCP_HEADER_TYPE) || (ucNextProtocolAboveIP == UDP_HEADER_TYPE)) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100222 /* Match Src Port */
Max Tottenham07ed6b72012-04-03 12:35:26 +0100223 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 +0100224 bClassificationSucceed = MatchSrcPort(pstClassifierRule, ntohs(ushSrcPort));
Max Tottenham26908c92012-04-03 12:35:24 +0100225 if (!bClassificationSucceed)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700226 break;
227
Max Tottenham07ed6b72012-04-03 12:35:26 +0100228 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Src Port Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700229
Max Tottenhamac8c1002012-04-03 12:35:25 +0100230 /* Match Dest Port */
Max Tottenhamfac290a2012-04-03 12:35:27 +0100231 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Destination Port:%x\n", ntohs(ushDestPort));
232 bClassificationSucceed = MatchDestPort(pstClassifierRule, ntohs(ushDestPort));
Max Tottenham26908c92012-04-03 12:35:24 +0100233 if (!bClassificationSucceed)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700234 break;
Max Tottenham07ed6b72012-04-03 12:35:26 +0100235 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Dest Port Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700236 }
Max Tottenham26908c92012-04-03 12:35:24 +0100237 } while (0);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700238
Max Tottenham26908c92012-04-03 12:35:24 +0100239 if (TRUE == bClassificationSucceed) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700240 INT iMatchedSFQueueIndex = 0;
Max Tottenhamfac290a2012-04-03 12:35:27 +0100241 iMatchedSFQueueIndex = SearchSfid(Adapter, pstClassifierRule->ulSFID);
Max Tottenham26908c92012-04-03 12:35:24 +0100242 if(iMatchedSFQueueIndex >= NO_OF_QUEUES) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700243 bClassificationSucceed = FALSE;
Max Tottenham26908c92012-04-03 12:35:24 +0100244 } else {
245 if (FALSE == Adapter->PackInfo[iMatchedSFQueueIndex].bActive) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700246 bClassificationSucceed = FALSE;
247 }
248 }
249 }
250
251 return bClassificationSucceed;
252}
253
254
Max Tottenham07ed6b72012-04-03 12:35:26 +0100255static BOOLEAN MatchSrcIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule, IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700256{
Max Tottenham26908c92012-04-03 12:35:24 +0100257 UINT uiLoopIndex = 0;
258 UINT uiIpv6AddIndex = 0;
259 UINT uiIpv6AddrNoLongWords = 4;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700260 ULONG aulSrcIP[4];
Max Tottenham26908c92012-04-03 12:35:24 +0100261 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700262 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100263 * This is the no. of Src Addresses ie Range of IP Addresses contained
264 * in the classifier rule for which we need to match
265 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700266 UINT uiCountIPSrcAddresses = (UINT)pstClassifierRule->ucIPSourceAddressLength;
267
268
Max Tottenham26908c92012-04-03 12:35:24 +0100269 if (0 == uiCountIPSrcAddresses)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700270 return TRUE;
271
272
Max Tottenhamac8c1002012-04-03 12:35:25 +0100273 /* First Convert the Ip Address in the packet to Host Endian order */
Max Tottenhamfac290a2012-04-03 12:35:27 +0100274 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
275 aulSrcIP[uiIpv6AddIndex] = ntohl(pstIpv6Header->ulSrcIpAddress[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700276 }
277
Max Tottenhamfac290a2012-04-03 12:35:27 +0100278 for (uiLoopIndex = 0; uiLoopIndex < uiCountIPSrcAddresses; uiLoopIndex += uiIpv6AddrNoLongWords) {
Max Tottenham07ed6b72012-04-03 12:35:26 +0100279 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 -0700280 DumpIpv6Address(aulSrcIP);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100281 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 -0700282 DumpIpv6Address(&pstClassifierRule->stSrcIpAddress.ulIpv6Mask[uiLoopIndex]);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100283 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 -0700284 DumpIpv6Address(&pstClassifierRule->stSrcIpAddress.ulIpv6Addr[uiLoopIndex]);
285
Max Tottenham26908c92012-04-03 12:35:24 +0100286 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
287 if ((pstClassifierRule->stSrcIpAddress.ulIpv6Mask[uiLoopIndex+uiIpv6AddIndex] & aulSrcIP[uiIpv6AddIndex])
288 != pstClassifierRule->stSrcIpAddress.ulIpv6Addr[uiLoopIndex+uiIpv6AddIndex]) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100289 /*
290 * Match failed for current Ipv6 Address
291 * Try next Ipv6 Address
292 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700293 break;
294 }
295
Max Tottenham26908c92012-04-03 12:35:24 +0100296 if (uiIpv6AddIndex == uiIpv6AddrNoLongWords-1) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100297 /* Match Found */
Max Tottenham07ed6b72012-04-03 12:35:26 +0100298 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 -0700299 return TRUE;
300 }
301 }
302 }
303 return FALSE;
304}
305
Max Tottenham07ed6b72012-04-03 12:35:26 +0100306static BOOLEAN MatchDestIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule, IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700307{
Max Tottenham26908c92012-04-03 12:35:24 +0100308 UINT uiLoopIndex = 0;
309 UINT uiIpv6AddIndex = 0;
310 UINT uiIpv6AddrNoLongWords = 4;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700311 ULONG aulDestIP[4];
Max Tottenham26908c92012-04-03 12:35:24 +0100312 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Max Tottenhamac8c1002012-04-03 12:35:25 +0100313 /*
314 * This is the no. of Destination Addresses
315 * ie Range of IP Addresses contained in the classifier rule
316 * for which we need to match
317 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700318 UINT uiCountIPDestinationAddresses = (UINT)pstClassifierRule->ucIPDestinationAddressLength;
319
320
Max Tottenham26908c92012-04-03 12:35:24 +0100321 if (0 == uiCountIPDestinationAddresses)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700322 return TRUE;
323
324
Max Tottenhamac8c1002012-04-03 12:35:25 +0100325 /* First Convert the Ip Address in the packet to Host Endian order */
Max Tottenhamfac290a2012-04-03 12:35:27 +0100326 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
327 aulDestIP[uiIpv6AddIndex] = ntohl(pstIpv6Header->ulDestIpAddress[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700328 }
329
Max Tottenhamfac290a2012-04-03 12:35:27 +0100330 for (uiLoopIndex = 0; uiLoopIndex < uiCountIPDestinationAddresses; uiLoopIndex += uiIpv6AddrNoLongWords) {
Max Tottenham07ed6b72012-04-03 12:35:26 +0100331 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 -0700332 DumpIpv6Address(aulDestIP);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100333 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 -0700334 DumpIpv6Address(&pstClassifierRule->stDestIpAddress.ulIpv6Mask[uiLoopIndex]);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100335 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 -0700336 DumpIpv6Address(&pstClassifierRule->stDestIpAddress.ulIpv6Addr[uiLoopIndex]);
337
Max Tottenham26908c92012-04-03 12:35:24 +0100338 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
339 if ((pstClassifierRule->stDestIpAddress.ulIpv6Mask[uiLoopIndex+uiIpv6AddIndex] & aulDestIP[uiIpv6AddIndex])
340 != pstClassifierRule->stDestIpAddress.ulIpv6Addr[uiLoopIndex+uiIpv6AddIndex]) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100341 /*
342 * Match failed for current Ipv6 Address.
343 * Try next Ipv6 Address
344 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700345 break;
346 }
347
Max Tottenham26908c92012-04-03 12:35:24 +0100348 if (uiIpv6AddIndex == uiIpv6AddrNoLongWords-1) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100349 /* Match Found */
Max Tottenham07ed6b72012-04-03 12:35:26 +0100350 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 -0700351 return TRUE;
352 }
353 }
354 }
355 return FALSE;
356
357}
358
359VOID DumpIpv6Address(ULONG *puIpv6Address)
360{
361 UINT uiIpv6AddrNoLongWords = 4;
Max Tottenham26908c92012-04-03 12:35:24 +0100362 UINT uiIpv6AddIndex = 0;
363 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
364 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
Max Tottenham07ed6b72012-04-03 12:35:26 +0100365 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, ":%lx", puIpv6Address[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700366 }
367
368}
369
Stephen Hemminger9dd47ee2010-11-01 12:24:00 -0400370static VOID DumpIpv6Header(IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700371{
372 UCHAR ucVersion;
Max Tottenham26908c92012-04-03 12:35:24 +0100373 UCHAR ucPrio;
374 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100375 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "----Ipv6 Header---");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700376 ucVersion = pstIpv6Header->ucVersionPrio & 0xf0;
Max Tottenham07ed6b72012-04-03 12:35:26 +0100377 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Version : %x \n", ucVersion);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700378 ucPrio = pstIpv6Header->ucVersionPrio & 0x0f;
Max Tottenham07ed6b72012-04-03 12:35:26 +0100379 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Priority : %x \n", ucPrio);
Max Tottenhamac8c1002012-04-03 12:35:25 +0100380 /*
381 * BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
382 * "Flow Label : %x \n",(pstIpv6Header->ucVersionPrio &0xf0);
383 */
Max Tottenham07ed6b72012-04-03 12:35:26 +0100384 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Payload Length : %x \n", ntohs(pstIpv6Header->usPayloadLength));
385 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Next Header : %x \n", pstIpv6Header->ucNextHeader);
386 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Hop Limit : %x \n", pstIpv6Header->ucHopLimit);
387 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Src Address :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700388 DumpIpv6Address(pstIpv6Header->ulSrcIpAddress);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100389 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Dest Address :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700390 DumpIpv6Address(pstIpv6Header->ulDestIpAddress);
Max Tottenham07ed6b72012-04-03 12:35:26 +0100391 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "----Ipv6 Header End---");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700392
393
394}