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: 28 * ETHbyGetHashIndexByCrc32 - Caculate multicast hash value by CRC32 29 * ETHbIsBufferCrc32Ok - Check CRC value of the buffer if Ok or not 30 * 31 * Revision History: 32 * 33 */ 34 35#include "device.h" 36#include "tmacro.h" 37#include "tcrc.h" 38#include "tether.h" 39 40/*--------------------- Static Definitions -------------------------*/ 41 42/*--------------------- Static Classes ----------------------------*/ 43 44/*--------------------- Static Variables --------------------------*/ 45 46/*--------------------- Static Functions --------------------------*/ 47 48/*--------------------- Export Variables --------------------------*/ 49 50 51 52/* 53 * Description: Caculate multicast hash value by CRC32 54 * 55 * Parameters: 56 * In: 57 * pbyMultiAddr - Multicast Address 58 * Out: 59 * none 60 * 61 * Return Value: Hash value 62 * 63 */ 64unsigned char ETHbyGetHashIndexByCrc32 (unsigned char *pbyMultiAddr) 65{ 66 int ii; 67 unsigned char byTmpHash; 68 unsigned char byHash = 0; 69 70 // get the least 6-bits from CRC generator 71 byTmpHash = (unsigned char)(CRCdwCrc32(pbyMultiAddr, ETH_ALEN, 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 } 80 81 // adjust 6-bits to the right most 82 return (byHash >> 2); 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 */ 99bool ETHbIsBufferCrc32Ok (unsigned char *pbyBuffer, unsigned int cbFrameLength) 100{ 101 unsigned long dwCRC; 102 103 dwCRC = CRCdwGetCrc32(pbyBuffer, cbFrameLength - 4); 104 if (cpu_to_le32(*((unsigned long *)(pbyBuffer + cbFrameLength - 4))) != dwCRC) { 105 return false; 106 } 107 return true; 108} 109