Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Eric Dumazet and committed by
David S. Miller
efe4208f 05dbc7b5

+213 -288
+6 -40
include/linux/ipv6.h
··· 141 141 */ 142 142 struct ipv6_pinfo { 143 143 struct in6_addr saddr; 144 - struct in6_addr rcv_saddr; 145 - struct in6_addr daddr; 146 144 struct in6_pktinfo sticky_pktinfo; 147 145 const struct in6_addr *daddr_cache; 148 146 #ifdef CONFIG_IPV6_SUBTREES ··· 254 256 255 257 extern int inet6_sk_rebuild_header(struct sock *sk); 256 258 257 - struct inet6_timewait_sock { 258 - struct in6_addr tw_v6_daddr; 259 - struct in6_addr tw_v6_rcv_saddr; 260 - }; 261 - 262 259 struct tcp6_timewait_sock { 263 260 struct tcp_timewait_sock tcp6tw_tcp; 264 - struct inet6_timewait_sock tcp6tw_inet6; 265 261 }; 266 - 267 - static inline struct inet6_timewait_sock *inet6_twsk(const struct sock *sk) 268 - { 269 - return (struct inet6_timewait_sock *)(((u8 *)sk) + 270 - inet_twsk(sk)->tw_ipv6_offset); 271 - } 272 262 273 263 #if IS_ENABLED(CONFIG_IPV6) 274 264 static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk) ··· 307 321 #define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only) 308 322 #define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk)) 309 323 310 - static inline u16 inet6_tw_offset(const struct proto *prot) 324 + static inline const struct in6_addr *inet6_rcv_saddr(const struct sock *sk) 311 325 { 312 - return prot->twsk_prot->twsk_obj_size - 313 - sizeof(struct inet6_timewait_sock); 314 - } 315 - 316 - static inline struct in6_addr *__inet6_rcv_saddr(const struct sock *sk) 317 - { 318 - return likely(sk->sk_state != TCP_TIME_WAIT) ? 319 - &inet6_sk(sk)->rcv_saddr : &inet6_twsk(sk)->tw_v6_rcv_saddr; 320 - } 321 - 322 - static inline struct in6_addr *inet6_rcv_saddr(const struct sock *sk) 323 - { 324 - return sk->sk_family == AF_INET6 ? __inet6_rcv_saddr(sk) : NULL; 326 + if (sk->sk_family == AF_INET6) 327 + return &sk->sk_v6_rcv_saddr; 328 + return NULL; 325 329 } 326 330 327 331 static inline int inet_v6_ipv6only(const struct sock *sk) ··· 339 363 return NULL; 340 364 } 341 365 342 - #define __inet6_rcv_saddr(__sk) NULL 343 366 #define inet6_rcv_saddr(__sk) NULL 344 367 #define tcp_twsk_ipv6only(__sk) 0 345 368 #define inet_v6_ipv6only(__sk) 0 ··· 347 372 #define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ 348 373 (((__sk)->sk_portpair == (__ports)) && \ 349 374 ((__sk)->sk_family == AF_INET6) && \ 350 - ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \ 351 - ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ 375 + ipv6_addr_equal(&(__sk)->sk_v6_daddr, (__saddr)) && \ 376 + ipv6_addr_equal(&(__sk)->sk_v6_rcv_saddr, (__daddr)) && \ 352 377 (!(__sk)->sk_bound_dev_if || \ 353 378 ((__sk)->sk_bound_dev_if == (__dif))) && \ 354 - net_eq(sock_net(__sk), (__net))) 355 - 356 - #define INET6_TW_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ 357 - (((__sk)->sk_portpair == (__ports)) && \ 358 - ((__sk)->sk_family == AF_INET6) && \ 359 - ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr)) && \ 360 - ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_rcv_saddr, (__daddr)) && \ 361 - (!(__sk)->sk_bound_dev_if || \ 362 - ((__sk)->sk_bound_dev_if == (__dif))) && \ 363 379 net_eq(sock_net(__sk), (__net))) 364 380 365 381 #endif /* _IPV6_H */
+2 -3
include/net/inet6_hashtables.h
··· 43 43 static inline int inet6_sk_ehashfn(const struct sock *sk) 44 44 { 45 45 const struct inet_sock *inet = inet_sk(sk); 46 - const struct ipv6_pinfo *np = inet6_sk(sk); 47 - const struct in6_addr *laddr = &np->rcv_saddr; 48 - const struct in6_addr *faddr = &np->daddr; 46 + const struct in6_addr *laddr = &sk->sk_v6_rcv_saddr; 47 + const struct in6_addr *faddr = &sk->sk_v6_daddr; 49 48 const __u16 lport = inet->inet_num; 50 49 const __be16 fport = inet->inet_dport; 51 50 struct net *net = sock_net(sk);
+3 -1
include/net/inet_timewait_sock.h
··· 116 116 #define tw_prot __tw_common.skc_prot 117 117 #define tw_net __tw_common.skc_net 118 118 #define tw_daddr __tw_common.skc_daddr 119 + #define tw_v6_daddr __tw_common.skc_v6_daddr 119 120 #define tw_rcv_saddr __tw_common.skc_rcv_saddr 121 + #define tw_v6_rcv_saddr __tw_common.skc_v6_rcv_saddr 120 122 #define tw_dport __tw_common.skc_dport 121 123 #define tw_num __tw_common.skc_num 122 124 ··· 135 133 tw_transparent : 1, 136 134 tw_pad : 6, /* 6 bits hole */ 137 135 tw_tos : 8, 138 - tw_ipv6_offset : 16; 136 + tw_pad2 : 16 /* 16 bits hole */ 139 137 kmemcheck_bitfield_end(flags); 140 138 u32 tw_ttd; 141 139 struct inet_bind_bucket *tw_tb;
+1 -1
include/net/ip.h
··· 374 374 struct ipv6_pinfo *np = inet6_sk(sk); 375 375 376 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 379 #endif 380 380 }
+1 -1
include/net/ip6_checksum.h
··· 70 70 { 71 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 76 int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto);
+9
include/net/sock.h
··· 191 191 #ifdef CONFIG_NET_NS 192 192 struct net *skc_net; 193 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 201 * fields between dontcopy_begin/dontcopy_end 196 202 * are not copied in sock_copy() ··· 320 314 #define sk_bind_node __sk_common.skc_bind_node 321 315 #define sk_prot __sk_common.skc_prot 322 316 #define sk_net __sk_common.skc_net 317 + #define sk_v6_daddr __sk_common.skc_v6_daddr 318 + #define sk_v6_rcv_saddr __sk_common.skc_v6_rcv_saddr 319 + 323 320 socket_lock_t sk_lock; 324 321 struct sk_buff_head sk_receive_queue; 325 322 /*
+12 -12
net/dccp/ipv6.c
··· 67 67 struct dccp_hdr *dh = dccp_hdr(skb); 68 68 69 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 73 static inline __u64 dccp_v6_init_sequence(struct sk_buff *skb) ··· 467 467 468 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 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 476 inet_csk(newsk)->icsk_af_ops = &dccp_ipv6_mapped; 477 477 newsk->sk_backlog_rcv = dccp_v4_do_rcv; ··· 538 538 539 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 542 newnp->saddr = ireq6->loc_addr; 543 - newnp->rcv_saddr = ireq6->loc_addr; 543 + newsk->sk_v6_rcv_saddr = ireq6->loc_addr; 544 544 newsk->sk_bound_dev_if = ireq6->iif; 545 545 546 546 /* Now IPv6 options... ··· 885 885 return -EINVAL; 886 886 } 887 887 888 - np->daddr = usin->sin6_addr; 888 + sk->sk_v6_daddr = usin->sin6_addr; 889 889 np->flow_label = fl6.flowlabel; 890 890 891 891 /* ··· 915 915 goto failure; 916 916 } 917 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 920 return err; 921 921 } 922 922 923 - if (!ipv6_addr_any(&np->rcv_saddr)) 924 - saddr = &np->rcv_saddr; 923 + if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) 924 + saddr = &sk->sk_v6_rcv_saddr; 925 925 926 926 fl6.flowi6_proto = IPPROTO_DCCP; 927 - fl6.daddr = np->daddr; 927 + fl6.daddr = sk->sk_v6_daddr; 928 928 fl6.saddr = saddr ? *saddr : np->saddr; 929 929 fl6.flowi6_oif = sk->sk_bound_dev_if; 930 930 fl6.fl6_dport = usin->sin6_port; ··· 941 941 942 942 if (saddr == NULL) { 943 943 saddr = &fl6.saddr; 944 - np->rcv_saddr = *saddr; 944 + sk->sk_v6_rcv_saddr = *saddr; 945 945 } 946 946 947 947 /* set the source address */ ··· 963 963 goto late_failure; 964 964 965 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 967 inet->inet_sport, 968 968 inet->inet_dport); 969 969 err = dccp_connect(sk);
-1
net/dccp/ipv6.h
··· 30 30 31 31 struct dccp6_timewait_sock { 32 32 struct inet_timewait_sock inet; 33 - struct inet6_timewait_sock tw6; 34 33 }; 35 34 36 35 #endif /* _DCCP_IPV6_H */
+2 -5
net/dccp/minisocks.c
··· 56 56 #if IS_ENABLED(CONFIG_IPV6) 57 57 if (tw->tw_family == PF_INET6) { 58 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); 62 - tw6 = inet6_twsk((struct sock *)tw); 63 - tw6->tw_v6_daddr = np->daddr; 64 - tw6->tw_v6_rcv_saddr = np->rcv_saddr; 60 + tw->tw_v6_daddr = sk->sk_v6_daddr; 61 + tw->tw_v6_rcv_saddr = sk->sk_v6_rcv_saddr; 65 62 tw->tw_ipv6only = np->ipv6only; 66 63 } 67 64 #endif
+15 -20
net/ipv4/inet_diag.c
··· 121 121 122 122 #if IS_ENABLED(CONFIG_IPV6) 123 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; 127 - *(struct in6_addr *)r->id.idiag_dst = np->daddr; 125 + *(struct in6_addr *)r->id.idiag_src = sk->sk_v6_rcv_saddr; 126 + *(struct in6_addr *)r->id.idiag_dst = sk->sk_v6_daddr; 128 127 129 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 131 goto errout; 132 132 } 133 133 #endif ··· 255 255 r->idiag_inode = 0; 256 256 #if IS_ENABLED(CONFIG_IPV6) 257 257 if (tw->tw_family == AF_INET6) { 258 - const struct inet6_timewait_sock *tw6 = 259 - inet6_twsk((struct sock *)tw); 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; 258 + *(struct in6_addr *)r->id.idiag_src = tw->tw_v6_rcv_saddr; 259 + *(struct in6_addr *)r->id.idiag_dst = tw->tw_v6_daddr; 263 260 } 264 261 #endif 265 262 ··· 270 273 const struct nlmsghdr *unlh) 271 274 { 272 275 if (sk->sk_state == TCP_TIME_WAIT) 273 - return inet_twsk_diag_fill((struct inet_timewait_sock *)sk, 274 - skb, r, portid, seq, nlmsg_flags, 275 - unlh); 276 - return inet_csk_diag_fill(sk, skb, r, user_ns, portid, seq, nlmsg_flags, unlh); 276 + return inet_twsk_diag_fill(inet_twsk(sk), skb, r, portid, seq, 277 + nlmsg_flags, unlh); 278 + 279 + return inet_csk_diag_fill(sk, skb, r, user_ns, portid, seq, 280 + nlmsg_flags, unlh); 277 281 } 278 282 279 283 int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb, ··· 487 489 entry.family = sk->sk_family; 488 490 #if IS_ENABLED(CONFIG_IPV6) 489 491 if (entry.family == AF_INET6) { 490 - struct ipv6_pinfo *np = inet6_sk(sk); 491 492 492 - entry.saddr = np->rcv_saddr.s6_addr32; 493 - entry.daddr = np->daddr.s6_addr32; 493 + entry.saddr = sk->sk_v6_rcv_saddr.s6_addr32; 494 + entry.daddr = sk->sk_v6_daddr.s6_addr32; 494 495 } else 495 496 #endif 496 497 { ··· 646 649 entry.family = tw->tw_family; 647 650 #if IS_ENABLED(CONFIG_IPV6) 648 651 if (tw->tw_family == AF_INET6) { 649 - struct inet6_timewait_sock *tw6 = 650 - inet6_twsk((struct sock *)tw); 651 - entry.saddr = tw6->tw_v6_rcv_saddr.s6_addr32; 652 - entry.daddr = tw6->tw_v6_daddr.s6_addr32; 652 + entry.saddr = tw->tw_v6_rcv_saddr.s6_addr32; 653 + entry.daddr = tw->tw_v6_daddr.s6_addr32; 653 654 } else 654 655 #endif 655 656 {
+7 -8
net/ipv4/ping.c
··· 202 202 #if IS_ENABLED(CONFIG_IPV6) 203 203 } else if (skb->protocol == htons(ETH_P_IPV6) && 204 204 sk->sk_family == AF_INET6) { 205 - struct ipv6_pinfo *np = inet6_sk(sk); 206 205 207 206 pr_debug("found: %p: num=%d, daddr=%pI6c, dif=%d\n", sk, 208 207 (int) isk->inet_num, 209 - &inet6_sk(sk)->rcv_saddr, 208 + &sk->sk_v6_rcv_saddr, 210 209 sk->sk_bound_dev_if); 211 210 212 - if (!ipv6_addr_any(&np->rcv_saddr) && 213 - !ipv6_addr_equal(&np->rcv_saddr, 211 + if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr) && 212 + !ipv6_addr_equal(&sk->sk_v6_rcv_saddr, 214 213 &ipv6_hdr(skb)->daddr)) 215 214 continue; 216 215 #endif ··· 361 362 } else if (saddr->sa_family == AF_INET6) { 362 363 struct sockaddr_in6 *addr = (struct sockaddr_in6 *) saddr; 363 364 struct ipv6_pinfo *np = inet6_sk(sk); 364 - np->rcv_saddr = np->saddr = addr->sin6_addr; 365 + sk->sk_v6_rcv_saddr = np->saddr = addr->sin6_addr; 365 366 #endif 366 367 } 367 368 } ··· 375 376 #if IS_ENABLED(CONFIG_IPV6) 376 377 } else if (sk->sk_family == AF_INET6) { 377 378 struct ipv6_pinfo *np = inet6_sk(sk); 378 - memset(&np->rcv_saddr, 0, sizeof(np->rcv_saddr)); 379 + memset(&sk->sk_v6_rcv_saddr, 0, sizeof(sk->sk_v6_rcv_saddr)); 379 380 memset(&np->saddr, 0, sizeof(np->saddr)); 380 381 #endif 381 382 } ··· 417 418 err = 0; 418 419 if ((sk->sk_family == AF_INET && isk->inet_rcv_saddr) || 419 420 (sk->sk_family == AF_INET6 && 420 - !ipv6_addr_any(&inet6_sk(sk)->rcv_saddr))) 421 + !ipv6_addr_any(&sk->sk_v6_rcv_saddr))) 421 422 sk->sk_userlocks |= SOCK_BINDADDR_LOCK; 422 423 423 424 if (snum) ··· 428 429 429 430 #if IS_ENABLED(CONFIG_IPV6) 430 431 if (sk->sk_family == AF_INET6) 431 - memset(&inet6_sk(sk)->daddr, 0, sizeof(inet6_sk(sk)->daddr)); 432 + memset(&sk->sk_v6_daddr, 0, sizeof(sk->sk_v6_daddr)); 432 433 #endif 433 434 434 435 sk_dst_reset(sk);
+4 -6
net/ipv4/tcp_metrics.c
··· 240 240 241 241 static struct tcp_metrics_block *__tcp_get_metrics_tw(struct inet_timewait_sock *tw) 242 242 { 243 - struct inet6_timewait_sock *tw6; 244 243 struct tcp_metrics_block *tm; 245 244 struct inetpeer_addr addr; 246 245 unsigned int hash; ··· 252 253 hash = (__force unsigned int) addr.addr.a4; 253 254 break; 254 255 case AF_INET6: 255 - tw6 = inet6_twsk((struct sock *)tw); 256 - *(struct in6_addr *)addr.addr.a6 = tw6->tw_v6_daddr; 257 - hash = ipv6_addr_hash(&tw6->tw_v6_daddr); 256 + *(struct in6_addr *)addr.addr.a6 = tw->tw_v6_daddr; 257 + hash = ipv6_addr_hash(&tw->tw_v6_daddr); 258 258 break; 259 259 default: 260 260 return NULL; ··· 287 289 hash = (__force unsigned int) addr.addr.a4; 288 290 break; 289 291 case AF_INET6: 290 - *(struct in6_addr *)addr.addr.a6 = inet6_sk(sk)->daddr; 291 - hash = ipv6_addr_hash(&inet6_sk(sk)->daddr); 292 + *(struct in6_addr *)addr.addr.a6 = sk->sk_v6_daddr; 293 + hash = ipv6_addr_hash(&sk->sk_v6_daddr); 292 294 break; 293 295 default: 294 296 return NULL;
+2 -5
net/ipv4/tcp_minisocks.c
··· 293 293 #if IS_ENABLED(CONFIG_IPV6) 294 294 if (tw->tw_family == PF_INET6) { 295 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); 299 - tw6 = inet6_twsk((struct sock *)tw); 300 - tw6->tw_v6_daddr = np->daddr; 301 - tw6->tw_v6_rcv_saddr = np->rcv_saddr; 297 + tw->tw_v6_daddr = sk->sk_v6_daddr; 298 + tw->tw_v6_rcv_saddr = sk->sk_v6_rcv_saddr; 302 299 tw->tw_tclass = np->tclass; 303 300 tw->tw_ipv6only = np->ipv6only; 304 301 }
+11 -18
net/ipv4/tcp_probe.c
··· 101 101 si4.sin_addr.s_addr = inet->inet_##mem##addr; \ 102 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 106 * Hook inserted to be called before each receive packet. ··· 131 147 tcp_probe_copy_fl_to_si4(inet, p->dst.v4, d); 132 148 break; 133 149 case AF_INET6: 134 - tcp_probe_copy_fl_to_si6(inet, p->src.v6, s); 135 - tcp_probe_copy_fl_to_si6(inet, p->dst.v6, d); 150 + memset(&p->src.v6, 0, sizeof(p->src.v6)); 151 + memset(&p->dst.v6, 0, sizeof(p->dst.v6)); 152 + #if IS_ENABLED(CONFIG_IPV6) 153 + p->src.v6.sin6_family = AF_INET6; 154 + p->src.v6.sin6_port = inet->inet_sport; 155 + p->src.v6.sin6_addr = inet6_sk(sk)->saddr; 156 + 157 + p->dst.v6.sin6_family = AF_INET6; 158 + p->dst.v6.sin6_port = inet->inet_dport; 159 + p->dst.v6.sin6_addr = sk->sk_v6_daddr; 160 + #endif 136 161 break; 137 162 default: 138 163 BUG();
+1 -2
net/ipv4/tcp_timer.c
··· 374 374 } 375 375 #if IS_ENABLED(CONFIG_IPV6) 376 376 else if (sk->sk_family == AF_INET6) { 377 - struct ipv6_pinfo *np = inet6_sk(sk); 378 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 379 ntohs(inet->inet_dport), inet->inet_num, 381 380 tp->snd_una, tp->snd_nxt); 382 381 }
+5 -5
net/ipv6/af_inet6.c
··· 364 364 inet->inet_rcv_saddr = v4addr; 365 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 369 if (!(addr_type & IPV6_ADDR_MULTICAST)) 370 370 np->saddr = addr->sin6_addr; ··· 461 461 peer == 1) 462 462 return -ENOTCONN; 463 463 sin->sin6_port = inet->inet_dport; 464 - sin->sin6_addr = np->daddr; 464 + sin->sin6_addr = sk->sk_v6_daddr; 465 465 if (np->sndflow) 466 466 sin->sin6_flowinfo = np->flow_label; 467 467 } else { 468 - if (ipv6_addr_any(&np->rcv_saddr)) 468 + if (ipv6_addr_any(&sk->sk_v6_rcv_saddr)) 469 469 sin->sin6_addr = np->saddr; 470 470 else 471 - sin->sin6_addr = np->rcv_saddr; 471 + sin->sin6_addr = sk->sk_v6_rcv_saddr; 472 472 473 473 sin->sin6_port = inet->inet_sport; 474 474 } ··· 655 655 656 656 memset(&fl6, 0, sizeof(fl6)); 657 657 fl6.flowi6_proto = sk->sk_protocol; 658 - fl6.daddr = np->daddr; 658 + fl6.daddr = sk->sk_v6_daddr; 659 659 fl6.saddr = np->saddr; 660 660 fl6.flowlabel = np->flow_label; 661 661 fl6.flowi6_oif = sk->sk_bound_dev_if;
+12 -13
net/ipv6/datagram.c
··· 107 107 if (err) 108 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 112 if (ipv6_addr_any(&np->saddr) || 113 113 ipv6_mapped_addr_any(&np->saddr)) 114 114 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr); 115 115 116 - if (ipv6_addr_any(&np->rcv_saddr) || 117 - ipv6_mapped_addr_any(&np->rcv_saddr)) { 116 + if (ipv6_addr_any(&sk->sk_v6_rcv_saddr) || 117 + ipv6_mapped_addr_any(&sk->sk_v6_rcv_saddr)) { 118 118 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, 119 - &np->rcv_saddr); 119 + &sk->sk_v6_rcv_saddr); 120 120 if (sk->sk_prot->rehash) 121 121 sk->sk_prot->rehash(sk); 122 122 } ··· 145 145 } 146 146 } 147 147 148 - np->daddr = *daddr; 148 + sk->sk_v6_daddr = *daddr; 149 149 np->flow_label = fl6.flowlabel; 150 150 151 151 inet->inet_dport = usin->sin6_port; ··· 156 156 */ 157 157 158 158 fl6.flowi6_proto = sk->sk_protocol; 159 - fl6.daddr = np->daddr; 159 + fl6.daddr = sk->sk_v6_daddr; 160 160 fl6.saddr = np->saddr; 161 161 fl6.flowi6_oif = sk->sk_bound_dev_if; 162 162 fl6.flowi6_mark = sk->sk_mark; ··· 183 183 if (ipv6_addr_any(&np->saddr)) 184 184 np->saddr = fl6.saddr; 185 185 186 - if (ipv6_addr_any(&np->rcv_saddr)) { 187 - np->rcv_saddr = fl6.saddr; 186 + if (ipv6_addr_any(&sk->sk_v6_rcv_saddr)) { 187 + sk->sk_v6_rcv_saddr = fl6.saddr; 188 188 inet->inet_rcv_saddr = LOOPBACK4_IPV6; 189 189 if (sk->sk_prot->rehash) 190 190 sk->sk_prot->rehash(sk); 191 191 } 192 192 193 193 ip6_dst_store(sk, dst, 194 - ipv6_addr_equal(&fl6.daddr, &np->daddr) ? 195 - &np->daddr : NULL, 194 + ipv6_addr_equal(&fl6.daddr, &sk->sk_v6_daddr) ? 195 + &sk->sk_v6_daddr : NULL, 196 196 #ifdef CONFIG_IPV6_SUBTREES 197 197 ipv6_addr_equal(&fl6.saddr, &np->saddr) ? 198 198 &np->saddr : ··· 883 883 void ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp, 884 884 __u16 srcp, __u16 destp, int bucket) 885 885 { 886 - struct ipv6_pinfo *np = inet6_sk(sp); 887 886 const struct in6_addr *dest, *src; 888 887 889 - dest = &np->daddr; 890 - src = &np->rcv_saddr; 888 + dest = &sp->sk_v6_daddr; 889 + src = &sp->sk_v6_rcv_saddr; 891 890 seq_printf(seq, 892 891 "%5d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X " 893 892 "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d\n",
+3 -4
net/ipv6/inet6_connection_sock.c
··· 165 165 166 166 void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr) 167 167 { 168 - struct ipv6_pinfo *np = inet6_sk(sk); 169 168 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) uaddr; 170 169 171 170 sin6->sin6_family = AF_INET6; 172 - sin6->sin6_addr = np->daddr; 171 + sin6->sin6_addr = sk->sk_v6_daddr; 173 172 sin6->sin6_port = inet_sk(sk)->inet_dport; 174 173 /* We do not store received flowlabel for TCP */ 175 174 sin6->sin6_flowinfo = 0; ··· 202 203 203 204 memset(fl6, 0, sizeof(*fl6)); 204 205 fl6->flowi6_proto = sk->sk_protocol; 205 - fl6->daddr = np->daddr; 206 + fl6->daddr = sk->sk_v6_daddr; 206 207 fl6->saddr = np->saddr; 207 208 fl6->flowlabel = np->flow_label; 208 209 IP6_ECN_flow_xmit(sk, fl6->flowlabel); ··· 244 245 skb_dst_set_noref(skb, dst); 245 246 246 247 /* Restore final destination back after routing done */ 247 - fl6.daddr = np->daddr; 248 + fl6.daddr = sk->sk_v6_daddr; 248 249 249 250 res = ip6_xmit(sk, skb, &fl6, np->opt, np->tclass); 250 251 rcu_read_unlock();
+19 -39
net/ipv6/inet6_hashtables.c
··· 89 89 sk_nulls_for_each_rcu(sk, node, &head->chain) { 90 90 if (sk->sk_hash != hash) 91 91 continue; 92 - if (sk->sk_state == TCP_TIME_WAIT) { 93 - if (!INET6_TW_MATCH(sk, net, saddr, daddr, ports, dif)) 94 - continue; 95 - } else { 96 - if (!INET6_MATCH(sk, net, saddr, daddr, ports, dif)) 97 - continue; 98 - } 92 + if (!INET6_MATCH(sk, net, saddr, daddr, ports, dif)) 93 + continue; 99 94 if (unlikely(!atomic_inc_not_zero(&sk->sk_refcnt))) 100 95 goto out; 101 96 102 - if (sk->sk_state == TCP_TIME_WAIT) { 103 - if (unlikely(!INET6_TW_MATCH(sk, net, saddr, daddr, 104 - ports, dif))) { 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; 97 + if (unlikely(!INET6_MATCH(sk, net, saddr, daddr, ports, dif))) { 98 + sock_gen_put(sk); 99 + goto begin; 115 100 } 101 + goto found; 116 102 } 117 103 if (get_nulls_value(node) != slot) 118 104 goto begin; ··· 119 133 120 134 if (net_eq(sock_net(sk), net) && inet_sk(sk)->inet_num == hnum && 121 135 sk->sk_family == PF_INET6) { 122 - const struct ipv6_pinfo *np = inet6_sk(sk); 123 136 124 137 score = 1; 125 - if (!ipv6_addr_any(&np->rcv_saddr)) { 126 - if (!ipv6_addr_equal(&np->rcv_saddr, daddr)) 138 + if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) { 139 + if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr)) 127 140 return -1; 128 141 score++; 129 142 } ··· 214 229 { 215 230 struct inet_hashinfo *hinfo = death_row->hashinfo; 216 231 struct inet_sock *inet = inet_sk(sk); 217 - const struct ipv6_pinfo *np = inet6_sk(sk); 218 - const struct in6_addr *daddr = &np->rcv_saddr; 219 - const struct in6_addr *saddr = &np->daddr; 232 + const struct in6_addr *daddr = &sk->sk_v6_rcv_saddr; 233 + const struct in6_addr *saddr = &sk->sk_v6_daddr; 220 234 const int dif = sk->sk_bound_dev_if; 221 235 const __portpair ports = INET_COMBINED_PORTS(inet->inet_dport, lport); 222 236 struct net *net = sock_net(sk); ··· 234 250 if (sk2->sk_hash != hash) 235 251 continue; 236 252 237 - if (sk2->sk_state == TCP_TIME_WAIT) { 238 - if (likely(INET6_TW_MATCH(sk2, net, saddr, daddr, 239 - ports, dif))) { 253 + if (likely(INET6_MATCH(sk2, net, saddr, daddr, ports, dif))) { 254 + if (sk2->sk_state == TCP_TIME_WAIT) { 240 255 tw = inet_twsk(sk2); 241 256 if (twsk_unique(sk, sk2, twp)) 242 - goto unique; 243 - else 244 - goto not_unique; 257 + break; 245 258 } 246 - } 247 - if (likely(INET6_MATCH(sk2, net, saddr, daddr, ports, dif))) 248 259 goto not_unique; 260 + } 249 261 } 250 262 251 - unique: 252 263 /* Must record num and sport now. Otherwise we will see 253 - * in hash table socket with a funny identity. */ 264 + * in hash table socket with a funny identity. 265 + */ 254 266 inet->inet_num = lport; 255 267 inet->inet_sport = htons(lport); 256 268 sk->sk_hash = hash; ··· 279 299 static inline u32 inet6_sk_port_offset(const struct sock *sk) 280 300 { 281 301 const struct inet_sock *inet = inet_sk(sk); 282 - const struct ipv6_pinfo *np = inet6_sk(sk); 283 - return secure_ipv6_port_ephemeral(np->rcv_saddr.s6_addr32, 284 - np->daddr.s6_addr32, 302 + 303 + return secure_ipv6_port_ephemeral(sk->sk_v6_rcv_saddr.s6_addr32, 304 + sk->sk_v6_daddr.s6_addr32, 285 305 inet->inet_dport); 286 306 } 287 307
+4 -3
net/ipv6/ipv6_sockglue.c
··· 174 174 } 175 175 176 176 if (ipv6_only_sock(sk) || 177 - !ipv6_addr_v4mapped(&np->daddr)) { 177 + !ipv6_addr_v4mapped(&sk->sk_v6_daddr)) { 178 178 retv = -EADDRNOTAVAIL; 179 179 break; 180 180 } ··· 1011 1011 struct in6_pktinfo src_info; 1012 1012 src_info.ipi6_ifindex = np->mcast_oif ? np->mcast_oif : 1013 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 1015 put_cmsg(&msg, SOL_IPV6, IPV6_PKTINFO, sizeof(src_info), &src_info); 1016 1016 } 1017 1017 if (np->rxopt.bits.rxhlim) { ··· 1026 1026 struct in6_pktinfo src_info; 1027 1027 src_info.ipi6_ifindex = np->mcast_oif ? np->mcast_oif : 1028 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 1031 put_cmsg(&msg, SOL_IPV6, IPV6_2292PKTINFO, sizeof(src_info), &src_info); 1031 1032 } 1032 1033 if (np->rxopt.bits.rxohlim) {
+2 -2
net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
··· 297 297 struct nf_conntrack_tuple tuple = { .src.l3num = NFPROTO_IPV6 }; 298 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 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 303 tuple.dst.u.tcp.port = inet->inet_dport; 304 304 tuple.dst.protonum = sk->sk_protocol; 305 305
+1 -1
net/ipv6/ping.c
··· 116 116 } else { 117 117 if (sk->sk_state != TCP_ESTABLISHED) 118 118 return -EDESTADDRREQ; 119 - daddr = &np->daddr; 119 + daddr = &sk->sk_v6_daddr; 120 120 } 121 121 122 122 if (!iif)
+8 -9
net/ipv6/raw.c
··· 77 77 78 78 sk_for_each_from(sk) 79 79 if (inet_sk(sk)->inet_num == num) { 80 - struct ipv6_pinfo *np = inet6_sk(sk); 81 80 82 81 if (!net_eq(sock_net(sk), net)) 83 82 continue; 84 83 85 - if (!ipv6_addr_any(&np->daddr) && 86 - !ipv6_addr_equal(&np->daddr, rmt_addr)) 84 + if (!ipv6_addr_any(&sk->sk_v6_daddr) && 85 + !ipv6_addr_equal(&sk->sk_v6_daddr, rmt_addr)) 87 86 continue; 88 87 89 88 if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif) 90 89 continue; 91 90 92 - if (!ipv6_addr_any(&np->rcv_saddr)) { 93 - if (ipv6_addr_equal(&np->rcv_saddr, loc_addr)) 91 + if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) { 92 + if (ipv6_addr_equal(&sk->sk_v6_rcv_saddr, loc_addr)) 94 93 goto found; 95 94 if (is_multicast && 96 95 inet6_mc_check(sk, loc_addr, rmt_addr)) ··· 301 302 } 302 303 303 304 inet->inet_rcv_saddr = inet->inet_saddr = v4addr; 304 - np->rcv_saddr = addr->sin6_addr; 305 + sk->sk_v6_rcv_saddr = addr->sin6_addr; 305 306 if (!(addr_type & IPV6_ADDR_MULTICAST)) 306 307 np->saddr = addr->sin6_addr; 307 308 err = 0; ··· 803 804 * sk->sk_dst_cache. 804 805 */ 805 806 if (sk->sk_state == TCP_ESTABLISHED && 806 - ipv6_addr_equal(daddr, &np->daddr)) 807 - daddr = &np->daddr; 807 + ipv6_addr_equal(daddr, &sk->sk_v6_daddr)) 808 + daddr = &sk->sk_v6_daddr; 808 809 809 810 if (addr_len >= sizeof(struct sockaddr_in6) && 810 811 sin6->sin6_scope_id && ··· 815 816 return -EDESTADDRREQ; 816 817 817 818 proto = inet->inet_num; 818 - daddr = &np->daddr; 819 + daddr = &sk->sk_v6_daddr; 819 820 fl6.flowlabel = np->flow_label; 820 821 } 821 822
+21 -23
net/ipv6/tcp_ipv6.c
··· 192 192 } 193 193 194 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 196 tp->rx_opt.ts_recent = 0; 197 197 tp->rx_opt.ts_recent_stamp = 0; 198 198 tp->write_seq = 0; 199 199 } 200 200 201 - np->daddr = usin->sin6_addr; 201 + sk->sk_v6_daddr = usin->sin6_addr; 202 202 np->flow_label = fl6.flowlabel; 203 203 204 204 /* ··· 237 237 } else { 238 238 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr); 239 239 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, 240 - &np->rcv_saddr); 240 + &sk->sk_v6_rcv_saddr); 241 241 } 242 242 243 243 return err; 244 244 } 245 245 246 - if (!ipv6_addr_any(&np->rcv_saddr)) 247 - saddr = &np->rcv_saddr; 246 + if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) 247 + saddr = &sk->sk_v6_rcv_saddr; 248 248 249 249 fl6.flowi6_proto = IPPROTO_TCP; 250 - fl6.daddr = np->daddr; 250 + fl6.daddr = sk->sk_v6_daddr; 251 251 fl6.saddr = saddr ? *saddr : np->saddr; 252 252 fl6.flowi6_oif = sk->sk_bound_dev_if; 253 253 fl6.flowi6_mark = sk->sk_mark; ··· 266 266 267 267 if (saddr == NULL) { 268 268 saddr = &fl6.saddr; 269 - np->rcv_saddr = *saddr; 269 + sk->sk_v6_rcv_saddr = *saddr; 270 270 } 271 271 272 272 /* set the source address */ ··· 279 279 rt = (struct rt6_info *) dst; 280 280 if (tcp_death_row.sysctl_tw_recycle && 281 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 283 tcp_fetch_timewait_stamp(sk, dst); 284 284 285 285 icsk->icsk_ext_hdr_len = 0; ··· 298 298 299 299 if (!tp->write_seq && likely(!tp->repair)) 300 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 302 inet->inet_sport, 303 303 inet->inet_dport); 304 304 ··· 515 515 static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk, 516 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 521 static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk, ··· 621 621 622 622 if (sk) { 623 623 saddr = &inet6_sk(sk)->saddr; 624 - daddr = &inet6_sk(sk)->daddr; 624 + daddr = &sk->sk_v6_daddr; 625 625 } else if (req) { 626 626 saddr = &inet6_rsk(req)->loc_addr; 627 627 daddr = &inet6_rsk(req)->rmt_addr; ··· 1116 1116 1117 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 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 1125 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped; 1126 1126 newsk->sk_backlog_rcv = tcp_v4_do_rcv; ··· 1185 1185 1186 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 1189 newnp->saddr = treq->loc_addr; 1190 - newnp->rcv_saddr = treq->loc_addr; 1190 + newsk->sk_v6_rcv_saddr = treq->loc_addr; 1191 1191 newsk->sk_bound_dev_if = treq->iif; 1192 1192 1193 1193 /* Now IPv6 options... ··· 1244 1244 1245 1245 #ifdef CONFIG_TCP_MD5SIG 1246 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 1248 /* We're using one, so create a matching key 1249 1249 * on the newsk structure. If we fail to get 1250 1250 * memory, then we end up not copying the key 1251 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 1254 AF_INET6, key->key, key->keylen, 1255 1255 sk_gfp_atomic(sk, GFP_ATOMIC)); 1256 1256 } ··· 1758 1758 const struct inet_sock *inet = inet_sk(sp); 1759 1759 const struct tcp_sock *tp = tcp_sk(sp); 1760 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; 1764 - src = &np->rcv_saddr; 1762 + dest = &sp->sk_v6_daddr; 1763 + src = &sp->sk_v6_rcv_saddr; 1765 1764 destp = ntohs(inet->inet_dport); 1766 1765 srcp = ntohs(inet->inet_sport); 1767 1766 ··· 1809 1810 { 1810 1811 const struct in6_addr *dest, *src; 1811 1812 __u16 destp, srcp; 1812 - const struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw); 1813 1813 s32 delta = tw->tw_ttd - inet_tw_time_stamp(); 1814 1814 1815 - dest = &tw6->tw_v6_daddr; 1816 - src = &tw6->tw_v6_rcv_saddr; 1815 + dest = &tw->tw_v6_daddr; 1816 + src = &tw->tw_v6_rcv_saddr; 1817 1817 destp = ntohs(tw->tw_dport); 1818 1818 srcp = ntohs(tw->tw_sport); 1819 1819
+22 -26
net/ipv6/udp.c
··· 55 55 56 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 58 const struct in6_addr *sk2_rcv_saddr6 = inet6_rcv_saddr(sk2); 60 59 int sk_ipv6only = ipv6_only_sock(sk); 61 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 62 int addr_type2 = sk2_rcv_saddr6 ? ipv6_addr_type(sk2_rcv_saddr6) : IPV6_ADDR_MAPPED; 64 63 65 64 /* if both are mapped, treat as IPv4 */ ··· 76 77 return 1; 77 78 78 79 if (sk2_rcv_saddr6 && 79 - ipv6_addr_equal(sk_rcv_saddr6, sk2_rcv_saddr6)) 80 + ipv6_addr_equal(&sk->sk_v6_rcv_saddr, sk2_rcv_saddr6)) 80 81 return 1; 81 82 82 83 return 0; ··· 104 105 unsigned int hash2_nulladdr = 105 106 udp6_portaddr_hash(sock_net(sk), &in6addr_any, snum); 106 107 unsigned int hash2_partial = 107 - udp6_portaddr_hash(sock_net(sk), &inet6_sk(sk)->rcv_saddr, 0); 108 + udp6_portaddr_hash(sock_net(sk), &sk->sk_v6_rcv_saddr, 0); 108 109 109 110 /* precompute partial secondary hash */ 110 111 udp_sk(sk)->udp_portaddr_hash = hash2_partial; ··· 114 115 static void udp_v6_rehash(struct sock *sk) 115 116 { 116 117 u16 new_hash = udp6_portaddr_hash(sock_net(sk), 117 - &inet6_sk(sk)->rcv_saddr, 118 + &sk->sk_v6_rcv_saddr, 118 119 inet_sk(sk)->inet_num); 119 120 120 121 udp_lib_rehash(sk, new_hash); ··· 130 131 131 132 if (net_eq(sock_net(sk), net) && udp_sk(sk)->udp_port_hash == hnum && 132 133 sk->sk_family == PF_INET6) { 133 - struct ipv6_pinfo *np = inet6_sk(sk); 134 134 struct inet_sock *inet = inet_sk(sk); 135 135 136 136 score = 0; ··· 138 140 return -1; 139 141 score++; 140 142 } 141 - if (!ipv6_addr_any(&np->rcv_saddr)) { 142 - if (!ipv6_addr_equal(&np->rcv_saddr, daddr)) 143 + if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) { 144 + if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr)) 143 145 return -1; 144 146 score++; 145 147 } 146 - if (!ipv6_addr_any(&np->daddr)) { 147 - if (!ipv6_addr_equal(&np->daddr, saddr)) 148 + if (!ipv6_addr_any(&sk->sk_v6_daddr)) { 149 + if (!ipv6_addr_equal(&sk->sk_v6_daddr, saddr)) 148 150 return -1; 149 151 score++; 150 152 } ··· 167 169 168 170 if (net_eq(sock_net(sk), net) && udp_sk(sk)->udp_port_hash == hnum && 169 171 sk->sk_family == PF_INET6) { 170 - struct ipv6_pinfo *np = inet6_sk(sk); 171 172 struct inet_sock *inet = inet_sk(sk); 172 173 173 - if (!ipv6_addr_equal(&np->rcv_saddr, daddr)) 174 + if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, daddr)) 174 175 return -1; 175 176 score = 0; 176 177 if (inet->inet_dport) { ··· 177 180 return -1; 178 181 score++; 179 182 } 180 - if (!ipv6_addr_any(&np->daddr)) { 181 - if (!ipv6_addr_equal(&np->daddr, saddr)) 183 + if (!ipv6_addr_any(&sk->sk_v6_daddr)) { 184 + if (!ipv6_addr_equal(&sk->sk_v6_daddr, saddr)) 182 185 return -1; 183 186 score++; 184 187 } ··· 546 549 { 547 550 int rc; 548 551 549 - if (!ipv6_addr_any(&inet6_sk(sk)->daddr)) { 552 + if (!ipv6_addr_any(&sk->sk_v6_daddr)) { 550 553 sock_rps_save_rxhash(sk, skb); 551 554 sk_mark_napi_id(sk, skb); 552 555 } ··· 687 690 688 691 if (udp_sk(s)->udp_port_hash == num && 689 692 s->sk_family == PF_INET6) { 690 - struct ipv6_pinfo *np = inet6_sk(s); 691 693 if (inet->inet_dport) { 692 694 if (inet->inet_dport != rmt_port) 693 695 continue; 694 696 } 695 - if (!ipv6_addr_any(&np->daddr) && 696 - !ipv6_addr_equal(&np->daddr, rmt_addr)) 697 + if (!ipv6_addr_any(&sk->sk_v6_daddr) && 698 + !ipv6_addr_equal(&sk->sk_v6_daddr, rmt_addr)) 697 699 continue; 698 700 699 701 if (s->sk_bound_dev_if && s->sk_bound_dev_if != dif) 700 702 continue; 701 703 702 - if (!ipv6_addr_any(&np->rcv_saddr)) { 703 - if (!ipv6_addr_equal(&np->rcv_saddr, loc_addr)) 704 + if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) { 705 + if (!ipv6_addr_equal(&sk->sk_v6_rcv_saddr, loc_addr)) 704 706 continue; 705 707 } 706 708 if (!inet6_mc_check(s, loc_addr, rmt_addr)) ··· 1059 1063 } else if (!up->pending) { 1060 1064 if (sk->sk_state != TCP_ESTABLISHED) 1061 1065 return -EDESTADDRREQ; 1062 - daddr = &np->daddr; 1066 + daddr = &sk->sk_v6_daddr; 1063 1067 } else 1064 1068 daddr = NULL; 1065 1069 ··· 1129 1133 * sk->sk_dst_cache. 1130 1134 */ 1131 1135 if (sk->sk_state == TCP_ESTABLISHED && 1132 - ipv6_addr_equal(daddr, &np->daddr)) 1133 - daddr = &np->daddr; 1136 + ipv6_addr_equal(daddr, &sk->sk_v6_daddr)) 1137 + daddr = &sk->sk_v6_daddr; 1134 1138 1135 1139 if (addr_len >= sizeof(struct sockaddr_in6) && 1136 1140 sin6->sin6_scope_id && ··· 1141 1145 return -EDESTADDRREQ; 1142 1146 1143 1147 fl6.fl6_dport = inet->inet_dport; 1144 - daddr = &np->daddr; 1148 + daddr = &sk->sk_v6_daddr; 1145 1149 fl6.flowlabel = np->flow_label; 1146 1150 connected = 1; 1147 1151 } ··· 1257 1261 if (dst) { 1258 1262 if (connected) { 1259 1263 ip6_dst_store(sk, dst, 1260 - ipv6_addr_equal(&fl6.daddr, &np->daddr) ? 1261 - &np->daddr : NULL, 1264 + ipv6_addr_equal(&fl6.daddr, &sk->sk_v6_daddr) ? 1265 + &sk->sk_v6_daddr : NULL, 1262 1266 #ifdef CONFIG_IPV6_SUBTREES 1263 1267 ipv6_addr_equal(&fl6.saddr, &np->saddr) ? 1264 1268 &np->saddr :
+5 -5
net/l2tp/l2tp_core.c
··· 1181 1181 !(skb_dst(skb)->dev->features & NETIF_F_IPV6_CSUM)) { 1182 1182 __wsum csum = skb_checksum(skb, 0, udp_len, 0); 1183 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 1185 IPPROTO_UDP, csum); 1186 1186 if (uh->check == 0) 1187 1187 uh->check = CSUM_MANGLED_0; ··· 1189 1189 skb->ip_summed = CHECKSUM_PARTIAL; 1190 1190 skb->csum_start = skb_transport_header(skb) - skb->head; 1191 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 1193 udp_len, IPPROTO_UDP, 0); 1194 1194 } 1195 1195 } ··· 1713 1713 struct ipv6_pinfo *np = inet6_sk(sk); 1714 1714 1715 1715 if (ipv6_addr_v4mapped(&np->saddr) && 1716 - ipv6_addr_v4mapped(&np->daddr)) { 1716 + ipv6_addr_v4mapped(&sk->sk_v6_daddr)) { 1717 1717 struct inet_sock *inet = inet_sk(sk); 1718 1718 1719 1719 tunnel->v4mapped = true; 1720 1720 inet->inet_saddr = np->saddr.s6_addr32[3]; 1721 - inet->inet_rcv_saddr = np->rcv_saddr.s6_addr32[3]; 1722 - inet->inet_daddr = np->daddr.s6_addr32[3]; 1721 + inet->inet_rcv_saddr = sk->sk_v6_rcv_saddr.s6_addr32[3]; 1722 + inet->inet_daddr = sk->sk_v6_daddr.s6_addr32[3]; 1723 1723 } else { 1724 1724 tunnel->v4mapped = false; 1725 1725 }
+3 -2
net/l2tp/l2tp_debugfs.c
··· 127 127 128 128 #if IS_ENABLED(CONFIG_IPV6) 129 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 132 seq_printf(m, " from %pI6c to %pI6c\n", 132 - &np->saddr, &np->daddr); 133 + &np->saddr, &tunnel->sock->sk_v6_daddr); 133 134 } else 134 135 #endif 135 136 seq_printf(m, " from %pI4 to %pI4\n",
+8 -8
net/l2tp/l2tp_ip6.c
··· 63 63 struct sock *sk; 64 64 65 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 67 struct l2tp_ip6_sock *l2tp = l2tp_ip6_sk(sk); 68 68 69 69 if (l2tp == NULL) ··· 331 331 rcu_read_unlock(); 332 332 333 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 335 np->saddr = addr->l2tp_addr; 336 336 337 337 l2tp_ip6_sk(sk)->conn_id = addr->l2tp_conn_id; ··· 421 421 if (!lsk->peer_conn_id) 422 422 return -ENOTCONN; 423 423 lsa->l2tp_conn_id = lsk->peer_conn_id; 424 - lsa->l2tp_addr = np->daddr; 424 + lsa->l2tp_addr = sk->sk_v6_daddr; 425 425 if (np->sndflow) 426 426 lsa->l2tp_flowinfo = np->flow_label; 427 427 } else { 428 - if (ipv6_addr_any(&np->rcv_saddr)) 428 + if (ipv6_addr_any(&sk->sk_v6_rcv_saddr)) 429 429 lsa->l2tp_addr = np->saddr; 430 430 else 431 - lsa->l2tp_addr = np->rcv_saddr; 431 + lsa->l2tp_addr = sk->sk_v6_rcv_saddr; 432 432 433 433 lsa->l2tp_conn_id = lsk->conn_id; 434 434 } ··· 537 537 * sk->sk_dst_cache. 538 538 */ 539 539 if (sk->sk_state == TCP_ESTABLISHED && 540 - ipv6_addr_equal(daddr, &np->daddr)) 541 - daddr = &np->daddr; 540 + ipv6_addr_equal(daddr, &sk->sk_v6_daddr)) 541 + daddr = &sk->sk_v6_daddr; 542 542 543 543 if (addr_len >= sizeof(struct sockaddr_in6) && 544 544 lsa->l2tp_scope_id && ··· 548 548 if (sk->sk_state != TCP_ESTABLISHED) 549 549 return -EDESTADDRREQ; 550 550 551 - daddr = &np->daddr; 551 + daddr = &sk->sk_v6_daddr; 552 552 fl6.flowlabel = np->flow_label; 553 553 } 554 554
+2 -2
net/l2tp/l2tp_netlink.c
··· 306 306 if (np) { 307 307 if (nla_put(skb, L2TP_ATTR_IP6_SADDR, sizeof(np->saddr), 308 308 &np->saddr) || 309 - nla_put(skb, L2TP_ATTR_IP6_DADDR, sizeof(np->daddr), 310 - &np->daddr)) 309 + nla_put(skb, L2TP_ATTR_IP6_DADDR, sizeof(sk->sk_v6_daddr), 310 + &sk->sk_v6_daddr)) 311 311 goto nla_put_failure; 312 312 } else 313 313 #endif
+6 -6
net/l2tp/l2tp_ppp.c
··· 906 906 #if IS_ENABLED(CONFIG_IPV6) 907 907 } else if ((tunnel->version == 2) && 908 908 (tunnel->sock->sk_family == AF_INET6)) { 909 - struct ipv6_pinfo *np = inet6_sk(tunnel->sock); 910 909 struct sockaddr_pppol2tpin6 sp; 910 + 911 911 len = sizeof(sp); 912 912 memset(&sp, 0, len); 913 913 sp.sa_family = AF_PPPOX; ··· 920 920 sp.pppol2tp.d_session = session->peer_session_id; 921 921 sp.pppol2tp.addr.sin6_family = AF_INET6; 922 922 sp.pppol2tp.addr.sin6_port = inet->inet_dport; 923 - memcpy(&sp.pppol2tp.addr.sin6_addr, &np->daddr, 924 - sizeof(np->daddr)); 923 + memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr, 924 + sizeof(tunnel->sock->sk_v6_daddr)); 925 925 memcpy(uaddr, &sp, len); 926 926 } else if ((tunnel->version == 3) && 927 927 (tunnel->sock->sk_family == AF_INET6)) { 928 - struct ipv6_pinfo *np = inet6_sk(tunnel->sock); 929 928 struct sockaddr_pppol2tpv3in6 sp; 929 + 930 930 len = sizeof(sp); 931 931 memset(&sp, 0, len); 932 932 sp.sa_family = AF_PPPOX; ··· 939 939 sp.pppol2tp.d_session = session->peer_session_id; 940 940 sp.pppol2tp.addr.sin6_family = AF_INET6; 941 941 sp.pppol2tp.addr.sin6_port = inet->inet_dport; 942 - memcpy(&sp.pppol2tp.addr.sin6_addr, &np->daddr, 943 - sizeof(np->daddr)); 942 + memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr, 943 + sizeof(tunnel->sock->sk_v6_daddr)); 944 944 memcpy(uaddr, &sp, len); 945 945 #endif 946 946 } else if (tunnel->version == 3) {
+1 -1
net/netfilter/xt_TPROXY.c
··· 200 200 in->ifindex); 201 201 if (sk) { 202 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 205 /* NOTE: we return listeners even if bound to 206 206 * 0.0.0.0, those are filtered out in
+1 -1
net/netfilter/xt_socket.c
··· 370 370 */ 371 371 wildcard = (!(info->flags & XT_SOCKET_NOWILDCARD) && 372 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 375 /* Ignore non-transparent sockets, 376 376 if XT_SOCKET_TRANSPARENT is used */
+11 -11
net/sctp/ipv6.c
··· 426 426 { 427 427 addr->v6.sin6_family = AF_INET6; 428 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 432 /* Initialize sk->sk_rcv_saddr from sctp_addr. */ 433 433 static void sctp_v6_to_sk_saddr(union sctp_addr *addr, struct sock *sk) 434 434 { 435 435 if (addr->sa.sa_family == AF_INET && sctp_sk(sk)->v4mapped) { 436 - inet6_sk(sk)->rcv_saddr.s6_addr32[0] = 0; 437 - inet6_sk(sk)->rcv_saddr.s6_addr32[1] = 0; 438 - inet6_sk(sk)->rcv_saddr.s6_addr32[2] = htonl(0x0000ffff); 439 - inet6_sk(sk)->rcv_saddr.s6_addr32[3] = 436 + sk->sk_v6_rcv_saddr.s6_addr32[0] = 0; 437 + sk->sk_v6_rcv_saddr.s6_addr32[1] = 0; 438 + sk->sk_v6_rcv_saddr.s6_addr32[2] = htonl(0x0000ffff); 439 + sk->sk_v6_rcv_saddr.s6_addr32[3] = 440 440 addr->v4.sin_addr.s_addr; 441 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 447 static void sctp_v6_to_sk_daddr(union sctp_addr *addr, struct sock *sk) 448 448 { 449 449 if (addr->sa.sa_family == AF_INET && sctp_sk(sk)->v4mapped) { 450 - inet6_sk(sk)->daddr.s6_addr32[0] = 0; 451 - inet6_sk(sk)->daddr.s6_addr32[1] = 0; 452 - inet6_sk(sk)->daddr.s6_addr32[2] = htonl(0x0000ffff); 453 - inet6_sk(sk)->daddr.s6_addr32[3] = addr->v4.sin_addr.s_addr; 450 + sk->sk_v6_daddr.s6_addr32[0] = 0; 451 + sk->sk_v6_daddr.s6_addr32[1] = 0; 452 + sk->sk_v6_daddr.s6_addr32[2] = htonl(0x0000ffff); 453 + sk->sk_v6_daddr.s6_addr32[3] = addr->v4.sin_addr.s_addr; 454 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
+1 -1
net/sunrpc/svcsock.c
··· 294 294 case PF_INET6: 295 295 len = snprintf(buf, remaining, "ipv6 %s %pI6 %d\n", 296 296 proto_name, 297 - &inet6_sk(sk)->rcv_saddr, 297 + &sk->sk_v6_rcv_saddr, 298 298 inet_sk(sk)->inet_num); 299 299 break; 300 300 default:
+2 -3
security/lsm_audit.c
··· 304 304 } 305 305 case AF_INET6: { 306 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 309 inet->inet_sport, 311 310 "laddr", "lport"); 312 - print_ipv6_addr(ab, &inet6->daddr, 311 + print_ipv6_addr(ab, &sk->sk_v6_daddr, 313 312 inet->inet_dport, 314 313 "faddr", "fport"); 315 314 break;