blob: d9c9cef2d1721a7147fe6109288467f66ab9a572 [file] [log] [blame]
Stephen Hemmingerf8942e02010-09-08 14:46:36 -07001#include "headers.h"
2
Max Tottenham6704fc82012-04-03 12:35:30 +01003static BOOLEAN MatchSrcIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule,
4 IPV6Header *pstIpv6Header);
5static BOOLEAN MatchDestIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule,
6 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 ;
Max Tottenham26908c92012-04-03 12:35:24 +010015 PMINI_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;
Max Tottenham26908c92012-04-03 12:35:24 +0100150 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700151
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100152 if (!pucPayload || (usPayloadLength == 0)) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700153 return 0;
154 }
155
156 *pusSrcPort = *pusDestPort = 0;
157 ucHeaderType = ucNextHeader;
Max Tottenham26908c92012-04-03 12:35:24 +0100158 while (!bDone) {
Max Tottenham6704fc82012-04-03 12:35:30 +0100159 pucNextHeader = GetNextIPV6ChainedHeader(&pIpv6HdrScanContext,
160 &ucHeaderType, &bDone, &usPayloadLength);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100161 if (bDone) {
Max Tottenham6704fc82012-04-03 12:35:30 +0100162 if ((ucHeaderType == TCP_HEADER_TYPE) ||
163 (ucHeaderType == UDP_HEADER_TYPE)) {
164 *pusSrcPort = *((PUSHORT)(pucNextHeader));
165 *pusDestPort = *((PUSHORT)(pucNextHeader+2));
166 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
167 DBG_LVL_ALL,
168 "\nProtocol Ports - Src Port :0x%x Dest Port : 0x%x",
169 ntohs(*pusSrcPort),
170 ntohs(*pusDestPort));
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700171 }
172 break;
173
174 }
175 }
176 return ucHeaderType;
177}
178
179
Max Tottenhamac8c1002012-04-03 12:35:25 +0100180/*
181 * Arg 1 PMINI_ADAPTER Adapter is a pointer ot the driver contorl structure
182 * Arg 2 PVOID pcIpHeader is a pointer to the IP header of the packet
183 */
184USHORT IpVersion6(PMINI_ADAPTER Adapter, PVOID pcIpHeader,
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100185 S_CLASSIFIER_RULE *pstClassifierRule)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700186{
187 USHORT ushDestPort = 0;
188 USHORT ushSrcPort = 0;
Max Tottenhamfac290a2012-04-03 12:35:27 +0100189 UCHAR ucNextProtocolAboveIP = 0;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700190 IPV6Header *pstIpv6Header = NULL;
191 BOOLEAN bClassificationSucceed = FALSE;
192
Max Tottenham6704fc82012-04-03 12:35:30 +0100193 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
194 DBG_LVL_ALL, "IpVersion6 ==========>\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700195
196 pstIpv6Header = (IPV6Header *)pcIpHeader;
197
198 DumpIpv6Header(pstIpv6Header);
199
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100200 /*
201 * Try to get the next higher layer protocol
Max Tottenhamac8c1002012-04-03 12:35:25 +0100202 * and the Ports Nos if TCP or UDP
203 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700204 ucNextProtocolAboveIP = GetIpv6ProtocolPorts((UCHAR *)(pcIpHeader + sizeof(IPV6Header)),
205 &ushSrcPort,
206 &ushDestPort,
207 pstIpv6Header->usPayloadLength,
208 pstIpv6Header->ucNextHeader);
209
Max Tottenham26908c92012-04-03 12:35:24 +0100210 do {
Max Tottenham6d147062012-04-03 12:35:29 +0100211 if (pstClassifierRule->ucDirection == 0) {
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100212 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100213 * cannot be processed for classification.
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100214 * it is a down link connection
Max Tottenhamac8c1002012-04-03 12:35:25 +0100215 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700216 break;
217 }
218
Max Tottenham26908c92012-04-03 12:35:24 +0100219 if (!pstClassifierRule->bIpv6Protocol) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100220 /*
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100221 * We are looking for Ipv6 Classifiers
Max Tottenhamac8c1002012-04-03 12:35:25 +0100222 * Lets ignore this classifier and try the next one
223 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700224 break;
225 }
226
Max Tottenham6704fc82012-04-03 12:35:30 +0100227 bClassificationSucceed = MatchSrcIpv6Address(pstClassifierRule,
228 pstIpv6Header);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100229 if (!bClassificationSucceed)
230 break;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700231
Max Tottenham6704fc82012-04-03 12:35:30 +0100232 bClassificationSucceed = MatchDestIpv6Address(pstClassifierRule,
233 pstIpv6Header);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100234 if (!bClassificationSucceed)
235 break;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700236
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100237 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100238 * Match the protocol type.
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100239 * For IPv6 the next protocol at end of
Max Tottenhamac8c1002012-04-03 12:35:25 +0100240 * Chain of IPv6 prot headers
241 */
Max Tottenham6704fc82012-04-03 12:35:30 +0100242 bClassificationSucceed = MatchProtocol(pstClassifierRule,
243 ucNextProtocolAboveIP);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100244 if (!bClassificationSucceed)
245 break;
246
Max Tottenham6704fc82012-04-03 12:35:30 +0100247 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
248 DBG_LVL_ALL, "\nIPv6 Protocol Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700249
Max Tottenham6704fc82012-04-03 12:35:30 +0100250 if ((ucNextProtocolAboveIP == TCP_HEADER_TYPE) ||
251 (ucNextProtocolAboveIP == UDP_HEADER_TYPE)) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100252 /* Match Src Port */
Max Tottenham6704fc82012-04-03 12:35:30 +0100253 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
254 DBG_LVL_ALL, "\nIPv6 Source Port:%x\n",
255 ntohs(ushSrcPort));
256 bClassificationSucceed = MatchSrcPort(pstClassifierRule,
257 ntohs(ushSrcPort));
Max Tottenham26908c92012-04-03 12:35:24 +0100258 if (!bClassificationSucceed)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700259 break;
260
Max Tottenham6704fc82012-04-03 12:35:30 +0100261 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
262 DBG_LVL_ALL, "\nIPv6 Src Port Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700263
Max Tottenhamac8c1002012-04-03 12:35:25 +0100264 /* Match Dest Port */
Max Tottenham6704fc82012-04-03 12:35:30 +0100265 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
266 DBG_LVL_ALL, "\nIPv6 Destination Port:%x\n",
267 ntohs(ushDestPort));
268 bClassificationSucceed = MatchDestPort(pstClassifierRule,
269 ntohs(ushDestPort));
Max Tottenham26908c92012-04-03 12:35:24 +0100270 if (!bClassificationSucceed)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700271 break;
Max Tottenham6704fc82012-04-03 12:35:30 +0100272 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
273 DBG_LVL_ALL, "\nIPv6 Dest Port Matched");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700274 }
Max Tottenham26908c92012-04-03 12:35:24 +0100275 } while (0);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700276
Max Tottenham6d147062012-04-03 12:35:29 +0100277 if (bClassificationSucceed == TRUE) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700278 INT iMatchedSFQueueIndex = 0;
Max Tottenhamfac290a2012-04-03 12:35:27 +0100279 iMatchedSFQueueIndex = SearchSfid(Adapter, pstClassifierRule->ulSFID);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100280 if (iMatchedSFQueueIndex >= NO_OF_QUEUES) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700281 bClassificationSucceed = FALSE;
Max Tottenham26908c92012-04-03 12:35:24 +0100282 } else {
Max Tottenham6d147062012-04-03 12:35:29 +0100283 if (Adapter->PackInfo[iMatchedSFQueueIndex].bActive == FALSE) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700284 bClassificationSucceed = FALSE;
285 }
286 }
287 }
288
289 return bClassificationSucceed;
290}
291
292
Max Tottenham6704fc82012-04-03 12:35:30 +0100293static BOOLEAN MatchSrcIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule,
294 IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700295{
Max Tottenham26908c92012-04-03 12:35:24 +0100296 UINT uiLoopIndex = 0;
297 UINT uiIpv6AddIndex = 0;
298 UINT uiIpv6AddrNoLongWords = 4;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700299 ULONG aulSrcIP[4];
Max Tottenham26908c92012-04-03 12:35:24 +0100300 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700301 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100302 * This is the no. of Src Addresses ie Range of IP Addresses contained
303 * in the classifier rule for which we need to match
304 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700305 UINT uiCountIPSrcAddresses = (UINT)pstClassifierRule->ucIPSourceAddressLength;
306
307
Max Tottenham6d147062012-04-03 12:35:29 +0100308 if (uiCountIPSrcAddresses == 0)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700309 return TRUE;
310
311
Max Tottenhamac8c1002012-04-03 12:35:25 +0100312 /* First Convert the Ip Address in the packet to Host Endian order */
Max Tottenhamfac290a2012-04-03 12:35:27 +0100313 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
314 aulSrcIP[uiIpv6AddIndex] = ntohl(pstIpv6Header->ulSrcIpAddress[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700315 }
316
Max Tottenhamfac290a2012-04-03 12:35:27 +0100317 for (uiLoopIndex = 0; uiLoopIndex < uiCountIPSrcAddresses; uiLoopIndex += uiIpv6AddrNoLongWords) {
Max Tottenham6704fc82012-04-03 12:35:30 +0100318 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
319 "\n Src Ipv6 Address In Received Packet :\n ");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700320 DumpIpv6Address(aulSrcIP);
Max Tottenham6704fc82012-04-03 12:35:30 +0100321 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
322 "\n Src Ipv6 Mask In Classifier Rule:\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700323 DumpIpv6Address(&pstClassifierRule->stSrcIpAddress.ulIpv6Mask[uiLoopIndex]);
Max Tottenham6704fc82012-04-03 12:35:30 +0100324 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
325 "\n Src Ipv6 Address In Classifier Rule :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700326 DumpIpv6Address(&pstClassifierRule->stSrcIpAddress.ulIpv6Addr[uiLoopIndex]);
327
Max Tottenham26908c92012-04-03 12:35:24 +0100328 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
329 if ((pstClassifierRule->stSrcIpAddress.ulIpv6Mask[uiLoopIndex+uiIpv6AddIndex] & aulSrcIP[uiIpv6AddIndex])
330 != pstClassifierRule->stSrcIpAddress.ulIpv6Addr[uiLoopIndex+uiIpv6AddIndex]) {
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100331 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100332 * Match failed for current Ipv6 Address
333 * Try next Ipv6 Address
334 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700335 break;
336 }
337
Max Tottenham26908c92012-04-03 12:35:24 +0100338 if (uiIpv6AddIndex == uiIpv6AddrNoLongWords-1) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100339 /* Match Found */
Max Tottenham6704fc82012-04-03 12:35:30 +0100340 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
341 DBG_LVL_ALL,
342 "Ipv6 Src Ip Address Matched\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700343 return TRUE;
344 }
345 }
346 }
347 return FALSE;
348}
349
Max Tottenham6704fc82012-04-03 12:35:30 +0100350static BOOLEAN MatchDestIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule,
351 IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700352{
Max Tottenham26908c92012-04-03 12:35:24 +0100353 UINT uiLoopIndex = 0;
354 UINT uiIpv6AddIndex = 0;
355 UINT uiIpv6AddrNoLongWords = 4;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700356 ULONG aulDestIP[4];
Max Tottenham26908c92012-04-03 12:35:24 +0100357 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100358 /*
359 * This is the no. of Destination Addresses
360 * ie Range of IP Addresses contained in the classifier rule
Max Tottenhamac8c1002012-04-03 12:35:25 +0100361 * for which we need to match
362 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700363 UINT uiCountIPDestinationAddresses = (UINT)pstClassifierRule->ucIPDestinationAddressLength;
364
365
Max Tottenham6d147062012-04-03 12:35:29 +0100366 if (uiCountIPDestinationAddresses == 0)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700367 return TRUE;
368
369
Max Tottenhamac8c1002012-04-03 12:35:25 +0100370 /* First Convert the Ip Address in the packet to Host Endian order */
Max Tottenhamfac290a2012-04-03 12:35:27 +0100371 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
372 aulDestIP[uiIpv6AddIndex] = ntohl(pstIpv6Header->ulDestIpAddress[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700373 }
374
Max Tottenhamfac290a2012-04-03 12:35:27 +0100375 for (uiLoopIndex = 0; uiLoopIndex < uiCountIPDestinationAddresses; uiLoopIndex += uiIpv6AddrNoLongWords) {
Max Tottenham6704fc82012-04-03 12:35:30 +0100376 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
377 "\n Destination Ipv6 Address In Received Packet :\n ");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700378 DumpIpv6Address(aulDestIP);
Max Tottenham6704fc82012-04-03 12:35:30 +0100379 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
380 "\n Destination Ipv6 Mask In Classifier Rule :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700381 DumpIpv6Address(&pstClassifierRule->stDestIpAddress.ulIpv6Mask[uiLoopIndex]);
Max Tottenham6704fc82012-04-03 12:35:30 +0100382 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
383 "\n Destination Ipv6 Address In Classifier Rule :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700384 DumpIpv6Address(&pstClassifierRule->stDestIpAddress.ulIpv6Addr[uiLoopIndex]);
385
Max Tottenham26908c92012-04-03 12:35:24 +0100386 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
387 if ((pstClassifierRule->stDestIpAddress.ulIpv6Mask[uiLoopIndex+uiIpv6AddIndex] & aulDestIP[uiIpv6AddIndex])
388 != pstClassifierRule->stDestIpAddress.ulIpv6Addr[uiLoopIndex+uiIpv6AddIndex]) {
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100389 /*
Max Tottenhamac8c1002012-04-03 12:35:25 +0100390 * Match failed for current Ipv6 Address.
391 * Try next Ipv6 Address
392 */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700393 break;
394 }
395
Max Tottenham26908c92012-04-03 12:35:24 +0100396 if (uiIpv6AddIndex == uiIpv6AddrNoLongWords-1) {
Max Tottenhamac8c1002012-04-03 12:35:25 +0100397 /* Match Found */
Max Tottenham6704fc82012-04-03 12:35:30 +0100398 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG,
399 DBG_LVL_ALL,
400 "Ipv6 Destination Ip Address Matched\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700401 return TRUE;
402 }
403 }
404 }
405 return FALSE;
406
407}
408
409VOID DumpIpv6Address(ULONG *puIpv6Address)
410{
411 UINT uiIpv6AddrNoLongWords = 4;
Max Tottenham26908c92012-04-03 12:35:24 +0100412 UINT uiIpv6AddIndex = 0;
413 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
414 for (uiIpv6AddIndex = 0; uiIpv6AddIndex < uiIpv6AddrNoLongWords; uiIpv6AddIndex++) {
Max Tottenham6704fc82012-04-03 12:35:30 +0100415 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
416 ":%lx", puIpv6Address[uiIpv6AddIndex]);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700417 }
418
419}
420
Stephen Hemminger9dd47ee2010-11-01 12:24:00 -0400421static VOID DumpIpv6Header(IPV6Header *pstIpv6Header)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700422{
423 UCHAR ucVersion;
Max Tottenham26908c92012-04-03 12:35:24 +0100424 UCHAR ucPrio;
425 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
Max Tottenham6704fc82012-04-03 12:35:30 +0100426 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
427 "----Ipv6 Header---");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700428 ucVersion = pstIpv6Header->ucVersionPrio & 0xf0;
Max Tottenham6704fc82012-04-03 12:35:30 +0100429 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
430 "Version : %x\n", ucVersion);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700431 ucPrio = pstIpv6Header->ucVersionPrio & 0x0f;
Max Tottenham6704fc82012-04-03 12:35:30 +0100432 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
433 "Priority : %x\n", ucPrio);
Max Tottenhamaadb4ec2012-04-03 12:35:28 +0100434 /*
435 * BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
Max Tottenham6704fc82012-04-03 12:35:30 +0100436 * "Flow Label : %x\n",(pstIpv6Header->ucVersionPrio &0xf0);
Max Tottenhamac8c1002012-04-03 12:35:25 +0100437 */
Max Tottenham6704fc82012-04-03 12:35:30 +0100438 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
439 "Payload Length : %x\n",
440 ntohs(pstIpv6Header->usPayloadLength));
441 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
442 "Next Header : %x\n", pstIpv6Header->ucNextHeader);
443 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
444 "Hop Limit : %x\n", pstIpv6Header->ucHopLimit);
445 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
446 "Src Address :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700447 DumpIpv6Address(pstIpv6Header->ulSrcIpAddress);
Max Tottenham6704fc82012-04-03 12:35:30 +0100448 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
449 "Dest Address :\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700450 DumpIpv6Address(pstIpv6Header->ulDestIpAddress);
Max Tottenham6704fc82012-04-03 12:35:30 +0100451 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL,
452 "----Ipv6 Header End---");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700453
454
455}