|
|
@@ -57,8 +57,8 @@ static inline struct l2tp_ip6_sock *l2tp_ip6_sk(const struct sock *sk)
|
|
|
return (struct l2tp_ip6_sock *)sk;
|
|
|
}
|
|
|
|
|
|
-static struct sock *__l2tp_ip6_bind_lookup(struct net *net,
|
|
|
- struct in6_addr *laddr,
|
|
|
+static struct sock *__l2tp_ip6_bind_lookup(const struct net *net,
|
|
|
+ const struct in6_addr *laddr,
|
|
|
const struct in6_addr *raddr,
|
|
|
int dif, u32 tunnel_id)
|
|
|
{
|
|
|
@@ -67,18 +67,26 @@ static struct sock *__l2tp_ip6_bind_lookup(struct net *net,
|
|
|
sk_for_each_bound(sk, &l2tp_ip6_bind_table) {
|
|
|
const struct in6_addr *sk_laddr = inet6_rcv_saddr(sk);
|
|
|
const struct in6_addr *sk_raddr = &sk->sk_v6_daddr;
|
|
|
- struct l2tp_ip6_sock *l2tp = l2tp_ip6_sk(sk);
|
|
|
+ const struct l2tp_ip6_sock *l2tp = l2tp_ip6_sk(sk);
|
|
|
|
|
|
- if (l2tp == NULL)
|
|
|
+ if (!net_eq(sock_net(sk), net))
|
|
|
continue;
|
|
|
|
|
|
- if ((l2tp->conn_id == tunnel_id) &&
|
|
|
- net_eq(sock_net(sk), net) &&
|
|
|
- (!sk_laddr || ipv6_addr_any(sk_laddr) || ipv6_addr_equal(sk_laddr, laddr)) &&
|
|
|
- (!raddr || ipv6_addr_any(sk_raddr) || ipv6_addr_equal(sk_raddr, raddr)) &&
|
|
|
- (!sk->sk_bound_dev_if || !dif ||
|
|
|
- sk->sk_bound_dev_if == dif))
|
|
|
- goto found;
|
|
|
+ if (sk->sk_bound_dev_if && dif && sk->sk_bound_dev_if != dif)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (sk_laddr && !ipv6_addr_any(sk_laddr) &&
|
|
|
+ !ipv6_addr_any(laddr) && !ipv6_addr_equal(sk_laddr, laddr))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (!ipv6_addr_any(sk_raddr) && raddr &&
|
|
|
+ !ipv6_addr_any(raddr) && !ipv6_addr_equal(sk_raddr, raddr))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (l2tp->conn_id != tunnel_id)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ goto found;
|
|
|
}
|
|
|
|
|
|
sk = NULL;
|