16 #include <linux/module.h>
17 #include <linux/in6.h>
18 #include <linux/ipv6.h>
20 #include <linux/slab.h>
33 const struct sock *sk2;
43 (!sk->sk_bound_dev_if ||
44 !sk2->sk_bound_dev_if ||
45 sk->sk_bound_dev_if == sk2->sk_bound_dev_if) &&
46 (!sk->sk_reuse || !sk2->sk_reuse ||
66 memset(fl6, 0,
sizeof(*fl6));
71 fl6->flowi6_oif = treq->
iif;
73 fl6->fl6_dport = inet_rsk(req)->rmt_port;
74 fl6->fl6_sport = inet_rsk(req)->loc_port;
75 security_req_classify_flow(req, flowi6_to_flowi(fl6));
92 c = jhash_3words((
__force u32)raddr->s6_addr32[0],
93 (
__force u32)raddr->s6_addr32[1],
94 (
__force u32)raddr->s6_addr32[2],
97 c = jhash_2words((
__force u32)raddr->s6_addr32[3],
101 return c & (synq_hsize - 1);
115 for (prev = &lopt->
syn_table[inet6_synq_hash(raddr, rport,
118 (req = *prev) !=
NULL;
122 if (inet_rsk(req)->rmt_port == rport &&
124 ipv6_addr_equal(&treq->
rmt_addr, raddr) &&
125 ipv6_addr_equal(&treq->
loc_addr, laddr) &&
126 (!treq->
iif || treq->
iif == iif)) {
140 const unsigned long timeout)
144 const u32 h = inet6_synq_hash(&inet6_rsk(req)->rmt_addr,
145 inet_rsk(req)->rmt_port,
149 inet_csk_reqsk_queue_added(sk, timeout);
161 sin6->
sin6_port = inet_sk(sk)->inet_dport;
165 if (sk->sk_bound_dev_if &&
177 __ip6_dst_store(sk, dst, daddr, saddr);
194 memset(fl6, 0,
sizeof(*fl6));
200 fl6->flowi6_oif = sk->sk_bound_dev_if;
201 fl6->flowi6_mark = sk->
sk_mark;
204 security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
208 dst = __inet6_csk_dst_check(sk, np->
dst_cookie);
213 __inet6_csk_dst_store(sk, dst,
NULL,
NULL);
220 struct sock *sk = skb->
sk;
226 dst = inet6_csk_route_socket(sk, &fl6);
249 struct dst_entry *dst = inet6_csk_route_socket(sk, &fl6);
253 dst->
ops->update_pmtu(dst, sk,
NULL, mtu);
255 dst = inet6_csk_route_socket(sk, &fl6);
256 return IS_ERR(dst) ?
NULL :
dst;