Commit 8141ed9fcedb278f4a3a78680591bef1e55f75fb
Committed by
David S. Miller
1 parent
9cb3a50c5f
Exists in
master
and in
20 other branches
ipv4: Add a socket release callback for datagram sockets
This implements a socket release callback function to check if the socket cached route got invalid during the time we owned the socket. The function is used from udp, raw and ping sockets. Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 5 changed files with 30 additions and 0 deletions Side-by-side Diff
include/net/ip.h
net/ipv4/datagram.c
... | ... | @@ -85,4 +85,29 @@ |
85 | 85 | return err; |
86 | 86 | } |
87 | 87 | EXPORT_SYMBOL(ip4_datagram_connect); |
88 | + | |
89 | +void ip4_datagram_release_cb(struct sock *sk) | |
90 | +{ | |
91 | + const struct inet_sock *inet = inet_sk(sk); | |
92 | + const struct ip_options_rcu *inet_opt; | |
93 | + __be32 daddr = inet->inet_daddr; | |
94 | + struct flowi4 fl4; | |
95 | + struct rtable *rt; | |
96 | + | |
97 | + if (! __sk_dst_get(sk) || __sk_dst_check(sk, 0)) | |
98 | + return; | |
99 | + | |
100 | + rcu_read_lock(); | |
101 | + inet_opt = rcu_dereference(inet->inet_opt); | |
102 | + if (inet_opt && inet_opt->opt.srr) | |
103 | + daddr = inet_opt->opt.faddr; | |
104 | + rt = ip_route_output_ports(sock_net(sk), &fl4, sk, daddr, | |
105 | + inet->inet_saddr, inet->inet_dport, | |
106 | + inet->inet_sport, sk->sk_protocol, | |
107 | + RT_CONN_FLAGS(sk), sk->sk_bound_dev_if); | |
108 | + if (!IS_ERR(rt)) | |
109 | + __sk_dst_set(sk, &rt->dst); | |
110 | + rcu_read_unlock(); | |
111 | +} | |
112 | +EXPORT_SYMBOL_GPL(ip4_datagram_release_cb); |
net/ipv4/ping.c
net/ipv4/raw.c
net/ipv4/udp.c
-
mentioned in commit 3480c0
-
mentioned in commit 3480c0
-
mentioned in commit 3480c0
-
mentioned in commit 3480c0
-
mentioned in commit 3480c0
-
mentioned in commit 970967
-
mentioned in commit 970967
-
mentioned in commit 970967
-
mentioned in commit 970967
-
mentioned in commit 970967
-
mentioned in commit 970967
-
mentioned in commit 970967
-
mentioned in commit 970967
-
mentioned in commit 970967
-
mentioned in commit 970967
-
mentioned in commit 970967
-
mentioned in commit 970967
-
mentioned in commit 970967