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 /*
  2  * INET         An implementation of the TCP/IP protocol suite for the LINUX
  3  *              operating system.  INET is implemented using the BSD Socket
  4  *              interface as the means of communication with the user level.
  5  *
  6  * Authors:     Lotsa people, from code originally in tcp
  7  *
  8  *      This program is free software; you can redistribute it and/or
  9  *      modify it under the terms of the GNU General Public License
 10  *      as published by the Free Software Foundation; either version
 11  *      2 of the License, or (at your option) any later version.
 12  */
 13 
 14 #ifndef _INET6_HASHTABLES_H
 15 #define _INET6_HASHTABLES_H
 16 
 17 
 18 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
 19 #include <linux/in6.h>
 20 #include <linux/ipv6.h>
 21 #include <linux/types.h>
 22 #include <linux/jhash.h>
 23 
 24 #include <net/inet_sock.h>
 25 
 26 #include <net/ipv6.h>
 27 
 28 struct inet_hashinfo;
 29 
 30 /* I have no idea if this is a good hash for v6 or not. -DaveM */
 31 static inline unsigned int inet6_ehashfn(const struct in6_addr *laddr, const u16 lport,
 32                                 const struct in6_addr *faddr, const __be16 fport)
 33 {
 34         u32 ports = (lport ^ (__force u16)fport);
 35 
 36         return jhash_3words((__force u32)laddr->s6_addr32[3],
 37                             (__force u32)faddr->s6_addr32[3],
 38                             ports, inet_ehash_secret);
 39 }
 40 
 41 static inline int inet6_sk_ehashfn(const struct sock *sk)
 42 {
 43         const struct inet_sock *inet = inet_sk(sk);
 44         const struct ipv6_pinfo *np = inet6_sk(sk);
 45         const struct in6_addr *laddr = &np->rcv_saddr;
 46         const struct in6_addr *faddr = &np->daddr;
 47         const __u16 lport = inet->num;
 48         const __be16 fport = inet->dport;
 49         return inet6_ehashfn(laddr, lport, faddr, fport);
 50 }
 51 
 52 extern void __inet6_hash(struct sock *sk);
 53 
 54 /*
 55  * Sockets in TCP_CLOSE state are _always_ taken out of the hash, so
 56  * we need not check it for TCP lookups anymore, thanks Alexey. -DaveM
 57  *
 58  * The sockhash lock must be held as a reader here.
 59  */
 60 extern struct sock *__inet6_lookup_established(struct net *net,
 61                                            struct inet_hashinfo *hashinfo,
 62                                            const struct in6_addr *saddr,
 63                                            const __be16 sport,
 64                                            const struct in6_addr *daddr,
 65                                            const u16 hnum,
 66                                            const int dif);
 67 
 68 extern struct sock *inet6_lookup_listener(struct net *net,
 69                                           struct inet_hashinfo *hashinfo,
 70                                           const struct in6_addr *daddr,
 71                                           const unsigned short hnum,
 72                                           const int dif);
 73 
 74 static inline struct sock *__inet6_lookup(struct net *net,
 75                                           struct inet_hashinfo *hashinfo,
 76                                           const struct in6_addr *saddr,
 77                                           const __be16 sport,
 78                                           const struct in6_addr *daddr,
 79                                           const u16 hnum,
 80                                           const int dif)
 81 {
 82         struct sock *sk = __inet6_lookup_established(net, hashinfo, saddr,
 83                                                 sport, daddr, hnum, dif);
 84         if (sk)
 85                 return sk;
 86 
 87         return inet6_lookup_listener(net, hashinfo, daddr, hnum, dif);
 88 }
 89 
 90 extern struct sock *inet6_lookup(struct net *net, struct inet_hashinfo *hashinfo,
 91                                  const struct in6_addr *saddr, const __be16 sport,
 92                                  const struct in6_addr *daddr, const __be16 dport,
 93                                  const int dif);
 94 #endif /* defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) */
 95 #endif /* _INET6_HASHTABLES_H */
 96 
  This page was automatically generated by the LXR engine.