aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/inet_hashtables.c11
-rw-r--r--net/ipv4/tcp_ipv4.c8
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 */
40u32 sk_ehashfn(const struct sock *sk) 42u32 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);