mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
9cb3a50c5f
commit
8141ed9fce
5 changed files with 30 additions and 0 deletions
|
|
@ -85,3 +85,28 @@ out:
|
|||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(ip4_datagram_connect);
|
||||
|
||||
void ip4_datagram_release_cb(struct sock *sk)
|
||||
{
|
||||
const struct inet_sock *inet = inet_sk(sk);
|
||||
const struct ip_options_rcu *inet_opt;
|
||||
__be32 daddr = inet->inet_daddr;
|
||||
struct flowi4 fl4;
|
||||
struct rtable *rt;
|
||||
|
||||
if (! __sk_dst_get(sk) || __sk_dst_check(sk, 0))
|
||||
return;
|
||||
|
||||
rcu_read_lock();
|
||||
inet_opt = rcu_dereference(inet->inet_opt);
|
||||
if (inet_opt && inet_opt->opt.srr)
|
||||
daddr = inet_opt->opt.faddr;
|
||||
rt = ip_route_output_ports(sock_net(sk), &fl4, sk, daddr,
|
||||
inet->inet_saddr, inet->inet_dport,
|
||||
inet->inet_sport, sk->sk_protocol,
|
||||
RT_CONN_FLAGS(sk), sk->sk_bound_dev_if);
|
||||
if (!IS_ERR(rt))
|
||||
__sk_dst_set(sk, &rt->dst);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip4_datagram_release_cb);
|
||||
|
|
|
|||
|
|
@ -738,6 +738,7 @@ struct proto ping_prot = {
|
|||
.recvmsg = ping_recvmsg,
|
||||
.bind = ping_bind,
|
||||
.backlog_rcv = ping_queue_rcv_skb,
|
||||
.release_cb = ip4_datagram_release_cb,
|
||||
.hash = ping_v4_hash,
|
||||
.unhash = ping_v4_unhash,
|
||||
.get_port = ping_v4_get_port,
|
||||
|
|
|
|||
|
|
@ -894,6 +894,7 @@ struct proto raw_prot = {
|
|||
.recvmsg = raw_recvmsg,
|
||||
.bind = raw_bind,
|
||||
.backlog_rcv = raw_rcv_skb,
|
||||
.release_cb = ip4_datagram_release_cb,
|
||||
.hash = raw_hash_sk,
|
||||
.unhash = raw_unhash_sk,
|
||||
.obj_size = sizeof(struct raw_sock),
|
||||
|
|
|
|||
|
|
@ -1952,6 +1952,7 @@ struct proto udp_prot = {
|
|||
.recvmsg = udp_recvmsg,
|
||||
.sendpage = udp_sendpage,
|
||||
.backlog_rcv = __udp_queue_rcv_skb,
|
||||
.release_cb = ip4_datagram_release_cb,
|
||||
.hash = udp_lib_hash,
|
||||
.unhash = udp_lib_unhash,
|
||||
.rehash = udp_v4_rehash,
|
||||
|
|
|
|||
Loading…
Reference in a new issue