blob: 4745ddd62f5b335425bb3dc56984b7a87d5b0f71 [file] [log] [blame]
Stephen Hemmingerf8942e02010-09-08 14:46:36 -07001#include "headers.h"
2
Kevin McKinney92562ae2012-05-26 12:05:03 -04003static BOOLEAN MatchSrcIpv6Address(struct bcm_classifier_rule *pstClassifierRule,
Max Tottenham6704fc82012-04-03 12:35:30 +01004 IPV6Header *pstIpv6Header);
Kevin McKinney92562ae2012-05-26 12:05:03 -04005static BOOLEAN MatchDestIpv6Address(struct bcm_classifier_rule *pstClassifierRule,
Max Tottenham6704fc82012-04-03 12:35:30 +01006 IPV6Header *pstIpv6Header);
Stephen Hemminger9dd47ee2010-11-01 12:24:00 -04007static VOID DumpIpv6Header(IPV6Header *pstIpv6Header);
8
Max Tottenham6704fc82012-04-03 12:35:30 +01009static UCHAR *GetNextIPV6ChainedHeader(UCHAR **ppucPayload,
10 UCHAR *pucNextHeader, BOOLEAN *bParseDone, USHORT *pusPayloadLength)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070011{
12 UCHAR *pucRetHeaderPtr = NULL;
13 UCHAR *pucPayloadPtr = NULL;
14 USHORT usNextHeaderOffset = 0 ;
Kevin McKinney29794602012-05-26 12:05:12 -040015 struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070016
Max Tottenham6d147062012-04-03 12:35:29 +010017 if ((ppucPayload == NULL) || (*pusPayloadLength == 0) ||
Max Tottenham26908c92012-04-03 12:35:24 +010018 (*bParseDone)) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070019 *bParseDone = TRUE;
20 return NULL;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070021 }
22
23 pucRetHeaderPtr = *ppucPayload;
24 pucPayloadPtr = *ppucPayload;
25
Max Tottenham26908c92012-04-03 12:35:24 +010026 if (!pucRetHeaderPtr || !pucPayloadPtr) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070027 *bParseDone = TRUE;
28 return NULL;
29 }
30
Max Tottenhamac8c1002012-04-03 12:35:25 +010031 /* Get the Nextt Header Type */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070032 *bParseDone = FALSE;
33
34
Max Tottenham26908c92012-04-03 12:35:24 +010035 switch (*pucNextHeader) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070036 case IPV6HDR_TYPE_HOPBYHOP:
37 {
38
Max Tottenham6704fc82012-04-03 12:35:30 +010039 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
40 DBG_LVL_ALL, "\nIPv6 HopByHop Header");
Max Tottenhamfac290a2012-04-03 12:35:27 +010041 usNextHeaderOffset += sizeof(IPV6HopByHopOptionsHeader);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070042 }
43 break;
44
45 case IPV6HDR_TYPE_ROUTING:
46 {
47 IPV6RoutingHeader *pstIpv6RoutingHeader;
Max Tottenham6704fc82012-04-03 12:35:30 +010048 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
49 DBG_LVL_ALL, "\nIPv6 Routing Header");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070050 pstIpv6RoutingHeader = (IPV6RoutingHeader *)pucPayloadPtr;
51 usNextHeaderOffset += sizeof(IPV6RoutingHeader);
52 usNextHeaderOffset += pstIpv6RoutingHeader->ucNumAddresses * IPV6_ADDRESS_SIZEINBYTES;
53
54 }
55 break;
56 case IPV6HDR_TYPE_FRAGMENTATION:
57 {
Max Tottenham6704fc82012-04-03 12:35:30 +010058 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
59 DBG_LVL_ALL,
60 "\nIPv6 Fragmentation Header");
Max Tottenhamfac290a2012-04-03 12:35:27 +010061 usNextHeaderOffset += sizeof(IPV6FragmentHeader);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070062
63 }
64 break;
65 case IPV6HDR_TYPE_DESTOPTS:
66 {
67 IPV6DestOptionsHeader *pstIpv6DestOptsHdr = (IPV6DestOptionsHeader *)pucPayloadPtr;
68 int nTotalOptions = pstIpv6DestOptsHdr->ucHdrExtLen;
Max Tottenham6704fc82012-04-03 12:35:30 +010069 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
70 DBG_LVL_ALL,
71 "\nIPv6 DestOpts Header Header");
Max Tottenhamfac290a2012-04-03 12:35:27 +010072 usNextHeaderOffset += sizeof(IPV6DestOptionsHeader);
73 usNextHeaderOffset += nTotalOptions * IPV6_DESTOPTS_HDR_OPTIONSIZE ;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070074
75 }
76 break;
77 case IPV6HDR_TYPE_AUTHENTICATION:
78 {
79 IPV6AuthenticationHeader *pstIpv6AuthHdr = (IPV6AuthenticationHeader *)pucPayloadPtr;
80 int nHdrLen = pstIpv6AuthHdr->ucLength;
Max Tottenham6704fc82012-04-03 12:35:30 +010081 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
82 DBG_LVL_ALL,
83 "\nIPv6 Authentication Header");
Max Tottenhamfac290a2012-04-03 12:35:27 +010084 usNextHeaderOffset += nHdrLen * 4;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070085 }
86 break;
87 case IPV6HDR_TYPE_ENCRYPTEDSECURITYPAYLOAD:
88 {
Max Tottenham6704fc82012-04-03 12:35:30 +010089 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
90 DBG_LVL_ALL,
91 "\nIPv6 Encrypted Security Payload Header");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070092 *bParseDone = TRUE;
93
94 }
95 break;
96 case IPV6_ICMP_HDR_TYPE:
97 {
Max Tottenham6704fc82012-04-03 12:35:30 +010098 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
99 DBG_LVL_ALL, "\nICMP Header");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700100 *bParseDone = TRUE;
101 }
102 break;
103 case TCP_HEADER_TYPE:
104 {
Max Tottenham6704fc82012-04-03 12:35:30 +0100105 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
106 DBG_LVL_ALL, "\nTCP Header");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700107 *bParseDone = TRUE;
108 }
109 break;
110 case UDP_HEADER_TYPE:
111 {
Max Tottenham6704fc82012-04-03 12:35:30 +0100112 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
113 DBG_LVL_ALL, "\nUDP Header");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700114 *bParseDone = TRUE;
115 }
116 break;
Max Tottenham26908c92012-04-03 12:35:24 +0100117 default:
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700118 {
119 *bParseDone = TRUE;
120
121 }
122 break;
123
124
125 }
126
Max Tottenham26908c92012-04-03 12:35:24 +0100127 if (*bParseDone == FALSE) {
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100128 if (*pusPayloadLength <= usNextHeaderOffset) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700129 *bParseDone = TRUE;
Max Tottenham26908c92012-04-03 12:35:24 +0100130 } else {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700131 *pucNextHeader = *pucPayloadPtr;
Max Tottenham26908c92012-04-03 12:35:24 +0100132 pucPayloadPtr += usNextHeaderOffset;
133 (*pusPayloadLength) -= usNextHeaderOffset;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700134 }
135
136 }
137
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700138 *ppucPayload = pucPayloadPtr;
139 return pucRetHeaderPtr;
140}
141
142
Max Tottenham6704fc82012-04-03 12:35:30 +0100143static UCHAR GetIpv6ProtocolPorts(UCHAR *pucPayload, USHORT *pusSrcPort,
144 USHORT *pusDestPort, USHORT usPayloadLength, UCHAR ucNextHeader)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700145{
146 UCHAR *pIpv6HdrScanContext = pucPayload;
147 BOOLEAN bDone = FALSE;
Max Tottenhamfac290a2012-04-03 12:35:27 +0100148 UCHAR ucHeaderType = 0;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700149 UCHAR *pucNextHeader = NULL;
Kevin McKinney29794602012-05-26 12:05:12 -0400150 struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700151
Max Tottenham59b2bbb2012-04-03 12:35:31 +0100152 if (!pucPayload || (usPayloadLength == 0))
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700153 return 0;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700154
155 *pusSrcPort = *pusDestPort = 0;
156 ucHeaderType = ucNextHeader;
Max Tottenham26908c92012-04-03 12:35:24 +0100157 while (!bDone) {
Max Tottenham6704fc82012-04-03 12:35:30 +0100158 pucNextHeader = GetNextIPV6ChainedHeader(&pIpv6HdrScanContext,
159 &ucHeaderType, &bDone, &usPayloadLength);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100160 if (bDone) {
Max Tottenham6704fc82012-04-03 12:35:30 +0100161 if ((ucHeaderType == TCP_HEADER_TYPE) ||
162 (ucHeaderType == UDP_HEADER_TYPE)) {
163 *pusSrcPort = *((PUSHORT)(pucNextHeader));
164 *pusDestPort = *((PUSHORT)(pucNextHeader+2));
165 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
166 DBG_LVL_ALL,
167 "\nProtocol Ports - Src Port :0x%x Dest Port : 0x%x",
168 ntohs(*pusSrcPort),
169 ntohs(*pusDestPort));
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700170 }
171 break;
172
173 }
174 }
175 return ucHeaderType;
176}
177
178
Max Tottenhamac8c1002012-04-03 12:35:25 +0100179/*
Kevin McKinney29794602012-05-26 12:05:12 -0400180 * Arg 1 struct bcm_mini_adapter *Adapter is a pointer ot the driver contorl structure
Max Tottenhamac8c1002012-04-03 12:35:25 +0100181 * Arg 2 PVOID pcIpHeader is a pointer to the IP header of the packet
182 */
Kevin McKinney29794602012-05-26 12:05:12 -0400183USHORT IpVersion6(struct bcm_mini_adapter *Adapter, PVOID pcIpHeader,
Kevin McKinney92562ae2012-05-26 12:05:03 -0400184 struct bcm_classifier_rule *pstClassifierRule)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700185{
186 USHORT ushDestPort = 0;
187 USHORT ushSrcPort = 0;
Max Tottenhamfac290a2012-04-03 12:35:27 +0100188 UCHAR ucNextProtocolAboveIP = 0;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700189 IPV6Header *pstIpv6Header = NULL;
190 BOOLEAN bClassificationSucceed = FALSE;
191
Max Tottenham6704fc82012-04-03 12:35:30 +0100192 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
193 DBG_LVL_ALL, "IpVersion6 ==========>\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700194
195 pstIpv6Header = (IPV6Header *)pcIpHeader;
196
197 DumpIpv6Header(pstIpv6Header);
198
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100199 /*
200 * Try to get the next higher layer protocol
Max Tottenhamac8c1002012-04-03 12:35:25 +0100201 * and the Ports Nos if TCP or UDP
202 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700203 ucNextProtocolAboveIP = GetIpv6ProtocolPorts((UCHAR *)(pcIpHeader + sizeof(IPV6Header)),
204 &ushSrcPort,
205 &ushDestPort,
206 pstIpv6Header->usPayloadLength,
207 pstIpv6Header->ucNextHeader);
208
Max Tottenham26908c92012-04-03 12:35:24 +0100209 do {
Max Tottenham6d147062012-04-03 12:35:29 +0100210 if (pstClassifierRule->ucDirection == 0) {
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100211 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100212 * cannot be processed for classification.
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100213 * it is a down link connection
Max Tottenhamac8c1002012-04-03 12:35:25 +0100214 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700215 break;
216 }
217
Max Tottenham26908c92012-04-03 12:35:24 +0100218 if (!pstClassifierRule->bIpv6Protocol) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100219 /*
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100220 * We are looking for Ipv6 Classifiers
Max Tottenhamac8c1002012-04-03 12:35:25 +0100221 * Lets ignore this classifier and try the next one
222 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700223 break;
224 }
225
Max Tottenham6704fc82012-04-03 12:35:30 +0100226 bClassificationSucceed = MatchSrcIpv6Address(pstClassifierRule,
227 pstIpv6Header);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100228 if (!bClassificationSucceed)
229 break;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700230
Max Tottenham6704fc82012-04-03 12:35:30 +0100231 bClassificationSucceed = MatchDestIpv6Address(pstClassifierRule,
232 pstIpv6Header);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100233 if (!bClassificationSucceed)
234 break;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700235
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100236 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100237 * Match the protocol type.
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100238 * For IPv6 the next protocol at end of
Max Tottenhamac8c1002012-04-03 12:35:25 +0100239 * Chain of IPv6 prot headers
240 */
Max Tottenham6704fc82012-04-03 12:35:30 +0100241 bClassificationSucceed = MatchProtocol(pstClassifierRule,
242 ucNextProtocolAboveIP);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100243 if (!bClassificationSucceed)
244 break;
245
Max Tottenham6704fc82012-04-03 12:35:30 +0100246 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
247 DBG_LVL_ALL, "\nIPv6 Protocol Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700248
Max Tottenham6704fc82012-04-03 12:35:30 +0100249 if ((ucNextProtocolAboveIP == TCP_HEADER_TYPE) ||
250 (ucNextProtocolAboveIP == UDP_HEADER_TYPE)) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100251 /* Match Src Port */
Max Tottenham6704fc82012-04-03 12:35:30 +0100252 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
253 DBG_LVL_ALL, "\nIPv6 Source Port:%x\n",
254 ntohs(ushSrcPort));
255 bClassificationSucceed = MatchSrcPort(pstClassifierRule,
256 ntohs(ushSrcPort));
Max Tottenham26908c92012-04-03 12:35:24 +0100257 if (!bClassificationSucceed)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700258 break;
259
Max Tottenham6704fc82012-04-03 12:35:30 +0100260 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
261 DBG_LVL_ALL, "\nIPv6 Src Port Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700262
Max Tottenhamac8c1002012-04-03 12:35:25 +0100263 /* Match Dest Port */
Max Tottenham6704fc82012-04-03 12:35:30 +0100264 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
265 DBG_LVL_ALL, "\nIPv6 Destination Port:%x\n",
266 ntohs(ushDestPort));
267 bClassificationSucceed = MatchDestPort(pstClassifierRule,
268 ntohs(ushDestPort));
Max Tottenham26908c92012-04-03 12:35:24 +0100269 if (!bClassificationSucceed)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700270 break;
Max Tottenham6704fc82012-04-03 12:35:30 +0100271 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
272 DBG_LVL_ALL, "\nIPv6 Dest Port Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700273 }
Max Tottenham26908c92012-04-03 12:35:24 +0100274 } while (0);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700275
Max Tottenham6d147062012-04-03 12:35:29 +0100276 if (bClassificationSucceed == TRUE) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700277 INT iMatchedSFQueueIndex = 0;
Max Tottenhamfac290a2012-04-03 12:35:27 +0100278 iMatchedSFQueueIndex = SearchSfid(Adapter, pstClassifierRule->ulSFID);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100279 if (iMatchedSFQueueIndex >= NO_OF_QUEUES) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700280 bClassificationSucceed = FALSE;
Max Tottenham26908c92012-04-03 12:35:24 +0100281 } else {
Max Tottenham59b2bbb2012-04-03 12:35:31 +0100282 if (Adapter->PackInfo[iMatchedSFQueueIndex].bActive == FALSE)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700283 bClassificationSucceed = FALSE;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700284 }
285 }
286
287 return bClassificationSucceed;
288}
289
290
Kevin McKinney92562ae2012-05-26 12:05:03 -0400291static BOOLEAN MatchSrcIpv6Address(struct bcm_classifier_rule *pstClassifierRule,
Max Tottenham6704fc82012-04-03 12:35:30 +0100292 IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700293{
Max Tottenham26908c92012-04-03 12:35:24 +0100294 UINT uiLoopIndex = 0;
295 UINT uiIpv6AddIndex = 0;
296 UINT uiIpv6AddrNoLongWords = 4;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700297 ULONG aulSrcIP[4];
Kevin McKinney29794602012-05-26 12:05:12 -0400298 struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700299 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100300 * This is the no. of Src Addresses ie Range of IP Addresses contained
301 * in the classifier rule for which we need to match
302 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700303 UINT uiCountIPSrcAddresses = (UINT)pstClassifierRule->ucIPSourceAddressLength;
304
305
Max Tottenham6d147062012-04-03 12:35:29 +0100306 if (uiCountIPSrcAddresses == 0)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700307 return TRUE;
308
309
Max Tottenhamac8c1002012-04-03 12:35:25 +0100310 /* First Convert the Ip Address in the packet to Host Endian order */
Max Tottenham59b2bbb2012-04-03 12:35:31 +0100311 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++)
Max Tottenhamfac290a2012-04-03 12:35:27 +0100312 aulSrcIP[uiIpv6AddIndex] = ntohl(pstIpv6Header->ulSrcIpAddress[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700313
Max Tottenhamfac290a2012-04-03 12:35:27 +0100314 for (uiLoopIndex = 0; uiLoopIndex < uiCountIPSrcAddresses; uiLoopIndex += uiIpv6AddrNoLongWords) {
Max Tottenham6704fc82012-04-03 12:35:30 +0100315 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
316 "\n Src Ipv6 Address In Received Packet :\n ");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700317 DumpIpv6Address(aulSrcIP);
Max Tottenham6704fc82012-04-03 12:35:30 +0100318 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
319 "\n Src Ipv6 Mask In Classifier Rule:\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700320 DumpIpv6Address(&pstClassifierRule->stSrcIpAddress.ulIpv6Mask[uiLoopIndex]);
Max Tottenham6704fc82012-04-03 12:35:30 +0100321 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
322 "\n Src Ipv6 Address In Classifier Rule :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700323 DumpIpv6Address(&pstClassifierRule->stSrcIpAddress.ulIpv6Addr[uiLoopIndex]);
324
Max Tottenham26908c92012-04-03 12:35:24 +0100325 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
326 if ((pstClassifierRule->stSrcIpAddress.ulIpv6Mask[uiLoopIndex+uiIpv6AddIndex] & aulSrcIP[uiIpv6AddIndex])
327 != pstClassifierRule->stSrcIpAddress.ulIpv6Addr[uiLoopIndex+uiIpv6AddIndex]) {
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100328 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100329 * Match failed for current Ipv6 Address
330 * Try next Ipv6 Address
331 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700332 break;
333 }
334
Max Tottenham26908c92012-04-03 12:35:24 +0100335 if (uiIpv6AddIndex == uiIpv6AddrNoLongWords-1) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100336 /* Match Found */
Max Tottenham6704fc82012-04-03 12:35:30 +0100337 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
338 DBG_LVL_ALL,
339 "Ipv6 Src Ip Address Matched\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700340 return TRUE;
341 }
342 }
343 }
344 return FALSE;
345}
346
Kevin McKinney92562ae2012-05-26 12:05:03 -0400347static BOOLEAN MatchDestIpv6Address(struct bcm_classifier_rule *pstClassifierRule,
Max Tottenham6704fc82012-04-03 12:35:30 +0100348 IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700349{
Max Tottenham26908c92012-04-03 12:35:24 +0100350 UINT uiLoopIndex = 0;
351 UINT uiIpv6AddIndex = 0;
352 UINT uiIpv6AddrNoLongWords = 4;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700353 ULONG aulDestIP[4];
Kevin McKinney29794602012-05-26 12:05:12 -0400354 struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100355 /*
356 * This is the no. of Destination Addresses
357 * ie Range of IP Addresses contained in the classifier rule
Max Tottenhamac8c1002012-04-03 12:35:25 +0100358 * for which we need to match
359 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700360 UINT uiCountIPDestinationAddresses = (UINT)pstClassifierRule->ucIPDestinationAddressLength;
361
362
Max Tottenham6d147062012-04-03 12:35:29 +0100363 if (uiCountIPDestinationAddresses == 0)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700364 return TRUE;
365
366
Max Tottenhamac8c1002012-04-03 12:35:25 +0100367 /* First Convert the Ip Address in the packet to Host Endian order */
Max Tottenham59b2bbb2012-04-03 12:35:31 +0100368 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++)
Max Tottenhamfac290a2012-04-03 12:35:27 +0100369 aulDestIP[uiIpv6AddIndex] = ntohl(pstIpv6Header->ulDestIpAddress[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700370
Max Tottenhamfac290a2012-04-03 12:35:27 +0100371 for (uiLoopIndex = 0; uiLoopIndex < uiCountIPDestinationAddresses; uiLoopIndex += uiIpv6AddrNoLongWords) {
Max Tottenham6704fc82012-04-03 12:35:30 +0100372 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
373 "\n Destination Ipv6 Address In Received Packet :\n ");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700374 DumpIpv6Address(aulDestIP);
Max Tottenham6704fc82012-04-03 12:35:30 +0100375 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
376 "\n Destination Ipv6 Mask In Classifier Rule :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700377 DumpIpv6Address(&pstClassifierRule->stDestIpAddress.ulIpv6Mask[uiLoopIndex]);
Max Tottenham6704fc82012-04-03 12:35:30 +0100378 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
379 "\n Destination Ipv6 Address In Classifier Rule :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700380 DumpIpv6Address(&pstClassifierRule->stDestIpAddress.ulIpv6Addr[uiLoopIndex]);
381
Max Tottenham26908c92012-04-03 12:35:24 +0100382 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
383 if ((pstClassifierRule->stDestIpAddress.ulIpv6Mask[uiLoopIndex+uiIpv6AddIndex] & aulDestIP[uiIpv6AddIndex])
384 != pstClassifierRule->stDestIpAddress.ulIpv6Addr[uiLoopIndex+uiIpv6AddIndex]) {
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100385 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100386 * Match failed for current Ipv6 Address.
387 * Try next Ipv6 Address
388 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700389 break;
390 }
391
Max Tottenham26908c92012-04-03 12:35:24 +0100392 if (uiIpv6AddIndex == uiIpv6AddrNoLongWords-1) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100393 /* Match Found */
Max Tottenham6704fc82012-04-03 12:35:30 +0100394 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
395 DBG_LVL_ALL,
396 "Ipv6 Destination Ip Address Matched\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700397 return TRUE;
398 }
399 }
400 }
401 return FALSE;
402
403}
404
405VOID DumpIpv6Address(ULONG *puIpv6Address)
406{
407 UINT uiIpv6AddrNoLongWords = 4;
Max Tottenham26908c92012-04-03 12:35:24 +0100408 UINT uiIpv6AddIndex = 0;
Kevin McKinney29794602012-05-26 12:05:12 -0400409 struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
Max Tottenham26908c92012-04-03 12:35:24 +0100410 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
Max Tottenham6704fc82012-04-03 12:35:30 +0100411 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
412 ":%lx", puIpv6Address[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700413 }
414
415}
416
Stephen Hemminger9dd47ee2010-11-01 12:24:00 -0400417static VOID DumpIpv6Header(IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700418{
419 UCHAR ucVersion;
Max Tottenham26908c92012-04-03 12:35:24 +0100420 UCHAR ucPrio;
Kevin McKinney29794602012-05-26 12:05:12 -0400421 struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
Max Tottenham6704fc82012-04-03 12:35:30 +0100422 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
423 "----Ipv6 Header---");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700424 ucVersion = pstIpv6Header->ucVersionPrio & 0xf0;
Max Tottenham6704fc82012-04-03 12:35:30 +0100425 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
426 "Version : %x\n", ucVersion);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700427 ucPrio = pstIpv6Header->ucVersionPrio & 0x0f;
Max Tottenham6704fc82012-04-03 12:35:30 +0100428 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
429 "Priority : %x\n", ucPrio);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100430 /*
431 * BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
Max Tottenham6704fc82012-04-03 12:35:30 +0100432 * "Flow Label : %x\n",(pstIpv6Header->ucVersionPrio &0xf0);
Max Tottenhamac8c1002012-04-03 12:35:25 +0100433 */
Max Tottenham6704fc82012-04-03 12:35:30 +0100434 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
435 "Payload Length : %x\n",
436 ntohs(pstIpv6Header->usPayloadLength));
437 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
438 "Next Header : %x\n", pstIpv6Header->ucNextHeader);
439 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
440 "Hop Limit : %x\n", pstIpv6Header->ucHopLimit);
441 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
442 "Src Address :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700443 DumpIpv6Address(pstIpv6Header->ulSrcIpAddress);
Max Tottenham6704fc82012-04-03 12:35:30 +0100444 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
445 "Dest Address :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700446 DumpIpv6Address(pstIpv6Header->ulDestIpAddress);
Max Tottenham6704fc82012-04-03 12:35:30 +0100447 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
448 "----Ipv6 Header End---");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700449
450
451}