Commit | Line | Data |
---|---|---|
92b96797 FB |
1 | /* |
2 | * Copyright (c) 2003 VIA Networking, Inc. All rights reserved. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify | |
5 | * it under the terms of the GNU General Public License as published by | |
6 | * the Free Software Foundation; either version 2 of the License, or | |
7 | * (at your option) any later version. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, | |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | * GNU General Public License for more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License along | |
15 | * with this program; if not, write to the Free Software Foundation, Inc., | |
16 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 | * | |
18 | * | |
19 | * File: tether.c | |
20 | * | |
21 | * Purpose: | |
22 | * | |
23 | * Author: Tevin Chen | |
24 | * | |
25 | * Date: May 21, 1996 | |
26 | * | |
27 | * Functions: | |
a0a1f61a | 28 | * ETHbyGetHashIndexByCrc32 - Calculate multicast hash value by CRC32 |
92b96797 FB |
29 | * ETHbIsBufferCrc32Ok - Check CRC value of the buffer if Ok or not |
30 | * | |
31 | * Revision History: | |
32 | * | |
33 | */ | |
34 | ||
92b96797 | 35 | #include "device.h" |
92b96797 | 36 | #include "tmacro.h" |
92b96797 | 37 | #include "tcrc.h" |
92b96797 | 38 | #include "tether.h" |
92b96797 FB |
39 | |
40 | /*--------------------- Static Definitions -------------------------*/ | |
41 | ||
42 | /*--------------------- Static Classes ----------------------------*/ | |
43 | ||
44 | /*--------------------- Static Variables --------------------------*/ | |
45 | ||
46 | /*--------------------- Static Functions --------------------------*/ | |
47 | ||
48 | /*--------------------- Export Variables --------------------------*/ | |
49 | ||
50 | ||
51 | ||
52 | /* | |
a0a1f61a | 53 | * Description: Calculate multicast hash value by CRC32 |
92b96797 FB |
54 | * |
55 | * Parameters: | |
56 | * In: | |
57 | * pbyMultiAddr - Multicast Address | |
58 | * Out: | |
59 | * none | |
60 | * | |
61 | * Return Value: Hash value | |
62 | * | |
63 | */ | |
b77694be | 64 | BYTE ETHbyGetHashIndexByCrc32(PBYTE pbyMultiAddr) |
92b96797 | 65 | { |
b77694be DKT |
66 | int ii; |
67 | BYTE byTmpHash; | |
68 | BYTE byHash = 0; | |
92b96797 | 69 | |
b77694be | 70 | /* get the least 6-bits from CRC generator */ |
9a0e756c | 71 | byTmpHash = (BYTE)(CRCdwCrc32(pbyMultiAddr, ETH_ALEN, |
b77694be DKT |
72 | 0xFFFFFFFFL) & 0x3F); |
73 | /* reverse most bit to least bit */ | |
74 | for (ii = 0; ii < (sizeof(byTmpHash) * 8); ii++) { | |
75 | byHash <<= 1; | |
76 | if (byTmpHash & 0x01) | |
77 | byHash |= 1; | |
78 | byTmpHash >>= 1; | |
79 | } | |
92b96797 | 80 | |
b77694be DKT |
81 | /* adjust 6-bits to the right most */ |
82 | return byHash >> 2; | |
92b96797 FB |
83 | } |
84 | ||
85 | ||
86 | /* | |
87 | * Description: Check CRC value of the buffer if Ok or not | |
88 | * | |
89 | * Parameters: | |
90 | * In: | |
91 | * pbyBuffer - pointer of buffer (normally is rx buffer) | |
92 | * cbFrameLength - length of buffer, including CRC portion | |
93 | * Out: | |
94 | * none | |
95 | * | |
96 | * Return Value: TRUE if ok; FALSE if error. | |
97 | * | |
98 | */ | |
cc856e61 | 99 | BOOL ETHbIsBufferCrc32Ok(PBYTE pbyBuffer, unsigned int cbFrameLength) |
92b96797 | 100 | { |
b77694be | 101 | DWORD dwCRC; |
92b96797 | 102 | |
b77694be DKT |
103 | dwCRC = CRCdwGetCrc32(pbyBuffer, cbFrameLength - 4); |
104 | if (cpu_to_le32(*((PDWORD)(pbyBuffer + cbFrameLength - 4))) != dwCRC) | |
105 | return FALSE; | |
106 | return TRUE; | |
92b96797 FB |
107 | } |
108 |