diff options
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/inet_hashtables.c | 11 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 8 |
2 files changed, 14 insertions, 5 deletions
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c index 3a86dfd7ae33..ab7f677a97db 100644 --- a/net/ipv4/inet_hashtables.c +++ b/net/ipv4/inet_hashtables.c | |||
@@ -36,9 +36,18 @@ static u32 inet_ehashfn(const struct net *net, const __be32 laddr, | |||
36 | inet_ehash_secret + net_hash_mix(net)); | 36 | inet_ehash_secret + net_hash_mix(net)); |
37 | } | 37 | } |
38 | 38 | ||
39 | 39 | /* This function handles inet_sock, but also timewait and request sockets | |
40 | * for IPv4/IPv6. | ||
41 | */ | ||
40 | u32 sk_ehashfn(const struct sock *sk) | 42 | u32 sk_ehashfn(const struct sock *sk) |
41 | { | 43 | { |
44 | #if IS_ENABLED(CONFIG_IPV6) | ||
45 | if (sk->sk_family == AF_INET6 && | ||
46 | !ipv6_addr_v4mapped(&sk->sk_v6_daddr)) | ||
47 | return inet6_ehashfn(sock_net(sk), | ||
48 | &sk->sk_v6_rcv_saddr, sk->sk_num, | ||
49 | &sk->sk_v6_daddr, sk->sk_dport); | ||
50 | #endif | ||
42 | return inet_ehashfn(sock_net(sk), | 51 | return inet_ehashfn(sock_net(sk), |
43 | sk->sk_rcv_saddr, sk->sk_num, | 52 | sk->sk_rcv_saddr, sk->sk_num, |
44 | sk->sk_daddr, sk->sk_dport); | 53 | sk->sk_daddr, sk->sk_dport); |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 80067d5858b4..ca207df4af1c 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -189,7 +189,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
189 | 189 | ||
190 | if (!inet->inet_saddr) | 190 | if (!inet->inet_saddr) |
191 | inet->inet_saddr = fl4->saddr; | 191 | inet->inet_saddr = fl4->saddr; |
192 | inet->inet_rcv_saddr = inet->inet_saddr; | 192 | sk_rcv_saddr_set(sk, inet->inet_saddr); |
193 | 193 | ||
194 | if (tp->rx_opt.ts_recent_stamp && inet->inet_daddr != daddr) { | 194 | if (tp->rx_opt.ts_recent_stamp && inet->inet_daddr != daddr) { |
195 | /* Reset inherited state */ | 195 | /* Reset inherited state */ |
@@ -204,7 +204,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
204 | tcp_fetch_timewait_stamp(sk, &rt->dst); | 204 | tcp_fetch_timewait_stamp(sk, &rt->dst); |
205 | 205 | ||
206 | inet->inet_dport = usin->sin_port; | 206 | inet->inet_dport = usin->sin_port; |
207 | inet->inet_daddr = daddr; | 207 | sk_daddr_set(sk, daddr); |
208 | 208 | ||
209 | inet_csk(sk)->icsk_ext_hdr_len = 0; | 209 | inet_csk(sk)->icsk_ext_hdr_len = 0; |
210 | if (inet_opt) | 210 | if (inet_opt) |
@@ -1319,8 +1319,8 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1319 | newtp = tcp_sk(newsk); | 1319 | newtp = tcp_sk(newsk); |
1320 | newinet = inet_sk(newsk); | 1320 | newinet = inet_sk(newsk); |
1321 | ireq = inet_rsk(req); | 1321 | ireq = inet_rsk(req); |
1322 | newinet->inet_daddr = ireq->ir_rmt_addr; | 1322 | sk_daddr_set(newsk, ireq->ir_rmt_addr); |
1323 | newinet->inet_rcv_saddr = ireq->ir_loc_addr; | 1323 | sk_rcv_saddr_set(newsk, ireq->ir_loc_addr); |
1324 | newinet->inet_saddr = ireq->ir_loc_addr; | 1324 | newinet->inet_saddr = ireq->ir_loc_addr; |
1325 | inet_opt = ireq->opt; | 1325 | inet_opt = ireq->opt; |
1326 | rcu_assign_pointer(newinet->inet_opt, inet_opt); | 1326 | rcu_assign_pointer(newinet->inet_opt, inet_opt); |