Lines Matching refs:sk
46 static u32 sk_ehashfn(const struct sock *sk) in sk_ehashfn() argument
49 if (sk->sk_family == AF_INET6 && in sk_ehashfn()
50 !ipv6_addr_v4mapped(&sk->sk_v6_daddr)) in sk_ehashfn()
51 return inet6_ehashfn(sock_net(sk), in sk_ehashfn()
52 &sk->sk_v6_rcv_saddr, sk->sk_num, in sk_ehashfn()
53 &sk->sk_v6_daddr, sk->sk_dport); in sk_ehashfn()
55 return inet_ehashfn(sock_net(sk), in sk_ehashfn()
56 sk->sk_rcv_saddr, sk->sk_num, in sk_ehashfn()
57 sk->sk_daddr, sk->sk_dport); in sk_ehashfn()
93 void inet_bind_hash(struct sock *sk, struct inet_bind_bucket *tb, in inet_bind_hash() argument
96 inet_sk(sk)->inet_num = snum; in inet_bind_hash()
97 sk_add_bind_node(sk, &tb->owners); in inet_bind_hash()
98 inet_csk(sk)->icsk_bind_hash = tb; in inet_bind_hash()
104 static void __inet_put_port(struct sock *sk) in __inet_put_port() argument
106 struct inet_hashinfo *hashinfo = sk->sk_prot->h.hashinfo; in __inet_put_port()
107 const int bhash = inet_bhashfn(sock_net(sk), inet_sk(sk)->inet_num, in __inet_put_port()
113 tb = inet_csk(sk)->icsk_bind_hash; in __inet_put_port()
114 __sk_del_bind_node(sk); in __inet_put_port()
115 inet_csk(sk)->icsk_bind_hash = NULL; in __inet_put_port()
116 inet_sk(sk)->inet_num = 0; in __inet_put_port()
121 void inet_put_port(struct sock *sk) in inet_put_port() argument
124 __inet_put_port(sk); in inet_put_port()
129 int __inet_inherit_port(const struct sock *sk, struct sock *child) in __inet_inherit_port() argument
131 struct inet_hashinfo *table = sk->sk_prot->h.hashinfo; in __inet_inherit_port()
133 const int bhash = inet_bhashfn(sock_net(sk), port, in __inet_inherit_port()
139 tb = inet_csk(sk)->icsk_bind_hash; in __inet_inherit_port()
151 if (net_eq(ib_net(tb), sock_net(sk)) && in __inet_inherit_port()
157 sock_net(sk), head, port); in __inet_inherit_port()
171 static inline int compute_score(struct sock *sk, struct net *net, in compute_score() argument
176 struct inet_sock *inet = inet_sk(sk); in compute_score()
178 if (net_eq(sock_net(sk), net) && inet->inet_num == hnum && in compute_score()
179 !ipv6_only_sock(sk)) { in compute_score()
181 score = sk->sk_family == PF_INET ? 2 : 1; in compute_score()
187 if (sk->sk_bound_dev_if || exact_dif) { in compute_score()
188 bool dev_match = (sk->sk_bound_dev_if == dif || in compute_score()
189 sk->sk_bound_dev_if == sdif); in compute_score()
193 if (sk->sk_bound_dev_if) in compute_score()
196 if (READ_ONCE(sk->sk_incoming_cpu) == raw_smp_processor_id()) in compute_score()
221 struct sock *sk, *result = NULL; in __inet_lookup_listener() local
225 sk_nulls_for_each_rcu(sk, node, &ilb->nulls_head) { in __inet_lookup_listener()
226 score = compute_score(sk, net, hnum, daddr, in __inet_lookup_listener()
229 reuseport = sk->sk_reuseport; in __inet_lookup_listener()
233 result = reuseport_select_sock(sk, phash, in __inet_lookup_listener()
239 result = sk; in __inet_lookup_listener()
244 result = sk; in __inet_lookup_listener()
253 void sock_gen_put(struct sock *sk) in sock_gen_put() argument
255 if (!refcount_dec_and_test(&sk->sk_refcnt)) in sock_gen_put()
258 if (sk->sk_state == TCP_TIME_WAIT) in sock_gen_put()
259 inet_twsk_free(inet_twsk(sk)); in sock_gen_put()
260 else if (sk->sk_state == TCP_NEW_SYN_RECV) in sock_gen_put()
261 reqsk_free(inet_reqsk(sk)); in sock_gen_put()
263 sk_free(sk); in sock_gen_put()
269 sock_gen_put(skb->sk); in sock_edemux()
281 struct sock *sk; in __inet_lookup_established() local
291 sk_nulls_for_each_rcu(sk, node, &head->chain) { in __inet_lookup_established()
292 if (sk->sk_hash != hash) in __inet_lookup_established()
294 if (likely(INET_MATCH(sk, net, acookie, in __inet_lookup_established()
296 if (unlikely(!refcount_inc_not_zero(&sk->sk_refcnt))) in __inet_lookup_established()
298 if (unlikely(!INET_MATCH(sk, net, acookie, in __inet_lookup_established()
301 sock_gen_put(sk); in __inet_lookup_established()
315 sk = NULL; in __inet_lookup_established()
317 return sk; in __inet_lookup_established()
323 struct sock *sk, __u16 lport, in __inet_check_established() argument
327 struct inet_sock *inet = inet_sk(sk); in __inet_check_established()
330 int dif = sk->sk_bound_dev_if; in __inet_check_established()
331 struct net *net = sock_net(sk); in __inet_check_established()
353 if (twsk_unique(sk, sk2, twp)) in __inet_check_established()
365 sk->sk_hash = hash; in __inet_check_established()
366 WARN_ON(!sk_unhashed(sk)); in __inet_check_established()
367 __sk_nulls_add_node_rcu(sk, &head->chain); in __inet_check_established()
373 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); in __inet_check_established()
388 static u32 inet_sk_port_offset(const struct sock *sk) in inet_sk_port_offset() argument
390 const struct inet_sock *inet = inet_sk(sk); in inet_sk_port_offset()
400 bool inet_ehash_insert(struct sock *sk, struct sock *osk) in inet_ehash_insert() argument
402 struct inet_hashinfo *hashinfo = sk->sk_prot->h.hashinfo; in inet_ehash_insert()
408 WARN_ON_ONCE(!sk_unhashed(sk)); in inet_ehash_insert()
410 sk->sk_hash = sk_ehashfn(sk); in inet_ehash_insert()
411 head = inet_ehash_bucket(hashinfo, sk->sk_hash); in inet_ehash_insert()
413 lock = inet_ehash_lockp(hashinfo, sk->sk_hash); in inet_ehash_insert()
417 WARN_ON_ONCE(sk->sk_hash != osk->sk_hash); in inet_ehash_insert()
421 __sk_nulls_add_node_rcu(sk, list); in inet_ehash_insert()
426 bool inet_ehash_nolisten(struct sock *sk, struct sock *osk) in inet_ehash_nolisten() argument
428 bool ok = inet_ehash_insert(sk, osk); in inet_ehash_nolisten()
431 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); in inet_ehash_nolisten()
433 percpu_counter_inc(sk->sk_prot->orphan_count); in inet_ehash_nolisten()
434 sk->sk_state = TCP_CLOSE; in inet_ehash_nolisten()
435 sock_set_flag(sk, SOCK_DEAD); in inet_ehash_nolisten()
436 inet_csk_destroy_sock(sk); in inet_ehash_nolisten()
442 static int inet_reuseport_add_sock(struct sock *sk, in inet_reuseport_add_sock() argument
445 struct inet_bind_bucket *tb = inet_csk(sk)->icsk_bind_hash; in inet_reuseport_add_sock()
448 kuid_t uid = sock_i_uid(sk); in inet_reuseport_add_sock()
451 if (sk2 != sk && in inet_reuseport_add_sock()
452 sk2->sk_family == sk->sk_family && in inet_reuseport_add_sock()
453 ipv6_only_sock(sk2) == ipv6_only_sock(sk) && in inet_reuseport_add_sock()
454 sk2->sk_bound_dev_if == sk->sk_bound_dev_if && in inet_reuseport_add_sock()
457 inet_rcv_saddr_equal(sk, sk2, false)) in inet_reuseport_add_sock()
458 return reuseport_add_sock(sk, sk2); in inet_reuseport_add_sock()
461 return reuseport_alloc(sk); in inet_reuseport_add_sock()
464 int __inet_hash(struct sock *sk, struct sock *osk) in __inet_hash() argument
466 struct inet_hashinfo *hashinfo = sk->sk_prot->h.hashinfo; in __inet_hash()
470 if (sk->sk_state != TCP_LISTEN) { in __inet_hash()
471 inet_ehash_nolisten(sk, osk); in __inet_hash()
474 WARN_ON(!sk_unhashed(sk)); in __inet_hash()
475 ilb = &hashinfo->listening_hash[inet_sk_listen_hashfn(sk)]; in __inet_hash()
478 if (sk->sk_reuseport) { in __inet_hash()
479 err = inet_reuseport_add_sock(sk, ilb); in __inet_hash()
483 if (IS_ENABLED(CONFIG_IPV6) && sk->sk_reuseport && in __inet_hash()
484 sk->sk_family == AF_INET6) in __inet_hash()
485 __sk_nulls_add_node_tail_rcu(sk, &ilb->nulls_head); in __inet_hash()
487 __sk_nulls_add_node_rcu(sk, &ilb->nulls_head); in __inet_hash()
488 sock_set_flag(sk, SOCK_RCU_FREE); in __inet_hash()
489 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); in __inet_hash()
497 int inet_hash(struct sock *sk) in inet_hash() argument
501 if (sk->sk_state != TCP_CLOSE) { in inet_hash()
503 err = __inet_hash(sk, NULL); in inet_hash()
511 void inet_unhash(struct sock *sk) in inet_unhash() argument
513 struct inet_hashinfo *hashinfo = sk->sk_prot->h.hashinfo; in inet_unhash()
518 if (sk_unhashed(sk)) in inet_unhash()
521 if (sk->sk_state == TCP_LISTEN) { in inet_unhash()
522 lock = &hashinfo->listening_hash[inet_sk_listen_hashfn(sk)].lock; in inet_unhash()
525 lock = inet_ehash_lockp(hashinfo, sk->sk_hash); in inet_unhash()
528 if (rcu_access_pointer(sk->sk_reuseport_cb)) in inet_unhash()
529 reuseport_detach_sock(sk); in inet_unhash()
530 done = __sk_nulls_del_node_init_rcu(sk); in inet_unhash()
532 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); in inet_unhash()
538 struct sock *sk, u32 port_offset, in __inet_hash_connect() argument
545 int port = inet_sk(sk)->inet_num; in __inet_hash_connect()
546 struct net *net = sock_net(sk); in __inet_hash_connect()
555 tb = inet_csk(sk)->icsk_bind_hash; in __inet_hash_connect()
557 if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) { in __inet_hash_connect()
558 inet_ehash_nolisten(sk, NULL); in __inet_hash_connect()
564 ret = check_established(death_row, sk, port, NULL); in __inet_hash_connect()
600 if (!check_established(death_row, sk, in __inet_hash_connect()
631 inet_bind_hash(sk, tb, port); in __inet_hash_connect()
632 if (sk_unhashed(sk)) { in __inet_hash_connect()
633 inet_sk(sk)->inet_sport = htons(port); in __inet_hash_connect()
634 inet_ehash_nolisten(sk, (struct sock *)tw); in __inet_hash_connect()
649 struct sock *sk) in inet_hash_connect() argument
653 if (!inet_sk(sk)->inet_num) in inet_hash_connect()
654 port_offset = inet_sk_port_offset(sk); in inet_hash_connect()
655 return __inet_hash_connect(death_row, sk, port_offset, in inet_hash_connect()