Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 #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 */
130 
  This page was automatically generated by the LXR engine.