Release 4.10 net/ipv6/inet6_connection_sock.c
/*
* INET An implementation of the TCP/IP protocol suite for the LINUX
* operating system. INET is implemented using the BSD Socket
* interface as the means of communication with the user level.
*
* Support for INET6 connection oriented protocols.
*
* Authors: See the TCPv6 sources
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or(at your option) any later version.
*/
#include <linux/module.h>
#include <linux/in6.h>
#include <linux/ipv6.h>
#include <linux/jhash.h>
#include <linux/slab.h>
#include <net/addrconf.h>
#include <net/inet_connection_sock.h>
#include <net/inet_ecn.h>
#include <net/inet_hashtables.h>
#include <net/ip6_route.h>
#include <net/sock.h>
#include <net/inet6_connection_sock.h>
#include <net/sock_reuseport.h>
int inet6_csk_bind_conflict(const struct sock *sk,
const struct inet_bind_bucket *tb, bool relax,
bool reuseport_ok)
{
const struct sock *sk2;
bool reuse = !!sk->sk_reuse;
bool reuseport = !!sk->sk_reuseport && reuseport_ok;
kuid_t uid = sock_i_uid((struct sock *)sk);
/* We must walk the whole port owner list in this case. -DaveM */
/*
* See comment in inet_csk_bind_conflict about sock lookup
* vs net namespaces issues.
*/
sk_for_each_bound(sk2, &tb->owners) {
if (sk != sk2 &&
(!sk->sk_bound_dev_if ||
!sk2->sk_bound_dev_if ||
sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) {
if ((!reuse || !sk2->sk_reuse ||
sk2->sk_state == TCP_LISTEN) &&
(!reuseport || !sk2->sk_reuseport ||
rcu_access_pointer(sk->sk_reuseport_cb) ||
(sk2->sk_state != TCP_TIME_WAIT &&
!uid_eq(uid,
sock_i_uid((struct sock *)sk2))))) {
if (ipv6_rcv_saddr_equal(sk, sk2, true))
break;
}
if (!relax && reuse && sk2->sk_reuse &&
sk2->sk_state != TCP_LISTEN &&
ipv6_rcv_saddr_equal(sk, sk2, true))
break;
}
}
return sk2 != NULL;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
| arnaldo carvalho de melo | arnaldo carvalho de melo | 82 | 40.00% | 1 | 9.09% |
| tom herbert | tom herbert | 79 | 38.54% | 2 | 18.18% |
| flavio leitner | flavio leitner | 25 | 12.20% | 1 | 9.09% |
| craig gallek | craig gallek | 11 | 5.37% | 2 | 18.18% |
| alex copot | alex copot | 3 | 1.46% | 1 | 9.09% |
| david s. miller | david s. miller | 2 | 0.98% | 1 | 9.09% |
| pavel emelianov | pavel emelianov | 1 | 0.49% | 1 | 9.09% |
| sasha levin | sasha levin | 1 | 0.49% | 1 | 9.09% |
| eric w. biederman | eric w. biederman | 1 | 0.49% | 1 | 9.09% |
| Total | 205 | 100.00% | 11 | 100.00% |
EXPORT_SYMBOL_GPL(inet6_csk_bind_conflict);
struct dst_entry *inet6_csk_route_req(const struct sock *sk,
struct flowi6 *fl6,
const struct request_sock *req,
u8 proto)
{
struct inet_request_sock *ireq = inet_rsk(req);
const struct ipv6_pinfo *np = inet6_sk(sk);
struct in6_addr *final_p, final;
struct dst_entry *dst;
memset(fl6, 0, sizeof(*fl6));
fl6->flowi6_proto = proto;
fl6->daddr = ireq->ir_v6_rmt_addr;
rcu_read_lock();
final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final);
rcu_read_unlock();
fl6->saddr = ireq->ir_v6_loc_addr;
fl6->flowi6_oif = ireq->ir_iif;
fl6->flowi6_mark = ireq->ir_mark;
fl6->fl6_dport = ireq->ir_rmt_port;
fl6->fl6_sport = htons(ireq->ir_num);
fl6->flowi6_uid = sk->sk_uid;
security_req_classify_flow(req, flowi6_to_flowi(fl6));
dst = ip6_dst_lookup_flow(sk, fl6, final_p);
if (IS_ERR(dst))
return NULL;
return dst;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
| david s. miller | david s. miller | 139 | 71.28% | 4 | 30.77% |
| eric dumazet | eric dumazet | 31 | 15.90% | 5 | 38.46% |
| neal cardwell | neal cardwell | 13 | 6.67% | 1 | 7.69% |
| lorenzo colitti | lorenzo colitti | 10 | 5.13% | 2 | 15.38% |
| alexey dobriyan | alexey dobriyan | 2 | 1.03% | 1 | 7.69% |
| Total | 195 | 100.00% | 13 | 100.00% |
EXPORT_SYMBOL(inet6_csk_route_req);
void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr)
{
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) uaddr;
sin6->sin6_family = AF_INET6;
sin6->sin6_addr = sk->sk_v6_daddr;
sin6->sin6_port = inet_sk(sk)->inet_dport;
/* We do not store received flowlabel for TCP */
sin6->sin6_flowinfo = 0;
sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr,
sk->sk_bound_dev_if);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
| arnaldo carvalho de melo | arnaldo carvalho de melo | 68 | 90.67% | 1 | 20.00% |
| hannes frederic sowa | hannes frederic sowa | 3 | 4.00% | 1 | 20.00% |
| eric dumazet | eric dumazet | 3 | 4.00% | 2 | 40.00% |
| alexey dobriyan | alexey dobriyan | 1 | 1.33% | 1 | 20.00% |
| Total | 75 | 100.00% | 5 | 100.00% |
EXPORT_SYMBOL_GPL(inet6_csk_addr2sockaddr);
static inline
struct dst_entry *__inet6_csk_dst_check(struct sock *sk, u32 cookie)
{
return __sk_dst_check(sk, cookie);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
| noriaki takamiya | noriaki takamiya | 24 | 96.00% | 1 | 50.00% |
| nicolas dichtel | nicolas dichtel | 1 | 4.00% | 1 | 50.00% |
| Total | 25 | 100.00% | 2 | 100.00% |
static struct dst_entry *inet6_csk_route_socket(struct sock *sk,
struct flowi6 *fl6)
{
struct inet_sock *inet = inet_sk(sk);
struct ipv6_pinfo *np = inet6_sk(sk);
struct in6_addr *final_p, final;
struct dst_entry *dst;
memset(fl6, 0, sizeof(*fl6));
fl6->flowi6_proto = sk->sk_protocol;
fl6->daddr = sk->sk_v6_daddr;
fl6->saddr = np->saddr;
fl6->flowlabel = np->flow_label;
IP6_ECN_flow_xmit(sk, fl6->flowlabel);
fl6->flowi6_oif = sk->sk_bound_dev_if;
fl6->flowi6_mark = sk->sk_mark;
fl6->fl6_sport = inet->inet_sport;
fl6->fl6_dport = inet->inet_dport;
fl6->flowi6_uid = sk->sk_uid;
security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
rcu_read_lock();
final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final);
rcu_read_unlock();
dst = __inet6_csk_dst_check(sk, np->dst_cookie);
if (!dst) {
dst = ip6_dst_lookup_flow(sk, fl6, final_p);
if (!IS_ERR(dst))
ip6_dst_store(sk, dst, NULL, NULL);
}
return dst;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
| arnaldo carvalho de melo | arnaldo carvalho de melo | 99 | 43.42% | 1 | 5.56% |
| david s. miller | david s. miller | 71 | 31.14% | 6 | 33.33% |
| eric dumazet | eric dumazet | 29 | 12.72% | 5 | 27.78% |
| lorenzo colitti | lorenzo colitti | 8 | 3.51% | 1 | 5.56% |
| arnaud ebalard | arnaud ebalard | 7 | 3.07% | 1 | 5.56% |
| venkat yekkirala | venkat yekkirala | 6 | 2.63% | 1 | 5.56% |
| brian haley | brian haley | 5 | 2.19% | 1 | 5.56% |
| alexey dobriyan | alexey dobriyan | 2 | 0.88% | 1 | 5.56% |
| noriaki takamiya | noriaki takamiya | 1 | 0.44% | 1 | 5.56% |
| Total | 228 | 100.00% | 18 | 100.00% |
int inet6_csk_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl_unused)
{
struct ipv6_pinfo *np = inet6_sk(sk);
struct flowi6 fl6;
struct dst_entry *dst;
int res;
dst = inet6_csk_route_socket(sk, &fl6);
if (IS_ERR(dst)) {
sk->sk_err_soft = -PTR_ERR(dst);
sk->sk_route_caps = 0;
kfree_skb(skb);
return PTR_ERR(dst);
}
rcu_read_lock();
skb_dst_set_noref(skb, dst);
/* Restore final destination back after routing done */
fl6.daddr = sk->sk_v6_daddr;
res = ip6_xmit(sk, skb, &fl6, sk->sk_mark, rcu_dereference(np->opt),
np->tclass);
rcu_read_unlock();
return res;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
| david s. miller | david s. miller | 58 | 41.43% | 3 | 20.00% |
| arnaldo carvalho de melo | arnaldo carvalho de melo | 40 | 28.57% | 1 | 6.67% |
| eric dumazet | eric dumazet | 31 | 22.14% | 7 | 46.67% |
| alexey kuznetsov | alexey kuznetsov | 5 | 3.57% | 1 | 6.67% |
| pablo neira ayuso | pablo neira ayuso | 4 | 2.86% | 1 | 6.67% |
| alexey dobriyan | alexey dobriyan | 2 | 1.43% | 2 | 13.33% |
| Total | 140 | 100.00% | 15 | 100.00% |
EXPORT_SYMBOL_GPL(inet6_csk_xmit);
struct dst_entry *inet6_csk_update_pmtu(struct sock *sk, u32 mtu)
{
struct flowi6 fl6;
struct dst_entry *dst = inet6_csk_route_socket(sk, &fl6);
if (IS_ERR(dst))
return NULL;
dst->ops->update_pmtu(dst, sk, NULL, mtu);
dst = inet6_csk_route_socket(sk, &fl6);
return IS_ERR(dst) ? NULL : dst;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
| david s. miller | david s. miller | 55 | 71.43% | 2 | 50.00% |
| eric dumazet | eric dumazet | 22 | 28.57% | 2 | 50.00% |
| Total | 77 | 100.00% | 4 | 100.00% |
EXPORT_SYMBOL_GPL(inet6_csk_update_pmtu);
Overall Contributors
| Person | Tokens | Prop | Commits | CommitProp |
| arnaldo carvalho de melo | arnaldo carvalho de melo | 335 | 33.17% | 2 | 4.08% |
| david s. miller | david s. miller | 330 | 32.67% | 9 | 18.37% |
| eric dumazet | eric dumazet | 121 | 11.98% | 14 | 28.57% |
| tom herbert | tom herbert | 79 | 7.82% | 2 | 4.08% |
| noriaki takamiya | noriaki takamiya | 25 | 2.48% | 1 | 2.04% |
| flavio leitner | flavio leitner | 25 | 2.48% | 1 | 2.04% |
| lorenzo colitti | lorenzo colitti | 18 | 1.78% | 2 | 4.08% |
| craig gallek | craig gallek | 14 | 1.39% | 2 | 4.08% |
| neal cardwell | neal cardwell | 13 | 1.29% | 1 | 2.04% |
| alexey dobriyan | alexey dobriyan | 7 | 0.69% | 2 | 4.08% |
| arnaud ebalard | arnaud ebalard | 7 | 0.69% | 1 | 2.04% |
| venkat yekkirala | venkat yekkirala | 6 | 0.59% | 1 | 2.04% |
| alexey kuznetsov | alexey kuznetsov | 5 | 0.50% | 1 | 2.04% |
| brian haley | brian haley | 5 | 0.50% | 1 | 2.04% |
| pablo neira ayuso | pablo neira ayuso | 4 | 0.40% | 1 | 2.04% |
| hannes frederic sowa | hannes frederic sowa | 3 | 0.30% | 1 | 2.04% |
| adrian bunk | adrian bunk | 3 | 0.30% | 1 | 2.04% |
| tejun heo | tejun heo | 3 | 0.30% | 1 | 2.04% |
| alex copot | alex copot | 3 | 0.30% | 1 | 2.04% |
| pavel emelianov | pavel emelianov | 1 | 0.10% | 1 | 2.04% |
| eric w. biederman | eric w. biederman | 1 | 0.10% | 1 | 2.04% |
| nicolas dichtel | nicolas dichtel | 1 | 0.10% | 1 | 2.04% |
| sasha levin | sasha levin | 1 | 0.10% | 1 | 2.04% |
| Total | 1010 | 100.00% | 49 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.