diff options
-rw-r--r-- | drivers/net/pppoe.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c index 35a7385ccb2a..68631a5721ac 100644 --- a/drivers/net/pppoe.c +++ b/drivers/net/pppoe.c | |||
@@ -108,19 +108,24 @@ static inline int cmp_addr(struct pppoe_addr *a, unsigned long sid, char *addr) | |||
108 | (memcmp(a->remote,addr,ETH_ALEN) == 0)); | 108 | (memcmp(a->remote,addr,ETH_ALEN) == 0)); |
109 | } | 109 | } |
110 | 110 | ||
111 | static int hash_item(unsigned long sid, unsigned char *addr) | 111 | #if 8%PPPOE_HASH_BITS |
112 | #error 8 must be a multiple of PPPOE_HASH_BITS | ||
113 | #endif | ||
114 | |||
115 | static int hash_item(unsigned int sid, unsigned char *addr) | ||
112 | { | 116 | { |
113 | char hash = 0; | 117 | unsigned char hash = 0; |
114 | int i, j; | 118 | unsigned int i; |
115 | 119 | ||
116 | for (i = 0; i < ETH_ALEN ; ++i) { | 120 | for (i = 0 ; i < ETH_ALEN ; i++) { |
117 | for (j = 0; j < 8/PPPOE_HASH_BITS ; ++j) { | 121 | hash ^= addr[i]; |
118 | hash ^= addr[i] >> ( j * PPPOE_HASH_BITS ); | 122 | } |
119 | } | 123 | for (i = 0 ; i < sizeof(sid_t)*8 ; i += 8 ){ |
124 | hash ^= sid>>i; | ||
125 | } | ||
126 | for (i = 8 ; (i>>=1) >= PPPOE_HASH_BITS ; ) { | ||
127 | hash ^= hash>>i; | ||
120 | } | 128 | } |
121 | |||
122 | for (i = 0; i < (sizeof(unsigned long)*8) / PPPOE_HASH_BITS ; ++i) | ||
123 | hash ^= sid >> (i*PPPOE_HASH_BITS); | ||
124 | 129 | ||
125 | return hash & ( PPPOE_HASH_SIZE - 1 ); | 130 | return hash & ( PPPOE_HASH_SIZE - 1 ); |
126 | } | 131 | } |