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 | |
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>
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 | */ |
142 | struct ipv6_pinfo { | 142 | struct 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 | ||
257 | extern int inet6_sk_rebuild_header(struct sock *sk); | 255 | extern int inet6_sk_rebuild_header(struct sock *sk); |
258 | 256 | ||
259 | struct inet6_timewait_sock { | ||
260 | struct in6_addr tw_v6_daddr; | ||
261 | struct in6_addr tw_v6_rcv_saddr; | ||
262 | }; | ||
263 | |||
264 | struct tcp6_timewait_sock { | 257 | struct 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 | ||
269 | static 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) |
276 | static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk) | 262 | static 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 | ||
324 | static inline u16 inet6_tw_offset(const struct proto *prot) | 310 | static 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 | |||
330 | static 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 | |||
336 | static 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 | ||
341 | static inline int inet_v6_ipv6only(const struct sock *sk) | 317 | static 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, | |||
43 | static inline int inet6_sk_ehashfn(const struct sock *sk) | 43 | static 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 | ||
76 | int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto); | 76 | int 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 | ||
73 | static inline __u64 dccp_v6_init_sequence(struct sk_buff *skb) | 73 | static 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 | ||
31 | struct dccp6_timewait_sock { | 31 | struct 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 | ||
282 | int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb, | 280 | int 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 | ||
241 | static struct tcp_metrics_block *__tcp_get_metrics_tw(struct inet_timewait_sock *tw) | 241 | static 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); | |||
883 | void ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp, | 883 | void 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 | ||
166 | void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr) | 166 | void 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 | ||
267 | unique: | ||
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: | |||
299 | static inline u32 inet6_sk_port_offset(const struct sock *sk) | 279 | static 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, | |||
515 | static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk, | 515 | static 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 | ||
521 | static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk, | 521 | static 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 | ||
56 | int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2) | 56 | int 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) | |||
115 | static void udp_v6_rehash(struct sock *sk) | 114 | static 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. */ |
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 | ||
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; |