|
@@ -89,28 +89,12 @@ static u32 udp6_ehashfn(const struct net *net,
|
|
|
udp_ipv6_hash_secret + net_hash_mix(net));
|
|
|
}
|
|
|
|
|
|
-static u32 udp6_portaddr_hash(const struct net *net,
|
|
|
- const struct in6_addr *addr6,
|
|
|
- unsigned int port)
|
|
|
-{
|
|
|
- unsigned int hash, mix = net_hash_mix(net);
|
|
|
-
|
|
|
- if (ipv6_addr_any(addr6))
|
|
|
- hash = jhash_1word(0, mix);
|
|
|
- else if (ipv6_addr_v4mapped(addr6))
|
|
|
- hash = jhash_1word((__force u32)addr6->s6_addr32[3], mix);
|
|
|
- else
|
|
|
- hash = jhash2((__force u32 *)addr6->s6_addr32, 4, mix);
|
|
|
-
|
|
|
- return hash ^ port;
|
|
|
-}
|
|
|
-
|
|
|
int udp_v6_get_port(struct sock *sk, unsigned short snum)
|
|
|
{
|
|
|
unsigned int hash2_nulladdr =
|
|
|
- udp6_portaddr_hash(sock_net(sk), &in6addr_any, snum);
|
|
|
+ ipv6_portaddr_hash(sock_net(sk), &in6addr_any, snum);
|
|
|
unsigned int hash2_partial =
|
|
|
- udp6_portaddr_hash(sock_net(sk), &sk->sk_v6_rcv_saddr, 0);
|
|
|
+ ipv6_portaddr_hash(sock_net(sk), &sk->sk_v6_rcv_saddr, 0);
|
|
|
|
|
|
/* precompute partial secondary hash */
|
|
|
udp_sk(sk)->udp_portaddr_hash = hash2_partial;
|
|
@@ -119,7 +103,7 @@ int udp_v6_get_port(struct sock *sk, unsigned short snum)
|
|
|
|
|
|
static void udp_v6_rehash(struct sock *sk)
|
|
|
{
|
|
|
- u16 new_hash = udp6_portaddr_hash(sock_net(sk),
|
|
|
+ u16 new_hash = ipv6_portaddr_hash(sock_net(sk),
|
|
|
&sk->sk_v6_rcv_saddr,
|
|
|
inet_sk(sk)->inet_num);
|
|
|
|
|
@@ -225,7 +209,7 @@ struct sock *__udp6_lib_lookup(struct net *net,
|
|
|
u32 hash = 0;
|
|
|
|
|
|
if (hslot->count > 10) {
|
|
|
- hash2 = udp6_portaddr_hash(net, daddr, hnum);
|
|
|
+ hash2 = ipv6_portaddr_hash(net, daddr, hnum);
|
|
|
slot2 = hash2 & udptable->mask;
|
|
|
hslot2 = &udptable->hash2[slot2];
|
|
|
if (hslot->count < hslot2->count)
|
|
@@ -236,7 +220,7 @@ struct sock *__udp6_lib_lookup(struct net *net,
|
|
|
hslot2, skb);
|
|
|
if (!result) {
|
|
|
unsigned int old_slot2 = slot2;
|
|
|
- hash2 = udp6_portaddr_hash(net, &in6addr_any, hnum);
|
|
|
+ hash2 = ipv6_portaddr_hash(net, &in6addr_any, hnum);
|
|
|
slot2 = hash2 & udptable->mask;
|
|
|
/* avoid searching the same slot again. */
|
|
|
if (unlikely(slot2 == old_slot2))
|
|
@@ -705,9 +689,9 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
|
|
|
struct sk_buff *nskb;
|
|
|
|
|
|
if (use_hash2) {
|
|
|
- hash2_any = udp6_portaddr_hash(net, &in6addr_any, hnum) &
|
|
|
+ hash2_any = ipv6_portaddr_hash(net, &in6addr_any, hnum) &
|
|
|
udptable->mask;
|
|
|
- hash2 = udp6_portaddr_hash(net, daddr, hnum) & udptable->mask;
|
|
|
+ hash2 = ipv6_portaddr_hash(net, daddr, hnum) & udptable->mask;
|
|
|
start_lookup:
|
|
|
hslot = &udptable->hash2[hash2];
|
|
|
offset = offsetof(typeof(*sk), __sk_common.skc_portaddr_node);
|
|
@@ -895,7 +879,7 @@ static struct sock *__udp6_lib_demux_lookup(struct net *net,
|
|
|
int dif, int sdif)
|
|
|
{
|
|
|
unsigned short hnum = ntohs(loc_port);
|
|
|
- unsigned int hash2 = udp6_portaddr_hash(net, loc_addr, hnum);
|
|
|
+ unsigned int hash2 = ipv6_portaddr_hash(net, loc_addr, hnum);
|
|
|
unsigned int slot2 = hash2 & udp_table.mask;
|
|
|
struct udp_hslot *hslot2 = &udp_table.hash2[slot2];
|
|
|
const __portpair ports = INET_COMBINED_PORTS(rmt_port, hnum);
|