OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [net/] [xfrm/] [xfrm_hash.h] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
#ifndef _XFRM_HASH_H
2
#define _XFRM_HASH_H
3
 
4
#include <linux/xfrm.h>
5
#include <linux/socket.h>
6
 
7
static inline unsigned int __xfrm4_addr_hash(xfrm_address_t *addr)
8
{
9
        return ntohl(addr->a4);
10
}
11
 
12
static inline unsigned int __xfrm6_addr_hash(xfrm_address_t *addr)
13
{
14
        return ntohl(addr->a6[2] ^ addr->a6[3]);
15
}
16
 
17
static inline unsigned int __xfrm4_daddr_saddr_hash(xfrm_address_t *daddr, xfrm_address_t *saddr)
18
{
19
        return ntohl(daddr->a4 ^ saddr->a4);
20
}
21
 
22
static inline unsigned int __xfrm6_daddr_saddr_hash(xfrm_address_t *daddr, xfrm_address_t *saddr)
23
{
24
        return ntohl(daddr->a6[2] ^ daddr->a6[3] ^
25
                     saddr->a6[2] ^ saddr->a6[3]);
26
}
27
 
28
static inline unsigned int __xfrm_dst_hash(xfrm_address_t *daddr, xfrm_address_t *saddr,
29
                                           u32 reqid, unsigned short family,
30
                                           unsigned int hmask)
31
{
32
        unsigned int h = family ^ reqid;
33
        switch (family) {
34
        case AF_INET:
35
                h ^= __xfrm4_daddr_saddr_hash(daddr, saddr);
36
                break;
37
        case AF_INET6:
38
                h ^= __xfrm6_daddr_saddr_hash(daddr, saddr);
39
                break;
40
        }
41
        return (h ^ (h >> 16)) & hmask;
42
}
43
 
44
static inline unsigned __xfrm_src_hash(xfrm_address_t *daddr,
45
                                       xfrm_address_t *saddr,
46
                                       unsigned short family,
47
                                       unsigned int hmask)
48
{
49
        unsigned int h = family;
50
        switch (family) {
51
        case AF_INET:
52
                h ^= __xfrm4_daddr_saddr_hash(daddr, saddr);
53
                break;
54
        case AF_INET6:
55
                h ^= __xfrm6_daddr_saddr_hash(daddr, saddr);
56
                break;
57
        };
58
        return (h ^ (h >> 16)) & hmask;
59
}
60
 
61
static inline unsigned int
62
__xfrm_spi_hash(xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family,
63
                unsigned int hmask)
64
{
65
        unsigned int h = (__force u32)spi ^ proto;
66
        switch (family) {
67
        case AF_INET:
68
                h ^= __xfrm4_addr_hash(daddr);
69
                break;
70
        case AF_INET6:
71
                h ^= __xfrm6_addr_hash(daddr);
72
                break;
73
        }
74
        return (h ^ (h >> 10) ^ (h >> 20)) & hmask;
75
}
76
 
77
static inline unsigned int __idx_hash(u32 index, unsigned int hmask)
78
{
79
        return (index ^ (index >> 8)) & hmask;
80
}
81
 
82
static inline unsigned int __sel_hash(struct xfrm_selector *sel, unsigned short family, unsigned int hmask)
83
{
84
        xfrm_address_t *daddr = &sel->daddr;
85
        xfrm_address_t *saddr = &sel->saddr;
86
        unsigned int h = 0;
87
 
88
        switch (family) {
89
        case AF_INET:
90
                if (sel->prefixlen_d != 32 ||
91
                    sel->prefixlen_s != 32)
92
                        return hmask + 1;
93
 
94
                h = __xfrm4_daddr_saddr_hash(daddr, saddr);
95
                break;
96
 
97
        case AF_INET6:
98
                if (sel->prefixlen_d != 128 ||
99
                    sel->prefixlen_s != 128)
100
                        return hmask + 1;
101
 
102
                h = __xfrm6_daddr_saddr_hash(daddr, saddr);
103
                break;
104
        };
105
        h ^= (h >> 16);
106
        return h & hmask;
107
}
108
 
109
static inline unsigned int __addr_hash(xfrm_address_t *daddr, xfrm_address_t *saddr, unsigned short family, unsigned int hmask)
110
{
111
        unsigned int h = 0;
112
 
113
        switch (family) {
114
        case AF_INET:
115
                h = __xfrm4_daddr_saddr_hash(daddr, saddr);
116
                break;
117
 
118
        case AF_INET6:
119
                h = __xfrm6_daddr_saddr_hash(daddr, saddr);
120
                break;
121
        };
122
        h ^= (h >> 16);
123
        return h & hmask;
124
}
125
 
126
extern struct hlist_head *xfrm_hash_alloc(unsigned int sz);
127
extern void xfrm_hash_free(struct hlist_head *n, unsigned int sz);
128
 
129
#endif /* _XFRM_HASH_H */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.