aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2013-10-03 18:42:29 -0400
committerDavid S. Miller <davem@davemloft.net>2013-10-09 00:01:25 -0400
commitefe4208f47f907b86f528788da711e8ab9dea44d (patch)
tree8246b487be087877ba26d166f629d8c53d553ec1
parent05dbc7b59481ca891bbcfe6799a562d48159fbf7 (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>
-rw-r--r--include/linux/ipv6.h46
-rw-r--r--include/net/inet6_hashtables.h5
-rw-r--r--include/net/inet_timewait_sock.h4
-rw-r--r--include/net/ip.h2
-rw-r--r--include/net/ip6_checksum.h2
-rw-r--r--include/net/sock.h9
-rw-r--r--net/dccp/ipv6.c24
-rw-r--r--net/dccp/ipv6.h1
-rw-r--r--net/dccp/minisocks.c7
-rw-r--r--net/ipv4/inet_diag.c35
-rw-r--r--net/ipv4/ping.c15
-rw-r--r--net/ipv4/tcp_metrics.c10
-rw-r--r--net/ipv4/tcp_minisocks.c7
-rw-r--r--net/ipv4/tcp_probe.c29
-rw-r--r--net/ipv4/tcp_timer.c3
-rw-r--r--net/ipv6/af_inet6.c10
-rw-r--r--net/ipv6/datagram.c25
-rw-r--r--net/ipv6/inet6_connection_sock.c7
-rw-r--r--net/ipv6/inet6_hashtables.c58
-rw-r--r--net/ipv6/ipv6_sockglue.c7
-rw-r--r--net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c4
-rw-r--r--net/ipv6/ping.c2
-rw-r--r--net/ipv6/raw.c17
-rw-r--r--net/ipv6/tcp_ipv6.c44
-rw-r--r--net/ipv6/udp.c48
-rw-r--r--net/l2tp/l2tp_core.c10
-rw-r--r--net/l2tp/l2tp_debugfs.c5
-rw-r--r--net/l2tp/l2tp_ip6.c16
-rw-r--r--net/l2tp/l2tp_netlink.c4
-rw-r--r--net/l2tp/l2tp_ppp.c12
-rw-r--r--net/netfilter/xt_TPROXY.c2
-rw-r--r--net/netfilter/xt_socket.c2
-rw-r--r--net/sctp/ipv6.c22
-rw-r--r--net/sunrpc/svcsock.c2
-rw-r--r--security/lsm_audit.c5
35 files changed, 213 insertions, 288 deletions
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
index b7f1f3bb346d..35f6c1b562c4 100644
--- a/include/linux/ipv6.h
+++ b/include/linux/ipv6.h
@@ -141,8 +141,6 @@ struct ipv6_fl_socklist;
141 */ 141 */
142struct ipv6_pinfo { 142struct ipv6_pinfo {
143 struct in6_addr saddr; 143 struct in6_addr saddr;
144 struct in6_addr rcv_saddr;
145 struct in6_addr daddr;
146 struct in6_pktinfo sticky_pktinfo; 144 struct in6_pktinfo sticky_pktinfo;
147 const struct in6_addr *daddr_cache; 145 const struct in6_addr *daddr_cache;
148#ifdef CONFIG_IPV6_SUBTREES 146#ifdef CONFIG_IPV6_SUBTREES
@@ -256,22 +254,10 @@ struct tcp6_sock {
256 254
257extern int inet6_sk_rebuild_header(struct sock *sk); 255extern int inet6_sk_rebuild_header(struct sock *sk);
258 256
259struct inet6_timewait_sock {
260 struct in6_addr tw_v6_daddr;
261 struct in6_addr tw_v6_rcv_saddr;
262};
263
264struct tcp6_timewait_sock { 257struct tcp6_timewait_sock {
265 struct tcp_timewait_sock tcp6tw_tcp; 258 struct tcp_timewait_sock tcp6tw_tcp;
266 struct inet6_timewait_sock tcp6tw_inet6;
267}; 259};
268 260
269static inline struct inet6_timewait_sock *inet6_twsk(const struct sock *sk)
270{
271 return (struct inet6_timewait_sock *)(((u8 *)sk) +
272 inet_twsk(sk)->tw_ipv6_offset);
273}
274
275#if IS_ENABLED(CONFIG_IPV6) 261#if IS_ENABLED(CONFIG_IPV6)
276static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk) 262static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
277{ 263{
@@ -321,21 +307,11 @@ static inline void inet_sk_copy_descendant(struct sock *sk_to,
321#define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only) 307#define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only)
322#define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk)) 308#define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
323 309
324static inline u16 inet6_tw_offset(const struct proto *prot) 310static inline const struct in6_addr *inet6_rcv_saddr(const struct sock *sk)
325{
326 return prot->twsk_prot->twsk_obj_size -
327 sizeof(struct inet6_timewait_sock);
328}
329
330static inline struct in6_addr *__inet6_rcv_saddr(const struct sock *sk)
331{ 311{
332 return likely(sk->sk_state != TCP_TIME_WAIT) ? 312 if (sk->sk_family == AF_INET6)
333 &inet6_sk(sk)->rcv_saddr : &inet6_twsk(sk)->tw_v6_rcv_saddr; 313 return &sk->sk_v6_rcv_saddr;
334} 314 return NULL;
335
336static inline struct in6_addr *inet6_rcv_saddr(const struct sock *sk)
337{
338 return sk->sk_family == AF_INET6 ? __inet6_rcv_saddr(sk) : NULL;
339} 315}
340 316
341static inline int inet_v6_ipv6only(const struct sock *sk) 317static inline int inet_v6_ipv6only(const struct sock *sk)
@@ -363,7 +339,6 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk)
363 return NULL; 339 return NULL;
364} 340}
365 341
366#define __inet6_rcv_saddr(__sk) NULL
367#define inet6_rcv_saddr(__sk) NULL 342#define inet6_rcv_saddr(__sk) NULL
368#define tcp_twsk_ipv6only(__sk) 0 343#define tcp_twsk_ipv6only(__sk) 0
369#define inet_v6_ipv6only(__sk) 0 344#define inet_v6_ipv6only(__sk) 0
@@ -372,19 +347,10 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk)
372#define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ 347#define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \
373 (((__sk)->sk_portpair == (__ports)) && \ 348 (((__sk)->sk_portpair == (__ports)) && \
374 ((__sk)->sk_family == AF_INET6) && \ 349 ((__sk)->sk_family == AF_INET6) && \
375 ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \ 350 ipv6_addr_equal(&(__sk)->sk_v6_daddr, (__saddr)) && \
376 ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ 351 ipv6_addr_equal(&(__sk)->sk_v6_rcv_saddr, (__daddr)) && \
377 (!(__sk)->sk_bound_dev_if || \ 352 (!(__sk)->sk_bound_dev_if || \
378 ((__sk)->sk_bound_dev_if == (__dif))) && \ 353 ((__sk)->sk_bound_dev_if == (__dif))) && \
379 net_eq(sock_net(__sk), (__net))) 354 net_eq(sock_net(__sk), (__net)))
380 355
381#define INET6_TW_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \
382 (((__sk)->sk_portpair == (__ports)) && \
383 ((__sk)->sk_family == AF_INET6) && \
384 ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr)) && \
385 ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_rcv_saddr, (__daddr)) && \
386 (!(__sk)->sk_bound_dev_if || \
387 ((__sk)->sk_bound_dev_if == (__dif))) && \
388 net_eq(sock_net(__sk), (__net)))
389
390#endif /* _IPV6_H */ 356#endif /* _IPV6_H */
diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h
index f52fa88feb64..a105d1a2fc00 100644
--- a/include/net/inet6_hashtables.h
+++ b/include/net/inet6_hashtables.h
@@ -43,9 +43,8 @@ static inline unsigned int inet6_ehashfn(struct net *net,
43static inline int inet6_sk_ehashfn(const struct sock *sk) 43static inline int inet6_sk_ehashfn(const struct sock *sk)
44{ 44{
45 const struct inet_sock *inet = inet_sk(sk); 45 const struct inet_sock *inet = inet_sk(sk);
46 const struct ipv6_pinfo *np = inet6_sk(sk); 46 const struct in6_addr *laddr = &sk->sk_v6_rcv_saddr;
47 const struct in6_addr *laddr = &np->rcv_saddr; 47 const struct in6_addr *faddr = &sk->sk_v6_daddr;
48 const struct in6_addr *faddr = &np->daddr;
49 const __u16 lport = inet->inet_num; 48 const __u16 lport = inet->inet_num;
50 const __be16 fport = inet->inet_dport; 49 const __be16 fport = inet->inet_dport;
51 struct net *net = sock_net(sk); 50 struct net *net = sock_net(sk);
diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h
index de9e3ab7d43d..b647c6270eb7 100644
--- a/include/net/inet_timewait_sock.h
+++ b/include/net/inet_timewait_sock.h
@@ -116,7 +116,9 @@ struct inet_timewait_sock {
116#define tw_prot __tw_common.skc_prot 116#define tw_prot __tw_common.skc_prot
117#define tw_net __tw_common.skc_net 117#define tw_net __tw_common.skc_net
118#define tw_daddr __tw_common.skc_daddr 118#define tw_daddr __tw_common.skc_daddr
119#define tw_v6_daddr __tw_common.skc_v6_daddr
119#define tw_rcv_saddr __tw_common.skc_rcv_saddr 120#define tw_rcv_saddr __tw_common.skc_rcv_saddr
121#define tw_v6_rcv_saddr __tw_common.skc_v6_rcv_saddr
120#define tw_dport __tw_common.skc_dport 122#define tw_dport __tw_common.skc_dport
121#define tw_num __tw_common.skc_num 123#define tw_num __tw_common.skc_num
122 124
@@ -133,7 +135,7 @@ struct inet_timewait_sock {
133 tw_transparent : 1, 135 tw_transparent : 1,
134 tw_pad : 6, /* 6 bits hole */ 136 tw_pad : 6, /* 6 bits hole */
135 tw_tos : 8, 137 tw_tos : 8,
136 tw_ipv6_offset : 16; 138 tw_pad2 : 16 /* 16 bits hole */
137 kmemcheck_bitfield_end(flags); 139 kmemcheck_bitfield_end(flags);
138 u32 tw_ttd; 140 u32 tw_ttd;
139 struct inet_bind_bucket *tw_tb; 141 struct inet_bind_bucket *tw_tb;
diff --git a/include/net/ip.h b/include/net/ip.h
index b39ebe5339ac..217bc5bfc6c6 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -374,7 +374,7 @@ static __inline__ void inet_reset_saddr(struct sock *sk)
374 struct ipv6_pinfo *np = inet6_sk(sk); 374 struct ipv6_pinfo *np = inet6_sk(sk);
375 375
376 memset(&np->saddr, 0, sizeof(np->saddr)); 376 memset(&np->saddr, 0, sizeof(np->saddr));
377 memset(&np->rcv_saddr, 0, sizeof(np->rcv_saddr)); 377 memset(&sk->sk_v6_rcv_saddr, 0, sizeof(sk->sk_v6_rcv_saddr));
378 } 378 }
379#endif 379#endif
380} 380}
diff --git a/include/net/ip6_checksum.h b/include/net/ip6_checksum.h
index 7686e3f5033d..1944406949ba 100644
--- a/include/net/ip6_checksum.h
+++ b/include/net/ip6_checksum.h
@@ -70,7 +70,7 @@ static inline void tcp_v6_send_check(struct sock *sk, struct sk_buff *skb)
70{ 70{
71 struct ipv6_pinfo *np = inet6_sk(sk); 71 struct ipv6_pinfo *np = inet6_sk(sk);
72 72
73 __tcp_v6_send_check(skb, &np->saddr, &np->daddr); 73 __tcp_v6_send_check(skb, &np->saddr, &sk->sk_v6_daddr);
74} 74}
75 75
76int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto); 76int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto);
diff --git a/include/net/sock.h b/include/net/sock.h
index 3f3e48c4704d..7e50df5c71d4 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -191,6 +191,12 @@ struct sock_common {
191#ifdef CONFIG_NET_NS 191#ifdef CONFIG_NET_NS
192 struct net *skc_net; 192 struct net *skc_net;
193#endif 193#endif
194
195#if IS_ENABLED(CONFIG_IPV6)
196 struct in6_addr skc_v6_daddr;
197 struct in6_addr skc_v6_rcv_saddr;
198#endif
199
194 /* 200 /*
195 * fields between dontcopy_begin/dontcopy_end 201 * fields between dontcopy_begin/dontcopy_end
196 * are not copied in sock_copy() 202 * are not copied in sock_copy()
@@ -314,6 +320,9 @@ struct sock {
314#define sk_bind_node __sk_common.skc_bind_node 320#define sk_bind_node __sk_common.skc_bind_node
315#define sk_prot __sk_common.skc_prot 321#define sk_prot __sk_common.skc_prot
316#define sk_net __sk_common.skc_net 322#define sk_net __sk_common.skc_net
323#define sk_v6_daddr __sk_common.skc_v6_daddr
324#define sk_v6_rcv_saddr __sk_common.skc_v6_rcv_saddr
325
317 socket_lock_t sk_lock; 326 socket_lock_t sk_lock;
318 struct sk_buff_head sk_receive_queue; 327 struct sk_buff_head sk_receive_queue;
319 /* 328 /*
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c
index 6cf9f7782ad4..7f075b83128a 100644
--- a/net/dccp/ipv6.c
+++ b/net/dccp/ipv6.c
@@ -67,7 +67,7 @@ static inline void dccp_v6_send_check(struct sock *sk, struct sk_buff *skb)
67 struct dccp_hdr *dh = dccp_hdr(skb); 67 struct dccp_hdr *dh = dccp_hdr(skb);
68 68
69 dccp_csum_outgoing(skb); 69 dccp_csum_outgoing(skb);
70 dh->dccph_checksum = dccp_v6_csum_finish(skb, &np->saddr, &np->daddr); 70 dh->dccph_checksum = dccp_v6_csum_finish(skb, &np->saddr, &sk->sk_v6_daddr);
71} 71}
72 72
73static inline __u64 dccp_v6_init_sequence(struct sk_buff *skb) 73static inline __u64 dccp_v6_init_sequence(struct sk_buff *skb)
@@ -467,11 +467,11 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk,
467 467
468 memcpy(newnp, np, sizeof(struct ipv6_pinfo)); 468 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
469 469
470 ipv6_addr_set_v4mapped(newinet->inet_daddr, &newnp->daddr); 470 ipv6_addr_set_v4mapped(newinet->inet_daddr, &newsk->sk_v6_daddr);
471 471
472 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr); 472 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr);
473 473
474 newnp->rcv_saddr = newnp->saddr; 474 newsk->sk_v6_rcv_saddr = newnp->saddr;
475 475
476 inet_csk(newsk)->icsk_af_ops = &dccp_ipv6_mapped; 476 inet_csk(newsk)->icsk_af_ops = &dccp_ipv6_mapped;
477 newsk->sk_backlog_rcv = dccp_v4_do_rcv; 477 newsk->sk_backlog_rcv = dccp_v4_do_rcv;
@@ -538,9 +538,9 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk,
538 538
539 memcpy(newnp, np, sizeof(struct ipv6_pinfo)); 539 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
540 540
541 newnp->daddr = ireq6->rmt_addr; 541 newsk->sk_v6_daddr = ireq6->rmt_addr;
542 newnp->saddr = ireq6->loc_addr; 542 newnp->saddr = ireq6->loc_addr;
543 newnp->rcv_saddr = ireq6->loc_addr; 543 newsk->sk_v6_rcv_saddr = ireq6->loc_addr;
544 newsk->sk_bound_dev_if = ireq6->iif; 544 newsk->sk_bound_dev_if = ireq6->iif;
545 545
546 /* Now IPv6 options... 546 /* Now IPv6 options...
@@ -885,7 +885,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
885 return -EINVAL; 885 return -EINVAL;
886 } 886 }
887 887
888 np->daddr = usin->sin6_addr; 888 sk->sk_v6_daddr = usin->sin6_addr;
889 np->flow_label = fl6.flowlabel; 889 np->flow_label = fl6.flowlabel;
890 890
891 /* 891 /*
@@ -915,16 +915,16 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
915 goto failure; 915 goto failure;
916 } 916 }
917 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr); 917 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr);
918 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, &np->rcv_saddr); 918 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, &sk->sk_v6_rcv_saddr);
919 919
920 return err; 920 return err;
921 } 921 }
922 922
923 if (!ipv6_addr_any(&np->rcv_saddr)) 923 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr))
924 saddr = &np->rcv_saddr; 924 saddr = &sk->sk_v6_rcv_saddr;
925 925
926 fl6.flowi6_proto = IPPROTO_DCCP; 926 fl6.flowi6_proto = IPPROTO_DCCP;
927 fl6.daddr = np->daddr; 927 fl6.daddr = sk->sk_v6_daddr;
928 fl6.saddr = saddr ? *saddr : np->saddr; 928 fl6.saddr = saddr ? *saddr : np->saddr;
929 fl6.flowi6_oif = sk->sk_bound_dev_if; 929 fl6.flowi6_oif = sk->sk_bound_dev_if;
930 fl6.fl6_dport = usin->sin6_port; 930 fl6.fl6_dport = usin->sin6_port;
@@ -941,7 +941,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
941 941
942 if (saddr == NULL) { 942 if (saddr == NULL) {
943 saddr = &fl6.saddr; 943 saddr = &fl6.saddr;
944 np->rcv_saddr = *saddr; 944 sk->sk_v6_rcv_saddr = *saddr;
945 } 945 }
946 946
947 /* set the source address */ 947 /* set the source address */
@@ -963,7 +963,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
963 goto late_failure; 963 goto late_failure;
964 964
965 dp->dccps_iss = secure_dccpv6_sequence_number(np->saddr.s6_addr32, 965 dp->dccps_iss = secure_dccpv6_sequence_number(np->saddr.s6_addr32,
966 np->daddr.s6_addr32, 966 sk->sk_v6_daddr.s6_addr32,
967 inet->inet_sport, 967 inet->inet_sport,
968 inet->inet_dport); 968 inet->inet_dport);
969 err = dccp_connect(sk); 969 err = dccp_connect(sk);
diff --git a/net/dccp/ipv6.h b/net/dccp/ipv6.h
index 6eef81fdbe56..6604fc3fe953 100644
--- a/net/dccp/ipv6.h
+++ b/net/dccp/ipv6.h
@@ -30,7 +30,6 @@ struct dccp6_request_sock {
30 30
31struct dccp6_timewait_sock { 31struct dccp6_timewait_sock {
32 struct inet_timewait_sock inet; 32 struct inet_timewait_sock inet;
33 struct inet6_timewait_sock tw6;
34}; 33};
35 34
36#endif /* _DCCP_IPV6_H */ 35#endif /* _DCCP_IPV6_H */
diff --git a/net/dccp/minisocks.c b/net/dccp/minisocks.c
index 662071b249cc..32e80d96d4c0 100644
--- a/net/dccp/minisocks.c
+++ b/net/dccp/minisocks.c
@@ -56,12 +56,9 @@ void dccp_time_wait(struct sock *sk, int state, int timeo)
56#if IS_ENABLED(CONFIG_IPV6) 56#if IS_ENABLED(CONFIG_IPV6)
57 if (tw->tw_family == PF_INET6) { 57 if (tw->tw_family == PF_INET6) {
58 const struct ipv6_pinfo *np = inet6_sk(sk); 58 const struct ipv6_pinfo *np = inet6_sk(sk);
59 struct inet6_timewait_sock *tw6;
60 59
61 tw->tw_ipv6_offset = inet6_tw_offset(sk->sk_prot); 60 tw->tw_v6_daddr = sk->sk_v6_daddr;
62 tw6 = inet6_twsk((struct sock *)tw); 61 tw->tw_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
63 tw6->tw_v6_daddr = np->daddr;
64 tw6->tw_v6_rcv_saddr = np->rcv_saddr;
65 tw->tw_ipv6only = np->ipv6only; 62 tw->tw_ipv6only = np->ipv6only;
66 } 63 }
67#endif 64#endif
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index 8e1e40653357..ecc179d676e4 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -121,13 +121,13 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk,
121 121
122#if IS_ENABLED(CONFIG_IPV6) 122#if IS_ENABLED(CONFIG_IPV6)
123 if (r->idiag_family == AF_INET6) { 123 if (r->idiag_family == AF_INET6) {
124 const struct ipv6_pinfo *np = inet6_sk(sk);
125 124
126 *(struct in6_addr *)r->id.idiag_src = np->rcv_saddr; 125 *(struct in6_addr *)r->id.idiag_src = sk->sk_v6_rcv_saddr;
127 *(struct in6_addr *)r->id.idiag_dst = np->daddr; 126 *(struct in6_addr *)r->id.idiag_dst = sk->sk_v6_daddr;
128 127
129 if (ext & (1 << (INET_DIAG_TCLASS - 1))) 128 if (ext & (1 << (INET_DIAG_TCLASS - 1)))
130 if (nla_put_u8(skb, INET_DIAG_TCLASS, np->tclass) < 0) 129 if (nla_put_u8(skb, INET_DIAG_TCLASS,
130 inet6_sk(sk)->tclass) < 0)
131 goto errout; 131 goto errout;
132 } 132 }
133#endif 133#endif
@@ -255,11 +255,8 @@ static int inet_twsk_diag_fill(struct inet_timewait_sock *tw,
255 r->idiag_inode = 0; 255 r->idiag_inode = 0;
256#if IS_ENABLED(CONFIG_IPV6) 256#if IS_ENABLED(CONFIG_IPV6)
257 if (tw->tw_family == AF_INET6) { 257 if (tw->tw_family == AF_INET6) {
258 const struct inet6_timewait_sock *tw6 = 258 *(struct in6_addr *)r->id.idiag_src = tw->tw_v6_rcv_saddr;
259 inet6_twsk((struct sock *)tw); 259 *(struct in6_addr *)r->id.idiag_dst = tw->tw_v6_daddr;
260
261 *(struct in6_addr *)r->id.idiag_src = tw6->tw_v6_rcv_saddr;
262 *(struct in6_addr *)r->id.idiag_dst = tw6->tw_v6_daddr;
263 } 260 }
264#endif 261#endif
265 262
@@ -273,10 +270,11 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb,
273 const struct nlmsghdr *unlh) 270 const struct nlmsghdr *unlh)
274{ 271{
275 if (sk->sk_state == TCP_TIME_WAIT) 272 if (sk->sk_state == TCP_TIME_WAIT)
276 return inet_twsk_diag_fill((struct inet_timewait_sock *)sk, 273 return inet_twsk_diag_fill(inet_twsk(sk), skb, r, portid, seq,
277 skb, r, portid, seq, nlmsg_flags, 274 nlmsg_flags, unlh);
278 unlh); 275
279 return inet_csk_diag_fill(sk, skb, r, user_ns, portid, seq, nlmsg_flags, unlh); 276 return inet_csk_diag_fill(sk, skb, r, user_ns, portid, seq,
277 nlmsg_flags, unlh);
280} 278}
281 279
282int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb, 280int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb,
@@ -489,10 +487,9 @@ int inet_diag_bc_sk(const struct nlattr *bc, struct sock *sk)
489 entry.family = sk->sk_family; 487 entry.family = sk->sk_family;
490#if IS_ENABLED(CONFIG_IPV6) 488#if IS_ENABLED(CONFIG_IPV6)
491 if (entry.family == AF_INET6) { 489 if (entry.family == AF_INET6) {
492 struct ipv6_pinfo *np = inet6_sk(sk);
493 490
494 entry.saddr = np->rcv_saddr.s6_addr32; 491 entry.saddr = sk->sk_v6_rcv_saddr.s6_addr32;
495 entry.daddr = np->daddr.s6_addr32; 492 entry.daddr = sk->sk_v6_daddr.s6_addr32;
496 } else 493 } else
497#endif 494#endif
498 { 495 {
@@ -649,10 +646,8 @@ static int inet_twsk_diag_dump(struct sock *sk,
649 entry.family = tw->tw_family; 646 entry.family = tw->tw_family;
650#if IS_ENABLED(CONFIG_IPV6) 647#if IS_ENABLED(CONFIG_IPV6)
651 if (tw->tw_family == AF_INET6) { 648 if (tw->tw_family == AF_INET6) {
652 struct inet6_timewait_sock *tw6 = 649 entry.saddr = tw->tw_v6_rcv_saddr.s6_addr32;
653 inet6_twsk((struct sock *)tw); 650 entry.daddr = tw->tw_v6_daddr.s6_addr32;
654 entry.saddr = tw6->tw_v6_rcv_saddr.s6_addr32;
655 entry.daddr = tw6->tw_v6_daddr.s6_addr32;
656 } else 651 } else
657#endif 652#endif
658 { 653 {
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
index a62610443152..ccefc07beacd 100644
--- a/net/ipv4/ping.c
+++ b/net/ipv4/ping.c
@@ -202,15 +202,14 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident)
202#if IS_ENABLED(CONFIG_IPV6) 202#if IS_ENABLED(CONFIG_IPV6)
203 } else if (skb->protocol == htons(ETH_P_IPV6) && 203 } else if (skb->protocol == htons(ETH_P_IPV6) &&
204 sk->sk_family == AF_INET6) { 204 sk->sk_family == AF_INET6) {
205 struct ipv6_pinfo *np = inet6_sk(sk);
206 205
207 pr_debug("found: %p: num=%d, daddr=%pI6c, dif=%d\n", sk, 206 pr_debug("found: %p: num=%d, daddr=%pI6c, dif=%d\n", sk,
208 (int) isk->inet_num, 207 (int) isk->inet_num,
209 &inet6_sk(sk)->rcv_saddr, 208 &sk->sk_v6_rcv_saddr,
210 sk->sk_bound_dev_if); 209 sk->sk_bound_dev_if);
211 210
212 if (!ipv6_addr_any(&np->rcv_saddr) && 211 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr) &&
213 !ipv6_addr_equal(&np->rcv_saddr, 212 !ipv6_addr_equal(&sk->sk_v6_rcv_saddr,
214 &ipv6_hdr(skb)->daddr)) 213 &ipv6_hdr(skb)->daddr))
215 continue; 214 continue;
216#endif 215#endif
@@ -362,7 +361,7 @@ static void ping_set_saddr(struct sock *sk, struct sockaddr *saddr)
362 } else if (saddr->sa_family == AF_INET6) { 361 } else if (saddr->sa_family == AF_INET6) {
363 struct sockaddr_in6 *addr = (struct sockaddr_in6 *) saddr; 362 struct sockaddr_in6 *addr = (struct sockaddr_in6 *) saddr;
364 struct ipv6_pinfo *np = inet6_sk(sk); 363 struct ipv6_pinfo *np = inet6_sk(sk);
365 np->rcv_saddr = np->saddr = addr->sin6_addr; 364 sk->sk_v6_rcv_saddr = np->saddr = addr->sin6_addr;
366#endif 365#endif
367 } 366 }
368} 367}
@@ -376,7 +375,7 @@ static void ping_clear_saddr(struct sock *sk, int dif)
376#if IS_ENABLED(CONFIG_IPV6) 375#if IS_ENABLED(CONFIG_IPV6)
377 } else if (sk->sk_family == AF_INET6) { 376 } else if (sk->sk_family == AF_INET6) {
378 struct ipv6_pinfo *np = inet6_sk(sk); 377 struct ipv6_pinfo *np = inet6_sk(sk);
379 memset(&np->rcv_saddr, 0, sizeof(np->rcv_saddr)); 378 memset(&sk->sk_v6_rcv_saddr, 0, sizeof(sk->sk_v6_rcv_saddr));
380 memset(&np->saddr, 0, sizeof(np->saddr)); 379 memset(&np->saddr, 0, sizeof(np->saddr));
381#endif 380#endif
382 } 381 }
@@ -418,7 +417,7 @@ int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
418 err = 0; 417 err = 0;
419 if ((sk->sk_family == AF_INET && isk->inet_rcv_saddr) || 418 if ((sk->sk_family == AF_INET && isk->inet_rcv_saddr) ||
420 (sk->sk_family == AF_INET6 && 419 (sk->sk_family == AF_INET6 &&
421 !ipv6_addr_any(&inet6_sk(sk)->rcv_saddr))) 420 !ipv6_addr_any(&sk->sk_v6_rcv_saddr)))
422 sk->sk_userlocks |= SOCK_BINDADDR_LOCK; 421 sk->sk_userlocks |= SOCK_BINDADDR_LOCK;
423 422
424 if (snum) 423 if (snum)
@@ -429,7 +428,7 @@ int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
429 428
430#if IS_ENABLED(CONFIG_IPV6) 429#if IS_ENABLED(CONFIG_IPV6)
431 if (sk->sk_family == AF_INET6) 430 if (sk->sk_family == AF_INET6)
432 memset(&inet6_sk(sk)->daddr, 0, sizeof(inet6_sk(sk)->daddr)); 431 memset(&sk->sk_v6_daddr, 0, sizeof(sk->sk_v6_daddr));
433#endif 432#endif
434 433
435 sk_dst_reset(sk); 434 sk_dst_reset(sk);
diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c
index 52f3c6b971d2..27535fd5ea10 100644
--- a/net/ipv4/tcp_metrics.c
+++ b/net/ipv4/tcp_metrics.c
@@ -240,7 +240,6 @@ static struct tcp_metrics_block *__tcp_get_metrics_req(struct request_sock *req,
240 240
241static struct tcp_metrics_block *__tcp_get_metrics_tw(struct inet_timewait_sock *tw) 241static struct tcp_metrics_block *__tcp_get_metrics_tw(struct inet_timewait_sock *tw)
242{ 242{
243 struct inet6_timewait_sock *tw6;
244 struct tcp_metrics_block *tm; 243 struct tcp_metrics_block *tm;
245 struct inetpeer_addr addr; 244 struct inetpeer_addr addr;
246 unsigned int hash; 245 unsigned int hash;
@@ -253,9 +252,8 @@ static struct tcp_metrics_block *__tcp_get_metrics_tw(struct inet_timewait_sock
253 hash = (__force unsigned int) addr.addr.a4; 252 hash = (__force unsigned int) addr.addr.a4;
254 break; 253 break;
255 case AF_INET6: 254 case AF_INET6:
256 tw6 = inet6_twsk((struct sock *)tw); 255 *(struct in6_addr *)addr.addr.a6 = tw->tw_v6_daddr;
257 *(struct in6_addr *)addr.addr.a6 = tw6->tw_v6_daddr; 256 hash = ipv6_addr_hash(&tw->tw_v6_daddr);
258 hash = ipv6_addr_hash(&tw6->tw_v6_daddr);
259 break; 257 break;
260 default: 258 default:
261 return NULL; 259 return NULL;
@@ -289,8 +287,8 @@ static struct tcp_metrics_block *tcp_get_metrics(struct sock *sk,
289 hash = (__force unsigned int) addr.addr.a4; 287 hash = (__force unsigned int) addr.addr.a4;
290 break; 288 break;
291 case AF_INET6: 289 case AF_INET6:
292 *(struct in6_addr *)addr.addr.a6 = inet6_sk(sk)->daddr; 290 *(struct in6_addr *)addr.addr.a6 = sk->sk_v6_daddr;
293 hash = ipv6_addr_hash(&inet6_sk(sk)->daddr); 291 hash = ipv6_addr_hash(&sk->sk_v6_daddr);
294 break; 292 break;
295 default: 293 default:
296 return NULL; 294 return NULL;
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c
index 58a3e69aef64..97b684159861 100644
--- a/net/ipv4/tcp_minisocks.c
+++ b/net/ipv4/tcp_minisocks.c
@@ -293,12 +293,9 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
293#if IS_ENABLED(CONFIG_IPV6) 293#if IS_ENABLED(CONFIG_IPV6)
294 if (tw->tw_family == PF_INET6) { 294 if (tw->tw_family == PF_INET6) {
295 struct ipv6_pinfo *np = inet6_sk(sk); 295 struct ipv6_pinfo *np = inet6_sk(sk);
296 struct inet6_timewait_sock *tw6;
297 296
298 tw->tw_ipv6_offset = inet6_tw_offset(sk->sk_prot); 297 tw->tw_v6_daddr = sk->sk_v6_daddr;
299 tw6 = inet6_twsk((struct sock *)tw); 298 tw->tw_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
300 tw6->tw_v6_daddr = np->daddr;
301 tw6->tw_v6_rcv_saddr = np->rcv_saddr;
302 tw->tw_tclass = np->tclass; 299 tw->tw_tclass = np->tclass;
303 tw->tw_ipv6only = np->ipv6only; 300 tw->tw_ipv6only = np->ipv6only;
304 } 301 }
diff --git a/net/ipv4/tcp_probe.c b/net/ipv4/tcp_probe.c
index 611beab38a00..8b97d71e193b 100644
--- a/net/ipv4/tcp_probe.c
+++ b/net/ipv4/tcp_probe.c
@@ -101,22 +101,6 @@ static inline int tcp_probe_avail(void)
101 si4.sin_addr.s_addr = inet->inet_##mem##addr; \ 101 si4.sin_addr.s_addr = inet->inet_##mem##addr; \
102 } while (0) \ 102 } while (0) \
103 103
104#if IS_ENABLED(CONFIG_IPV6)
105#define tcp_probe_copy_fl_to_si6(inet, si6, mem) \
106 do { \
107 struct ipv6_pinfo *pi6 = inet->pinet6; \
108 si6.sin6_family = AF_INET6; \
109 si6.sin6_port = inet->inet_##mem##port; \
110 si6.sin6_addr = pi6->mem##addr; \
111 si6.sin6_flowinfo = 0; /* No need here. */ \
112 si6.sin6_scope_id = 0; /* No need here. */ \
113 } while (0)
114#else
115#define tcp_probe_copy_fl_to_si6(fl, si6, mem) \
116 do { \
117 memset(&si6, 0, sizeof(si6)); \
118 } while (0)
119#endif
120 104
121/* 105/*
122 * Hook inserted to be called before each receive packet. 106 * Hook inserted to be called before each receive packet.
@@ -147,8 +131,17 @@ static void jtcp_rcv_established(struct sock *sk, struct sk_buff *skb,
147 tcp_probe_copy_fl_to_si4(inet, p->dst.v4, d); 131 tcp_probe_copy_fl_to_si4(inet, p->dst.v4, d);
148 break; 132 break;
149 case AF_INET6: 133 case AF_INET6:
150 tcp_probe_copy_fl_to_si6(inet, p->src.v6, s); 134 memset(&p->src.v6, 0, sizeof(p->src.v6));
151 tcp_probe_copy_fl_to_si6(inet, p->dst.v6, d); 135 memset(&p->dst.v6, 0, sizeof(p->dst.v6));
136#if IS_ENABLED(CONFIG_IPV6)
137 p->src.v6.sin6_family = AF_INET6;
138 p->src.v6.sin6_port = inet->inet_sport;
139 p->src.v6.sin6_addr = inet6_sk(sk)->saddr;
140
141 p->dst.v6.sin6_family = AF_INET6;
142 p->dst.v6.sin6_port = inet->inet_dport;
143 p->dst.v6.sin6_addr = sk->sk_v6_daddr;
144#endif
152 break; 145 break;
153 default: 146 default:
154 BUG(); 147 BUG();
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
index 4b85e6f636c9..af07b5b23ebf 100644
--- a/net/ipv4/tcp_timer.c
+++ b/net/ipv4/tcp_timer.c
@@ -374,9 +374,8 @@ void tcp_retransmit_timer(struct sock *sk)
374 } 374 }
375#if IS_ENABLED(CONFIG_IPV6) 375#if IS_ENABLED(CONFIG_IPV6)
376 else if (sk->sk_family == AF_INET6) { 376 else if (sk->sk_family == AF_INET6) {
377 struct ipv6_pinfo *np = inet6_sk(sk);
378 LIMIT_NETDEBUG(KERN_DEBUG pr_fmt("Peer %pI6:%u/%u unexpectedly shrunk window %u:%u (repaired)\n"), 377 LIMIT_NETDEBUG(KERN_DEBUG pr_fmt("Peer %pI6:%u/%u unexpectedly shrunk window %u:%u (repaired)\n"),
379 &np->daddr, 378 &sk->sk_v6_daddr,
380 ntohs(inet->inet_dport), inet->inet_num, 379 ntohs(inet->inet_dport), inet->inet_num,
381 tp->snd_una, tp->snd_nxt); 380 tp->snd_una, tp->snd_nxt);
382 } 381 }
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index 4966b124dc2e..a2cb07cd3850 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -364,7 +364,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
364 inet->inet_rcv_saddr = v4addr; 364 inet->inet_rcv_saddr = v4addr;
365 inet->inet_saddr = v4addr; 365 inet->inet_saddr = v4addr;
366 366
367 np->rcv_saddr = addr->sin6_addr; 367 sk->sk_v6_rcv_saddr = addr->sin6_addr;
368 368
369 if (!(addr_type & IPV6_ADDR_MULTICAST)) 369 if (!(addr_type & IPV6_ADDR_MULTICAST))
370 np->saddr = addr->sin6_addr; 370 np->saddr = addr->sin6_addr;
@@ -461,14 +461,14 @@ int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
461 peer == 1) 461 peer == 1)
462 return -ENOTCONN; 462 return -ENOTCONN;
463 sin->sin6_port = inet->inet_dport; 463 sin->sin6_port = inet->inet_dport;
464 sin->sin6_addr = np->daddr; 464 sin->sin6_addr = sk->sk_v6_daddr;
465 if (np->sndflow) 465 if (np->sndflow)
466 sin->sin6_flowinfo = np->flow_label; 466 sin->sin6_flowinfo = np->flow_label;
467 } else { 467 } else {
468 if (ipv6_addr_any(&np->rcv_saddr)) 468 if (ipv6_addr_any(&sk->sk_v6_rcv_saddr))
469 sin->sin6_addr = np->saddr; 469 sin->sin6_addr = np->saddr;
470 else 470 else
471 sin->sin6_addr = np->rcv_saddr; 471 sin->sin6_addr = sk->sk_v6_rcv_saddr;
472 472
473 sin->sin6_port = inet->inet_sport; 473 sin->sin6_port = inet->inet_sport;
474 } 474 }
@@ -655,7 +655,7 @@ int inet6_sk_rebuild_header(struct sock *sk)
655 655
656 memset(&fl6, 0, sizeof(fl6)); 656 memset(&fl6, 0, sizeof(fl6));
657 fl6.flowi6_proto = sk->sk_protocol; 657 fl6.flowi6_proto = sk->sk_protocol;
658 fl6.daddr = np->daddr; 658 fl6.daddr = sk->sk_v6_daddr;
659 fl6.saddr = np->saddr; 659 fl6.saddr = np->saddr;
660 fl6.flowlabel = np->flow_label; 660 fl6.flowlabel = np->flow_label;
661 fl6.flowi6_oif = sk->sk_bound_dev_if; 661 fl6.flowi6_oif = sk->sk_bound_dev_if;
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c
index 48b6bd2a9a14..a454b0ff57c7 100644
--- a/net/ipv6/datagram.c
+++ b/net/ipv6/datagram.c
@@ -107,16 +107,16 @@ ipv4_connected:
107 if (err) 107 if (err)
108 goto out; 108 goto out;
109 109
110 ipv6_addr_set_v4mapped(inet->inet_daddr, &np->daddr); 110 ipv6_addr_set_v4mapped(inet->inet_daddr, &sk->sk_v6_daddr);
111 111
112 if (ipv6_addr_any(&np->saddr) || 112 if (ipv6_addr_any(&np->saddr) ||
113 ipv6_mapped_addr_any(&np->saddr)) 113 ipv6_mapped_addr_any(&np->saddr))
114 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr); 114 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr);
115 115
116 if (ipv6_addr_any(&np->rcv_saddr) || 116 if (ipv6_addr_any(&sk->sk_v6_rcv_saddr) ||
117 ipv6_mapped_addr_any(&np->rcv_saddr)) { 117 ipv6_mapped_addr_any(&sk->sk_v6_rcv_saddr)) {
118 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, 118 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr,
119 &np->rcv_saddr); 119 &sk->sk_v6_rcv_saddr);
120 if (sk->sk_prot->rehash) 120 if (sk->sk_prot->rehash)
121 sk->sk_prot->rehash(sk); 121 sk->sk_prot->rehash(sk);
122 } 122 }
@@ -145,7 +145,7 @@ ipv4_connected:
145 } 145 }
146 } 146 }
147 147
148 np->daddr = *daddr; 148 sk->sk_v6_daddr = *daddr;
149 np->flow_label = fl6.flowlabel; 149 np->flow_label = fl6.flowlabel;
150 150
151 inet->inet_dport = usin->sin6_port; 151 inet->inet_dport = usin->sin6_port;
@@ -156,7 +156,7 @@ ipv4_connected:
156 */ 156 */
157 157
158 fl6.flowi6_proto = sk->sk_protocol; 158 fl6.flowi6_proto = sk->sk_protocol;
159 fl6.daddr = np->daddr; 159 fl6.daddr = sk->sk_v6_daddr;
160 fl6.saddr = np->saddr; 160 fl6.saddr = np->saddr;
161 fl6.flowi6_oif = sk->sk_bound_dev_if; 161 fl6.flowi6_oif = sk->sk_bound_dev_if;
162 fl6.flowi6_mark = sk->sk_mark; 162 fl6.flowi6_mark = sk->sk_mark;
@@ -183,16 +183,16 @@ ipv4_connected:
183 if (ipv6_addr_any(&np->saddr)) 183 if (ipv6_addr_any(&np->saddr))
184 np->saddr = fl6.saddr; 184 np->saddr = fl6.saddr;
185 185
186 if (ipv6_addr_any(&np->rcv_saddr)) { 186 if (ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
187 np->rcv_saddr = fl6.saddr; 187 sk->sk_v6_rcv_saddr = fl6.saddr;
188 inet->inet_rcv_saddr = LOOPBACK4_IPV6; 188 inet->inet_rcv_saddr = LOOPBACK4_IPV6;
189 if (sk->sk_prot->rehash) 189 if (sk->sk_prot->rehash)
190 sk->sk_prot->rehash(sk); 190 sk->sk_prot->rehash(sk);
191 } 191 }
192 192
193 ip6_dst_store(sk, dst, 193 ip6_dst_store(sk, dst,
194 ipv6_addr_equal(&fl6.daddr, &np->daddr) ? 194 ipv6_addr_equal(&fl6.daddr, &sk->sk_v6_daddr) ?
195 &np->daddr : NULL, 195 &sk->sk_v6_daddr : NULL,
196#ifdef CONFIG_IPV6_SUBTREES 196#ifdef CONFIG_IPV6_SUBTREES
197 ipv6_addr_equal(&fl6.saddr, &np->saddr) ? 197 ipv6_addr_equal(&fl6.saddr, &np->saddr) ?
198 &np->saddr : 198 &np->saddr :
@@ -883,11 +883,10 @@ EXPORT_SYMBOL_GPL(ip6_datagram_send_ctl);
883void ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp, 883void ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp,
884 __u16 srcp, __u16 destp, int bucket) 884 __u16 srcp, __u16 destp, int bucket)
885{ 885{
886 struct ipv6_pinfo *np = inet6_sk(sp);
887 const struct in6_addr *dest, *src; 886 const struct in6_addr *dest, *src;
888 887
889 dest = &np->daddr; 888 dest = &sp->sk_v6_daddr;
890 src = &np->rcv_saddr; 889 src = &sp->sk_v6_rcv_saddr;
891 seq_printf(seq, 890 seq_printf(seq,
892 "%5d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X " 891 "%5d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
893 "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d\n", 892 "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d\n",
diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c
index e4311cbc8b4e..b7400b480e74 100644
--- a/net/ipv6/inet6_connection_sock.c
+++ b/net/ipv6/inet6_connection_sock.c
@@ -165,11 +165,10 @@ EXPORT_SYMBOL_GPL(inet6_csk_reqsk_queue_hash_add);
165 165
166void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr) 166void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr)
167{ 167{
168 struct ipv6_pinfo *np = inet6_sk(sk);
169 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) uaddr; 168 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) uaddr;
170 169
171 sin6->sin6_family = AF_INET6; 170 sin6->sin6_family = AF_INET6;
172 sin6->sin6_addr = np->daddr; 171 sin6->sin6_addr = sk->sk_v6_daddr;
173 sin6->sin6_port = inet_sk(sk)->inet_dport; 172 sin6->sin6_port = inet_sk(sk)->inet_dport;
174 /* We do not store received flowlabel for TCP */ 173 /* We do not store received flowlabel for TCP */
175 sin6->sin6_flowinfo = 0; 174 sin6->sin6_flowinfo = 0;
@@ -203,7 +202,7 @@ static struct dst_entry *inet6_csk_route_socket(struct sock *sk,
203 202
204 memset(fl6, 0, sizeof(*fl6)); 203 memset(fl6, 0, sizeof(*fl6));
205 fl6->flowi6_proto = sk->sk_protocol; 204 fl6->flowi6_proto = sk->sk_protocol;
206 fl6->daddr = np->daddr; 205 fl6->daddr = sk->sk_v6_daddr;
207 fl6->saddr = np->saddr; 206 fl6->saddr = np->saddr;
208 fl6->flowlabel = np->flow_label; 207 fl6->flowlabel = np->flow_label;
209 IP6_ECN_flow_xmit(sk, fl6->flowlabel); 208 IP6_ECN_flow_xmit(sk, fl6->flowlabel);
@@ -245,7 +244,7 @@ int inet6_csk_xmit(struct sk_buff *skb, struct flowi *fl_unused)
245 skb_dst_set_noref(skb, dst); 244 skb_dst_set_noref(skb, dst);
246 245
247 /* Restore final destination back after routing done */ 246 /* Restore final destination back after routing done */
248 fl6.daddr = np->daddr; 247 fl6.daddr = sk->sk_v6_daddr;
249 248
250 res = ip6_xmit(sk, skb, &fl6, np->opt, np->tclass); 249 res = ip6_xmit(sk, skb, &fl6, np->opt, np->tclass);
251 rcu_read_unlock(); 250 rcu_read_unlock();
diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c
index 46440777e1c5..842d833dfc18 100644
--- a/net/ipv6/inet6_hashtables.c
+++ b/net/ipv6/inet6_hashtables.c
@@ -89,30 +89,16 @@ begin:
89 sk_nulls_for_each_rcu(sk, node, &head->chain) { 89 sk_nulls_for_each_rcu(sk, node, &head->chain) {
90 if (sk->sk_hash != hash) 90 if (sk->sk_hash != hash)
91 continue; 91 continue;
92 if (sk->sk_state == TCP_TIME_WAIT) { 92 if (!INET6_MATCH(sk, net, saddr, daddr, ports, dif))
93 if (!INET6_TW_MATCH(sk, net, saddr, daddr, ports, dif)) 93 continue;
94 continue;
95 } else {
96 if (!INET6_MATCH(sk, net, saddr, daddr, ports, dif))
97 continue;
98 }
99 if (unlikely(!atomic_inc_not_zero(&sk->sk_refcnt))) 94 if (unlikely(!atomic_inc_not_zero(&sk->sk_refcnt)))
100 goto out; 95 goto out;
101 96
102 if (sk->sk_state == TCP_TIME_WAIT) { 97 if (unlikely(!INET6_MATCH(sk, net, saddr, daddr, ports, dif))) {
103 if (unlikely(!INET6_TW_MATCH(sk, net, saddr, daddr, 98 sock_gen_put(sk);
104 ports, dif))) { 99 goto begin;
105 sock_gen_put(sk);
106 goto begin;
107 }
108 } else {
109 if (unlikely(!INET6_MATCH(sk, net, saddr, daddr,
110 ports, dif))) {
111 sock_put(sk);
112 goto begin;
113 }
114 goto found;
115 } 100 }
101 goto found;
116 } 102 }
117 if (get_nulls_value(node) != slot) 103 if (get_nulls_value(node) != slot)
118 goto begin; 104 goto begin;
@@ -133,11 +119,10 @@ static inline int compute_score(struct sock *sk, struct net *net,
133 119
134 if (net_eq(sock_net(sk), net) && inet_sk(sk)->inet_num == hnum && 120 if (net_eq(sock_net(sk), net) && inet_sk(sk)->inet_num == hnum &&
135 sk->sk_family == PF_INET6) { 121 sk->sk_family == PF_INET6) {
136 const struct ipv6_pinfo *np = inet6_sk(sk);
137 122
138 score = 1; 123 score = 1;
139 if (!ipv6_addr_any(&np->rcv_saddr)) { 124 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
140 if (!ipv6_addr_equal(&np->rcv_saddr, daddr)) 125 if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr))
141 return -1; 126 return -1;
142 score++; 127 score++;
143 } 128 }
@@ -229,9 +214,8 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row,
229{ 214{
230 struct inet_hashinfo *hinfo = death_row->hashinfo; 215 struct inet_hashinfo *hinfo = death_row->hashinfo;
231 struct inet_sock *inet = inet_sk(sk); 216 struct inet_sock *inet = inet_sk(sk);
232 const struct ipv6_pinfo *np = inet6_sk(sk); 217 const struct in6_addr *daddr = &sk->sk_v6_rcv_saddr;
233 const struct in6_addr *daddr = &np->rcv_saddr; 218 const struct in6_addr *saddr = &sk->sk_v6_daddr;
234 const struct in6_addr *saddr = &np->daddr;
235 const int dif = sk->sk_bound_dev_if; 219 const int dif = sk->sk_bound_dev_if;
236 const __portpair ports = INET_COMBINED_PORTS(inet->inet_dport, lport); 220 const __portpair ports = INET_COMBINED_PORTS(inet->inet_dport, lport);
237 struct net *net = sock_net(sk); 221 struct net *net = sock_net(sk);
@@ -250,23 +234,19 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row,
250 if (sk2->sk_hash != hash) 234 if (sk2->sk_hash != hash)
251 continue; 235 continue;
252 236
253 if (sk2->sk_state == TCP_TIME_WAIT) { 237 if (likely(INET6_MATCH(sk2, net, saddr, daddr, ports, dif))) {
254 if (likely(INET6_TW_MATCH(sk2, net, saddr, daddr, 238 if (sk2->sk_state == TCP_TIME_WAIT) {
255 ports, dif))) {
256 tw = inet_twsk(sk2); 239 tw = inet_twsk(sk2);
257 if (twsk_unique(sk, sk2, twp)) 240 if (twsk_unique(sk, sk2, twp))
258 goto unique; 241 break;
259 else
260 goto not_unique;
261 } 242 }
262 }
263 if (likely(INET6_MATCH(sk2, net, saddr, daddr, ports, dif)))
264 goto not_unique; 243 goto not_unique;
244 }
265 } 245 }
266 246
267unique:
268 /* Must record num and sport now. Otherwise we will see 247 /* Must record num and sport now. Otherwise we will see
269 * in hash table socket with a funny identity. */ 248 * in hash table socket with a funny identity.
249 */
270 inet->inet_num = lport; 250 inet->inet_num = lport;
271 inet->inet_sport = htons(lport); 251 inet->inet_sport = htons(lport);
272 sk->sk_hash = hash; 252 sk->sk_hash = hash;
@@ -299,9 +279,9 @@ not_unique:
299static inline u32 inet6_sk_port_offset(const struct sock *sk) 279static inline u32 inet6_sk_port_offset(const struct sock *sk)
300{ 280{
301 const struct inet_sock *inet = inet_sk(sk); 281 const struct inet_sock *inet = inet_sk(sk);
302 const struct ipv6_pinfo *np = inet6_sk(sk); 282
303 return secure_ipv6_port_ephemeral(np->rcv_saddr.s6_addr32, 283 return secure_ipv6_port_ephemeral(sk->sk_v6_rcv_saddr.s6_addr32,
304 np->daddr.s6_addr32, 284 sk->sk_v6_daddr.s6_addr32,
305 inet->inet_dport); 285 inet->inet_dport);
306} 286}
307 287
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
index d1e2e8ef29c5..4919a8e6063e 100644
--- a/net/ipv6/ipv6_sockglue.c
+++ b/net/ipv6/ipv6_sockglue.c
@@ -174,7 +174,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
174 } 174 }
175 175
176 if (ipv6_only_sock(sk) || 176 if (ipv6_only_sock(sk) ||
177 !ipv6_addr_v4mapped(&np->daddr)) { 177 !ipv6_addr_v4mapped(&sk->sk_v6_daddr)) {
178 retv = -EADDRNOTAVAIL; 178 retv = -EADDRNOTAVAIL;
179 break; 179 break;
180 } 180 }
@@ -1011,7 +1011,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
1011 struct in6_pktinfo src_info; 1011 struct in6_pktinfo src_info;
1012 src_info.ipi6_ifindex = np->mcast_oif ? np->mcast_oif : 1012 src_info.ipi6_ifindex = np->mcast_oif ? np->mcast_oif :
1013 np->sticky_pktinfo.ipi6_ifindex; 1013 np->sticky_pktinfo.ipi6_ifindex;
1014 src_info.ipi6_addr = np->mcast_oif ? np->daddr : np->sticky_pktinfo.ipi6_addr; 1014 src_info.ipi6_addr = np->mcast_oif ? sk->sk_v6_daddr : np->sticky_pktinfo.ipi6_addr;
1015 put_cmsg(&msg, SOL_IPV6, IPV6_PKTINFO, sizeof(src_info), &src_info); 1015 put_cmsg(&msg, SOL_IPV6, IPV6_PKTINFO, sizeof(src_info), &src_info);
1016 } 1016 }
1017 if (np->rxopt.bits.rxhlim) { 1017 if (np->rxopt.bits.rxhlim) {
@@ -1026,7 +1026,8 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
1026 struct in6_pktinfo src_info; 1026 struct in6_pktinfo src_info;
1027 src_info.ipi6_ifindex = np->mcast_oif ? np->mcast_oif : 1027 src_info.ipi6_ifindex = np->mcast_oif ? np->mcast_oif :
1028 np->sticky_pktinfo.ipi6_ifindex; 1028 np->sticky_pktinfo.ipi6_ifindex;
1029 src_info.ipi6_addr = np->mcast_oif ? np->daddr : np->sticky_pktinfo.ipi6_addr; 1029 src_info.ipi6_addr = np->mcast_oif ? sk->sk_v6_daddr :
1030 np->sticky_pktinfo.ipi6_addr;
1030 put_cmsg(&msg, SOL_IPV6, IPV6_2292PKTINFO, sizeof(src_info), &src_info); 1031 put_cmsg(&msg, SOL_IPV6, IPV6_2292PKTINFO, sizeof(src_info), &src_info);
1031 } 1032 }
1032 if (np->rxopt.bits.rxohlim) { 1033 if (np->rxopt.bits.rxohlim) {
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
index d6e4dd8b58df..54b75ead5a69 100644
--- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
+++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
@@ -297,9 +297,9 @@ ipv6_getorigdst(struct sock *sk, int optval, void __user *user, int *len)
297 struct nf_conntrack_tuple tuple = { .src.l3num = NFPROTO_IPV6 }; 297 struct nf_conntrack_tuple tuple = { .src.l3num = NFPROTO_IPV6 };
298 struct nf_conn *ct; 298 struct nf_conn *ct;
299 299
300 tuple.src.u3.in6 = inet6->rcv_saddr; 300 tuple.src.u3.in6 = sk->sk_v6_rcv_saddr;
301 tuple.src.u.tcp.port = inet->inet_sport; 301 tuple.src.u.tcp.port = inet->inet_sport;
302 tuple.dst.u3.in6 = inet6->daddr; 302 tuple.dst.u3.in6 = sk->sk_v6_daddr;
303 tuple.dst.u.tcp.port = inet->inet_dport; 303 tuple.dst.u.tcp.port = inet->inet_dport;
304 tuple.dst.protonum = sk->sk_protocol; 304 tuple.dst.protonum = sk->sk_protocol;
305 305
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c
index 18f19df4189f..8815e31a87fe 100644
--- a/net/ipv6/ping.c
+++ b/net/ipv6/ping.c
@@ -116,7 +116,7 @@ int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
116 } else { 116 } else {
117 if (sk->sk_state != TCP_ESTABLISHED) 117 if (sk->sk_state != TCP_ESTABLISHED)
118 return -EDESTADDRREQ; 118 return -EDESTADDRREQ;
119 daddr = &np->daddr; 119 daddr = &sk->sk_v6_daddr;
120 } 120 }
121 121
122 if (!iif) 122 if (!iif)
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index a4ed2416399e..3c00842b0079 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -77,20 +77,19 @@ static struct sock *__raw_v6_lookup(struct net *net, struct sock *sk,
77 77
78 sk_for_each_from(sk) 78 sk_for_each_from(sk)
79 if (inet_sk(sk)->inet_num == num) { 79 if (inet_sk(sk)->inet_num == num) {
80 struct ipv6_pinfo *np = inet6_sk(sk);
81 80
82 if (!net_eq(sock_net(sk), net)) 81 if (!net_eq(sock_net(sk), net))
83 continue; 82 continue;
84 83
85 if (!ipv6_addr_any(&np->daddr) && 84 if (!ipv6_addr_any(&sk->sk_v6_daddr) &&
86 !ipv6_addr_equal(&np->daddr, rmt_addr)) 85 !ipv6_addr_equal(&sk->sk_v6_daddr, rmt_addr))
87 continue; 86 continue;
88 87
89 if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif) 88 if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif)
90 continue; 89 continue;
91 90
92 if (!ipv6_addr_any(&np->rcv_saddr)) { 91 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
93 if (ipv6_addr_equal(&np->rcv_saddr, loc_addr)) 92 if (ipv6_addr_equal(&sk->sk_v6_rcv_saddr, loc_addr))
94 goto found; 93 goto found;
95 if (is_multicast && 94 if (is_multicast &&
96 inet6_mc_check(sk, loc_addr, rmt_addr)) 95 inet6_mc_check(sk, loc_addr, rmt_addr))
@@ -302,7 +301,7 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
302 } 301 }
303 302
304 inet->inet_rcv_saddr = inet->inet_saddr = v4addr; 303 inet->inet_rcv_saddr = inet->inet_saddr = v4addr;
305 np->rcv_saddr = addr->sin6_addr; 304 sk->sk_v6_rcv_saddr = addr->sin6_addr;
306 if (!(addr_type & IPV6_ADDR_MULTICAST)) 305 if (!(addr_type & IPV6_ADDR_MULTICAST))
307 np->saddr = addr->sin6_addr; 306 np->saddr = addr->sin6_addr;
308 err = 0; 307 err = 0;
@@ -804,8 +803,8 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
804 * sk->sk_dst_cache. 803 * sk->sk_dst_cache.
805 */ 804 */
806 if (sk->sk_state == TCP_ESTABLISHED && 805 if (sk->sk_state == TCP_ESTABLISHED &&
807 ipv6_addr_equal(daddr, &np->daddr)) 806 ipv6_addr_equal(daddr, &sk->sk_v6_daddr))
808 daddr = &np->daddr; 807 daddr = &sk->sk_v6_daddr;
809 808
810 if (addr_len >= sizeof(struct sockaddr_in6) && 809 if (addr_len >= sizeof(struct sockaddr_in6) &&
811 sin6->sin6_scope_id && 810 sin6->sin6_scope_id &&
@@ -816,7 +815,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
816 return -EDESTADDRREQ; 815 return -EDESTADDRREQ;
817 816
818 proto = inet->inet_num; 817 proto = inet->inet_num;
819 daddr = &np->daddr; 818 daddr = &sk->sk_v6_daddr;
820 fl6.flowlabel = np->flow_label; 819 fl6.flowlabel = np->flow_label;
821 } 820 }
822 821
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 528e61afaf5e..541dfc40c7b3 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -192,13 +192,13 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
192 } 192 }
193 193
194 if (tp->rx_opt.ts_recent_stamp && 194 if (tp->rx_opt.ts_recent_stamp &&
195 !ipv6_addr_equal(&np->daddr, &usin->sin6_addr)) { 195 !ipv6_addr_equal(&sk->sk_v6_daddr, &usin->sin6_addr)) {
196 tp->rx_opt.ts_recent = 0; 196 tp->rx_opt.ts_recent = 0;
197 tp->rx_opt.ts_recent_stamp = 0; 197 tp->rx_opt.ts_recent_stamp = 0;
198 tp->write_seq = 0; 198 tp->write_seq = 0;
199 } 199 }
200 200
201 np->daddr = usin->sin6_addr; 201 sk->sk_v6_daddr = usin->sin6_addr;
202 np->flow_label = fl6.flowlabel; 202 np->flow_label = fl6.flowlabel;
203 203
204 /* 204 /*
@@ -237,17 +237,17 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
237 } else { 237 } else {
238 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr); 238 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr);
239 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, 239 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr,
240 &np->rcv_saddr); 240 &sk->sk_v6_rcv_saddr);
241 } 241 }
242 242
243 return err; 243 return err;
244 } 244 }
245 245
246 if (!ipv6_addr_any(&np->rcv_saddr)) 246 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr))
247 saddr = &np->rcv_saddr; 247 saddr = &sk->sk_v6_rcv_saddr;
248 248
249 fl6.flowi6_proto = IPPROTO_TCP; 249 fl6.flowi6_proto = IPPROTO_TCP;
250 fl6.daddr = np->daddr; 250 fl6.daddr = sk->sk_v6_daddr;
251 fl6.saddr = saddr ? *saddr : np->saddr; 251 fl6.saddr = saddr ? *saddr : np->saddr;
252 fl6.flowi6_oif = sk->sk_bound_dev_if; 252 fl6.flowi6_oif = sk->sk_bound_dev_if;
253 fl6.flowi6_mark = sk->sk_mark; 253 fl6.flowi6_mark = sk->sk_mark;
@@ -266,7 +266,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
266 266
267 if (saddr == NULL) { 267 if (saddr == NULL) {
268 saddr = &fl6.saddr; 268 saddr = &fl6.saddr;
269 np->rcv_saddr = *saddr; 269 sk->sk_v6_rcv_saddr = *saddr;
270 } 270 }
271 271
272 /* set the source address */ 272 /* set the source address */
@@ -279,7 +279,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
279 rt = (struct rt6_info *) dst; 279 rt = (struct rt6_info *) dst;
280 if (tcp_death_row.sysctl_tw_recycle && 280 if (tcp_death_row.sysctl_tw_recycle &&
281 !tp->rx_opt.ts_recent_stamp && 281 !tp->rx_opt.ts_recent_stamp &&
282 ipv6_addr_equal(&rt->rt6i_dst.addr, &np->daddr)) 282 ipv6_addr_equal(&rt->rt6i_dst.addr, &sk->sk_v6_daddr))
283 tcp_fetch_timewait_stamp(sk, dst); 283 tcp_fetch_timewait_stamp(sk, dst);
284 284
285 icsk->icsk_ext_hdr_len = 0; 285 icsk->icsk_ext_hdr_len = 0;
@@ -298,7 +298,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
298 298
299 if (!tp->write_seq && likely(!tp->repair)) 299 if (!tp->write_seq && likely(!tp->repair))
300 tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32, 300 tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32,
301 np->daddr.s6_addr32, 301 sk->sk_v6_daddr.s6_addr32,
302 inet->inet_sport, 302 inet->inet_sport,
303 inet->inet_dport); 303 inet->inet_dport);
304 304
@@ -515,7 +515,7 @@ static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
515static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk, 515static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk,
516 struct sock *addr_sk) 516 struct sock *addr_sk)
517{ 517{
518 return tcp_v6_md5_do_lookup(sk, &inet6_sk(addr_sk)->daddr); 518 return tcp_v6_md5_do_lookup(sk, &addr_sk->sk_v6_daddr);
519} 519}
520 520
521static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk, 521static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk,
@@ -621,7 +621,7 @@ static int tcp_v6_md5_hash_skb(char *md5_hash, struct tcp_md5sig_key *key,
621 621
622 if (sk) { 622 if (sk) {
623 saddr = &inet6_sk(sk)->saddr; 623 saddr = &inet6_sk(sk)->saddr;
624 daddr = &inet6_sk(sk)->daddr; 624 daddr = &sk->sk_v6_daddr;
625 } else if (req) { 625 } else if (req) {
626 saddr = &inet6_rsk(req)->loc_addr; 626 saddr = &inet6_rsk(req)->loc_addr;
627 daddr = &inet6_rsk(req)->rmt_addr; 627 daddr = &inet6_rsk(req)->rmt_addr;
@@ -1116,11 +1116,11 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1116 1116
1117 memcpy(newnp, np, sizeof(struct ipv6_pinfo)); 1117 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1118 1118
1119 ipv6_addr_set_v4mapped(newinet->inet_daddr, &newnp->daddr); 1119 ipv6_addr_set_v4mapped(newinet->inet_daddr, &newsk->sk_v6_daddr);
1120 1120
1121 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr); 1121 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr);
1122 1122
1123 newnp->rcv_saddr = newnp->saddr; 1123 newsk->sk_v6_rcv_saddr = newnp->saddr;
1124 1124
1125 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped; 1125 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
1126 newsk->sk_backlog_rcv = tcp_v4_do_rcv; 1126 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
@@ -1185,9 +1185,9 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1185 1185
1186 memcpy(newnp, np, sizeof(struct ipv6_pinfo)); 1186 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1187 1187
1188 newnp->daddr = treq->rmt_addr; 1188 newsk->sk_v6_daddr = treq->rmt_addr;
1189 newnp->saddr = treq->loc_addr; 1189 newnp->saddr = treq->loc_addr;
1190 newnp->rcv_saddr = treq->loc_addr; 1190 newsk->sk_v6_rcv_saddr = treq->loc_addr;
1191 newsk->sk_bound_dev_if = treq->iif; 1191 newsk->sk_bound_dev_if = treq->iif;
1192 1192
1193 /* Now IPv6 options... 1193 /* Now IPv6 options...
@@ -1244,13 +1244,13 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1244 1244
1245#ifdef CONFIG_TCP_MD5SIG 1245#ifdef CONFIG_TCP_MD5SIG
1246 /* Copy over the MD5 key from the original socket */ 1246 /* Copy over the MD5 key from the original socket */
1247 if ((key = tcp_v6_md5_do_lookup(sk, &newnp->daddr)) != NULL) { 1247 if ((key = tcp_v6_md5_do_lookup(sk, &newsk->sk_v6_daddr)) != NULL) {
1248 /* We're using one, so create a matching key 1248 /* We're using one, so create a matching key
1249 * on the newsk structure. If we fail to get 1249 * on the newsk structure. If we fail to get
1250 * memory, then we end up not copying the key 1250 * memory, then we end up not copying the key
1251 * across. Shucks. 1251 * across. Shucks.
1252 */ 1252 */
1253 tcp_md5_do_add(newsk, (union tcp_md5_addr *)&newnp->daddr, 1253 tcp_md5_do_add(newsk, (union tcp_md5_addr *)&newsk->sk_v6_daddr,
1254 AF_INET6, key->key, key->keylen, 1254 AF_INET6, key->key, key->keylen,
1255 sk_gfp_atomic(sk, GFP_ATOMIC)); 1255 sk_gfp_atomic(sk, GFP_ATOMIC));
1256 } 1256 }
@@ -1758,10 +1758,9 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
1758 const struct inet_sock *inet = inet_sk(sp); 1758 const struct inet_sock *inet = inet_sk(sp);
1759 const struct tcp_sock *tp = tcp_sk(sp); 1759 const struct tcp_sock *tp = tcp_sk(sp);
1760 const struct inet_connection_sock *icsk = inet_csk(sp); 1760 const struct inet_connection_sock *icsk = inet_csk(sp);
1761 const struct ipv6_pinfo *np = inet6_sk(sp);
1762 1761
1763 dest = &np->daddr; 1762 dest = &sp->sk_v6_daddr;
1764 src = &np->rcv_saddr; 1763 src = &sp->sk_v6_rcv_saddr;
1765 destp = ntohs(inet->inet_dport); 1764 destp = ntohs(inet->inet_dport);
1766 srcp = ntohs(inet->inet_sport); 1765 srcp = ntohs(inet->inet_sport);
1767 1766
@@ -1810,11 +1809,10 @@ static void get_timewait6_sock(struct seq_file *seq,
1810{ 1809{
1811 const struct in6_addr *dest, *src; 1810 const struct in6_addr *dest, *src;
1812 __u16 destp, srcp; 1811 __u16 destp, srcp;
1813 const struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw);
1814 s32 delta = tw->tw_ttd - inet_tw_time_stamp(); 1812 s32 delta = tw->tw_ttd - inet_tw_time_stamp();
1815 1813
1816 dest = &tw6->tw_v6_daddr; 1814 dest = &tw->tw_v6_daddr;
1817 src = &tw6->tw_v6_rcv_saddr; 1815 src = &tw->tw_v6_rcv_saddr;
1818 destp = ntohs(tw->tw_dport); 1816 destp = ntohs(tw->tw_dport);
1819 srcp = ntohs(tw->tw_sport); 1817 srcp = ntohs(tw->tw_sport);
1820 1818
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 37532478e3ba..b496de19a341 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -55,11 +55,10 @@
55 55
56int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2) 56int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)
57{ 57{
58 const struct in6_addr *sk_rcv_saddr6 = &inet6_sk(sk)->rcv_saddr;
59 const struct in6_addr *sk2_rcv_saddr6 = inet6_rcv_saddr(sk2); 58 const struct in6_addr *sk2_rcv_saddr6 = inet6_rcv_saddr(sk2);
60 int sk_ipv6only = ipv6_only_sock(sk); 59 int sk_ipv6only = ipv6_only_sock(sk);
61 int sk2_ipv6only = inet_v6_ipv6only(sk2); 60 int sk2_ipv6only = inet_v6_ipv6only(sk2);
62 int addr_type = ipv6_addr_type(sk_rcv_saddr6); 61 int addr_type = ipv6_addr_type(&sk->sk_v6_rcv_saddr);
63 int addr_type2 = sk2_rcv_saddr6 ? ipv6_addr_type(sk2_rcv_saddr6) : IPV6_ADDR_MAPPED; 62 int addr_type2 = sk2_rcv_saddr6 ? ipv6_addr_type(sk2_rcv_saddr6) : IPV6_ADDR_MAPPED;
64 63
65 /* if both are mapped, treat as IPv4 */ 64 /* if both are mapped, treat as IPv4 */
@@ -77,7 +76,7 @@ int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)
77 return 1; 76 return 1;
78 77
79 if (sk2_rcv_saddr6 && 78 if (sk2_rcv_saddr6 &&
80 ipv6_addr_equal(sk_rcv_saddr6, sk2_rcv_saddr6)) 79 ipv6_addr_equal(&sk->sk_v6_rcv_saddr, sk2_rcv_saddr6))
81 return 1; 80 return 1;
82 81
83 return 0; 82 return 0;
@@ -105,7 +104,7 @@ int udp_v6_get_port(struct sock *sk, unsigned short snum)
105 unsigned int hash2_nulladdr = 104 unsigned int hash2_nulladdr =
106 udp6_portaddr_hash(sock_net(sk), &in6addr_any, snum); 105 udp6_portaddr_hash(sock_net(sk), &in6addr_any, snum);
107 unsigned int hash2_partial = 106 unsigned int hash2_partial =
108 udp6_portaddr_hash(sock_net(sk), &inet6_sk(sk)->rcv_saddr, 0); 107 udp6_portaddr_hash(sock_net(sk), &sk->sk_v6_rcv_saddr, 0);
109 108
110 /* precompute partial secondary hash */ 109 /* precompute partial secondary hash */
111 udp_sk(sk)->udp_portaddr_hash = hash2_partial; 110 udp_sk(sk)->udp_portaddr_hash = hash2_partial;
@@ -115,7 +114,7 @@ int udp_v6_get_port(struct sock *sk, unsigned short snum)
115static void udp_v6_rehash(struct sock *sk) 114static void udp_v6_rehash(struct sock *sk)
116{ 115{
117 u16 new_hash = udp6_portaddr_hash(sock_net(sk), 116 u16 new_hash = udp6_portaddr_hash(sock_net(sk),
118 &inet6_sk(sk)->rcv_saddr, 117 &sk->sk_v6_rcv_saddr,
119 inet_sk(sk)->inet_num); 118 inet_sk(sk)->inet_num);
120 119
121 udp_lib_rehash(sk, new_hash); 120 udp_lib_rehash(sk, new_hash);
@@ -131,7 +130,6 @@ static inline int compute_score(struct sock *sk, struct net *net,
131 130
132 if (net_eq(sock_net(sk), net) && udp_sk(sk)->udp_port_hash == hnum && 131 if (net_eq(sock_net(sk), net) && udp_sk(sk)->udp_port_hash == hnum &&
133 sk->sk_family == PF_INET6) { 132 sk->sk_family == PF_INET6) {
134 struct ipv6_pinfo *np = inet6_sk(sk);
135 struct inet_sock *inet = inet_sk(sk); 133 struct inet_sock *inet = inet_sk(sk);
136 134
137 score = 0; 135 score = 0;
@@ -140,13 +138,13 @@ static inline int compute_score(struct sock *sk, struct net *net,
140 return -1; 138 return -1;
141 score++; 139 score++;
142 } 140 }
143 if (!ipv6_addr_any(&np->rcv_saddr)) { 141 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
144 if (!ipv6_addr_equal(&np->rcv_saddr, daddr)) 142 if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr))
145 return -1; 143 return -1;
146 score++; 144 score++;
147 } 145 }
148 if (!ipv6_addr_any(&np->daddr)) { 146 if (!ipv6_addr_any(&sk->sk_v6_daddr)) {
149 if (!ipv6_addr_equal(&np->daddr, saddr)) 147 if (!ipv6_addr_equal(&sk->sk_v6_daddr, saddr))
150 return -1; 148 return -1;
151 score++; 149 score++;
152 } 150 }
@@ -169,10 +167,9 @@ static inline int compute_score2(struct sock *sk, struct net *net,
169 167
170 if (net_eq(sock_net(sk), net) && udp_sk(sk)->udp_port_hash == hnum && 168 if (net_eq(sock_net(sk), net) && udp_sk(sk)->udp_port_hash == hnum &&
171 sk->sk_family == PF_INET6) { 169 sk->sk_family == PF_INET6) {
172 struct ipv6_pinfo *np = inet6_sk(sk);
173 struct inet_sock *inet = inet_sk(sk); 170 struct inet_sock *inet = inet_sk(sk);
174 171
175 if (!ipv6_addr_equal(&np->rcv_saddr, daddr)) 172 if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr))
176 return -1; 173 return -1;
177 score = 0; 174 score = 0;
178 if (inet->inet_dport) { 175 if (inet->inet_dport) {
@@ -180,8 +177,8 @@ static inline int compute_score2(struct sock *sk, struct net *net,
180 return -1; 177 return -1;
181 score++; 178 score++;
182 } 179 }
183 if (!ipv6_addr_any(&np->daddr)) { 180 if (!ipv6_addr_any(&sk->sk_v6_daddr)) {
184 if (!ipv6_addr_equal(&np->daddr, saddr)) 181 if (!ipv6_addr_equal(&sk->sk_v6_daddr, saddr))
185 return -1; 182 return -1;
186 score++; 183 score++;
187 } 184 }
@@ -549,7 +546,7 @@ static int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
549{ 546{
550 int rc; 547 int rc;
551 548
552 if (!ipv6_addr_any(&inet6_sk(sk)->daddr)) { 549 if (!ipv6_addr_any(&sk->sk_v6_daddr)) {
553 sock_rps_save_rxhash(sk, skb); 550 sock_rps_save_rxhash(sk, skb);
554 sk_mark_napi_id(sk, skb); 551 sk_mark_napi_id(sk, skb);
555 } 552 }
@@ -690,20 +687,19 @@ static struct sock *udp_v6_mcast_next(struct net *net, struct sock *sk,
690 687
691 if (udp_sk(s)->udp_port_hash == num && 688 if (udp_sk(s)->udp_port_hash == num &&
692 s->sk_family == PF_INET6) { 689 s->sk_family == PF_INET6) {
693 struct ipv6_pinfo *np = inet6_sk(s);
694 if (inet->inet_dport) { 690 if (inet->inet_dport) {
695 if (inet->inet_dport != rmt_port) 691 if (inet->inet_dport != rmt_port)
696 continue; 692 continue;
697 } 693 }
698 if (!ipv6_addr_any(&np->daddr) && 694 if (!ipv6_addr_any(&sk->sk_v6_daddr) &&
699 !ipv6_addr_equal(&np->daddr, rmt_addr)) 695 !ipv6_addr_equal(&sk->sk_v6_daddr, rmt_addr))
700 continue; 696 continue;
701 697
702 if (s->sk_bound_dev_if && s->sk_bound_dev_if != dif) 698 if (s->sk_bound_dev_if && s->sk_bound_dev_if != dif)
703 continue; 699 continue;
704 700
705 if (!ipv6_addr_any(&np->rcv_saddr)) { 701 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
706 if (!ipv6_addr_equal(&np->rcv_saddr, loc_addr)) 702 if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, loc_addr))
707 continue; 703 continue;
708 } 704 }
709 if (!inet6_mc_check(s, loc_addr, rmt_addr)) 705 if (!inet6_mc_check(s, loc_addr, rmt_addr))
@@ -1063,7 +1059,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
1063 } else if (!up->pending) { 1059 } else if (!up->pending) {
1064 if (sk->sk_state != TCP_ESTABLISHED) 1060 if (sk->sk_state != TCP_ESTABLISHED)
1065 return -EDESTADDRREQ; 1061 return -EDESTADDRREQ;
1066 daddr = &np->daddr; 1062 daddr = &sk->sk_v6_daddr;
1067 } else 1063 } else
1068 daddr = NULL; 1064 daddr = NULL;
1069 1065
@@ -1133,8 +1129,8 @@ do_udp_sendmsg:
1133 * sk->sk_dst_cache. 1129 * sk->sk_dst_cache.
1134 */ 1130 */
1135 if (sk->sk_state == TCP_ESTABLISHED && 1131 if (sk->sk_state == TCP_ESTABLISHED &&
1136 ipv6_addr_equal(daddr, &np->daddr)) 1132 ipv6_addr_equal(daddr, &sk->sk_v6_daddr))
1137 daddr = &np->daddr; 1133 daddr = &sk->sk_v6_daddr;
1138 1134
1139 if (addr_len >= sizeof(struct sockaddr_in6) && 1135 if (addr_len >= sizeof(struct sockaddr_in6) &&
1140 sin6->sin6_scope_id && 1136 sin6->sin6_scope_id &&
@@ -1145,7 +1141,7 @@ do_udp_sendmsg:
1145 return -EDESTADDRREQ; 1141 return -EDESTADDRREQ;
1146 1142
1147 fl6.fl6_dport = inet->inet_dport; 1143 fl6.fl6_dport = inet->inet_dport;
1148 daddr = &np->daddr; 1144 daddr = &sk->sk_v6_daddr;
1149 fl6.flowlabel = np->flow_label; 1145 fl6.flowlabel = np->flow_label;
1150 connected = 1; 1146 connected = 1;
1151 } 1147 }
@@ -1261,8 +1257,8 @@ do_append_data:
1261 if (dst) { 1257 if (dst) {
1262 if (connected) { 1258 if (connected) {
1263 ip6_dst_store(sk, dst, 1259 ip6_dst_store(sk, dst,
1264 ipv6_addr_equal(&fl6.daddr, &np->daddr) ? 1260 ipv6_addr_equal(&fl6.daddr, &sk->sk_v6_daddr) ?
1265 &np->daddr : NULL, 1261 &sk->sk_v6_daddr : NULL,
1266#ifdef CONFIG_IPV6_SUBTREES 1262#ifdef CONFIG_IPV6_SUBTREES
1267 ipv6_addr_equal(&fl6.saddr, &np->saddr) ? 1263 ipv6_addr_equal(&fl6.saddr, &np->saddr) ?
1268 &np->saddr : 1264 &np->saddr :
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
index b076e8309bc2..9af77d9c0ec9 100644
--- a/net/l2tp/l2tp_core.c
+++ b/net/l2tp/l2tp_core.c
@@ -1181,7 +1181,7 @@ static void l2tp_xmit_ipv6_csum(struct sock *sk, struct sk_buff *skb,
1181 !(skb_dst(skb)->dev->features & NETIF_F_IPV6_CSUM)) { 1181 !(skb_dst(skb)->dev->features & NETIF_F_IPV6_CSUM)) {
1182 __wsum csum = skb_checksum(skb, 0, udp_len, 0); 1182 __wsum csum = skb_checksum(skb, 0, udp_len, 0);
1183 skb->ip_summed = CHECKSUM_UNNECESSARY; 1183 skb->ip_summed = CHECKSUM_UNNECESSARY;
1184 uh->check = csum_ipv6_magic(&np->saddr, &np->daddr, udp_len, 1184 uh->check = csum_ipv6_magic(&np->saddr, &sk->sk_v6_daddr, udp_len,
1185 IPPROTO_UDP, csum); 1185 IPPROTO_UDP, csum);
1186 if (uh->check == 0) 1186 if (uh->check == 0)
1187 uh->check = CSUM_MANGLED_0; 1187 uh->check = CSUM_MANGLED_0;
@@ -1189,7 +1189,7 @@ static void l2tp_xmit_ipv6_csum(struct sock *sk, struct sk_buff *skb,
1189 skb->ip_summed = CHECKSUM_PARTIAL; 1189 skb->ip_summed = CHECKSUM_PARTIAL;
1190 skb->csum_start = skb_transport_header(skb) - skb->head; 1190 skb->csum_start = skb_transport_header(skb) - skb->head;
1191 skb->csum_offset = offsetof(struct udphdr, check); 1191 skb->csum_offset = offsetof(struct udphdr, check);
1192 uh->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, 1192 uh->check = ~csum_ipv6_magic(&np->saddr, &sk->sk_v6_daddr,
1193 udp_len, IPPROTO_UDP, 0); 1193 udp_len, IPPROTO_UDP, 0);
1194 } 1194 }
1195} 1195}
@@ -1713,13 +1713,13 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32
1713 struct ipv6_pinfo *np = inet6_sk(sk); 1713 struct ipv6_pinfo *np = inet6_sk(sk);
1714 1714
1715 if (ipv6_addr_v4mapped(&np->saddr) && 1715 if (ipv6_addr_v4mapped(&np->saddr) &&
1716 ipv6_addr_v4mapped(&np->daddr)) { 1716 ipv6_addr_v4mapped(&sk->sk_v6_daddr)) {
1717 struct inet_sock *inet = inet_sk(sk); 1717 struct inet_sock *inet = inet_sk(sk);
1718 1718
1719 tunnel->v4mapped = true; 1719 tunnel->v4mapped = true;
1720 inet->inet_saddr = np->saddr.s6_addr32[3]; 1720 inet->inet_saddr = np->saddr.s6_addr32[3];
1721 inet->inet_rcv_saddr = np->rcv_saddr.s6_addr32[3]; 1721 inet->inet_rcv_saddr = sk->sk_v6_rcv_saddr.s6_addr32[3];
1722 inet->inet_daddr = np->daddr.s6_addr32[3]; 1722 inet->inet_daddr = sk->sk_v6_daddr.s6_addr32[3];
1723 } else { 1723 } else {
1724 tunnel->v4mapped = false; 1724 tunnel->v4mapped = false;
1725 } 1725 }
diff --git a/net/l2tp/l2tp_debugfs.c b/net/l2tp/l2tp_debugfs.c
index 072d7202e182..2d6760a2ae34 100644
--- a/net/l2tp/l2tp_debugfs.c
+++ b/net/l2tp/l2tp_debugfs.c
@@ -127,9 +127,10 @@ static void l2tp_dfs_seq_tunnel_show(struct seq_file *m, void *v)
127 127
128#if IS_ENABLED(CONFIG_IPV6) 128#if IS_ENABLED(CONFIG_IPV6)
129 if (tunnel->sock->sk_family == AF_INET6) { 129 if (tunnel->sock->sk_family == AF_INET6) {
130 struct ipv6_pinfo *np = inet6_sk(tunnel->sock); 130 const struct ipv6_pinfo *np = inet6_sk(tunnel->sock);
131
131 seq_printf(m, " from %pI6c to %pI6c\n", 132 seq_printf(m, " from %pI6c to %pI6c\n",
132 &np->saddr, &np->daddr); 133 &np->saddr, &tunnel->sock->sk_v6_daddr);
133 } else 134 } else
134#endif 135#endif
135 seq_printf(m, " from %pI4 to %pI4\n", 136 seq_printf(m, " from %pI4 to %pI4\n",
diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c
index b8a6039314e8..cfd65304be60 100644
--- a/net/l2tp/l2tp_ip6.c
+++ b/net/l2tp/l2tp_ip6.c
@@ -63,7 +63,7 @@ static struct sock *__l2tp_ip6_bind_lookup(struct net *net,
63 struct sock *sk; 63 struct sock *sk;
64 64
65 sk_for_each_bound(sk, &l2tp_ip6_bind_table) { 65 sk_for_each_bound(sk, &l2tp_ip6_bind_table) {
66 struct in6_addr *addr = inet6_rcv_saddr(sk); 66 const struct in6_addr *addr = inet6_rcv_saddr(sk);
67 struct l2tp_ip6_sock *l2tp = l2tp_ip6_sk(sk); 67 struct l2tp_ip6_sock *l2tp = l2tp_ip6_sk(sk);
68 68
69 if (l2tp == NULL) 69 if (l2tp == NULL)
@@ -331,7 +331,7 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
331 rcu_read_unlock(); 331 rcu_read_unlock();
332 332
333 inet->inet_rcv_saddr = inet->inet_saddr = v4addr; 333 inet->inet_rcv_saddr = inet->inet_saddr = v4addr;
334 np->rcv_saddr = addr->l2tp_addr; 334 sk->sk_v6_rcv_saddr = addr->l2tp_addr;
335 np->saddr = addr->l2tp_addr; 335 np->saddr = addr->l2tp_addr;
336 336
337 l2tp_ip6_sk(sk)->conn_id = addr->l2tp_conn_id; 337 l2tp_ip6_sk(sk)->conn_id = addr->l2tp_conn_id;
@@ -421,14 +421,14 @@ static int l2tp_ip6_getname(struct socket *sock, struct sockaddr *uaddr,
421 if (!lsk->peer_conn_id) 421 if (!lsk->peer_conn_id)
422 return -ENOTCONN; 422 return -ENOTCONN;
423 lsa->l2tp_conn_id = lsk->peer_conn_id; 423 lsa->l2tp_conn_id = lsk->peer_conn_id;
424 lsa->l2tp_addr = np->daddr; 424 lsa->l2tp_addr = sk->sk_v6_daddr;
425 if (np->sndflow) 425 if (np->sndflow)
426 lsa->l2tp_flowinfo = np->flow_label; 426 lsa->l2tp_flowinfo = np->flow_label;
427 } else { 427 } else {
428 if (ipv6_addr_any(&np->rcv_saddr)) 428 if (ipv6_addr_any(&sk->sk_v6_rcv_saddr))
429 lsa->l2tp_addr = np->saddr; 429 lsa->l2tp_addr = np->saddr;
430 else 430 else
431 lsa->l2tp_addr = np->rcv_saddr; 431 lsa->l2tp_addr = sk->sk_v6_rcv_saddr;
432 432
433 lsa->l2tp_conn_id = lsk->conn_id; 433 lsa->l2tp_conn_id = lsk->conn_id;
434 } 434 }
@@ -537,8 +537,8 @@ static int l2tp_ip6_sendmsg(struct kiocb *iocb, struct sock *sk,
537 * sk->sk_dst_cache. 537 * sk->sk_dst_cache.
538 */ 538 */
539 if (sk->sk_state == TCP_ESTABLISHED && 539 if (sk->sk_state == TCP_ESTABLISHED &&
540 ipv6_addr_equal(daddr, &np->daddr)) 540 ipv6_addr_equal(daddr, &sk->sk_v6_daddr))
541 daddr = &np->daddr; 541 daddr = &sk->sk_v6_daddr;
542 542
543 if (addr_len >= sizeof(struct sockaddr_in6) && 543 if (addr_len >= sizeof(struct sockaddr_in6) &&
544 lsa->l2tp_scope_id && 544 lsa->l2tp_scope_id &&
@@ -548,7 +548,7 @@ static int l2tp_ip6_sendmsg(struct kiocb *iocb, struct sock *sk,
548 if (sk->sk_state != TCP_ESTABLISHED) 548 if (sk->sk_state != TCP_ESTABLISHED)
549 return -EDESTADDRREQ; 549 return -EDESTADDRREQ;
550 550
551 daddr = &np->daddr; 551 daddr = &sk->sk_v6_daddr;
552 fl6.flowlabel = np->flow_label; 552 fl6.flowlabel = np->flow_label;
553 } 553 }
554 554
diff --git a/net/l2tp/l2tp_netlink.c b/net/l2tp/l2tp_netlink.c
index 0825ff26e113..be446d517bc9 100644
--- a/net/l2tp/l2tp_netlink.c
+++ b/net/l2tp/l2tp_netlink.c
@@ -306,8 +306,8 @@ static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq, int fla
306 if (np) { 306 if (np) {
307 if (nla_put(skb, L2TP_ATTR_IP6_SADDR, sizeof(np->saddr), 307 if (nla_put(skb, L2TP_ATTR_IP6_SADDR, sizeof(np->saddr),
308 &np->saddr) || 308 &np->saddr) ||
309 nla_put(skb, L2TP_ATTR_IP6_DADDR, sizeof(np->daddr), 309 nla_put(skb, L2TP_ATTR_IP6_DADDR, sizeof(sk->sk_v6_daddr),
310 &np->daddr)) 310 &sk->sk_v6_daddr))
311 goto nla_put_failure; 311 goto nla_put_failure;
312 } else 312 } else
313#endif 313#endif
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c
index 5ebee2ded9e9..f0a7adaef2ea 100644
--- a/net/l2tp/l2tp_ppp.c
+++ b/net/l2tp/l2tp_ppp.c
@@ -906,8 +906,8 @@ static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr,
906#if IS_ENABLED(CONFIG_IPV6) 906#if IS_ENABLED(CONFIG_IPV6)
907 } else if ((tunnel->version == 2) && 907 } else if ((tunnel->version == 2) &&
908 (tunnel->sock->sk_family == AF_INET6)) { 908 (tunnel->sock->sk_family == AF_INET6)) {
909 struct ipv6_pinfo *np = inet6_sk(tunnel->sock);
910 struct sockaddr_pppol2tpin6 sp; 909 struct sockaddr_pppol2tpin6 sp;
910
911 len = sizeof(sp); 911 len = sizeof(sp);
912 memset(&sp, 0, len); 912 memset(&sp, 0, len);
913 sp.sa_family = AF_PPPOX; 913 sp.sa_family = AF_PPPOX;
@@ -920,13 +920,13 @@ static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr,
920 sp.pppol2tp.d_session = session->peer_session_id; 920 sp.pppol2tp.d_session = session->peer_session_id;
921 sp.pppol2tp.addr.sin6_family = AF_INET6; 921 sp.pppol2tp.addr.sin6_family = AF_INET6;
922 sp.pppol2tp.addr.sin6_port = inet->inet_dport; 922 sp.pppol2tp.addr.sin6_port = inet->inet_dport;
923 memcpy(&sp.pppol2tp.addr.sin6_addr, &np->daddr, 923 memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr,
924 sizeof(np->daddr)); 924 sizeof(tunnel->sock->sk_v6_daddr));
925 memcpy(uaddr, &sp, len); 925 memcpy(uaddr, &sp, len);
926 } else if ((tunnel->version == 3) && 926 } else if ((tunnel->version == 3) &&
927 (tunnel->sock->sk_family == AF_INET6)) { 927 (tunnel->sock->sk_family == AF_INET6)) {
928 struct ipv6_pinfo *np = inet6_sk(tunnel->sock);
929 struct sockaddr_pppol2tpv3in6 sp; 928 struct sockaddr_pppol2tpv3in6 sp;
929
930 len = sizeof(sp); 930 len = sizeof(sp);
931 memset(&sp, 0, len); 931 memset(&sp, 0, len);
932 sp.sa_family = AF_PPPOX; 932 sp.sa_family = AF_PPPOX;
@@ -939,8 +939,8 @@ static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr,
939 sp.pppol2tp.d_session = session->peer_session_id; 939 sp.pppol2tp.d_session = session->peer_session_id;
940 sp.pppol2tp.addr.sin6_family = AF_INET6; 940 sp.pppol2tp.addr.sin6_family = AF_INET6;
941 sp.pppol2tp.addr.sin6_port = inet->inet_dport; 941 sp.pppol2tp.addr.sin6_port = inet->inet_dport;
942 memcpy(&sp.pppol2tp.addr.sin6_addr, &np->daddr, 942 memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr,
943 sizeof(np->daddr)); 943 sizeof(tunnel->sock->sk_v6_daddr));
944 memcpy(uaddr, &sp, len); 944 memcpy(uaddr, &sp, len);
945#endif 945#endif
946 } else if (tunnel->version == 3) { 946 } else if (tunnel->version == 3) {
diff --git a/net/netfilter/xt_TPROXY.c b/net/netfilter/xt_TPROXY.c
index 5d8a3a3cd5a7..ef8a926752a9 100644
--- a/net/netfilter/xt_TPROXY.c
+++ b/net/netfilter/xt_TPROXY.c
@@ -200,7 +200,7 @@ nf_tproxy_get_sock_v6(struct net *net, const u8 protocol,
200 in->ifindex); 200 in->ifindex);
201 if (sk) { 201 if (sk) {
202 int connected = (sk->sk_state == TCP_ESTABLISHED); 202 int connected = (sk->sk_state == TCP_ESTABLISHED);
203 int wildcard = ipv6_addr_any(&inet6_sk(sk)->rcv_saddr); 203 int wildcard = ipv6_addr_any(&sk->sk_v6_rcv_saddr);
204 204
205 /* NOTE: we return listeners even if bound to 205 /* NOTE: we return listeners even if bound to
206 * 0.0.0.0, those are filtered out in 206 * 0.0.0.0, those are filtered out in
diff --git a/net/netfilter/xt_socket.c b/net/netfilter/xt_socket.c
index 06df2b9110f5..3dd0e374bc2b 100644
--- a/net/netfilter/xt_socket.c
+++ b/net/netfilter/xt_socket.c
@@ -370,7 +370,7 @@ socket_mt6_v1_v2(const struct sk_buff *skb, struct xt_action_param *par)
370 */ 370 */
371 wildcard = (!(info->flags & XT_SOCKET_NOWILDCARD) && 371 wildcard = (!(info->flags & XT_SOCKET_NOWILDCARD) &&
372 sk->sk_state != TCP_TIME_WAIT && 372 sk->sk_state != TCP_TIME_WAIT &&
373 ipv6_addr_any(&inet6_sk(sk)->rcv_saddr)); 373 ipv6_addr_any(&sk->sk_v6_rcv_saddr));
374 374
375 /* Ignore non-transparent sockets, 375 /* Ignore non-transparent sockets,
376 if XT_SOCKET_TRANSPARENT is used */ 376 if XT_SOCKET_TRANSPARENT is used */
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. */
433static void sctp_v6_to_sk_saddr(union sctp_addr *addr, struct sock *sk) 433static 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)
447static void sctp_v6_to_sk_daddr(union sctp_addr *addr, struct sock *sk) 447static 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
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index 9c9caaa5e0d3..0045c7cf1e9e 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -294,7 +294,7 @@ static int svc_one_sock_name(struct svc_sock *svsk, char *buf, int remaining)
294 case PF_INET6: 294 case PF_INET6:
295 len = snprintf(buf, remaining, "ipv6 %s %pI6 %d\n", 295 len = snprintf(buf, remaining, "ipv6 %s %pI6 %d\n",
296 proto_name, 296 proto_name,
297 &inet6_sk(sk)->rcv_saddr, 297 &sk->sk_v6_rcv_saddr,
298 inet_sk(sk)->inet_num); 298 inet_sk(sk)->inet_num);
299 break; 299 break;
300 default: 300 default:
diff --git a/security/lsm_audit.c b/security/lsm_audit.c
index 8d8d97dbb389..80554fcf9fcc 100644
--- a/security/lsm_audit.c
+++ b/security/lsm_audit.c
@@ -304,12 +304,11 @@ static void dump_common_audit_data(struct audit_buffer *ab,
304 } 304 }
305 case AF_INET6: { 305 case AF_INET6: {
306 struct inet_sock *inet = inet_sk(sk); 306 struct inet_sock *inet = inet_sk(sk);
307 struct ipv6_pinfo *inet6 = inet6_sk(sk);
308 307
309 print_ipv6_addr(ab, &inet6->rcv_saddr, 308 print_ipv6_addr(ab, &sk->sk_v6_rcv_saddr,
310 inet->inet_sport, 309 inet->inet_sport,
311 "laddr", "lport"); 310 "laddr", "lport");
312 print_ipv6_addr(ab, &inet6->daddr, 311 print_ipv6_addr(ab, &sk->sk_v6_daddr,
313 inet->inet_dport, 312 inet->inet_dport,
314 "faddr", "fport"); 313 "faddr", "fport");
315 break; 314 break;