diff options
author | Eric Dumazet <edumazet@google.com> | 2013-10-03 18:42:29 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-09 00:01:25 -0400 |
commit | efe4208f47f907b86f528788da711e8ab9dea44d (patch) | |
tree | 8246b487be087877ba26d166f629d8c53d553ec1 /net/sctp/ipv6.c | |
parent | 05dbc7b59481ca891bbcfe6799a562d48159fbf7 (diff) |
ipv6: make lookups simpler and faster
TCP listener refactoring, part 4 :
To speed up inet lookups, we moved IPv4 addresses from inet to struct
sock_common
Now is time to do the same for IPv6, because it permits us to have fast
lookups for all kind of sockets, including upcoming SYN_RECV.
Getting IPv6 addresses in TCP lookups currently requires two extra cache
lines, plus a dereference (and memory stall).
inet6_sk(sk) does the dereference of inet_sk(__sk)->pinet6
This patch is way bigger than its IPv4 counter part, because for IPv4,
we could add aliases (inet_daddr, inet_rcv_saddr), while on IPv6,
it's not doable easily.
inet6_sk(sk)->daddr becomes sk->sk_v6_daddr
inet6_sk(sk)->rcv_saddr becomes sk->sk_v6_rcv_saddr
And timewait socket also have tw->tw_v6_daddr & tw->tw_v6_rcv_saddr
at the same offset.
We get rid of INET6_TW_MATCH() as INET6_MATCH() is now the generic
macro.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/ipv6.c')
-rw-r--r-- | net/sctp/ipv6.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index e7b2d4fe2b6a..f6334aa19151 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c | |||
@@ -426,20 +426,20 @@ static void sctp_v6_from_sk(union sctp_addr *addr, struct sock *sk) | |||
426 | { | 426 | { |
427 | addr->v6.sin6_family = AF_INET6; | 427 | addr->v6.sin6_family = AF_INET6; |
428 | addr->v6.sin6_port = 0; | 428 | addr->v6.sin6_port = 0; |
429 | addr->v6.sin6_addr = inet6_sk(sk)->rcv_saddr; | 429 | addr->v6.sin6_addr = sk->sk_v6_rcv_saddr; |
430 | } | 430 | } |
431 | 431 | ||
432 | /* Initialize sk->sk_rcv_saddr from sctp_addr. */ | 432 | /* Initialize sk->sk_rcv_saddr from sctp_addr. */ |
433 | static void sctp_v6_to_sk_saddr(union sctp_addr *addr, struct sock *sk) | 433 | static void sctp_v6_to_sk_saddr(union sctp_addr *addr, struct sock *sk) |
434 | { | 434 | { |
435 | if (addr->sa.sa_family == AF_INET && sctp_sk(sk)->v4mapped) { | 435 | if (addr->sa.sa_family == AF_INET && sctp_sk(sk)->v4mapped) { |
436 | inet6_sk(sk)->rcv_saddr.s6_addr32[0] = 0; | 436 | sk->sk_v6_rcv_saddr.s6_addr32[0] = 0; |
437 | inet6_sk(sk)->rcv_saddr.s6_addr32[1] = 0; | 437 | sk->sk_v6_rcv_saddr.s6_addr32[1] = 0; |
438 | inet6_sk(sk)->rcv_saddr.s6_addr32[2] = htonl(0x0000ffff); | 438 | sk->sk_v6_rcv_saddr.s6_addr32[2] = htonl(0x0000ffff); |
439 | inet6_sk(sk)->rcv_saddr.s6_addr32[3] = | 439 | sk->sk_v6_rcv_saddr.s6_addr32[3] = |
440 | addr->v4.sin_addr.s_addr; | 440 | addr->v4.sin_addr.s_addr; |
441 | } else { | 441 | } else { |
442 | inet6_sk(sk)->rcv_saddr = addr->v6.sin6_addr; | 442 | sk->sk_v6_rcv_saddr = addr->v6.sin6_addr; |
443 | } | 443 | } |
444 | } | 444 | } |
445 | 445 | ||
@@ -447,12 +447,12 @@ static void sctp_v6_to_sk_saddr(union sctp_addr *addr, struct sock *sk) | |||
447 | static void sctp_v6_to_sk_daddr(union sctp_addr *addr, struct sock *sk) | 447 | static void sctp_v6_to_sk_daddr(union sctp_addr *addr, struct sock *sk) |
448 | { | 448 | { |
449 | if (addr->sa.sa_family == AF_INET && sctp_sk(sk)->v4mapped) { | 449 | if (addr->sa.sa_family == AF_INET && sctp_sk(sk)->v4mapped) { |
450 | inet6_sk(sk)->daddr.s6_addr32[0] = 0; | 450 | sk->sk_v6_daddr.s6_addr32[0] = 0; |
451 | inet6_sk(sk)->daddr.s6_addr32[1] = 0; | 451 | sk->sk_v6_daddr.s6_addr32[1] = 0; |
452 | inet6_sk(sk)->daddr.s6_addr32[2] = htonl(0x0000ffff); | 452 | sk->sk_v6_daddr.s6_addr32[2] = htonl(0x0000ffff); |
453 | inet6_sk(sk)->daddr.s6_addr32[3] = addr->v4.sin_addr.s_addr; | 453 | sk->sk_v6_daddr.s6_addr32[3] = addr->v4.sin_addr.s_addr; |
454 | } else { | 454 | } else { |
455 | inet6_sk(sk)->daddr = addr->v6.sin6_addr; | 455 | sk->sk_v6_daddr = addr->v6.sin6_addr; |
456 | } | 456 | } |
457 | } | 457 | } |
458 | 458 | ||